CodeGraph 是一个为 AI 编码代理设计的语义代码智能工具,能够显著提升 Claude Code、Cursor、Codex、OpenCode、Hermes Agent、Gemini、Antigravity 和 Kiro 等代理的代码理解和导航能力。它通过预索引的代码结构图,将符号关系、调用图和代码结构以 SQLite 数据库的形式存储在本地,使代理能够通过图形查询而非文件扫描来回答架构问题。
在实测中,CodeGraph 实现了约 16% 的成本节约、58% 的工具调用减少和 22% 的速度提升,整个过程完全在本地运行,不依赖外部服务。它支持 20 多种编程语言,包括自动识别框架路由、跨语言桥接等高级特性,能够为现代多语言项目提供完整的代码结构视图。
CodeGraph 最大的价值在于它如何改变 AI 代理通过代码库探索的方式。传统的代理在回答架构问题时,会启动 Explore 代理使用 grep、glob 和 Read 工具扫描文件,每次工具调用都消耗 tokens。CodeGraph 则为这些代理提供了一个预先构建的知识图谱,使它们能够直接查询符号关系、调用图和代码结构,而不是逐文件扫描。
基于 7 个真实开源代码库的基准测试结果非常显著:在 7 种不同语言的代码库中测试,代理回答架构问题时相比不使用 CodeGraph 的情况,平均实现了 16% 的成本节约、47% 的 tokens 减少、22% 的速度提升和 58% 的工具调用减少。
基准测试细节
测试在 VS Code、Excalidraw、Django、Tokio、OkHttp、Gin 和 Alamofire 等开源项目上进行,使用 Claude Opus 4.8 作为测试模型。每个代码库运行 4 次,取中位数。支持的代码规模从约 110 个文件到 10,000 个文件不等。
对于大规模项目如 VS Code(约 10,000 个 TypeScript 文件),CodeGraph 实现了 64% 的 tokens 减少和 81% 的工具调用减少。值得注意的是,它不仅在大型项目中表现出色,在中小型项目中同样有效。例如,Swift 项目 Alamofire(约 110 个文件)实现了 64% 的 tokens 减少和 58% 的工具调用减少,成本节省达到 40%。
| 代码库 | 语言 | 成本 | Tokens | 速度 | 工具调用 |
|---|---|---|---|---|---|
| VS Code | TypeScript | 18% 更便宜 | 减少 64% | 快 11% | 减少 81% |
| Excalidraw | TypeScript | 持平 | 减少 25% | 快 27% | 减少 40% |
| Django | Python | 8% 更便宜 | 减少 60% | 快 13% | 减少 77% |
| Tokio | Rust | 持平 | 减少 38% | 快 18% | 减少 57% |
| OkHttp | Java | 25% 更便宜 | 减少 54% | 快 31% | 减少 50% |
| Gin | Go | 19% 更便宜 | 减少 23% | 快 24% | 减少 44% |
| Alamofire | Swift | 40% 更便宜 | 减少 64% | 快 33% | 减少 58% |
这种性能提升的原理很直接:没有 CodeGraph 时,代理需要通过各种发现操作(grep/read/ls)找到正确的代码片段,然后才能回答问题。而有了 CodeGraph 的索引,代理可以直接获取相关信息,通常只需一次工具调用即可获得关联的源代码。
CodeGraph 的核心能力是在单次工具调用中返回入口点、相关符号和代码片段。这意味着回答"某功能如何工作"这类问题时,无需启动昂贵的探索代理。返回的相关源代码按文件分组,同时提供关系图和影响范围分析。这一特性让代理能够覆盖动态调度跳转,这是传统 grep 工具无法做到的 — 例如 JSX 重新渲染或接口到实现转换的场景。
在代码搜索方面,基于 FTS5 引擎的全文搜索功能允许在整个代码库中按名称快速查找代码,无需依赖文件名或手动扫描目录结构。在进行代码修改前,codegraph_impact 可以分析某个符号的完整影响半径 — 通过追踪调用者和被调用者,开发者可以清楚地知道修改某个方法会影响到哪些代码路径。
文件监听机制使用原生操作系统事件(macOS 的 FSEvents、Linux 的 inotify、Windows 的 ReadDirectoryChangesW),配合防抖自动同步机制,确保代码图在编码过程中始终保持最新状态。整个过程无需任何配置,完全自动工作。
自动同步通过三层机制保证一致性:文件监听器在捕获变更后触发防抖同步(默认 2 秒静默窗口,可通过 CODEGRAPH_WATCH_DEBOUNCE_MS 调整);同步进行期间涉及到的文件会在 MCP 工具响应中附带过期提示;MCP 服务器重新连接时会执行快速 (size, mtime) + 内容哈希的协调,确保离线期间的编辑被吸收。
同步状态说明
可以使用 codegraph status 或 codegraph_status(通过 MCP)随时验证同步状态。如果有文件正在待同步,你会看到 ### Pending sync: 部分,列出文件及其编辑时间。
这是 CodeGraph 区别于其他静态分析工具的重要特性。它支持 iOS/React Native/Expo 的多语言项目桥接,解决了静态解析在语言边界处的盲区。包括 Swift 与 Objective-C 互调、React Native Legacy Bridge、TurboModules、原生向 JS 的事件发射、Expo Modules、Fabric 视图组件以及 Legacy Paper 视图管理器等。
| 边界 | 跨语言方式 |
|---|---|
| Swift → ObjC | @objc 自动桥接规则(含 init/property/protocol 形式)+ Cocoa 介词前缀 |
| ObjC → Swift | 反向桥接名称候选,从源码验证 @objc 暴露 |
| RN Legacy Bridge | JS NativeModules.X.fn(...) → ObjC RCT_EXPORT_METHOD / Java @ReactMethod |
| RN TurboModules | JS import M from './NativeM' → 匹配 Codegen 规范的原生实现 |
| RN 原生 → JS 事件 | JS NativeEventEmitter.addListener ↔ ObjC/Swift/Java sendEvent/emit |
| Expo Modules | JS requireNativeModule('X') → Swift/Kotlin Module { Name("X"); AsyncFunction("fn") } |
| Fabric / Paper 视图 | JSX <MyView prop={v}/> → 基于约定的命名+后缀查找桥接到原生实现 |
这些桥接关系通过带有 provenance:'heuristic' 标记和 metadata.synthesizedBy: 字段的边连接,代理可以清楚地看到跨语言调用是如何进入图谱的。
CodeGraph 能够识别 Web 框架的路由文件,并发出通过 references 边链接到处理类或函数的 route 节点。这意味着查询视图或控制器的调用者时,会显示绑定它的 URL 模式。
| 框架 | 识别的形状 |
|---|---|
| Django | path()、re_path()、url()、include() |
| Flask | @app.route、blueprint routes |
| FastAPI | @app.get()、@router.post() 等 |
| Express | app.get()、router.post() 及中间件链 |
| NestJS | @Controller + @Get/@Post、GraphQL resolvers |
| Laravel | Route::get()、Route::resource() |
| Rails | get '/x', to: 'users#index' |
| Spring | @GetMapping、@PostMapping 等注解 |
| 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 | 路由组件节点 |
CodeGraph 的工作流程分为四个阶段:
提取 — 使用 tree-sitter 解析源代码生成抽象语法树(AST)。语言特定的查询提取节点(函数、类、方法)和边(调用、导入、继承、实现)。
存储 — 所有内容存储在本地 SQLite 数据库(.codegraph/codegraph.db)中,并启用 FTS5 全文搜索。
解析 — 提取完成后进行引用解析,包括函数调用到定义、导入到源文件、类继承以及框架特定模式的解析。
自动同步 — MCP 服务器使用原生 OS 文件事件监听项目。更改被防抖后(默认 2 秒静默窗口),过滤为仅源文件,然后增量同步。
┌───────────────────────────────────────────────────────────────────┐ │ AI 代理 │ │ "How does a request reach the database?" │ │ 直接调用 CodeGraph 工具 — 无需 Explore 子代理 │ │ │ │ └─────────────────────────────────┬─────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────────────────────────┐ │ CodeGraph MCP Server │ │ explore · search · callers · callees · impact · node │ │ │ │ │ ▼ │ │ SQLite 知识图谱 │ │ symbols · edges · files · FTS5 全文搜索 │ └───────────────────────────────────────────────────────────────────┘
CodeGraph 采用零配置设计,语言支持根据文件扩展名自动识别。默认排除依赖/构建/缓存目录(node_modules、vendor、dist、build、target 等)、.gitignore 中的内容以及超过 1 MB 的大文件。如需自定义排除,添加到 .gitignore;如需将默认排除的目录重新纳入索引,使用否定语法 !vendor/。
CodeGraph 不需要 Node.js 环境,它自带运行时。对于 macOS 和 Linux 系统:
bashcurl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh
Windows 用户(PowerShell):
powershellirm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iex
如已安装 Node.js,也可以使用 npm:
bashnpm i -g @colbymchenry/codegraph
安装后操作
安装后需要打开新的终端才能识别 codegraph 命令。更新可以使用 codegraph upgrade,支持检查更新版本或指定版本安装。
在新终端中运行安装器连接 CodeGraph 到你使用的代理:
bashcodegraph install
这个命令会自动检测并配置 Claude Code、Cursor、Codex CLI、opencode、Hermes Agent、Gemini CLI、Antigravity IDE 和 Kiro 等代理。安装 CLI 本身并不会连接代理,运行 codegraph install 才是实际的连接步骤。
然后进入项目目录初始化:
bashcd your-project
codegraph init -i
-i 参数表示在初始化的同时建立索引。一次全局的 codegraph install 适用于每个你打开的项目,无需每个项目重新运行安装器。当项目目录中存在 .codegraph/ 时,代理会自动使用 CodeGraph 工具。
安装脚本还提供非交互选项用于脚本和 CI 环境:
bashcodegraph install --yes # 自动检测代理,全局安装
codegraph install --target=cursor,claude --yes # 显式指定目标列表
codegraph install --target=auto --location=local # 检测到的代理,项目本地安装
codegraph install --print-config codex # 仅打印配置片段,不写文件
卸载也同样简单,一条命令从所有代理中移除:
bashcodegraph uninstall
CodeGraph 提供了一套完整的命令行工具,覆盖从安装配置到索引管理的各个环节。
bashcodegraph # 运行交互式安装器
codegraph install # 运行安装器(显式调用)
codegraph uninstall # 从代理中移除 CodeGraph(安装的逆操作)
codegraph init [path] # 在项目中初始化(--index 同时建立索引)
codegraph uninit [path] # 从项目中移除 CodeGraph(--force 跳过确认)
codegraph index [path] # 全量索引(--force 重新索引,--quiet 减少输出)
codegraph sync [path] # 增量更新
codegraph status [path] # 显示统计信息
codegraph query <search> # 搜索符号(--kind, --limit, --json)
codegraph files [path] # 显示文件结构(--format, --filter, --max-depth, --json)
codegraph callers <symbol> # 查找调用某函数/方法的代码(--limit, --json)
codegraph callees <symbol> # 查找某函数/方法调用的代码(--limit, --json)
codegraph impact <symbol> # 分析修改某符号会影响的代码(--depth, --json)
codegraph affected [files...] # 查找受变更影响的测试文件
codegraph serve --mcp # 启动 MCP 服务器
codegraph upgrade [version] # 更新到最新版本(--check, --force)
codegraph affected 命令通过追踪导入依赖关系,找出哪些测试文件会受到源文件变更的影响。这在 CI/CD 流程中非常有用,可以只运行相关的测试而不是全量测试。
bashcodegraph 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/钩子示例
以下脚本可以在 pre-commit 钩子或 CI 流程中使用,只运行受影响的测试:
bash#!/usr/bin/env bash
AFFECTED=$(git diff --name-only HEAD | codegraph affected --stdin --quiet)
if [ -n "$AFFECTED" ]; then
npx vitest run $AFFECTED
fi
当作为 MCP 服务器运行时,CodeGraph 向代理暴露了一组专用工具:
| 工具 | 用途 |
|---|---|
codegraph_explore | 主要工具,用于回答几乎任何问题 — 功能工作原理、调用链或区域概况,返回相关符号的原始源代码(按文件分组)及关系图 |
codegraph_search | 跨代码库按名称查找符号 |
codegraph_callers | 查找调用某个函数的代码 |
codegraph_callees | 查找某个函数调用的代码 |
codegraph_impact | 分析修改某个符号会影响的代码 |
codegraph_node | 获取特定符号的详细信息及完整源代码(模糊名称返回所有重载) |
codegraph_files | 获取索引的文件结构(比文件系统扫描更快) |
codegraph_status | 检查索引健康状态和统计信息 |
如果需要手动配置 MCP 服务器(而不是使用 codegraph install),可以按以下步骤操作。首先全局安装:
bashnpm install -g @colbymchenry/codegraph
然后在 ~/.claude.json 中添加 MCP 服务器配置:
json{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}
自动权限配置
可选地,在 ~/.claude/settings.json 中添加自动允许权限,避免每次使用工具时都需要确认:
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"
]
}
}
CodeGraph 的 MCP 服务器在 initialize 响应中自动向代理传递使用指导,无需管理单独的说明文件。指导内容包括:
explore 用于大多数问题、search 仅定位符号、callers/callees 用于调用流程、impact 用于修改前分析.codegraph/ 不存在,主动提议运行 codegraph init -iCodeGraph 为所有桌面操作系统提供自包含构建(包括捆绑的 Node 运行时),支持 Intel/AMD (x64) 和 ARM (arm64) 架构,Windows、macOS 和 Linux 均可运行。
| 语言 | 扩展名 | 状态 |
|---|---|---|
| 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 | 部分支持 |
| Swift | .swift | 完全支持 |
| Kotlin | .kt、.kts | 完全支持 |
| Dart | .dart | 完全支持 |
| Svelte | .svelte | 完全支持 |
| Vue | .vue | 完全支持 |
| Liquid | .liquid | 完全支持 |
| Pascal / Delphi | .pas、.dpr 等 | 完全支持 |
| Lua / Luau | .lua、.luau | 完全支持 |
影响范围和变更影响查询的质量取决于底层依赖图的完整性,因此 CodeGraph 对覆盖率进行了实际测量而非单纯声明。覆盖率定义为"具有至少一个已解析跨文件依赖的符号承载源文件的百分比"。
| 语言 | 基准仓库 | 覆盖率 |
|---|---|---|
| TypeScript / JavaScript | 本仓库 | 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% |
| Swift | Alamofire | 95.3% |
覆盖率说明
未覆盖的部分通常是真正的静态分析前沿,包括运行时动态调度、反射/DI 容器、框架约定入口点等。这些是任何静态分析工具都难以处理的场景。
CodeGraph 可以直接嵌入到应用程序中。npm 包导出了编程 API,允许在自己的进程中使用 CodeGraph 类,适合嵌入到 Electron 主进程等场景。
typescriptimport 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 i @colbymchenry/codegraph),以便获取匹配的平台包(内含编译好的库及其依赖)node:sqlite(Electron 需要其捆绑的 Node 版本为 22.5+)@types/node 可用并设置 skipLibCheck: trueCLI 和 MCP 不受影响
CLI 和 MCP 服务器运行在自包含的捆绑运行时上,不受上述 Node 版本要求限制。
"CodeGraph not initialized" — 首先在项目目录运行 codegraph init。
索引速度慢 — 检查 node_modules 等大目录是否被排除,使用 --quiet 减少输出开销。
MCP 报告 database is locked — 当前版本不应该遇到这个问题,因为 CodeGraph 捆绑了自己的 Node 运行时,并使用 Node 内置的 WAL 模式 SQLite,并发读操作不会阻塞写入。如果仍然遇到,可能需要重新安装最新版本,或检查项目是否位于网络共享/WSL2 /mnt 上 — 这些场景下 WAL 可能无法启用。
MCP 服务器未连接 — 确保项目已初始化/索引,验证 MCP 配置中的路径,并检查 codegraph serve --mcp 是否可以从命令行正常运行。
缺失符号 — MCP 服务器在保存时会自动同步,等待几秒钟。如果需要,可以手动运行 codegraph sync。检查文件的语言是否被支持,以及是否位于 .gitignore 或默认排除的目录中。
在 Windows 和 WSL 之间共享检出 — 不要让两边都指向同一个 .codegraph/ 目录,因为后台服务锁和 SQLite 索引与写入它们的操作系统绑定,跨 WSL2/Windows 文件系统边界的 SQLite 锁定不可靠。通过设置 CODEGRAPH_DIR 环境变量让每边使用各自的索引目录(如 CODEGRAPH_DIR=.codegraph-win),CodeGraph 在索引和监听时会跳过相邻的 .codegraph-* 目录,两边互不干扰。
本文内容来源于 CodeGraph GitHub 仓库


本文作者:蒋固金
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!