posit-dev/pr-threads-address
Address PR review feedback by systematically working through every unresolved PR review thread on the current branch's PR - analyze each comment, make the requested code changes (with tests where useful), commit, and optionally reply and resolve.
npx skills add https://github.com/posit-dev/skills --skill pr-threads-address
Before using this command, check if the gh pr-review extension is installed:
gh extension list | grep -q pr-review || gh extension install agynio/gh-pr-review
Every gh pr-review subcommand requires both --pr <number> and --repo <owner/repo> — do not omit either. Look the values up once at the start of the workflow and substitute the literal numbers and slugs into every later command.
Get the PR number for the current branch:
gh pr view --json number -q .number
Get the repository slug:
gh repo view --json nameWithOwner -q .nameWithOwner
Then pass the resulting values directly — e.g. --pr 42 --repo posit-dev/skills — on every subsequent gh pr-review call in this workflow (review view, comments reply, threads resolve, etc.).
Display all reviews, inline comments, and replies for a pull request:
gh pr-review review view --pr <number> --repo <owner/repo>
Common filters:
--reviewer <login> — Filter by specific reviewer--states <list> — Comma-separated review states (APPROVED, CHANGES_REQUESTED, COMMENTED, DISMISSED)--unresolved — Show only unresolved threads--tail <n> — Show only the last n replies per thread--include-comment-node-id — Include GraphQL node IDs for repliesgh pr-review comments reply --thread-id <PRRT_...> --body "<reply-text>" --repo <owner/repo> --pr <number>
For multi-line replies, pass --body "$(cat <<'EOF' ... EOF\n)" heredoc syntax.
gh pr-review threads resolve --thread-id <PRRT_...> --pr <number> --repo <owner/repo>
Thread IDs (format PRRT_...) come from review view --include-comment-node-id.
Take posit-dev/pr-threads-address from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.