triage-pr-reviews
Triage PR Review Comments
Phase 1: Fetch and Analyze
- Run
gh pr-reviews [arg] --jsonto get unresolved review comments as JSON. If no argument is given, use the current branch's PR. Note: this command uses Copilot for classification and may take a while depending on the number of comments — use a longer timeout. Each JSON object contains:comment_id(int): REST API comment ID — usable for replying viagh apithread_id(string, only fortype: "thread"): inline review thread IDtype:"thread"(inline review) or"comment"(PR-level)author,body,url: comment metadatacommit_id,path,line,diff_hunk(only fortype: "thread"): file location and diff contextcategory: one ofsuggestion,nitpick,issue,question,approval,informationalresolved(bool),reason(string): resolution status and rationalereplies(array, optional, only fortype: "thread"with multiple comments): follow-up comments in the thread, each withauthor,body,created_at,url
- Check if PR metadata (number, title, url) is already available from conversation context. If not (e.g., when a PR number/URL is explicitly passed as argument), run
gh pr view [arg] --json number,title,urlto get it. - For
type: "thread"comments, usepath,line, anddiff_hunkfrom the JSON response to identify the exact file location. Fortype: "comment"(PR-level), there is no file location. - Check code context for each comment. Leverage any existing conversation context first. Only fetch additional context via
gh pr diffor file reads when necessary. - Evaluate each comment against the code context. When a thread has
replies, read the full conversation to understand whether the concern has already been discussed or partially addressed. Classify as Agree, Partially Agree, or Disagree with a rationale and suggested action.
Phase 2: Summary Overview
Show a brief summary of all comments before starting the interactive walkthrough:
## Unresolved Review Comments — PR #<number> (<title>)
| # | Category | Author | Assessment | File |
|---|----------|--------|------------|------|
| 1 | <category> | @<author> | Agree/Partially Agree/Disagree | `<path>:<line>` |
| 2 | <category> | @<author> | Agree/Partially Agree/Disagree | `PR-level` |
Total: <count> comments — Agree: n, Partially Agree: n, Disagree: n
Walking through each comment below...
Phase 3: Interactive Walkthrough (one-by-one)
For each comment, in order:
- Present the comment in this format:
---
### [<current>/<total>] [<category>] by @<author>
> <comment body>
**File**: `<path>` (line <line>) ← omit for PR-level comments
**Assessment**: <Agree | Partially Agree | Disagree>
**Rationale**: <1-3 sentences>
**Suggested action**: <recommended action>
-
Ask the user what to do. Present the following action choices and wait for the user's response before proceeding. The user may pick one of the predefined actions or provide free-text instructions:
- For
type: "thread"(inline review thread), offer:- Fix in code — Make the code change only
- Fix & reply & resolve — Make the code change, post a reply, and resolve the thread
- Fix & reply — Make the code change and post a reply without resolving
- Reply & resolve — Post a reply comment on GitHub and resolve the thread
- Reply only — Post a reply comment on GitHub without resolving
- Skip — Move on without taking action
- For
type: "comment"(PR-level comment), offer:- Fix in code — Make the code change only
- Fix & comment — Make the code change and post a PR-level comment
- Comment only — Post a PR-level comment on GitHub
- Skip — Move on without taking action
- The user may select by number, name, or provide custom instructions (e.g., "fix but also refactor the surrounding function", "reply with a question asking for clarification", etc.)
- For
-
Execute the chosen action — code fixes and commits are applied immediately during the walkthrough. GitHub API actions (reply, comment, resolve) are deferred to Phase 4 (ideally after pushing). During this phase, confirm the reply/comment content with the user and queue it for later execution. When an action includes a code fix, record the commit hash so it can be referenced in the queued reply/comment.
- Fix in code: Make the code change, draft a commit message following the repository's commit message conventions (check
git logfor style), confirm it with the user, and commit. - Fix & reply & resolve (
type: "thread"only): Make the code change, draft a commit message following the repository's commit message conventions (checkgit logfor style), confirm it with the user, and commit. Ask the user what to reply (or suggest a draft reply) and confirm the content. Queue the reply and resolve for Phase 4. - Fix & reply (
type: "thread"): Make the code change, draft a commit message following the repository's commit message conventions (checkgit logfor style), confirm it with the user, and commit. Ask the user what to reply (or suggest a draft reply) and confirm the content. Queue the reply for Phase 4. - Fix & comment (
type: "comment"): Make the code change, draft a commit message following the repository's commit message conventions (checkgit logfor style), confirm it with the user, and commit. Ask the user what to comment (or suggest a draft) and confirm the content. Queue the comment for Phase 4. - Reply & resolve (
type: "thread"only): Ask the user what to reply (or suggest a draft reply) and confirm the content. Queue the reply and resolve for Phase 4. - Reply only (
type: "thread"): Ask the user what to reply (or suggest a draft reply) and confirm the content. Queue the reply for Phase 4. - Comment only (
type: "comment"): Ask the user what to comment (or suggest a draft) and confirm the content. Queue the comment for Phase 4. - Skip: Do nothing, proceed to the next comment.
- Other (free-text): Follow the user's custom instructions for this comment. Code fixes are committed immediately; any GitHub API actions are queued for Phase 4.
- Fix in code: Make the code change, draft a commit message following the repository's commit message conventions (check
-
After completing the action (or skipping), move to the next comment and repeat.
Phase 4: Push & Execute Queued Actions
After all comments have been walked through:
- Show the triage summary:
## Triage Summary
| # | Category | Author | Assessment | Action |
|---|----------|--------|------------|--------|
| 1 | <category> | @<author> | <assessment> | Fixed (committed) & reply & resolve (queued) / Fixed (committed) / Skipped / ... |
| 2 | ... | ... | ... | ... |
Pending GitHub actions: <n> replies, <n> comments, <n> resolves
-
Ask: "Push?" — If the user agrees, push to the remote. If the user declines, skip this step.
-
Execute queued replies/comments/resolves — Show the list of pending GitHub API actions. For actions that include a code fix, include the commit hash in the reply/comment (e.g., "Fixed in abc1234.").
- If push succeeded: Ask "Execute queued replies/comments/resolves?" and execute if the user agrees.
- If push was declined: Warn that executing replies/resolves before pushing means reviewers cannot see the fixes yet. Require explicit confirmation: "Execute queued replies/comments/resolves without pushing?" Only execute if the user confirms after this warning.
- Endpoints:
- For thread replies:
gh apitoPOST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies - For PR-level comments:
gh apitoPOST /repos/{owner}/{repo}/issues/{pull_number}/comments - For thread resolves:
gh api graphqlusingthread_id(notcomment_id)
- For thread replies:
- If the user declines, show the pending actions list so they can execute manually later.
-
Show the final result:
## Triage Complete
| # | Category | Author | Assessment | Action Taken |
|---|----------|--------|------------|--------------|
| 1 | <category> | @<author> | <assessment> | Fixed & replied & resolved / Fixed / Skipped / ... |
| 2 | ... | ... | ... | ... |
- Fixed: n
- Replied/Commented: n
- Resolved: n
- Skipped: n
GitHub API Reference
- Reply to an inline review comment (thread):
gh api repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies -f body="<reply>" - Post a PR-level comment (issue comment):
gh api repos/{owner}/{repo}/issues/{pull_number}/comments -f body="<reply>" - Resolve a review thread:
gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "<thread_id>"}) { thread { id } } }'
Rules
- When the user selects a "Fix" action, this is an implicit request to commit. Draft a commit message, confirm it with the user, and commit. Do NOT push unless explicitly confirmed in Phase 4.
- When fixing code, make minimal changes that address the review comment.
- When suggesting reply drafts, keep them concise and professional.
- When drafting a PR-level comment for
type: "comment", always include a link to the original comment (urlfrom JSON) at the beginning of the reply body (e.g.,> Re: <url>\n\n<reply body>). PR-level comments have no threading, so without a link readers cannot tell which comment the reply addresses. - If code context is unclear, search the codebase to verify before making a judgment.
- Prefer
ghcommands for GitHub data.