code-review-graph
Memory server
Created by Tirth
Published in tirth8205/code-review-graph. Publisher page
32,711 GitHub stars
What it is
Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.
AutoGineer overview, from the brain’s own files
code-review-graph is a local-first memory system designed to solve the token-heavy problem of AI code review. By parsing a repository into a structural map of functions, classes, imports, and tests using Tree-sitter, it stores the codebase as a graph in a local SQLite database. When an AI agent needs to review a change, the system calculates the blast radius—identifying only the relevant callers, dependents, and tests—and serves this compact context over the Model Context Protocol (MCP). This approach significantly reduces the token count required for agents to understand code impact, often by orders of magnitude. The system supports incremental updates via file system hooks and watch mode, ensuring the graph remains accurate without full re-parsing. It is designed for local execution, keeping data on the user's machine, and integrates directly with various AI coding tools and CLI environments.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
The system uses Tree-sitter to parse source code into an Abstract Syntax Tree (AST), which is then stored as nodes and edges in a local SQLite database. When a user requests a review or code analysis, the system queries this graph to determine the blast radius of a change. It then provides the AI agent with a minimal, relevant subset of the codebase rather than the entire repository. The graph is kept up-to-date incrementally; hooks and watch mode detect file changes, diff them, and re-parse only the affected files and their immediate dependents.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 15 |
| docs | docs | 13 |
| hooks | hooks | 2 |
| scripts | scripts | 7 |
| skills | agent-instructions | 7 |
| tests | tests | 354 |
| .beads | folder | 9 |
| code-review-graph-vscode | folder | 32 |
| code_review_graph | folder | 103 |
| diagrams | folder | 12 |
| evaluate | folder | 24 |
The agent reads
- get_review_context_tool evidence: AGENTS.md
- query_graph_tool evidence: AGENTS.md
- skills/ evidence: README.md
- get_docs_section_tool evidence: README.md
- get_suggested_questions_tool evidence: README.md
The agent writes
- .gitignore evidence: CLAUDE.md
- .mcp.json evidence: README.md
- code_review_graph/cli.py evidence: README.md
- code_review_graph/parser.py evidence: README.md
Requirements
Apps: Docker
Runtimes: Python >=3.10
Databases: Neo4j, SQLite
API keys (by name): CRG_OPENAI_API_KEY, GITHUB_TOKEN, GOOGLE_API_KEY, MINIMAX_API_KEY, VOYAGE_API_KEY
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 3 hooks (claude-code). Review hooks/hooks.json before opening the folder in Claude Code. No step below turns a hook on for you.
hooks/hooks.json:cat >/dev/null || true; command -v code-review-graph >/dev/null 2>&1 || exit 0; git rev-parse --git-dir >/dev/null 2>&1 && code-review-graph status --repo "$(git rev-parse --show-toplevel 2>/dev/null)" || echo 'Not a git repo, skipping'hooks/hooks.json:cat >/dev/null || true; code-review-graph build >/dev/null 2>&1 &hooks/hooks.json:command -v code-review-graph >/dev/null 2>&1 && code-review-graph hook-update; cat >/dev/null || true
- Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (9 declared). https://pypi.org/project/code-review-graph/
Created by Tirth. Published in tirth8205/code-review-graph. Licence: MIT License.
Usage
AutoGineer overview, from the brain’s own files
- Install the tool via pip and run the install command to configure your AI coding tools.
- Build the initial knowledge graph for your project.
- Use MCP-enabled AI agents to query the graph for impact analysis, code reviews, or architectural questions.
- Rely on automatic incremental updates triggered by file changes to keep the graph in sync.
- “Build the code review graph for this project”
- The system parses the repository and initializes the SQLite graph database for use by AI agents.
- “What is the impact of changing this function?”
- The agent uses the graph to identify and present the callers, dependents, and tests affected by the change.
Documentation by Tirth
<h1 align="center">code-review-graph</h1>
<p align="center"> <a href="https://trendshift.io/repositories/23329?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-23329" target="_blank" rel="noopener noreferrer"> <img src="https://trendshift.io/api/badge/repositories/23329" alt="tirth8205%2Fcode-review-graph | Trendshift" width="250" height="55" /> </a> </p>
<p align="center"> <strong>A local code knowledge graph that gives AI coding tools precise review context over MCP.</strong> </p> <p align="center"> <a href="README.md">English</a> | <a href="README.zh-CN.md">简体中文</a> | <a href="README.ja-JP.md">日本語</a> | <a href="README.ko-KR.md">한국어</a> | <a href="README.hi-IN.md">हिन्दी</a> </p>
<p align="center"> <a href="https://pypi.org/project/code-review-graph/"><img src="https://img.shields.io/pypi/v/code-review-graph?style=flat-square&color=blue" alt="PyPI"></a> <a href="https://pepy.tech/project/code-review-graph"><img src="https://img.shields.io/pepy/dt/code-review-graph?style=flat-square" alt="Downloads"></a> <a href="https://github.com/tirth8205/code-review-graph/stargazers"><img src="https://img.shields.io/github/stars/tirth8205/code-review-graph?style=flat-square" alt="Stars"></a> <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square" alt="MIT Licence"></a> <a href="https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml"><img src="https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml/badge.svg?branch=staging" alt="CI"></a> <a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.10%2B-blue.svg?style=flat-square" alt="Python 3.10+"></a> <a href="https://modelcontextprotocol.io/"><img src="https://img.shields.io/badge/MCP-compatible-green.svg?style=flat-square" alt="MCP"></a> <a href="https://code-review-graph.com"><img src="https://img.shields.io/badge/website-code--review--graph.com-blue?style=flat-square" alt="Website"></a> <a href="https://discord.gg/3p58KXqGFN"><img src="https://img.shields.io/badge/discord-join-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord"></a> </p>
<p align="center"> <a href="docs/USAGE.md">Usage</a> · <a href="docs/COMMANDS.md">Commands</a> · <a href="docs/FAQ.md">FAQ</a> · <a href="docs/TROUBLESHOOTING.md">Troubleshooting</a> · <a href="docs/GITHUB_ACTION.md">GitHub Action</a> · <a href="docs/REPRODUCING.md">Reproducing the benchmarks</a> · <a href="docs/ROADMAP.md">Roadmap</a> </p>
<br>
AI coding tools often re-read large parts of a codebase to review a change. code-review-graph builds a structural map of the code with Tree-sitter, keeps it updated incrementally, and serves compact context over MCP, so the assistant reads only the files a change touches.
<p align="center"> <img src="diagrams/diagram1_before_vs_after.png" alt="The Token Problem: reading flask's whole corpus costs 143,594 tokens, a graph answer costs 2,196 (65x fewer)" width="85%" /> </p>
What it does
Maps your code. Functions, classes, imports, calls and tests become one graph.
Shows what a change can break. The callers, dependents and tests it can reach, with a risk score.
Stays up to date. Hooks and watch mode parse again only the files that changed.
Works with your AI tools. One
installsets up each tool it finds.Stays on your machine. One SQLite file, no cloud service; cloud embeddings are opt-in.
Quick Start
Requires Python 3.10+.
pip install code-review-graph # or: pipx install code-review-graph
code-review-graph install # detect installed AI coding tools and configure each one
code-review-graph build # parse the codebase<details> <summary><strong>What <code>install</code> changes, and how to preview it first</strong></summary> <br>
install detects which AI coding tools you have, writes an MCP server entry for each, installs hooks and skills where the platform supports them, and adds graph instructions to the platform's rules file. The MCP entry uses poetry run or uv run inside a Poetry or uv project environment, uvx code-review-graph serve when uvx is on PATH, and otherwise the current Python interpreter. Nothing is written until install has listed the files it will change and you have answered its question about instruction files; install --dry-run shows each change as a diff and writes nothing. Restart the editor or tool afterwards.
The files install writes, such as .claude/ and .mcp.json, stay visible to git in case your team commits them. install --gitignore adds the ones that run created to a marked block in .gitignore; uninstall removes the block.
For Codex, the installer also places a global code-review-graph Skill under
$CODEX_HOME/skills/code-review-graph/ (default:
~/.codex/skills/code-review-graph/). It prefers CRG MCP tools and falls back
to the bundled read-only CLI when MCP is unavailable; a missing, empty, or
stale graph never triggers an implicit build or update. WSL and Windows Codex
runtimes have separate CODEX_HOME directories and tool inventories, so
install and refresh the runtime that will execute the task.
</details>
<details> <summary><strong>Every supported platform, and how to set up just one</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram8_supported_platforms.png" alt="One install, every platform: detects Codex, Claude Code, CodeBuddy Code, Cursor, Windsurf, Zed, Continue, OpenCode, MiMo Code, Antigravity, Gemini CLI, Qwen Code, Qoder, Kiro, GitHub Copilot, GitHub Copilot CLI, Hermes Agent and DeepSeek Harness" width="85%" /> </p>
To configure one platform, pass --platform with one of codex, claude-code, cursor, windsurf, zed, continue, opencode, mimo, antigravity, gemini-cli, qwen, kiro, qoder, copilot, copilot-cli, codebuddy, hermes, or dsh:
code-review-graph install --platform cursor
code-review-graph install --platform codebuddyConfig file locations are listed in docs/USAGE.md. Requires Python 3.10+.
</details>
<details> <summary><strong>Remove it again with <code>uninstall</code></strong></summary> <br>
uninstall removes CRG-owned files and entries from a Git or SVN working tree and leaves other MCP servers, hooks, skills and JSONC comments alone. Run it from anywhere inside the tree. Shared config files are replaced atomically, so a failed write leaves the original intact.
code-review-graph uninstall --dry-run # preview only
code-review-graph uninstall # preview, confirm, apply
code-review-graph uninstall --yes # apply without prompting
code-review-graph uninstall --all-repos # also clean every registered repository
code-review-graph uninstall --keep-data # remove integrations, keep graph databases
code-review-graph uninstall --keep-user-configs --repo . # this project only</details>
Restart the editor or tool after install.
Then open the project and ask the assistant:
Build the code review graph for this project<details> <summary><strong>How long a build takes, and what a partial build means</strong></summary> <br>
Build time scales with repository size; a cold build of a ~3,000-file repository took about 40 seconds (measured). After that, hooks and watch mode keep the graph updated. If some files fail to parse, the result has status partial and names them in its summary; the CLI also prints a Warning: line on stderr, and those files keep their previous graph rows.
</details>
Run with Docker or Podman
<details> <summary><strong>Build the image, then run it on your repository</strong></summary> <br>
Build the image from the repository root:
docker build -t code-review-graph:local .From the repository you want to analyse, run:
docker run --rm \
--user "$(id -u):$(id -g)" \
--env HOME=/tmp \
--volume "$PWD:/workspace" \
code-review-graph:local buildThe mounted repository must be writable. The command above uses your
user and group IDs so the generated .code-review-graph/ directory
remains owned by your user. Run these commands as a non-root host user.
For Podman, build the same Dockerfile and preserve your user mapping:
podman build -t code-review-graph:local .
podman run --rm \
--userns=keep-id \
--env HOME=/tmp \
--volume "$PWD:/workspace" \
code-review-graph:local buildThe graph persists in .code-review-graph/ in the mounted repository and stores
absolute container paths such as /workspace/app.py. Run update and
detect-changes through Docker or Podman with the same /workspace mount.
A host update on this graph can fail with "built with a different repository
root". To switch to host commands, run code-review-graph build on the host
to rebuild the graph with host paths.
Replace build with status to inspect the saved graph.
The image includes Git and defaults to a non-root user.
No graph is generated during image construction.
These examples use macOS/Linux shell syntax. On macOS, start your
Docker-compatible engine or Podman machine before running them. On a host with
SELinux on, such as Fedora, add :z to the mount ("$PWD:/workspace:z"), or
the container is refused access to the repository.
</details>
How It Works
The repository is parsed into ASTs with Tree-sitter and stored as a graph of nodes (functions, classes, imports) and edges (calls, inheritance, test coverage). At review time the graph is queried for the smallest set of files the assistant needs to read.
<details> <summary><strong>Two diagrams: how the assistant uses the graph, and the build pipeline</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram7_mcp_integration_flow.png" alt="How the assistant uses the graph: the user asks for a review, the assistant calls MCP tools, the graph returns blast radius and risk scores, the assistant reads only the affected files" width="80%" /> </p>
<p align="center"> <img src="diagrams/diagram2_architecture_pipeline.png" alt="Architecture pipeline: Repository to Tree-sitter parser to SQLite graph to blast radius to minimal review set" width="100%" /> </p>
</details>
Blast-radius analysis
<details> <summary><strong>Every caller, dependent and test a change can affect</strong></summary> <br>
When a file changes, the graph traces every caller, dependent and test that could be affected. The assistant reads those files instead of scanning the whole project.
<p align="center"> <img src="diagrams/diagram3_blast_radius.png" alt="Blast radius: a change to login() propagates to callers, dependents, and tests" width="70%" /> </p>
</details>
Incremental updates
<details> <summary><strong>Only changed files are parsed again (about 2.5 s for a two-file edit)</strong></summary> <br>
Editor hooks, git hooks (pre-commit, post-checkout, post-merge, post-rewrite) and watch mode trigger incremental updates. The update diffs changed files, finds their dependents through the graph's import and call edges, and re-parses only the files whose SHA-256 hash changed. On a ~3,000-file project (django) a two-file edit re-indexes in about 2.5 seconds on the path the hooks use, of which ~1.4 s is process start-up; a no-op update costs only that start-up. See Incremental update latency.
<p align="center"> <img src="diagrams/diagram4_incremental_update.png" alt="Incremental update flow: a hook or watch update triggers a git diff, dependents are found through graph edges, and only files whose SHA-256 hash changed are re-parsed" width="90%" /> </p>
</details>
Whole codebase or targeted answer?
<details> <summary><strong>A slice of the graph shaped to the question, not the whole codebase</strong></summary> <br>
Instead of feeding a whole corpus to the model, the graph returns a slice shaped to the question. In the 2026-08-02 capture of this repository at 84bde354, 208,821 source tokens became ~3,190 tokens per question. The repository has grown a lot since that snapshot, so both numbers are larger today.
<p align="center"> <img src="diagrams/diagram6_monorepo_funnel.png" alt="code-review-graph at the 84bde354 snapshot: 208,821 source tokens funnel down to ~3,190 token graph responses, about 65x fewer tokens per question" width="80%" /> </p>
</details>
Language coverage and notebooks
<details> <summary><strong>Python, JavaScript, TypeScript, Go, Rust, Java, C/C++, C# and many more, plus notebooks: the full list</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram9_language_coverage.png" alt="Language coverage by category: Web, Backend, Systems, Mobile, Scripting, Shells, Domain, Config and Other, plus Jupyter and Databricks notebooks" width="90%" /> </p>
The parser extracts functions, classes, imports, call sites, inheritance and tests, using Tree-sitter where a grammar exists and targeted fallbacks elsewhere. Supported: Python, JavaScript/TypeScript/TSX (including .mjs, .cjs, .mts and .cts), Go, Rust, Java, C/C++, C#, VB.NET, Ruby, Kotlin (.kt, .kts), Swift, PHP, Scala, Solidity, Dart, R, Perl, Lua/Luau, Objective-C, shell scripts, Elixir, Zig, PowerShell, Julia, ReScript, GDScript, Nix, Verilog/SystemVerilog, SQL/PL/SQL (Oracle) and dbt models, Terraform/OpenTofu (.tf, and Terraform blocks in .hcl files; an .hcl file with no Terraform blocks keeps only a file node), Ansible YAML (playbooks, roles, tasks), Spring Boot application config (application.properties, application.yml, application.yaml and their application-<profile> variants; key names and value types only, never values), value-free generic YAML structure (translation files in folders such as locales/ become file nodes only), XSLT stylesheets (.xsl, .xslt), value-free JSON structure (.json; translation, test, docs, example and data files keep only a file node, and lock files are skipped), Vue/Svelte SFCs, HTML pages (.html, .htm; inline scripts, plus div, section and article blocks with an id as DocSection nodes), Astro files (parsed with the TypeScript grammar), Jupyter and Databricks notebooks (.ipynb, plus Databricks .py exports), Perl XS files (.xs), Robot Framework files (.robot, .resource), and Liquid templates (.liquid). Other .properties files are not treated as source code.
PHP projects also get repository-bounded Composer PSR-4 resolution, Blade template references,
and Laravel Route and Eloquent edges when the source shows explicit framework imports, model
inheritance and receiver evidence. Static Laravel routes in routes/*.php emit Endpoint nodes
and controller HANDLES edges, including literal group prefixes.
Java projects get Spring dependency-injection call resolution, request endpoints and WebFlux routes, scheduled triggers, application-event publisher-to-listener edges, Spring AOP advice-to-target edges, and Temporal workflow and activity edges. Each resolver runs after the parse and needs the injected field, published event or workflow stub to be visible in the repository.
</details>
Add your own language
<details> <summary><strong>Map a file extension to a bundled Tree-sitter grammar in <code>languages.toml</code></strong></summary> <br>
If your repository uses a language the parser does not cover, add a languages.toml to .code-review-graph/ that maps file extensions to any grammar bundled in tree_sitter_language_pack, plus the node types for functions, classes, imports and calls:
[languages.erlang]
extensions = [".erl"]
grammar = "erlang"
function_node_types = ["function_clause"]
class_node_types = ["record_decl"]
import_node_types = ["import_attribute"]
call_node_types = ["call"]The generic tree-sitter walker does the extraction. Built-in languages cannot be overridden. See docs/CUSTOM_LANGUAGES.md for the schema, validation rules and a worked example.
</details>
Risk-scored PR reviews in CI (GitHub Action)
<details> <summary><strong>One pull request comment with risk scores, affected flows and test gaps; see the sample workflow</strong></summary> <br>
The same analysis runs as a composite GitHub Action. The graph is built and queried on your CI runner; no source code is sent to an external service. On each pull request the action posts one sticky comment with risk-scored functions, affected execution flows and test gaps, updated in place on every push. The optional fail-on-risk input turns it into a merge gate. The optional details input adds more graph context, folded away and capped in size: why each top symbol scored what it did, the communities, hubs and cross-boundary links the change touches, its impact radius, its untested hotspots, and where the graph came from.
# .github/workflows/code-review-graph.yml
on:
pull_request:
permissions:
contents: read
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: tirth8205/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}See docs/GITHUB_ACTION.md for inputs, risk levels and caching, or the workflow this repository runs on itself in .github/workflows/pr-review.yml.
</details>
Benchmarks
The median per-question token reduction across the 6 repositories is about 63x (whole-corpus baseline vs graph query). The 358x maximum is one repository (fastapi, the largest corpus), not the typical result.
<details> <summary><strong>The benchmark board, and how the numbers were made</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram5_benchmark_board.png" alt="Benchmarks across 6 repositories: ~63x median per-question token reduction (358x max), 0.69 average impact F1 against graph-derived ground truth" width="85%" /> </p>
All numbers come from the evaluation runner against 6 open-source repositories (13 commits). Every config pins an upstream SHA, Leiden runs with a fixed seed, and embeddings are deterministic on CPU, so two runs on different machines produce the same numbers. The reproduction recipe is in docs/REPRODUCING.md. A weekly report-only run on the two smallest configs lives in .github/workflows/eval.yml.
</details>
<details> <summary><strong>Token efficiency: ~63x median per-question reduction (range 35x to 358x; whole-corpus vs graph query)</strong></summary> <br>
For a typical agent question ("how does authentication work", "what is the main entry point", and so on), the graph returns ~2,200 to 3,900 tokens of search hits plus neighbour edges instead of every source file. The table averages the 5 sample questions defined in code_review_graph/token_benchmark.py.
| Repo | Snapshot SHA | naive_corpus_tokens | avg graph_tokens | Reduction |
|---|---|---|---|---|
| fastapi | 22381558 | 948,793 | 2,653 | 357.6x |
| flask | a29f88ce | 143,594 | 2,196 | 65.4x |
| code-review-graph | 84bde354 | 208,821 | 3,190 | 65.5x |
| gin | 5c00df8a | 166,868 | 2,766 | 60.3x |
| httpx | b55d4635 | 142,356 | 2,661 | 53.5x |
| express | b4ab7d65 | 136,052 | 3,936 | 34.6x |
Captured 2026-08-02 from clean clones at the pinned SHAs (crg 2.3.7, local
all-MiniLM-L6-v2embeddings). These numbers are lower than the 2026-05-25 capture they replace: node embedding text became richer, soavg graph_tokensrose in every repo. fastapi is measured at its current pin22381558rather than the retired0227991a.The Reduction column is
naive_corpus_tokens / avg graph_tokens, so it divides out from the two columns beside it. The benchmark's ownaverage_reduction_ratioaverages the five per-question ratios instead, which always reads higher; those per-question figures are indocs/REPRODUCING.md.The
code-review-graphrow is a snapshot, not a current measurement. The repository has grown since84bde354, so its corpus and graph are both much larger today.
The whole-corpus baseline is an upper bound no real agent pays; an agent greps for identifiers and reads the best-matching files. The agent_baseline eval benchmark measures that case (a pure-Python grep over the corpus, top-3 files by match count, token-counted against the graph query cost). Against that realistic baseline the median across 18 questions on 6 repositories is 6.65x (mean 14.8x, range 4.2x to 72.6x), captured 2026-09-22, before search and this baseline began ranking test files lower, so code-review-graph eval --benchmark agent_baseline --embed now gives different numbers until the capture is redone. The full table is in docs/REPRODUCING.md, under "Canonical capture, 2026-09-22".
The ratio tracks repository size, because the graph answer stays flat (2,432 to 4,021 tokens across every repo measured) while the grep baseline grows with the corpus: 4.5x on express, 52x on fastapi. Both figures measure retrieval cost, the tokens needed to locate an answer. An agent that then opens the files the graph named pays the graph on top of its usual reads rather than instead of them; semantic_search_nodes_tool(include_source=True) returns the code with the locations so it does not have to, and measuring that path end-to-end is open work.
The formal token_efficiency benchmark measures a different scenario, the full get_review_context() JSON against only the changed-file content of a commit, and reports ratios below 1 for small commits because the response carries impact-radius edges and source snippets. The two benchmarks answer different questions; see docs/REPRODUCING.md.
Review and impact tools attach a compact context_savings estimate to their responses. The CLI shows the same figures in the Token Savings panel (see Usage below) and --verify compares them with OpenAI's cl100k_base tokenizer. Calibration across 222 sample files puts the estimate within about 1% of real tokens in aggregate (data).
</details>
<details> <summary><strong>Impact accuracy: 0.69 average F1 against graph-derived ground truth (recall 1.0 is a circular upper bound)</strong></summary> <br>
Blast-radius analysis recovers every file in the ground truth on all 13 evaluation commits. Read that as an upper bound, not as "100% recall": the ground truth (changed files plus files with call or import edges into them) comes from the same graph the predictor traverses. The lower precision is deliberate; flagging an extra file costs less than missing a broken dependency.
| Repo | Commits | Avg F1 | Avg Precision | Recall (graph-derived upper bound) |
|---|---|---|---|---|
| httpx | 2 | 0.863 | 0.785 | 1.0 |
| code-review-graph | 2 | 0.734 | 0.584 | 1.0 |
| fastapi | 2 | 0.697 | 0.539 | 1.0 |
| express | 2 | 0.667 | 0.500 | 1.0 |
| flask | 2 | 0.633 | 0.485 | 1.0 |
| gin | 3 | 0.609 | 0.439 | 1.0 |
| Average | 13 | 0.693 | 0.546 | 1.000 |
This table is from the 2026-08-02 capture, taken before the path fix described below. That bug also kept real neighbour files out of the graph-derived ground truth, so these numbers will change when the benchmark is re-run.
The benchmark also runs a co-change mode: the predictor is seeded with one changed file and graded against the other files the author touched in the same commit, which is evidence from git history rather than from the graph. Both modes appear in the result CSVs (ground_truth_mode column). In the 2026-08-02 capture co-change mode returned predicted_files = 0 on every graded commit, code seeds included (for example code_review_graph/cli.py and gin's context.go). The cause was a path bug in the benchmark: git diff gives repo-relative paths, the graph stores absolute ones, so the seed never matched a node. That bug is now fixed, but the benchmark has not been re-run yet, so no co-change number is quoted.
</details>
<details> <summary><strong>Build stats</strong></summary> <br>
From the same 2026-08-02 clean-room build at the pinned SHAs above. Embedding counts are lower than node counts because File nodes are not embedded. The code-review-graph row is that snapshot, not the repository as it stands now.
| Repo | Nodes | Edges | Embeddings |
|---|---|---|---|
| fastapi | 6,287 | 32,036 | 5,159 |
| express | 1,990 | 19,492 | 1,849 |
| gin | 1,589 | 17,237 | 1,491 |
| code-review-graph | 1,446 | 9,094 | 1,354 |
| flask | 1,415 | 8,259 | 1,329 |
| httpx | 1,263 | 8,236 | 1,193 |
</details>
Limitations
<details> <summary><strong>Five known limits: circular recall, small edits, search ranking, flow detection, false positives</strong></summary> <br>
Impact "recall 1.0" is circular. The historical ground truth comes from the same graph edges the predictor walks, so it is an upper bound by construction. Co-change numbers are not quoted until the benchmark is re-run with the path fix.
Small single-file changes. Graph context can exceed a plain file read for trivial edits. The overhead is the structural metadata that makes multi-file analysis possible.
Search ranking. Keyword search usually finds the right result near the top, but ranking needs work. Express queries can return no hits because of module-pattern naming.
Flow detection. Entry-point detection is strongest for Python and PHP/Laravel. JavaScript and Go flow detection needs work.
Precision vs recall. Impact analysis is conservative. It flags files that might be affected, which means false positives in large dependency graphs.
</details>
Features
Updates, impact analysis, search, visualisation, CI reviews, refactoring and multi-repo support, all kept on your machine.
<details> <summary><strong>The full feature table</strong></summary> <br>
| Feature | Details |
|---|---|
| Incremental updates | Re-parses only files whose hash changed. On a ~3,000-file repo a two-file edit takes ~2.5 s on the hook path (measured). |
| Language and notebook support | See Language coverage above. |
| Framework-aware PHP parsing | Repository-bounded Composer PSR-4 imports, Blade template references, evidence-gated Laravel Route-to-controller and Eloquent relationship edges |
| Framework-aware Java parsing | Spring dependency-injection call resolution, request endpoints and WebFlux routes, scheduled triggers, application-event publisher-to-listener edges, Spring AOP advice edges, Temporal workflow and activity edges, and Spring Boot config keys indexed without their values |
| Blast-radius analysis | Which functions, classes and files are likely affected by a change |
| Auto-update hooks | Editor hooks, git hooks (before each commit, after checkout, merge and rebase) and watch mode update the graph as you work |
| Semantic search | Optional vector embeddings via sentence-transformers, Google Gemini, MiniMax, Voyage AI, or any OpenAI-compatible endpoint |
| Interactive visualisation | D3.js force-directed graph with search, community legend toggles and degree-scaled nodes, plus a neighbourhood view seeded from a symbol, file, flow or change |
| Hub and bridge detection | Most-connected nodes and chokepoints (betweenness centrality) |
| Surprise scoring | Unexpected coupling: cross-community, cross-language, peripheral-to-hub edges |
| Knowledge gap analysis | Isolated nodes, untested hotspots, thin communities, import cycles |
| Suggested questions | Review questions generated from bridges, hubs and surprises |
| Edge confidence | Four tiers (EXTRACTED, INFERRED, AMBIGUOUS, UNRESOLVED) with float scores on edges, so a call the graph could not bind says so |
| Graph traversal | BFS/DFS from any node with configurable depth and token budget; path_to shows how one symbol reaches another and names the weakest hop |
| Export formats | GraphML, Neo4j Cypher, Obsidian vault, JSON, and SVG (SVG needs matplotlib from the eval extra) |
| Token benchmarking | code_review_graph/token_benchmark.py measures whole-corpus tokens against graph query tokens per question |
| Estimated context savings | context_savings metadata (estimated, saved_tokens, saved_percent) on review, impact, detect-changes and architecture responses |
| Community auto-split | Communities above 25% of the graph are split recursively with Leiden |
| Execution flows | Call chains from entry points, sorted by weighted criticality |
| Community detection | Leiden clustering with resolution scaled to graph size |
| Architecture overview | Community-based architecture map with coupling warnings |
| Risk-scored reviews | detect_changes maps diffs to affected functions, YAML and JSON paths, flows and test gaps |
| Custom languages | New languages via .code-review-graph/languages.toml, no fork needed |
| GitHub Action | Sticky risk-scored PR review comments in CI, with an optional fail-on-risk merge gate |
| Refactoring tools | Rename preview, framework-aware dead code detection, community-driven suggestions |
| Wiki generation | Markdown wiki from community structure |
| Multi-repo registry | Register several repos and search across them |
| Multi-repo daemon | crg-daemon watches several repos as child processes, with health checks and restart |
| MCP prompts | 5 workflow templates: review, architecture, debug, onboard, pre-merge |
| Full-text search | FTS5 hybrid search combining keyword and vector similarity |
| Local storage | One SQLite file in .code-review-graph/; no external database or cloud service |
</details>
Usage
Your assistant uses the graph by itself once it is built. Open a part below for skills, commands, MCP tools and settings.
<details> <summary><strong>Skills</strong></summary> <br>
install writes these four skills for the platforms that support them (Claude Code, Gemini CLI, CodeBuddy Code, Hermes Agent and Qoder). Ask for one by name.
| Skill | Description |
|---|---|
explore-codebase | Navigate and understand codebase structure using the knowledge graph |
review-changes | Perform a structured code review using change detection and impact |
debug-issue | Systematically debug issues using graph-powered code navigation |
refactor-safely | Plan and execute safe refactoring using dependency analysis |
Qoder also gets build-graph, review-delta and review-pr from the repository's skills/ directory.
</details>
<details> <summary><strong>CLI reference</strong></summary> <br>
code-review-graph install # Detect and configure all platforms
code-review-graph install --platform <name> # One platform
code-review-graph install --steering # Claude Code: graph context beside each search and read
code-review-graph uninstall --dry-run # Preview removal of installed artifacts
code-review-graph build # Parse the whole codebase
code-review-graph build --follow-symlinks # Also index symlinked folders
code-review-graph update # Incremental update (changed files only)
code-review-graph status # Graph statistics
code-review-graph watch # Update on file changes
code-review-graph forget <path> # Drop already-parsed files from the graph
code-review-graph dead-code # Functions and classes with no callers or tests
code-review-graph query path_to <from> --to <to> # How one symbol reaches another
code-review-graph impact --detail-level compact # Blast radius as ranked file paths
code-review-graph visualize # Interactive HTML graph
code-review-graph visualize --seed-symbol <name> # Neighbourhood of one symbol
code-review-graph visualize --format json # Export graph data as JSON
code-review-graph visualize --format graphml # Export as GraphML
code-review-graph visualize --format svg # Export as SVG (needs matplotlib)
code-review-graph visualize --format obsidian # Export as Obsidian vault
code-review-graph visualize --format cypher # Export as Neo4j Cypher
code-review-graph wiki # Markdown wiki from communities
code-review-graph detect-changes --brief # Risk panel + token savings (read-only)
code-review-graph detect-changes --brief --base main # Against the merge base of main and HEAD
code-review-graph update --brief # Refresh graph + same panel
code-review-graph detect-changes --brief --verify # Cross-check against tiktoken
code-review-graph detect-changes --details all # Add graph context to the JSON
code-review-graph context-history # Trend of the opt-in savings log (CRG_CONTEXT_HISTORY=1)
code-review-graph register <path> # Register repo in the multi-repo registry
code-review-graph unregister <path|alias> # Remove repo from the registry
code-review-graph repos # List registered repositories
code-review-graph daemon start # Start the multi-repo watch daemon
code-review-graph daemon stop # Stop the daemon
code-review-graph daemon status # Daemon status and repos
code-review-graph eval --all # Run every evaluation benchmark
code-review-graph serve # Start the MCP server (stdio)
code-review-graph serve --http # MCP over Streamable HTTP on localhost:5555
code-review-graph serve --http --multi-repo # One HTTP server for every registered repo
code-review-graph serve --multi-worktree # One child server per linked Git worktreeThis is a selection. code-review-graph --help lists every command, and docs/COMMANDS.md documents their flags.
When detect-changes --base names a branch, the diff runs against the merge base of that branch and HEAD. Commit hashes and other revisions are used as given.
visualize --format svg needs matplotlib, which ships in the eval extra (pip install "code-review-graph[eval]"). The other export formats need no extra install.
JSON exports are written inside the local graph data directory, which Git ignores by default. They can contain absolute paths and code-structure metadata, so inspect an export before publishing it.
</details>
<details> <summary><strong>Token Savings panel: <code>detect-changes --brief</code> vs <code>update --brief</code></strong></summary> <br>
Both commands print the same panel showing how many tokens the graph saved compared with handing the changed files to an agent raw. They differ in one thing: whether the graph is refreshed first.
┌─────────────────────── Token Savings ────────────────────────┐
│ Full context would be: 12,921 tokens │
│ Graph context used: 762 tokens │
│ Saved: 12,159 tokens (~94%) │
│ Breakdown: Functions 244 · Tests 191 · Risk 244 · Other 83 │
└──────────────────────────────────────────────────────────────┘| Command | What it does | When to use |
|---|---|---|
detect-changes --brief | Read-only. Queries the existing graph for the current changes and prints the panel. | Most of the time; hooks or crg-daemon keep the graph fresh. |
update --brief | Re-parses the changed files into the graph first, then prints the same panel. | After a rebase, a large change set, or whenever the graph may be stale. |
Add --verify to either command to compare the figures with OpenAI's cl100k_base tokenizer (needs pip install tiktoken). The estimate is within about 1% of real tokens in aggregate; see docs/REPRODUCING.md.
The same context_savings metadata is attached to the JSON responses of the get_impact_radius, get_review_context, detect_changes and get_architecture_overview MCP tools.
To see these estimates over time, set CRG_CONTEXT_HISTORY=1 (off by default). Each estimate then adds one line to a local log next to graph.db, holding token counts, tool names, a timestamp, a detail level and file and depth counts, never file names, paths or source text, and code-review-graph context-history prints it per day or per tool. See docs/USAGE.md.
</details>
<details> <summary><strong>Multi-repo daemon</strong></summary> <br>
If install gives your editor no hooks (for example Windsurf or Zed), or you want the graph kept fresh without editor integration, the daemon watches your repositories and updates their graphs. It ships with code-review-graph; no separate install.
# 1. Register the repos to watch
crg-daemon add ~/project-a --alias proj-a
crg-daemon add ~/project-b
# 2. Start the daemon (runs in the background)
crg-daemon start
# 3. Check on it
crg-daemon status # daemon and per-repo watcher status
crg-daemon logs --repo proj-a -f # tail logs for one repo
crg-daemon stop # stop the daemon and all watchersAlso available as code-review-graph daemon start|stop|status|....
crg-daemon add writes to ~/.code-review-graph/watch.toml, which you can also edit directly:
[[repos]]
path = "/home/user/project-a"
alias = "proj-a"
[[repos]]
path = "/home/user/project-b"
alias = "project-b"The daemon watches this file and starts or stops watcher processes as repos are added or removed. A health check every 30 seconds restarts dead watchers.
See docs/COMMANDS.md for the full config reference.
</details>
<details> <summary><strong>30 MCP tools</strong></summary> <br>
The assistant uses these once the graph is built. The 25 tools that only read carry readOnlyHint: true, so a client can run them without asking; the five that write (build_or_update_graph_tool, run_postprocess_tool, embed_graph_tool, apply_refactor_tool, generate_wiki_tool) do not.
| Tool | Description |
|---|---|
build_or_update_graph_tool | Build or incrementally update the graph |
run_postprocess_tool | Re-run flow detection, community detection and FTS indexing |
get_minimal_context_tool | Compact context (~100 tokens); call this first |
get_impact_radius_tool | Blast radius of changed files; detail_level="compact" gives ranked file paths |
get_review_context_tool | Review context with structural summary |
query_graph_tool | Callers, callees, tests, imports, inheritance, and path_to between two symbols |
traverse_graph_tool | BFS/DFS traversal from any node with a token budget |
semantic_search_nodes_tool | Search code entities by name or meaning |
embed_graph_tool | Compute vector embeddings for semantic search |
list_graph_stats_tool | Graph size and health |
get_docs_section_tool | Retrieve documentation sections |
find_large_functions_tool | Functions, classes or files above a line-count threshold |
list_flows_tool | Execution flows sorted by criticality |
get_flow_tool | One execution flow |
get_affected_flows_tool | Flows affected by changed files |
list_communities_tool | Detected code communities |
get_community_tool | One community |
get_architecture_overview_tool | Architecture overview from community structure |
detect_changes_tool | Risk-scored change impact analysis |
get_hub_nodes_tool | Most-connected nodes |
get_bridge_nodes_tool | Chokepoints by betweenness centrality |
get_knowledge_gaps_tool | Structural weaknesses, untested hotspots and import cycles |
get_surprising_connections_tool | Unexpected cross-community coupling |
get_suggested_questions_tool | Review questions generated from the analysis |
refactor_tool | Rename preview, dead code detection, suggestions |
apply_refactor_tool | Apply a previously previewed refactoring |
generate_wiki_tool | Markdown wiki from communities |
get_wiki_page_tool | One wiki page |
list_repos_tool | Registered repositories |
cross_repo_search_tool | Search registered repositories; repos limits the search to a subset |
MCP prompts (5 workflow templates):
review_changes, architecture_map, debug_issue, onboard_developer, pre_merge_check
</details>
<details> <summary><strong>Configuration</strong></summary> <br>
To exclude paths from indexing, create a .code-review-graphignore file in the repository root:
generated/**
*.generated.ts
vendor/**
node_modules/**In git repositories a build reads tracked files plus untracked files git does not ignore (git ls-files and git ls-files --others --exclude-standard), so gitignored files are skipped. Use .code-review-graphignore to exclude other files or when git is not available. The default ignore list is in docs/USAGE.md.
Optional dependency groups:
pip install "code-review-graph[embeddings]" # Local vector embeddings (sentence-transformers)
pip install "code-review-graph[google-embeddings]" # Google Gemini embeddings
pip install "code-review-graph[communities]" # Community detection (igraph)
pip install "code-review-graph[enrichment]" # Python call resolution with Jedi (then build --enrich)
pip install "code-review-graph[eval]" # Evaluation benchmarks and SVG export (matplotlib)
pip install "code-review-graph[wiki]" # ollama client (not used by the current wiki generator)
pip install "code-review-graph[all]" # All optional dependenciesEnvironment Variables
| Variable | Description | Default |
|---|---|---|
CRG_GIT_TIMEOUT | Timeout in seconds for Git operations (build, update, watch) | 30 |
CRG_DISCOVERY_TIMEOUT | Timeout in seconds for each Git command that discovers what changed, when a review tool or command was not given an explicit file list. Running out reports an error, never "no changes" | 5, or CRG_GIT_TIMEOUT when you set that explicitly |
CRG_DATA_DIR | Directory for graph databases and generated artefacts | - |
CRG_HOOK_WORKTREES | Set to 1 to let the generated git hooks run in linked git worktrees | - |
CRG_EMBEDDING_MODEL | Default model for local vector embeddings | all-MiniLM-L6-v2 |
CRG_ACCEPT_CLOUD_EMBEDDINGS | Set to 1 to suppress the cloud embedding egress warning | - |
CRG_ALLOW_REMOTE_CODE | Allow HuggingFace models that require trust_remote_code=True | 0 |
CRG_VECTOR_CACHE | Set to 1 to keep the decoded embedding vectors in memory between semantic searches instead of reading them all back from SQLite on every query. Costs RAM (vectors × dimensions × 4 bytes per cached index) and one open read connection per cached database for the life of the process: on Windows, graph.db cannot be deleted or replaced while it is open | - |
CRG_MAX_IMPACT_NODES | Maximum nodes in impact analysis | 500 |
CRG_MAX_IMPACT_DEPTH | Search depth for blast-radius analysis | 2 |
CRG_MAX_BFS_DEPTH | Maximum depth for graph traversal | 15 |
CRG_MAX_CHANGED_FUNCS | Maximum changed functions analysed in one change report | 500 |
CRG_MAX_DELETION_FILES | Maximum files whose old version is read in one change report, to name the functions and classes a diff deleted | 100 |
CRG_MAX_CHANGED_YAML_PATHS | Maximum changed YAML paths analysed in one change report, and separately the same number of JSON paths | 200 |
CRG_MAX_TRANSITIVE_FRONTIER | Maximum callees followed per hop when tests_for and detect-changes look for tests. The first by name are kept, so one graph always gives one answer | 50 |
CRG_CALLER_TEST_ROUTE_DEPTH | Hops to walk up incoming CALLS when looking for a tested caller of an untested changed symbol. Reported as a note, never as coverage | 2 |
CRG_CALLER_TEST_ROUTE_MAX_CALLERS | Maximum callers examined while looking for that tested caller | 500 |
CRG_TOOL_TIMEOUT | Timeout in seconds for read-only MCP tools (0 disables). Does not bound the tools that write: build, postprocess, embed, wiki and apply-refactor | 0 |
CRG_CHURN_WINDOW_DAYS | Window for detect-changes --churn commit counts | 90 |
CRG_CONTEXT_HISTORY | Set to 1 to keep a local log of each context_savings estimate in .code-review-graph/context-history.jsonl; read it with code-review-graph context-history. Holds token counts, tool names, a timestamp, a detail level and file and depth counts, never file names, paths or source text, and is never sent anywhere | - |
CRG_LEIDEN_SEED | Seed for Leiden community detection | 42 |
CRG_RECURSE_SUBMODULES | Include git submodules when set to 1, true or yes | - |
CRG_FOLLOW_SYMLINKS | Follow symlinked folders, inside or outside the repository, when set to 1, true, yes or on; same as --follow-symlinks. See Symlinked folders | - |
CRG_MAX_FOLLOWED_FILES | Most files taken through followed symlinked folders | 10000 |
CRG_TOOLS | Comma-separated allowlist of MCP tools to expose when serving | - |
GOOGLE_API_KEY | API key for Google Gemini embeddings | - |
MINIMAX_API_KEY | API key for MiniMax embeddings | - |
VOYAGE_API_KEY | API key for Voyage embeddings | - |
CRG_VOYAGE_MODEL | Model for Voyage embeddings | voyage-code-3 |
CRG_VOYAGE_OUTPUT_DIMENSION | Output dimension for Voyage embeddings | 1024 |
CRG_VOYAGE_OUTPUT_DTYPE | Output dtype for Voyage embeddings | float |
CRG_VOYAGE_BASE_URL | Voyage embeddings endpoint | https://api.voyageai.com/v1 |
CRG_VOYAGE_BATCH_SIZE | Batch size for Voyage requests | 100 |
CRG_VOYAGE_MIN_INTERVAL_SEC | Minimum delay between Voyage requests | 0 |
CRG_OPENAI_BASE_URL | OpenAI-compatible embeddings endpoint | - |
CRG_OPENAI_API_KEY | API key for OpenAI-compatible embeddings | - |
CRG_OPENAI_MODEL | Model for OpenAI-compatible embeddings | - |
CRG_OPENAI_DIMENSION | Pin the embedding dimension (v3 models support reduction) | - |
CRG_OPENAI_BATCH_SIZE | Batch size for OpenAI-compatible requests | 100 |
NO_COLOR | Disable ANSI colours in the terminal | - |
CRG_SERIAL_PARSE | Set to 1 to disable parallel parsing (for debugging) | - |
CRG_ENABLE_ENRICHMENT | Set to 1 to resolve Python method calls with Jedi on every build and update (needs the enrichment extra; about a second more per Python file). Same as build --enrich | off |
CRG_DISABLE_ENRICHMENT | Set to 1 to never run Jedi, even when asked for | - |
OpenAI-compatible embeddings need no extra install. Set the variables and pass provider="openai" to embed_graph:
export CRG_OPENAI_BASE_URL=http://127.0.0.1:3000/v1 # or https://api.openai.com/v1
export CRG_OPENAI_API_KEY=sk-...
export CRG_OPENAI_MODEL=text-embedding-3-small # whatever your gateway serves
# optional:
export CRG_OPENAI_DIMENSION=1536 # pin dim (v3 models support reduction)
export CRG_OPENAI_BATCH_SIZE=100 # lower for gateways with tight limitsThe cloud-egress warning is skipped when the base URL points at localhost (127.0.0.1, localhost, 0.0.0.0, ::1).
Voyage embeddings need no extra install. Set VOYAGE_API_KEY and pass provider="voyage" to embed_graph; the default model is voyage-code-3:
export VOYAGE_API_KEY=pa-...
export CRG_ACCEPT_CLOUD_EMBEDDINGS=1
code-review-graph embed --provider voyage --model voyage-code-3Model selection. Avoid
-preview,-betaor-expmodel IDs for an index you plan to keep; preview models can change weights (a different dimension forces a full re-embed) or be withdrawn. Prefer GA releases such astext-embedding-3-small/text-embedding-3-large(OpenAI) orgemini-embedding-001(native Gemini provider, which needsGOOGLE_API_KEY).The embedding text is identifiers, signatures, structural context, and a bounded first-paragraph docstring or doc-comment summary. Function bodies are not sent. Graphs created before documentation extraction was added need one full
code-review-graph buildbefore re-embedding. Routine builds never refresh embeddings; to refresh after a build, pass both--embedding-providerand--embedding-model. Cloud providers receive this source-derived text and may charge for it.
Tool Filtering
CRG exposes 30 MCP tools by default. To limit the server to a subset, use --tools or the CRG_TOOLS environment variable:
# CLI flag
code-review-graph serve --tools query_graph_tool,semantic_search_nodes_tool,detect_changes_tool
# Environment variable
CRG_TOOLS=query_graph_tool,semantic_search_nodes_tool code-review-graph serveThe flag takes precedence over the variable. When neither is set, all tools are available. In an MCP client config:
{
"mcpServers": {
"code-review-graph": {
"command": "code-review-graph",
"args": ["serve", "--tools", "query_graph_tool,semantic_search_nodes_tool,detect_changes_tool,get_review_context_tool"]
}
}
}</details>
FAQ and comparisons
Answers in docs/FAQ.md:
<details> <summary><strong>How it compares with LSP, RAG and grep, when not to use it, and more</strong></summary> <br>
vs LSP / language servers: one persistent cross-language graph instead of per-language daemons; LSP stays more precise per symbol.
vs RAG / embeddings: structural edges parsed from the AST, not similarity chunks; embeddings are optional and only assist search.
vs grep / agentic search: grep wins on one-hop lookups; the graph wins on multi-hop questions (impact radius, callers-of-callers, tests-for, affected flows).
When not to use it: small repos, trivial single-file diffs, one-off questions.
Does it phone home?: no telemetry; cloud embeddings are opt-in.
How do I verify it is working?:
status,detect-changes --brief,/mcp.
</details>
Troubleshooting
More cases, including Windows/WSL, are in docs/TROUBLESHOOTING.md.
pip / pipx cannot download hatchling (or Errno 9 / Bad file descriptor to PyPI)
<details> <summary><strong>How to fix it</strong></summary> <br>
Installing from a source tree (for example pipx install .) needs build dependencies from PyPI. If you see Could not find a version that satisfies the requirement hatchling after connection warnings, the Python in that terminal may not be able to open an HTTPS connection to pypi.org. This is seen most often in an editor's integrated terminal, and sometimes with a VPN, firewall or proxy.
Run the same command from a terminal outside the editor, such as Terminal.app.
Install from a checkout with uv, which uses different download machinery:
cd /path/to/code-review-graph uv tool install . --forceFor development in a clone, use
uv syncanduv run code-review-graph ....
To diagnose: python3 scripts/diagnose_pypi_connectivity.py. If it prints FAILED, the problem is the network environment, not the package name.
</details>
Windows: Invalid JSON: EOF while parsing or MCP error -32000: Connection closed
<details> <summary><strong>How to fix it</strong></summary> <br>
Do not use a cmd /c wrapper in the Claude Code config. Point ~/.claude.json at the .exe directly and set UTF-8 through the config:
"code-review-graph": {
"command": "C:\\path\\to\\your\\venv\\Scripts\\code-review-graph.exe",
"args": ["serve", "--repo", "C:\\path\\to\\your\\project"],
"env": { "PYTHONUTF8": "1" }
}</details>
Contributing
Pull requests target staging (the default branch). Changes are promoted
staging → testing → main, and releases are tagged from main. No
promotion is automatic: a person reviews and merges each one. See
CONTRIBUTING.md for the full flow.
<details> <summary><strong>Set up a development copy and run the tests</strong></summary> <br>
git clone https://github.com/tirth8205/code-review-graph.git
cd code-review-graph
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest</details>
<details> <summary><strong>Add a built-in language</strong></summary> <br>
To add a built-in language, edit code_review_graph/parser.py: add the extension to EXTENSION_TO_LANGUAGE and node type mappings to _CLASS_TYPES, _FUNCTION_TYPES, _IMPORT_TYPES and _CALL_TYPES. Include a test fixture and open a PR. For a language you only need in one repository, use languages.toml instead.
</details>
Licence
MIT. See LICENSE.
<p align="center"> <br> <a href="https://code-review-graph.com">code-review-graph.com</a><br><br> <code>pip install code-review-graph && code-review-graph install</code> </p>
README.ja-JP.md
<h1 align="center">code-review-graph</h1>
<p align="center"> <a href="https://trendshift.io/repositories/23329?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-23329" target="_blank" rel="noopener noreferrer"> <img src="https://trendshift.io/api/badge/repositories/23329" alt="tirth8205%2Fcode-review-graph | Trendshift" width="250" height="55" /> </a> </p>
<p align="center"> <strong>MCP 経由で AI コーディングツールに正確なレビュー文脈を渡す、ローカルのコード知識グラフ。</strong> </p> <p align="center"> <a href="README.md">English</a> | <a href="README.zh-CN.md">简体中文</a> | <a href="README.ja-JP.md">日本語</a> | <a href="README.ko-KR.md">한국어</a> | <a href="README.hi-IN.md">हिन्दी</a> </p>
<p align="center"> <a href="https://pypi.org/project/code-review-graph/"><img src="https://img.shields.io/pypi/v/code-review-graph?style=flat-square&color=blue" alt="PyPI"></a> <a href="https://pepy.tech/project/code-review-graph"><img src="https://img.shields.io/pepy/dt/code-review-graph?style=flat-square" alt="Downloads"></a> <a href="https://github.com/tirth8205/code-review-graph/stargazers"><img src="https://img.shields.io/github/stars/tirth8205/code-review-graph?style=flat-square" alt="Stars"></a> <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square" alt="MIT Licence"></a> <a href="https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml"><img src="https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml/badge.svg?branch=staging" alt="CI"></a> <a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.10%2B-blue.svg?style=flat-square" alt="Python 3.10+"></a> <a href="https://modelcontextprotocol.io/"><img src="https://img.shields.io/badge/MCP-compatible-green.svg?style=flat-square" alt="MCP"></a> <a href="https://code-review-graph.com"><img src="https://img.shields.io/badge/website-code--review--graph.com-blue?style=flat-square" alt="Website"></a> <a href="https://discord.gg/3p58KXqGFN"><img src="https://img.shields.io/badge/discord-join-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord"></a> </p>
<p align="center"> <a href="docs/USAGE.md">使い方</a> · <a href="docs/COMMANDS.md">コマンド</a> · <a href="docs/FAQ.md">FAQ</a> · <a href="docs/TROUBLESHOOTING.md">トラブルシューティング</a> · <a href="docs/GITHUB_ACTION.md">GitHub Action</a> · <a href="docs/REPRODUCING.md">ベンチマークの再現</a> · <a href="docs/ROADMAP.md">ロードマップ</a> </p>
<br>
AI コーディングツールは、変更をレビューするためにコードベースの大部分を読み直しがちです。code-review-graph は Tree-sitter でコードの構造マップを作り、増分で更新し続け、MCP 経由で小さな文脈を渡します。アシスタントは変更が触れるファイルだけを読みます。
<p align="center"> <img src="diagrams/diagram1_before_vs_after.png" alt="トークンの問題: flask のコーパス全体を読むと 143,594 トークン、グラフの回答は 2,196 トークン(65 分の 1)" width="85%" /> </p>
できること
コードを地図にします。 関数、クラス、インポート、呼び出し、テストが 1 つのグラフになります。
変更で壊れうるものを示します。 変更が届きうる呼び出し元、依存先、テストを、リスクスコアつきで示します。
常に最新に保ちます。 フックと watch モードが、変わったファイルだけを再解析します。
AI ツールと連携します。
installを 1 回実行すると、見つかったツールをそれぞれ設定します。手元のマシンから出ません。 SQLite ファイル 1 つで、クラウドサービスは使いません。クラウド埋め込みは明示的に有効にした場合だけです。
クイックスタート
Python 3.10+ が必要です。
pip install code-review-graph # or: pipx install code-review-graph
code-review-graph install # detect installed AI coding tools and configure each one
code-review-graph build # parse the codebase<details> <summary><strong><code>install</code> が変えるものと、先に確かめる方法</strong></summary> <br>
install は導入済みの AI コーディングツールを検出し、それぞれに MCP サーバーのエントリを書き込み、プラットフォームが対応していればフックとスキルを入れ、プラットフォームのルールファイルにグラフの説明を追加します。MCP エントリは、Poetry や uv のプロジェクト環境では poetry run または uv run を、PATH に uvx があれば uvx code-review-graph serve を、それ以外では現在の Python インタプリタを使います。install は、変更するファイルを一覧にし、指示ファイルについての質問にあなたが答えるまで、何も書き込みません。install --dry-run は各変更を差分で示し、何も書き込みません。実行後はエディタやツールを再起動してください。
install が書くファイル(.claude/ や .mcp.json など)は、チームでコミットする場合に備えて git から見えるままにしてあります。install --gitignore を付けると、その実行で作ったものを .gitignore の印付きブロックに追加します。uninstall はそのブロックを取り除きます。
Codex の場合、インストーラはさらにグローバルな code-review-graph スキルを $CODEX_HOME/skills/code-review-graph/(既定: ~/.codex/skills/code-review-graph/)に置きます。このスキルは CRG の MCP ツールを優先し、MCP が使えないときは同梱の読み取り専用 CLI に切り替えます。グラフがない、空、または古い場合でも、暗黙にビルドや更新を始めることはありません。WSL と Windows の Codex ランタイムは CODEX_HOME ディレクトリとツール一覧がそれぞれ別なので、タスクを実行するランタイムの側でインストールと更新を行ってください。
</details>
<details> <summary><strong>対応するすべてのプラットフォームと、1 つだけを設定する方法</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram8_supported_platforms.png" alt="一度のインストールで全プラットフォーム対応: Codex、Claude Code、CodeBuddy Code、Cursor、Windsurf、Zed、Continue、OpenCode、MiMo Code、Antigravity、Gemini CLI、Qwen Code、Qoder、Kiro、GitHub Copilot、GitHub Copilot CLI、Hermes Agent、DeepSeek Harness を検出" width="85%" /> </p>
1 つのプラットフォームだけを設定するには、--platform に codex、claude-code、cursor、windsurf、zed、continue、opencode、mimo、antigravity、gemini-cli、qwen、kiro、qoder、copilot、copilot-cli、codebuddy、hermes、dsh のいずれかを渡します。
code-review-graph install --platform cursor
code-review-graph install --platform codebuddy設定ファイルの場所は docs/USAGE.md にあります。Python 3.10+ が必要です。
</details>
<details> <summary><strong><code>uninstall</code> で取り除く</strong></summary> <br>
uninstall は Git または SVN の作業ツリーから CRG が書いたファイルとエントリを取り除き、ほかの MCP サーバー、フック、スキル、JSONC のコメントはそのまま残します。ツリー内のどこからでも実行できます。共有設定ファイルはアトミックに置き換えるので、書き込みに失敗しても元のファイルは壊れません。
code-review-graph uninstall --dry-run # preview only
code-review-graph uninstall # preview, confirm, apply
code-review-graph uninstall --yes # apply without prompting
code-review-graph uninstall --all-repos # also clean every registered repository
code-review-graph uninstall --keep-data # remove integrations, keep graph databases
code-review-graph uninstall --keep-user-configs --repo . # this project only</details>
install のあとは、エディタやツールを再起動してください。
そのあとプロジェクトを開き、アシスタントにこう頼みます。
Build the code review graph for this project<details> <summary><strong>ビルドにかかる時間と、一部だけのビルドの意味</strong></summary> <br>
ビルド時間はリポジトリの規模に比例します。約 3,000 ファイルのリポジトリのコールドビルドで約 40 秒でした(計測値)。その後はフックと watch モードがグラフを更新し続けます。一部のファイルの解析に失敗した場合、結果のステータスは partial になり、要約にそのファイル名が入ります。CLI は stderr に Warning: の行も出力し、それらのファイルは以前のグラフの行をそのまま保持します。
</details>
Docker または Podman で実行する
<details> <summary><strong>イメージをビルドし、自分のリポジトリで実行する</strong></summary> <br>
リポジトリのルートでイメージをビルドします。
docker build -t code-review-graph:local .解析するリポジトリのディレクトリで、次を実行します。
docker run --rm \
--user "$(id -u):$(id -g)" \
--env HOME=/tmp \
--volume "$PWD:/workspace" \
code-review-graph:local buildマウントするリポジトリには書き込み権限が必要です。
上のコマンドはホストのユーザー ID とグループ ID を使用するため、
生成される .code-review-graph/ ディレクトリの所有者は自分のユーザーになります。
これらのコマンドは、ホスト上の root 以外のユーザーで実行してください。
Podman では、同じ Dockerfile をビルドし、ユーザーマッピングを維持します。
podman build -t code-review-graph:local .
podman run --rm \
--userns=keep-id \
--env HOME=/tmp \
--volume "$PWD:/workspace" \
code-review-graph:local buildグラフはマウントしたリポジトリの .code-review-graph/ に保存され、
/workspace/app.py などのコンテナ内の絶対パスを記録します。
update と detect-changes は、同じ /workspace マウントを使って Docker または Podman で実行してください。
このグラフに対してホストで update を実行すると、"built with a different repository root"
というエラーになる場合があります。ホストのコマンドに切り替えるには、ホストで
code-review-graph build を実行し、ホストのパスでグラフを再構築してください。
保存されたグラフを確認するには、build を status に置き換えます。
イメージには Git が含まれ、デフォルトでは root 以外のユーザーで実行されます。
イメージのビルド中にグラフは生成されません。
これらの例は macOS/Linux のシェル構文を使用しています。
macOS では、実行前に Docker 互換エンジンまたは Podman 仮想マシンを起動してください。
Fedora など SELinux が有効なホストでは、マウントに :z を追加してください("$PWD:/workspace:z")。追加しないと、コンテナはリポジトリにアクセスできません。
</details>
仕組み
リポジトリは Tree-sitter で AST に解析され、ノード(関数、クラス、インポート)とエッジ(呼び出し、継承、テストカバレッジ)のグラフとして保存されます。レビュー時には、アシスタントが読むべき最小のファイル集合をグラフに問い合わせます。
<details> <summary><strong>2 つの図: アシスタントがグラフを使う流れと、ビルドのパイプライン</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram7_mcp_integration_flow.png" alt="アシスタントがグラフを使う流れ: ユーザーがレビューを依頼し、アシスタントが MCP ツールを呼び、グラフが影響範囲とリスクスコアを返し、アシスタントは影響のあるファイルだけを読む" width="80%" /> </p>
<p align="center"> <img src="diagrams/diagram2_architecture_pipeline.png" alt="アーキテクチャのパイプライン: リポジトリ → Tree-sitter パーサー → SQLite グラフ → 影響範囲 → 最小レビュー集合" width="100%" /> </p>
</details>
影響範囲の分析
<details> <summary><strong>変更が影響しうる呼び出し元、依存先、テストのすべて</strong></summary> <br>
ファイルが変更されると、グラフは影響を受けうる呼び出し元、依存先、テストをすべて辿ります。アシスタントはプロジェクト全体を走査せず、それらのファイルを読みます。
<p align="center"> <img src="diagrams/diagram3_blast_radius.png" alt="影響範囲: login() の変更が呼び出し元、依存先、テストへ波及する" width="70%" /> </p>
</details>
増分更新
<details> <summary><strong>変更したファイルだけを再解析(2 ファイルの編集で約 2.5 秒)</strong></summary> <br>
エディタのフック、git のフック(pre-commit、post-checkout、post-merge、post-rewrite)、watch モードが増分更新を起動します。更新では変更ファイルの差分を取り、グラフのインポートエッジと呼び出しエッジから依存先を見つけ、SHA-256 ハッシュが変わったファイルだけを再解析します。約 3,000 ファイルのプロジェクト(django)では、2 ファイルの編集がフックの経路で約 2.5 秒で再インデックスされ、そのうち約 1.4 秒はプロセスの起動時間です。変更がない場合はその起動時間だけで済みます。増分更新のレイテンシを参照してください。
<p align="center"> <img src="diagrams/diagram4_incremental_update.png" alt="増分更新の流れ: フックまたは watch の更新が git diff を起動し、グラフのエッジから依存先を見つけ、SHA-256 ハッシュが変わったファイルだけを再解析する" width="90%" /> </p>
</details>
コードベース全体か、的を絞った回答か
<details> <summary><strong>コードベース全体ではなく、質問に合わせて切り出したグラフの一部</strong></summary> <br>
グラフはコーパス全体をモデルに渡す代わりに、質問に合わせて切り出した一部を返します。このリポジトリの 84bde354 における 2026-08-02 の計測では、208,821 のソーストークンが 1 質問あたり約 3,190 トークンになりました。そのスナップショット以降リポジトリは大きく育っているので、今日ではどちらの数字も大きくなっています。
<p align="center"> <img src="diagrams/diagram6_monorepo_funnel.png" alt="code-review-graph の 84bde354 スナップショット: 208,821 のソーストークンが約 3,190 トークンのグラフ応答に絞り込まれ、1 質問あたりのトークンが約 65 分の 1 になる" width="80%" /> </p>
</details>
対応言語とノートブック
<details> <summary><strong>Python、JavaScript、TypeScript、Go、Rust、Java、C/C++、C# など多数とノートブック: 全一覧</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram9_language_coverage.png" alt="カテゴリ別の言語カバレッジ: Web、バックエンド、システム、モバイル、スクリプト、シェル、ドメイン、設定、その他、加えて Jupyter と Databricks のノートブック" width="90%" /> </p>
パーサーは関数、クラス、インポート、呼び出し箇所、継承、テストを抽出します。文法がある言語では Tree-sitter を、それ以外では的を絞ったフォールバックを使います。対応: Python、JavaScript/TypeScript/TSX(.mjs、.cjs、.mts、.cts を含む)、Go、Rust、Java、C/C++、C#、VB.NET、Ruby、Kotlin(.kt、.kts)、Swift、PHP、Scala、Solidity、Dart、R、Perl、Lua/Luau、Objective-C、シェルスクリプト、Elixir、Zig、PowerShell、Julia、ReScript、GDScript、Nix、Verilog/SystemVerilog、SQL/PL/SQL(Oracle)と dbt モデル、Terraform/OpenTofu(.tf と、.hcl ファイル内の Terraform ブロック。Terraform ブロックのない .hcl ファイルはファイルノードのみ)、Ansible YAML(playbook、role、task)、Spring Boot のアプリケーション設定(application.properties、application.yml、application.yaml とその application-<profile> 版。キー名と値の型のみを記録し、値は決して記録しません)、値を含まない一般的な YAML の構造(locales/ などのフォルダにある翻訳ファイルはファイルノードのみ)、XSLT スタイルシート(.xsl、.xslt)、値を含まない JSON の構造(.json。翻訳、テスト、ドキュメント、サンプル、データのファイルはファイルノードのみで、ロックファイルは飛ばします)、Vue/Svelte の SFC、HTML ページ(.html、.htm。インラインスクリプトと、id を持つ div、section、article のブロックを DocSection ノードとして)、Astro ファイル(TypeScript の文法で解析)、Jupyter と Databricks のノートブック(.ipynb。加えて Databricks の .py エクスポート)、Perl XS ファイル(.xs)、Robot Framework のファイル(.robot、.resource)、Liquid テンプレート(.liquid)。ほかの .properties ファイルはソースコードとして扱いません。
PHP プロジェクトではさらに、リポジトリ内に閉じた Composer PSR-4 の解決、Blade テンプレートの参照、そしてソースに明示的なフレームワークのインポート、モデルの継承、レシーバの根拠が現れている場合の Laravel Route と Eloquent のエッジが得られます。routes/*.php 内の静的な Laravel ルートは、Endpoint ノードとコントローラへの HANDLES エッジを生成し、リテラルのグループプレフィックスも反映します。
Java プロジェクトでは、Spring の依存性注入による呼び出し解決、リクエストエンドポイントと WebFlux ルート、スケジュールトリガー、アプリケーションイベントの発行側からリスナーへのエッジ、Spring AOP のアドバイスから対象へのエッジ、Temporal のワークフローとアクティビティのエッジが得られます。各リゾルバは解析のあとに動き、注入されたフィールド、発行されるイベント、ワークフローのスタブがリポジトリ内で見えている必要があります。
</details>
独自の言語を追加する
<details> <summary><strong><code>languages.toml</code> でファイル拡張子を同梱の Tree-sitter 文法に対応づける</strong></summary> <br>
パーサーが未対応の言語をリポジトリで使っている場合は、.code-review-graph/ に languages.toml を置き、ファイル拡張子を tree_sitter_language_pack に同梱された任意の文法に対応づけ、関数、クラス、インポート、呼び出しのノード型を指定します。
[languages.erlang]
extensions = [".erl"]
grammar = "erlang"
function_node_types = ["function_clause"]
class_node_types = ["record_decl"]
import_node_types = ["import_attribute"]
call_node_types = ["call"]抽出は汎用の tree-sitter ウォーカーが行います。組み込み言語は上書きできません。スキーマ、検証ルール、具体例は docs/CUSTOM_LANGUAGES.md を参照してください。
</details>
CI でのリスクスコア付き PR レビュー(GitHub Action)
<details> <summary><strong>リスクスコア、影響を受けるフロー、テストの穴をまとめたプルリクエストのコメント 1 件。ワークフローの例を参照</strong></summary> <br>
同じ分析が composite の GitHub Action としても動きます。グラフはあなたの CI ランナー上で構築・照会され、ソースコードが外部サービスに送られることはありません。プルリクエストごとに、リスクスコア付きの関数、影響を受ける実行フロー、テストの穴をまとめた固定コメントを 1 件投稿し、プッシュのたびにその場で更新します。任意の fail-on-risk 入力を使うと、マージの関門にできます。任意の details 入力は、折りたたんでサイズに上限を設けた形でグラフの文脈を追加します。上位の各シンボルがそのスコアになった理由、変更が触れるコミュニティ、ハブ、境界をまたぐつながり、影響範囲、テストのないホットスポット、そしてグラフの出どころです。
# .github/workflows/code-review-graph.yml
on:
pull_request:
permissions:
contents: read
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: tirth8205/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}入力、リスクレベル、キャッシュについては docs/GITHUB_ACTION.md を、このリポジトリ自身に対して動かしているワークフローは .github/workflows/pr-review.yml を参照してください。
</details>
ベンチマーク
6 リポジトリにおける 1 質問あたりのトークン削減の中央値は約 63 倍です(コーパス全体のベースライン対グラフ照会)。358 倍という最大値は 1 つのリポジトリ(fastapi、最大のコーパス)のもので、典型的な結果ではありません。
<details> <summary><strong>ベンチマークの一覧図と、数字の出し方</strong></summary> <br>
<p align="center"> <img src="diagrams/diagram5_benchmark_board.png" alt="6 リポジトリのベンチマーク: 1 質問あたりのトークン削減の中央値は約 63 倍(最大 358 倍)、グラフ由来の正解に対する影響分析の平均 F1 は 0.69" width="85%" /> </p>
数字はすべて、6 つのオープンソースリポジトリ(13 コミット)に対する評価ランナーの出力です。各設定は上流の SHA を固定し、Leiden は固定シードで動き、埋め込みは CPU 上で決定的なので、別のマシンで 2 回実行しても同じ数字になります。再現手順は docs/REPRODUCING.md にあります。最小の 2 設定に対する週次のレポート専用実行は .github/workflows/eval.yml にあります。
</details>
<details> <summary><strong>トークン効率: 1 質問あたりの削減は中央値で約 63 倍(範囲は 35 倍から 358 倍。コーパス全体対グラフ照会)</strong></summary> <br>
典型的なエージェントの質問("how does authentication work"、"what is the main entry point" など)に対して、グラフはすべてのソースファイルではなく、検索ヒットと近傍エッジからなる約 2,200 から 3,900 トークンを返します。表は code_review_graph/token_benchmark.py で定義された 5 つのサンプル質問を平均したものです。
| リポジトリ | スナップショット SHA | naive_corpus_tokens | avg graph_tokens | 削減率 |
|---|---|---|---|---|
| fastapi | 22381558 | 948,793 | 2,653 | 357.6x |
| flask | a29f88ce | 143,594 | 2,196 | 65.4x |
| code-review-graph | 84bde354 | 208,821 | 3,190 | 65.5x |
| gin | 5c00df8a | 166,868 | 2,766 | 60.3x |
| httpx | b55d4635 | 142,356 | 2,661 | 53.5x |
| express | b4ab7d65 | 136,052 | 3,936 | 34.6x |
2026-08-02 に、固定した SHA のクリーンなクローンから取得しました(crg 2.3.7、ローカルの
all-MiniLM-L6-v2埋め込み)。これらの数字は、置き換えた 2026-05-25 の計測より低くなっています。ノードの埋め込みテキストが充実したため、どのリポジトリでもavg graph_tokensが増えました。fastapi は引退した0227991aではなく、現在のピン22381558で計測しています。削減率の列は
naive_corpus_tokens / avg graph_tokensなので、隣の 2 列から割り算で求まります。ベンチマーク自身のaverage_reduction_ratioは質問ごとの比率を平均したもので、必ずこれより大きな値になります。質問ごとの数字はdocs/REPRODUCING.mdにあります。
code-review-graphの行はスナップショットであり、現在の計測値ではありません。84bde354以降リポジトリは大きくなっており、コーパスもグラフも今日ではかなり大きくなっています。
コーパス全体のベースラインは、実際のエージェントが払うことのない上限です。エージェントは識別子を grep して、いちばん合致するファイルを読みます。agent_baseline の評価ベンチマークはその場合を測ります(純 Python でコーパスを grep し、一致数の多い上位 3 ファイルを取り、グラフ照会のコストとトークン数を比較)。この現実的なベースラインに対する中央値は、6 リポジトリ 18 問で 6.65x です(平均 14.8x、範囲 4.2x〜72.6x)。2026-09-22 の計測は、検索とこのベースラインがテストファイルの順位を下げるようになる前のものです。計測し直すまで、code-review-graph eval --benchmark agent_baseline --embed の結果はこの数字と一致しません。完全な表は docs/REPRODUCING.md の「Canonical capture, 2026-09-22」にあります。
この比はリポジトリの規模に追随します。グラフの応答は一定のまま(今回計測したすべてのリポジトリで 2,432〜4,021 トークン)である一方、grep のベースラインはコーパスとともに増えるためです。express では 4.5x、fastapi では 52x でした。どちらの数字も検索のコスト、つまり答えを見つけるのに必要なトークンを測っています。グラフが示したファイルをエージェントがそのうえで開くなら、グラフの分は置き換えではなく上乗せになります。semantic_search_nodes_tool(include_source=True) は位置とともにコードを返すのでその必要がなくなりますが、この経路を端から端まで計測することは今後の課題です。
正式な token_efficiency ベンチマークは別の状況を測ります。コミットの変更ファイルの中身だけに対して get_review_context() の JSON 全体を比較するもので、応答には影響範囲のエッジとソース断片が入るため、小さなコミットでは比率が 1 を下回ります。2 つのベンチマークは別の問いに答えています。docs/REPRODUCING.md を参照してください。
レビューと影響分析のツールは、応答に小さな context_savings の推定値を付けます。CLI は同じ数字を Token Savings パネルに表示し(後述の使い方を参照)、--verify は OpenAI の cl100k_base トークナイザと突き合わせます。222 のサンプルファイルでの較正では、集計値で見た推定値は実トークンとの差が約 1% 以内でした(データ)。
</details>
<details> <summary><strong>影響分析の精度: グラフ由来の正解に対する平均 F1 は 0.69(再現率 1.0 は循環した上限)</strong></summary> <br>
影響範囲の分析は、評価対象の 13 コミットすべてで正解のファイルをすべて拾いました。これは「再現率 100%」ではなく上限として読んでください。正解(変更ファイルと、そこへ呼び出しエッジやインポートエッジを持つファイル)は、予測器が辿るのと同じグラフから作られています。適合率が低いのは意図的です。余分に 1 ファイル挙げるコストは、壊れた依存を見落とすコストより小さいからです。
| リポジトリ | コミット数 | 平均 F1 | 平均適合率 | 再現率(グラフ由来の上限) |
|---|---|---|---|---|
| httpx | 2 | 0.863 | 0.785 | 1.0 |
| code-review-graph | 2 | 0.734 | 0.584 | 1.0 |
| fastapi | 2 | 0.697 | 0.539 | 1.0 |
| express | 2 | 0.667 | 0.500 | 1.0 |
| flask | 2 | 0.633 | 0.485 | 1.0 |
| gin | 3 | 0.609 | 0.439 | 1.0 |
| 平均 | 13 | 0.693 | 0.546 | 1.000 |
この表は 2026-08-02 の計測で、後述するパスの修正より前に取ったものです。そのバグはグラフ由来の正解からも本来の近傍ファイルを落としていたため、ベンチマークを再実行するとこれらの数字は変わります。
このベンチマークは共変更モードでも動きます。予測器に変更ファイルを 1 つ与え、同じコミットで作者が触れたほかのファイルで採点するもので、根拠はグラフではなく git の履歴です。どちらのモードも結果 CSV に出ます(ground_truth_mode 列)。2026-08-02 の計測では、共変更モードは採点対象のどのコミットでも predicted_files = 0 を返しました。コードのシード(たとえば code_review_graph/cli.py や gin の context.go)でも同じです。原因はベンチマークのパスのバグでした。git diff はリポジトリからの相対パスを返し、グラフは絶対パスを保存するため、シードがどのノードとも一致しなかったのです。このバグは修正済みですが、ベンチマークはまだ再実行していないので、共変更の数字は引用していません。
</details>
<details> <summary><strong>ビルド統計</strong></summary> <br>
上記の固定 SHA における、同じ 2026-08-02 のクリーンビルドから取りました。File ノードは埋め込まないため、埋め込み数はノード数より少なくなります。code-review-graph の行はそのスナップショットであり、今のリポジトリの姿ではありません。
| リポジトリ | ノード | エッジ | 埋め込み |
|---|---|---|---|
| fastapi | 6,287 | 32,036 | 5,159 |
| express | 1,990 | 19,492 | 1,849 |
| gin | 1,589 | 17,237 | 1,491 |
| code-review-graph | 1,446 | 9,094 | 1,354 |
| flask | 1,415 | 8,259 | 1,329 |
| httpx | 1,263 | 8,236 | 1,193 |
</details>
制限
<details> <summary><strong>既知の 5 つの制限: 循環した再現率、小さな編集、検索の順位付け、フロー検出、偽陽性</strong></summary> <br>
影響分析の「再現率 1.0」は循環している。 過去の正解は予測器が辿るのと同じグラフのエッジから作られているので、構造上それは上限です。共変更の数字は、パスの修正を入れてベンチマークを再実行するまで引用しません。
小さな単一ファイルの変更。 ささいな編集では、グラフの文脈のほうが素のファイル読み込みより大きくなることがあります。その差は、複数ファイルの分析を可能にしている構造メタデータです。
検索の順位付け。 キーワード検索はたいてい正しい結果を上位に出しますが、順位付けには改善が必要です。モジュールパターンの命名のため、Express への問い合わせはヒットなしになることがあります。
フロー検出。 エントリポイントの検出は Python と PHP/Laravel で最も強力です。JavaScript と Go のフロー検出には改善が必要です。
適合率と再現率。 影響分析は保守的です。影響を受けうるファイルを挙げるため、大きな依存グラフでは偽陽性が出ます。
</details>
機能
更新、影響分析、検索、可視化、CI でのレビュー、リファクタリング、マルチリポジトリ対応。すべて手元のマシンで完結します。
<details> <summary><strong>機能の一覧表</strong></summary> <br>
| 機能 | 内容 |
|---|---|
| 増分更新 | ハッシュが変わったファイルだけを再解析します。約 3,000 ファイルのリポジトリでは、2 ファイルの編集がフックの経路で約 2.5 秒です(計測値)。 |
| 言語とノートブックの対応 | 上記の対応言語を参照。 |
| フレームワークを理解する PHP 解析 | リポジトリ内に閉じた Composer PSR-4 のインポート、Blade テンプレートの参照、根拠に基づく Laravel Route からコントローラへのエッジと Eloquent のリレーションのエッジ |
| フレームワークを理解する Java 解析 | Spring の依存性注入による呼び出し解決、リクエストエンドポイントと WebFlux ルート、スケジュールトリガー、アプリケーションイベントの発行側からリスナーへのエッジ、Spring AOP のアドバイスのエッジ、Temporal のワークフローとアクティビティのエッジ、そして値を含めずにインデックスする Spring Boot の設定キー |
| 影響範囲の分析 | 変更によって影響を受けそうな関数、クラス、ファイル |
| 自動更新フック | エディタのフック、git のフック(コミットの前と、チェックアウト、マージ、リベースの後)、watch モードが作業中にグラフを更新 |
| セマンティック検索 | 任意のベクトル埋め込み。sentence-transformers、Google Gemini、MiniMax、Voyage AI、あるいは任意の OpenAI 互換エンドポイント |
| 対話的な可視化 | D3.js の力学モデルグラフ。検索、コミュニティ凡例の切り替え、次数に応じたノードサイズ。加えて、シンボル、ファイル、フロー、変更を起点にした近傍ビュー |
| ハブとブリッジの検出 | 最も多く接続されたノードとボトルネック(媒介中心性) |
| 意外度スコア | 想定外の結合: コミュニティをまたぐ、言語をまたぐ、周辺からハブへのエッジ |
| 知識のギャップ分析 | 孤立ノード、テストのないホットスポット、薄いコミュニティ、インポートの循環 |
| 推奨質問 | ブリッジ、ハブ、意外な結合から生成したレビュー用の質問 |
| エッジの信頼度 | 4 段階(EXTRACTED、INFERRED、AMBIGUOUS、UNRESOLVED)とエッジ上の浮動小数点スコア。グラフが結び付けられなかった呼び出しはそうと分かる |
| グラフ探索 | 任意のノードからの BFS/DFS。深さとトークン予算を設定可能。path_to はあるシンボルが別のシンボルにどう到達するかを示し、最も弱いホップを挙げる |
| エクスポート形式 | GraphML、Neo4j Cypher、Obsidian vault、JSON、そして SVG(SVG には eval エクストラの matplotlib が必要) |
| トークンのベンチマーク | code_review_graph/token_benchmark.py が、質問ごとにコーパス全体のトークンとグラフ照会のトークンを計測 |
| 文脈削減量の推定 | レビュー、影響分析、detect-changes、アーキテクチャの応答に付く context_savings メタデータ(estimated、saved_tokens、saved_percent) |
| コミュニティの自動分割 | グラフの 25% を超えるコミュニティを Leiden で再帰的に分割 |
| 実行フロー | エントリポイントからの呼び出し連鎖を、重み付けした重要度で並べ替え |
| コミュニティ検出 | グラフ規模に応じて解像度を調整する Leiden クラスタリング |
| アーキテクチャ概要 | コミュニティ構造に基づくアーキテクチャ図と結合の警告 |
| リスクスコア付きレビュー | detect_changes が差分を、影響を受ける関数、YAML と JSON のパス、フロー、テストの穴に対応づけ |
| カスタム言語 | .code-review-graph/languages.toml で新しい言語を追加。フォーク不要 |
| GitHub Action | CI でのリスクスコア付き PR レビューの固定コメント。任意の fail-on-risk マージ関門つき |
| リファクタリング支援 | リネームのプレビュー、フレームワークを理解するデッドコード検出、コミュニティに基づく提案 |
| Wiki 生成 | コミュニティ構造から Markdown の Wiki を生成 |
| マルチリポジトリのレジストリ | 複数のリポジトリを登録し、横断して検索 |
| マルチリポジトリのデーモン | crg-daemon が複数のリポジトリを子プロセスで監視。ヘルスチェックと再起動つき |
| MCP プロンプト | 5 つのワークフローテンプレート: レビュー、アーキテクチャ、デバッグ、オンボーディング、マージ前チェック |
| 全文検索 | キーワードとベクトル類似度を組み合わせた FTS5 のハイブリッド検索 |
| ローカル保存 | .code-review-graph/ の SQLite ファイル 1 つ。外部データベースもクラウドサービスも不要 |
</details>
使い方
グラフを構築すれば、アシスタントは自分でそれを使います。スキル、コマンド、MCP ツール、設定については、下の各項目を開いてください。
<details> <summary><strong>スキル</strong></summary> <br>
install は、スキルに対応したプラットフォーム(Claude Code、Gemini CLI、CodeBuddy Code、Hermes Agent、Qoder)向けに次の 4 つのスキルを書き込みます。名前で呼び出してください。
| スキル | 内容 |
|---|---|
explore-codebase | 知識グラフを使ってコードベースの構造を辿り、理解する |
review-changes | 変更検出と影響分析で、構造化したコードレビューを行う |
debug-issue | グラフによるコード探索で、体系的に不具合を追う |
refactor-safely | 依存関係の分析で、安全なリファクタリングを計画して実行する |
Qoder にはさらに、このリポジトリの skills/ ディレクトリから build-graph、review-delta、review-pr が入ります。
</details>
<details> <summary><strong>CLI リファレンス</strong></summary> <br>
code-review-graph install # Detect and configure all platforms
code-review-graph install --platform <name> # One platform
code-review-graph install --steering # Claude Code: graph context beside each search and read
code-review-graph uninstall --dry-run # Preview removal of installed artifacts
code-review-graph build # Parse the whole codebase
code-review-graph build --follow-symlinks # Also index symlinked folders
code-review-graph update # Incremental update (changed files only)
code-review-graph status # Graph statistics
code-review-graph watch # Update on file changes
code-review-graph forget <path> # Drop already-parsed files from the graph
code-review-graph dead-code # Functions and classes with no callers or tests
code-review-graph query path_to <from> --to <to> # How one symbol reaches another
code-review-graph impact --detail-level compact # Blast radius as ranked file paths
code-review-graph visualize # Interactive HTML graph
code-review-graph visualize --seed-symbol <name> # Neighbourhood of one symbol
code-review-graph visualize --format json # Export graph data as JSON
code-review-graph visualize --format graphml # Export as GraphML
code-review-graph visualize --format svg # Export as SVG (needs matplotlib)
code-review-graph visualize --format obsidian # Export as Obsidian vault
code-review-graph visualize --format cypher # Export as Neo4j Cypher
code-review-graph wiki # Markdown wiki from communities
code-review-graph detect-changes --brief # Risk panel + token savings (read-only)
code-review-graph detect-changes --brief --base main # Against the merge base of main and HEAD
code-review-graph update --brief # Refresh graph + same panel
code-review-graph detect-changes --brief --verify # Cross-check against tiktoken
code-review-graph detect-changes --details all # Add graph context to the JSON
code-review-graph context-history # Trend of the opt-in savings log (CRG_CONTEXT_HISTORY=1)
code-review-graph register <path> # Register repo in the multi-repo registry
code-review-graph unregister <path|alias> # Remove repo from the registry
code-review-graph repos # List registered repositories
code-review-graph daemon start # Start the multi-repo watch daemon
code-review-graph daemon stop # Stop the daemon
code-review-graph daemon status # Daemon status and repos
code-review-graph eval --all # Run every evaluation benchmark
code-review-graph serve # Start the MCP server (stdio)
code-review-graph serve --http # MCP over Streamable HTTP on localhost:5555
code-review-graph serve --http --multi-repo # One HTTP server for every registered repo
code-review-graph serve --multi-worktree # One child server per linked Git worktreeこれは抜粋です。code-review-graph --help がすべてのコマンドを並べ、docs/COMMANDS.md がそれぞれのフラグを説明します。
detect-changes --base にブランチ名を渡すと、差分はそのブランチと HEAD のマージベースに対して取られます。コミットハッシュやその他のリビジョンはそのまま使われます。
visualize --format svg には matplotlib が必要で、これは eval エクストラに入っています(pip install "code-review-graph[eval]")。ほかのエクスポート形式に追加インストールは要りません。
JSON のエクスポートはローカルのグラフデータディレクトリに書かれ、そのディレクトリは既定で Git の対象外です。絶対パスやコード構造のメタデータを含みうるので、公開する前に中身を確認してください。
</details>
<details> <summary><strong>Token Savings パネル: <code>detect-changes --brief</code> と <code>update --brief</code></strong></summary> <br>
どちらのコマンドも、変更ファイルをそのままエージェントに渡す場合と比べてグラフがどれだけトークンを節約したかを示す同じパネルを表示します。違いは 1 点だけ、先にグラフを更新するかどうかです。
┌─────────────────────── Token Savings ────────────────────────┐
│ Full context would be: 12,921 tokens │
│ Graph context used: 762 tokens │
│ Saved: 12,159 tokens (~94%) │
│ Breakdown: Functions 244 · Tests 191 · Risk 244 · Other 83 │
└──────────────────────────────────────────────────────────────┘| コマンド | 動作 | 使いどころ |
|---|---|---|
detect-changes --brief | 読み取り専用。現在の変更について既存のグラフに問い合わせ、パネルを表示します。 | ふだんはこちら。フックや crg-daemon がグラフを新しく保ちます。 |
update --brief | 先に変更ファイルをグラフへ再解析してから、同じパネルを表示します。 | リベース後、変更が大きいとき、グラフが古いかもしれないとき。 |
どちらのコマンドにも --verify を付けると、数字を OpenAI の cl100k_base トークナイザと比べられます(pip install tiktoken が必要)。集計値で見た推定値は実トークンとの差が約 1% 以内です。docs/REPRODUCING.md を参照してください。
同じ context_savings メタデータは、get_impact_radius、get_review_context、detect_changes、get_architecture_overview の各 MCP ツールの JSON 応答にも付きます。
推定値の推移を見るには CRG_CONTEXT_HISTORY=1 を設定します(既定ではオフ)。推定値ごとに graph.db の隣のローカルログへ 1 行追加されます。内容はトークン数、ツール名、タイムスタンプ、詳細レベル、ファイル数と深さで、ファイル名、パス、ソースコードは含みません。code-review-graph context-history で日別またはツール別に表示できます。docs/USAGE.md を参照してください。
</details>
<details> <summary><strong>マルチリポジトリのデーモン</strong></summary> <br>
install がエディタにフックを入れない場合(Windsurf や Zed など)や、エディタ連携なしでグラフを新しく保ちたい場合は、デーモンがリポジトリを監視してグラフを更新します。code-review-graph に同梱されているので、別途インストールは要りません。
# 1. Register the repos to watch
crg-daemon add ~/project-a --alias proj-a
crg-daemon add ~/project-b
# 2. Start the daemon (runs in the background)
crg-daemon start
# 3. Check on it
crg-daemon status # daemon and per-repo watcher status
crg-daemon logs --repo proj-a -f # tail logs for one repo
crg-daemon stop # stop the daemon and all watcherscode-review-graph daemon start|stop|status|... としても使えます。
crg-daemon add は ~/.code-review-graph/watch.toml に書き込みます。このファイルは直接編集してもかまいません。
[[repos]]
path = "/home/user/project-a"
alias = "proj-a"
[[repos]]
path = "/home/user/project-b"
alias = "project-b"デーモンはこのファイルを監視し、リポジトリの追加や削除に応じて watcher のプロセスを起動・停止します。30 秒ごとのヘルスチェックが、落ちた watcher を再起動します。
設定の完全なリファレンスは docs/COMMANDS.md を参照してください。
</details>
<details> <summary><strong>30 個の MCP ツール</strong></summary> <br>
グラフを構築すると、アシスタントはこれらを使います。読むだけの 25 個のツールには readOnlyHint: true が付いているので、クライアントは確認なしで実行できます。書き込みを行う 5 個(build_or_update_graph_tool、run_postprocess_tool、embed_graph_tool、apply_refactor_tool、generate_wiki_tool)には付いていません。
| ツール | 内容 |
|---|---|
build_or_update_graph_tool | グラフの構築または増分更新 |
run_postprocess_tool | フロー検出、コミュニティ検出、FTS インデックスの再実行 |
get_minimal_context_tool | 小さな文脈(約 100 トークン)。最初にこれを呼ぶ |
get_impact_radius_tool | 変更ファイルの影響範囲。detail_level="compact" で順位付きのファイルパスを返す |
get_review_context_tool | 構造の要約つきレビュー文脈 |
query_graph_tool | 呼び出し元、呼び出し先、テスト、インポート、継承、そして 2 つのシンボル間の path_to の照会 |
traverse_graph_tool | 任意のノードからの BFS/DFS 探索。トークン予算つき |
semantic_search_nodes_tool | 名前や意味でコードの実体を検索 |
embed_graph_tool | セマンティック検索用のベクトル埋め込みを計算 |
list_graph_stats_tool | グラフの規模と健全性 |
get_docs_section_tool | ドキュメントの節を取得 |
find_large_functions_tool | 行数のしきい値を超える関数、クラス、ファイル |
list_flows_tool | 重要度順に並べた実行フロー |
get_flow_tool | 1 つの実行フロー |
get_affected_flows_tool | 変更ファイルが影響するフロー |
list_communities_tool | 検出されたコードのコミュニティ |
get_community_tool | 1 つのコミュニティ |
get_architecture_overview_tool | コミュニティ構造によるアーキテクチャ概要 |
detect_changes_tool | リスクスコア付きの変更影響分析 |
get_hub_nodes_tool | 最も多く接続されたノード |
get_bridge_nodes_tool | 媒介中心性によるボトルネック |
get_knowledge_gaps_tool | 構造上の弱点、テストのないホットスポット、インポートの循環 |
get_surprising_connections_tool | 想定外のコミュニティ間の結合 |
get_suggested_questions_tool | 分析から生成したレビュー用の質問 |
refactor_tool | リネームのプレビュー、デッドコード検出、提案 |
apply_refactor_tool | プレビュー済みのリファクタリングを適用 |
generate_wiki_tool | コミュニティから Markdown の Wiki を生成 |
get_wiki_page_tool | 1 つの Wiki ページ |
list_repos_tool | 登録済みのリポジトリ |
cross_repo_search_tool | 登録済みのリポジトリを検索。repos で対象を絞り込める |
MCP プロンプト(5 つのワークフローテンプレート):
review_changes、architecture_map、debug_issue、onboard_developer、pre_merge_check
</details>
<details> <summary><strong>設定</strong></summary> <br>
インデックスから除外したいパスがある場合は、リポジトリのルートに .code-review-graphignore を作ります。
generated/**
*.generated.ts
vendor/**
node_modules/**git リポジトリでは、ビルドは追跡されているファイルと、git が無視しない未追跡のファイルを読むので(git ls-files と git ls-files --others --exclude-standard)、gitignore されたファイルは飛ばされます。ほかのファイルを除外したいとき、あるいは git が使えないときは .code-review-graphignore を使ってください。既定の除外リストは docs/USAGE.md にあります。
任意の依存グループ:
pip install "code-review-graph[embeddings]" # Local vector embeddings (sentence-transformers)
pip install "code-review-graph[google-embeddings]" # Google Gemini embeddings
pip install "code-review-graph[communities]" # Community detection (igraph)
pip install "code-review-graph[enrichment]" # Python call resolution with Jedi (then build --enrich)
pip install "code-review-graph[eval]" # Evaluation benchmarks and SVG export (matplotlib)
pip install "code-review-graph[wiki]" # ollama client (not used by the current wiki generator)
pip install "code-review-graph[all]" # All optional dependencies環境変数
| 変数 | 内容 | 既定値 |
|---|---|---|
CRG_GIT_TIMEOUT | Git 操作のタイムアウト(秒。build / update / watch) | 30 |
CRG_DISCOVERY_TIMEOUT | レビューのツールやコマンドにファイル一覧が明示されなかったとき、変更内容を特定する各 Git コマンドのタイムアウト(秒)。超過時はエラーを返し、「変更なし」とは報告しない | 5(CRG_GIT_TIMEOUT を明示設定した場合はその値) |
CRG_DATA_DIR | グラフのデータベースと生成物を置くディレクトリ | - |
CRG_HOOK_WORKTREES | 1 にすると、生成された git フックをリンク済みの git worktree でも動かす | - |
CRG_EMBEDDING_MODEL | ローカルのベクトル埋め込みの既定モデル | all-MiniLM-L6-v2 |
CRG_ACCEPT_CLOUD_EMBEDDINGS | 1 にするとクラウド埋め込みの送信警告を抑制 | - |
CRG_ALLOW_REMOTE_CODE | trust_remote_code=True を要する HuggingFace モデルを許可 | 0 |
CRG_VECTOR_CACHE | 1 にすると、デコード済みの埋め込みベクトルをセマンティック検索の合間もメモリに保持し、クエリごとに SQLite からすべて読み直さない。代わりに RAM(キャッシュするインデックスごとに ベクトル数 × 次元数 × 4 バイト)と、キャッシュ対象のデータベースごとにプロセス終了まで開いたままの読み取り接続 1 本を使う。Windows では開いている間 graph.db を削除・置換できない | - |
CRG_MAX_IMPACT_NODES | 影響分析に含める最大ノード数 | 500 |
CRG_MAX_IMPACT_DEPTH | 影響範囲分析の探索の深さ | 2 |
CRG_MAX_BFS_DEPTH | グラフ探索の最大の深さ | 15 |
CRG_MAX_CHANGED_FUNCS | 1 回の変更レポートで分析する変更関数の最大数 | 500 |
CRG_MAX_DELETION_FILES | 差分で削除された関数とクラスを挙げるために、1 回の変更レポートで旧版を読むファイルの最大数 | 100 |
CRG_MAX_CHANGED_YAML_PATHS | 1 回の変更レポートで分析する変更 YAML パスの最大数。JSON パスにも別に同じ上限がかかる | 200 |
CRG_MAX_TRANSITIVE_FRONTIER | tests_for と detect-changes がテストを探すとき、1 ホップでたどる呼び出し先の最大数。名前順で先頭のものを残すので、同じグラフからは常に同じ答えが出る | 50 |
CRG_CALLER_TEST_ROUTE_DEPTH | テストのない変更シンボルについて、テスト済みの呼び出し元を探して CALLS を遡るホップ数。カバレッジではなく注記として報告されます | 2 |
CRG_CALLER_TEST_ROUTE_MAX_CALLERS | そのテスト済み呼び出し元を探す際に調べる呼び出し元の最大数 | 500 |
CRG_TOOL_TIMEOUT | 読み取り専用 MCP ツールのタイムアウト(秒。0 で無効)。書き込みを行うツール(build / postprocess / embed / wiki / apply-refactor)には適用されない | 0 |
CRG_CHURN_WINDOW_DAYS | detect-changes --churn のコミット数を数える期間 | 90 |
CRG_CONTEXT_HISTORY | 1 にすると、context_savings の推定値を毎回ローカルログ .code-review-graph/context-history.jsonl に記録します。code-review-graph context-history で表示します。記録するのはトークン数、ツール名、タイムスタンプ、詳細レベル、ファイル数と深さで、ファイル名、パス、ソースコードは記録せず、外部にも送信しません | - |
CRG_LEIDEN_SEED | Leiden のコミュニティ検出のシード | 42 |
CRG_RECURSE_SUBMODULES | 1、true、yes のとき git サブモジュールを含める | - |
CRG_FOLLOW_SYMLINKS | 1、true、yes、on のとき、シンボリックリンクのフォルダ(リポジトリの内外)をたどる。--follow-symlinks と同じ。シンボリックリンクのフォルダ を参照 | - |
CRG_MAX_FOLLOWED_FILES | シンボリックリンクのフォルダから取り込むファイルの上限 | 10000 |
CRG_TOOLS | サーバー起動時に公開する MCP ツールのカンマ区切り許可リスト | - |
GOOGLE_API_KEY | Google Gemini 埋め込みの API キー | - |
MINIMAX_API_KEY | MiniMax 埋め込みの API キー | - |
VOYAGE_API_KEY | Voyage 埋め込みの API キー | - |
CRG_VOYAGE_MODEL | Voyage 埋め込みのモデル | voyage-code-3 |
CRG_VOYAGE_OUTPUT_DIMENSION | Voyage 埋め込みの出力次元 | 1024 |
CRG_VOYAGE_OUTPUT_DTYPE | Voyage 埋め込みの出力 dtype | float |
CRG_VOYAGE_BASE_URL | Voyage 埋め込みのエンドポイント | https://api.voyageai.com/v1 |
CRG_VOYAGE_BATCH_SIZE | Voyage へのリクエストのバッチサイズ | 100 |
CRG_VOYAGE_MIN_INTERVAL_SEC | Voyage へのリクエストの最小間隔 | 0 |
CRG_OPENAI_BASE_URL | OpenAI 互換の埋め込みエンドポイント | - |
CRG_OPENAI_API_KEY | OpenAI 互換の埋め込みの API キー | - |
CRG_OPENAI_MODEL | OpenAI 互換の埋め込みのモデル | - |
CRG_OPENAI_DIMENSION | 埋め込みの次元を固定(v3 系モデルは次元削減に対応) | - |
CRG_OPENAI_BATCH_SIZE | OpenAI 互換のリクエストのバッチサイズ | 100 |
NO_COLOR | 端末の ANSI 色を無効化 | - |
CRG_SERIAL_PARSE | 1 にすると並列解析を無効化(デバッグ用) | - |
CRG_ENABLE_ENRICHMENT | 1 にすると毎回の build と update で Jedi により Python のメソッド呼び出しを解決(enrichment エクストラが必要、Python ファイル 1 つにつき約 1 秒増)。build --enrich と同じ | オフ |
CRG_DISABLE_ENRICHMENT | 1 にすると要求があっても Jedi を実行しない | - |
OpenAI 互換の埋め込みに追加インストールは要りません。変数を設定し、embed_graph に provider="openai" を渡します。
export CRG_OPENAI_BASE_URL=http://127.0.0.1:3000/v1 # or https://api.openai.com/v1
export CRG_OPENAI_API_KEY=sk-...
export CRG_OPENAI_MODEL=text-embedding-3-small # whatever your gateway serves
# optional:
export CRG_OPENAI_DIMENSION=1536 # pin dim (v3 models support reduction)
export CRG_OPENAI_BATCH_SIZE=100 # lower for gateways with tight limitsベース URL が localhost(127.0.0.1、localhost、0.0.0.0、::1)を指している場合、クラウド送信の警告は出ません。
Voyage の埋め込みに追加インストールは要りません。VOYAGE_API_KEY を設定し、embed_graph に provider="voyage" を渡します。既定のモデルは voyage-code-3 です。
export VOYAGE_API_KEY=pa-...
export CRG_ACCEPT_CLOUD_EMBEDDINGS=1
code-review-graph embed --provider voyage --model voyage-code-3モデルの選び方。 長く使うインデックスには
-preview、-beta、-expのモデル ID を避けてください。プレビュー版は重みが変わったり(次元が変わると全件の再埋め込みが必要)、取り下げられたりします。text-embedding-3-small/text-embedding-3-large(OpenAI)やgemini-embedding-001(GOOGLE_API_KEYが必要なネイティブの Gemini プロバイダ)といった正式リリースを選んでください。埋め込むテキストは、識別子、シグネチャ、構造上の文脈、そして長さを制限した最初の段落の docstring かドキュメントコメントの要約です。関数の本体は送りません。ドキュメント抽出の追加前に作られたグラフは、再埋め込みの前に
code-review-graph buildを一度通す必要があります。通常のビルドでは埋め込みは更新されません。ビルド後に更新するには--embedding-providerと--embedding-modelの両方を渡してください。クラウドのプロバイダはこのソース由来のテキストを受け取り、課金する場合があります。
ツールの絞り込み
CRG は既定で 30 個の MCP ツールを公開します。サーバーを一部に限定するには、--tools か CRG_TOOLS 環境変数を使います。
# CLI flag
code-review-graph serve --tools query_graph_tool,semantic_search_nodes_tool,detect_changes_tool
# Environment variable
CRG_TOOLS=query_graph_tool,semantic_search_nodes_tool code-review-graph serveフラグは環境変数より優先されます。どちらも設定しなければ、すべてのツールが使えます。MCP クライアントの設定では次のようにします。
{
"mcpServers": {
"code-review-graph": {
"command": "code-review-graph",
"args": ["serve", "--tools", "query_graph_tool,semantic_search_nodes_tool,detect_changes_tool,get_review_context_tool"]
}
}
}</details>
FAQ と比較
答えは docs/FAQ.md にあります。
<details> <summary><strong>LSP、RAG、grep との比較、使わないほうがよい場合など</strong></summary> <br>
LSP / 言語サーバーとの違い: 言語ごとのデーモンではなく、言語をまたぐ永続的なグラフが 1 つ。シンボル単位の正確さでは LSP が上。
RAG / 埋め込みとの違い: 類似度でのチャンクではなく、AST から解析した構造的なエッジ。埋め込みは任意で、検索の補助にすぎません。
grep / エージェント検索との違い: 1 ホップの探索なら grep。多ホップの問い(影響範囲、呼び出し元の呼び出し元、tests-for、影響を受けるフロー)ならグラフ。
使わないほうがよい場合: 小さなリポジトリ、ささいな単一ファイルの差分、1 回きりの質問。
外部に通信しますか?: テレメトリはありません。クラウド埋め込みは明示的に有効にした場合だけ。
動いているかどう確かめますか?:
status、detect-changes --brief、/mcp。
</details>
トラブルシューティング
Windows/WSL を含むより多くの事例は docs/TROUBLESHOOTING.md にあります。
pip / pipx が hatchling を取得できない(あるいは PyPI への Errno 9 / Bad file descriptor)
<details> <summary><strong>直し方</strong></summary> <br>
ソースツリーからのインストール(たとえば pipx install .)には、PyPI からビルド依存を取る必要があります。接続の警告のあとに Could not find a version that satisfies the requirement hatchling が出る場合、その端末の Python が pypi.org への HTTPS 接続を開けていない可能性があります。エディタの統合ターミナルで最も多く、VPN、ファイアウォール、プロキシが原因のこともあります。
エディタの外のターミナル(Terminal.app など)から同じコマンドを実行する。
ダウンロードの仕組みが異なる uv を使って、チェックアウトからインストールする。
cd /path/to/code-review-graph uv tool install . --forceクローンでの開発には
uv syncとuv run code-review-graph ...を使う。
切り分けには python3 scripts/diagnose_pypi_connectivity.py を実行します。FAILED と表示されたら、原因はパッケージ名ではなくネットワーク環境です。
</details>
Windows: Invalid JSON: EOF while parsing または MCP error -32000: Connection closed
<details> <summary><strong>直し方</strong></summary> <br>
Claude Code の設定で cmd /c によるラッパーを使わないでください。~/.claude.json から .exe を直接指し、UTF-8 は設定で渡します。
"code-review-graph": {
"command": "C:\\path\\to\\your\\venv\\Scripts\\code-review-graph.exe",
"args": ["serve", "--repo", "C:\\path\\to\\your\\project"],
"env": { "PYTHONUTF8": "1" }
}</details>
コントリビュート
プルリクエストは staging(既定のブランチ)に出してください。変更は
staging → testing → main の順に進み、リリースは main からタグを打ちます。昇格は自動では行われず、毎回人がレビューしてマージします。全体の流れは
CONTRIBUTING.md を参照してください。
<details> <summary><strong>開発用のコピーを用意してテストを実行する</strong></summary> <br>
git clone https://github.com/tirth8205/code-review-graph.git
cd code-review-graph
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest</details>
<details> <summary><strong>組み込みの言語を追加する</strong></summary> <br>
組み込みの言語を追加するには code_review_graph/parser.py を編集します。拡張子を EXTENSION_TO_LANGUAGE に、ノード型の対応を _CLASS_TYPES、_FUNCTION_TYPES、_IMPORT_TYPES、_CALL_TYPES に追加してください。テスト用のフィクスチャを添えて PR を出してください。1 つのリポジトリだけで必要な言語なら、代わりに languages.toml を使ってください。
</details>
ライセンス
MIT。LICENSE を参照してください。
<p align="center"> <br> <a href="https://code-review-graph.com">code-review-graph.com</a><br><br> <code>pip install code-review-graph && code-review-graph install</code> </p>
512 files · 480 not served here
- .beads/.gitignore (not served here)
- .beads/README.md (not served here)
- .beads/config.yaml (not served here)
- .beads/hooks/post-checkout (not served here)
- .beads/hooks/post-merge (not served here)
- .beads/hooks/pre-commit (not served here)
- .beads/hooks/pre-push (not served here)
- .beads/hooks/prepare-commit-msg (not served here)
- .beads/metadata.json (not served here)
- .gitattributes (not served here)
- .github/ISSUE_TEMPLATE/bug_report.yml (not served here)
- .github/ISSUE_TEMPLATE/config.yml (not served here)
- .github/ISSUE_TEMPLATE/feature_request.yml (not served here)
- .github/ISSUE_TEMPLATE/platform_request.yml (not served here)
- .github/PULL_REQUEST_TEMPLATE.md (not served here)
- .github/copilot-instructions.md
- .github/dependabot.yml (not served here)
- .github/requirements-minimum.txt (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/eval.yml (not served here)
- .github/workflows/pr-review-comment.yml (not served here)
- .github/workflows/pr-review.yml (not served here)
- .github/workflows/promote.yml (not served here)
- .github/workflows/promotion-gate.yml (not served here)
- .github/workflows/publish.yml (not served here)
- .gitignore (not served here)
- .mcp.json
- AGENTS.md
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- Dockerfile (not served here)
- GEMINI.md
- LICENSE
- README.hi-IN.md
- README.ja-JP.md
- README.ko-KR.md
- README.md
- README.zh-CN.md
- SECURITY.md
- action.yml (not served here)
- code-review-graph-vscode/.gitignore (not served here)
- code-review-graph-vscode/.vscodeignore (not served here)
- code-review-graph-vscode/CHANGELOG.md (not served here)
- code-review-graph-vscode/LICENSE
- code-review-graph-vscode/README.md (not served here)
- code-review-graph-vscode/esbuild.mjs (not served here)
- code-review-graph-vscode/media/icons/graph.svg (not served here)
- code-review-graph-vscode/media/icons/icon.png (not served here)
- code-review-graph-vscode/media/walkthrough/build.md (not served here)
- code-review-graph-vscode/media/walkthrough/explore.md (not served here)
- code-review-graph-vscode/media/walkthrough/install.md (not served here)
- code-review-graph-vscode/package-lock.json (not served here)
- code-review-graph-vscode/package.json (not served here)
- code-review-graph-vscode/src/backend/cli.ts (not served here)
- code-review-graph-vscode/src/backend/sqlite.ts (not served here)
- code-review-graph-vscode/src/backend/watcher.ts (not served here)
- code-review-graph-vscode/src/extension.ts (not served here)
- code-review-graph-vscode/src/features/blastRadius.ts (not served here)
- code-review-graph-vscode/src/features/cursorResolver.ts (not served here)
- code-review-graph-vscode/src/features/navigation.ts (not served here)
- code-review-graph-vscode/src/features/reviewAssistant.ts (not served here)
- code-review-graph-vscode/src/features/scmDecorations.ts (not served here)
- code-review-graph-vscode/src/features/search.ts (not served here)
- code-review-graph-vscode/src/onboarding/installer.ts (not served here)
- code-review-graph-vscode/src/onboarding/welcome.ts (not served here)
- code-review-graph-vscode/src/views/graphWebview.ts (not served here)
- code-review-graph-vscode/src/views/statusBar.ts (not served here)
- code-review-graph-vscode/src/views/treeItems.ts (not served here)
- code-review-graph-vscode/src/views/treeView.ts (not served here)
- code-review-graph-vscode/src/webview/graph.ts (not served here)
- code-review-graph-vscode/test/sqlite.test.ts (not served here)
- code-review-graph-vscode/tsconfig.json (not served here)
- code_review_graph/__init__.py (not served here)
- code_review_graph/__main__.py (not served here)
- code_review_graph/_legacy_instructions.py (not served here)
- code_review_graph/analysis.py (not served here)
- code_review_graph/aop_resolver.py (not served here)
- code_review_graph/assets/code-review-graph/SKILL.md (not served here)
- code_review_graph/assets/code-review-graph/agents/openai.yaml (not served here)
- code_review_graph/assets/code-review-graph/scripts/crg_readonly.py (not served here)
- code_review_graph/assets/d3.v7.min.js (not served here)
- code_review_graph/build_state.py (not served here)
- code_review_graph/change_details.py (not served here)
- code_review_graph/changes.py (not served here)
- code_review_graph/cli.py (not served here)
- code_review_graph/codex_skill.py (not served here)
- code_review_graph/communities.py (not served here)
- code_review_graph/config_keys.py (not served here)
- code_review_graph/constants.py (not served here)
- code_review_graph/context_history.py (not served here)
- code_review_graph/context_savings.py (not served here)
- code_review_graph/csharp_resolver.py (not served here)
- code_review_graph/custom_languages.py (not served here)
- code_review_graph/daemon.py (not served here)
- code_review_graph/daemon_cli.py (not served here)
- code_review_graph/docs/LLM-OPTIMIZED-REFERENCE.md (not served here)
- code_review_graph/dsh.py (not served here)
- code_review_graph/embeddings.py (not served here)
- code_review_graph/enrich.py (not served here)
- code_review_graph/errors.py (not served here)
- code_review_graph/eval/__init__.py (not served here)
- code_review_graph/eval/benchmarks/__init__.py (not served here)
- code_review_graph/eval/benchmarks/agent_baseline.py (not served here)
- code_review_graph/eval/benchmarks/build_performance.py (not served here)
- code_review_graph/eval/benchmarks/flow_completeness.py (not served here)
- code_review_graph/eval/benchmarks/impact_accuracy.py (not served here)
- code_review_graph/eval/benchmarks/incremental_fidelity.py (not served here)
- code_review_graph/eval/benchmarks/multi_hop_retrieval.py (not served here)
- code_review_graph/eval/benchmarks/search_quality.py (not served here)
- code_review_graph/eval/benchmarks/token_efficiency.py (not served here)
- code_review_graph/eval/configs/code-review-graph.yaml (not served here)
- code_review_graph/eval/configs/express.yaml (not served here)
- code_review_graph/eval/configs/fastapi.yaml (not served here)
- code_review_graph/eval/configs/flask.yaml (not served here)
- code_review_graph/eval/configs/gin.yaml (not served here)
- code_review_graph/eval/configs/httpx.yaml (not served here)
- code_review_graph/eval/reporter.py (not served here)
- code_review_graph/eval/runner.py (not served here)
- code_review_graph/eval/scorer.py (not served here)
- code_review_graph/eval/token_benchmark.py (not served here)
- code_review_graph/event_resolver.py (not served here)
- code_review_graph/exports.py (not served here)
- code_review_graph/flows.py (not served here)
- code_review_graph/forget.py (not served here)
- code_review_graph/graph.py (not served here)
- code_review_graph/graph_diff.py (not served here)
- code_review_graph/hcl_resolver.py (not served here)
- code_review_graph/hints.py (not served here)
- code_review_graph/hook_update.py (not served here)
- code_review_graph/http_origin_guard.py (not served here)
- code_review_graph/incremental.py (not served here)
- code_review_graph/inheritance.py (not served here)
- code_review_graph/install_gitignore.py (not served here)
- code_review_graph/install_plan.py (not served here)
- code_review_graph/jedi_resolver.py (not served here)
- code_review_graph/jsonc.py (not served here)
- code_review_graph/locking.py (not served here)
- code_review_graph/main.py (not served here)
- code_review_graph/memory.py (not served here)
- code_review_graph/migrations.py (not served here)
- code_review_graph/multi_worktree.py (not served here)
- code_review_graph/neighbourhood.py (not served here)
- code_review_graph/npm_alias_resolver.py (not served here)
- code_review_graph/parser.py (not served here)
- code_review_graph/postprocessing.py (not served here)
- code_review_graph/prompts.py (not served here)
- code_review_graph/python_resolver.py (not served here)
- code_review_graph/refactor.py (not served here)
- code_review_graph/registry.py (not served here)
- code_review_graph/rescript_resolver.py (not served here)
- code_review_graph/scoped_resolver.py (not served here)
- code_review_graph/search.py (not served here)
- code_review_graph/skills.py (not served here)
- code_review_graph/spring_resolver.py (not served here)
- code_review_graph/stdio.py (not served here)
- code_review_graph/temporal_resolver.py (not served here)
- code_review_graph/token_benchmark.py (not served here)
- code_review_graph/tools/__init__.py (not served here)
- code_review_graph/tools/_common.py (not served here)
- code_review_graph/tools/analysis_tools.py (not served here)
- code_review_graph/tools/build.py (not served here)
- code_review_graph/tools/community_tools.py (not served here)
- code_review_graph/tools/context.py (not served here)
- code_review_graph/tools/docs.py (not served here)
- code_review_graph/tools/flows_tools.py (not served here)
- code_review_graph/tools/query.py (not served here)
- code_review_graph/tools/refactor_tools.py (not served here)
- code_review_graph/tools/registry_tools.py (not served here)
- code_review_graph/tools/review.py (not served here)
- code_review_graph/tsconfig_resolver.py (not served here)
- code_review_graph/uncertainty.py (not served here)
- code_review_graph/uninstall.py (not served here)
- code_review_graph/visualization.py (not served here)
- code_review_graph/wiki.py (not served here)
- code_review_graph/workspace_resolver.py (not served here)
- diagrams/context-savings-demo.gif (not served here)
- diagrams/context-savings-demo.tape (not served here)
- diagrams/diagram1_before_vs_after.png (not served here)
- diagrams/diagram2_architecture_pipeline.png (not served here)
- diagrams/diagram3_blast_radius.png (not served here)
- diagrams/diagram4_incremental_update.png (not served here)
- diagrams/diagram5_benchmark_board.png (not served here)
- diagrams/diagram6_monorepo_funnel.png (not served here)
- diagrams/diagram7_mcp_integration_flow.png (not served here)
- diagrams/diagram8_supported_platforms.png (not served here)
- diagrams/diagram9_language_coverage.png (not served here)
- diagrams/generate_diagrams.py (not served here)
- docs/COMMANDS.md
- docs/CUSTOM_LANGUAGES.md
- docs/FAQ.md
- docs/FEATURES.md
- docs/GITHUB_ACTION.md
- docs/INDEX.md
- docs/LEGAL.md
- docs/REPRODUCING.md
- docs/ROADMAP.md
- docs/TROUBLESHOOTING.md
- docs/USAGE.md
- docs/architecture.md
- docs/schema.md
- evaluate/results/code-review-graph_agent_baseline_2026-09-22.csv (not served here)
- evaluate/results/code-review-graph_impact_accuracy_2026-08-02.csv (not served here)
- evaluate/results/code-review-graph_multi_hop_retrieval_2026-05-25.csv (not served here)
- evaluate/results/code-review-graph_token_efficiency_2026-05-25.csv (not served here)
- evaluate/results/express_agent_baseline_2026-09-22.csv (not served here)
- evaluate/results/express_impact_accuracy_2026-08-02.csv (not served here)
- evaluate/results/express_multi_hop_retrieval_2026-05-25.csv (not served here)
- evaluate/results/express_token_efficiency_2026-05-25.csv (not served here)
- evaluate/results/fastapi_agent_baseline_2026-09-22.csv (not served here)
- evaluate/results/fastapi_impact_accuracy_2026-08-02.csv (not served here)
- evaluate/results/fastapi_multi_hop_retrieval_2026-05-25.csv (not served here)
- evaluate/results/fastapi_token_efficiency_2026-05-25.csv (not served here)
- evaluate/results/flask_agent_baseline_2026-09-22.csv (not served here)
- evaluate/results/flask_impact_accuracy_2026-08-02.csv (not served here)
- evaluate/results/flask_multi_hop_retrieval_2026-05-25.csv (not served here)
- evaluate/results/flask_token_efficiency_2026-05-25.csv (not served here)
- evaluate/results/gin_agent_baseline_2026-09-22.csv (not served here)
- evaluate/results/gin_impact_accuracy_2026-08-02.csv (not served here)
- evaluate/results/gin_multi_hop_retrieval_2026-05-25.csv (not served here)
- evaluate/results/gin_token_efficiency_2026-05-25.csv (not served here)
- evaluate/results/httpx_agent_baseline_2026-09-22.csv (not served here)
- evaluate/results/httpx_impact_accuracy_2026-08-02.csv (not served here)
- evaluate/results/httpx_multi_hop_retrieval_2026-05-25.csv (not served here)
- evaluate/results/httpx_token_efficiency_2026-05-25.csv (not served here)
- hooks/hooks.json
- hooks/session-start.sh (not served here)
- pyproject.toml (not served here)
- scripts/audit_python_imports.py (not served here)
- scripts/diagnose_pypi_connectivity.py (not served here)
- scripts/generate_documentary_skills.py (not served here)
- scripts/print_minimum_dependencies.py (not served here)
- scripts/promotion_gate.py (not served here)
- scripts/render_pr_comment.py (not served here)
- scripts/smoke_google_embeddings.py (not served here)
- skills/build-graph/SKILL.md (not served here)
- skills/debug-issue/SKILL.md (not served here)
- skills/explore-codebase/SKILL.md (not served here)
- skills/refactor-safely/SKILL.md (not served here)
- skills/review-changes/SKILL.md (not served here)
- skills/review-delta/SKILL.md (not served here)
- skills/review-pr/SKILL.md (not served here)
- tests/__init__.py (not served here)
- tests/conftest.py (not served here)
- tests/corpus_baselines.json (not served here)
- tests/determinism_build_runner.py (not served here)
- tests/determinism_dump.py (not served here)
- tests/fixtures/KafkaPatterns.java (not served here)
- tests/fixtures/MarkdownMsg.tsx (not served here)
- tests/fixtures/Sample.cs (not served here)
- tests/fixtures/SampleJava.java (not served here)
- tests/fixtures/SpringDI.java (not served here)
- tests/fixtures/TemporalWorkflow.java (not served here)
- tests/fixtures/__tests__/UserService.ts (not served here)
- tests/fixtures/alias_importer.ts (not served here)
- tests/fixtures/caller_example.py (not served here)
- tests/fixtures/cpp_qt_headers/MyWidget.cpp (not served here)
- tests/fixtures/cpp_qt_headers/MyWidget.h (not served here)
- tests/fixtures/cpp_qt_headers/MyWidgetPlain.cpp (not served here)
- tests/fixtures/cpp_qt_headers/MyWidgetPlain.h (not served here)
- tests/fixtures/detect_changes_sample.json (not served here)
- tests/fixtures/graphml_xsd/SOURCE.txt (not served here)
- tests/fixtures/graphml_xsd/graphml-attributes.xsd (not served here)
- tests/fixtures/graphml_xsd/graphml-parseinfo.xsd (not served here)
- tests/fixtures/graphml_xsd/graphml-structure.xsd (not served here)
- tests/fixtures/graphml_xsd/graphml.xsd (not served here)
- tests/fixtures/graphml_xsd/xlink.xsd (not served here)
- tests/fixtures/multi_call_example.py (not served here)
- tests/fixtures/playbooks/sample_ansible_playbook.yml (not served here)
- tests/fixtures/roles/myrole/meta/main.yml (not served here)
- tests/fixtures/sample.R (not served here)
- tests/fixtures/sample.c (not served here)
- tests/fixtures/sample.cpp (not served here)
- tests/fixtures/sample.dart (not served here)
- tests/fixtures/sample.ex (not served here)
- tests/fixtures/sample.gd (not served here)
- tests/fixtures/sample.hh (not served here)
- tests/fixtures/sample.jl (not served here)
- tests/fixtures/sample.kt (not served here)
- tests/fixtures/sample.liquid (not served here)
- tests/fixtures/sample.lua (not served here)
- tests/fixtures/sample.luau (not served here)
- tests/fixtures/sample.m (not served here)
- tests/fixtures/sample.nix (not served here)
- tests/fixtures/sample.php (not served here)
- tests/fixtures/sample.pl (not served here)
- tests/fixtures/sample.rb (not served here)
- tests/fixtures/sample.res (not served here)
- tests/fixtures/sample.resi (not served here)
- tests/fixtures/sample.scala (not served here)
- tests/fixtures/sample.sh (not served here)
- tests/fixtures/sample.sol (not served here)
- tests/fixtures/sample.sql (not served here)
- tests/fixtures/sample.sv (not served here)
- tests/fixtures/sample.swift (not served here)
- tests/fixtures/sample.tf (not served here)
- tests/fixtures/sample.xs (not served here)
- tests/fixtures/sample_bun.test.ts (not served here)
- tests/fixtures/sample_callback_refs.py (not served here)
- tests/fixtures/sample_config.json (not served here)
- tests/fixtures/sample_databricks_export.py (not served here)
- tests/fixtures/sample_databricks_notebook.ipynb (not served here)
- tests/fixtures/sample_dead_guard.c (not served here)
- tests/fixtures/sample_dead_guard.go (not served here)
- tests/fixtures/sample_dead_guard.rs (not served here)
- tests/fixtures/sample_dead_guard.ts (not served here)
- tests/fixtures/sample_dead_guard_impl.rs (not served here)
- tests/fixtures/sample_go.go (not served here)
- tests/fixtures/sample_html.html (not served here)
- tests/fixtures/sample_lib.sh (not served here)
- tests/fixtures/sample_map_dispatch.py (not served here)
- tests/fixtures/sample_map_dispatch.ts (not served here)
- tests/fixtures/sample_mocha.test.ts (not served here)
- tests/fixtures/sample_module.nix (not served here)
- tests/fixtures/sample_notebook.ipynb (not served here)
- tests/fixtures/sample_plsql.sql (not served here)
- tests/fixtures/sample_python.py (not served here)
- tests/fixtures/sample_rust.rs (not served here)
- tests/fixtures/sample_typescript.ts (not served here)
- tests/fixtures/sample_vitest.test.ts (not served here)
- tests/fixtures/sample_vue.vue (not served here)
- tests/fixtures/sample_xslt.xsl (not served here)
- tests/fixtures/sample_xslt_common.xsl (not served here)
- tests/fixtures/sample_zig.zig (not served here)
- tests/fixtures/sample_zig_util.zig (not served here)
- tests/fixtures/src/lib/utils.ts (not served here)
- tests/fixtures/tasks/sample_ansible_tasks.yml (not served here)
- tests/fixtures/test_sample.R (not served here)
- tests/fixtures/test_sample.py (not served here)
- tests/fixtures/tsconfig.json (not served here)
- tests/import_audit.py (not served here)
- tests/mcp_client_compat.py (not served here)
- tests/real_repo_corpus.py (not served here)
- tests/test_action_e2e.py (not served here)
- tests/test_action_render.py (not served here)
- tests/test_affected_flows_limits.py (not served here)
- tests/test_agent_transparency.py (not served here)
- tests/test_ansible_parser.py (not served here)
- tests/test_aop_resolution_edge_cases.py (not served here)
- tests/test_aop_resolver.py (not served here)
- tests/test_build_tool_errors.py (not served here)
- tests/test_call_site_provenance.py (not served here)
- tests/test_callback_context_preservation.py (not served here)
- tests/test_change_details.py (not served here)
- tests/test_changes.py (not served here)
- tests/test_changes_path_normalization.py (not served here)
- tests/test_churn_runtime.py (not served here)
- tests/test_cjs_and_kts_extensions.py (not served here)
- tests/test_cli.py (not served here)
- tests/test_cli_install.py (not served here)
- tests/test_cli_reconciliation.py (not served here)
- tests/test_cli_stdio_encoding.py (not served here)
- tests/test_cli_surface.py (not served here)
- tests/test_cli_tool_commands.py (not served here)
- tests/test_codeql_url_substring.py (not served here)
- tests/test_codex_skill_wrapper.py (not served here)
- tests/test_commonjs_imports.py (not served here)
- tests/test_communities.py (not served here)
- tests/test_compact_impact.py (not served here)
- tests/test_composer_vendor_ignore.py (not served here)
- tests/test_concurrency_and_daemon.py (not served here)
- tests/test_conftest_gates.py (not served here)
- tests/test_context_history.py (not served here)
- tests/test_context_savings.py (not served here)
- tests/test_cpp_header_prefilter.py (not served here)
- tests/test_cpp_overload_identity.py (not served here)
- tests/test_cpp_qt_headers.py (not served here)
- tests/test_csharp_dead_code_overrides.py (not served here)
- tests/test_csharp_dotted_query_targets.py (not served here)
- tests/test_csharp_namespace_binding_edges.py (not served here)
- tests/test_csharp_namespaces.py (not served here)
- tests/test_custom_languages.py (not served here)
- tests/test_d3_asset_line_endings.py (not served here)
- tests/test_daemon.py (not served here)
- tests/test_daemon_cli_followups.py (not served here)
- tests/test_daemon_stop_confirmation.py (not served here)
- tests/test_daemon_stop_escalation.py (not served here)
- tests/test_dbt_parser.py (not served here)
- tests/test_dead_code_edge_evidence.py (not served here)
- tests/test_dead_code_query_scaling.py (not served here)
- tests/test_dependency_floors.py (not served here)
- tests/test_derived_data_fallbacks.py (not served here)
- tests/test_determinism.py (not served here)
- tests/test_diagnose_pypi_connectivity.py (not served here)
- tests/test_docstring_embeddings.py (not served here)
- tests/test_document_skills.py (not served here)
- tests/test_documentation.py (not served here)
- tests/test_dsh.py (not served here)
- tests/test_e2e_mcp_client.py (not served here)
- tests/test_e2e_real_repo.py (not served here)
- tests/test_edit_hook_follows_the_edited_file.py (not served here)
- tests/test_elixir_multi_clause.py (not served here)
- tests/test_embedding_initialization.py (not served here)
- tests/test_embedding_refresh.py (not served here)
- tests/test_embedding_refresh_skip_notice.py (not served here)
- tests/test_embeddings.py (not served here)
- tests/test_enrich.py (not served here)
- tests/test_env_config.py (not served here)
- tests/test_eval.py (not served here)
- tests/test_export_formats.py (not served here)
- tests/test_failure_reporting.py (not served here)
- tests/test_flow_source_stays_in_repo.py (not served here)
- tests/test_flows.py (not served here)
- tests/test_follow_symlinks.py (not served here)
- tests/test_forget.py (not served here)
- tests/test_forget_legacy_db.py (not served here)
- tests/test_forget_parity.py (not served here)
- tests/test_freshness_metadata.py (not served here)
- tests/test_fts_delta.py (not served here)
- tests/test_fts_sync.py (not served here)
- tests/test_genai_packaging.py (not served here)
- tests/test_generic_yaml_edge_cases.py (not served here)
- tests/test_git_hook_block_helpers.py (not served here)
- tests/test_git_hook_worktree.py (not served here)
- tests/test_git_sync_hooks.py (not served here)
- tests/test_go_embeddings.py (not served here)
- tests/test_go_imports.py (not served here)
- tests/test_go_receiver_resolution.py (not served here)
- tests/test_graph.py (not served here)
- tests/test_graph_update_contracts.py (not served here)
- tests/test_hcl_parser.py (not served here)
- tests/test_hcl_provider_aliases.py (not served here)
- tests/test_header_dead_branch_scan.py (not served here)
- tests/test_hermes_install.py (not served here)
- tests/test_hermes_yaml_preservation.py (not served here)
- tests/test_hints.py (not served here)
- tests/test_hook_update.py (not served here)
- tests/test_html_parser.py (not served here)
- tests/test_http_multi_repo.py (not served here)
- tests/test_http_origin_guard.py (not served here)
- tests/test_identity_pending_ignored.py (not served here)
- tests/test_identity_retry.py (not served here)
- tests/test_import_cycles.py (not served here)
- tests/test_import_scope.py (not served here)
- tests/test_import_target_integrity.py (not served here)
- tests/test_incremental.py (not served here)
- tests/test_incremental_dependent_derived_state.py (not served here)
- tests/test_incremental_fidelity.py (not served here)
- tests/test_incremental_flow_lifecycle.py (not served here)
- tests/test_incremental_reexport_regression.py (not served here)
- tests/test_incremental_unindexed_change_memory.py (not served here)
- tests/test_inherited_calls.py (not served here)
- tests/test_install_gitignore_block.py (not served here)
- tests/test_install_outputs_are_ignored.py (not served here)
- tests/test_install_preview.py (not served here)
- tests/test_installer_ownership.py (not served here)
- tests/test_integration_git.py (not served here)
- tests/test_integration_v2.py (not served here)
- tests/test_java_call_references.py (not served here)
- tests/test_java_name_extraction.py (not served here)
- tests/test_js_module_resolution.py (not served here)
- tests/test_js_wrapped_functions.py (not served here)
- tests/test_json_parser.py (not served here)
- tests/test_jsonc_removals.py (not served here)
- tests/test_julia_reconciliation.py (not served here)
- tests/test_jvm_implementors.py (not served here)
- tests/test_keyword_argument_callbacks.py (not served here)
- tests/test_kotlin_import_comments.py (not served here)
- tests/test_kotlin_imports.py (not served here)
- tests/test_language_reconciliation.py (not served here)
- tests/test_legacy_graph_paths.py (not served here)
- tests/test_liquid.py (not served here)
- tests/test_main.py (not served here)
- tests/test_main_lazy_tool_imports.py (not served here)
- tests/test_mcp_auto_watch.py (not served here)
- tests/test_mcp_auto_watch_startup_window.py (not served here)
- tests/test_mcp_stdio_shutdown.py (not served here)
- tests/test_mcp_surface.py (not served here)
- tests/test_mcp_watch_store_shutdown.py (not served here)
- tests/test_memory.py (not served here)
- tests/test_migrations.py (not served here)
- tests/test_missing_registered_data_dir.py (not served here)
- tests/test_multi_worktree.py (not served here)
- tests/test_multilang.py (not served here)
- tests/test_neighbourhood.py (not served here)
- tests/test_neighbourhood_bounded_reads.py (not served here)
- tests/test_neighbourhood_browser.py (not served here)
- tests/test_nested_method_identities.py (not served here)
- tests/test_nested_scope_upgrade.py (not served here)
- tests/test_notebook.py (not served here)
- tests/test_npm_alias_resolver.py (not served here)
- tests/test_opencode_v1_plugin_contract.py (not served here)
- tests/test_opencode_v2_plugin_contract.py (not served here)
- tests/test_optional_dependencies.py (not served here)
- tests/test_packaging.py (not served here)
- tests/test_parser.py (not served here)
- tests/test_parser_grammar_contract.py (not served here)
- tests/test_parser_load_probe.py (not served here)
- tests/test_php_guessed_test_links.py (not served here)
- tests/test_php_includes.py (not served here)
- tests/test_php_laravel.py (not served here)
- tests/test_php_scoped_calls.py (not served here)
- tests/test_platform_lifecycle.py (not served here)
- tests/test_postprocessing.py (not served here)
- tests/test_powershell_extraction.py (not served here)
- tests/test_pr803_poisoned_graph_recovery.py (not served here)
- tests/test_pr_review_workflows.py (not served here)
- tests/test_promotion_gate.py (not served here)
- tests/test_promotion_is_manual.py (not served here)
- tests/test_prompts.py (not served here)
- tests/test_public_tool_hints.py (not served here)
- tests/test_pure_deletion_review.py (not served here)
- tests/test_python_module_alias_shims.py (not served here)
- tests/test_python_property_reads.py (not served here)
- tests/test_python_reachability.py (not served here)
- tests/test_python_receiver_evidence.py (not served here)
- tests/test_python_receiver_shapes.py (not served here)
- tests/test_python_relative_imports.py (not served here)
- tests/test_python_star_imports.py (not served here)
Advantages
- Drastically reduces token usage by providing only the relevant code context for a specific change. evidence: README.md
- Maintains data privacy by storing the knowledge graph locally in a SQLite file without requiring cloud services. evidence: README.md
Limitations
- The graph may become stale if the background update process is interrupted or fails to detect changes. evidence: .github/copilot-instructions.md
- Requires Python 3.10+ and may need manual configuration for environments where MCP is not natively supported. evidence: README.md
Security
Risk level: Medium risk
This brain runs
MCP servers (2)
.mcp.json(code-review-graph):uvx code-review-graph serveREADME.md(code-review-graph):code-review-graph serve --tools query_graph_tool,semantic_search_nodes_tool,detect_changes_tool,get_review_context_tool
Agent instructions that run or fetch something (38)
AGENTS.md:Other commands that may prompt: `scp` and `ssh` (`-o BatchMode=yes`), `apt-get` (`-y`), `brew` (`HOMEBREW_NO_AUTO_UPDATE=1`).· uses the networkCLAUDE.md:`locking.py`: the cross-process lock that lets one graph write run at a time.CLAUDE.md:`skills.py`: `install` (platform MCP configs, hooks, skills, instruction blocks).CLAUDE.md:`install_plan.py`: every install read and write goes through it, so `install --dry-run` can show each change as a diff and a real install writes nothing before its question is answered.CLAUDE.md:`jsonc.py`: comment-preserving JSONC tokenising and splices, shared by install and uninstall so neither flattens a commented config.CLAUDE.md:`install_gitignore.py`: the opt-in `install --gitignore` block listing the files a run created.CLAUDE.md:`uninstall.py`: reverses `install`.CLAUDE.md:uv run pytest tests/ --tb=short -qCLAUDE.md:uv run ruff check code_review_graph/CLAUDE.md:uv run mypy code_review_graph/ --ignore-missing-imports --no-strict-optionalCLAUDE.md:uv run code-review-graph build # full buildCLAUDE.md:uv run code-review-graph update # incremental updateCLAUDE.md:uv run code-review-graph status # graph statisticsCLAUDE.md:uv run code-review-graph detect-changes # risk-scored change analysis (read-only)CLAUDE.md:uv run code-review-graph forget PATH # drop files from the graphCLAUDE.md:uv run code-review-graph serve # MCP server (stdio; --http for localhost)CLAUDE.md:uv run code-review-graph wiki # Markdown wikiCLAUDE.md:uv run code-review-graph register <path> # add a repo to the multi-repo registryCLAUDE.md:uv run code-review-graph eval --all # benchmarksCLAUDE.md:uv run code-review-graph --help # full command listCLAUDE.md:Install and platforms: `test_skills.py`, `test_cli_install.py`, `test_uninstall.py`, `test_git_hook_worktree.py`, `test_hermes_install.py`, `test_qoder_bundled_skills.py`, `test_installer_ownership.py` (what install may rewrite and what belongs to the user), `test_install_gitignore_blo …[+283 chars]CLAUDE.md:Builds a wheel and an sdist with `python -m build`, installs each into its own virtual environment, and drives the installed program with the checkout out of reach.CLAUDE.md:Run it before a release with `uv run --python 3.13 python -m pytest tests/test_packaging.py -m packaging`.CLAUDE.md:upgrade-path: manual run only.code_review_graph/assets/code-review-graph/SKILL.md:Resolve the active repository root from the workspace or `git rev-parse --show-toplevel`.code_review_graph/assets/code-review-graph/SKILL.md:Without MCP, run the bundled helper’s `status` command (it forwards `--json` to the CLI).code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py status --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py architecture --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py search "<query>" --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py query callers_of "<symbol>" --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py query path_to "<symbol>" --to "<other>" --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py impact --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:python3 <skill-root>/scripts/crg_readonly.py detect-changes --brief --repo "<repo-root>"code_review_graph/assets/code-review-graph/SKILL.md:A Windows-mounted path such as `/mnt/e/...` is not by itself a failure: verify that the selected runtime can execute the CLI and access that path.skills/build-graph/SKILL.md:Hooks installed by `code-review-graph install` run an update after each edit, before each commit and after a branch switch, merge or rebase, so manual builds are rarely needed.skills/review-delta/SKILL.md:Changes come from `git diff` against `HEAD~1`;skills/review-pr/SKILL.md:The graph tools read the files on disk, so check out what you review first: `git switch <branch>`, or for a PR `git fetch origin pull/<n>/head:pr-<n>` then `git switch pr-<n>`, then call `build_or_update_graph_tool()`.· uses the networkskills/review-pr/SKILL.md:Diff it against `main` (or `master`) with `git diff --name-only main...HEAD`, and use that ref as `base` below.
Hooks (3)
hooks/hooks.json(SessionStart):cat >/dev/null || true; command -v code-review-graph >/dev/null 2>&1 || exit 0; git rev-parse --git-dir >/dev/null 2>&1 && code-review-graph status --repo "$(git rev-parse --show-toplevel 2>/dev/null)" || echo 'Not a git repo, skipping'hooks/hooks.json(PostToolUse):cat >/dev/null || true; code-review-graph build >/dev/null 2>&1 &hooks/hooks.json(PostToolUse):command -v code-review-graph >/dev/null 2>&1 && code-review-graph hook-update; cat >/dev/null || true
- Medium risk: runs-mcp-server-unpinned-runner (.mcp.json)
- Medium risk: runs-instruction-instruction-network (AGENTS.md:17)
- Medium risk: runs-instruction-instruction-network (skills/review-pr/SKILL.md:13)
Attribution and licence
- Created by
- Tirth
- Declared authors
- Tirth (declared in pyproject.toml)
- Publisher
- Tirth Kanani (Community)
- Source
- tirth8205/code-review-graph · commit e7f2fb2
- Licence
- MIT License (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Tirth.
Install from source
480 of its files are not served here, so there is no ZIP. tirth8205/code-review-graph at e7f2fb2