Project-agnostic code review for Claude Code. One slash command runs deterministic gates, ten parallel review agents, and an adversarial verification pass.
FAQ
review-all is a Claude Code plugin with 1 hand-picked skill for development work, indexed on Flowy. Install it with the command on its page. It includes review-all. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add ncoevoet/claude-review-all> /plugin install review-all@ncoevoet-review-all
Repo: ncoevoet/claude-review-all
Project-agnostic code review for Claude Code. One slash command runs deterministic gates, ten parallel review agents, and an adversarial verification pass. Every finding cites file:line and is independently re-checked before the report β false positives stay out.

One verdict line up top, automated gate results, then findings by severity β Critical/Important carry full anatomy (impact Β· suggested fix Β· evidence), Debt/Suggested collapse to one line each. Every finding cites file:line and is independently re-verified before it reaches the report.
Inside Claude Code, add the marketplace and install the plugin:
/plugin marketplace add ncoevoet/claude-review-all
/plugin install review-all@ncoevoet-review-all
/review-all is available right away. Update later with /plugin update review-all@ncoevoet-review-all, remove with /plugin uninstall review-all@ncoevoet-review-all. CLI equivalents work too: claude plugin marketplace add ncoevoet/claude-review-all then claude plugin install review-all@ncoevoet-review-all. The plugin bundles the skill's scripts/ and resolves them relative to the skill, so it works wherever Claude Code installs it.
make install)For hacking on the skill itself, copy it straight into ~/.claude/skills/:
git clone https://github.com/ncoevoet/claude-review-all.git
cd claude-review-all
make install # copies skills/review-all/ β ~/.claude/skills/review-all/
make uninstall removes it. make review-self installs then reminds you to run /review-all in this repo. The skill works in Claude Code only β it depends on filesystem access and bash.
Inside Claude Code, run /review-all with any of these targets:
| Argument | Reviews |
|---|---|
| (empty) | Uncommitted changes if any, else current branch vs default branch, else last commit |
--staged | Only staged changes |
--unstaged | Only unstaged changes |
last commit | HEAD~1..HEAD |
last N commits | HEAD~N..HEAD |
vs <branch> | Current branch vs merge-base with <branch> |
<sha1>..<sha2> | A specific commit range |
PR #N or #N | A GitHub PR (requires gh) |
| file paths | Restrict review to those files |
--paths a/b,c/d | Filter resolved diff to these path prefixes |
--exclude x,y | Drop these path prefixes from the resolved diff |
gate / --ci | Headless gate mode β full review, then a machine verdict (gate-verdict.json + exit code) with no Phase 4 menu; composes with any target (gate --staged, gate PR #N) |
Examples:
/review-all
/review-all --staged
/review-all PR #123
/review-all last 3 commits
/review-all vs main
/review-all src/auth/login.ts src/auth/session.ts
/review-all PR #42 --exclude apps/legacy
/review-all gate --severity critical
| Step | What it does | Why |
|---|---|---|
| 0.0 Discovery (one call) | Runs scripts/discover.sh β composes the preflight tool probe (git/timeout/lsof/ss/gh/jq/curl/rsync/python3), toolchain detection, test-pattern detection, .codegraph/ check, and the rules-cache verdict in a SINGLE script call | Phase 0 costs one round trip regardless of cache state; later phases degrade instead of crashing on a missing tool |
| 0.1 Resolve target | Parses $ARGUMENTS against the table above | Single source of truth for "what diff is being reviewed" |
| 0.2 Load config + rules cache | Reads .claude/review-all.json; on cache HIT reuses the LLM-extracted global rules from .claude/cache/review-all-profile.json | Only the expensive LLM work (rules extraction) is cached β toolchain commands are re-probed fresh every run, so a package.json/pom.xml change can never be served stale |
| 0.3 + 0.4 Toolchain | Folded into 0.0 β detect-toolchain.sh emits {ecosystem, framework, test, lint, typecheck, build} | Project-agnostic gate commands; never assumes Angular vs Spring vs Rust |
| 0.5 Project rules | Reads root + nested CLAUDE.md files; the global half is skipped on cache HIT, module-level CLAUDE.md (changed dirs) always read fresh | "NEVER do X / ALWAYS do Y" steer the agents |
| 0.6 Test patterns | Folded into 0.0 β test-pattern-probe.sh infers location, suffix, framework | Spec Existence Check uses this; no hardcoded __tests__ assumption |
| 0.7 CodeGraph + MCP | Probes the live MCP tool registry (skipped entirely when 0.0 found no .codegraph/); records toolchain.codegraphTools keyed by capability | Tool names are not hardcoded β survives MCP-server renames |
| 0.8 Gather diff | Computes diff + per-file slice, applies --paths/--exclude, recent commit log | Filter is enforced before any agent sees the diff |
| 0.9 Output dirs + cache write | Creates .claude/cache, .claude/reports, ; on cache MISS writes the v2 rules profile |
The rules cache is keyed on a manifest of per-file content hashes over every repo CLAUDE.md (+ root CLAUDE.local.md), carries a schema version, and expires after 7 days β a branch switch, a CLAUDE.md edit, or a legacy cache file all force a fresh extraction. The report's gate table shows Profile cache: HIT / MISS(reason) so cache behavior is always visible (and eval-gradeable).
| Gate | Command | Why |
|---|---|---|
| Typecheck | timeout 120 <discovered> | Compilers find what review can't |
| Lint | timeout 120 <discovered> | Style + simple bugs at zero token cost |
| Tests | timeout 180 <scoped> | Smart scoping: tests that import changed files first, fallback to package, fallback to suite |
| Dev-server probe | scripts/dev-server-probe.sh | If dev server is up, skip the build gate β it's already running |
| Spec existence | per new file vs toolchain.testPattern | New public code without tests is automatically π΄ |
| Dependency check | per manifest diff | New deps / major bumps / removed deps surface explicitly |
Gate-confirmed findings are tagged VERIFIED and skip the verification phase. They are real, by definition.
If a UI file changed AND a dev-server port is open AND curl exists:
Catches dead routes and visual regressions that static review cannot.
Ten specialized agents review the (filtered) diff slice in parallel, each on its own concern:
standards Β· bugs+security Β· DRY Β· consistency Β· simplification Β· security-deep-dive Β· performance Β· test-quality Β· API-contract Β· a11y/i18n
Agents share _shared.md (severity tiers, 3-question gate, quotas, auto-drop rules, codegraph-tool resolution).
Big diffs are auto-chunked (chunkMaxFiles=40, chunkMaxBytes=200000) and re-merged by root_cause_key.
scripts/dedupe.py: groups by root_cause_key, annotates confirmed_by, applies global caps (SUGGESTED β€ 10, QUESTION β€ 8).verifierModel tier (default Haiku β cheap, fast, JSON-bound). Verifier stance is hostile to the finding, not the code: assume every finding is wrong until disproven. Its primary gate is a citation check β a behavior claim must be provable from a quoted source line, not inferred from naming; ungrounded claims are dropped (or kept only as a βͺ question). Top severity (π΄/π ) must be earned by that proof.β₯75 β main report, 50β74 β appendix, <50 β silently dropped.static / runtime / data / rendering, and must hold the proof its class demands. Reading a template proves what the template says; it proves nothing about what the server returned or what the user saw. A runtime/data/rendering claim backed only by a source read gets the unverified verdict β orthogonal to the score, so even a well-argued one lands there. It is neither asserted as fact nor dropped: it surfaces in the report's π¬ section naming the exact observation that would settle it, and it never blocks gate mode.scripts/state-sweep.py: applies fixed/stale/snoozed/wontfix transitions to .claude/review-all/state.json.Every spawned agent and every verifier must have returned with valid JSON, or be explicitly retried once, or be surfaced as β οΈ PARTIAL REVIEW in the report. No silent drops.
Opens with a one-line Verdict (N must-fix before merge, or β
none) for instant triage, then: Intent Β· Summary Β· Gate Results Β· π΄ Critical Β· π Important Β· π‘ Debt Β· π΅ Suggested Β· βͺ Questions Β· π¬ Unverified Β· Dependency Changes Β· Appendix Β· Scope footer (files reviewed / skipped). The Gate Results table carries a mandatory Provenance column β the exact command, its exit code, and when it ran β because a gate with no provenance may not be rendered PASS; that is what separates a build that happened from one that was assumed. π΄/π get full anatomy (failure-mode title, [severity Β· confidence] tag, one-sentence impact, suggested fix, β€8-line evidence); π‘/π΅/βͺ collapse to one line each. The Summary also reports a Merge-readiness % (a transparent resolved/total must-fix ratio that climbs as fixes apply) and change-type buckets (files Added/Modified/Deleted/Renamed). The last line is a machine-readable <!-- review-all-severity: {β¦} --> comment for CI parsing; the Phase 4 Export findings action additionally emits review-<ts>.json + review-<ts>.sarif for CI gates.
Heartbeat lines print at each phase boundary so the user sees forward motion on long runs.
Presenting the menu is a mandatory closing step β a finished report is the start of Phase 4, not the end of the turn (skipped only when every section says "None found." with no appendix). Ordering is a hard rule: the full report renders as text first, then the menu immediately after it with zero tool calls in between β so the menu can never appear before (or without) the report β and the menu's question line repeats the verdict summary in case the report has scrolled off-screen. The primary menu (AskUserQuestion, single-select, β€4 options) offers four modes:
I D #11, 1-7, 11).The two fix modes appear only when fixable findings exist; otherwise the menu leads with More actions⦠so the non-fix choices stay reachable (this is the fix that restored discoverability). After a clean apply-fixes (all post-fix gates pass), an auto-delta scoped review runs against the just-edited files and appends a ## Post-fix delta section.
/review-all gate (or any target with --ci) runs Phases 0β2.75 unchanged, then replaces the Phase 3 report and Phase 4 menu with a machine-readable verdict β no prose, no AskUserQuestion. It writes .claude/review-all/gate-verdict.json, prints the same JSON, and exits 0 (pass) / 1 (blocked) / 2 (malformed):
{ "pass": false, "severityFloor": "critical", "partial": false, "blockingCount": 1,
"blocking": [ {"id": "F3", "severity": "CRITICAL", "file": "src/x.ts", "line": 42, "title": "unguarded null deref"} ] }
A finding blocks only when its severity meets the floor (gateSeverityFloor, default critical β π΄ only; --severity important β π΄+π ). Only main-report findings (verdict keep, score β₯ 75) gate β the appendix never blocks, and neither does an unverified finding at any score, since nobody observed the behaviour it claims. Partial review coverage fails closed. This is what lets a CI step or an autonomous loop (e.g. the goal-loop plugin's oracle) consume review-all as a hard gate. See skills/review-all/references/phase-gate.md.
Every change to this skill is eval-driven β the same develop-tests loop Anthropic recommends for agent harnesses:
skills/review-all/evals/*.json) across Java, TypeScript, Python, SQL, Go, and Rust. Most are recall cases (a planted real bug the review must catch: races, leaks, injections, N+1s, broken contractsβ¦); a growing set are precision counter-cases β correct code that looks suspicious (an intentional except Exception boundary, a consistent lock discipline, a neutralized CSV export, a TODO comment) that must NOT become a finding. Two cases exercise gate mode end-to-end; two guard the profile cache (a poisoned legacy cache must MISS, a valid warm cache must HIT and still apply its rules).scripts/run-evals-headless.sh): each fixture is materialized into a throwaway git repo, /review-all runs there via claude -p, and a second LLM call grades the report against the case's rubric. Single runs flicker (LLM output is non-deterministic), so trustworthy baselines use REVIEW_ALL_EVAL_RUNS=3+ and compare pass-rates.scripts/eval-scorecard.py turns the runner's per-case RESULT/SCORE lines into a suite-level recall % / precision % / F1 / SNR scorecard, so an A/B diffs an aggregate precision number, not just per-case PASS rates (the SNR is an honest suite-derived proxy, not a CR-Bench per-comment metric).tests/run.sh): anonymization check (no real project names in fixtures), eval-schema validation, shellcheck on all scripts, Python unit tests, and a static doc-invariant gate for the Phase 4 menu (tests/check-phase4-menu.sh) β the menu can't be exercised headlessly, so its invariants are grepped from the published docs instead.See skills/review-all/evals/README.md for the schema, the full scenario list, and the iteration loop.
| Pros | Cons |
|---|---|
| No false positives by design β every finding survives adversarial re-read | Two-pass model (agents + verifier) costs more tokens than a single-shot review |
| Project-agnostic β discovers conventions from the repo, never assumes them | Discovery probes run on every review (one script call, ~1s); only the CLAUDE.md rules extraction is cached β by design, so toolchain data is never stale |
Filtered scope β --paths/--exclude and interactive workspace pruning honor the user's actual focus | The multi-workspace prompt only fires above 50 files / multiple roots β adjust expectations on small repos |
Deterministic ops in scripts β preflight, toolchain, test-pattern, dev-server, dedupe, state-sweep all live in scripts/. Reliability + token savings + auditable | Requires bash + Python 3 on the developer machine (default on macOS/Linux; fine in WSL) |
| Hostile verifier on Haiku β cheap, fast, no confirmation bias | Verifier mis-scoring on truly novel patterns can hide a real finding in the appendix β escape via verifierModel: "sonnet", or verifierVotes: 3 to majority-vote π΄/π across independent passes |
Lifecycle-aware β snoozed/wontfix/stale tracked in state.json; dismissed findings are fed back to the agents as a <previously_dismissed> digest so the team's own wontfix decisions aren't re-derived; recurring findings auto-escalate after 3 sightings | State file is per-repo; not shared across team members. Intentional β comments are the team-wide channel |
Plugin-free install β make install and you're done | Not portable to claude.ai uploads or the Claude API runtime (uses git/gh/bash/filesystem). Claude Code only |
Drop a .claude/review-all.json into any project to tune behavior. All keys optional; documented defaults apply when absent. See skills/review-all/references/config-keys.md for the full table with per-key rationales.
Common keys:
{
"devServerPorts": [4200, 5173, 3000],
"verifierModel": "haiku",
"verifierVotes": 1,
"extraAgents": [],
"skipAgents": []
}
verifierVotes defaults to 1 (single hostile pass). Set it to an odd N>1 (e.g. 3) to majority-vote the π΄/π findings across N independent verifier passes β a finding reaches the main report only if βN/2β verifiers keep it. Voting is scoped to top severity (π‘/π΅/βͺ stay single-pass) and adds verifier cost only when π΄/π survivors exist; see references/config-keys.md.
Two layers trim a report. Both are config-driven β set the relevant keys to 0 for a complete verified list. π΄ CRITICAL / π IMPORTANT are never capped at any layer.
| Key | Default | Caps |
|---|---|---|
quotaDebt | 5 | π‘ DEBT findings per agent (dropped pre-dedupe) |
quotaSuggested | 3 | π΅ SUGGESTED findings per agent |
quotaQuestion | 2 | βͺ QUESTION findings per agent |
suggestedGlobalCap | 10 | π΅ SUGGESTED findings globally, after dedupe |
questionGlobalCap | 8 | βͺ QUESTION findings globally, after dedupe |
To get every verified finding, zero out both layers for the tier β a per-agent quota drops findings before dedupe, so a global cap alone cannot recover them:
{
"quotaDebt": 0,
"quotaSuggested": 0,
"quotaQuestion": 0,
"suggestedGlobalCap": 0,
"questionGlobalCap": 0
}
/review-all init walks an interactive wizard that writes a populated config.
If a CodeGraph MCP server is wired into Claude Code and the project has a .codegraph/ directory, /review-all uses its tools for cross-file analysis (callers, callees, impact). Tool names are resolved at runtime, so any MCP namespace works. Without CodeGraph, the relevant agents fall back to grep / git grep.
git, bash, python3 (defaults on macOS/Linux)gh β for PR #N review mode, and optionally for the Phase 4 Post to GitHub PR (gh pr comment) and Create a ticket/issue (gh issue create) actions; both are write-scoped and confirmation-gated, and Create-ticket falls back to writing an issue-markdown file when gh/GitHub isn't presentclaude-review-all/
βββ skills/review-all/
β βββ SKILL.md # orchestrator entry point
β βββ agents/ # 10 persona files + _shared.md + verifier.md
β βββ references/ # per-phase rules, config schema, state-file lifecycle
β βββ evals/ # labeled scenarios + success criteria + grader rubrics
β βββ scripts/ # discover (one-call Phase 0), preflight, detect-toolchain,
β # dev-server-probe, test-pattern-probe, dedupe, state-sweep,
β # gate-verdict, export-findings, validate-evals,
β # materialize-fixture, run-evals, run-evals-headless,
β # eval-scorecard (recall/precision/SNR aggregate)
βββ tests/ # unit tests + check-anonymization.sh (gitignored blocklist)
βββ .github/workflows/ci.yml # shellcheck + test suite (incl. anonymization + eval-schema gates)
All plain Markdown / shell / Python β read, fork, extend.
bash tests/run.sh # anonymization gate + eval-schema validation + shellcheck-clean shell scripts + Python unit tests (no API key)
tests/run.sh runs four no-API gates: an anonymization gate (tests/check-anonymization.sh β fails if a real employer/product/ticket name leaks into published artifacts; the real blocklist is gitignored, a placeholder *.example.txt ships), eval-schema validation (scripts/validate-evals.py β every evals/*.json must have a non-empty grader.rubric, a materializable fixture, and an id matching its filename), the shell-script tests, and the Python unit tests. CI (.github/workflows/ci.yml) runs shellcheck + this suite on every push / PR. The eval suite under skills/review-all/evals/ is materialized into throwaway git repos and LLM-graded headlessly by scripts/run-evals-headless.sh (needs the claude CLI); see skills/review-all/evals/README.md.
MIT β see LICENSE.
.claude-plugin/
marketplace.json
plugin.json
.github/
workflows/
ci.yml
.gitignore
docs/
demo.png
LICENSE
Makefile
README.md
skills/
review-all/
agents/
_shared.md
01-standards.md
02-bugs-security.md
03-dry-smells.md
04-consistency-history.md
05-simplification.md
06-security-deep-dive.md
07-performance.md
08-test-quality.md
09-api-contract.md
10-a11y-i18n.md
verifier.md
evals/
01-small-diff-null-deref.json
02-large-refactor-no-noise.json
03-auth-crypto-change.json
04-empty-diff-noop.json
05-false-positive-resistance.json
06-preexisting-vuln-in-audit.json
07-dry-duplication.json
08-n-plus-one.json
09-missing-test-gate.json
10-api-contract-break.json
11-a11y-missing-label.json
12-i18n-hardcoded-string.json
13-race-lost-update.json
14-resource-leak.json
15-deleted-file-breaks-importer.json
16-unit-mismatch-seconds-ms.json
17-unguarded-request-body.json
18-swallowed-exception.json
19-generated-file-noise-floor.json
20-cache-invalidation-storm.json
21-subscription-leak.json
22-cache-on-failure.json
23-missing-await-floating-promise.json
24-off-by-one-pagination.json
25-inverted-access-guard.json
26-uninitialized-field.json
27-path-traversal.json
28-secret-in-log.json
29-memoize-key-collision.json
30-switch-missing-case.json
31-xss-innerhtml.json
32-open-redirect.json
33-unbounded-cache-growth.json
34-command-injection.json
35-regex-redos.json
36-insecure-randomness.json
37-ssrf.json
38-tls-verification-disabled.json
39-integer-precision-loss.json
40-missing-query-limit.json
41-async-foreach.json
42-concurrent-modification.json
43-jdbc-resource-leak.json
44-blank-secret-auth-bypass.json
45-non-thread-safe-map.json
46-broken-double-checked-locking.json
47-io-under-lock.json
48-swallowed-interrupt.json
49-locale-dependent-case.json
50-negative-count-underflow.json
51-exception-as-control-flow.json
52-non-atomic-id-collision.json
53-db-column-truncation.json
54-mutable-internal-exposure.json
55-thread-confined-no-race.json
56-format-string-specifier-mismatch.json
57-default-charset-encode-decode.json
58-lock-ordering-deadlock.json
59-signal-before-state.json
60-shallow-clone-shared-collection.json
61-comparator-vs-head-insert.json
62-python-import-shadowing.json
63-python-clock-domain-mismatch.json
64-python-bare-except-platform.json
65-python-dict-mutation-unlocked.json
66-sql-null-three-valued-logic.json
67-sql-fk-cascade-orphans.json
68-csv-formula-injection.json
69-stale-async-response.json
70-generation-counter-correct.json
71-monotonic-timeout-correct.json
72-go-nil-map-write.json
73-go-err-shadowing.json
74-go-goroutine-leak.json
75-go-defer-in-loop.json
76-rust-unwrap-panic.json
77-rust-blocking-in-async.json
78-rust-mutex-across-await.json
79-go-goroutine-cancellation-correct.json
80-rust-guard-dropped-before-await.json
81-boundary-catch-correct.json
82-sql-intentional-equality-correct.json
83-consistent-lock-discipline-correct.json
84-csv-formula-neutralized-correct.json
85-todo-not-defect.json
86-gate-blocking-critical.json
87-gate-debt-only-pass.json
88-stale-profile-cache.json
89-warm-profile-cache.json
README.md
references/
config-keys.md
init-wizard.md
phase-1.5-runtime.md
phase-2-agents.md
phase-2.5-verification.md
phase-3-report.md
phase-4-menu.md
phase-gate.md
state-file.md
scripts/
dedupe.py
detect-toolchain.sh
dev-server-probe.sh
discover.sh
eval-scorecard.py
export-findings.py
gate-verdict.py
materialize-fixture.py
preflight.sh
run-evals-headless.sh
run-evals.sh
state-sweep.py
test-pattern-probe.sh
validate-evals.py
SKILL.md
tests/
anonymization-blocklist.example.txt
check-anonymization.sh
check-claim-class.sh
check-dismissed-digest.sh
check-phase4-menu.sh
check-verifier-votes.sh
run.sh
test_dedupe.py
test_eval_scorecard.py
test_export_findings.py
test_gate_verdict.py
test_materialize.py
test_scripts.sh
test_state_sweep.py
test_validate_evals.pyΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic
.claude/review-all| First run on a fresh repo never crashes on a missing dir |