| name | github-pr |
| description | This skill should be used when working with GitHub pull requests, reviewing PRs, creating PRs, checking PR status, viewing PR comments, analyzing CI failures, or using gh CLI commands. Emphasizes token-efficient patterns using filters, file buffers, and targeted queries. |
GitHub Pull Request Operations
Use gh CLI for all GitHub PR operations. Minimize context usage through targeted queries, file buffers for large outputs, and grep-friendly formats.
Core Principles
- Filter at source - Use
--json with specific fields, not full responses
- Buffer large outputs - Write to
/tmp/ then grep, don't load into context
- Batch queries - One
gh api call vs multiple gh pr calls
- Structured output - Use
--json + --jq for precise extraction
Essential Patterns
Viewing PR Information
gh pr view <number> --json title,state,author,additions,deletions,changedFiles
gh pr view <number> --json title,state,reviewDecision,reviews --jq '{
title: .title,
state: .state,
decision: .reviewDecision,
reviewers: [.reviews[].author.login] | unique
}'
gh pr view <number> --json body --jq '.body'
Listing PRs (Filtered)
gh pr list --author @me --state open --json number,title,updatedAt
gh pr list --search "review-requested:@me" --json number,title,author
gh pr list --search "updated:>$(date -v-7d +%Y-%m-%d)" --limit 10
PR Diff (Buffer Pattern)
gh pr diff <number> > /tmp/pr-diff.patch
grep -n "TODO\|FIXME\|XXX" /tmp/pr-diff.patch
gh pr diff <number> -- path/to/file.ts
gh pr diff <number> --stat
PR Files Changed
gh pr view <number> --json files --jq '.files[].path'
gh pr view <number> --json files --jq '.files[] | "\(.path)\t+\(.additions)\t-\(.deletions)"'
gh pr view <number> --json files --jq '[.files[].path | select(endswith(".ts"))]'
Comments and Reviews
gh pr view <number> --comments > /tmp/pr-comments.txt
grep -i "bug\|issue\|concern" /tmp/pr-comments.txt
gh api repos/{owner}/{repo}/pulls/<number>/comments \
--jq '.[] | "\(.path):\(.line) - \(.body | split("\n")[0])"'
gh pr view <number> --json reviews --jq '.reviews[-3:] | .[] | "\(.author.login): \(.state)"'
CI/Check Status
gh pr checks <number>
gh pr checks <number> --json name,state,conclusion \
--jq '.[] | select(.conclusion == "failure")'
gh run view <run-id> --log > /tmp/ci-log.txt
grep -A5 "error\|failed\|Error" /tmp/ci-log.txt
Creating PRs
Basic PR Creation
gh pr create --title "feat: add feature" --body "Description here"
cat > /tmp/pr-body.md << 'EOF'
Brief description
- Change 1
- Change 2
- [ ] Tests pass
EOF
gh pr create --title "feat: add feature" --body-file /tmp/pr-body.md
PR Targeting
gh pr create --base develop --title "feat: feature"
gh pr create --draft --title "WIP: feature"
gh pr create --title "feat: feature" --reviewer user1,user2
Updating PRs
gh pr edit <number> --title "new title"
gh pr edit <number> --body-file /tmp/updated-body.md
gh pr edit <number> --add-reviewer user1,user2
gh pr edit <number> --add-label "needs-review"
gh pr ready <number>
gh api for Advanced Queries
When to Use gh api
- Complex queries needing GraphQL
- Batch operations
- Data not exposed by
gh pr
- Custom filtering
Common API Patterns
gh api repos/{owner}/{repo}/issues/<number>/timeline \
--jq '.[] | select(.event) | "\(.event): \(.actor.login // "system")"'
gh api repos/{owner}/{repo}/pulls/<number> --jq '.mergeable_state'
gh api graphql -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 50) {
nodes {
isResolved
path
line
comments(first: 1) {
nodes { body author { login } }
}
}
}
}
}
}
' -f owner=OWNER -f repo=REPO -F pr=NUMBER \
--jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)'
Token Optimization Patterns
Pattern 1: File Buffer + Grep
gh pr diff 123 > /tmp/diff.patch
grep -B2 -A2 "functionName" /tmp/diff.patch
Pattern 2: Precise JSON Fields
gh pr view 123
gh pr view 123 --json title,state,mergeable
Pattern 3: jq Filtering
gh pr view 123 --json reviews --jq '
.reviews
| group_by(.author.login)
| map({user: .[0].author.login, latest: .[-1].state})
'
Pattern 4: Count Instead of List
gh pr list --state open --json number --jq 'length'
gh pr view 123 --json comments --jq '.comments | length'
Common Workflows
Review a PR
gh pr view <number> --json title,body,author,changedFiles,additions,deletions
gh pr view <number> --json files --jq '.files[].path'
gh pr diff <number> > /tmp/review.patch
gh pr checks <number>
gh pr review <number> --approve --body "LGTM"
gh pr review <number> --request-changes --body "See comments"
Debug CI Failure
gh pr checks <number> --json name,conclusion,detailsUrl \
--jq '.[] | select(.conclusion == "failure")'
gh run list --branch <pr-branch> --limit 5
gh run view <run-id> --log > /tmp/ci.log
grep -n "error\|Error\|FAILED" /tmp/ci.log | head -50
Respond to Review Comments
gh api graphql -f query='...'
gh pr diff <number> -- path/to/file.ts | head -100
Quick Reference
| Task | Command |
|---|
| View PR summary | gh pr view N --json title,state,author |
| List my PRs | gh pr list --author @me |
| PR diff to file | gh pr diff N > /tmp/diff.patch |
| Files changed | gh pr view N --json files --jq '.files[].path' |
| Check status | gh pr checks N |
| Create PR | gh pr create --title "..." --body-file /tmp/body.md |
| Approve | gh pr review N --approve |
| Merge | gh pr merge N --squash |
Progressive Context
- For
gh api GraphQL queries: see references/api-patterns.md
- For PR analysis scripts: see
scripts/ directory