{"id":49621749,"url":"https://github.com/jasmedia/cc-pr-reviewer","last_synced_at":"2026-05-05T03:06:46.825Z","repository":{"id":352546035,"uuid":"1215526495","full_name":"jasmedia/cc-pr-reviewer","owner":"jasmedia","description":"Textual TUI that lists PRs awaiting your review and hands them off to Claude Code with the PR Review Toolkit plugin.","archived":false,"fork":false,"pushed_at":"2026-04-29T09:07:34.000Z","size":242,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T09:29:42.771Z","etag":null,"topics":["ai-assistant","anthropic","claude-code","cli","code-review","developer-tools","gh-cli","pr-reviews","pull-requests","tui"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jasmedia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-20T02:15:38.000Z","updated_at":"2026-04-29T09:07:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jasmedia/cc-pr-reviewer","commit_stats":null,"previous_names":["jasmedia/cc-pr-reviewer"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/jasmedia/cc-pr-reviewer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasmedia%2Fcc-pr-reviewer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasmedia%2Fcc-pr-reviewer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasmedia%2Fcc-pr-reviewer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasmedia%2Fcc-pr-reviewer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jasmedia","download_url":"https://codeload.github.com/jasmedia/cc-pr-reviewer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jasmedia%2Fcc-pr-reviewer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32633445,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"online","status_checked_at":"2026-05-05T02:00:06.033Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-assistant","anthropic","claude-code","cli","code-review","developer-tools","gh-cli","pr-reviews","pull-requests","tui"],"created_at":"2026-05-05T03:06:27.310Z","updated_at":"2026-05-05T03:06:46.816Z","avatar_url":"https://github.com/jasmedia.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cc-pr-reviewer\n\n[![PyPI Downloads](https://static.pepy.tech/badge/cc-pr-reviewer)](https://pepy.tech/projects/cc-pr-reviewer)\n[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\nA small Textual TUI that lists every open GitHub PR where you are a\nrequested reviewer, and hands the selected PR off to Claude Code with the\n[PR Review Toolkit](https://claude.com/plugins/pr-review-toolkit) plugin\ndriving the review.\n\n![cc-pr-reviewer screenshot](assets/cc-reviewer.png)\n\n## What it does\n\n- `gh search prs --review-requested=@me --state=open` fetches your review\n  queue across every repo you have access to.\n- Displays them in a scrollable table (repo, number, title, author, age,\n  draft flag).\n- Keyboard-driven: pick a PR and press **Enter** to open a confirmation\n  modal; on **Enter/y** it clones the repo (if needed), checks out the PR\n  branch via `gh pr checkout`, and launches `claude` inside that working\n  tree with a prompt that invokes the PR Review Toolkit agents. See\n  [Keybindings](#keybindings) for the full list.\n\n## Prerequisites\n\nAll prerequisites are validated at startup via `check_prereqs()`; the TUI\nrefuses to launch until they're satisfied.\n\n1. **GitHub CLI** — installed and logged in.\n   ```sh\n   gh auth login\n   ```\n2. **Claude Code** — the `claude` CLI must be on your `PATH`.\n3. **PR Review Toolkit plugin** — installed and enabled inside Claude Code\n   (detected via `claude plugin list --json`):\n   ```sh\n   claude plugin install pr-review-toolkit\n   ```\n   Details: \u003chttps://claude.com/plugins/pr-review-toolkit\u003e\n4. **git** — on your `PATH` (used for `git fetch` on repeat reviews).\n\n## Install\n\n### As a global CLI (recommended)\n\nInstall from PyPI with [uv](https://docs.astral.sh/uv/) or\n[pipx](https://pipx.pypa.io/):\n\n```sh\nuv tool install cc-pr-reviewer\n# or\npipx install cc-pr-reviewer\n```\n\nThen run it from anywhere:\n\n```sh\ncc-pr-reviewer\n```\n\n### From source (for development)\n\n```sh\nuv sync\nuv run cc-pr-reviewer\n# or\nuv run python cc_pr_reviewer.py\n```\n\n## Configuration\n\n| Env var            | Default               | Meaning                                    |\n| ------------------ | --------------------- | ------------------------------------------ |\n| `GH_PR_WORKSPACE`  | `~/gh-pr-workspace`   | Where repos are cloned for local checkout. |\n\nClones are organised as `$GH_PR_WORKSPACE/\u003cowner\u003e/\u003crepo\u003e`, so a second\nreview of the same repo reuses the existing clone and just `git fetch`es\nbefore checking out the PR.\n\n## Keybindings\n\n| Key           | Action                                                       |\n| ------------- | ------------------------------------------------------------ |\n| `↑` / `↓`     | Move through PRs                                             |\n| `Enter`       | Confirm, then clone + checkout + launch Claude Code review   |\n| `d`           | View full diff                                               |\n| `o`           | Open PR in browser                                           |\n| `m`           | Toggle inclusion of PRs you authored                         |\n| `f`           | Filter the list by repo (picker)                             |\n| `g`           | Cycle grouping: none → repo → author → none                  |\n| `s`           | Toggle sort by most recently updated                         |\n| `r` / `F5`    | Refresh the list                                             |\n| `u`           | Upgrade `cc-pr-reviewer` via `uv tool upgrade`               |\n| `q`           | Quit                                                         |\n\nInside the confirmation modal: `Enter` / `y` to proceed, `Esc` / `n` / `q`\nto cancel, `p` to toggle post-inline (instruct Claude to publish the\nfindings as inline PR review comments via `gh api`, grouped under one\nreview). The toggle defaults to on each time the modal opens; the chosen\nvalue is printed before Claude launches.\n\nInside the filter modal: arrow keys to move, `Enter` to apply the\nhighlighted repo (or pick **(any repo — clear filter)** to remove the\nfilter), `r` to re-fetch the unfiltered PR list and pick up repos that\nappeared after boot, `Esc` to cancel. The repo list comes from the most\nrecent unfiltered fetch — applying a filter doesn't shrink the picker.\nThe active filter is persisted in `$GH_PR_WORKSPACE/.review_state.db`\nand restored on the next launch.\n\n## How the Claude launch works\n\nWhen you press **Enter** on a row, a confirmation modal shows the target\nPR (`repo#N` + title). On **Enter/y** the TUI suspends itself and runs,\nin order:\n\n```sh\ngh repo clone \u003cowner\u003e/\u003crepo\u003e                      # only if not already cloned\ngit fetch --all --prune                           # otherwise\ngh pr checkout \u003cN\u003e --force\nclaude --permission-mode acceptEdits \"\u003creview prompt\u003e\"\n```\n\nThe review prompt asks the PR Review Toolkit to run its six sub-agents\n(Comment Analyzer, PR Test Analyzer, Silent Failure Hunter, Type Design\nAnalyzer, Code Reviewer, Code Simplifier). Because Claude Code starts in\nthe PR's working tree, it has full file-level context.\n\n`--permission-mode acceptEdits` is always passed so file-edit prompts\ndon't interrupt the review — the same mode you get with shift+tab\ninside a Claude session.\n\nIf the modal's **post-inline** checkbox (`p`) is on, the prompt is\nextended to ask Claude to publish each finding as an inline review\ncomment via a single `POST /repos/{owner}/{repo}/pulls/{n}/reviews` call\nthrough `gh api`, so they land grouped under one review. On a re-review\nof someone else's PR where only NIT-level findings remain, Claude is\nalso asked to resolve any of its own previously-posted threads that the\nnew code has addressed before submitting the APPROVE.\n\nWhen you `/exit` Claude, press Enter and the TUI returns.\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for the release history.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjasmedia%2Fcc-pr-reviewer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjasmedia%2Fcc-pr-reviewer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjasmedia%2Fcc-pr-reviewer/lists"}