merge main

This commit is contained in:
Shawn Morreau
2025-11-21 11:08:03 -05:00
22 changed files with 424 additions and 89 deletions
+10
View File
@@ -1,4 +1,6 @@
import { spawnSync } from "node:child_process";
import { mkdirSync } from "node:fs";
import { join } from "node:path";
import { Codex, type CodexOptions, type ThreadEvent } from "@openai/codex-sdk";
import { log } from "../utils/cli.ts";
import { addInstructions } from "./instructions.ts";
@@ -17,6 +19,13 @@ export const codex = agent({
process.env.OPENAI_API_KEY = apiKey;
process.env.GITHUB_INSTALLATION_TOKEN = githubInstallationToken;
// create config directory for codex before setting HOME
const tempHome = process.env.PULLFROG_TEMP_DIR!;
const configDir = join(tempHome, ".config", "codex");
mkdirSync(configDir, { recursive: true });
process.env.HOME = tempHome;
configureCodexMcpServers({ mcpServers, cliPath });
// Configure Codex
@@ -44,6 +53,7 @@ export const codex = agent({
let finalOutput = "";
for await (const event of streamedTurn.events) {
const handler = messageHandlers[event.type];
console.log(event as never);
if (handler) {
handler(event as never);
}
+10 -10
View File
@@ -1,5 +1,6 @@
import { spawn } from "node:child_process";
import { mkdirSync, writeFileSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
import { log } from "../utils/cli.ts";
import { addInstructions } from "./instructions.ts";
@@ -22,8 +23,6 @@ export const cursor = agent({
try {
const fullPrompt = addInstructions(payload);
const tempDir = cliPath.split("/.local/bin/")[0];
log.info("Running Cursor CLI...");
return new Promise((resolve) => {
@@ -36,7 +35,8 @@ export const cursor = agent({
...process.env,
CURSOR_API_KEY: apiKey,
GITHUB_INSTALLATION_TOKEN: githubInstallationToken,
HOME: tempDir, // Set HOME so Cursor CLI can find .cursor/mcp.json
// Don't override HOME - Cursor CLI needs access to macOS keychain
// MCP config is written to tempDir/.cursor/mcp.json which Cursor will find
},
stdio: ["ignore", "pipe", "pipe"], // Ignore stdin, pipe stdout/stderr
}
@@ -107,14 +107,14 @@ export const cursor = agent({
},
});
/**
* Configure MCP servers for Cursor by writing to the Cursor configuration file.
* For cursor, we need to add the MCP servers to the Cursor configuration file manually as there is no CLI command to do this.
*/
function configureCursorMcpServers({ mcpServers, cliPath }: ConfigureMcpServersParams) {
const tempDir = cliPath.split("/.local/bin/")[0];
const cursorConfigDir = join(tempDir, ".cursor");
// There was an issue on macOS when you set HOME to a temp directory
// it was unable to find the macOS keychain and would fail
// temp solution is to stick with the actual $HOME
function configureCursorMcpServers({ mcpServers }: ConfigureMcpServersParams) {
const realHome = homedir();
const cursorConfigDir = join(realHome, ".cursor");
const mcpConfigPath = join(cursorConfigDir, "mcp.json");
mkdirSync(cursorConfigDir, { recursive: true });
writeFileSync(mcpConfigPath, JSON.stringify({ mcpServers }, null, 2), "utf-8");
log.info(`MCP config written to ${mcpConfigPath}`);
}
+4 -1
View File
@@ -1,3 +1,4 @@
import { encode as toonEncode } from "@toon-format/toon";
import type { Payload } from "../external.ts";
import { ghPullfrogMcpName } from "../external.ts";
import { modes } from "../modes.ts";
@@ -15,6 +16,8 @@ You do not add unecessary comments, tests, or documentation unless explicitly pr
You adapt your writing style to the style of your coworkers, while never being unprofessional.
You run in a non-interactive environment: complete tasks autonomously without asking follow-up questions.
You make reasonable assumptions when details are missing, but fail with an explicit error if critical information is missing (e.g. user asks to review a PR but does not provide a link or ID).
Never push commits directly to protected branches: main, master, production. Always create a feature branch. All created branches must be prefixed with "pullfrog/" and have VERY specific names in order to avoid collisions.
Never add co-author trailers (e.g., "Co-authored-by" or "Co-Authored-By") to commit messages. Commits should only include the commit message itself, without any co-author attribution.
## SECURITY
@@ -62,4 +65,4 @@ ${[...modes, ...payload.modes].map((w) => ` - "${w.name}": ${w.description}`)
${payload.prompt}
${typeof payload.event === "string" ? payload.event : JSON.stringify(payload.event, null, 2)}`;
${toonEncode(payload.event)}`;
+2 -2
View File
@@ -14,8 +14,8 @@ import { log } from "../utils/cli.ts";
*/
export interface AgentResult {
success: boolean;
output?: string;
error?: string;
output?: string | undefined;
error?: string | undefined;
metadata?: Record<string, unknown>;
}