<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Graph on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/graph/</link>
        <description>Recent content in Graph on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Mon, 20 Jul 2026 18:26:42 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/graph/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>code-review-graph</title>
        <link>https://producthunt.programnotes.cn/en/p/code-review-graph/</link>
        <pubDate>Mon, 20 Jul 2026 18:26:42 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/code-review-graph/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1515861461225-1488dfdaf0a8?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3ODQ1NDMxMzl8&amp;ixlib=rb-4.1.0" alt="Featured image of post code-review-graph" /&gt;&lt;h1 id=&#34;tirth8205code-review-graph&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/tirth8205/code-review-graph&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;tirth8205/code-review-graph&lt;/a&gt;
&lt;/h1&gt;&lt;h1 align=&#34;center&#34;&gt;code-review-graph&lt;/h1&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;strong&gt;Stop burning tokens. Start reviewing smarter.&lt;/strong&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;README.md&#34;&gt;English&lt;/a&gt; |
  &lt;a href=&#34;README.zh-CN.md&#34;&gt;简体中文&lt;/a&gt; |
  &lt;a href=&#34;README.ja-JP.md&#34;&gt;日本語&lt;/a&gt; |
  &lt;a href=&#34;README.ko-KR.md&#34;&gt;한국어&lt;/a&gt; |
  &lt;a href=&#34;README.hi-IN.md&#34;&gt;हिन्दी&lt;/a&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://pypi.org/project/code-review-graph/&#34;&gt;&lt;img src=&#34;https://img.shields.io/pypi/v/code-review-graph?style=flat-square&amp;color=blue&#34; alt=&#34;PyPI&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://pepy.tech/project/code-review-graph&#34;&gt;&lt;img src=&#34;https://img.shields.io/pepy/dt/code-review-graph?style=flat-square&#34; alt=&#34;Downloads&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/tirth8205/code-review-graph/stargazers&#34;&gt;&lt;img src=&#34;https://img.shields.io/github/stars/tirth8205/code-review-graph?style=flat-square&#34; alt=&#34;Stars&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://opensource.org/licenses/MIT&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square&#34; alt=&#34;MIT Licence&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml&#34;&gt;&lt;img src=&#34;https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml/badge.svg&#34; alt=&#34;CI&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://www.python.org/&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/python-3.10%2B-blue.svg?style=flat-square&#34; alt=&#34;Python 3.10+&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://modelcontextprotocol.io/&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/MCP-compatible-green.svg?style=flat-square&#34; alt=&#34;MCP&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://code-review-graph.com&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/website-code--review--graph.com-blue?style=flat-square&#34; alt=&#34;Website&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://discord.gg/3p58KXqGFN&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/discord-join-5865F2?style=flat-square&amp;logo=discord&amp;logoColor=white&#34; alt=&#34;Discord&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;docs/USAGE.md&#34;&gt;Usage&lt;/a&gt; ·
  &lt;a href=&#34;docs/COMMANDS.md&#34;&gt;Commands&lt;/a&gt; ·
  &lt;a href=&#34;docs/FAQ.md&#34;&gt;FAQ&lt;/a&gt; ·
  &lt;a href=&#34;docs/TROUBLESHOOTING.md&#34;&gt;Troubleshooting&lt;/a&gt; ·
  &lt;a href=&#34;docs/GITHUB_ACTION.md&#34;&gt;GitHub Action&lt;/a&gt; ·
  &lt;a href=&#34;docs/REPRODUCING.md&#34;&gt;Reproducing the benchmarks&lt;/a&gt; ·
  &lt;a href=&#34;docs/ROADMAP.md&#34;&gt;Roadmap&lt;/a&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;AI coding tools can end up re-reading large parts of your codebase on review tasks. &lt;code&gt;code-review-graph&lt;/code&gt; fixes that. It builds a structural map of your code with &lt;a class=&#34;link&#34; href=&#34;https://tree-sitter.github.io/tree-sitter/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tree-sitter&lt;/a&gt;, tracks changes incrementally, and gives your AI assistant precise context via &lt;a class=&#34;link&#34; href=&#34;https://modelcontextprotocol.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MCP&lt;/a&gt; so it reads only what matters.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram1_before_vs_after.png&#34; alt=&#34;The Token Problem: 38x to 528x token reduction across 6 real repositories&#34; width=&#34;85%&#34; /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;quick-start&#34;&gt;Quick Start
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install code-review-graph                     &lt;span class=&#34;c1&#34;&gt;# or: pipx install code-review-graph&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install          &lt;span class=&#34;c1&#34;&gt;# auto-detects and configures all supported platforms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph build            &lt;span class=&#34;c1&#34;&gt;# parse your codebase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;One command sets up everything. &lt;code&gt;install&lt;/code&gt; detects which AI coding tools you have, writes the correct MCP configuration for each one, installs platform-native hooks/skills where supported, and injects graph-aware instructions into your platform rules. It auto-detects whether you installed via &lt;code&gt;uvx&lt;/code&gt; or &lt;code&gt;pip&lt;/code&gt;/&lt;code&gt;pipx&lt;/code&gt; and generates the right config. Restart your editor/tool after installing.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram8_supported_platforms.png&#34; alt=&#34;One Install, Every Platform: auto-detects Codex, Claude Code, CodeBuddy Code, Cursor, Windsurf, Zed, Continue, OpenCode, Antigravity, Gemini CLI, Qwen, Qoder, Kiro, and GitHub Copilot&#34; width=&#34;85%&#34; /&gt;
&lt;/p&gt;
&lt;p&gt;To target a specific platform:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform codex       &lt;span class=&#34;c1&#34;&gt;# configure only Codex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform cursor      &lt;span class=&#34;c1&#34;&gt;# configure only Cursor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform claude-code  &lt;span class=&#34;c1&#34;&gt;# configure only Claude Code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform gemini-cli   &lt;span class=&#34;c1&#34;&gt;# configure only Gemini CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform kiro         &lt;span class=&#34;c1&#34;&gt;# configure only Kiro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform copilot      &lt;span class=&#34;c1&#34;&gt;# configure only GitHub Copilot (VS Code)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform copilot-cli  &lt;span class=&#34;c1&#34;&gt;# configure only GitHub Copilot CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform codebuddy    &lt;span class=&#34;c1&#34;&gt;# configure only CodeBuddy Code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Requires Python 3.10+. For the best experience, install &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uv&lt;/a&gt; (the MCP config will use &lt;code&gt;uvx&lt;/code&gt; if available, otherwise falls back to the &lt;code&gt;code-review-graph&lt;/code&gt; command directly).&lt;/p&gt;
&lt;p&gt;To remove CRG from a Git or SVN project, use the symmetric uninstall command
from anywhere inside its working tree. The target is normalized to the working
tree root, and non-repository directories are refused. It removes only
CRG-owned files and entries; unrelated MCP servers, hooks, skills, and JSONC
comments remain untouched. Shared configuration changes use atomic replacement
so a failed write leaves the original file intact.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall --dry-run    &lt;span class=&#34;c1&#34;&gt;# preview every action; write nothing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall              &lt;span class=&#34;c1&#34;&gt;# preview, ask for confirmation, then apply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall --yes        &lt;span class=&#34;c1&#34;&gt;# apply without prompting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall --all-repos  &lt;span class=&#34;c1&#34;&gt;# also clean every registered repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall --keep-data  &lt;span class=&#34;c1&#34;&gt;# remove integrations but keep graph databases&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall --keep-user-configs --repo .  &lt;span class=&#34;c1&#34;&gt;# clean this project only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then open your project and ask your AI assistant:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Build the code review graph for this project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The initial build takes ~10 seconds for a 500-file project. After that, watch mode and supported hooks can keep the graph updated automatically.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How It Works
&lt;/h2&gt;&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram7_mcp_integration_flow.png&#34; alt=&#34;How your AI assistant uses the graph: User asks for review, AI checks MCP tools, graph returns blast radius and risk scores, AI reads only what matters&#34; width=&#34;80%&#34; /&gt;
&lt;/p&gt;
&lt;p&gt;Your repository is parsed into an AST with Tree-sitter, stored as a graph of nodes (functions, classes, imports) and edges (calls, inheritance, test coverage), then queried at review time to compute the minimal set of files your AI assistant needs to read.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram2_architecture_pipeline.png&#34; alt=&#34;Architecture pipeline: Repository to Tree-sitter Parser to SQLite Graph to Blast Radius to Minimal Review Set&#34; width=&#34;100%&#34; /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;blast-radius-analysis&#34;&gt;Blast-radius analysis
&lt;/h3&gt;&lt;p&gt;When a file changes, the graph traces every caller, dependent, and test that could be affected. This is the &amp;ldquo;blast radius&amp;rdquo; of the change. Your AI reads only these files instead of scanning the whole project.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram3_blast_radius.png&#34; alt=&#34;Blast radius visualization showing how a change to login() propagates to callers, dependents, and tests&#34; width=&#34;70%&#34; /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;incremental-updates-in--2-seconds&#34;&gt;Incremental updates in &amp;lt; 2 seconds
&lt;/h3&gt;&lt;p&gt;When hooks or watch mode are enabled, file saves and supported commit hooks trigger incremental updates. The graph diffs changed files, finds their dependents via SHA-256 hash checks, and re-parses only what changed. A 2,900-file project re-indexes in under 2 seconds.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram4_incremental_update.png&#34; alt=&#34;Incremental update flow: supported hook or watch update triggers diff, finds dependents, re-parses only 5 files while 2,910 are skipped&#34; width=&#34;90%&#34; /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;the-monorepo-problem-solved&#34;&gt;The monorepo problem, solved
&lt;/h3&gt;&lt;p&gt;Large monorepos are where token waste is most painful. The graph cuts through the noise — 27,700+ files excluded from review context, only ~15 files actually read.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram6_monorepo_funnel.png&#34; alt=&#34;code-review-graph repo: 208,821 source tokens funnel down to ~2,495 token graph responses — 93x fewer tokens per question&#34; width=&#34;80%&#34; /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;broad-language-coverage--jupyter-notebooks&#34;&gt;Broad language coverage + Jupyter notebooks
&lt;/h3&gt;&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram9_language_coverage.png&#34; alt=&#34;Language coverage organized by category: Web, Backend, Systems, Mobile, Scripting, Config, plus Jupyter and Databricks notebook support&#34; width=&#34;90%&#34; /&gt;
&lt;/p&gt;
&lt;p&gt;Parser support covers functions, classes, imports, call sites, inheritance, and test detection across the current parser surface, using Tree-sitter where available and targeted fallbacks where needed. Current support includes Python, JavaScript/TypeScript/TSX, Go, Rust, Java, C/C++, C#, VB.NET, Ruby, Kotlin, Swift, PHP, Scala, Solidity, Dart, R, Perl, Lua/Luau, Objective-C, shell scripts, Elixir, Zig, PowerShell, Julia, ReScript, GDScript, Nix, Verilog/SystemVerilog, SQL, Terraform/OpenTofu structure (&lt;code&gt;.tf&lt;/code&gt;; generic &lt;code&gt;.hcl&lt;/code&gt; files are recognized as file nodes), Ansible playbooks/roles/tasks, Vue/Svelte SFCs, Astro files parsed through the TypeScript parser, Jupyter/Databricks notebooks (&lt;code&gt;.ipynb&lt;/code&gt;), and Perl XS files (&lt;code&gt;.xs&lt;/code&gt;). Generic YAML is not treated as source code.&lt;/p&gt;
&lt;p&gt;PHP projects additionally get repository-bounded Composer PSR-4 resolution,
Blade template references, and Laravel Route/Eloquent semantic edges when the
source includes explicit framework imports, model inheritance, and receiver
evidence.&lt;/p&gt;
&lt;h3 id=&#34;add-your-own-language-no-fork-needed&#34;&gt;Add your own language (no fork needed)
&lt;/h3&gt;&lt;p&gt;If your repo uses a language the parser does not cover yet, drop a &lt;code&gt;languages.toml&lt;/code&gt; into &lt;code&gt;.code-review-graph/&lt;/code&gt; mapping file extensions to any grammar bundled in &lt;code&gt;tree_sitter_language_pack&lt;/code&gt;, plus the tree-sitter node types for functions, classes, imports, and calls:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;languages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;erlang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;extensions&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.erl&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;grammar&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;erlang&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;function_node_types&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;function_clause&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;class_node_types&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;record_decl&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;import_node_types&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;import_attribute&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;call_node_types&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The generic tree-sitter walker handles extraction from there — no code changes, and built-in languages can never be overridden. See &lt;a class=&#34;link&#34; href=&#34;docs/CUSTOM_LANGUAGES.md&#34; &gt;docs/CUSTOM_LANGUAGES.md&lt;/a&gt; for the schema reference, validation rules, and a worked end-to-end example.&lt;/p&gt;
&lt;h3 id=&#34;risk-scored-pr-reviews-in-ci-github-action&#34;&gt;Risk-scored PR reviews in CI (GitHub Action)
&lt;/h3&gt;&lt;p&gt;The same analysis runs as a composite GitHub Action — and it stays local-first: the knowledge graph is built and queried entirely on your CI runner, with no source code sent to any external service. On each pull request the action posts a single sticky comment with risk-scored functions, affected execution flows, and test gaps, updated in place on every push. An optional &lt;code&gt;fail-on-risk&lt;/code&gt; input turns the review into a merge gate.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# .github/workflows/code-review-graph.yml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull_request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;permissions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull-requests&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;jobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;review&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runs-on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ubuntu-latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/checkout@v7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;tirth8205/code-review-graph@v2.3.6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;github-token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;docs/GITHUB_ACTION.md&#34; &gt;docs/GITHUB_ACTION.md&lt;/a&gt; for inputs, risk levels, and caching details, or the dogfood workflow this repo runs on itself in &lt;a class=&#34;link&#34; href=&#34;.github/workflows/pr-review.yml&#34; &gt;&lt;code&gt;.github/workflows/pr-review.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;benchmarks&#34;&gt;Benchmarks
&lt;/h2&gt;&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;diagrams/diagram5_benchmark_board.png&#34; alt=&#34;Benchmarks across 6 real repositories: ~82x median per-question token reduction (528x max), 0.71 average impact F1 against graph-derived ground truth&#34; width=&#34;85%&#34; /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Headline number: the median per-question token reduction across the 6 repos is ~82x&lt;/strong&gt; (whole-corpus baseline vs graph query). The frequently quoted &lt;strong&gt;528x is the maximum&lt;/strong&gt; — a single best-case repo (fastapi) — not the typical result.&lt;/p&gt;
&lt;p&gt;All numbers come from the automated evaluation runner against 6 real open-source repositories (13 commits total). Every config pins an upstream SHA, the Leiden community detector runs with a fixed seed, and embeddings are deterministic on CPU — so two runs on different machines produce identical numbers. The full reproduction recipe with expected outputs is in &lt;a class=&#34;link&#34; href=&#34;docs/REPRODUCING.md&#34; &gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt;. A weekly report-only run on the two smallest configs lives in &lt;a class=&#34;link&#34; href=&#34;.github/workflows/eval.yml&#34; &gt;&lt;code&gt;.github/workflows/eval.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Token efficiency: ~82x median per-question reduction (range 38x – 528x; whole-corpus vs graph query)&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;For a typical agent question (&lt;code&gt;&amp;quot;how does authentication work&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;what is the main entry point&amp;quot;&lt;/code&gt;, etc.), the graph returns ~2,000–3,500 tokens of targeted search hits + neighbor edges instead of forcing the agent to read every source file. The table below averages over the 5 sample questions defined in &lt;code&gt;code_review_graph/token_benchmark.py&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Repo&lt;/th&gt;
					&lt;th&gt;Snapshot SHA&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;naive_corpus_tokens&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;avg graph_tokens&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Reduction&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;fastapi&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0227991a&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;951,071&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2,169&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;528.4x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;code-review-graph&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;84bde354&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;208,821&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2,495&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;93.0x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gin&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;5c00df8a&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;166,868&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,990&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;91.8x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;flask&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;a29f88ce&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;125,022&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,986&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;71.4x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;express&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;b4ab7d65&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;135,955&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;3,465&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;40.6x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;httpx&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;b55d4635&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;89,492&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2,438&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;38.0x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Median per-question reduction across the 6 repos: &lt;strong&gt;~82x&lt;/strong&gt;. The range is 38x – 528x, where &lt;strong&gt;528x is the best case&lt;/strong&gt; (fastapi, the largest corpus), not the headline.&lt;/p&gt;
&lt;p&gt;The whole-corpus baseline above is an upper bound no real agent pays: a competent agent greps for identifiers and reads only the best-matching files. The &lt;code&gt;agent_baseline&lt;/code&gt; eval benchmark measures that realistic baseline — a pure-python grep over the corpus, top-3 files by match count, token-counted and compared to the graph query cost (&lt;code&gt;evaluate/results/&amp;lt;repo&amp;gt;_agent_baseline_*.csv&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The formal &lt;code&gt;eval/benchmarks/token_efficiency.py&lt;/code&gt; benchmark measures a different scenario — full &lt;code&gt;get_review_context()&lt;/code&gt; JSON versus just the changed-file content of a commit — and reports ratios below 1 for small commits, because the review-context response carries impact-radius edges plus source snippets that exceed a tiny single-file diff. That is not a bug; the two benchmarks answer different questions. See &lt;a class=&#34;link&#34; href=&#34;docs/REPRODUCING.md&#34; &gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt; for the full methodology.&lt;/p&gt;
&lt;p&gt;Since v2.3.4, review and impact tools attach a compact &lt;code&gt;context_savings&lt;/code&gt; estimate so MCP clients can see the approximate context saved per call. In v2.3.5 the CLI surfaces this as the boxed &lt;code&gt;Token Savings&lt;/code&gt; panel shown above (see &amp;ldquo;Token Savings panel&amp;rdquo; in the Usage section) and adds &lt;code&gt;--verify&lt;/code&gt; to cross-check against OpenAI&amp;rsquo;s &lt;code&gt;cl100k_base&lt;/code&gt; tokenizer. Calibration data in &lt;a class=&#34;link&#34; href=&#34;docs/REPRODUCING.md&#34; &gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt; shows the estimate is within ~1% of real GPT-4 tokens in aggregate across 222 sample files.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Impact accuracy: 0.71 average F1 against graph-derived ground truth (recall 1.0 is a circular upper bound, not &#34;100% recall&#34;)&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;Blast-radius analysis recovers every file in the ground truth on all 13 evaluation commits — &lt;strong&gt;but read that as an upper bound, not as &amp;ldquo;100% recall&amp;rdquo;&lt;/strong&gt;: in this mode the ground truth (changed files + files with call/import edges into them) is derived from the same graph the predictor traverses, so it is circular by construction. The over-prediction visible in the precision column is a deliberate trade-off: better to flag too many files than miss a broken dependency.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Repo&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Commits&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Avg F1&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Avg Precision&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Recall (graph-derived upper bound)&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;httpx&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.864&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.786&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fastapi&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.834&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.750&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;code-review-graph&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.734&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.584&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;express&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.667&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.500&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;flask&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;2&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.628&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.481&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gin&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;3&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.609&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.439&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Average&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;0.714&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;0.578&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;1.000&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The benchmark also runs an honest &lt;strong&gt;co-change mode&lt;/strong&gt;: the predictor is seeded with a single changed file and graded against the &lt;em&gt;other&lt;/em&gt; files the author actually touched in the same commit — independent-ish evidence from git history, not from the graph. Both modes appear side by side in the result CSVs (&lt;code&gt;ground_truth_mode&lt;/code&gt; column). Co-change numbers will be added to the canonical stats once captured by the eval runner; we do not quote them before measuring.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Build performance&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Repo&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Files&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Nodes&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Edges&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Flow Detection&lt;/th&gt;
					&lt;th style=&#34;text-align: right&#34;&gt;Search Latency&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;express&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;141&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,910&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;17,553&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;106ms&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.7ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fastapi&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,122&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;6,285&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;27,117&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;128ms&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1.5ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;flask&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;83&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,446&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;7,974&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;95ms&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.7ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gin&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;99&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,286&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;16,762&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;111ms&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.5ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;httpx&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;60&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;1,253&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;7,896&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;96ms&lt;/td&gt;
					&lt;td style=&#34;text-align: right&#34;&gt;0.4ms&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h3 id=&#34;limitations-and-known-weaknesses&#34;&gt;Limitations and known weaknesses
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact &amp;ldquo;recall 1.0&amp;rdquo; is graph-derived and circular:&lt;/strong&gt; the historical ground truth comes from the same graph edges the predictor walks, so it is an upper bound by construction. The honest co-change mode (grade against files actually co-changed in the same commit) is measured alongside it; expect those numbers to be substantially lower.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small single-file changes:&lt;/strong&gt; Graph context can exceed naive file reads for trivial edits (see express results above). The overhead is the structural metadata that enables multi-file analysis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search quality (MRR 0.35):&lt;/strong&gt; Keyword search finds the right result in the top-4 for most queries, but ranking needs improvement. Express queries return 0 hits due to module-pattern naming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flow detection (33% recall):&lt;/strong&gt; Framework and conventional entry patterns are strongest for Python and PHP/Laravel. JavaScript and Go flow detection needs work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Precision vs recall trade-off:&lt;/strong&gt; Impact analysis is deliberately conservative. It flags files that &lt;em&gt;might&lt;/em&gt; be affected, which means some false positives in large dependency graphs.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;features&#34;&gt;Features
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feature&lt;/th&gt;
					&lt;th&gt;Details&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Incremental updates&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Re-parses only changed files. Subsequent updates complete in under 2 seconds.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Broad language + notebook support&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Python, JavaScript/TypeScript/TSX, Go, Rust, Java, C/C++, C#, VB.NET, Ruby, Kotlin, Swift, PHP, Scala, Solidity, Dart, R, Perl, Lua/Luau, Objective-C, shell scripts, Elixir, Zig, PowerShell, Julia, ReScript, GDScript, Nix, Verilog/SystemVerilog, SQL, Terraform/OpenTofu structure (&lt;code&gt;.tf&lt;/code&gt;; generic &lt;code&gt;.hcl&lt;/code&gt; files are file-only), Ansible playbooks/roles/tasks, Vue/Svelte SFCs, Astro files parsed through the TypeScript parser, Jupyter/Databricks (.ipynb), and Perl XS (.xs)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Framework-aware PHP parsing&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Repository-bounded Composer PSR-4 imports, Blade template references, and evidence-gated Laravel Route-to-controller and Eloquent relationship edges&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Blast-radius analysis&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Shows which functions, classes, and files are likely affected by a change&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Auto-update hooks&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Hooks and watch mode can update the graph on file saves and supported commit hooks&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Semantic search&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Optional vector embeddings via sentence-transformers, Google Gemini, MiniMax, or any OpenAI-compatible endpoint (real OpenAI, Azure, new-api, LiteLLM, vLLM, LocalAI)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Interactive visualisation&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;D3.js force-directed graph with search, community legend toggles, and degree-scaled nodes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Hub &amp;amp; bridge detection&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Find most-connected nodes and architectural chokepoints via betweenness centrality&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Surprise scoring&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Detect unexpected coupling: cross-community, cross-language, peripheral-to-hub edges&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Knowledge gap analysis&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Identify isolated nodes, untested hotspots, thin communities, and structural weaknesses&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Suggested questions&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Auto-generated review questions from graph analysis (bridges, hubs, surprises)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Edge confidence&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Three-tier confidence scoring (EXTRACTED/INFERRED/AMBIGUOUS) with float scores on edges&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Graph traversal&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Free-form BFS/DFS exploration from any node with configurable depth and token budget&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Export formats&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;GraphML (Gephi/yEd), Neo4j Cypher, Obsidian vault with wikilinks, SVG static graph&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Graph diff&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Compare graph snapshots over time: new/removed nodes, edges, community changes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Token benchmarking&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Measure naive full-corpus tokens vs graph query tokens with per-question ratios&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Estimated context savings&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Compact &lt;code&gt;context_savings&lt;/code&gt; metadata on relevant MCP/CLI review outputs, labelled as estimated and kept to three small fields&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Memory loop&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Persist Q&amp;amp;A results as markdown for re-ingestion, so the graph grows from queries&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Community auto-split&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Oversized communities (&amp;gt;25% of graph) are recursively split via Leiden&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Execution flows&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Trace call chains from entry points, sorted by weighted criticality&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Community detection&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Cluster related code via Leiden algorithm with resolution scaling for large graphs&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Architecture overview&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Auto-generated architecture map with coupling warnings&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Risk-scored reviews&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;detect_changes&lt;/code&gt; maps diffs to affected functions, flows, and test gaps&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Custom languages&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Add new languages via &lt;code&gt;.code-review-graph/languages.toml&lt;/code&gt; — no fork or code changes needed&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;GitHub Action&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Sticky risk-scored PR review comments in CI, with an optional &lt;code&gt;fail-on-risk&lt;/code&gt; merge gate&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Refactoring tools&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Rename preview, framework-aware dead code detection, community-driven suggestions&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Wiki generation&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Auto-generate markdown wiki from community structure&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Multi-repo registry&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Register multiple repos, search across all of them&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Multi-repo daemon&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;crg-daemon&lt;/code&gt; watches multiple repos as child processes, with health checks and auto-restart&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;MCP prompts&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5 workflow templates: review, architecture, debug, onboard, pre-merge&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Full-text search&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;FTS5-powered hybrid search combining keyword and vector similarity&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Local storage&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;SQLite file in &lt;code&gt;.code-review-graph/&lt;/code&gt;. Core graph storage needs no external database or cloud service.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Watch mode&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Continuous graph updates as you work&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage
&lt;/h2&gt;&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Slash commands&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Command&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/code-review-graph:build-graph&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Build or rebuild the code graph&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/code-review-graph:review-delta&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Review changes since last commit&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/code-review-graph:review-pr&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Full PR review with blast-radius analysis&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;CLI reference&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install          &lt;span class=&#34;c1&#34;&gt;# Auto-detect and configure all platforms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph install --platform &amp;lt;name&amp;gt;  &lt;span class=&#34;c1&#34;&gt;# Target a specific platform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph uninstall --dry-run  &lt;span class=&#34;c1&#34;&gt;# Preview safe removal of installed artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph build            &lt;span class=&#34;c1&#34;&gt;# Parse entire codebase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph update           &lt;span class=&#34;c1&#34;&gt;# Incremental update (changed files only)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph status           &lt;span class=&#34;c1&#34;&gt;# Graph statistics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph watch            &lt;span class=&#34;c1&#34;&gt;# Auto-update on file changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph visualize        &lt;span class=&#34;c1&#34;&gt;# Generate interactive HTML graph&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph visualize --format json      &lt;span class=&#34;c1&#34;&gt;# Export local graph data as JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph visualize --format graphml   &lt;span class=&#34;c1&#34;&gt;# Export as GraphML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph visualize --format svg       &lt;span class=&#34;c1&#34;&gt;# Export as SVG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph visualize --format obsidian  &lt;span class=&#34;c1&#34;&gt;# Export as Obsidian vault&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph visualize --format cypher    &lt;span class=&#34;c1&#34;&gt;# Export as Neo4j Cypher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph wiki             &lt;span class=&#34;c1&#34;&gt;# Generate markdown wiki from communities&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph detect-changes --brief         &lt;span class=&#34;c1&#34;&gt;# Risk panel + token savings (read-only)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph update --brief                 &lt;span class=&#34;c1&#34;&gt;# Refresh graph + same panel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph detect-changes --brief --verify  &lt;span class=&#34;c1&#34;&gt;# Cross-check vs tiktoken&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph register &amp;lt;path&amp;gt;  &lt;span class=&#34;c1&#34;&gt;# Register repo in multi-repo registry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph unregister &amp;lt;id&amp;gt;  &lt;span class=&#34;c1&#34;&gt;# Remove repo from registry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph repos            &lt;span class=&#34;c1&#34;&gt;# List registered repositories&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph daemon start     &lt;span class=&#34;c1&#34;&gt;# Start multi-repo watch daemon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph daemon stop      &lt;span class=&#34;c1&#34;&gt;# Stop the daemon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph daemon status    &lt;span class=&#34;c1&#34;&gt;# Show daemon status and repos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt;             &lt;span class=&#34;c1&#34;&gt;# Run evaluation benchmarks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph serve            &lt;span class=&#34;c1&#34;&gt;# Start MCP server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;JSON exports stay inside the local graph data directory, which Git ignores by
default. They can contain absolute paths and code-structure metadata, so inspect
and sanitize an export before publishing it outside your machine.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Token Savings panel: &lt;code&gt;detect-changes --brief&lt;/code&gt; vs &lt;code&gt;update --brief&lt;/code&gt;&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;Both commands print the same compact panel showing how many tokens the
graph saved you compared to handing the changed files to an agent raw.
They differ in &lt;strong&gt;one&lt;/strong&gt; thing: whether the graph gets refreshed first.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;┌─────────────────────── Token Savings ────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ Full context would be:     12,921 tokens                     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ Graph context used:           762 tokens                     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ Saved:                     12,159 tokens (~94%)              │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ Breakdown: Functions 244 · Tests 191 · Risk 244 · Other 83   │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└──────────────────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Command&lt;/th&gt;
					&lt;th&gt;What it does&lt;/th&gt;
					&lt;th&gt;When to use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;detect-changes --brief&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Read-only.&lt;/strong&gt; Looks at your current changes, queries the &lt;strong&gt;existing&lt;/strong&gt; graph, prints the panel. ~1 sec.&lt;/td&gt;
					&lt;td&gt;Most of the time — the hooks (or &lt;code&gt;crg-daemon&lt;/code&gt;) keep the graph fresh in the background, so this is enough.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;update --brief&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Re-parses your changed files into the graph first&lt;/strong&gt;, then prints the same panel. ~5 sec.&lt;/td&gt;
					&lt;td&gt;After a rebase, a large change set, or any time you suspect the graph is stale.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Both end with the &lt;strong&gt;same panel&lt;/strong&gt; because both call the same &lt;code&gt;analyze_changes()&lt;/code&gt; step at the end. The difference is whether the graph itself got refreshed before that analysis ran.&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;--verify&lt;/code&gt; to either command to cross-check the displayed numbers against OpenAI&amp;rsquo;s &lt;code&gt;cl100k_base&lt;/code&gt; tokenizer (the GPT-4 family). Requires &lt;code&gt;pip install tiktoken&lt;/code&gt;. The estimate stays within ~1% of real tokens on a typical change set — see &lt;a class=&#34;link&#34; href=&#34;docs/REPRODUCING.md&#34; &gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt; for the calibration data.&lt;/p&gt;
&lt;p&gt;The same &lt;code&gt;context_savings&lt;/code&gt; metadata is also attached automatically to the JSON responses of &lt;code&gt;get_impact_radius&lt;/code&gt;, &lt;code&gt;get_review_context&lt;/code&gt;, &lt;code&gt;detect_changes&lt;/code&gt;, and &lt;code&gt;get_architecture_overview&lt;/code&gt; MCP tools, so AI agents can surface the savings to humans in chat without any extra prompting.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Multi-repo daemon&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;If your editor doesn&amp;rsquo;t support hooks (e.g. Cursor, OpenCode), or you just want your
graph to stay fresh in the background without any editor integration, the daemon is
for you. It watches your repos for file changes and automatically rebuilds the graph
— no manual &lt;code&gt;build&lt;/code&gt; or &lt;code&gt;update&lt;/code&gt; commands needed.&lt;/p&gt;
&lt;p&gt;The daemon is included with &lt;code&gt;code-review-graph&lt;/code&gt; — no separate install required.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick setup:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. Register the repos you want to watch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crg-daemon add ~/project-a --alias proj-a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crg-daemon add ~/project-b
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. Start the daemon (runs in the background)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crg-daemon start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. That&amp;#39;s it — graphs stay up to date automatically&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crg-daemon status                 &lt;span class=&#34;c1&#34;&gt;# check daemon and per-repo watcher status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crg-daemon logs --repo proj-a -f  &lt;span class=&#34;c1&#34;&gt;# tail logs for a specific repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crg-daemon stop                   &lt;span class=&#34;c1&#34;&gt;# stop daemon and all watcher processes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Also available as &lt;code&gt;code-review-graph daemon start|stop|status|...&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Under the hood, &lt;code&gt;crg-daemon add&lt;/code&gt; writes to a TOML config file at
&lt;code&gt;~/.code-review-graph/watch.toml&lt;/code&gt;. You can also edit this file directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/user/project-a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;alias&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;proj-a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/user/project-b&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;alias&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;project-b&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The daemon monitors this config file for changes and automatically starts/stops
watcher processes as repos are added or removed. Health checks every 30 seconds
restart dead watchers. No external dependencies required.&lt;/p&gt;
&lt;p&gt;See &lt;a class=&#34;link&#34; href=&#34;docs/COMMANDS.md#standalone-daemon-cli-crg-daemon&#34; &gt;docs/COMMANDS.md&lt;/a&gt; for the
full config reference and all available options.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;30 MCP tools&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;Your AI assistant uses these automatically once the graph is built.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Tool&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;build_or_update_graph_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Build or incrementally update the graph&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;run_postprocess_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Re-run flow detection, community detection, and FTS indexing&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_minimal_context_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Ultra-compact context (~100 tokens) — call this first&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_impact_radius_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Blast radius of changed files&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_review_context_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Token-optimised review context with structural summary&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;query_graph_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Callers, callees, tests, imports, inheritance queries&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;traverse_graph_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;BFS/DFS traversal from any node with token budget&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;semantic_search_nodes_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Search code entities by name or meaning&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;embed_graph_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Compute vector embeddings for semantic search&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;list_graph_stats_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Graph size and health&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_docs_section_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Retrieve documentation sections&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;find_large_functions_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Find functions/classes exceeding a line-count threshold&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;list_flows_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;List execution flows sorted by criticality&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_flow_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Get details of a single execution flow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_affected_flows_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Find flows affected by changed files&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;list_communities_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;List detected code communities&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_community_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Get details of a single community&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_architecture_overview_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Architecture overview from community structure&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;detect_changes_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Risk-scored change impact analysis for code review&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_hub_nodes_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Find most-connected nodes (architectural hotspots)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_bridge_nodes_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Find chokepoints via betweenness centrality&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_knowledge_gaps_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Identify structural weaknesses and untested hotspots&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_surprising_connections_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Detect unexpected cross-community coupling&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_suggested_questions_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Auto-generated review questions from analysis&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;refactor_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Rename preview, dead code detection, suggestions&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;apply_refactor_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Apply a previously previewed refactoring&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;generate_wiki_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Generate markdown wiki from communities&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_wiki_page_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Retrieve a specific wiki page&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;list_repos_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;List registered repositories&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;cross_repo_search_tool&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Search across all registered repositories&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;MCP Prompts&lt;/strong&gt; (5 workflow templates):
&lt;code&gt;review_changes&lt;/code&gt;, &lt;code&gt;architecture_map&lt;/code&gt;, &lt;code&gt;debug_issue&lt;/code&gt;, &lt;code&gt;onboard_developer&lt;/code&gt;, &lt;code&gt;pre_merge_check&lt;/code&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;To exclude paths from indexing, create a &lt;code&gt;.code-review-graphignore&lt;/code&gt; file in your repository root:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;generated/**
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*.generated.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vendor/**
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;node_modules/**
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Note: in git repos, only tracked files are indexed (&lt;code&gt;git ls-files&lt;/code&gt;), so gitignored files are skipped automatically. Use &lt;code&gt;.code-review-graphignore&lt;/code&gt; to exclude tracked files or when git isn&amp;rsquo;t available.&lt;/p&gt;
&lt;p&gt;Optional dependency groups:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[embeddings]&amp;#34;&lt;/span&gt;          &lt;span class=&#34;c1&#34;&gt;# Local vector embeddings (sentence-transformers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[google-embeddings]&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# Google Gemini embeddings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[communities]&amp;#34;&lt;/span&gt;         &lt;span class=&#34;c1&#34;&gt;# Community detection (igraph)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[enrichment]&amp;#34;&lt;/span&gt;          &lt;span class=&#34;c1&#34;&gt;# Python call-resolution enrichment (Jedi)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[eval]&amp;#34;&lt;/span&gt;                &lt;span class=&#34;c1&#34;&gt;# Evaluation benchmarks (matplotlib)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[wiki]&amp;#34;&lt;/span&gt;                &lt;span class=&#34;c1&#34;&gt;# Wiki generation with LLM summaries (ollama)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph[all]&amp;#34;&lt;/span&gt;                 &lt;span class=&#34;c1&#34;&gt;# All optional dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;environment-variables&#34;&gt;Environment Variables
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Variable&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_GIT_TIMEOUT&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Timeout in seconds for Git operations&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_DATA_DIR&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Override directory for graph databases and generated graph artefacts&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_EMBEDDING_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Default model for vector embeddings&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_ACCEPT_CLOUD_EMBEDDINGS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Suppress the cloud embedding egress warning after explicit acknowledgement&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_ALLOW_REMOTE_CODE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Allow HuggingFace models that require &lt;code&gt;trust_remote_code=True&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_MAX_IMPACT_NODES&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Maximum nodes to include in impact analysis&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_MAX_IMPACT_DEPTH&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Search depth for blast-radius analysis&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_MAX_BFS_DEPTH&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Maximum depth for graph traversal&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_MAX_CHANGED_FUNCS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Maximum changed functions analysed in one change report&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_MAX_TRANSITIVE_FRONTIER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Maximum frontier size for transitive caller/callee expansion&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;50&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_TOOL_TIMEOUT&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Optional timeout in seconds for bounded MCP tools (&lt;code&gt;0&lt;/code&gt; disables timeout)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_RECURSE_SUBMODULES&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Include git submodules in file collection when set to &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;true&lt;/code&gt;, or &lt;code&gt;yes&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_TOOLS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Comma-separated allowlist of MCP tools to expose when serving&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;API key for Google Gemini embeddings&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;MINIMAX_API_KEY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;API key for MiniMax embeddings&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_OPENAI_BASE_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;OpenAI-compatible embeddings endpoint&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;API key for OpenAI-compatible embeddings&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_OPENAI_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Model name for OpenAI-compatible embeddings&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_OPENAI_DIMENSION&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Pin embedding dimension (v3 models support reduction)&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NO_COLOR&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;If set, disables ANSI colors in terminal&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CRG_SERIAL_PARSE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;If &lt;code&gt;1&lt;/code&gt;, disables parallel parsing (use for debugging)&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenAI-compatible embeddings (real OpenAI, Azure, or any self-hosted gateway like
new-api / LiteLLM / vLLM / LocalAI / Ollama in openai mode) need no extra install —
just set the environment variables and pass &lt;code&gt;provider=&amp;quot;openai&amp;quot;&lt;/code&gt; to &lt;code&gt;embed_graph&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CRG_OPENAI_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://127.0.0.1:3000/v1     &lt;span class=&#34;c1&#34;&gt;# or https://api.openai.com/v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CRG_OPENAI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;sk-...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CRG_OPENAI_MODEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;text-embedding-3-small          &lt;span class=&#34;c1&#34;&gt;# whatever your gateway serves&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# optional:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CRG_OPENAI_DIMENSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1536&lt;/span&gt;                        &lt;span class=&#34;c1&#34;&gt;# pin dim (v3 models support reduction)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CRG_OPENAI_BATCH_SIZE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;                        &lt;span class=&#34;c1&#34;&gt;# lower for gateways with tight limits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                        &lt;span class=&#34;c1&#34;&gt;# (e.g. Qwen text-embedding-v4 caps at 10)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The cloud-egress warning is auto-skipped when the base URL points to localhost
(&lt;code&gt;127.0.0.1&lt;/code&gt;, &lt;code&gt;localhost&lt;/code&gt;, &lt;code&gt;0.0.0.0&lt;/code&gt;, &lt;code&gt;::1&lt;/code&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Model selection tip.&lt;/strong&gt; Avoid &lt;code&gt;-preview&lt;/code&gt; / &lt;code&gt;-beta&lt;/code&gt; / &lt;code&gt;-exp&lt;/code&gt; model IDs
(e.g. &lt;code&gt;google/gemini-embedding-2-preview&lt;/code&gt;) for anything you plan to keep
long-term — preview models can change weights (different dimension → full
re-embed required) or be deprecated without notice. Prefer stable GA
releases such as &lt;code&gt;text-embedding-3-small&lt;/code&gt; / &lt;code&gt;text-embedding-3-large&lt;/code&gt; (OpenAI),
&lt;code&gt;Qwen/Qwen3-Embedding-8B&lt;/code&gt; (via self-hosted vLLM / LocalAI), or
&lt;code&gt;gemini-embedding-001&lt;/code&gt; (via the native Gemini provider, which requires
&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; instead of the OpenAI-compatible path).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;code-review-graph&lt;/code&gt; embeds identifiers, signatures, structural context, and a
bounded first-paragraph docstring/doc-comment summary. It does not transmit
function bodies. Graphs created before documentation extraction was added
need one full &lt;code&gt;code-review-graph build&lt;/code&gt; before re-embedding so every file is
reparsed. Routine builds never refresh embeddings by default. To refresh an
existing index after a build, explicitly pass both &lt;code&gt;--embedding-provider&lt;/code&gt;
and &lt;code&gt;--embedding-model&lt;/code&gt;; cloud choices may transmit this source-derived text
and incur API cost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;tool-filtering&#34;&gt;Tool Filtering
&lt;/h4&gt;&lt;p&gt;CRG exposes 30 MCP tools by default. In token-constrained environments, you can
limit the server to a subset of tools using &lt;code&gt;--tools&lt;/code&gt; or the &lt;code&gt;CRG_TOOLS&lt;/code&gt;
environment variable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Via CLI flag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;code-review-graph serve --tools query_graph_tool,semantic_search_nodes_tool,detect_changes_tool
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Via environment variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CRG_TOOLS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;query_graph_tool,semantic_search_nodes_tool code-review-graph serve
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The CLI flag takes precedence over the environment variable. When neither is set,
all tools are available. This is especially useful for MCP client configurations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;code-review-graph&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;serve&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--tools&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;query_graph_tool,semantic_search_nodes_tool,detect_changes_tool,get_review_context_tool&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/details&gt;
&lt;hr&gt;
&lt;h2 id=&#34;faq--how-it-compares&#34;&gt;FAQ &amp;amp; how it compares
&lt;/h2&gt;&lt;p&gt;Short, honest answers in &lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md&#34; &gt;docs/FAQ.md&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#how-is-this-different-from-lsp-and-language-servers&#34; &gt;vs LSP / language servers&lt;/a&gt; — one persistent cross-language graph instead of per-language daemons; LSP stays more precise per symbol.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#isnt-this-just-rag&#34; &gt;vs RAG / embeddings&lt;/a&gt; — structural edges parsed from the AST, not similarity chunks; embeddings are optional and only assist search.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#why-not-just-grep&#34; &gt;vs grep / agentic search&lt;/a&gt; — grep wins on one-hop lookups; the graph wins on multi-hop questions (impact radius, callers-of-callers, tests-for, affected flows).&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#how-does-it-compare-to-serena-codegraph-claude-context-and-repomix&#34; &gt;vs Serena, codegraph, claude-context, repomix&lt;/a&gt; — factual comparison table.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#when-should-i-not-use-it&#34; &gt;When NOT to use it&lt;/a&gt; — small repos, trivial single-file diffs, one-off questions.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#does-it-phone-home&#34; &gt;Does it phone home?&lt;/a&gt; — no; zero telemetry, cloud embeddings are opt-in.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/FAQ.md#how-do-i-verify-it-is-working&#34; &gt;How do I verify it is working?&lt;/a&gt; — &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;detect-changes --brief&lt;/code&gt;, &lt;code&gt;/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting
&lt;/h2&gt;&lt;h3 id=&#34;pip--pipx-cannot-download-hatchling-or-errno-9--bad-file-descriptor-to-pypi&#34;&gt;&lt;code&gt;pip&lt;/code&gt; / &lt;code&gt;pipx&lt;/code&gt; cannot download &lt;code&gt;hatchling&lt;/code&gt; (or &lt;code&gt;Errno 9&lt;/code&gt; / &lt;code&gt;Bad file descriptor&lt;/code&gt; to PyPI)
&lt;/h3&gt;&lt;p&gt;Installing from a &lt;strong&gt;source tree&lt;/strong&gt; (for example &lt;code&gt;pipx install .&lt;/code&gt;) needs build dependencies from &lt;strong&gt;PyPI&lt;/strong&gt; (for example &lt;code&gt;hatchling&lt;/code&gt;). If you see &lt;code&gt;Could not find a version that satisfies the requirement hatchling&lt;/code&gt; after connection warnings, the Python/pip in that &lt;strong&gt;terminal&lt;/strong&gt; may not be able to open an HTTPS client to &lt;code&gt;pypi.org&lt;/code&gt; (sometimes seen in an integrated editor terminal; less often system-wide with VPN, firewall, or proxy).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Run the same command from &lt;strong&gt;macOS Terminal.app&lt;/strong&gt; (or iTerm) instead of the IDE’s terminal, then retry &lt;code&gt;pipx install .&lt;/code&gt; or &lt;code&gt;pipx install &amp;quot;git+https://...&amp;quot;&lt;/code&gt; .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uv&lt;/a&gt;&lt;/strong&gt; to install the CLI from a checkout (uses different download machinery than &lt;code&gt;pip&lt;/code&gt; in many cases):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /path/to/code-review-graph
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv tool install . --force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;strong&gt;development in a clone&lt;/strong&gt; without a global install, use &lt;code&gt;uv sync&lt;/code&gt; and &lt;code&gt;uv run code-review-graph …&lt;/code&gt; (or activate &lt;code&gt;.venv&lt;/code&gt; after &lt;code&gt;uv sync&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Diagnose (optional):&lt;/strong&gt; &lt;code&gt;python3 scripts/diagnose_pypi_connectivity.py&lt;/code&gt; — if it prints &lt;code&gt;FAILED&lt;/code&gt;, the issue is environment/network, not a wrong package name in this repo.&lt;/p&gt;
&lt;h3 id=&#34;windows-configuration-issues-invalid-json--connection-closed&#34;&gt;Windows Configuration Issues (Invalid JSON / Connection Closed)
&lt;/h3&gt;&lt;p&gt;If you are using Windows and encounter &lt;code&gt;Invalid JSON: EOF while parsing&lt;/code&gt; or &lt;code&gt;MCP error -32000: Connection closed&lt;/code&gt; when connecting via Claude Code, do not use the &lt;code&gt;cmd /c&lt;/code&gt; wrapper in your config.&lt;/p&gt;
&lt;p&gt;Ensure &lt;code&gt;fastmcp&lt;/code&gt; is updated to at least &lt;code&gt;3.2.4+&lt;/code&gt;. Then, configure your &lt;code&gt;~/.claude.json&lt;/code&gt; to execute the &lt;code&gt;.exe&lt;/code&gt; directly and pass the UTF-8 environment variable via the config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;code-review-graph&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:\\path\\to\\your\\venv\\Scripts\\code-review-graph.exe&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;serve&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--repo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:\\path\\to\\your\\project&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;env&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;PYTHONUTF8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/tirth8205/code-review-graph.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; code-review-graph
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python3 -m venv .venv &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;.[dev]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pytest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Adding a new language&lt;/strong&gt;&lt;/summary&gt;
&lt;br&gt;
&lt;p&gt;Edit &lt;code&gt;code_review_graph/parser.py&lt;/code&gt; and add your extension to &lt;code&gt;EXTENSION_TO_LANGUAGE&lt;/code&gt; along with node type mappings in &lt;code&gt;_CLASS_TYPES&lt;/code&gt;, &lt;code&gt;_FUNCTION_TYPES&lt;/code&gt;, &lt;code&gt;_IMPORT_TYPES&lt;/code&gt;, and &lt;code&gt;_CALL_TYPES&lt;/code&gt;. Include a test fixture and open a PR.&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&#34;licence&#34;&gt;Licence
&lt;/h2&gt;&lt;p&gt;MIT. See &lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;LICENSE&lt;/a&gt;.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
&lt;br&gt;
&lt;a href=&#34;https://code-review-graph.com&#34;&gt;code-review-graph.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;pip install code-review-graph &amp;&amp; code-review-graph install&lt;/code&gt;&lt;br&gt;
&lt;sub&gt;Works with Codex, Claude Code, CodeBuddy Code, Cursor, Windsurf, Zed, Continue, OpenCode, Antigravity, Gemini CLI, Qwen, Qoder, Kiro, GitHub Copilot, and GitHub Copilot CLI&lt;/sub&gt;
&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
