From 2e6c01670e0ee9aea8e1963ea6660dfc03b13d96 Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Fri, 8 May 2026 21:48:28 +0000 Subject: [PATCH] mcp: log artifact id after every github write (#633) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit makes debugging easier by emitting a single `» ` line after every successful GitHub write (and upload) the agent performs via the Pullfrog MCP, mirroring the chevron convention used elsewhere. --- mcp/comment.ts | 8 ++++++++ mcp/git.ts | 7 +++++++ mcp/issue.ts | 3 +++ mcp/labels.ts | 2 ++ mcp/pr.ts | 2 ++ mcp/review.ts | 1 + mcp/reviewComments.ts | 2 +- mcp/upload.ts | 3 +++ 8 files changed, 27 insertions(+), 1 deletion(-) diff --git a/mcp/comment.ts b/mcp/comment.ts index e867330..14a6abf 100644 --- a/mcp/comment.ts +++ b/mcp/comment.ts @@ -78,6 +78,7 @@ export function CreateCommentTool(ctx: ToolContext) { }); ctx.toolState.wasUpdated = true; + log.info(`» created comment ${result.data.id}`); if (commentType === "Plan") { if (result.data.node_id) { @@ -94,6 +95,7 @@ export function CreateCommentTool(ctx: ToolContext) { comment_id: result.data.id, body: bodyWithPlanLink, }); + log.info(`» updated comment ${updateResult.data.id}`); return { success: true, @@ -132,6 +134,7 @@ export function EditCommentTool(ctx: ToolContext) { comment_id: commentId, body: bodyWithFooter, }); + log.info(`» updated comment ${result.data.id}`); return { success: true, @@ -339,6 +342,10 @@ export function ReportProgressTool(ctx: ToolContext) { }; } + if (result.commentId !== undefined) { + log.info(`» ${result.action} comment ${result.commentId}`); + } + if (!params.target_plan_comment) { ctx.toolState.finalSummaryWritten = true; } @@ -407,6 +414,7 @@ export function ReplyToReviewCommentTool(ctx: ToolContext) { comment_id, body: bodyWithFooter, }); + log.info(`» created review comment ${result.data.id} (in reply to ${comment_id})`); // mark progress as updated so error reporting + run-result handling know // a substantive write happened (used by reportErrorToComment / handleAgentResult) diff --git a/mcp/git.ts b/mcp/git.ts index f5f24ea..891ec54 100644 --- a/mcp/git.ts +++ b/mcp/git.ts @@ -351,6 +351,11 @@ export function PushBranchTool(ctx: ToolContext) { throw lastErr instanceof Error ? lastErr : new Error(String(lastErr)); } + const pushedSha = $("git", ["rev-parse", "HEAD"], { log: false }).trim(); + log.info( + `» pushed branch ${branch} to ${pushDest.remoteName}/${pushDest.remoteBranch} (sha ${pushedSha})` + ); + return { success: true, branch, @@ -595,6 +600,7 @@ export function DeleteBranchTool(ctx: ToolContext) { await $git("push", ["origin", "--delete", `refs/heads/${params.branchName}`], { token: ctx.gitToken, }); + log.info(`» deleted branch ${params.branchName}`); return { success: true, deleted: params.branchName }; }), }); @@ -625,6 +631,7 @@ export function PushTagsTool(ctx: ToolContext) { await $git("push", pushArgs, { token: ctx.gitToken, }); + log.info(`» pushed tag ${params.tag}`); return { success: true, tag: params.tag }; }), }); diff --git a/mcp/issue.ts b/mcp/issue.ts index 41411ed..7234939 100644 --- a/mcp/issue.ts +++ b/mcp/issue.ts @@ -1,4 +1,5 @@ import { type } from "arktype"; +import { log } from "../utils/cli.ts"; import { fixDoubleEscapedString } from "../utils/fixDoubleEscapedString.ts"; import { patchWorkflowRunFields } from "../utils/patchWorkflowRunFields.ts"; import type { ToolContext } from "./server.ts"; @@ -32,6 +33,8 @@ export function IssueTool(ctx: ToolContext) { assignees: params.assignees ?? [], }); + log.info(`» created issue #${result.data.number} (id ${result.data.id})`); + const nodeId = result.data.node_id; if (typeof nodeId === "string" && nodeId.length > 0) { await patchWorkflowRunFields(ctx, { diff --git a/mcp/labels.ts b/mcp/labels.ts index 233ce11..ce20159 100644 --- a/mcp/labels.ts +++ b/mcp/labels.ts @@ -1,4 +1,5 @@ import { type } from "arktype"; +import { log } from "../utils/cli.ts"; import type { ToolContext } from "./server.ts"; import { execute, tool } from "./shared.ts"; @@ -20,6 +21,7 @@ export function AddLabelsTool(ctx: ToolContext) { issue_number, labels, }); + log.info(`» added labels [${labels.join(", ")}] to issue #${issue_number}`); return { success: true, diff --git a/mcp/pr.ts b/mcp/pr.ts index 9110914..1e96989 100644 --- a/mcp/pr.ts +++ b/mcp/pr.ts @@ -48,6 +48,7 @@ export function UpdatePullRequestBodyTool(ctx: ToolContext) { pull_number: params.pull_number, body: bodyWithFooter, }); + log.info(`» updated pull request #${result.data.number}`); ctx.toolState.wasUpdated = true; @@ -80,6 +81,7 @@ export function CreatePullRequestTool(ctx: ToolContext) { base: params.base, draft: params.draft ?? false, }); + log.info(`» created pull request #${result.data.number} (id ${result.data.id})`); // best-effort: request review from the user who triggered the workflow const reviewer = ctx.payload.triggerer; diff --git a/mcp/review.ts b/mcp/review.ts index 29526bf..cb91762 100644 --- a/mcp/review.ts +++ b/mcp/review.ts @@ -584,6 +584,7 @@ export function CreatePullRequestReviewTool(ctx: ToolContext) { } const reviewId = result.data.id; const reviewNodeId = result.data.node_id; + log.info(`» created review ${reviewId} on pull request #${pull_number}`); // reviewedSha = what the agent actually reviewed (checkout SHA), not the // submission anchor (current HEAD). this ensures postReviewCleanup dispatches diff --git a/mcp/reviewComments.ts b/mcp/reviewComments.ts index f9fca2b..c642490 100644 --- a/mcp/reviewComments.ts +++ b/mcp/reviewComments.ts @@ -735,7 +735,7 @@ export function ResolveReviewThreadTool(ctx: ToolContext) { }); const thread = response.resolveReviewThread.thread; - log.debug(`resolved thread ${thread.id}, isResolved=${thread.isResolved}`); + log.info(`» resolved review thread ${thread.id}`); return { thread_id: thread.id, diff --git a/mcp/upload.ts b/mcp/upload.ts index 36bac81..0d783ae 100644 --- a/mcp/upload.ts +++ b/mcp/upload.ts @@ -3,6 +3,7 @@ import * as path from "node:path"; import { type } from "arktype"; import { fileTypeFromBuffer } from "file-type"; import { apiFetch } from "../utils/apiFetch.ts"; +import { log } from "../utils/cli.ts"; import type { ToolContext } from "./server.ts"; import { execute, tool } from "./shared.ts"; @@ -65,6 +66,8 @@ export function UploadFileTool(ctx: ToolContext) { throw new Error(`failed to upload file: ${uploadResponse.statusText}`); } + log.info(`» uploaded file ${publicUrl}`); + return { success: true, publicUrl, filename, contentLength, contentType }; }), });