Skip to main content

Textual TUI that lists GitHub PRs awaiting your review and hands them off to Claude Code.

Project description

cc-pr-reviewer

PyPI Downloads uv Ruff

A small Textual TUI that lists every open GitHub PR where you are a requested reviewer, and hands the selected PR off to a coding-agent CLI of your choice — Claude Code, OpenAI Codex CLI, or Google Gemini CLI — to perform the review. Claude Code uses the PR Review Toolkit plugin; Codex and Gemini load the same six review criteria as native Skills that ship with this package (cc_pr_reviewer/skills/<name>/SKILL.md), materialised into the checked-out PR workspace under .agents/skills/ for the duration of each review.

cc-pr-reviewer screenshot

What it does

  • gh search prs --review-requested=@me --state=open fetches your review queue across every repo you have access to.
  • Displays them in a scrollable table (repo, number, title, author, age, draft flag).
  • Keyboard-driven: pick a PR and press Enter to open a confirmation modal; on Enter/y it clones the repo (if needed), checks out the PR branch via gh pr checkout, and launches the selected coding-agent CLI inside that working tree with a prompt that drives a six-dimension PR review (code-quality, silent-failure hunting, type design, test coverage, comment quality, simplification opportunities). See Keybindings for the full list.
  • Three CLI backends, switchable from the TUI. Press c to cycle the global default (claude → codex → gemini → claude, persisted across sessions), or Ctrl+L inside the confirm modal to override for a single launch. Default is Claude Code.

Prerequisites

All prerequisites are validated at startup via check_prereqs(); the TUI refuses to launch until they're satisfied.

  1. GitHub CLI — installed and logged in.

    gh auth login
    
  2. At least one coding-agent CLI on your PATH:

    Startup only requires one of the three to be installed. If the CLI you previously persisted (via c) isn't on this machine's PATH, the TUI transparently falls back to the next available one for the session and shows a warning toast. Switch the global default any time with c.

  3. git — on your PATH (used for git fetch on repeat reviews).

Install

As a global CLI (recommended)

Install from PyPI with uv or pipx:

uv tool install cc-pr-reviewer
# or
pipx install cc-pr-reviewer

Then run it from anywhere:

cc-pr-reviewer

From source (for development)

uv sync
uv run cc-pr-reviewer

Configuration

Env var Default Meaning
GH_PR_WORKSPACE ~/gh-pr-workspace Where repos are cloned for local checkout.

Clones are organised as $GH_PR_WORKSPACE/<owner>/<repo>, so a second review of the same repo reuses the existing clone and just git fetches before checking out the PR.

Keybindings

Key Action
/ Move through PRs
Enter Confirm, then clone + checkout + launch the selected CLI
d View full diff
o Open PR in browser
m Toggle inclusion of PRs you authored
f Filter the list by repo (picker)
g Cycle grouping: none → repo → author → none
s Toggle sort by most recently updated
c Cycle CLI: claude → codex → gemini → claude (persisted)
r / F5 Refresh the list
u Upgrade cc-pr-reviewer via uv tool upgrade
q Quit

The c key highlights green in the footer whenever the active CLI is non-default (i.e. anything other than Claude Code).

Inside the confirmation modal: Enter / Ctrl+Y to proceed, Esc / Ctrl+N to cancel, Ctrl+T to toggle post-inline (instruct the CLI to publish the findings as inline PR review comments via gh api, grouped under one review), Ctrl+L to cycle the CLI for this launch only (without changing the global default). The post-inline toggle defaults to on each time the modal opens; the CLI defaults to whatever the global c setting currently is. The chosen values are printed before the CLI launches.

Inside the filter modal: arrow keys to move, Enter to apply the highlighted repo (or pick (any repo — clear filter) to remove the filter), r to re-fetch the unfiltered PR list and pick up repos that appeared after boot, Esc to cancel. The repo list comes from the most recent unfiltered fetch — applying a filter doesn't shrink the picker. The active filter is persisted in $GH_PR_WORKSPACE/.review_state.db and restored on the next launch.

How the launch works

When you press Enter on a row, a confirmation modal shows the target PR (repo#N + title) plus the current CLI selection. On Enter/y the TUI suspends itself and runs, in order:

gh repo clone <owner>/<repo>                      # only if not already cloned
git fetch --all --prune                           # otherwise
gh pr checkout <N> --force
<selected-cli> <auto-approve flags> "<review prompt>"

The exact CLI invocation depends on which backend is active:

CLI Command
Claude claude --permission-mode acceptEdits "<prompt>"
Codex codex --ask-for-approval never --sandbox workspace-write -c sandbox_workspace_write.network_access=true "<prompt>"
Gemini gemini --approval-mode auto_edit "<prompt>"

All three are launched in modes that auto-accept file edits inside the cloned PR workspace, mirroring Claude's acceptEdits posture as closely as each CLI permits. For Codex, sandbox_workspace_write blocks network by default; the -c sandbox_workspace_write.network_access=true override restores it so the post-inline review path can reach GitHub via gh api.

The review prompt drives the same six review dimensions across all three CLIs:

  • Claude Code delegates to the PR Review Toolkit plugin's six sub-agents (Comment Analyzer, PR Test Analyzer, Silent Failure Hunter, Type Design Analyzer, Code Reviewer, Code Simplifier).
  • Codex and Gemini load the same six review criteria as native Skills. The bundled SKILL.md files (cc_pr_reviewer/skills/<name>/SKILL.md) are an adapted fork of the upstream toolkit's agent prompts with Codex/Gemini Skills frontmatter prepended. At launch they're copied into <workspace>/.agents/skills/<name>/SKILL.md (the cross-tool interop path both CLIs are documented to scan at session start — refs: Codex Skills, Gemini Skills) and removed on exit. Per those docs, only metadata is loaded eagerly — full instructions are pulled in on activation.

If the modal's post-inline toggle (Ctrl+T) is on, the prompt is extended to ask the CLI to publish each finding as an inline review comment via a single POST /repos/{owner}/{repo}/pulls/{n}/reviews call through gh api, so they land grouped under one review. On a re-review of someone else's PR where only NIT-level findings remain, the CLI is also asked to resolve any of its own previously-posted threads that the new code has addressed before submitting the APPROVE.

When you exit the CLI, press Enter and the TUI returns.

Keeping the bundled review prompts in sync with upstream

The bundled cc_pr_reviewer/skills/<name>/SKILL.md files are a static fork of the PR Review Toolkit plugin's agent prompts (with Codex/Gemini Skills frontmatter prepended). To check for upstream changes:

uv run python scripts/sync_pr_review_agents.py --update-plugin

This runs claude plugin update pr-review-toolkit@claude-plugins-official first, then diffs the current upstream against a committed baseline snapshot in scripts/upstream_baseline/. Exit code is 0 if nothing changed upstream, 1 if action is needed. After triaging upstream changes into the bundled files, run --save-baseline to lock in the new upstream state. See the script's --help for additional flags (--diff, --write).

Changelog

See CHANGELOG.md for the release history.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cc_pr_reviewer-0.14.0.tar.gz (188.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cc_pr_reviewer-0.14.0-py3-none-any.whl (76.3 kB view details)

Uploaded Python 3

File details

Details for the file cc_pr_reviewer-0.14.0.tar.gz.

File metadata

  • Download URL: cc_pr_reviewer-0.14.0.tar.gz
  • Upload date:
  • Size: 188.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cc_pr_reviewer-0.14.0.tar.gz
Algorithm Hash digest
SHA256 6e92182a4efb331e98f1d6f22ae6d6101d78fc0820e15ab721d9eb0d6c8939db
MD5 1157019083d1783562f6fbd77cedebe2
BLAKE2b-256 7a57d78aadb44a6741aec4454f2a882304015ae217364465f4f8d7fcf9da6adc

See more details on using hashes here.

File details

Details for the file cc_pr_reviewer-0.14.0-py3-none-any.whl.

File metadata

  • Download URL: cc_pr_reviewer-0.14.0-py3-none-any.whl
  • Upload date:
  • Size: 76.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cc_pr_reviewer-0.14.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8898b9f8e383cce49d559bb9494c439ca1be08dcc36737d800371f0228d74f09
MD5 3873ab05443be2dac9ba0630a7d4ea0c
BLAKE2b-256 fcc674e1cbe47f3675d0ee45caee2d543847e29c2d9aebfce53159c7485d81c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page