Improve debug logging for reviews. v0.0.150

This commit is contained in:
Colin McDonnell
2025-12-22 13:50:39 -08:00
parent 7407b6cbc5
commit e9a585ce47
4 changed files with 40 additions and 34 deletions
+16 -15
View File
@@ -83328,7 +83328,7 @@ function query({
// package.json // package.json
var package_default = { var package_default = {
name: "@pullfrog/action", name: "@pullfrog/action",
version: "0.0.149", version: "0.0.150",
type: "module", type: "module",
files: [ files: [
"index.js", "index.js",
@@ -83654,7 +83654,8 @@ var log = {
*/ */
toolCall: ({ toolName, input }) => { toolCall: ({ toolName, input }) => {
const inputFormatted = formatJsonValue(input); const inputFormatted = formatJsonValue(input);
const output = inputFormatted !== "{}" ? `${toolName}(${inputFormatted})` : `${toolName}()`; const timestamp = isDebugEnabled() ? ` [${(/* @__PURE__ */ new Date()).toISOString()}]` : "";
const output = inputFormatted !== "{}" ? `\u2192 ${toolName}(${inputFormatted})${timestamp}` : `\u2192 ${toolName}()${timestamp}`;
log.info(output.trimEnd()); log.info(output.trimEnd());
} }
}; };
@@ -124502,19 +124503,10 @@ function StartReviewTool(ctx) {
nodeId: reviewNodeId, nodeId: reviewNodeId,
id: reviewId id: reviewId
}; };
log.debug(`review session started: id=${reviewId}, nodeId=${reviewNodeId}`);
return { return {
message: `Review session started for PR #${pull_number}.`, message: `Review session started for PR #${pull_number}.`,
guidance: { instructions: "Analyze: What does this PR change? Is the approach sound? What bugs, edge cases, or security issues exist? Before commenting: Skip nitpicks unless requested. Only comment if the codebase maintainer would care."
analyze: [
"What does this PR change? Summarize in 1-2 sentences.",
"Is the approach sound? If not, stop and comment on approach first.",
"What bugs, edge cases, or security issues exist?"
],
beforeCommenting: [
"Skip nitpicks unless explicitly requested.",
"Would the codebase maintainer care about this feedback, based on what you can infer about the code quality standards in this repo?"
]
}
}; };
}) })
}); });
@@ -124536,7 +124528,10 @@ function AddReviewCommentTool(ctx) {
if (!ctx.toolState.review) { if (!ctx.toolState.review) {
throw new Error("No review session started. Call start_review first."); throw new Error("No review session started. Call start_review first.");
} }
await ctx.octokit.graphql( log.debug(
`adding review comment: reviewNodeId=${ctx.toolState.review.nodeId}, path=${path4}, line=${line}, side=${side || "RIGHT"}`
);
const result = await ctx.octokit.graphql(
ADD_PULL_REQUEST_REVIEW_THREAD, ADD_PULL_REQUEST_REVIEW_THREAD,
{ {
pullRequestReviewId: ctx.toolState.review.nodeId, pullRequestReviewId: ctx.toolState.review.nodeId,
@@ -124546,9 +124541,11 @@ function AddReviewCommentTool(ctx) {
side: side || "RIGHT" side: side || "RIGHT"
} }
); );
log.debug(`review comment added: threadId=${result.addPullRequestReviewThread.thread.id}`);
return { return {
success: true, success: true,
message: `Comment added to ${path4}:${line}` message: `Comment added to ${path4}:${line}`,
threadId: result.addPullRequestReviewThread.thread.id
}; };
}) })
}); });
@@ -124571,6 +124568,9 @@ function SubmitReviewTool(ctx) {
throw new Error("No PR context. Call checkout_pr or start_review first."); throw new Error("No PR context. Call checkout_pr or start_review first.");
} }
const reviewId = ctx.toolState.review.id; const reviewId = ctx.toolState.review.id;
log.debug(
`submitting review: id=${reviewId}, nodeId=${ctx.toolState.review.nodeId}, prNumber=${ctx.toolState.prNumber}`
);
const apiUrl = process.env.API_URL || "https://pullfrog.com"; const apiUrl = process.env.API_URL || "https://pullfrog.com";
const fixAllUrl = `${apiUrl}/trigger/${ctx.owner}/${ctx.name}/${ctx.toolState.prNumber}?action=fix&review_id=${reviewId}`; const fixAllUrl = `${apiUrl}/trigger/${ctx.owner}/${ctx.name}/${ctx.toolState.prNumber}?action=fix&review_id=${reviewId}`;
const fixApprovedUrl = `${apiUrl}/trigger/${ctx.owner}/${ctx.name}/${ctx.toolState.prNumber}?action=fix-approved&review_id=${reviewId}`; const fixApprovedUrl = `${apiUrl}/trigger/${ctx.owner}/${ctx.name}/${ctx.toolState.prNumber}?action=fix-approved&review_id=${reviewId}`;
@@ -124587,6 +124587,7 @@ function SubmitReviewTool(ctx) {
event: "COMMENT", event: "COMMENT",
body: bodyWithFooter body: bodyWithFooter
}); });
log.debug(`review submitted: reviewId=${result.data.id}, state=${result.data.state}`);
delete ctx.toolState.review; delete ctx.toolState.review;
await deleteProgressComment(ctx); await deleteProgressComment(ctx);
return { return {
+18 -12
View File
@@ -123,19 +123,13 @@ export function StartReviewTool(ctx: ToolContext) {
id: reviewId, id: reviewId,
}; };
log.debug(`review session started: id=${reviewId}, nodeId=${reviewNodeId}`);
return { return {
message: `Review session started for PR #${pull_number}.`, message: `Review session started for PR #${pull_number}.`,
guidance: { instructions:
analyze: [ "Analyze: What does this PR change? Is the approach sound? What bugs, edge cases, or security issues exist? " +
"What does this PR change? Summarize in 1-2 sentences.", "Before commenting: Skip nitpicks unless requested. Only comment if the codebase maintainer would care.",
"Is the approach sound? If not, stop and comment on approach first.",
"What bugs, edge cases, or security issues exist?",
],
beforeCommenting: [
"Skip nitpicks unless explicitly requested.",
"Would the codebase maintainer care about this feedback, based on what you can infer about the code quality standards in this repo?",
],
},
}; };
}), }),
}); });
@@ -166,8 +160,12 @@ export function AddReviewCommentTool(ctx: ToolContext) {
throw new Error("No review session started. Call start_review first."); throw new Error("No review session started. Call start_review first.");
} }
log.debug(
`adding review comment: reviewNodeId=${ctx.toolState.review.nodeId}, path=${path}, line=${line}, side=${side || "RIGHT"}`
);
// add comment thread via GraphQL (REST doesn't support adding to existing pending review) // add comment thread via GraphQL (REST doesn't support adding to existing pending review)
await ctx.octokit.graphql<AddPullRequestReviewThreadResponse>( const result = await ctx.octokit.graphql<AddPullRequestReviewThreadResponse>(
ADD_PULL_REQUEST_REVIEW_THREAD, ADD_PULL_REQUEST_REVIEW_THREAD,
{ {
pullRequestReviewId: ctx.toolState.review.nodeId, pullRequestReviewId: ctx.toolState.review.nodeId,
@@ -178,9 +176,12 @@ export function AddReviewCommentTool(ctx: ToolContext) {
} }
); );
log.debug(`review comment added: threadId=${result.addPullRequestReviewThread.thread.id}`);
return { return {
success: true, success: true,
message: `Comment added to ${path}:${line}`, message: `Comment added to ${path}:${line}`,
threadId: result.addPullRequestReviewThread.thread.id,
}; };
}), }),
}); });
@@ -211,6 +212,9 @@ export function SubmitReviewTool(ctx: ToolContext) {
} }
const reviewId = ctx.toolState.review.id; const reviewId = ctx.toolState.review.id;
log.debug(
`submitting review: id=${reviewId}, nodeId=${ctx.toolState.review.nodeId}, prNumber=${ctx.toolState.prNumber}`
);
// build quick links footer // build quick links footer
const apiUrl = process.env.API_URL || "https://pullfrog.com"; const apiUrl = process.env.API_URL || "https://pullfrog.com";
@@ -234,6 +238,8 @@ export function SubmitReviewTool(ctx: ToolContext) {
body: bodyWithFooter, body: bodyWithFooter,
}); });
log.debug(`review submitted: reviewId=${result.data.id}, state=${result.data.state}`);
// clear review state // clear review state
delete ctx.toolState.review; delete ctx.toolState.review;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@pullfrog/action", "name": "@pullfrog/action",
"version": "0.0.149", "version": "0.0.150",
"type": "module", "type": "module",
"files": [ "files": [
"index.js", "index.js",
+5 -6
View File
@@ -342,12 +342,11 @@ export const log = {
*/ */
toolCall: ({ toolName, input }: { toolName: string; input: unknown }): void => { toolCall: ({ toolName, input }: { toolName: string; input: unknown }): void => {
const inputFormatted = formatJsonValue(input); const inputFormatted = formatJsonValue(input);
// if (inputFormatted !== "{}") const timestamp = isDebugEnabled() ? ` [${new Date().toISOString()}]` : "";
const output = inputFormatted !== "{}" ? `${toolName}(${inputFormatted})` : `${toolName}()`; const output =
inputFormatted !== "{}"
// if (inputFormatted !== "{}") { ? `${toolName}(${inputFormatted})${timestamp}`
// output += formatIndentedField("input", inputFormatted); : `${toolName}()${timestamp}`;
// }
log.info(output.trimEnd()); log.info(output.trimEnd());
}, },