/pr-feedback
Reads all unresolved PR review comments, triages them, and resolves each thread with reasoning.
User context
User-provided context for this invocation: $ARGUMENTS
If non-empty, treat it as triage guidance — e.g. it may tell you which reviewers to prioritize, which categories of comment to skip, or specific threads to focus on. Apply it during Step 3 (triage) when forming your recommendations.
Step 1: Find the PR
- Get the current branch:
git branch --show-current.
- Find the open PR for this branch:
gh pr view --json number,url,title.
- If no PR exists, stop — nothing to address.
Step 2: Fetch unresolved comments
- Fetch all review comments:
gh api repos/{owner}/{repo}/pulls/{number}/comments
- Also fetch review threads to check resolution status:
gh api graphql -f query='{ repository(owner:"{owner}", name:"{repo}") { pullRequest(number:{number}) { reviewThreads(first:100) { nodes { id, isResolved, comments(first:10) { nodes { body, path, line, author { login } } } } } } } }'
- Filter to unresolved threads only. If all threads are resolved, say so and stop.
Step 3: Triage each comment
For each unresolved comment, read the referenced code and understand the suggestion. Display a table:
| # | Reviewer | File | Suggestion | Recommendation |
|---|
| 1 | copilot | path/to/file.rb:42 | Summary | FIX — reason |
| 2 | teammate | path/to/other.js:10 | Summary | IGNORE — reason |
Ask the user which recommendations to proceed with before making any changes.
Step 4: Address each comment
Process comments one at a time. For each approved fix:
- Make the code change.
- Stage and commit with a message describing the fix.
- Push:
git push.
- Reply to the PR comment thread with the commit SHA linked:
gh api repos/{owner}/{repo}/pulls/{number}/comments/{comment_id}/replies -f body="Fixed in <commit_sha> — <what was changed>"
- Resolve the thread using the thread's node ID from Step 2, and confirm it actually resolved:
gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "<thread_node_id>"}) { thread { isResolved } } }' --jq '.data.resolveReviewThread.thread.isResolved'
For each approved ignore:
- Reply to the PR comment thread explaining why:
gh api repos/{owner}/{repo}/pulls/{number}/comments/{comment_id}/replies -f body="Won't fix — <reasoning>"
- Resolve the thread, confirming it resolved the same way:
gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "<thread_node_id>"}) { thread { isResolved } } }' --jq '.data.resolveReviewThread.thread.isResolved'
The mutation must print true. GraphQL reports a bad node ID, a stale thread, or a permissions problem as an errors array with HTTP 200, so an unresolved thread looks identical to a resolved one unless you read the result. Anything other than true means that thread is still open: say so in your reply to the user and leave it out of the "resolved" count rather than assuming it landed.
Step 5: Update PR description
If any code changes were made in Step 4, rewrite the description to reflect the current state of the code:
- Update the summary so it reads as though the PR were just created.
- Update the test plan:
IMPORTANT: Before rewriting, fetch the current PR body first with gh pr view --json body and check which test plan items are currently checked (- [x]). You MUST preserve this information:
- Uncheck all items.
- For any item that existed before, is unchanged, and was previously checked, append "🔄" to indicate it needs re-verification.
- Remove items that are no longer relevant and add new ones if needed.
gh pr edit {number} --body "<rewritten body>"