name: gh-pr-code-review description: PR code review workflow: pull diff, two-pass findings, draft and prioritize comments, then optionally post via gh api. license: MIT
PR code review (gh)
This skill guides a repeatable pull request review workflow using the GitHub CLI.
It emphasizes two-pass review (to find more issues), drafting comments before posting, and posting only after explicit user confirmation.
Usage
Use this skill when the user asks you to review a pull request and leave actionable feedback.
Inputs you should accept:
- PR number, PR URL, or branch name accepted by
gh pr view/gh pr diff - Optional repo override via
-R owner/repoif not in a git checkout
Requirements
ghauthenticated (gh auth status)- Permission to comment on the PR
- Optional but useful:
jq
What it does
A code review in two passes, then a drafting and posting phase:
A) Pull down the PR diff and identify issues
B) Repeat the review, finding only new issues
C) Draft review comments but do not post yet
D) Prioritize comments by criticality:
critical: correctness/security/data loss/broken API/test failuresoptional: maintainability/performance/edge cases/docs/test gapstrivial: nits/style/micro-optimizations (do not show by default)
E) Show only critical and optional items to the user. Then, if (and only if) the user explicitly confirms, post:
- inline (line-level) review comments where anchoring is unambiguous
- a single summary timeline comment containing only critical + optional items
How it works
0) Gather PR context
- Identify the PR. Prefer a PR number or URL.
- Fetch PR metadata (including the head commit SHA):
gh pr view <PR> --json number,title,url,baseRefName,headRefName,headRefOid,files,additions,deletions
- Fetch the diff (the primary review artifact):
gh pr diff <PR> --color=never
Optional: check CI signal while reviewing:
gh pr checks <PR>
1) Stage A: first-pass review
Review the diff and record issues as structured items. For each issue capture:
severity:critical|optional|trivialpath: file path when applicableside:RIGHT(new code / additions / context) orLEFT(deletions)line: line number in the diff blob when you can anchor reliablybody: the draft comment text (short, actionable)
Focus this pass primarily on:
- correctness and logic errors
- security risks
- API breaks
- data loss / irreversible behavior
- missing or failing tests
2) Stage B: second-pass review (new issues only)
Re-review the same diff from scratch with a different lens:
- edge cases
- performance and algorithmic complexity
- naming, clarity, ergonomics
- documentation and user-facing behavior
- consistency with project conventions
Critical rule: do not repeat issues from stage A. Only append genuinely new issues.
3) Stage C: draft comments (do not post)
Convert each issue into a comment draft that is ready to paste/post:
- one idea per comment
- include why it matters and a concrete suggestion
- avoid bikeshedding; keep tone constructive
4) Stage D: prioritize
Assign each comment a criticality:
critical: must-fixoptional: should-fixtrivial: nice-to-fix
5) Stage E: show only critical + optional, then optionally post
- Show the user only critical + optional comments.
- Ask for explicit confirmation before posting:
"Post these to the PR now? (yes/no)"
- If user says yes:
- Post inline comments for items with reliable
path+line+side. - Post one summary timeline comment that includes all critical + optional items.
- Do not post trivial items.
Posting comments with gh
Summary timeline comment (PR is an issue)
Use the Issues API to post one summary comment:
gh api -X POST "repos/{owner}/{repo}/issues/<PR_NUMBER>/comments" \
-f body="<summary markdown>"
Endpoint reference: POST /repos/{owner}/{repo}/issues/{issue_number}/comments.
Inline (line-level) review comments
Use the Pull Request Review Comments API:
SHA="$(gh pr view <PR> --json headRefOid -q .headRefOid)"
gh api -X POST "repos/{owner}/{repo}/pulls/<PR_NUMBER>/comments" \
-f body="<comment markdown>" \
-f commit_id="$SHA" \
-f path="path/to/file.py" \
-F line=42 \
-f side=RIGHT
Endpoint reference: POST /repos/{owner}/{repo}/pulls/{pull_number}/comments.
Mapping a unified diff to (path, line, side)
Inline comments require an exact file path, a line number, and a side.
Use this deterministic approach for unified diffs:
Each hunk header looks like
@@ -old_start,old_count +new_start,new_count @@.Initialize counters:
old_line = old_start,new_line = new_start.Walk each subsequent hunk line:
- If the line starts with
' '(context): increment bothold_lineandnew_line. - If the line starts with
'+'(addition): incrementnew_lineonly. - If the line starts with
'-'(deletion): incrementold_lineonly.
- If the line starts with
To comment on the new code, use
side=RIGHTand setline=new_line.To comment on a deletion, use
side=LEFTand setline=old_line.
If you cannot reliably determine line/side (for example, complex hunks or
uncertainty), do not post an inline comment. Include the item only in the
summary timeline comment.