Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Watch a pull request or review cycle until it is ready to merge. Use when asked to babysit, monitor, or keep checking PR comments, reviews, and CI until all actionable issues are resolved.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-20 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-06 | ✓→✗ | ▼ Worse | 53% | 0% |
| case-16 | ✓→✗ | ▼ Worse | -19% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 9% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 12% | 0% |
Stay with the PR until it is actually clean. Do not stop after one check pass if comments or review threads are still unresolved.
Use gh pr view for the coarse status:
bashgh pr view <number> --json \ number,state,isDraft,mergeable,mergeStateStatus,reviewDecision,headRefOid,statusCheckRollup,url
Resolve the repository owner/name before using GraphQL:
bashrepo_json=$(gh repo view --json owner,name) owner=$(jq -r '.owner.login // .owner.name' <<<"$repo_json") repo=$(jq -r '.name' <<<"$repo_json")
Use GraphQL for unresolved review threads. Include pageInfo; omit cursor on the first page, then pass the previous endCursor with -f cursor="$cursor" while hasNextPage is true.
bashgh api graphql \ -f query='query($owner:String!,$repo:String!,$number:Int!,$cursor:String){repository(owner:$owner,name:$repo){pullRequest(number:$number){reviewThreads(first:100,after:$cursor){pageInfo{hasNextPage endCursor}nodes{id,isResolved,isOutdated,path,line,comments(last:1){nodes{author{login},body,createdAt,url}}}}}}}' \ -f owner="$owner" -f repo="$repo" -F number=<number>
Use this loop when a PR may have many review threads:
bashthread_query='query($owner:String!,$repo:String!,$number:Int!,$cursor:String){repository(owner:$owner,name:$repo){pullRequest(number:$number){reviewThreads(first:100,after:$cursor){pageInfo{hasNextPage endCursor}nodes{id,isResolved,isOutdated,path,line,comments(last:1){nodes{author{login},body,createdAt,url}}}}}}}' cursor_args=() while :; do page=$(gh api graphql -f query="$thread_query" -f owner="$owner" -f repo="$repo" -F number=<number> "${cursor_args[@]}") printf '%s\n' "$page" | jq -r '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved==false) | [.id,.path,(.line//""),(.isOutdated|tostring),(.comments.nodes[-1].author.login//""),(.comments.nodes[-1].body|gsub("\n";" ")|.[0:240])] | @tsv' jq -e '.data.repository.pullRequest.reviewThreads.pageInfo.hasNextPage' >/dev/null <<<"$page" || break cursor=$(jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.endCursor' <<<"$page") cursor_args=(-f cursor="$cursor") done
Filter unresolved threads with jq:
bashjq -r '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved==false) | [.id,.path,(.line//""),(.isOutdated|tostring),(.comments.nodes[-1].author.login//""),(.comments.nodes[-1].body|gsub("\n";" ")|.[0:240])] | @tsv'
Resolve a stale thread only when the fix is verified:
bashgh api graphql \ -f query='mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id,isResolved}}}' \ -f threadId=<thread-id>
git status.Other measured skills in the registry, with their headline benchmark lift.