diff --git a/agents/claude.ts b/agents/claude.ts index 2f09d06..87209bd 100644 --- a/agents/claude.ts +++ b/agents/claude.ts @@ -57,7 +57,7 @@ export const claude = agent({ options: { ...sandboxOptions, mcpServers, - model: "claude-opus-4-5", + pathToClaudeCodeExecutable: cliPath, env: createAgentEnv({ ANTHROPIC_API_KEY: apiKey }), }, @@ -147,6 +147,7 @@ const messageHandlers: SDKMessageHandlers = { } }, result: async (data) => { + log.debug(JSON.stringify(data, null, 2)); if (data.subtype === "success") { await log.summaryTable([ [ diff --git a/entry b/entry index c143193..8faec09 100755 --- a/entry +++ b/entry @@ -92629,7 +92629,7 @@ ${disableProgressComment ? "" : ` description: "Review code, PRs, or implementations; provide feedback or suggestions; identify issues; or check code quality, style, and correctness", prompt: `Follow these steps. THINK HARDER. -1. **CHECKOUT** - Use ${ghPullfrogMcpName}/checkout_pr with the PR number. This fetches the PR branch and returns the diff. Use this diff for your review - it shows exactly what's in the PR. +1. **CHECKOUT** - Use ${ghPullfrogMcpName}/checkout_pr with the PR number. This returns all PR metadata (title, base, head, fork status) AND a \`diffPath\` pointing to a file containing the formatted diff. 2. **UNDERSTAND CONTEXT** - Read the modified files to understand the changes in context. Don't just look at the diff - understand how the changes affect the overall codebase. @@ -92639,7 +92639,7 @@ ${disableProgressComment ? "" : ` - What bugs, edge cases, or security issues exist? - Could this be made more elegant? -4. **DRAFT** - For each inline comment, find the line in the diff. Each code line shows: \`OLD | NEW | TYPE | CODE\`. Use the NEW line number (second column). +4. **DRAFT** - For each inline comment, find the line in the diff. Each code line shows: \`| OLD | NEW | TYPE | CODE\`. Use the NEW line number (second column). 5. **SELF-CRITIQUE** - Before submitting, review your draft: - DO NOT NITPICK. Do not comment on minor formatting changes, changes to playground/scratch files, lack of docs/docsstrings, or small changes that seem irrelevant. Assume these things are intentional by the PR author. @@ -93340,7 +93340,6 @@ var claude = agent({ options: { ...sandboxOptions, mcpServers, - model: "claude-opus-4-5", pathToClaudeCodeExecutable: cliPath, env: createAgentEnv({ ANTHROPIC_API_KEY: apiKey }) } @@ -93400,6 +93399,7 @@ var messageHandlers = { } }, result: async (data) => { + log.debug(JSON.stringify(data, null, 2)); if (data.subtype === "success") { await log.summaryTable([ [ @@ -98288,13 +98288,9 @@ function stripExistingFooter(body) { // mcp/shared.ts var tool = (toolDef) => toolDef; var handleToolSuccess = (data) => { + const text = typeof data === "string" ? data : encode(data); return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2) - } - ] + content: [{ type: "text", text }] }; }; var handleToolError = (error41) => { @@ -123044,16 +123040,16 @@ function formatFilesWithLineNumbers(files) { const changeType = line[0] || " "; const code = line.slice(1); if (changeType === "-") { - output.push(`${padNum(oldLine)} | | - | ${code}`); + output.push(`| ${padNum(oldLine)} | | - | ${code}`); oldLine++; } else if (changeType === "+") { - output.push(` | ${padNum(newLine)} | + | ${code}`); + output.push(`| | ${padNum(newLine)} | + | ${code}`); newLine++; } else if (changeType === " " || changeType === "\\") { if (changeType === "\\") { output.push(line); } else { - output.push(`${padNum(oldLine)} | ${padNum(newLine)} | | ${code}`); + output.push(`| ${padNum(oldLine)} | ${padNum(newLine)} | | ${code}`); oldLine++; newLine++; } @@ -123170,8 +123166,7 @@ ${diffPreview}`); const diffPath = join8(tempDir, `pr-${pull_number}.diff`); writeFileSync4(diffPath, diffContent); log.debug(`wrote diff to ${diffPath} (${diffContent.length} bytes)`); - const MAX_INLINE_DIFF_SIZE = 50 * 1024; - const diff = diffContent.length <= MAX_INLINE_DIFF_SIZE ? diffContent : `Diff is ${(diffContent.length / 1024).toFixed(0)}KB - use grep or read from ${diffPath}`; + const diff = `Diff written to ${diffPath} (${(diffContent.length / 1024).toFixed(1)}KB). Use grep or read_file to explore.`; return { success: true, number: pr.data.number, @@ -124276,11 +124271,7 @@ function GetIssueCommentsTool(ctx) { id: comment.id, body: comment.body, user: comment.user?.login, - created_at: comment.created_at, - updated_at: comment.updated_at, - html_url: comment.html_url, - author_association: comment.author_association, - reactions: comment.reactions + author_association: comment.author_association })), count: comments.length }; diff --git a/mcp/checkout.ts b/mcp/checkout.ts index 16f5bfe..dccdd72 100644 --- a/mcp/checkout.ts +++ b/mcp/checkout.ts @@ -12,7 +12,7 @@ type PullFile = RestEndpointMethodTypes["pulls"]["listFiles"]["response"]["data" /** * formats PR files with explicit line numbers for each code line. * preserves all original diff info (file headers, hunk headers) and adds: - * OLD | NEW | TYPE | code + * | OLD | NEW | TYPE | code */ export function formatFilesWithLineNumbers(files: PullFile[]): string { const output: string[] = []; @@ -50,18 +50,18 @@ export function formatFilesWithLineNumbers(files: PullFile[]): string { if (changeType === "-") { // removed line: show old line number, no new line number - output.push(`${padNum(oldLine)} | | - | ${code}`); + output.push(`| ${padNum(oldLine)} | | - | ${code}`); oldLine++; } else if (changeType === "+") { // added line: no old line number, show new line number - output.push(` | ${padNum(newLine)} | + | ${code}`); + output.push(`| | ${padNum(newLine)} | + | ${code}`); newLine++; } else if (changeType === " " || changeType === "\\") { // context line or "\ No newline at end of file" if (changeType === "\\") { output.push(line); // pass through as-is } else { - output.push(`${padNum(oldLine)} | ${padNum(newLine)} | | ${code}`); + output.push(`| ${padNum(oldLine)} | ${padNum(newLine)} | | ${code}`); oldLine++; newLine++; } @@ -263,12 +263,8 @@ export function CheckoutPrTool(ctx: ToolContext) { writeFileSync(diffPath, diffContent); log.debug(`wrote diff to ${diffPath} (${diffContent.length} bytes)`); - // return diff inline only if small enough - const MAX_INLINE_DIFF_SIZE = 50 * 1024; // 50KB - const diff = - diffContent.length <= MAX_INLINE_DIFF_SIZE - ? diffContent - : `Diff is ${(diffContent.length / 1024).toFixed(0)}KB - use grep or read from ${diffPath}`; + // don't inline diff - always point to file to reduce context size + const diff = `Diff written to ${diffPath} (${(diffContent.length / 1024).toFixed(1)}KB). Use grep or read_file to explore.`; return { success: true, diff --git a/mcp/issueComments.ts b/mcp/issueComments.ts index b023c09..5b06a0e 100644 --- a/mcp/issueComments.ts +++ b/mcp/issueComments.ts @@ -28,11 +28,7 @@ export function GetIssueCommentsTool(ctx: ToolContext) { id: comment.id, body: comment.body, user: comment.user?.login, - created_at: comment.created_at, - updated_at: comment.updated_at, - html_url: comment.html_url, author_association: comment.author_association, - reactions: comment.reactions, })), count: comments.length, }; diff --git a/mcp/shared.ts b/mcp/shared.ts index 0d2b791..f08d670 100644 --- a/mcp/shared.ts +++ b/mcp/shared.ts @@ -1,4 +1,5 @@ import type { StandardSchemaV1 } from "@standard-schema/spec"; +import { encode as toonEncode } from "@toon-format/toon"; import type { FastMCP, Tool } from "fastmcp"; import type { ToolContext } from "../main.ts"; @@ -12,14 +13,10 @@ export interface ToolResult { isError?: boolean; } -export const handleToolSuccess = (data: Record): ToolResult => { +export const handleToolSuccess = (data: Record | string): ToolResult => { + const text = typeof data === "string" ? data : toonEncode(data); return { - content: [ - { - type: "text", - text: JSON.stringify(data, null, 2), - }, - ], + content: [{ type: "text", text }], }; }; @@ -40,7 +37,7 @@ export const handleToolError = (error: unknown): ToolResult => { * Helper to wrap a tool execute function with error handling. * Captures ctx in closure so tools don't need to handle try/catch. */ -export const execute = (fn: (params: T) => Promise>) => { +export const execute = (fn: (params: T) => Promise | string>) => { return async (params: T): Promise => { try { const result = await fn(params); diff --git a/modes.ts b/modes.ts index a0bdfa9..6ea00ee 100644 --- a/modes.ts +++ b/modes.ts @@ -101,7 +101,7 @@ ${ "Review code, PRs, or implementations; provide feedback or suggestions; identify issues; or check code quality, style, and correctness", prompt: `Follow these steps. THINK HARDER. -1. **CHECKOUT** - Use ${ghPullfrogMcpName}/checkout_pr with the PR number. This fetches the PR branch and returns the diff. Use this diff for your review - it shows exactly what's in the PR. +1. **CHECKOUT** - Use ${ghPullfrogMcpName}/checkout_pr with the PR number. This returns all PR metadata (title, base, head, fork status) AND a \`diffPath\` pointing to a file containing the formatted diff. 2. **UNDERSTAND CONTEXT** - Read the modified files to understand the changes in context. Don't just look at the diff - understand how the changes affect the overall codebase. @@ -111,7 +111,7 @@ ${ - What bugs, edge cases, or security issues exist? - Could this be made more elegant? -4. **DRAFT** - For each inline comment, find the line in the diff. Each code line shows: \`OLD | NEW | TYPE | CODE\`. Use the NEW line number (second column). +4. **DRAFT** - For each inline comment, find the line in the diff. Each code line shows: \`| OLD | NEW | TYPE | CODE\`. Use the NEW line number (second column). 5. **SELF-CRITIQUE** - Before submitting, review your draft: - DO NOT NITPICK. Do not comment on minor formatting changes, changes to playground/scratch files, lack of docs/docsstrings, or small changes that seem irrelevant. Assume these things are intentional by the PR author.