# graphify — repo knowledge graph **CLI:** `graphify` (on PATH; `uv tool install graphifyy`) · **MCP:** `graphify-mcp` ```sh graphify update # build/refresh: writes graphify-out/{graph.json,GRAPH_REPORT.md} graphify explain # callers + neighbours graphify query <...> # traversal over EXTRACTED call edges graphify affected # blast radius graphify path # reach between two symbols ``` `graphify update` is the **free, deterministic path**: tree-sitter AST extraction plus Leiden clustering, **zero LLM, zero tokens**, roughly 25 s for ~900 files. Highest-value free output is the **God Nodes** list (core-abstraction surfacing). The LLM layer is optional and points at any backend via `~/.graphify/providers.json` — pair community *labeling* (low-caliber) with the free LiteLLM `summarizer` endpoint. Leave deep semantic extraction **off** unless you need it: its INFERRED/AMBIGUOUS edges fight the explicit-over-implicit floor. ## ⚠ Graphify alone under-counts a blast radius — always cross-check with grep Graphify is blind to **function-local and DI-injected imports** (`from .x import y` inside a function body, store objects passed through constructors) — exactly the pattern that hides cross-module callers. Graphify confirms call structure; grep catches what its AST extraction misses; **neither alone is sufficient** (graphify-only under-counts, grep-only misses transitive reach). Run both before writing any contract that touches existing code. A contract that names 3 files when the rip touches 6 is a scope miss the up-front pass would have caught. Complements a hand-authored `docs/CODEBASE.md` (curated geography); does not replace it.