代码图谱
本地代码知识图谱 MCP 服务,为 AI 编程助手省 token、减工具调用
CodeGraph
🎉 1.0 发布!
已经安装好了?运行 codegraph upgrade 即可原地更新。
在 X 上关注 @getcodegraph 以获取更新动态。
借助语义代码智能,强力加持 Claude Code, Cursor, Codex, OpenCode, Hermes Agent, Gemini, Antigravity 和 Kiro
便宜约16% · 工具调用减少约58% · 100%本地化
文档与网站 →
CodeGraph 平台即将登场 — 每一个 PR,都能确切知道测试什么、什么可能出问题、哪些流程受到影响、业务逻辑是否受损。
获取托管产品的早期 Beta 版访问权限 · getcodegraph.com
开始使用
1. 安装 CLI
无需 Node.js — 一条命令即可获取适合你操作系统的正确构建版本:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iex
已经安装了 Node?使用 npm 安装(任何版本均可)
npm i -g @colbymchenry/codegraph
CodeGraph 自带运行时 — 无需编译,无原生构建,任何地方运行一致。安装程序将 codegraph 添加到 PATH 中,但不会改变你当前的 shell — 请在进行下一步之前打开一个新终端,以便命令能够识别。
随时升级:运行 codegraph upgrade — 它会检测你的安装方式(bundle、npm 或 npx)并原地更新。添加 --check 查看是否有可用更新,或运行 codegraph upgrade <version> 固定到特定版本。
2. 连接你的 AI 代理
在一个新终端中,运行安装程序以将 CodeGraph 连接到你所使用的 AI 代理:
codegraph install
自动检测并配置 Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE 和 Kiro — 将 CodeGraph MCP 服务器接入每一个。这一步才是将 CodeGraph 连接到你的 AI 代理的关键步骤; 仅在第 1 步安装 CLI 并不会自动完成。(快捷方式:npx @colbymchenry/codegraph 会一次性下载并运行。)
3. 初始化每个项目
cd your-project
codegraph init
codegraph init 会创建本地的 .codegraph/ 目录,并在同一步中构建完整的图谱 — 一条命令,全部完成。
4. 无需再同步!
自动同步默认开启。CodeGraph 会监控项目,并在每次文件变更时更新图谱 — 无论你的 AI 代理正在编辑代码,还是你添加、修改或删除文件。索引永不过期,无需重新运行。
卸载
改变主意了?一条命令即可从它所配置的每个 AI 代理中移除 CodeGraph:
codegraph uninstall
撤销安装程序 — 从每个已配置的 AI 代理中移除 CodeGraph 的 MCP 服务器配置、指令和权限。你的项目索引(.codegraph/)会被保留;如需逐个项目删除,请使用 codegraph uninit。使用 --target 指定要移除的 AI 代理,或使用 --yes 进行非交互式运行。
为什么选择 CodeGraph?
当 Claude Code 探索代码库时,它会生成探索代理,使用 grep、glob 和 Read 扫描文件 — 每次工具调用都会消耗 Token。
CodeGraph 为这些 AI 代理提供了一个预索引的知识图谱 — 符号关系、调用图和代码结构。AI 代理可以即时查询图谱,而无需扫描文件。
基准测试结果
在 7 个真实开源代码库(涵盖 7 种语言)上进行测试,对比一个 AI 代理(Claude Code,无头模式)回答一个架构问题时,使用和未使用 CodeGraph 的情况。每个单元格数据来自四轮运行中位数下的节省量。已在 Opus 4.8(2026-06-02)上重新验证,使用的是当前构建版本(以 codegraph_explore 为主要工具)。
平均:便宜16% · Token 减少47% · 快22% · 工具调用减少58%
| 代码库 | 语言 | 成本 | Token | 时间 | 工具调用 |
|---|---|---|---|---|---|
| VS Code | TypeScript · 约1万文件 | 便宜18% | 减少64% | 快11% | 减少81% |
| Excalidraw | TypeScript · 约640 | 持平 | 减少25% | 快27% | 减少40% |
| Django | Python · 约3千 | 便宜8% | 减少60% | 快13% | 减少77% |
| Tokio | Rust · 约790 | 持平 | 减少38% | 快18% | 减少57% |
| OkHttp | Java · 约645 | 便宜25% | 减少54% | 快31% | 减少50% |
| Gin | Go · 约110 | 便宜19% | 减少23% | 快24% | 减少44% |
| Alamofire | Swift · 约110 | 便宜40% | 减少64% | 快33% | 减少58% |
CodeGraph 在每个仓库中都削减了Token、工具调用和实际耗时 — 覆盖小型、中型和大型代码库 — 并且以近乎零文件读取的方式给出答案,而未使用 CodeGraph 的 AI 代理则将预算花费在 grep/find/Read 探索上。codegraph_explore 会完整展示答案 — 包括机制以及你询问的确切方法,即使它们隐藏在数千行的文件中 — 同时将冗余的可互换实现折叠为签名,因此响应的大小取决于答案本身,而不是文件数量。成本在整个过程中保持持平或更低 — 在小型仓库(Alamofire、OkHttp)上节省最大,在那些响应最密集的仓库(Excalidraw、Tokio)上大致持平,此时 CodeGraph 将无 CodeGraph 的 AI 代理所进行的多次小规模 grep/read 往返,换成了少数几个大型、缓存密集的响应。
各仓库对比 — 使用 CG 与未使用 CG(4 次运行中位数)
VS Code · 约 1 万文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 59秒 | 2分 13秒 | 快了 11% |
| 文件读取次数 | 0 | 9 | −9 |
| Grep/Bash 调用次数 | 0 | 11 | −11 |
| 工具调用次数 | 4 | 21 | 减少了 81% |
| 总 Token 数 | 640k | 1.79M | 减少了 64% |
| 成本 | $0.68 | $0.83 | 便宜了 18% |
Excalidraw · 约 640 文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 32秒 | 2分 6秒 | 快了 27% |
| 文件读取次数 | 0 | 7 | −7 |
| Grep/Bash 调用次数 | 1 | 8 | −7 |
| 工具调用次数 | 9 | 15 | 减少了 40% |
| 总 Token 数 | 1.27M | 1.69M | 减少了 25% |
| 成本 | $0.78 | $0.78 | 持平 |
Django · 约 3k 文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 43秒 | 1分 58秒 | 快了 13% |
| 文件读取次数 | 0 | 9 | −9 |
| Grep/Bash 调用次数 | 0 | 5 | −5 |
| 工具调用次数 | 3 | 13 | 减少了 77% |
| 总 Token 数 | 559k | 1.41M | 减少了 60% |
| 成本 | $0.57 | $0.62 | 便宜了 8% |
Tokio · 约 790 文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 55秒 | 2分 20秒 | 快了 18% |
| 文件读取次数 | 0 | 8 | −8 |
| Grep/Bash 调用次数 | 0 | 6 | −6 |
| 工具调用次数 | 6 | 14 | 减少了 57% |
| 总 Token 数 | 1.08M | 1.73M | 减少了 38% |
| 成本 | $0.82 | $0.82 | 持平 |
OkHttp · 约 645 文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 1秒 | 1分 29秒 | 快了 31% |
| 文件读取次数 | 0 | 4 | −4 |
| Grep/Bash 调用次数 | 2 | 6 | −4 |
| 工具调用次数 | 5 | 10 | 减少了 50% |
| 总 Token 数 | 502k | 1.10M | 减少了 54% |
| 成本 | $0.41 | $0.55 | 便宜了 25% |
Gin · 约 110 文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 14秒 | 1分 37秒 | 快了 24% |
| 文件读取次数 | 1 | 6 | −5 |
| Grep/Bash 调用次数 | 1 | 2 | −1 |
| 工具调用次数 | 5 | 9 | 减少了 44% |
| 总 Token 数 | 651k | 847k | 减少了 23% |
| 成本 | $0.46 | $0.57 | 便宜了 19% |
Alamofire · 约 110 文件
| 指标 | 使用 cg | 未使用 cg | Δ |
|---|---|---|---|
| 耗时 | 1分 35秒 | 2分 21秒 | 快了 33% |
| 文件读取次数 | 0 | 9 | −9 |
| Grep/Bash 调用次数 | 0 | 4 | −4 |
| 工具调用次数 | 5 | 12 | 减少了 58% |
| 总 Token 数 | 766k | 2.10M | 减少了 64% |
| 成本 | $0.57 | $0.95 | 便宜了 40% |
完整基准测试详情
方法论。 每个分支通过 claude -p(Claude Opus 4.8)以无头模式对该仓库使用 --strict-mcp-config 运行:使用 = 启用了 CodeGraph 的 MCP 服务器,未使用 = 空 MCP 配置。内置的 Read/Grep/Bash 对两者均可用。每个仓库相同问题,每个分支运行 4 次,报告其中位数。成本 = 该次运行的 total_cost_usd;Token 数 = 已处理的总 Token(包括缓存的输入 + 输出);耗时 = 挂钟时间;工具调用次数 = 每次工具调用,包括模型产生的任何子代理内部的调用。仓库以 --depth 1 克隆,并由提供它们的同一 CodeGraph 构建进行索引。于 2026-06-02 在当前构建上重新验证。这些数字低于之前的 Opus 4.7 验证——并非 CodeGraph 回归,而是原生基线更强:Opus 4.8 在主线程上高效地进行 grep/read 操作,而不是展开为大规模的 Explore 子代理扫描,因此无 CodeGraph 分支比以前更精简。各仓库的数字在不同运行之间会波动,取决于无分支的冲击强度(4 次中位数会平滑它,但尾部仍存在——例如 Django 的无分支在某批测试中达到了 $2.71/14 分钟)。
查询内容:
| 代码库 | 查询内容 |
|---|---|
| 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?” |
CodeGraph 为何胜出: 在索引可用的情况下,代理直接回答问题——通常一次 codegraph_explore 就能返回相关源码,然后停止,通常零文件读取。没有索引时,代理将大部分预算花在发现上(find/ls/grep),然后才读取正确的代码。CodeGraph 仅在直接被查询时才有帮助,因此它的指令引导代理直接回答,而不是将探索委托给文件读取的子代理——否则子代理无论如何都会读取文件,而 CodeGraph 就成了额外开销。
关键特性
| Smart Context Building | 一次工具调用即可返回入口点、相关符号和代码片段——无需开销昂贵的探索代理 |
| Full-Text Search | 基于 FTS5,可瞬间在整个代码库中按名称查找代码 |
| Impact Analysis | 在修改之前,可追踪任何符号的调用者、被调用者以及完整的影响范围 |
| Always Fresh | 文件监视器使用原生操作系统事件(FSEvents/inotify/ReadDirectoryChangesW)并带防抖自动同步——在编码时图表保持最新,零配置 |
| 20+ 种语言 | TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Objective-C, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Svelte, Vue, Astro, Liquid, Pascal/Delphi |
| Framework-aware Routes | 识别 Web 框架路由文件,并将 URL 模式链接到其对应的处理器,覆盖 17 种框架 |
| 混合 iOS / React Native / Expo | 补全静态解析无法处理的跨语言流程:Swift ↔ ObjC 桥接、React Native 传统桥接 + TurboModules + Fabric 视图组件、原生 → JS 事件发射器、Expo Modules |
| 100% 本地 | 无数据离开本机。无需 API 密钥。无需外部服务。仅使用 SQLite 数据库 |
自动同步的工作原理——以及为何无需手动运行 codegraph sync
当您的代理(Claude Code, Cursor, Codex, opencode)启动 codegraph serve --mcp 时,三个层级确保索引与代码保持同步——并确保在编辑与下一次同步之间的短暂窗口内代理不会得到静默的错误答案:
-
带防抖自动同步的文件监视器。 原生 FSEvents / inotify / ReadDirectoryChangesW 监视器捕获每个源文件的创建/修改/删除,并在防抖窗口(默认
2000ms,可通过CODEGRAPH_WATCH_DEBOUNCE_MS调整,取值范围[100ms, 60s])后触发重新索引。编辑突发会被合并成一次同步。 -
逐文件过时横幅。 在短暂的防抖窗口期间,若 MCP 工具响应引用了待处理的文件,则会响应前附加一个
⚠️横幅,指明该文件并告知代理直接Read读取该文件。未被响应引用的待处理文件会以小页脚的形式显示在末尾。无论哪种情况,代理都会收到明确的信号——已在 Claude Code 中验证,代理会明确说“直接读取文件以获取实时内容”然后打开它。 -
连接时的追赶。 当 MCP 服务器(重新)连接时,codegraph 会在回答第一个查询之前,对工作目录执行快速的
(size, mtime)+ 内容哈希对比——因此,在没有 MCP 服务器运行时(终端中执行的git pull、其他编辑器的编辑、前一个代理会话退出等)产生的编辑,会在下一次会话的第一次工具调用时被吸收。
agent writes src/Widget.ts
→ watcher fires (<100ms)
→ debounce (default 2s)
→ sync; Widget.ts is in the index
→ next agent query sees it
随时验证,使用 codegraph_status(通过 MCP)或 codegraph status(CLI)。如果有任何待处理项,你会看到一个 ### Pending sync: 的部分,其中会列出文件名及其编辑时长。
以下少数情况下手动 codegraph sync 是合理的:文件监控器被禁用(沙盒环境,或 CODEGRAPH_NO_DAEMON=1),或者你在代理会话之外对索引进行脚本操作,并希望在脚本开始时进行一次预同步。
→ 完整深入介绍请参阅 指南 → 索引项目。
框架感知路由
CodeGraph 能够检测 Web 框架的路由文件,并生成通过 references 边连接到其处理类或函数的 route 节点。查询视图/控制器的调用者时,现在会显示绑定的 URL 模式。
| 框架 | 识别形状 |
|---|---|
| Django | path()、re_path()、url()、include() 在 urls.py 中(CBV .as_view()、点分路径) |
| Flask | @app.route('/path', methods=[...])、蓝图路由 |
| FastAPI | @app.get(...)、@router.post(...)、所有标准方法 |
| Express | app.get(...)、router.post(...) 带中间件链 |
| NestJS | @Controller + @Get/@Post/...、GraphQL @Resolver + @Query/@Mutation、@MessagePattern/@EventPattern、@SubscribeMessage |
| Laravel | Route::get()、Route::resource()、Controller@action、元组语法 |
| Drupal | *.routing.yml 路由(_controller、_form、实体处理器);hook_* 实现在 .module/.theme/.install/.inc 中 |
| Rails | get '/x', to: 'users#index'、hash-rocket => 语法 |
| Spring | 方法上的 @GetMapping、@PostMapping、@RequestMapping |
| Play | conf/routes 中的 GET/POST/… 动词路由 → Controller.method 动作(Scala + Java) |
| Gin / chi / gorilla / mux | r.GET(...)、router.HandleFunc(...) |
| Axum / actix / Rocket | .route("/x", get(handler)) |
| ASP.NET | 动作方法上的 [HttpGet("/x")] 特性 |
| Vapor | app.get("x", use: handler) |
| React Router / SvelteKit | 路由组件节点 |
| Vue Router / Nuxt | pages/ 文件路由、server/api/ 端点、路由中间件 |
| Astro | src/pages/ 文件路由(.astro 页面 + .ts 端点,[param]/[...rest] 语法) |
混合 iOS / React Native / Expo 桥接
真实 iOS 和 React Native 代码库横跨多种语言——Swift 调用者调用一个已自动桥接的 Objective-C 选择器,JS 文件通过 React Native 桥调用原生模块,JSX 组件委托给原生视图管理器。静态 tree-sitter 提取在每个语言边界处停止。CodeGraph 将它们桥接起来,使得 trace、callers、callees 和 impact 能够在整个跨语言间隙中端到端连接。
| 边界 | JS / Swift 侧 | 原生侧 | 方式 |
|---|---|---|---|
| Swift → ObjC | Swift obj.foo(bar:) | ObjC 选择器 -fooWithBar: | @objc 自动桥接规则(包括 init/property/protocol 形式)+ Cocoa 介词前缀(With/For/By/In/On/At/…) |
| ObjC → Swift | ObjC [obj fooWithBar:] | Swift @objc func foo(bar:) | 反向桥接名称候选;从源码验证 @objc 暴露 |
| React Native 传统桥 | JS NativeModules.X.fn(...) | ObjC RCT_EXPORT_METHOD / RCT_REMAP_METHOD · Java/Kotlin @ReactMethod | 解析宏/注解声明以构建 JS 名称 → 原生方法映射 |
| React Native TurboModules | JS import M from './NativeM'; M.fn(...) | 与 Codegen 规范匹配的原生实现 | 将 Native<X>.ts 规范接口视为真实来源 |
| RN 原生 → JS 事件 | JS new NativeEventEmitter(...).addListener('e', cb) | ObjC [self sendEventWithName:@"e" body:...] · Swift sendEvent(withName: "e", ...) · Java/Kotlin .emit("e", ...) | 通过字面事件名键化合成跨语言事件通道 |
| Expo 模块 | JS requireNativeModule('X').fn(...) | Swift / Kotlin Module { Name("X"); AsyncFunction("fn") { ... } } | 解析 Expo DSL 字面量;合成方法节点通过现有名称匹配解析 |
| Fabric 视图组件 | JSX <MyView prop={v}/> | TS Codegen 规范 + 原生实现类 | 规范 → component 节点;基于约定名称+后缀查找(View/ComponentView/Manager/ViewManager)桥接到原生 |
| 传统 Paper 视图管理器 | JSX <MyView prop={v}/> | ObjC RCT_EXPORT_VIEW_PROPERTY · Java/Kotlin @ReactProp | 与 Fabric 相同——Paper 时代的声明也会生成 component + property 节点 |
在真实代码库上验证过(每种桥接的小型 + 中型 + 大型):
| 桥接 | 小型 | 中型 | 大型 |
|---|---|---|---|
| Swift ↔ ObjC | Charts | realm-swift | Wikipedia-iOS |
| RN 传统桥 | AsyncStorage | react-native-svg | react-native-firebase |
| RN 原生 → JS 事件 | RNGeolocation | — | react-native-firebase |
| Expo 模块 | expo-haptics | expo-camera | expo SDK 扫描(7 个包) |
| Fabric / Paper 视图 | react-native-segmented-control | react-native-screens | react-native-skia |
每个桥接发出的边都带标签 provenance:'heuristic',且 metadata.synthesizedBy: 设置为一个稳定的通道名称(例如 swift-objc-bridge、rn-event-channel、fabric-native-impl、expo-module-extract),以便代理一眼就能看出该跳转是如何进入图的。
快速开始
1. 运行安装器
npx @colbymchenry/codegraph
安装器会:
- 询问要配置哪些代理——自动检测已安装的代理:Claude Code、Cursor、Codex CLI、opencode、Hermes Agent、Gemini CLI、Antigravity IDE、Kiro
- 提示是否将
codegraph安装到 PATH 中(以便代理可以启动 MCP 服务器) - 询问配置是应用于所有项目还是仅当前项目
- 为每个选定的代理写入 MCP 服务器配置,并在代理的指令文件(
CLAUDE.md/AGENTS.md/GEMINI.md)中写入一个小的标记围栏代码图部分——这样一来,子代理和非 MCP 代理也能学习codegraph explore/codegraph node命令,因为 MCP 服务器自身的指导只到达主代理。通过codegraph uninstall可干净移除。 - 当 Claude Code 是目标之一时,设置自动允许权限
- 初始化当前项目(仅限本地安装)
非交互式(脚本 / CI):
codegraph install --yes # auto-detect agents, install global
codegraph install --target=cursor,claude --yes # explicit target list
codegraph install --target=auto --location=local # detected agents, project-local
codegraph install --print-config codex # print snippet, no file writes
| 标志 | 值 | 默认值 |
|---|---|---|
--target | auto、all、none 或 csv (claude,cursor,...) | prompt |
--location | global、local | prompt |
--yes | (boolean) | 每一步都提示 |
--no-permissions | (boolean) 跳过 Claude 自动允许列表 | 权限开启 |
--print-config <id> | 打印指定 agent 的代码片段并退出 | — |
2. 重启 Agent
重启你的 agent(Claude Code / Cursor / Codex CLI / opencode / Hermes Agent / Gemini CLI / Antigravity IDE / Kiro),以使 MCP 服务器加载。
3. 初始化项目
cd your-project
codegraph init
构建项目级知识图谱索引,之后在每次文件变更时自动同步。一次全局 codegraph install 在你打开的每个项目中均有效——无需在每个项目中重新运行安装程序。
就是这样——当 .codegraph/ 目录存在时,你的 agent 会自动使用 CodeGraph 工具。
手动设置(替代方案)
全局安装:
npm install -g @colbymchenry/codegraph
添加到 ~/.claude.json:
{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}
添加到 ~/.claude/settings.json(可选,用于自动允许):
{
"permissions": {
"allow": [
"mcp__codegraph__codegraph_search",
"mcp__codegraph__codegraph_explore",
"mcp__codegraph__codegraph_callers",
"mcp__codegraph__codegraph_callees",
"mcp__codegraph__codegraph_impact",
"mcp__codegraph__codegraph_node",
"mcp__codegraph__codegraph_status",
"mcp__codegraph__codegraph_files"
]
}
}
Agent 工具指南
CodeGraph 的 MCP 服务器会通过 MCP initialize 响应自动向你的 agent 发送使用指南。简而言之,它会告诉 agent:
- 直接用 CodeGraph 回答结构性问题——索引已经预建好,grep/read 循环只是在重复已完成的工作。应将返回的源码视为已读取。
- 根据意图选择工具:
codegraph_explore适用于几乎所有场景——比如“X 如何工作”、流程分析(“X 如何到达 Y”),或区域概览(一次调用即可返回按文件分组的相关符号源码);codegraph_search仅用于定位符号;codegraph_callers用于查找所有调用点(包括回调注册);codegraph_node用于获取单个符号的完整源码及调用者,或像 Read 工具一样读取文件。 - 信任结果——不要用 grep 重新验证,并在编辑后检查过期横幅。
- 在没有索引的工作区中,CodeGraph 会声明自身为非活跃状态,不提供任何工具——是否索引仍由你决定。
具体文本位于 src/mcp/server-instructions.ts——这是主 agent 的唯一权威来源。因为子 agent 和非 MCP 容器无法看到 MCP 指南,安装程序还会将一段由四个标记线包裹的内容写入 agent 的指令文件,指向 codegraph explore / codegraph node 的 CLI 等效命令。
工作原理
┌───────────────────────────────────────────────────────────────────┐
│ Claude Code │
│ │
│ "How does a request reach the database?" │
│ calls CodeGraph tools directly — no Explore sub-agent │
│ │ │
└─────────────────────────────────┬─────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────┐
│ CodeGraph MCP Server │
│ │
│ explore · search · callers · callees · impact · node │
│ │ │
│ ▼ │
│ SQLite knowledge graph │
│ symbols · edges · files · FTS5 full-text search │
└───────────────────────────────────────────────────────────────────┘
-
提取 — tree-sitter 将源码解析为 AST。语言特定的查询提取节点(函数、类、方法)和边(调用、导入、继承、实现)。
-
存储 — 所有数据存入本地 SQLite 数据库(
.codegraph/codegraph.db),并启用 FTS5 全文搜索。 -
解析 — 提取后,解析引用关系:函数调用 → 定义、导入 → 源文件、类继承以及框架专属模式。
-
自动同步 — MCP 服务器使用原生 OS 文件事件监视项目。变更以去抖方式(2秒静默窗口)处理,仅过滤源文件并增量同步。你编码时图谱始终保持最新——无需配置。
CLI 参考
codegraph # Run interactive installer
codegraph install # Run installer (explicit)
codegraph uninstall # Remove CodeGraph from your agents (inverse of install)
codegraph init [path] # Initialize in a project (--index to also index)
codegraph uninit [path] # Remove CodeGraph from a project (--force to skip prompt)
codegraph index [path] # Full index (--force to re-index, --quiet for less output)
codegraph sync [path] # Incremental update
codegraph status [path] # Show statistics
codegraph unlock [path] # Remove a stale lock file that's blocking indexing
codegraph query <search> # Search symbols (--kind, --limit, --json)
codegraph explore <query> # Relevant symbols' source + call paths in one shot (same output as the codegraph_explore MCP tool)
codegraph node <symbol|file> # One symbol's source + callers, or read a file with line numbers (same output as codegraph_node)
codegraph files [path] # Show file structure (--format, --filter, --max-depth, --json)
codegraph callers <symbol> # Find what calls a function/method (--limit, --json)
codegraph callees <symbol> # Find what a function/method calls (--limit, --json)
codegraph impact <symbol> # Analyze what code is affected by changing a symbol (--depth, --json)
codegraph affected [files...] # Find test files affected by changes (see below)
codegraph daemon # Manage background daemons — pick one to stop (alias: daemons)
codegraph telemetry [on|off] # Show or change anonymous usage telemetry
codegraph upgrade [version] # Update to the latest release (--check, --force)
codegraph version # Print the installed version (also -v, --version)
codegraph help [command] # Show help, optionally for one command
codegraph affected
通过传递性地追踪导入依赖关系,找出受变更源文件影响的测试文件。
codegraph affected src/utils.ts src/api.ts # 将文件作为参数传入
git diff --name-only | codegraph affected --stdin # 从 git diff 管道输入
codegraph affected src/auth.ts --filter "e2e/*" # 自定义测试文件模式
| 选项 | 描述 | 默认值 |
|---|---|---|
--stdin | 从标准输入读取文件列表 | false |
-d, --depth <n> | 最大依赖遍历深度 | 5 |
-f, --filter <glob> | 用于识别测试文件的自定义 glob 模式 | 自动检测 |
-j, --json | 以 JSON 格式输出 | false |
-q, --quiet | 仅输出文件路径 | false |
CI/钩子示例:
#!/usr/bin/env bash
AFFECTED=$(git diff --name-only HEAD | codegraph affected --stdin --quiet)
if [ -n "$AFFECTED" ]; then
npx vitest run $AFFECTED
fi
MCP 工具
当作为 MCP 服务器运行时,CodeGraph 提供一组聚焦的四个工具——实测的智能体行为表明,更精简的列表能引导智能体选择正确的工具,并节省每次会话的上下文:
| 工具 | 用途 |
|---|---|
codegraph_explore | 主要工具。 一次调用即可回答几乎所有问题——“X 如何工作”、流程(“X 如何到达 Y”)或区域调查——返回相关符号的逐文件逐字源代码,以及关系图和影响范围。能揭示 grep 无法追踪的动态分发跳转(回调、React 重渲染、接口→实现)。 |
codegraph_node | 单个符号的完整源代码 + 调用者/被调用者追踪(歧义名称的每个重载)——或传入文件路径以像 Read 工具一样读取整个文件(相同行号输出,支持 offset/limit),并附带其依赖项。 |
codegraph_search | 在整个代码库中按名称查找符号 |
codegraph_callers | 函数的每个调用点——包括它被注册为回调的位置——当多个定义共享同一名称时,每个定义单独一节 |
另外四个工具(codegraph_callees、codegraph_impact、codegraph_files、codegraph_status)保持完全可用但默认不列出——根据评估运行测量,智能体从未或极少选择它们,且它们的信息已内联包含在上述四个工具中(explore 的影响范围部分、node 的依赖项注释、符号体作为其被调用者列表)。可通过 CODEGRAPH_MCP_TOOLS 环境变量重新启用其中任何一个(例如 CODEGRAPH_MCP_TOOLS=explore,node,search,callers,impact),或使用它们的 CLI 等效命令(codegraph callees / impact / files / status)。
在工作区中没有 .codegraph/ 索引时,服务器会声明自身为非活跃状态,并且不列出任何工具——智能体正常使用其内置工具,索引操作由您决定。
库使用
CodeGraph 可以直接嵌入。npm 包重新导出了其编程 API,因此 import 和 require 都能解析到您自己进程中的 CodeGraph 类——方便将其嵌入到应用程序中(例如 Electron 主进程)。
import CodeGraph from '@colbymchenry/codegraph';
// CommonJS 同样有效:
// const { CodeGraph } = require('@colbymchenry/codegraph');
const cg = await CodeGraph.init('/path/to/project');
// 或者:const cg = await CodeGraph.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(); // 文件变更时自动同步
cg.unwatch(); // 停止监听
cg.close();
从同一入口点导出了更底层的构建块,供直接驱动图的调用者使用:DatabaseConnection、QueryBuilder、getDatabasePath、initGrammars / loadGrammarsForLanguages 和 FileLock。
嵌入要求
- 从 npm 安装(
npm i @colbymchenry/codegraph),以便匹配的跨平台包(包含编译后的库及其依赖项)与 shim 一起获取。 - API 在您的运行时上运行,因此需要 Node 22.5+ 以使用内置的
node:sqlite(当 Electron 捆绑的 Node 版本为 22.5+ 时也符合条件)。CLI 和 MCP 服务器不受影响——它们运行在自包含的捆绑运行时上。 - TypeScript 类型随包一起提供。与任何面向 Node 的库一样,请确保
@types/node可用,并设置skipLibCheck: true(常见默认值)。
配置
没有任何配置——CodeGraph 是零配置的,无需编写或同步任何配置文件。语言支持根据文件扩展名自动完成;无需为每种语言进行额外配置。
默认跳过的内容:
- 依赖、构建和缓存目录——
node_modules、vendor、dist、build、target、.venv、Pods、.next以及所有支持的栈中的类似目录——因此图只包含您的代码,而非第三方噪音。即使没有.gitignore也适用。 .gitignore中的任何内容——在 git 仓库中通过 git 识别,在非 git 项目中通过直接读取.gitignore(根目录及嵌套)识别。- 大于 1 MB 的文件——生成的捆绑包、压缩后的 JS、供应商 blob。
要排除其他内容,请将其添加到 .gitignore。要将默认排除的目录重新包含(例如您确实希望索引某个供应商依赖项),请添加否定规则——!vendor/。默认设置统一应用,因此提交依赖项或构建目录不会强制将其纳入图中;.gitignore 的否定规则是显式的选择加入。
遥测
CodeGraph 收集匿名使用统计信息——哪些工具和命令被使用,哪些语言被索引——以指导语言和智能体支持工作的方向。绝不收集任何代码、路径、文件或符号名称、查询或 IP 地址;使用情况在本地聚合为每日总数后再发送,接收端点是此仓库中的公共代码,它强制执行文档中列出的字段。安装程序会事先询问;随时关闭:
codegraph telemetry off # 或:CODEGRAPH_TELEMETRY=0,或 DO_NOT_TRACK=1
TELEMETRY.md 列出了每个字段,以及关闭开关和完整的数据处理说明。
支持的平台
每个版本都为所有三种桌面操作系统(Intel/AMD x64 和 ARM arm64)提供自包含构建(捆绑 Node 运行时——无需编译):
| 平台 | 架构 | 安装方式 |
|---|---|---|
| Windows | x64, arm64 | PowerShell 安装程序或 npm |
| macOS | x64, arm64 | shell 安装程序或 npm |
| Linux | x64, arm64 | shell 安装程序或 npm |
参见开始使用获取一行安装命令。
支持的智能体
交互式安装程序会自动检测并配置以下每个智能体——连接 MCP 服务器(该服务器会提供自身的使用指南,因此不会写入指令文件):
- Claude Code
- Cursor
- Codex CLI
- opencode
- Hermes Agent
- Gemini CLI
- Antigravity IDE
- Kiro
支持的语言
| 语言 | 扩展名 | 状态 |
|---|---|---|
| TypeScript | .ts, .tsx | 完全支持 |
| JavaScript | .js, .jsx, .mjs | 完全支持 |
| Python | .py | 完全支持 |
| Go | .go | 完全支持 |
| Rust | .rs | 完全支持 |
| Java | .java | 完全支持 |
| C# | .cs | 完全支持 |
| PHP | .php | 完全支持 |
| Ruby | .rb | 完全支持 |
| C | .c, .h | 完全支持 |
| C++ | .cpp, .hpp, .cc | 完全支持 |
| Objective-C | .m, .mm, .h | 部分支持(类、协议、方法、@property、#import、消息发送;.mm ObjC++ 可能解析不完整) |
| Swift | .swift | 完全支持 |
| Kotlin | .kt, .kts | 完全支持 |
| Scala | .scala, .sc | 完全支持(类、特质、方法、类型别名、Scala 3 枚举) |
| Dart | .dart | 完全支持 |
| Svelte | .svelte | 完全支持(脚本抽取、Svelte 5 runes、SvelteKit 路由) |
| Vue | .vue | 完全支持(script + script-setup 抽取、Nuxt 页面/API/中间件路由) |
| Astro | .astro | 完全支持(frontmatter + 脚本抽取、模板组件/调用引用、src/pages/ 路由) |
| Liquid | .liquid | 完全支持 |
| Pascal / Delphi | .pas, .dpr, .dpk, .lpr | 完全支持(类、记录、接口、枚举、DFM/FMX 表单文件) |
| Lua | .lua | 完全支持(函数、带接收器的方法、局部变量、require 导入、调用边) |
| R | .R .r | 完全支持(所有赋值形式的函数、S4/R5/R6 类及其方法、library/require 导入、source() 文件引用、调用边) |
| Luau | .luau | 完全支持(Lua 的所有功能,外加 type/export type 别名、类型化签名以及 Roblox 实例路径 require) |
实测跨文件覆盖率
影响范围和爆炸半径查询的准确性完全依赖于其背后的依赖图,因此覆盖率是实测的而非声称的。公平覆盖率 = 在每种语言的真实基准仓库中,那些包含符号的源文件中至少有一个已解析的跨文件依赖者(即导入、调用、引用或通过框架约定路由到它们的代码)所占的比例。剩余的部分始终是静态分析的前沿难题(运行时动态分发、反射/DI 容器、框架约定入口点、供应商第三方代码),绝不会通过操纵分母来隐藏。
| 语言 | 基准仓库 | 覆盖率 |
|---|---|---|
| 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% |
框架路由也采用相同方式验证,基于每个框架的规范应用: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%——而对于那些依赖约定和反射的框架,则取其静态分析的天花板值:ASP.NET 83.9%、Spring 83.3%、Drupal 78.9%、Play 76.3%、Django 74.1%。SvelteKit、Vue/Nuxt 和 Astro 使用基于文件的路由,因此它们的页面/端点覆盖率即上表中 Svelte/SvelteKit(100%)、Vue/Nuxt(93.5%)和 Astro(93.0%——在两个验证仓库中,每个 src/pages/ 文件都映射到一个路由节点)的数据。
故障排除
“CodeGraph not initialized” — 先在项目目录中运行 codegraph init。
索引速度慢 — 请检查是否排除了 node_modules 和其他大型目录。使用 --quiet 可减少输出开销。
MCP 遇到 “database is locked” — 当前版本不应出现此问题:CodeGraph 自带 Node 运行时,并使用 Node 内置的 node:sqlite 的 WAL 模式,在此模式下并发读取不会阻塞写入。如果仍出现此问题:
- 你使用的是旧版本(0.9 之前的安装)。 重新安装以获取捆绑的运行时——
curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh(macOS/Linux),irm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iex(Windows),或npm i -g @colbymchenry/codegraph@latest。 codegraph status显示Journal:不是wal— 在此文件系统上无法启用 WAL(常见于网络共享和 WSL2 的/mnt),因此读取可能阻塞写入。请将项目(连同其.codegraph/文件夹)移至本地磁盘。
MCP 服务器无法连接 — 您的代理会自动启动服务器,因此您无需手动启动。请确保项目已初始化和索引(codegraph status),并且 MCP 配置中的路径正确。如果仍无法连接,请重新运行 codegraph install 以重写配置。
缺少符号 — MCP 服务器会在保存时自动同步(等待几秒钟)。如有需要,可手动运行 codegraph sync。请检查文件的语言是否受支持,且文件不在 .gitignore 或默认排除目录(例如 node_modules、dist)内。
在 Windows 和 WSL 之间共享同一个检出目录 — 不要让两者指向同一个 .codegraph/:后台服务器锁和 SQLite 索引与创建它们的操作系统绑定,并且跨 WSL2/Windows 文件系统边界的 SQLite 锁定不可靠。请为每一侧在同一目录树中创建独立的索引,方法是在其中一侧设置 CODEGRAPH_DIR 为不同的名称——例如在 Windows 上设置 CODEGRAPH_DIR=.codegraph-win,让 WSL 使用默认的 .codegraph。CodeGraph 在索引和监视时会跳过任何同级的 .codegraph-* 目录,因此两者不会互相干扰。
星标历史
许可证
MIT