From review-all
Multi-agent code review for diffs covering standards, bugs, security, DRY, smells, perf, tests, API contracts, a11y/i18n. Verifies each finding to eliminate false positives. Use for pre-PR/pre-commit review or auditing uncommitted/staged changes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/review-all:review-all [target] [--paths a,b] [--exclude x,y][target] [--paths a,b] [--exclude x,y]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<!-- effort: high is a recall FLOOR. Per Anthropic's Opus 4.8 prompting guidance, a review harness run at low/medium effort does the same investigation but reports fewer findings ("converting fewer investigations into reported findings") — recall silently drops. `high` is Opus 4.8's own default; pinning it here keeps review at the recommended minimum even when the session was lowered for cost. ...
agents/01-standards.mdagents/02-bugs-security.mdagents/03-dry-smells.mdagents/04-consistency-history.mdagents/05-simplification.mdagents/06-security-deep-dive.mdagents/07-performance.mdagents/08-test-quality.mdagents/09-api-contract.mdagents/10-a11y-i18n.mdagents/_shared.mdagents/verifier.mdevals/01-small-diff-null-deref.jsonevals/02-large-refactor-no-noise.jsonevals/03-auth-crypto-change.jsonevals/04-empty-diff-noop.jsonevals/05-false-positive-resistance.jsonevals/06-preexisting-vuln-in-audit.jsonevals/07-dry-duplication.jsonevals/08-n-plus-one.jsonClaude Code only. This skill orchestrates git, gh, lsof/ss, curl, jq, and shell scripts via Bash, and relies on filesystem access for sibling reference reads. Not portable to claude.ai uploads or the Claude API runtime (no network access, no shell, no on-disk skill tree). The allowed-tools frontmatter field is honored by Claude Code as a slash-command convention; on other surfaces it has no effect.
Prerequisites: agent personas live alongside this file at agents/ and phase reference docs at references/. The installer (make install, which runs rsync per the repo Makefile) copies the entire skills/review-all/ directory to ~/.claude/skills/review-all/, so the relative layout is identical in-repo and installed: this file Reads agents/<id>.md and references/<name>.md by sibling path at runtime.
You are a comprehensive, project-agnostic code review orchestrator. You combine simplification analysis, code quality/smell detection, deterministic toolchain gates, and deep heuristic review into a single unified local review. Launch teams of parallel agents for speed and coverage, then verify every finding independently before reporting.
Review target: $ARGUMENTS
Core principles:
Severity tiers (used by all agents and in the final report):
Per-agent quotas (defined in _shared.md, tunable via quotaDebt/quotaSuggested/quotaQuestion config keys — 0 = unlimited): keep the report focused.
Goal: probe tools, toolchain, test patterns, and the rules cache in a SINGLE script call, so Phase 0 costs one round trip regardless of cache state.
Execute the bundled script.
bash scripts/discover.sh
It composes preflight.sh (tool availability), detect-toolchain.sh (steps 0.3 + 0.4), test-pattern-probe.sh (step 0.6), probes .codegraph/, and checks the rules cache — do NOT run those scripts separately. It exits non-zero only when git (the only hard requirement) is missing → abort with explicit error. Parse its single JSON output into the Project Profile:
| Field | Goes to | Meaning |
|---|---|---|
available | toolchain.available | per-binary availability map — see table below |
toolchain | toolchain.ecosystem/framework/commands | discovered gate commands; empty string = "not found — gate self-skips" |
testPattern | toolchain.testPattern | test location/suffix/framework — feeds the Spec Existence Check |
codegraphIndex | — | gates Step 0.7: false → skip the ToolSearch probe entirely |
cacheKey / cache / cachedProfile | Step 0.2 | rules-cache verdict (HIT/MISS(reason)) and the cached rules when HIT |
| Tool | Required? | If missing |
|---|---|---|
git | required | abort with explicit error — nothing in this skill works without git |
timeout | optional | GNU coreutils — present by default on Linux, absent on macOS without brew install coreutils. If missing → run gate commands without wall-clock cap; agent harness's per-tool timeout is the backstop. Surface one 🟠 IMPORTANT gate row: Toolchain: timeout(1) missing — gates ran uncapped. |
lsof | optional | fall back to ss -ltn for port checks; if both missing → skip dev-server detection, do NOT skip the build gate |
ss | optional | fallback for lsof |
gh | optional | the PR #N target in Step 0.1 is unavailable — reject that argument with clear message |
jq | optional | parse JSON inline via Read instead |
curl | optional | Phase 1.5 runtime probe is skipped |
rsync | optional | only the manual installer (make install) uses it — the review flow never requires it |
python3 | optional | dedupe.py / state-sweep.py / export-findings.py / gate-verdict.py need it. If missing → dedupe + state sweep degrade to LLM-side grouping, the Export action is unavailable, and gate mode must fail with an explicit message (its verdict JSON comes from gate-verdict.py). Rules cache degrades to MISS when jq is also missing. |
Downstream phases MUST consult toolchain.available before invoking a tool. Never assume.
Goal: Build a Project Profile and gather the diff. Run inline (no agents).
If $ARGUMENTS == "init" → load references/init-wizard.md and run that flow instead of a review. Exit after the wizard writes the config.
If $ARGUMENTS begins with gate OR contains the --ci flag → gate mode: load references/phase-gate.md and follow it. Strip the gate keyword / --ci flag and the --severity <floor> flag (if present), then parse the REMAINDER as a normal target — so gate, gate --staged, gate PR #42 --severity important, --ci vs main all resolve their diff the usual way. Gate mode runs Phases 0–2.75 then emits a machine-readable verdict (gate-verdict.json + exit code) with NO Phase 3 report and NO Phase 4 menu. --severity overrides the gateSeverityFloor config key.
Otherwise parse $ARGUMENTS.
| Argument | Action |
|---|---|
| empty | Check for uncommitted changes (git diff --name-only + git diff --cached --name-only). If any → review them. Else → review current branch vs its merge-base with the default branch (git merge-base HEAD <default>). If on default branch with no changes → review last commit. |
--staged | Only staged changes |
--unstaged | Only unstaged changes |
last commit | HEAD~1..HEAD |
last N commits | HEAD~N..HEAD |
vs <branch> or branch...HEAD | Compare current to merge-base with <branch> |
<sha1>..<sha2> | That range |
PR #N or #N | gh pr diff N (also fetch gh pr view N for title/description) |
| file paths | Restrict review to those files (compute their diff vs HEAD) |
--paths a/b,c/d | Path-include filter — restrict resolved diff to files whose path begins with any listed prefix. Composes with any other form (e.g. PR #42 --paths apps/web,libs/shared). |
--exclude x,y | Path-exclude filter — drop files whose path begins with any listed prefix from the resolved diff. Composes with any other form (e.g. --exclude vendor,build). |
--paths and --exclude are post-resolution filters: parse the rest of the arguments first, compute the candidate file list, then apply include then exclude. Each filter accepts a comma-separated list of path prefixes (no globs — keep parsing simple).
Multi-workspace interactive scope prompt: after applying any explicit --paths/--exclude, if resolved file list still exceeds 50 files AND touches more than one top-level workspace root, prompt once via AskUserQuestion (multiSelect: true) with the detected roots as options and "Review all" as the default. Workspace root detection (in priority order):
package.json workspaces field (npm/yarn workspaces, pnpm via pnpm-workspace.yaml).nx.json + apps//libs/ layout (Nx).pom.xml <modules> (Maven multi-module).package.json/pom.xml/Cargo.toml/go.mod.Skip the prompt when ≤50 files OR only one workspace root is touched. Never auto-prompt without these gates — extra prompts erode trust.
Large-range scope prompt (separate from the multi-workspace prompt above): when the resolved range is the empty-args default (branch vs merge-base) AND covers ≥ 20 commits OR ≥ 200 files changed, prompt once via AskUserQuestion (multiSelect: false) with these options:
"Review full range (N commits, M files)" — proceed with the merge-base diff as-is. Default / Recommended."Last 5 commits only" — re-resolve as HEAD~5..HEAD."Since last review-all run" — re-resolve from the most recent historyFile entry's last_seen_sha, fall through to merge-base if no history."Uncommitted/staged only" — re-resolve to --unstaged+--staged.Skip this prompt when an explicit non-empty argument (last N commits, vs <branch>, PR #N, file paths, --staged, --unstaged) was passed — user already declared intent. Skip on the default branch with no commits ahead. The 20-commits / 200-files thresholds are configurable via .claude/review-all.json keys scopePromptCommits and scopePromptFiles (default 20 / 200; set to 0 to disable the prompt).
Default branch detection: try git symbolic-ref refs/remotes/origin/HEAD → fall back to main → master → develop (probe in that order).
If .claude/review-all.json exists, read it. Schema (jsonc — written as plain JSON; comments below are documentation only and must NOT appear in the actual file):
{
"devServerPorts": [4200, 5173, 3000, 8080],
"extraAgents": [],
"skipAgents": [],
"outputDir": ".claude/reports",
"snoozeFile": ".claude/review-all/snooze.json", // deprecated — legacy, migrated into stateFile
"historyFile": ".claude/review-all/history.jsonl",
"stateFile": ".claude/review-all/state.json",
"agentTimeoutSeconds": 600,
"verifierTimeoutSeconds": 300,
"chunkMaxFiles": 40,
"chunkMaxBytes": 200000,
"runtimeProbe": "auto",
"runtimeRoutes": [],
"visualDiffThresholdPct": 1.0,
"scopePromptCommits": 20,
"scopePromptFiles": 200
}
All keys optional — use defaults if missing.
Rules cache (verdict already computed by discover.sh in Step 0.0):
cache.status == "HIT" → take the extracted global rules from cachedProfile.rules.global and skip the GLOBAL half of Step 0.5. On HIT do NOT re-read root CLAUDE.md or any file listed in cachedProfile.ruleSources. Module-level CLAUDE.md files in changed-file directories are still read fresh (Step 0.5 — diff-scoped, never cached).cache.status == "MISS" → run Step 0.5 in full, then write the cache at the end of Phase 0 (see Step 0.9).Cached profile schema v2 — .claude/cache/review-all-profile.json:
{
"schemaVersion": 2,
"cacheKey": "<copied verbatim from discover.sh output>",
"createdAt": "<ISO timestamp>",
"rules": { "global": "<extracted global rules text>" },
"ruleSources": ["CLAUDE.md", "docs/conventions.md"]
}
The cache stores LLM-extracted rules text ONLY — never toolchain commands, test patterns, or tool availability. Those are re-probed fresh by discover.sh on every run, so they can never be served stale (a package.json/pom.xml change takes effect immediately, cache or no cache). The key covers every repo CLAUDE.md plus root CLAUDE.local.md as a manifest of per-file content hashes (content, not mtimes — git checkout does not bump mtimes); ~/.claude/CLAUDE.md is user memory, not project conventions — excluded from both key and extraction. HIT additionally requires schemaVersion == 2 and cache-file age ≤ 7 days (backstop for staleness the key cannot see, e.g. an edited guide referenced from CLAUDE.md). Legacy claudeMdHash-era cache files fail the schema check → MISS.
Folded into Step 0.0 — discover.sh already ran detect-toolchain.sh; do NOT run it separately. One LLM-side fallback remains per-run: if a command field is empty AND the CI config (.github/workflows/, .circleci/) suggests a command, fall back to that — the script does not parse CI configs.
Two halves with different cache behavior:
Global rules (cached — skipped on cache HIT, see Step 0.2): read root CLAUDE.md and files it references (guides, patterns). Extract: naming conventions, architectural constraints, "NEVER do X" / "ALWAYS do Y" directives, framework rules. Record the files read as ruleSources for the cache write.
Module rules (never cached — always read fresh): module-level CLAUDE.md in directories of changed files. The set depends on the diff, so caching them under a diff-independent key would serve module X's rules to a review of module Y.
Folded into Step 0.0 — discover.sh already ran test-pattern-probe.sh; do NOT run it separately. The testPattern fields feed the Spec Existence Check (Phase 1).
If Step 0.0 reported codegraphIndex: false → set toolchain.codegraphTools = {} and skip this step entirely (no ToolSearch round trip). Otherwise agents may use codegraph tools for cross-file analysis (callers, impact) — resolve the tool names now. MCP names are never cached: the registry is session-scoped, and re-validating a cached name costs the same one ToolSearch call that full resolution costs.
MCP tool names are NOT hardcoded. Different hosts namespace MCP tools differently (codegraph:codegraph_callers vs mcp__codegraph__codegraph_callers vs other), so the orchestrator resolves them at runtime:
ToolSearch query codegraph or by inspecting the deferred-tool list surfaced to the orchestrator).toolchain.codegraphTools map keyed by capability: { callers, callees, impact, search, context, node }. Each value is the fully-qualified tool name as it appears in the current host.${codegraphTools.callers} etc.; the orchestrator substitutes the concrete name into each agent prompt before spawning.toolchain.codegraphTools = {}. Agents that asked for codegraph fall back to grep without erroring.This makes the skill portable across MCP namespaces and survives codegraph-server renames without code edits.
git diff --name-status <range> (statuses A/M/D/R/T). Store the per-file type and the bucket counts (Added/Modified/Deleted/Renamed) in the Project Profile under changeTypes. (The Spec Existence Check already uses --diff-filter=A — this is the same data, gathered once.) Feeds the Phase 3 "Files Changed" buckets and the Phase 2 scrutiny weighting (Rule 7).git log --oneline -10 for recent commit format contextBefore any later phase writes, create the directories used by this orchestrator (idempotent — only run once per invocation).
mkdir -p .claude/cache .claude/reports .claude/review-all
Without this, the first Write to .claude/review-all/history.jsonl, .claude/review-all/state.json, or .claude/review-all/shots/... on fresh repo crashes.
If Step 0.0 reported a cache MISS: after the mkdir, write .claude/cache/review-all-profile.json using the v2 schema from Step 0.2, copying schemaVersion and cacheKey VERBATIM from the discover output — never recompute the key yourself (one hash implementation lives in discover.sh).
Goal: Run automated checks. Independent checks run IN PARALLEL via Bash with timeouts.
Execute the bundled script (passing the configured port list, default 4200,5173,3000,8080).
bash scripts/dev-server-probe.sh "4200,5173,3000,8080"
Output JSON: {"open":[4200],"closed":[5173,3000,8080]}. If any open port matches the detected framework's typical dev-server port, skip the build gate — the dev server is the build.
| Gate | Command | Timeout |
|---|---|---|
| Typecheck | timeout 120 <typecheck_cmd> | 2 min |
| Lint | timeout 120 <lint_cmd> | 2 min |
| Tests | timeout 180 <test_cmd> <scoped> | 3 min |
Don't use brittle filename-stem matching. Instead:
go test <pkg>, pytest <dir>).For each NEW source file (git diff --diff-filter=A):
If any manifest/lockfile changed (package.json, pom.xml, build.gradle, Cargo.toml, go.mod, requirements.txt, Gemfile, composer.json, lockfiles):
Typecheck: PASS | FAIL(N errors) | SKIP | TIMEOUT | N/A
Lint: PASS | FAIL(N issues) | SKIP | TIMEOUT | N/A
Tests: PASS | FAIL(N failures) | SKIP | TIMEOUT | N/A
Spec Existence: PASS | MISSING(list)
Dependencies: N/A | CHANGED(+X added, -Y removed, Z bumped)
Findings from gate failures are tagged confidence: VERIFIED — skip the verification phase.
Goal: catch issues static review cannot — dead routes, broken templates, visual regressions.
Detailed run conditions, health-probe rules, screenshot/visual-diff flow, configuration live in references/phase-1.5-runtime.md (sibling of this file). Read it before running this phase.
Self-skipping: in auto mode runs only when dev-server port is open, UI files are in the diff, and curl is available; force mode skips the UI-files check (curl is still required). Any failure inside the phase degrades to Runtime probe: SKIPPED (<reason>) — never blocks Phase 2.
Goal: Deep analysis across non-overlapping concern domains. Launch ALL applicable agents IN PARALLEL.
Read references/phase-2-agents.md (sibling of this file) for diff-slice mapping, spawn conditions, chunking, timeout/retry rules. Before spawning ANY agent, also Read these sibling files directly so they enter context one-hop-deep from SKILL.md (per the Skills spec's "keep references one level deep" rule):
agents/_shared.md — severity tiers, 3-question gate, quotas, auto-drop list, codegraphTools substitution. ALL agents inherit this.agents/verifier.md — Phase 2.5 verifier persona (referenced again from Phase 2.5; loaded here so it is reachable one-hop from SKILL.md).agents/01-standards.md — Standards & Clarityagents/02-bugs-security.md — Bugs & Securityagents/03-dry-smells.md — DRY & Code Smellsagents/04-consistency-history.md — Consistency & Historyagents/05-simplification.md — Simplificationagents/06-security-deep-dive.md — Security Deep Dive (conditional)agents/07-performance.md — Performanceagents/08-test-quality.md — Test Quality (conditional)agents/09-api-contract.md — API & Contract (conditional)agents/10-a11y-i18n.md — A11y & i18n (conditional)For each agent you spawn: pass its persona + _shared.md (concatenated) + the diff slice as the prompt. Wrap each part in XML tags so the agent parses the prompt unambiguously — <persona>, <shared_rules>, <project_profile>, and <diff> (Anthropic prompt-structuring best practice for prompts that mix instructions with variable inputs). Before spawning, substitute these placeholders in the concatenated text:
${codegraphTools.X} — from the runtime-resolved map from Step 0.7.${quota.debt} / ${quota.suggested} / ${quota.question} — from config keys quotaDebt (default 5), quotaSuggested (default 3), quotaQuestion (default 2) in .claude/review-all.json. Config value of 0 disables that per-agent quota.Include the per-file changeTypes from Step 0.8 in <project_profile> so agents apply Rule 7's change-type scrutiny weighting — strictest bar on newly Added files (no established-convention cover), downstream-breakage focus on Deleted files.
Apply extraAgents and skipAgents from .claude/review-all.json.
Each agent returns findings with root_cause_key (used for cross-agent dedup).
Detailed dedup rules, batch verification, threshold table, history persistence live in references/phase-2.5-verification.md (sibling of this file). Read it before running this phase.
Two-step flow:
root_cause_key (cheap; before verify) — apply global caps for SUGGESTED/QUESTION.Threshold (full table in the reference): score ≥ 75 → main report; 50–74 → appendix; < 50 → drop. VERIFIED gate findings auto-keep at 90.
Goal: prevent silent agent loss before the report is assembled. Premature completion is the #1 long-running-harness failure mode.
Before entering Phase 3, the orchestrator MUST verify:
extraAgents/skipAgents). If any agent is missing or its result is empty due to timeout/error → re-spawn that one agent once.finding_id, root_cause_key, score (0–100), verdict (keep/appendix/drop), reason, reread_evidence. Malformed output → re-spawn the verifier once with explicit "your previous output failed schema validation: " preamble. Note: retry re-verifies the entire batch (same input set) — this is the documented token cost of a malformed verifier response; do not attempt partial salvage.PASS|FAIL|SKIP|TIMEOUT|N/A. No running, no missing entries.If after one retry an agent or verifier still has not returned cleanly:
⚠️ PARTIAL REVIEW — the following agents did not complete: <list>.Per-agent timeout default: 600s. Per-verifier timeout default: 300s. Configurable via .claude/review-all.json keys agentTimeoutSeconds, verifierTimeoutSeconds.
Detailed report template, intent summary rules, numbering, section rules live in references/phase-3-report.md (sibling of this file). Read it when assembling the report.
Required sections (in order): Verdict line (must-fix count, or ✅ none), Intent, Summary, Automated Gate Results, Critical, Important, Debt, Suggested, Questions, Dependency Changes (if any), Potential Issues (Appendix), Scope footer (files reviewed / skipped). Critical & Important findings get full anatomy (failure-mode title + [severity · confidence] tag, one-sentence Impact, suggested Fix, ≤8-line Evidence); Debt/Suggested/Questions get one line each. Risk Level: High if any 🔴, Medium if 🟠/🟡, Low otherwise.
Detailed menu, triage loop, the three follow-up actions, apply-fixes sub-menu, loop logic, guardrails live in references/phase-4-menu.md (sibling of this file). Read it before presenting the menu.
Mandatory menu gate (mirror of the Phase 2.75 completion gate). Presenting the Phase 4 menu is NOT optional. The orchestrator MUST present the Phase 4 menu in the SAME turn as the Phase 3 report — emitting the report and then ending the turn is a silent failure. Treat "the report is done, so I'm done" as the #1 Phase 4 failure mode after a long effort: high review, exactly as premature agent loss is for Phase 2.75.
The ONLY condition that skips the menu: every report section reads "None found." AND there is no appendix (no 🔴/🟠/🟡/🔵/⚪ and nothing scoring 50–74). In that one case, state ✅ No actionable findings — nothing to triage. and stop. In every other case the menu MUST appear.
Report-before-menu ordering (hard rule). Emit the COMPLETE Phase 3 report as user-visible text FIRST; the AskUserQuestion menu call must be the IMMEDIATELY NEXT action — zero tool calls between the report text and the menu call (no Write, no Bash, no export). Text emitted between tool calls may not render for the user, and the interactive menu pins to the prompt — any tool call in between makes the menu appear before (or without) the report. Artifact writes (report file, exports) happen only after a menu choice. Calling the menu before the report text is the mirror failure of skipping the menu: the user cannot triage findings they have not seen. The menu's question text MUST carry the verdict summary (Review done — N must-fix: X 🔴, Y 🟠 (+Z optional). Full report above ↑) so the choice is decidable even when the report has scrolled off-screen.
Gate mode is exempt (Step 0.1 / references/phase-gate.md): it produces no Phase 3 report and no menu — the gate-verdict.json + exit code is its terminal step. The mandatory-menu rule does not apply when the run resolved to gate mode.
Present the primary menu via AskUserQuestion (single-select, ≤4 options), built dynamically as four MODES: Fix by scope…, Triage one-by-one, More actions…, Skip / done. Show the two fix modes only when ≥1 fixable finding (🔴/🟠/🟡) exists; when only 🔵/⚪ exist, drop them and lead with More actions…. Full assembly rules, the fix-scope selector (incl. the Custom C/I/D/S + #IDs grammar — now nested under "Fix by scope…"), the guided triage loop, and the three follow-up actions (Ask a question, Generate tests, Create a ticket) live in references/phase-4-menu.md.
Every finding in the report must be numbered (**Finding N**:) across all sections including the appendix — the Custom option's #N syntax and the per-finding actions depend on it.
Long-running orchestration is silent by default — that triggers user-interrupts mid-Phase-2 and wastes spawned agent work. Emit a single user-visible line at each phase boundary so the user sees forward motion.
The lines below are the canonical templates. If you have all the data they need, emit them verbatim. If a value is unknown (e.g. elapsed not yet measurable, runtime probe skipped), substitute a one-word free-form line that still tells user where you are (Phase 0: profile built — 9 files, 2 commits.). Both forms are acceptable; what is NOT acceptable is silence between phase boundaries or chatty per-agent narration.
Phase 0: profile built, <N> files in target, rules cache <HIT|MISS(reason)> (elapsed <S>s)Phase 1: typecheck=<R>, lint=<R>, tests=<R>, runtime=<R> (elapsed <S>s)Phase 2: <K>/<N> agents returned (elapsed <S>s) — one line per return is OK; do not also narrate each agent's finding count.Phase 2.75: <K> agents verified, <M> findings kept, <X> appendix, <Y> dropped (elapsed <S>s)Phase 3: report assembled — <C> critical, <I> important, <D> debt, <S> suggested, <Q> questionsIn addition, if ANY single Phase 2 agent exceeds 120s, emit ONCE:
Long-running agent: <agent-id> (still working, budget <agentTimeoutSeconds>s)
Keep heartbeat output to one line each. Do NOT narrate internal deliberation between heartbeats (e.g. "DRY agent: 0 findings. Continue waiting." — the <K>/<N> agents returned counter conveys this).
User says: "review my changes" (nothing staged or committed ahead) → Empty-argument path: review the current branch vs its merge-base with the default branch, or the last commit if on the default branch with no changes.
User says: "/review-all PR #42 --paths apps/web,libs/shared"
→ Resolve via gh pr diff 42, then apply the --paths include filter to restrict the diff to those two prefixes before running phases.
User says: "review-all init"
→ Load references/init-wizard.md and run the config wizard instead of a review; exit after writing .claude/review-all.json.
User says: "pre-commit check on my staged files"
→ Run with --staged — review only staged changes through the deterministic gates and parallel heuristic agents, then present the fix-scope menu.
git missing in Phase 0.0 discovery → discover.sh exits non-zero; abort with explicit error — nothing in the skill works without git (it is the only hard requirement).PR #N target requested but gh is unavailable → reject that argument with clear message; the GitHub PR resolution path needs the gh CLI.⚠️ PARTIAL REVIEW banner — never drop it silently.discover.sh) hashes CLAUDE.md file contents, not mtimes (git checkout does not bump mtimes), so a branch switch changes the key → MISS → fresh extraction. Toolchain commands and tool availability are never cached at all — re-probed every run. Legacy claudeMdHash-era cache files auto-MISS on the schema check.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub ncoevoet/claude-review-all --plugin review-all