Compare commits

...

4 Commits

Author SHA1 Message Date
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
Pullfrog Action 7ef44eb254 try esm action 2025-11-06 19:03:19 -05:00
8 changed files with 153 additions and 141 deletions
+1 -4
View File
@@ -1,6 +1,3 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# Ensure lockfile is up to date # Ensure lockfile is up to date
echo "🔒 Updating lockfile..." echo "🔒 Updating lockfile..."
pnpm install --lockfile-only pnpm install --lockfile-only
@@ -10,4 +7,4 @@ echo "🔨 Building action..."
pnpm build pnpm build
# Add the built files and lockfile to the commit # Add the built files and lockfile to the commit
git add entry.cjs pnpm-lock.yaml git add entry.js pnpm-lock.yaml
+1 -1
View File
@@ -13,7 +13,7 @@ inputs:
runs: runs:
using: "node20" using: "node20"
main: "entry.cjs" main: "entry.js"
branding: branding:
icon: "code" icon: "code"
+112 -111
View File
File diff suppressed because one or more lines are too long
+6 -17
View File
@@ -5,8 +5,7 @@
*/ */
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 packageJson from "./package.json" with { type: "json" };
import { log } from "./utils/cli.ts"; import { log } from "./utils/cli.ts";
@@ -18,13 +17,10 @@ async function run(): Promise<void> {
try { try {
log.info(`🐸 Running pullfrog/action@${packageJson.version}...`); log.info(`🐸 Running pullfrog/action@${packageJson.version}...`);
const inputsJson = process.env.INPUTS_JSON; const inputs: Inputs = {
if (!inputsJson) { prompt: core.getInput("prompt", { required: true }),
throw new Error("INPUTS_JSON environment variable not found"); anthropic_api_key: core.getInput("anthropic_api_key") || undefined,
} };
const parsed = type("string.json.parse").assert(inputsJson);
const inputs = Inputs.assert(parsed);
const result = await main(inputs); const result = await main(inputs);
@@ -37,11 +33,4 @@ async function run(): Promise<void> {
} }
} }
// Only run main action if INPUTS_JSON is set (running as GitHub Action) await run();
// When SDK spawns MCP server, it calls createMcpServer() directly
if (process.env.INPUTS_JSON) {
// Wrap in IIFE to avoid top-level await in CJS
(async () => {
await run();
})();
}
+8 -3
View File
@@ -5,18 +5,23 @@ import { build } from "esbuild";
await build({ await build({
entryPoints: ["./entry.ts"], entryPoints: ["./entry.ts"],
bundle: true, bundle: true,
outfile: "./entry.cjs", outfile: "./entry.js",
format: "cjs", format: "esm",
platform: "node", platform: "node",
target: "node20", target: "node20",
minify: true, minify: true,
sourcemap: false, sourcemap: false,
// Mark optional peer dependencies as external to avoid bundling errors // Bundle all dependencies - GitHub Actions doesn't have node_modules
// Only 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)
+8 -4
View File
@@ -15,15 +15,19 @@ export function createMcpConfigs(githubInstallationToken: string): McpConfigs {
const repoContext = parseRepoContext(); const repoContext = parseRepoContext();
const githubRepository = `${repoContext.owner}/${repoContext.name}`; const githubRepository = `${repoContext.owner}/${repoContext.name}`;
// Get absolute path to entry.cjs - use GITHUB_ACTION_PATH if available, otherwise current directory // Get absolute path to entry.js - use GITHUB_ACTION_PATH if available, otherwise current directory
const entryPath = process.env.GITHUB_ACTION_PATH const entryPath = process.env.GITHUB_ACTION_PATH
? `${process.env.GITHUB_ACTION_PATH}/entry.cjs` ? `${process.env.GITHUB_ACTION_PATH}/entry.js`
: `${process.cwd()}/entry.cjs`; : `${process.cwd()}/entry.js`;
return { return {
[ghPullfrogMcpName]: { [ghPullfrogMcpName]: {
command: "node", command: "node",
args: ["-e", `require('${entryPath.replace(/'/g, "\\'")}').createMcpServer()`], args: [
"--input-type=module",
"-e",
`import('${entryPath.replace(/'/g, "\\'")}').then(m => m.createMcpServer())`,
],
env: { env: {
GITHUB_INSTALLATION_TOKEN: githubInstallationToken, GITHUB_INSTALLATION_TOKEN: githubInstallationToken,
GITHUB_REPOSITORY: githubRepository, GITHUB_REPOSITORY: githubRepository,
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@pullfrog/action", "name": "@pullfrog/action",
"version": "0.0.75", "version": "0.0.78",
"type": "module", "type": "module",
"files": [ "files": [
"index.js", "index.js",
+16
View File
@@ -41,8 +41,16 @@ 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.info("⚠️ 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" }); execSync('git config user.email "action@pullfrog.ai"', { stdio: "inherit" });
execSync('git config user.name "Pullfrog Action"', { stdio: "inherit" }); execSync('git config user.name "Pullfrog Action"', { stdio: "inherit" });
@@ -50,8 +58,16 @@ export function setupGitConfig(): void {
/** /**
* Setup git authentication using GitHub token * Setup git authentication using GitHub token
* Only runs in GitHub Actions environment to avoid breaking local git remotes
*/ */
export function setupGitAuth(githubToken: string, repoContext: RepoContext): void { export function setupGitAuth(githubToken: string, repoContext: RepoContext): void {
// Only set up git auth in GitHub Actions environment
// In local testing, this would overwrite the real git remote with fake credentials
if (!process.env.GITHUB_ACTIONS) {
log.info("⚠️ Skipping git authentication setup (not in GitHub Actions)");
return;
}
log.info("🔐 Setting up git authentication..."); log.info("🔐 Setting up git authentication...");
// Remove existing git auth headers that actions/checkout might have set // Remove existing git auth headers that actions/checkout might have set