@sumitpathak721/codeflowgraph
v1.0.3
Published
Supercharge AI coding agents with semantic code intelligence — surgical context, fewer tool calls, faster answers. 100% local.
Maintainers
Readme
codeflowGraph
Already installed? Run codeflowGraph upgrade
Supercharge Claude Code, Cursor, Codex, OpenCode, Hermes Agent, Gemini, Antigravity, and Kiro with Semantic Code Intelligence
The fastest complete code graph · surgical context · built for how agents actually work · 100% local
Kernel powered by Rust
The codeflowGraph platform is coming — for every PR, know exactly what to test, what could break, which flows are affected, and whether business logic is compromised.
Get early beta access to the hosted product · getcodeflowGraph.com
Contents
- Get Started
- Language Support
- Why codeflowGraph?
- Key Features
- Framework-aware Routes
- Mixed iOS / React Native / Expo bridging
- Quick Start
- How It Works
- CLI Reference
- MCP Tools
- Library Usage
- Configuration
- Verified releases
- Supported Platforms
- Supported Agents
- Supported Languages
- Measured cross-file coverage
- Troubleshooting
- License
Get Started
1. Install the CLI
No Node.js required — one command grabs the right build for your OS:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/sumitpathak721/codeflowGraph/main/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/sumitpathak721/codeflowGraph/main/install.ps1 | iexnpm i -g @sumitpathak721/codeflowGraphcodeflowGraph bundles its own runtime — nothing to compile, no native build, works the same everywhere. The installer puts codeflowGraph on your PATH but doesn't change your current shell — open a new terminal before the next step so the command resolves.
Upgrade any time with codeflowGraph upgrade — it detects how you installed (bundle, npm, or npx) and updates in place. Add --check to see if an update is available, or codeflowGraph upgrade <version> to pin one.
2. Wire up your agent(s)
In a new terminal, run the installer to connect codeflowGraph to the agents you use:
codeflowGraph installDetects and auto-configures Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, and Kiro — wiring the codeflowGraph MCP server into each. This is the step that connects codeflowGraph to your agent; installing the CLI in step 1 does not do it on its own. It only wires up your agent — it does not index any code; building each project's graph is the separate codeflowGraph init in step 3. (Shortcut: npx @sumitpathak721/codeflowGraph downloads and runs this in one go.)
3. Initialize each project
cd your-project
codeflowGraph initcodeflowGraph init creates the local .codeflowGraph/ directory and builds the full graph in the same step — one command, done.
4. Keep the graph current
After codeflowGraph init, update the index when source changes:
codeflowGraph sync # incremental — re-indexes only files whose content hash changed
codeflowGraph index # full rebuild when needed (--force for a clean slate)The live file watcher is off by default (v9). Run codeflowGraph sync after edits, or opt in with codeflowGraph_FORCE_WATCH=1. MCP catch-up sync runs on connect only when HEAD moved or the working tree has source changes.
Three-database layout (git projects):
| File | Layer | Role |
|------|-------|------|
| .codeflowGraph/codeflowGraph.db | committed | Git HEAD baseline — Phase 1 sync target |
| .codeflowGraph/codeflowGraph-local.db | local | Uncommitted overlay (lazy-created on first dirty sync) |
| .codeflowGraph/codeflowGraph-plan.db | plan | Design sandbox (codeflowGraph_graph_plan_init via MCP only) |
codeflowGraph init / index on git projects: Phase 1 indexes git HEAD into codeflowGraph.db (root + nested repos); Phase 2 overlays uncommitted changes into codeflowGraph-local.db when dirty.
codeflowGraph sync: Phase 1 refreshes codeflowGraph.db from HEAD; Phase 2 overlays dirty/untracked files into codeflowGraph-local.db. Reverting a file to HEAD removes its local overlay on the next sync. Use codeflowGraph sync -v for progress. Sync JSON includes layersWritten and layerAffectedWorkflows when workflows reference touched node IDs.
MCP layer defaults: reads merge committed + local when codeflowGraph-local.db exists (local wins on duplicate node IDs); otherwise committed. Pass layers: ['committed'] for HEAD-only. Workflow writes use layer: committed | local | plan (default committed). Never pass layer on init, index, or sync.
Non-git projects use only codeflowGraph.db (single-phase sync; no local DB).
Uninstall
Changed your mind? One command removes codeflowGraph from every agent it configured and the CLI itself — every install it finds (standalone bundle, npm global package, launcher link), shown to you before anything is deleted:
codeflowGraph uninstallPass --keep-cli to remove only the agent configurations and keep the CLI installed.
Reverses the installer — strips codeflowGraph's MCP server config, instructions, and permissions from each configured agent. Your project indexes (.codeflowGraph/) are left untouched; remove those per-project with codeflowGraph uninit. Use --target to remove from specific agents, or --yes to run non-interactively.
Language Support
Every language below gets the same treatment — full structural extraction and cross-file resolution into one graph, no per-language setup:
Per-language details — extensions, frameworks, and what exactly gets extracted — in Supported Languages.
Why codeflowGraph?
When an AI agent needs to understand code — to answer a question or make a change — it discovers structure the slow way: grep, glob, and Read, one file at a time, rebuilding call paths and dependencies by hand. That's a pile of tool calls and round-trips before it even starts the real work.
codeflowGraph hands the agent the exact code it needs in one call. It's a pre-built knowledge graph of every symbol, call edge, and dependency in your codebase — so instead of crawling files, the agent asks one question and gets back the relevant source, the call paths between those symbols (including dynamic-dispatch hops grep can't follow), and the blast radius of a change. Surgical context, not a file-by-file search — which means fewer tool calls and faster answers on every codebase, large or small.
A note on cost: codeflowGraph's win on every codebase is precision — the agent stops crawling files and answers from the graph. On current models that precision is also a large direct saving: the 2026-07 re-validation measured 60% lower cost and 69% fewer tokens on average across the seven benchmark repos, because a strong model without the graph burns millions of tokens re-deriving structure. The savings scale with repo size and tangle — dramatic on VS-Code-class trees, modest on a 100-file project — and compound across a team's daily agent usage.
Benchmark Results
Tested across 7 real-world open-source codebases spanning 7 languages, comparing an agent (Claude Code, headless) answering one architecture question with and without codeflowGraph, at the median of 4 runs per arm. Re-validated 2026-07-21 on Claude Opus 4.8 against the current build — the Rust kernel plus this cycle's resolution overhaul.
The universal win — every repo, every size: 89% fewer tool calls · 60% cheaper · 69% fewer tokens · file reads cut to zero on all seven repos.
With the index available, the agent answers from a couple of codeflowGraph_explore calls and stops. Without it, the agent burns its budget on discovery — up to 57 tool calls and 4.3M tokens re-deriving what the graph already knew. The Time column averages 20% faster but is the noisiest metric: on two small repos a strong model's raw grep loop finishes the wall-clock race sooner while still spending 5–10× the tokens and money — noted per-row below.
| Codebase | Language | Tool calls | Time | File reads | Tokens | Cost | |----------|----------|------------|------|------------|--------|------| | VS Code | TypeScript · ~11k files | 2 vs 40 | 5× faster (41s vs 3m 24s) | 0 vs 17 | 83% fewer | 75% cheaper | | Excalidraw | TypeScript · ~640 | 3 vs 55 | 36s vs 23s¹ | 0 vs 24 | 89% fewer | 78% cheaper | | Django | Python · ~3k | 2 vs 29 | 38% faster | 0 vs 16 | 78% fewer | 69% cheaper | | Tokio | Rust · ~790 | 3 vs 57 | 65% faster | 0 vs 15 | 91% fewer | 86% cheaper | | OkHttp | Java · ~645 | 1 vs 5 | 10% faster | 0 vs 1 | 33% fewer | ~even² | | Gin | Go · ~110 | 3 vs 10 | 57% faster | 0 vs 4 | 18% fewer | 41% cheaper | | Alamofire | Swift · ~110 | 3 vs 53 | 49s vs 31s¹ | 0 vs 18 | 90% fewer | 86% cheaper |
¹ The small-repo floor effect: Opus 4.8 greps small trees fast enough to win wall-clock while spending ~5–10× the tokens and ~4–7× the cost — the with-arm still answers from zero file reads. ² OkHttp's without-arm got lucky in 5 calls; the with-arm answered in 1 call for ~$0.03 more. File reads = median files opened — the surgical-context win in one column: the agent never reads a file on any of the seven repos when codeflowGraph is present.
| Codebase | Metric | WITH cg | WITHOUT cg | |---|---|---|---| | VS Code | Time / Tools / Tokens / Cost | 41s / 2 / 265k / $0.36 | 3m 24s / 40 / 1.5M / $1.41 | | Excalidraw | Time / Tools / Tokens / Cost | 36s / 3 / 324k / $0.40 | 23s / 55 / 2.9M / $1.81 | | Django | Time / Tools / Tokens / Cost | 42s / 2 / 254k / $0.35 | 1m 8s / 29 / 1.2M / $1.13 | | Tokio | Time / Tools / Tokens / Cost | 46s / 3 / 386k / $0.44 | 2m 11s / 57 / 4.3M / $3.04 | | OkHttp | Time / Tools / Tokens / Cost | 27s / 1 / 156k / $0.23 | 30s / 5 / 233k / $0.20 | | Gin | Time / Tools / Tokens / Cost | 30s / 3 / 246k / $0.27 | 1m 10s / 10 / 300k / $0.46 | | Alamofire | Time / Tools / Tokens / Cost | 49s / 3 / 316k / $0.35 | 31s / 53 / 3.1M / $2.51 |
Methodology. Each arm is claude -p (Claude Opus 4.8) run headlessly against the repo with --strict-mcp-config: WITH = codeflowGraph's MCP server enabled, WITHOUT = an empty MCP config. Built-in Read/Grep/Bash stay available to both. Same question per repo, 4 runs per arm, median reported. Cost = the run's total_cost_usd; Tokens = total tokens processed (input incl. cached + output); Time = wall-clock; Tool calls = every tool invocation, including those inside any sub-agents the model spawns. Repos cloned at --depth 1 and indexed by the same codeflowGraph build that served them. Re-validated 2026-07-21 on the current build (native Rust kernel, adaptive parallel resolution, scoped sync).
Queries: | Codebase | Query | |----------|-------| | VS Code | "How does the extension host communicate with the main process?" | | Excalidraw | "How does Excalidraw render and update canvas elements?" | | Django | "How does Django's ORM build and execute a query from a QuerySet?" | | Tokio | "How does tokio schedule and run async tasks on its runtime?" | | OkHttp | "How does OkHttp process a request through its interceptor chain?" | | Gin | "How does gin route requests through its middleware chain?" | | Alamofire | "How does Alamofire build, send, and validate a request?" |
Why codeflowGraph wins: with the index available, the agent answers directly — usually one codeflowGraph_explore returns the relevant source — and stops, with zero file reads on every benchmark repo. Without it, the agent spends most of its budget on discovery (find/ls/grep) before reading the right code. codeflowGraph only helps when queried directly, so its instructions steer agents to answer directly rather than delegate exploration to file-reading sub-agents — otherwise a sub-agent reads files regardless and codeflowGraph becomes overhead.
Key Features
| | | |---|---| | Adapts to Your Machine | Sizes its worker pools and caches from what the system actually has — real core counts (container-aware), honest available RAM, measured per-project cost. A workstation gets the full parallel pipeline; a 2-core VPS gets one tuned to finish reliably | | Surgical Context | One tool call returns entry points, related symbols, and code snippets — no slow file-by-file exploration | | Full-Text Search | Find code by name instantly across your entire codebase, powered by FTS5 | | Impact Analysis | Trace callers, callees, and the full impact radius of any symbol before making changes | | Always Fresh | File watcher uses native OS events (FSEvents/inotify/ReadDirectoryChangesW) with debounced auto-sync — the graph stays current as you code, zero config | | 20+ Languages | TypeScript, JavaScript, ArkTS, Python, Go, Rust, Java, C#, VB.NET, PHP, Ruby, C, C++, CUDA, Objective-C, Metal, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Nix, Erlang, CFML, COBOL, Solidity, Terraform/OpenTofu, Svelte, Vue, Astro, Liquid, Pascal/Delphi | | Framework-aware Routes | Recognizes web-framework routing files and links URL patterns to their handlers across 17 frameworks | | Mixed iOS / React Native / Expo | Closes cross-language flows that static parsing misses: Swift ↔ ObjC bridging, React Native legacy bridge + TurboModules + Fabric view components, native → JS event emitters, Expo Modules | | 100% Local | No data leaves your machine. No API keys. No external services. SQLite database only |
When your agent (Claude Code, Cursor, Codex, opencode) launches codeflowGraph serve --mcp, three layers keep the index in step with your code — and make sure the agent never gets a silent wrong answer in the brief window between an edit and the next sync:
File watcher with debounced auto-sync. A native FSEvents / inotify / ReadDirectoryChangesW watcher captures every source-file create / modify / delete and triggers a re-index after a debounce window (default
2000ms, tunable viacodeflowGraph_WATCH_DEBOUNCE_MS, clamped to[100ms, 60s]). Bursts of edits collapse into a single sync.Per-file staleness banner. During the brief debounce window, MCP tool responses that would reference a still-pending file prepend a
⚠️banner naming it and telling the agent toReadit directly. Pending files NOT referenced by the response surface as a small footer instead. Either way, the agent gets an explicit signal — validated with Claude Code, where the agent literally says "Reading the file directly for the live content" before opening it.Connect-time catch-up. On MCP connect, sync runs only if HEAD advanced or the working tree has source changes; skipped when the index already matches HEAD and the tree is clean.
agent writes src/Widget.ts
→ watcher fires (<100ms)
→ debounce (default 2s)
→ sync; Widget.ts is in the index
→ next agent query sees itVerify any time with codeflowGraph status (CLI). If anything is pending, you'll see a ### Pending sync: section naming the files and their edit age.
The handful of cases where manual codeflowGraph sync makes sense: the watcher is disabled (sandboxed environments, or codeflowGraph_NO_DAEMON=1), or you're scripting against the index outside an agent session and want a pre-flight sync at the start of your script.
→ See codeflowGraph help index and codeflowGraph help sync for indexing options.
Framework-aware Routes
codeflowGraph detects web-framework routing files and emits route nodes linked by references edges to their handler classes or functions. Querying callers of a view/controller now surfaces the URL pattern that binds it.
| Framework | Shapes recognized |
|---|---|
| Django | path(), re_path(), url(), include() in urls.py (CBV .as_view(), dotted paths) |
| Flask | @app.route('/path', methods=[...]), blueprint routes |
| FastAPI | @app.get(...), @router.post(...), all standard methods |
| Express | app.get(...), router.post(...) with middleware chains |
| NestJS | @Controller + @Get/@Post/..., GraphQL @Resolver + @Query/@Mutation, @MessagePattern/@EventPattern, @SubscribeMessage |
| Laravel | Route::get(), Route::resource(), Controller@action, tuple syntax |
| Drupal | *.routing.yml routes (_controller, _form, entity handlers); hook_* implementations in .module/.theme/.install/.inc |
| Rails | get '/x', to: 'users#index', hash-rocket => syntax |
| Spring | @GetMapping, @PostMapping, @RequestMapping on methods |
| Play | GET/POST/… verb routes in conf/routes → Controller.method actions (Scala + Java) |
| Gin / chi / gorilla / mux | r.GET(...), router.HandleFunc(...) |
| Axum / actix / Rocket | .route("/x", get(handler)) |
| ASP.NET | [HttpGet("/x")] attributes on action methods |
| Vapor | app.get("x", use: handler) |
| React Router / SvelteKit | Route component nodes |
| Vue Router / Nuxt | pages/ file-based routes, server/api/ endpoints, route middleware |
| Astro | src/pages/ file-based routes (.astro pages + .ts endpoints, [param]/[...rest] syntax) |
Mixed iOS / React Native / Expo bridging
Real iOS and React Native codebases live across multiple languages — a Swift caller invokes an Objective-C selector that's been auto-bridged, a JS file calls into a native module via the React Native bridge, a JSX component delegates to a native view manager. Static tree-sitter extraction stops at each language boundary. codeflowGraph bridges them so codeflowGraph_explore connects the flow end-to-end across the gap — call paths and blast radius cross the boundary instead of stopping at it.
| Boundary | JS / Swift side | Native side | How |
|---|---|---|---|
| Swift → ObjC | Swift obj.foo(bar:) | ObjC selector -fooWithBar: | @objc auto-bridging rules (including init/property/protocol forms) + Cocoa preposition prefixes (With/For/By/In/On/At/…) |
| ObjC → Swift | ObjC [obj fooWithBar:] | Swift @objc func foo(bar:) | Reverse-bridge name candidates; verifies @objc exposure from source |
| React Native legacy bridge | JS NativeModules.X.fn(...) | ObjC RCT_EXPORT_METHOD / RCT_REMAP_METHOD · Java/Kotlin @ReactMethod | Parses macro/annotation declarations to build a JS-name → native-method map |
| React Native TurboModules | JS import M from './NativeM'; M.fn(...) | Native impl matching the Codegen spec | Treats the Native<X>.ts spec interface as ground truth |
| RN native → JS events | JS new NativeEventEmitter(...).addListener('e', cb) | ObjC [self sendEventWithName:@"e" body:...] · Swift sendEvent(withName: "e", ...) · Java/Kotlin .emit("e", ...) | Synthesized cross-language event channel keyed by literal event name |
| Expo Modules | JS requireNativeModule('X').fn(...) | Swift / Kotlin Module { Name("X"); AsyncFunction("fn") { ... } } | Parses the Expo DSL literals; synthetic method nodes resolve via existing name-match |
| Fabric view components | JSX <MyView prop={v}/> | TS Codegen spec + native impl class | Spec → component node; convention-based name+suffix lookup (View/ComponentView/Manager/ViewManager) bridges to native |
| Legacy Paper view managers | JSX <MyView prop={v}/> | ObjC RCT_EXPORT_VIEW_PROPERTY · Java/Kotlin @ReactProp | Same as Fabric — Paper-era declarations also produce component + property nodes |
Validated on real codebases (small + medium + large for each bridge):
| Bridge | Small | Medium | Large | |---|---|---|---| | Swift ↔ ObjC | Charts | realm-swift | Wikipedia-iOS | | RN legacy bridge | AsyncStorage | react-native-svg | react-native-firebase | | RN native → JS events | RNGeolocation | — | react-native-firebase | | Expo Modules | expo-haptics | expo-camera | expo SDK sweep (7 packages) | | Fabric / Paper views | react-native-segmented-control | react-native-screens | react-native-skia |
Each bridge emits edges tagged provenance:'heuristic' with metadata.synthesizedBy: set to a stable channel name (e.g. swift-objc-bridge, rn-event-channel, fabric-native-impl, expo-module-extract), so the agent can tell at a glance how a hop got into the graph.
Quick Start
1. Run the Installer
npx @sumitpathak721/codeflowGraphThe installer will:
- Ask which agent(s) to configure — auto-detects installed ones from: Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, Kiro
- Prompt to install
codeflowGraphon your PATH (so agents can launch the MCP server) - Ask whether configs apply to all your projects or just this one
- Write each chosen agent's MCP server config, plus a small marker-fenced codeflowGraph section in the agent's instructions file (
CLAUDE.md/AGENTS.md/GEMINI.md) — that's how subagents and non-MCP agents learn thecodeflowGraph explorecommand, since the MCP server's own guidance only reaches the main agent. Removed cleanly bycodeflowGraph uninstall. - Set up auto-allow permissions when Claude Code is one of the targets
The installer wires up your agents only — it does not index your code. After it finishes, build each project's graph yourself with codeflowGraph init (step 3). One global codeflowGraph install covers every project; you run codeflowGraph init once per project.
Non-interactive (scripting / CI):
codeflowGraph install --yes # auto-detect agents, install global
codeflowGraph install --target=cursor,claude --yes # explicit target list
codeflowGraph install --target=auto --location=local # detected agents, project-local
codeflowGraph install --print-config codex # print snippet, no file writes| Flag | Values | Default |
|---|---|---|
| --target | auto, all, none, or csv (claude,cursor,...) | prompt |
| --location | global, local | prompt |
| --yes | (boolean) | prompt every step |
| --no-permissions | (boolean) skip Claude auto-allow list | permissions on |
| --print-config <id> | dump snippet for one agent and exit | — |
2. Restart Your Agent
Restart your agent (Claude Code / Cursor / Codex CLI / opencode / Hermes Agent / Gemini CLI / Antigravity IDE / Kiro) for the MCP server to load.
3. Initialize Projects
cd your-project
codeflowGraph initBuilds the per-project knowledge graph index, which then auto-syncs on every file change. A single global codeflowGraph install works in every project you open — no need to re-run the installer per project.
That's it — your agent will use codeflowGraph tools automatically when a .codeflowGraph/ directory exists.
Install globally:
npm install -g @sumitpathak721/codeflowGraphAdd to ~/.claude.json:
{
"mcpServers": {
"codeflowGraph": {
"type": "stdio",
"command": "codeflowGraph",
"args": ["serve", "--mcp"]
}
}
}Add to ~/.claude/settings.json (optional, for auto-allow):
{
"permissions": {
"allow": [
"mcp__codeflowGraph__*"
]
}
}One wildcard auto-approves every codeflowGraph tool. codeflowGraph init wires the full tool set via codeflowGraph_MCP_TOOLS in .cursor/mcp.json.
codeflowGraph's MCP server delivers its usage guidance to your agent automatically, in the MCP initialize response. In short, it tells the agent to:
- Answer structural questions directly with codeflowGraph — it is the pre-built index, so a grep/read loop just repeats work it already did. Treat the returned source as already read.
- Reach for
codeflowGraph_explorefor almost anything — "how does X work", a flow/"how does X reach Y", or surveying an area. One call returns the relevant symbols' verbatim source grouped by file, the call paths between them (dynamic-dispatch hops included), and a blast-radius summary. Name a file or symbol in the query to read its current line-numbered source. - Trust the results — don't re-verify with grep, and check the staleness banner after edits.
- Works per project: query any project that has a
.codeflowGraph/index by passingprojectPath— so a monorepo where only some services are indexed, or a second repo, works in one session. A path with no index returns clean guidance to use built-in tools; indexing stays your decision.
The exact text is src/mcp/server-instructions.ts — the single source of truth for the main agent. Because subagents and non-MCP harnesses never see the MCP guidance, the installer also writes a short marker-fenced section into the agent's instructions file pointing at the codeflowGraph explore CLI equivalent.
How It Works
┌───────────────────────────────────────────────────────────────────┐
│ Claude Code │
│ │
│ "How does a request reach the database?" │
│ calls codeflowGraph tools directly — no Explore sub-agent │
│ │ │
└─────────────────────────────────┬─────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────┐
│ codeflowGraph MCP Server │
│ │
│ explore · one call → verbatim source + call flow + blast radius │
│ │ │
│ ▼ │
│ SQLite knowledge graph │
│ symbols · edges · files · FTS5 full-text search │
└───────────────────────────────────────────────────────────────────┘Extraction — a native Rust kernel parses source with tree-sitter grammars compiled into it, extracting nodes (functions, classes, methods) and edges (calls, imports, extends, implements) for 20 languages; remaining languages and per-file fallbacks use the same extraction logic on the portable engine, producing identical graphs.
Storage — Everything goes into a local SQLite database (
.codeflowGraph/codeflowGraph.db) with FTS5 full-text search.Resolution — After extraction, references are resolved: function calls → definitions, imports → source files, class inheritance, and framework-specific patterns.
Auto-Sync — The MCP server watches your project using native OS file events. Changes are debounced (2-second quiet window), filtered to source files only, and incrementally synced. The graph stays fresh as you code — no configuration needed.
CLI Reference
codeflowGraph # Run interactive installer
codeflowGraph install # Run installer (explicit)
codeflowGraph uninstall # Remove codeflowGraph from your agents AND the CLI (--keep-cli for configs only)
codeflowGraph init [path] # Initialize a project + build its graph (one step)
codeflowGraph uninit [path] # Remove codeflowGraph from a project (--force to skip prompt)
codeflowGraph index [path] # Full index (--force to re-index, --quiet for less output)
codeflowGraph sync [path] # Incremental update
codeflowGraph status [path] # Show statistics
codeflowGraph unlock [path] # Remove a stale lock file that's blocking indexing
codeflowGraph query <search> # Search symbols (--kind, --limit, --json)
codeflowGraph explore <query> # Relevant symbols' source + call paths in one shot (same output as the codeflowGraph_explore MCP tool)
codeflowGraph node <symbol|file> # One symbol's source + callers, or read a file with line numbers (same output as codeflowGraph_node)
codeflowGraph files [path] # Show file structure (--format, --filter, --max-depth, --json)
codeflowGraph callers <symbol> # Find what calls a function/method (--limit, --json)
codeflowGraph callees <symbol> # Find what a function/method calls (--limit, --json)
codeflowGraph impact <symbol> # Analyze what code is affected by changing a symbol (--depth, --json)
codeflowGraph affected [files...] # Find test files affected by changes (see below)
codeflowGraph daemon # Manage background daemons — pick one to stop (alias: daemons)
codeflowGraph upgrade [version] # Update to the latest release (--check, --force)
codeflowGraph version # Print the installed version (also -v, --version)
codeflowGraph help [command] # Show help, optionally for one commandcodeflowGraph affected
Traces import dependencies transitively to find which test files are affected by changed source files.
codeflowGraph affected src/utils.ts src/api.ts # Pass files as arguments
git diff --name-only | codeflowGraph affected --stdin # Pipe from git diff
codeflowGraph affected src/auth.ts --filter "e2e/*" # Custom test file pattern| Option | Description | Default |
|--------|-------------|---------|
| --stdin | Read file list from stdin | false |
| -d, --depth <n> | Max dependency traversal depth | 5 |
| -f, --filter <glob> | Custom glob to identify test files | auto-detect |
| -j, --json | Output as JSON | false |
| -q, --quiet | Output file paths only | false |
CI/hook example:
#!/usr/bin/env bash
AFFECTED=$(git diff --name-only HEAD | codeflowGraph affected --stdin --quiet)
if [ -n "$AFFECTED" ]; then
npx vitest run $AFFECTED
fiMCP Tools
When running as an MCP server, codeflowGraph exposes codeflowGraph_explore by default (steers agents toward one strong tool). codeflowGraph init wires the full tool set in .cursor/mcp.json via codeflowGraph_MCP_TOOLS (search, node, callers, callees, impact, status, files, and all workflow tools).
Re-enable or trim tools with codeflowGraph_MCP_TOOLS in MCP env. CLI equivalents exist for all tools (codeflowGraph explore, query, callers, etc.).
Even when the server's own root has no .codeflowGraph/ index, pass projectPath to query any indexed project in the same session.
Graph layers (read/write)
Git projects may have up to three SQLite files under .codeflowGraph/ (see above). MCP reads default to merged committed + local when the local DB exists (precedence: plan > local > committed). Writes accept layer.
Library Usage
codeflowGraph can be embedded directly. The npm package re-exports its programmatic
API, so both import and require resolve the codeflowGraph class in your own
process — handy for embedding it in an app (e.g. an Electron main process).
import codeflowGraph from '@sumitpathak721/codeflowGraph';
// CommonJS works too:
// const { codeflowGraph } = require('@sumitpathak721/codeflowGraph');
const cg = await codeflowGraph.init('/path/to/project');
// Or: const cg = await codeflowGraph.open('/path/to/project');
await cg.indexAll({
onProgress: (p) => console.log(`${p.phase}: ${p.current}/${p.total}`)
});
const results = cg.searchNodes('UserService');
const callers = cg.getCallers(results[0].node.id);
const context = await cg.buildContext('fix login bug', { maxNodes: 20, includeCode: true, format: 'markdown' });
const impact = cg.getImpactRadius(results[0].node.id, 2);
cg.watch(); // auto-sync on file changes
cg.unwatch(); // stop watching
cg.close();Lower-level building blocks are exported from the same entry point for callers
that drive the graph directly: DatabaseConnection, QueryBuilder,
getDatabasePath, initGrammars / loadGrammarsForLanguages, and FileLock.
Embedding requirements
- Install from npm (
npm i @sumitpathak721/codeflowGraph) so the matching per-platform package — which carries the compiled library and its dependencies — is fetched alongside the shim. - The API runs on your runtime, so it needs Node 22.5+ for the built-in
node:sqlite(Electron qualifies when its bundled Node is 22.5+). The CLI and MCP server are unaffected — they run on the self-contained bundled runtime. - TypeScript types ship with the package. As with any Node-targeting library,
keep
@types/nodeavailable andskipLibCheck: true(the common default).
Configuration
Next to none — codeflowGraph is zero-config by default, with nothing to write or keep in sync to get started. Language support is automatic from the file extension; there's nothing to wire up per language. The one optional file is for mapping custom file extensions.
What it skips out of the box:
- Dependency, build, and cache directories —
node_modules,vendor,dist,build,target,.venv,Pods,.next, and the like across every supported stack — so the graph is your code, not third-party noise. This holds even with no.gitignore. - Anything in your
.gitignore— honored in git repos via git, and in non-git projects by reading.gitignoredirectly (root and nested). - Files larger than 1 MB — generated bundles, minified JS, vendored blobs.
To keep something else out, add it to .gitignore. To pull a default-excluded
directory back in (say you really do want a vendored dependency indexed),
add a negation — !vendor/. The defaults apply uniformly, so committing a
dependency or build directory doesn't force it into the graph; the .gitignore
negation is the explicit opt-in.
.gitignore can't drop a directory you've committed, though. For a vendored
theme or SDK that's checked into the repo (e.g. a Metronic theme under
static/), list it under exclude in codeflowGraph.json — gitignore-style
patterns, matched against repo-root-relative paths, honored on index, sync, and
watch:
{
"exclude": ["static/", "**/vendor/**"]
}Conversely, when real source is gitignored on purpose — a project under a second
VCS (SVN, Perforce) that .gitignores its own source so it stays out of Git —
force it back in with include (the opposite of exclude; includeIgnored
only revives embedded git repos, not plain source):
{
"include": ["Tools/", "Local/typescript/"]
}codeflowGraph discovers those files off disk, overriding .gitignore, on index,
sync, and watch. An explicit exclude still wins, and built-in skips
(node_modules, dist, .git) are never re-included.
Custom file extensions
If your project uses a non-standard extension for a supported
language — say .dota_lua for Lua, or .tpl for PHP —
those files are skipped by default, because the extension isn't one codeflowGraph
recognizes. Map them with an optional codeflowGraph.json at your project root:
{
"extensions": {
".dota_lua": "lua",
".tpl": "php"
}
}Each value is a supported language id. The mappings merge on top of the built-in
defaults and win on conflict, so you can also re-point a built-in (e.g.
".h": "cpp"). Commit the file to share the mapping with your team. A typo'd
language or a malformed file is warned about and skipped — it never breaks
indexing — and a project with no codeflowGraph.json behaves exactly as before.
Re-index (codeflowGraph index) after adding or changing mappings.
Verified releases
Every artifact is built and published by the public Release workflow — never from a laptop — and carries cryptographic proof of it:
npm packages are published via trusted publishing (OIDC — no long-lived npm tokens exist that could be stolen) with provenance attestations linking every version to the exact commit and workflow run that built it. Verify what's installed:
npm audit signaturesGitHub Release bundles (and
SHA256SUMS) carry signed build attestations (SLSA v1.0 Build Level 2). Verify any downloaded bundle:gh attestation verify codeflowGraph-darwin-arm64.tar.gz -R sumitpathak721/codeflowGraph
Releases published before July 2026 predate this pipeline and don't carry attestations.
Supported Platforms
Every release ships a self-contained build (bundled Node runtime — nothing to compile) for all three desktop OSes, on both Intel/AMD (x64) and ARM (arm64):
| Platform | Architectures | Install | |----------|---------------|---------| | Windows | x64, arm64 | PowerShell installer or npm | | macOS | x64, arm64 | shell installer or npm | | Linux | x64, arm64 | shell installer or npm |
See Get Started for the one-line install commands.
Supported Agents
The interactive installer auto-detects and configures each of these — wiring up the MCP server (which delivers its own usage guidance, so no instructions file is written):
- Claude Code
- Cursor
- Codex CLI
- opencode
- Hermes Agent
- Gemini CLI
- Antigravity IDE
- Kiro
Supported Languages
| Language | Extension | Status |
|----------|-----------|--------|
| TypeScript | .ts, .tsx | Full support |
| JavaScript | .js, .jsx, .mjs | Full support |
| ArkTS (HarmonyOS) | .ets | Full support (everything TypeScript has, plus @Component/@ComponentV2 structs with their ArkUI decorators (@State/@Prop/@Link/@Local/@Builder/…), build() view trees — parent→child component edges, chained-attribute links to @Extend/@Styles functions, .onClick(this.handler) event bindings — dynamic-dispatch bridges for state→build() re-renders, @ohos.events.emitter emit→subscriber pairs (static event keys only), and router.pushUrl literal urls → the target page struct; ohpm workspace modules resolve bare import { X } from "data" through oh-package.json5 file: dependencies, honoring each module's main entry) |
| Python | .py | Full support |
| Go | .go | Full support |
| Rust | .rs | Full support |
| Java | .java | Full support |
| C# | .cs | Full support |
| PHP | .php | Full support |
| Ruby | .rb | Full support |
| C | .c, .h | Full support |
| C++ | .cpp, .hpp, .cc | Full support |
| Objective-C | .m, .mm, .h | Partial support (classes, protocols, methods, @property, #import, message sends; .mm ObjC++ may parse incompletely) |
| Metal | .metal | Full support (vertex/fragment/kernel functions, structs, type aliases, call edges — MSL parses as C++, with [[attribute]] annotations handled) |
| CUDA | .cu, .cuh | Full support (kernels and device/host functions, structs, classes, host→kernel call edges through <<<grid, block>>> launch syntax — templated launches, function-pointer launches (auto kernel = &fn<...>), dim3{...} configs, and macro-defined kernels included; __global__/__device__/__launch_bounds__ specifiers handled; CUDA in plain .h/.hpp headers recognized by content) |
| Swift | .swift | Full support |
| Kotlin | .kt, .kts | Full support |
| Scala | .scala, .sc | Full support (classes, traits, methods, type aliases, Scala 3 enums) |
| Dart | .dart | Full support |
| Svelte | .svelte | Full support (script extraction, Svelte 5 runes, SvelteKit routes) |
| Vue | .vue | Full support (script + script-setup extraction, Nuxt page/API/middleware routes) |
| Astro | .astro | Full support (frontmatter + script extraction, template component/call references, src/pages/ routes) |
| Liquid | .liquid | Full support |
| Pascal / Delphi | .pas, .dpr, .dpk, .lpr | Full support (classes, records, interfaces, enums, DFM/FMX form files) |
| Lua | .lua | Full support (functions, methods with receivers, local variables, require imports, call edges) |
| R | .R .r | Full support (functions in every assignment form, S4/R5/R6 classes with methods, library/require imports, source() file references, call edges) |
| Luau | .luau | Full support (everything in Lua, plus type/export type aliases, typed signatures, and Roblox instance-path require) |
| CFML | .cfc, .cfm, .cfs | Full support (tag-based <cfcomponent>/<cffunction> and bare-script component { ... } styles, extends/implements, embedded <cfscript> delegation, call edges) |
| COBOL | .cbl, .cob, .cpy | Full support (programs, sections/paragraphs with PERFORM/GO TO call edges, CALL 'literal' cross-program calls, COPY copybook imports — including standalone .cpy files — DATA DIVISION records/fields/88-levels, EXEC CICS LINK/XCTL and EXEC SQL INCLUDE targets; fixed and free format) |
| Visual Basic .NET | .vb | Full support (classes, Modules, interfaces, structures, enums, properties, events, Declare P/Invoke, Handles/WithEvents, Inherits/Implements edges, call edges through VB's call/index paren ambiguity, As New instantiation, interpolated strings, LINQ, Unicode identifiers) |
| Erlang | .erl, .hrl, .escript, .app.src, .app | Full support (functions with multi-clause/multi-arity grouping, -spec signatures, records with fields, -type/-opaque aliases, -define macros, -include/-include_lib/-import edges, local and mod:fn remote call edges, fun name/arity references, spawn/apply/proc_lib/timer/rpc MFA-argument call edges, gen_server:call/cast(?MODULE) → own handle_call/handle_cast links, -behaviour links, -export-based visibility) |
| Solidity | .sol | Full support (contracts, libraries, interfaces, structs, enums, modifiers, events, errors, state variables, import/using directives, emit/revert calls) |
| Terraform / OpenTofu | .tf, .tfvars, .tofu | Full support (resources, data sources, modules, variables, outputs, providers incl. aliases, locals; var./local./module./resource references with Terraform's per-directory scoping enforced; module calls bridged across the boundary — inputs to the child module's variables, module.M.out to the child's output, source to the module's files; cloudposse/atmos remote-state cross-component wiring when the component is statically named; provider = aws.east selections resolved up the module tree; moved/import/removed/check block references; .tfvars assignments linked to the variables they set) |
| Nix | .nix | Full support (functions with simple/destructured/curried params, let/attrset bindings, inherit, import ./path file edges — ./dir resolving through default.nix — plus NixOS module imports = [ ./x.nix ] lists and callPackage ./pkg.nix file edges; call edges; module-system option wiring — a config write like launchd.user.agents.x = { ... } links to the module declaring options.launchd.user.agents, so option flows trace across modules) |
Measured cross-file coverage
Impact and blast-radius queries are only as good as the dependency graph behind them, so coverage is measured rather than asserted. Fair coverage = the share of symbol-bearing source files that have at least one resolved cross-file dependent — something that imports, calls, references, or (through a framework convention) routes to them — on a real-world benchmark repo per language. The residual is always a genuine static-analysis frontier (runtime dynamic dispatch, reflection / DI containers, framework-convention entry points, vendored third-party code), never hidden by gaming the denominator.
| Language | Benchmark repo | Coverage | |---|---|---| | TypeScript / JavaScript | this repo | 95.8% | | Python | psf/requests | 100% | | Go | gin-gonic/gin | 96.6% | | Rust | BurntSushi/ripgrep | 86.7% | | Java | google/gson | 93.3% | | C# | jbogard/MediatR | 85.2% | | PHP | guzzle/guzzle | 100% | | Ruby | sidekiq/sidekiq | 100% | | C | redis/redis | 92.2% | | C++ | google/leveldb | 94.8% | | Objective-C | SDWebImage | 91.6% | | Swift | Alamofire | 95.3% | | Kotlin | square/okhttp | 96.2% | | Scala | gatling/gatling | 91.2% | | Dart | flutter/packages | 92.4% | | Svelte / SvelteKit | sveltejs/realworld | 100% | | Vue / Nuxt | nuxt/movies | 93.5% | | Astro | xingwangzhe/stalux | 93.0% | | Lua | nvim-telescope/telescope.nvim | 84.2% | | Luau | dphfox/Fusion | 92.2% | | Liquid | Shopify/dawn | 73.8% | | Pascal / Delphi | PascalCoin | 77.4% |
Framework routing is validated the same way, on a canonical app per framework: Express 100%, FastAPI 98%, Flask 100%, NestJS 96.8%, Gin 96.5%, Axum 100%, Rocket 93.8%, Vapor 100%, Laravel 92%, Rails 89.6%, React Router 100% — and the convention/reflection-heavy ones at their honest static-analysis ceiling: ASP.NET 83.9%, Spring 83.3%, Drupal 78.9%, Play 76.3%, Django 74.1%. SvelteKit, Vue/Nuxt, and Astro use file-based routing, so their page/endpoint coverage is the Svelte/SvelteKit (100%), Vue/Nuxt (93.5%), and Astro (93.0% — every src/pages/ file maps to a route node on the two validation repos) figures in the table above.
Troubleshooting
"codeflowGraph not initialized" — Run codeflowGraph init in your project directory first.
Indexing is slow — Check that node_modules and other large directories are excluded. Use --quiet to reduce output overhead.
MCP hits database is locked — current builds shouldn't: codeflowGraph bundles its own Node runtime and uses Node's built-in node:sqlite in WAL mode, where concurrent reads never block on a writer. If you still see it:
- You're on an old (pre-0.9) install. Reinstall to get the bundled runtime —
curl -fsSL https://raw.githubusercontent.com/sumitpathak721/codeflowGraph/main/install.sh | sh(macOS/Linux),irm https://raw.githubusercontent.com/sumitpathak721/codeflowGraph/main/install.ps1 | iex(Windows), ornpm i -g @sumitpathak721/codeflowGraph@latest. codeflowGraph statusshowsJournal:other thanwal— WAL couldn't be enabled on this filesystem (common on network shares and WSL2/mnt), so reads can block on writes. Move the project (with its.codeflowGraph/folder) onto a local disk.
MCP server not connecting — Your agent starts the server itself, so you don't launch it by hand. Make sure the project is initialized and indexed (codeflowGraph status) and that the path in your MCP config is correct. If it still won't connect, re-run codeflowGraph install to rewrite the config.
MCP tool calls fail with Transport closed while codeflowGraph status/sync are healthy — almost always WSL2 with the project on a Windows drive (a /mnt/c or /mnt/d path), where the local socket codeflowGraph uses to share one background server across sessions is unreliable. codeflowGraph now falls back to serving the session in-process instead of dropping the connection, but if you still hit it, set codeflowGraph_NO_DAEMON=1 in your MCP server's environment to skip the shared server entirely (each session runs in its own process). Moving the project onto the Linux-native filesystem (e.g. under ~/ instead of /mnt/) restores the shared server.
Missing symbols — The MCP server auto-syncs on save (wait a couple seconds). Run codeflowGraph sync manually if needed. Check that the file's language is supported and isn't inside a .gitignored or default-excluded directory (e.g. node_modules, dist).
Sharing one checkout between Windows and WSL — Don't point both at the same .codeflowGraph/: the background-server lock and the SQLite index are tied to the OS that wrote them, and SQLite locking across the WSL2/Windows filesystem boundary is unreliable. Give each side its own index in the same tree by setting codeflowGraph_DIR to a distinct name on one of them — e.g. codeflowGraph_DIR=.codeflowGraph-win on Windows, leaving WSL on the default .codeflowGraph. codeflowGraph skips any sibling .codeflowGraph-* directory when indexing and watching, so the two never trip over each other.
License
MIT
Made for AI coding agents — Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, and Kiro
