cleanup comments
This commit is contained in:
@@ -12,27 +12,21 @@ const tempDir = join(__dirname, "..", ".temp");
|
||||
const actionPath = join(__dirname, "..");
|
||||
const envPath = join(__dirname, "..", "..", ".env");
|
||||
|
||||
// Environment variables that should be passed as secrets to the workflow
|
||||
const ENV_VARS = ["ANTHROPIC_API_KEY", "GITHUB_INSTALLATION_TOKEN"];
|
||||
|
||||
export function runAct(prompt: string): void {
|
||||
// Setup test repository
|
||||
setupTestRepo({ tempDir });
|
||||
|
||||
// Load environment variables
|
||||
config({ path: envPath });
|
||||
|
||||
// Build action bundles
|
||||
buildAction(actionPath);
|
||||
|
||||
const workflowPath = join(tempDir, ".github", "workflows", "pullfrog.yml");
|
||||
|
||||
// Create minimal dist for act (avoids pnpm symlink issues)
|
||||
const distPath = join(actionPath, ".act-dist");
|
||||
console.log("📦 Creating minimal distribution for act...");
|
||||
execSync(`rm -rf "${distPath}" && mkdir -p "${distPath}"`, { shell: "/bin/bash" });
|
||||
|
||||
// Copy only necessary files (bundled, no node_modules needed)
|
||||
["action.yml", "entry.cjs", "index.cjs", "package.json"].forEach((file) => {
|
||||
const src = join(actionPath, file);
|
||||
if (existsSync(src)) {
|
||||
@@ -41,8 +35,6 @@ export function runAct(prompt: string): void {
|
||||
});
|
||||
|
||||
try {
|
||||
// Build the act command with input directly
|
||||
// Properly escape the prompt for shell
|
||||
const escapedPrompt = prompt.replace(/'/g, "'\\''");
|
||||
|
||||
const actCommandParts = [
|
||||
@@ -56,14 +48,12 @@ export function runAct(prompt: string): void {
|
||||
`pullfrog/action@v0=${distPath}`, // Use minimal dist without symlinks
|
||||
];
|
||||
|
||||
// Add environment variables as secrets that will be available to the workflow
|
||||
ENV_VARS.forEach((key) => {
|
||||
if (process.env[key]) {
|
||||
actCommandParts.push("-s", key);
|
||||
}
|
||||
});
|
||||
|
||||
// We only need the specific ENV_VARS, no need to add other variables
|
||||
|
||||
const actCommand = actCommandParts.join(" ");
|
||||
|
||||
@@ -73,15 +63,12 @@ export function runAct(prompt: string): void {
|
||||
console.log("─".repeat(50));
|
||||
console.log("");
|
||||
|
||||
// Execute act
|
||||
execSync(actCommand, {
|
||||
stdio: "inherit",
|
||||
cwd: join(__dirname, "..", ".."),
|
||||
});
|
||||
// Clean up
|
||||
execSync(`rm -rf "${distPath}"`);
|
||||
} catch (error) {
|
||||
// Clean up on error
|
||||
execSync(`rm -rf "${distPath}"`);
|
||||
console.error("❌ Act execution failed:", (error as Error).message);
|
||||
process.exit(1);
|
||||
|
||||
@@ -165,7 +165,6 @@ const findInstallationId = async (jwt: string, repoOwner: string, repoName: stri
|
||||
return installation.id;
|
||||
}
|
||||
} catch {
|
||||
// Installation doesn't have access to repository
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,13 +14,11 @@ export interface InstallationToken {
|
||||
* Setup GitHub installation token for the action
|
||||
*/
|
||||
export async function setupGitHubInstallationToken(): Promise<string> {
|
||||
// Check if we have an installation token from inputs or environment
|
||||
const inputToken = core.getInput("github_installation_token");
|
||||
const envToken = process.env.GITHUB_INSTALLATION_TOKEN;
|
||||
|
||||
const existingToken = inputToken || envToken;
|
||||
if (existingToken) {
|
||||
// Mask the existing token in logs for security
|
||||
core.setSecret(existingToken);
|
||||
core.info("Using provided GitHub installation token");
|
||||
return existingToken;
|
||||
@@ -29,11 +27,9 @@ export async function setupGitHubInstallationToken(): Promise<string> {
|
||||
core.info("Generating OIDC token...");
|
||||
|
||||
try {
|
||||
// Generate OIDC token for our API
|
||||
const oidcToken = await core.getIDToken("pullfrog-api");
|
||||
core.info("OIDC token generated successfully");
|
||||
|
||||
// Exchange OIDC token for installation token
|
||||
const apiUrl = process.env.API_URL || "https://pullfrog.ai";
|
||||
|
||||
core.info("Exchanging OIDC token for installation token...");
|
||||
@@ -52,14 +48,11 @@ export async function setupGitHubInstallationToken(): Promise<string> {
|
||||
);
|
||||
}
|
||||
|
||||
// This type is enforced by us when the response is created
|
||||
const tokenData = (await tokenResponse.json()) as InstallationToken;
|
||||
core.info(`Installation token obtained for ${tokenData.repository || "all repositories"}`);
|
||||
|
||||
// Mask the token in logs for security
|
||||
core.setSecret(tokenData.token);
|
||||
|
||||
// Set the token as an environment variable for this run
|
||||
process.env.GITHUB_INSTALLATION_TOKEN = tokenData.token;
|
||||
|
||||
return tokenData.token;
|
||||
|
||||
@@ -17,13 +17,11 @@ export function setupTestRepo(options: SetupOptions): void {
|
||||
forceClean = false,
|
||||
} = options;
|
||||
|
||||
// Handle existing temp directory
|
||||
if (existsSync(tempDir)) {
|
||||
if (forceClean) {
|
||||
console.log("🗑️ Removing existing .temp directory...");
|
||||
rmSync(tempDir, { recursive: true, force: true });
|
||||
|
||||
// Clone the repository
|
||||
console.log("📦 Cloning pullfrogai/scratch into .temp...");
|
||||
execSync(`git clone ${repoUrl} ${tempDir}`, { stdio: "inherit" });
|
||||
} else {
|
||||
|
||||
+1
-10
@@ -28,13 +28,11 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
let stderrBuffer = "";
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
// Spawn the child process
|
||||
const child = nodeSpawn(cmd, args, {
|
||||
env: env ? { ...process.env, ...env } : process.env,
|
||||
stdio: ["pipe", "pipe", "pipe"],
|
||||
});
|
||||
|
||||
// Set up timeout if specified
|
||||
let timeoutId: NodeJS.Timeout | undefined;
|
||||
let isTimedOut = false;
|
||||
|
||||
@@ -43,7 +41,6 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
isTimedOut = true;
|
||||
child.kill("SIGTERM");
|
||||
|
||||
// If SIGTERM doesn't work, use SIGKILL after 5 seconds
|
||||
setTimeout(() => {
|
||||
if (!child.killed) {
|
||||
child.kill("SIGKILL");
|
||||
@@ -52,7 +49,6 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
}, timeout);
|
||||
}
|
||||
|
||||
// Handle stdout streaming
|
||||
if (child.stdout) {
|
||||
child.stdout.on("data", (data: Buffer) => {
|
||||
const chunk = data.toString();
|
||||
@@ -61,7 +57,6 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
});
|
||||
}
|
||||
|
||||
// Handle stderr streaming
|
||||
if (child.stderr) {
|
||||
child.stderr.on("data", (data: Buffer) => {
|
||||
const chunk = data.toString();
|
||||
@@ -70,7 +65,6 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
});
|
||||
}
|
||||
|
||||
// Handle process completion
|
||||
child.on("close", (exitCode) => {
|
||||
const durationMs = Date.now() - startTime;
|
||||
|
||||
@@ -91,15 +85,13 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
});
|
||||
});
|
||||
|
||||
// Handle process errors
|
||||
child.on("error", (error) => {
|
||||
child.on("error", (_error) => {
|
||||
const durationMs = Date.now() - startTime;
|
||||
|
||||
if (timeoutId) {
|
||||
clearTimeout(timeoutId);
|
||||
}
|
||||
|
||||
// Still return buffered output even on error
|
||||
resolve({
|
||||
stdout: stdoutBuffer,
|
||||
stderr: stderrBuffer,
|
||||
@@ -108,7 +100,6 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
|
||||
});
|
||||
});
|
||||
|
||||
// Send input if provided
|
||||
if (input && child.stdin) {
|
||||
child.stdin.write(input);
|
||||
child.stdin.end();
|
||||
|
||||
+2
-32
@@ -22,8 +22,8 @@ export function tableString(
|
||||
},
|
||||
} = options || {};
|
||||
|
||||
if (options?.title) {
|
||||
rows.unshift([options.title]);
|
||||
if (title) {
|
||||
rows.unshift([title]);
|
||||
}
|
||||
|
||||
const tableOutput = table(rows, {
|
||||
@@ -140,33 +140,3 @@ export function boxString(
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Create a simple two-column table for displaying key-value pairs
|
||||
// * @param data - Array of [key, value] pairs
|
||||
// * @param title - Optional table title
|
||||
// * @param indent - Optional indentation string
|
||||
// */
|
||||
// export function printKeyValueTable(
|
||||
// data: [string, string][],
|
||||
// title?: string,
|
||||
// indent?: string
|
||||
// ): void {
|
||||
// const rows: string[][] = [["Key", "Value"], ...data];
|
||||
// const options: Parameters<typeof printTable>[1] = {};
|
||||
// if (title !== undefined) options.title = title;
|
||||
// if (indent !== undefined) options.indent = indent;
|
||||
// printTable(rows, options);
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * Create a path resolution table (specific use case)
|
||||
// * @param pathData - Array of [location, resolvedPath] pairs
|
||||
// * @param indent - Optional indentation string
|
||||
// */
|
||||
// export function printPathTable(pathData: [string, string][], indent?: string): void {
|
||||
// const rows: string[][] = [["Location", "Resolved path"], ...pathData];
|
||||
// const options: Parameters<typeof printTable>[1] = {};
|
||||
// if (indent !== undefined) options.indent = indent;
|
||||
// printTable(rows, options);
|
||||
// }
|
||||
|
||||
Reference in New Issue
Block a user