From devtools
Use when the user provides a GitHub PR number, PR URL, or owner/repo#num and asks to review, address, process, respond to, or resolve PR review comments and reviewer feedback before merging.
How this skill is triggered — by the user, by Claude, or both
Slash command
/devtools:pr-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Systematically process every review comment on a GitHub PR: classify each as **valid** (needs a fix) or **invalid** (needs a justified reply), present a fix plan, get user approval, apply fixes one-by-one, push, post a summary comment, and resolve threads.
Systematically process every review comment on a GitHub PR: classify each as valid (needs a fix) or invalid (needs a justified reply), present a fix plan, get user approval, apply fixes one-by-one, push, post a summary comment, and resolve threads.
Core principle: Every comment gets a deliberate response: a code fix or a written justification. Nothing is silently ignored.
/devtools:pr-review <number-or-url>Do NOT use when:
gh pr view directly)A PR identifier in one of these forms:
123 (working directory must be the correct repo)https://github.com/owner/repo/pull/123owner/repo#123If missing, stop and ask before doing anything else.
gh auth status. If it fails, stop and ask the user to run gh auth login.gh pr view <num> --json title,body,headRefName,baseRefName,state,author,files,isDraftgh pr diff <num>gh api "repos/{owner}/{repo}/pulls/{num}/comments" --paginategh api "repos/{owner}/{repo}/pulls/{num}/reviews" --paginategh api "repos/{owner}/{repo}/issues/{num}/comments" --paginategh api graphql -f query='query($owner:String!,$repo:String!,$num:Int!){
repository(owner:$owner,name:$repo){
pullRequest(number:$num){
reviewThreads(first:100){
nodes{ id isResolved isOutdated comments(first:50){
nodes{ id databaseId body path line author{login} }
}}
}
}
}
}' -F owner=OWNER -F repo=REPO -F num=NUM
For each unresolved comment, with the file open at the cited line:
Track each item with: thread ID, comment ID (databaseId for replies), author, file:line, original text, classification, planned action.
Output a single comprehensive report:
Then:
Do NOT modify code or post anything before approval.
After approval, process items in order:
gh api "repos/{owner}/{repo}/pulls/{num}/comments" \
-f body="<reply text>" -F in_reply_to=<comment_databaseId>
If a fix fails or surfaces new information, stop, report back, and ask before continuing.
fix: address PR review comments). Do not add AI co-author trailers unless the repo convention requires it.gh pr comment <num> --body-file report.md
gh api graphql -f query='mutation($id:ID!){
resolveReviewThread(input:{threadId:$id}){ thread { id isResolved } }
}' -F id=<threadId>
Short, evidence-based, non-defensive:
Thanks for taking a look. After re-checking <file:line>, this is actually <observation>:
<specific reason it is not an issue / is intentional / is out of scope>.
Happy to revisit if I am missing context.
## PR Review Response
Addressed **N** review comments.
### Fixed (X)
- @reviewer - `file.ts:42` - <one-line summary> (<commit-sha>)
### Replied (Y)
- @reviewer - `file.ts:88` - <why we disagreed, one line>
### Deferred (Z)
- @reviewer - `file.ts:120` - <reason; tracked in #issue>
All addressed threads have been resolved.
| Mistake | Fix |
|---|---|
| Editing code before user approved the plan | Phase 3 is a hard gate. No edits until "go". |
| Claiming tests pass without running them | Run the command. Cite the output. |
| Resolving threads before the fix is pushed | Resolve only after git push succeeds. |
| Dismissive replies to invalid comments | Cite file/line evidence. Polite, specific, brief. |
| Bundling unrelated fixes into one commit | One commit scope = the review. No drive-by changes. |
| Using REST to find thread IDs | REST /comments has no thread ID. Use GraphQL reviewThreads. |
| Silently skipping a comment | Every unresolved, non-author comment must be classified. |
| Replying to outdated/obsolete threads | Mark isOutdated ones as skipped with a note in the report. |
resolveReviewThread before the fix is pushed# Resolve owner/repo from a URL: parse https://github.com/OWNER/REPO/pull/NUM
# Auth
gh auth status
# PR + diff
gh pr view <num> --json title,headRefName,baseRefName,author,files,isDraft
gh pr diff <num>
# Comments
gh api "repos/{owner}/{repo}/pulls/{num}/comments" --paginate
gh api "repos/{owner}/{repo}/pulls/{num}/reviews" --paginate
gh api "repos/{owner}/{repo}/issues/{num}/comments" --paginate
# Reply to an inline comment (threaded)
gh api "repos/{owner}/{repo}/pulls/{num}/comments" \
-f body="..." -F in_reply_to=<comment_databaseId>
# Post the final summary
gh pr comment <num> --body-file report.md
# Resolve a thread (GraphQL; needs thread ID from reviewThreads query)
gh api graphql -f query='mutation($id:ID!){
resolveReviewThread(input:{threadId:$id}){ thread { id isResolved } }
}' -F id=<threadId>
npx claudepluginhub resalapps/resal-marketplace --plugin devtoolsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.