diff --git a/agents/claude.ts b/agents/claude.ts index 77a9ada..86948f3 100644 --- a/agents/claude.ts +++ b/agents/claude.ts @@ -1,12 +1,11 @@ import { query, type SDKMessage } from "@anthropic-ai/claude-agent-sdk"; import { log } from "../utils/cli.ts"; -import { instructions } from "./shared.ts"; -import type { Agent } from "./types.ts"; +import { type Agent, instructions } from "./shared.ts"; export const claude: Agent = { run: async ({ prompt, mcpServers, apiKey }) => { process.env.ANTHROPIC_API_KEY = apiKey; - // Create the query with SDK options + const queryInstance = query({ prompt: `${instructions}\n\n${prompt}`, options: { diff --git a/agents/shared.ts b/agents/shared.ts index e066e01..0ee3d75 100644 --- a/agents/shared.ts +++ b/agents/shared.ts @@ -1,12 +1,37 @@ -import { mcpServerName } from "../mcp/config.ts"; +import type { McpServerConfig } from "@anthropic-ai/claude-agent-sdk"; +import { ghPullfrogMcpName } from "../mcp/config.ts"; -export const instructions = `- use the ${mcpServerName} MCP server to interact with github -- if ${mcpServerName} is not available or doesn't include the functionality you need, describe why and bail +/** + * Result returned by agent execution + */ +export interface AgentResult { + success: boolean; + output?: string; + error?: string; + metadata?: Record; +} + +/** + * Configuration for agent creation + */ +export interface AgentConfig { + apiKey: string; + githubInstallationToken: string; + prompt: string; + mcpServers: Record; +} + +export type Agent = { + run: (config: AgentConfig) => Promise; +}; + +export const instructions = `- use the ${ghPullfrogMcpName} MCP server to interact with github +- if ${ghPullfrogMcpName} is not available or doesn't include the functionality you need, describe why and bail - do not under any circumstances use the gh cli - if prompted by a comment to respond to create a new issue, pr or anything else, after succeeding, also respond to the original comment with a very brief message containing a link to it - if prompted to review a PR: - (1) get PR info with mcp__${mcpServerName}__get_pull_request + (1) get PR info with mcp__${ghPullfrogMcpName}__get_pull_request (2) fetch both branches: git fetch origin --depth=20 && git fetch origin (3) checkout the PR branch: git checkout origin/ (you MUST do this before reading any files) (4) view diff: git diff origin/...origin/ (this shows what changed) diff --git a/agents/types.ts b/agents/types.ts deleted file mode 100644 index 77770fe..0000000 --- a/agents/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { McpServerConfig } from "@anthropic-ai/claude-agent-sdk"; - -/** - * Result returned by agent execution - */ -export interface AgentResult { - success: boolean; - output?: string; - error?: string; - metadata?: Record; -} - -/** - * Configuration for agent creation - */ -export interface AgentConfig { - apiKey: string; - githubInstallationToken: string; - prompt: string; - mcpServers: Record; -} - -export type Agent = { - run: (config: AgentConfig) => Promise; -}; diff --git a/main.ts b/main.ts index 86d5c19..5583c73 100644 --- a/main.ts +++ b/main.ts @@ -1,6 +1,6 @@ import { type } from "arktype"; import { claude } from "./agents/claude.ts"; -import { createMcpConfig } from "./mcp/config.ts"; +import { createMcpConfigs } from "./mcp/config.ts"; import { log } from "./utils/cli.ts"; import { parseRepoContext, setupGitHubInstallationToken } from "./utils/github.ts"; import { setupGitAuth, setupGitConfig } from "./utils/setup.ts"; @@ -29,13 +29,9 @@ export async function main(inputs: Inputs): Promise { setupGitAuth(githubInstallationToken, repoContext); - // Create MCP config - const mcpConfig = JSON.parse(createMcpConfig(githubInstallationToken)); + const mcpServers = createMcpConfigs(githubInstallationToken); - log.debug(`📋 MCP Config: ${JSON.stringify(mcpConfig, null, 2)}`); - - // Extract mcpServers object from config - const mcpServers = mcpConfig.mcpServers || {}; + log.debug(`📋 MCP Config: ${JSON.stringify(mcpServers, null, 2)}`); log.info("Running Claude Agent SDK..."); log.box(inputs.prompt, { title: "Prompt" }); diff --git a/mcp/config.ts b/mcp/config.ts index 680d351..0968292 100644 --- a/mcp/config.ts +++ b/mcp/config.ts @@ -1,32 +1,31 @@ /** * Simple MCP configuration helper for adding our minimal GitHub comment server */ + +import type { McpServerConfig } from "@anthropic-ai/claude-agent-sdk"; import { fromHere } from "@ark/fs"; import { parseRepoContext } from "../utils/github.ts"; const actionPath = fromHere(".."); -export const mcpServerName = "gh-pullfrog"; +export const ghPullfrogMcpName = "gh-pullfrog"; -export function createMcpConfig(githubInstallationToken: string) { +export type McpName = typeof ghPullfrogMcpName; + +export type McpConfigs = Record; + +export function createMcpConfigs(githubInstallationToken: string): McpConfigs { const repoContext = parseRepoContext(); const githubRepository = `${repoContext.owner}/${repoContext.name}`; - return JSON.stringify( - { - mcpServers: { - [mcpServerName]: { - command: "node", - args: [`${actionPath}/mcp/server.ts`], - env: { - GITHUB_INSTALLATION_TOKEN: githubInstallationToken, - GITHUB_REPOSITORY: githubRepository, - LOG_LEVEL: process.env.LOG_LEVEL, - }, - }, + return { + [ghPullfrogMcpName]: { + command: "node", + args: [`${actionPath}/mcp/server.ts`], + env: { + GITHUB_INSTALLATION_TOKEN: githubInstallationToken, + GITHUB_REPOSITORY: githubRepository, }, }, - null, - 2 - ); + }; } diff --git a/package.json b/package.json index 9be8e71..a7ec14f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pullfrog/action", - "version": "0.0.66", + "version": "0.0.67", "type": "module", "files": [ "index.js", diff --git a/utils/files.ts b/utils/files.ts deleted file mode 100644 index e984d46..0000000 --- a/utils/files.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { mkdtempSync, writeFileSync } from "node:fs"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; - -/** - * Create a temporary file with the given content - */ -export function createTempFile(content: string, filename = "temp.txt"): string { - const tempDir = mkdtempSync(join(tmpdir(), "pullfrog-")); - const filePath = join(tempDir, filename); - writeFileSync(filePath, content); - return filePath; -}