Compare commits

..

5 Commits

Author SHA1 Message Date
David Blass 42b023cc86 okok 2025-11-06 19:37:31 -05:00
David Blass 854e3d5e4d add debug 2025-11-06 19:19:26 -05:00
David Blass 5bb1b779a8 iter 2025-11-06 19:13:42 -05:00
David Blass 599264694e try again 2025-11-06 19:08:25 -05:00
David Blass b9c15e9f38 fix github config 2025-11-06 19:05:57 -05:00
7 changed files with 400 additions and 53 deletions
+358 -28
View File
File diff suppressed because one or more lines are too long
+5 -13
View File
@@ -5,26 +5,18 @@
*/ */
import * as core from "@actions/core"; import * as core from "@actions/core";
import { type } from "arktype"; import { type Inputs, main } from "./main.ts";
import { Inputs, main } from "./main.ts";
import { createMcpServer } from "./mcp/server.ts"; import { createMcpServer } from "./mcp/server.ts";
import packageJson from "./package.json" with { type: "json" };
import { log } from "./utils/cli.ts";
// Export createMcpServer so it can be called from the spawned MCP process // Export createMcpServer so it can be called from the spawned MCP process
export { createMcpServer }; export { createMcpServer };
async function run(): Promise<void> { async function run(): Promise<void> {
try { try {
log.info(`🐸 Running pullfrog/action@${packageJson.version}...`); const inputs: Inputs = {
prompt: core.getInput("prompt", { required: true }),
const inputsJson = process.env.INPUTS_JSON; anthropic_api_key: core.getInput("anthropic_api_key") || undefined,
if (!inputsJson) { };
throw new Error("INPUTS_JSON environment variable not found");
}
const parsed = type("string.json.parse").assert(inputsJson);
const inputs = Inputs.assert(parsed);
const result = await main(inputs); const result = await main(inputs);
+6 -4
View File
@@ -11,15 +11,17 @@ await build({
target: "node20", target: "node20",
minify: true, minify: true,
sourcemap: false, sourcemap: false,
// Mark all node_modules as external - Node.js will handle ESM/CJS interop natively // Bundle all dependencies - GitHub Actions doesn't have node_modules
// This avoids esbuild's require() polyfill which doesn't work in ESM // Only mark optional peer dependencies as external
packages: "external",
// Mark optional peer dependencies as external
external: [ external: [
"@valibot/to-json-schema", "@valibot/to-json-schema",
"effect", "effect",
"sury", "sury",
], ],
// Provide a proper require shim for CommonJS modules bundled into ESM
banner: {
js: `import { createRequire } from 'module'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; const require = createRequire(import.meta.url); const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename);`,
},
// Enable tree-shaking to remove unused code // Enable tree-shaking to remove unused code
treeShaking: true, treeShaking: true,
// Drop console statements in production (but keep for debugging) // Drop console statements in production (but keep for debugging)
+10 -1
View File
@@ -1,6 +1,7 @@
import { type } from "arktype"; import { type } from "arktype";
import { claude } from "./agents/claude.ts"; import { claude } from "./agents/claude.ts";
import { createMcpConfigs } from "./mcp/config.ts"; import { createMcpConfigs } from "./mcp/config.ts";
import packageJson from "./package.json" with { type: "json" };
import { log } from "./utils/cli.ts"; import { log } from "./utils/cli.ts";
import { parseRepoContext, setupGitHubInstallationToken } from "./utils/github.ts"; import { parseRepoContext, setupGitHubInstallationToken } from "./utils/github.ts";
import { setupGitAuth, setupGitConfig } from "./utils/setup.ts"; import { setupGitAuth, setupGitConfig } from "./utils/setup.ts";
@@ -22,7 +23,15 @@ export type PromptJSON = {};
export async function main(inputs: Inputs): Promise<MainResult> { export async function main(inputs: Inputs): Promise<MainResult> {
try { try {
log.info("Starting agent run..."); log.info(`🐸 Running pullfrog/action@${packageJson.version}...`);
// Change to GITHUB_WORKSPACE if set (this is where actions/checkout puts the repo)
// JavaScript actions run from the action's directory, not the checked-out repo
if (process.env.GITHUB_WORKSPACE && process.cwd() !== process.env.GITHUB_WORKSPACE) {
log.debug(`Changing to GITHUB_WORKSPACE: ${process.env.GITHUB_WORKSPACE}`);
process.chdir(process.env.GITHUB_WORKSPACE);
log.debug(`New working directory: ${process.cwd()}`);
}
setupGitConfig(); setupGitConfig();
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@pullfrog/action", "name": "@pullfrog/action",
"version": "0.0.76", "version": "0.0.80",
"type": "module", "type": "module",
"files": [ "files": [
"index.js", "index.js",
-3
View File
@@ -5,7 +5,6 @@ import { fromHere } from "@ark/fs";
import arg from "arg"; import arg from "arg";
import { config } from "dotenv"; import { config } from "dotenv";
import { type Inputs, main } from "./main.ts"; import { type Inputs, main } from "./main.ts";
import packageJson from "./package.json" with { type: "json" };
import { log } from "./utils/cli.ts"; import { log } from "./utils/cli.ts";
import { setupTestRepo } from "./utils/setup.ts"; import { setupTestRepo } from "./utils/setup.ts";
@@ -15,8 +14,6 @@ export async function run(
prompt: string prompt: string
): Promise<{ success: boolean; output?: string | undefined; error?: string | undefined }> { ): Promise<{ success: boolean; output?: string | undefined; error?: string | undefined }> {
try { try {
log.info(`🐸 Running pullfrog/action@${packageJson.version}...`);
const tempDir = join(process.cwd(), ".temp"); const tempDir = join(process.cwd(), ".temp");
setupTestRepo({ tempDir, forceClean: true }); setupTestRepo({ tempDir, forceClean: true });
+20 -3
View File
@@ -41,11 +41,28 @@ export function setupTestRepo(options: SetupOptions): void {
/** /**
* Setup git configuration to avoid identity errors * Setup git configuration to avoid identity errors
* Only runs in GitHub Actions environment to avoid overwriting local git config
*/ */
export function setupGitConfig(): void { export function setupGitConfig(): void {
// Only set up git config in GitHub Actions environment
// In local development, use the user's existing git config
if (!process.env.GITHUB_ACTIONS) {
log.warning("Skipping git configuration setup (not in GitHub Actions)");
return;
}
log.info("🔧 Setting up git configuration..."); log.info("🔧 Setting up git configuration...");
execSync('git config user.email "action@pullfrog.ai"', { stdio: "inherit" }); try {
execSync('git config user.name "Pullfrog Action"', { stdio: "inherit" }); execSync('git config user.email "action@pullfrog.ai"', { stdio: "pipe" });
execSync('git config user.name "Pullfrog Action"', { stdio: "pipe" });
log.debug("setupGitConfig: ✓ Git configuration set successfully");
} catch (error) {
// If git config fails, log warning but don't fail the action
// This can happen if we're not in a git repo or git isn't available
log.warning(
`Failed to set git config: ${error instanceof Error ? error.message : String(error)}`
);
}
} }
/** /**
@@ -56,7 +73,7 @@ export function setupGitAuth(githubToken: string, repoContext: RepoContext): voi
// Only set up git auth in GitHub Actions environment // Only set up git auth in GitHub Actions environment
// In local testing, this would overwrite the real git remote with fake credentials // In local testing, this would overwrite the real git remote with fake credentials
if (!process.env.GITHUB_ACTIONS) { if (!process.env.GITHUB_ACTIONS) {
log.info("⚠️ Skipping git authentication setup (not in GitHub Actions)"); log.warning("Skipping git authentication setup (not in GitHub Actions)");
return; return;
} }