Agent skill
resolve-pr-comments
Evaluate, fix, answer, and reply to GitHub pull request review comments. Handles both change requests (fix or skip) and reviewer questions (explain using reasoning recalled from past Claude Code transcripts). Use when the user asks to "resolve PR comments", "fix review comments", "address PR feedback", "handle review comments", "address review feedback", "respond to PR comments", "answer review questions", or "address code review".
Install this agent skill to your Project
npx add-skill https://github.com/tobihagemann/turbo/tree/main/skills/resolve-pr-comments
SKILL.md
Resolve PR Review Comments
Fetch unresolved review comments from a GitHub PR, critically evaluate each one, fix or skip based on confidence, answer reviewer questions using recalled implementation reasoning, and reply to each thread.
Task Tracking
At the start, use TaskCreate to create a task for each step:
- Fetch comments
- Triage review body comments
- Run
/interpret-feedbackskill - Split questions and change requests
- Run
/evaluate-findingsskill - Resolve ambiguities
- Choose implementation path
- Implement and finalize
- Verify fixes
- Run
/recall-reasoningskill for questions - Draft replies
- Post replies
- Summary
Step 1: Fetch Comments
Fetch review threads, top-level review body comments, and PR commits from the PR:
gh api graphql -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
title url
reviewThreads(first: 100) {
nodes {
id isResolved isOutdated
comments(first: 50) {
nodes { author { login } body path line originalLine diffHunk }
}
}
}
reviews(first: 50) {
nodes {
author { login }
body state submittedAt
}
}
commits(last: 50) {
nodes {
commit {
oid abbreviatedOid message committedDate
}
}
}
}
}
}' -f owner='{owner}' -f repo='{repo}' -F pr={pr_number}
Auto-detect owner, repo, and PR number from current branch if not provided. Filter review threads to unresolved only. Filter reviews to those with a non-empty body, excluding PENDING state (unsubmitted drafts).
Step 2: Triage Review Body Comments
For each review body comment (non-empty body, non-PENDING), check whether a commit in the PR already addresses it. Compare the review's submittedAt timestamp against each commit's committedDate. Only commits after the review was submitted can address it.
To determine if a commit addresses a review body comment, start with commit messages. Only read the full diff (git show <oid>) when the message alone is ambiguous. A commit addresses a comment when its changes clearly resolve the specific issue described. Touching the same area is not enough.
Classify each review body comment as:
- Addressed: A subsequent commit clearly resolves the concern. Record the commit SHA.
- Unaddressed: No subsequent commit resolves the concern. Requires manual attention.
Step 3: Run /interpret-feedback Skill
Run the /interpret-feedback skill on unresolved inline threads authored by humans. Skip threads from bot accounts (logins ending in [bot], e.g., CodeRabbit, Copilot). AI reviewer feedback is structured and explicit enough for /evaluate-findings to handle directly.
Include each thread's diffHunk so the interpreters can see the code context the reviewer commented on. For outdated comments where line is null, use originalLine as the line reference.
Step 4: Split Questions and Change Requests
Classify each interpreted thread as either a question or a change request based on the reconciled intent from Step 3.
- Question — the reviewer is asking for an explanation or wondering whether something is intentional. The thread does not request any code change. Examples: "Why this approach?", "Is this intentional?", "What is the benefit here?".
- Change request — the reviewer suggests a code change, flags a bug, or proposes an alternative implementation. This includes soft-phrased suggestions ("could we ...", "consider ...") and rhetorical questions that imply a change ("Shouldn't this ...?", "Is there a reason this isn't ...?").
When in doubt, treat a thread as a change request. The verdict from /evaluate-findings in Step 5 will catch genuine non-issues.
Produce two lists. Each entry retains the thread ID, file path, line (use originalLine when line is null), the reviewer's original comment text, and the reconciled intent from Step 3. Questions skip Step 5 and feed into Step 10. Change requests feed into Step 5.
Step 5: Run /evaluate-findings Skill
Run the /evaluate-findings skill on the change requests from Step 4 to triage each one. Questions are not evaluated here.
Step 6: Resolve Ambiguities
Collect items assigned an Escalate verdict by /evaluate-findings. If there are none, skip to Step 7.
Output all escalated items as a numbered list. For each item, show:
- The reviewer's original comment
- The competing interpretations or the reason for escalation
- The file and line reference
Then use AskUserQuestion to ask how to handle them. Per item, the options are:
- Direct answer: "Do X" — assign an Accept verdict with the user's clarified intent, and pass it to
/apply-findings - Ask the reviewer: "Ask them Y" — queue a clarification question to be drafted in Step 11
- Skip: Remove from processing
Step 7: Choose Implementation Path
Present a summary of accepted findings: count by complexity (mechanical fixes vs. architectural or design changes). Then use AskUserQuestion to let the user choose:
- Full — Run
/turboplanfor drafting, refinement, approval, implementation, and finalize - Lightweight — Apply directly via
/apply-findings, then/finalize
Suggest Full when findings include complex or architectural changes. Suggest Lightweight when all findings are mechanical fixes.
If there are no accepted findings to implement, skip to Step 10.
Step 8: Implement and Finalize
Full path:
Run the /turboplan skill with the accepted findings (including any items reclassified in Step 6) as the task description. Turboplan handles drafting, refinement, user confirmation, implementation, and finalize. The commit SHA from finalize is needed for reply messages.
Lightweight path:
- Run the
/apply-findingsskill on the evaluated results, including any items reclassified in Step 6. - If changes were made, run the
/finalizeskill. The commit SHA from finalize is needed for reply messages. - If no changes were made, skip to Step 10.
Step 9: Verify Fixes
For each finding that was fixed in Step 8, verify the fix actually addresses the reviewer's concern:
- Read the current code at the relevant file and location
- Compare against the reviewer's comment and
diffHunk(the code the reviewer was looking at) - Confirm the specific concern is resolved
If the fix did not address the concern (wrong location, incomplete change, or the issue is still present), downgrade it to skipped. Draft a skip reply in Step 11 with the reason: the attempted fix did not resolve the reviewer's concern, with a brief explanation of what remains.
Step 10: Run /recall-reasoning Skill for Questions
For each question thread from Step 4, run the /recall-reasoning skill to pull the implementation rationale from the original Claude Code session. Pass the thread's file path and line (use originalLine when line is null).
Record the returned reasoning alongside each question for use in Step 11. If /recall-reasoning returns no transcript for a thread, note that and plan to fall back on reading the commit diff and surrounding code when drafting the reply.
If there are no question threads, skip this step.
Step 11: Draft Replies
Run /github-voice to load writing style rules before composing replies. Keep replies to one or two sentences. Avoid bullet-point reasoning or bolded labels.
Review body comments (top-level review comments with non-empty body) cannot be replied to via thread replies — they are not threads. Do not attempt to reply to them. Instead, report them in the summary (Step 13) with their triage status from Step 2.
For each processed inline thread, draft a reply.
Reply format for fixes:
Fixed in <commit-sha>.
Only add a brief description after the SHA if the fix meaningfully diverges from what the reviewer suggested. Otherwise, the commit SHA alone is enough.
Reply format for skips: Just state the reasoning for not changing it.
Reply format for answers to questions: Explain the reasoning directly. Draw from the /recall-reasoning output when available. When the recalled transcript already says it well, quote or paraphrase the implementer's own words. When no transcript was found, explain based on the current code. Do not cite the transcript or mention Claude — the reply should read as the implementer's own explanation.
Reply format for clarifications (queued in Step 6): Draft the clarification question as directed by the user.
Output all drafted replies as text, grouped by file, showing the reviewer's comment and the drafted reply for each thread. Then use AskUserQuestion to confirm before posting.
Step 12: Post Replies
After confirmation, check whether each thread was resolved between fetching and posting (e.g., CodeRabbit auto-resolves its own threads after a push). Skip resolved threads. Post each confirmed reply using:
gh api graphql -f query='
mutation($threadId: ID!, $body: String!) {
addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $threadId, body: $body}) {
comment { id }
}
}' -f threadId="THREAD_ID" -f body="REPLY_BODY"
Step 13: Summary
After processing all threads, present a summary table:
- Total unresolved inline threads found
- Number fixed (change requests with accepted verdicts)
- Number skipped (false positives or disproportionate changes)
- Number of questions answered (split into: answered from recalled transcript, answered from current code)
- Number of clarification questions posted
- Review body comments already addressed by commits (list author, state, one-line summary, and the addressing commit SHA)
- Review body comments requiring manual attention (list author, state, and a one-line summary of each)
- List of files modified
Rules
- Never resolve or dismiss a review thread. Only reply. Let the reviewer resolve.
- Process comments in file order to minimize context switching.
- Stale references and default-to-skip policy are handled by the
/evaluate-findingsskill. - When a thread has multiple comments (discussion), read the full thread before deciding.
- The first comment in each thread is the original review comment; subsequent comments are replies.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
review-api-usage
Check API, library, and framework usage in code against official documentation and installed skill knowledge. Flags deprecated APIs, incorrect method signatures, wrong parameter types, version-incompatible patterns, and best-practice violations. Use when the user asks to "review API usage", "check API usage", "verify against docs", "check library usage", "validate API calls", "check against documentation", or "check for deprecated APIs".
consult-codex
Multi-turn consultation with Codex CLI for second opinions, brainstorming, or collaborative problem-solving. Use when the user asks to "consult codex", "ask codex", "get codex's opinion", "brainstorm with codex", "discuss with codex", or "chat with codex".
review-tooling
Detect what dev tooling infrastructure a project has and flag gaps across linters, formatters, pre-commit hooks, test runners, and CI/CD pipelines. Returns structured findings without applying changes. Use when the user asks to "review tooling", "check project tooling", "what tooling is missing", "review dev infrastructure", or "tooling audit".
create-changelog
Create a CHANGELOG.md following keepachangelog.com conventions with version history backfilled from GitHub releases or git tags. Use when the user asks to "create a changelog", "add a changelog", "initialize changelog", "start a changelog", "set up changelog", "generate changelog", or "backfill changelog".
update-changelog
Update the Unreleased section of CHANGELOG.md based on current changes. No-op if CHANGELOG.md does not exist. Use when the user asks to "update changelog", "add to changelog", "update the changelog", "changelog entry", "add changelog entry", or "log this change".
stage
Stage implementation changes for commit with precise file selection. Use when the user asks to "stage changes", "stage files", "add files to staging", or "prepare changes for commit".
Didn't find tool you were looking for?