# codegraph
**Repository Path**: goodsccd/codegraph
## Basic Information
- **Project Name**: codegraph
- **Description**: Pre-indexed code knowledge graph, auto syncs on code changes, for Claude Code, Codex, Gemini, Cursor, OpenCode, AntiGravity, Kiro, and Hermes Agent — fewer tokens, fewer tool calls, 100% local
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-04
- **Last Updated**: 2026-07-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# CodeGraph
## 🎉 1.0 已发布!
已安装?运行 `codegraph upgrade`
在 X 上关注 [@getcodegraph](https://x.com/getcodegraph) 获取更新。
### 用语义代码智能为 Claude Code、Cursor、Codex、OpenCode、Hermes Agent、Gemini、Antigravity 和 Kiro 注入强大动力
**精准上下文 · 更少工具调用 · 更快得到答案 · 100% 本地运行**
### [文档与官网 →](https://colbymchenry.github.io/codegraph/)
[](https://www.npmjs.com/package/@colbymchenry/codegraph)
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org/)
[](#支持平台)
[](#支持平台)
[](#支持平台)
[](#支持的-agent)
[](#支持的-agent)
[](#支持的-agent)
[](#支持的-agent)
[](#支持的-agent)
[](#支持的-agent)
[](#支持的-agent)
[](#支持的-agent)
**CodeGraph 平台即将上线** —— 针对每一个 PR,精准掌握:该测什么、可能崩在哪、哪些流程会受影响、业务逻辑是否被破坏。
获取托管产品的 抢先 Beta 体验 · getcodegraph.com
## 快速开始
### 1. 安装 CLI
**无需 Node.js** —— 一条命令即可为你的操作系统获取正确的构建版本:
```bash
# 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(任意版本均可)
```bash
npm i -g @colbymchenry/codegraph
```
CodeGraph 自带运行时 —— 无需编译、无需原生构建,在各平台行为一致。安装程序会将 codegraph 加入你的 PATH,但不会修改你当前的 shell —— 在下一步之前请打开一个新终端,让命令生效。
随时可用 codegraph upgrade 升级 —— 它会自动识别你的安装方式(bundle、npm 或 npx)并就地更新。加 --check 可检查是否有更新,或用 codegraph upgrade <version> 锁定某个版本。
### 2. 接入你的 agent
在**新终端**中运行安装程序,将 CodeGraph 接入你使用的 agent:
```bash
codegraph install
```
自动检测并配置 Claude Code、Cursor、Codex CLI、opencode、Hermes Agent、Gemini CLI、Antigravity IDE 和 Kiro —— 把 CodeGraph MCP 服务器写入每一个 agent。**这一步才是把 CodeGraph 接入你的 agent;** 第 1 步单独安装 CLI 并不会自动完成接入。它只接入 agent —— **不会**索引任何代码;每个项目的图谱构建是第 3 步独立的 codegraph init。(快捷方式:npx @colbymchenry/codegraph 一步完成下载并运行。)
### 3. 初始化每个项目
```bash
cd your-project
codegraph init
```
`codegraph init` 会创建本地 `.codegraph/` 目录并同时构建完整图谱 —— 一条命令搞定。

### 4. 再也不用同步!
默认开启自动同步。CodeGraph 会监视项目,在你 agent 编辑代码、新增、修改或删除文件时即时更新图谱。**索引永远不会过期,也不需要重新运行任何命令。**
### 卸载
改主意了?一条命令即可从所有配置过的 agent 中移除 CodeGraph:
```bash
codegraph uninstall
```
与安装过程正好相反 —— 从每个配置过的 agent 中清除 CodeGraph 的 MCP 服务器配置、说明与权限。项目索引(.codegraph/)保持原样;如需按项目移除,请使用 codegraph uninit。可加 --target 仅从指定 agent 移除,或加 --yes 以非交互模式运行。
---
### 5. **跨分支差异巨大
```
codegraph index --force
```
| | |
| ---------------------- | -------------------------------- |
| **跨分支差异巨大**(结构变化、语言变化) | 跑 `codegraph index --force` 全量重建 |
## 为什么选择 CodeGraph?
当 AI agent 需要理解代码 —— 无论是回答一个提问还是做一次改动 —— 它都会用最笨的方式去发现结构:grep、glob、Read,一次一个文件,手工重建调用路径和依赖关系。在真正开始干活之前,就先堆出了一大堆工具调用和往返开销。
**CodeGraph 让 agent 一次调用就拿到它所需的精确代码。** 它是一张预先构建好的知识图谱,覆盖你代码库中的每一个符号、调用边和依赖 —— agent 不再需要逐个文件地翻找,而是直接发问,就能拿到相关源码、符号之间的调用路径(包括 grep 无法跟踪的动态分发跳转),以及一次改动的爆炸半径。**精准的上下文,而不是逐文件搜索** —— 这意味着在任何规模的代码库上,工具调用都更少、答案都更快。
> **关于成本的一点说明:** CodeGraph 在*任何*代码库上的胜利都是精准与速度 —— 工具调用更少、答案更快。它也能降低 token 和金钱成本,但这份节省是**与规模相关的**:在体量适中的代码库上小而有噪,只有当仓库够大、纠缠够多时才显著 —— 在 Google、Microsoft 那种单体仓库的规模,再乘以整个团队每天的 agent 用量 —— 才会累加成真正的一笔账。在 500 文件的项目上,请为速度而采用 CodeGraph;成本节省要等代码库(和团队)变大了才会显现。
### 基准测试结果
横跨 **7 个真实开源代码库**、覆盖 7 种语言,对比一个 agent(Claude Code,headless 模式)在**有**和**无** CodeGraph 的情况下回答同一个架构问题,**每臂取 4 次运行的中位数**。_已于 2026-06-02 在 Opus 4.8 上、在当前构建版本(以 `codegraph_explore` 为主工具)重新验证。_
> **每一项的通用胜利 —— 不分仓库、不分规模:工具调用少 58% · 速度快 22% · 文件读取接近归零。**
最可靠、最通用的回报是**精准上下文与速度**:CodeGraph 把 agent 的 grep/find/Read 翻找压成几次直接查询 —— 即便你想要的方法深埋在数千行的文件里也能精确返回 —— 因此它以**近乎零的文件读取**给出答案,而无 CodeGraph 的 agent 却把预算花在了"找代码"上。**Tokens** 与 **Cost** 两列也是真实的,但 —— 如前所述 —— 它们**与规模相关**:单次查询上小而有噪,只有在大代码库、高调用量的规模下才会累积成真金白银。
| 代码库 | 语言 | 工具调用 | 耗时 | 文件读取 | Tokens | 成本 |
|----------|----------|------------|------|------------|--------|------|
| **VS Code** | TypeScript · ~10k 文件 | 少 81% | 快 11% | 0 vs 9 | 少 64% | 便宜 18% |
| **Excalidraw** | TypeScript · ~640 | 少 40% | 快 27% | 0 vs 7 | 少 25% | 持平 |
| **Django** | Python · ~3k | 少 77% | 快 13% | 0 vs 9 | 少 60% | 便宜 8% |
| **Tokio** | Rust · ~790 | 少 57% | 快 18% | 0 vs 8 | 少 38% | 持平 |
| **OkHttp** | Java · ~645 | 少 50% | 快 31% | 0 vs 4 | 少 54% | 便宜 25% |
| **Gin** | Go · ~110 | 少 44% | 快 24% | 1 vs 6 | 少 23% | 便宜 19% |
| **Alamofire** | Swift · ~110 | 少 58% | 快 33% | 0 vs 9 | 少 64% | 便宜 40% |
**文件读取** = agent 在**有**vs**无** CodeGraph 下打开的文件数中位数 —— 一列讲清"精准上下文"的胜利。**Tokens** 与 **Cost** 同样是有 vs 无的差值;它们只是方向性指标(每次运行都会波动),且按单次查询绝对值都较小 —— 因此只有规模上去才会计成一笔账。codegraph_explore 还会把冗余的可互换实现折叠为签名,让响应的体量与*答案*相称,而不是与文件数相称。
每个仓库的明细 —— 有 vs 无(4 次中位数)
**VS Code** · ~10k 文件
| 指标 | 有 cg | 无 cg | Δ |
|---|---|---|---|
| 耗时 | 1 分 59 秒 | 2 分 13 秒 | 快 11% |
| 文件读取 | 0 | 9 | −9 |
| Grep/Bash | 0 | 11 | −11 |
| 工具调用 | 4 | 21 | 少 81% |
| 总 tokens | 64 万 | 179 万 | 少 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% |
| 总 tokens | 127 万 | 169 万 | 少 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% |
| 总 tokens | 55.9 万 | 141 万 | 少 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% |
| 总 tokens | 108 万 | 173 万 | 少 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% |
| 总 tokens | 50.2 万 | 110 万 | 少 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% |
| 总 tokens | 65.1 万 | 84.7 万 | 少 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% |
| 总 tokens | 76.6 万 | 210 万 | 少 64% |
| 成本 | $0.57 | $0.95 | 便宜 40% |
完整基准测试细节
**方法。** 每臂都是 `claude -p`(Claude Opus 4.8)以 headless 模式、带 `--strict-mcp-config` 在仓库上运行:**有** = 启用 CodeGraph 的 MCP 服务器,**无** = 空 MCP 配置。两边都可使用内置的 Read/Grep/Bash。每个仓库用同一个问题,**每臂跑 4 次,取中位数**。成本 = 该次运行的 `total_cost_usd`;Tokens = 处理的总 token(输入含缓存 + 输出);耗时 = 墙钟时间;工具调用 = 每一次工具调用,包含模型派生的任何子 agent 内部的调用。仓库以 `--depth 1` 克隆,并由同一个对外服务的 CodeGraph 构建版本进行索引。于 2026-06-02 在当前构建上重新验证。这些数字低于此前 Opus 4.7 的验证 —— 并非 CodeGraph 退步,而是原生基线更强了:Opus 4.8 会在主线程上高效地 grep/read,而不是派出大型 Explore 子 agent 大扫一遍,所以"无 CodeGraph"那一臂比以前更精简了。每个仓库的数字会随"无"臂翻腾的剧烈程度波动(4 次取中位数已抚平波动,但极端值仍会出现 —— 比如 Django 的"无"臂在某批里冲到过 $2.71/14 分钟)。
**查询语句:**
| 代码库 | 查询 |
|----------|-------|
| VS Code | "扩展宿主如何与主进程通信?" |
| Excalidraw | "Excalidraw 如何渲染并更新画布元素?" |
| Django | "Django 的 ORM 如何从一个 QuerySet 构建并执行查询?" |
| Tokio | "tokio 如何在其运行时上调度并执行异步任务?" |
| OkHttp | "OkHttp 如何让一个请求穿过它的拦截器链?" |
| Gin | "gin 如何让请求穿过它的中间件链?" |
| Alamofire | "Alamofire 如何构建、发送并校验一个请求?" |
**CodeGraph 为何会赢:** 有了索引,agent 直接作答 —— 通常一次 `codegraph_explore` 就返回相关源码 —— 然后停下,往往零文件读取。没有索引时,agent 会把大部分预算花在"发现"(find/ls/grep)上,最后才能读到对的代码。CodeGraph 只在被*直接*调用时才有用,所以它的指引会让 agent 直接作答,而不是把探索委托给读文件的子 agent —— 否则子 agent 无论如何都会去读文件,CodeGraph 反倒成了累赘。
---
## 核心特性
| | |
|---|---|
| **精准上下文** | 一次工具调用就返回入口点、相关符号和代码片段 —— 不再慢吞吞地逐文件探索 |
| **全文搜索** | 基于 FTS5,在全代码库上按名字瞬间定位代码 |
| **影响分析** | 在改动任何符号之前,追溯它的调用方、被调用方以及完整影响半径 |
| **始终新鲜** | 文件监听使用操作系统原生事件(FSEvents/inotify/ReadDirectoryChangesW),带防抖自动同步 —— 图谱随你编码实时更新,零配置 |
| **20+ 种语言** | TypeScript、JavaScript、Python、Go、Rust、Java、C#、VB.NET、PHP、Ruby、C、C++、CUDA、Objective-C、Metal、Swift、Kotlin、Scala、Dart、Lua、Luau、R、Erlang、CFML、COBOL、Solidity、Terraform/OpenTofu、Svelte、Vue、Astro、Liquid、Pascal/Delphi |
| **框架感知路由** | 识别 Web 框架的路由文件,跨 17 种框架把 URL 模式关联到对应处理器 |
| **iOS / React Native / Expo 混合** | 闭合静态解析会漏掉的跨语言调用:Swift ↔ ObjC 桥接、React Native 旧桥 + TurboModules + Fabric 视图组件、原生 → JS 事件发射器、Expo Modules |
| **100% 本地** | 没有任何数据离开你的机器。无需 API 密钥。不依赖任何外部服务。仅使用本地 SQLite 数据库 |
自动同步如何工作 —— 以及为什么你不必手动运行 codegraph sync
当你的 agent(Claude Code、Cursor、Codex、opencode)启动 `codegraph serve --mcp` 时,有三层机制让索引与代码保持一致 —— 并保证 agent 在"编辑到下次同步"这一小窗口里也不会拿到一个静默的错误答案:
1. **带防抖的文件监听。** 一个原生 FSEvents / inotify / ReadDirectoryChangesW 监听器捕获每一次源文件的创建/修改/删除,并在防抖窗口(默认 `2000ms`,可通过 `CODEGRAPH_WATCH_DEBOUNCE_MS` 调整,区间 `[100ms, 60s]`)之后触发重新索引。一串连续编辑会被压缩为一次同步。
2. **逐文件过期横幅。** 在短暂的防抖窗口内,那些将要引用"仍在挂起"文件的 MCP 工具响应,会在开头加一条 `⚠️` 横幅,点名该文件并让 agent 直接 `Read` 它。未被响应引用的挂起文件则作为小号脚注显示。无论哪种情况,agent 都会拿到一个明确信号 —— 已在 Claude Code 上验证:agent 会直白地说"为了拿到实时内容,我直接读这个文件",然后打开它。
3. **连接时补偿。** 当 MCP 服务器(重新)连接时,codegraph 会在回答第一个查询之前,先针对工作树跑一遍快速的 `(size, mtime)` + 内容哈希对账 —— 这样在 MCP 服务器未运行期间发生的编辑(终端里 `git pull`、另一个编辑器、上一个已退出的 agent 会话)都会在下一次会话的第一次工具调用时被吸收。
```
agent 写入 src/Widget.ts
→ 监听器触发(<100ms)
→ 防抖(默认 2 秒)
→ 同步;Widget.ts 进入索引
→ agent 的下一次查询能看到它
```
**随时可验证** —— 用 `codegraph status`(CLI)。如果有任何挂起项,你会看到一个 `### Pending sync:` 段落,列出文件名及其编辑距今时长。
少数适合手动 `codegraph sync` 的场景:监听器被禁用(沙箱环境,或设置了 `CODEGRAPH_NO_DAEMON=1`),或者你在 agent 会话之外针对索引写脚本,想在脚本开头预先同步一次。
→ 完整深入内容见 [Guides → Indexing a Project](https://colbymchenry.github.io/codegraph/guides/indexing/#stay-fresh-automatically)。
---
## 框架感知路由
CodeGraph 检测 Web 框架的路由文件,生成 `route` 节点,并通过 `references` 边连接到对应的处理器类或函数。查询某个 view/controller 的调用方时,现在能浮现出绑定它的 URL 模式。
| 框架 | 识别的形态 |
|---|---|
| **Django** | `urls.py` 中的 `path()`、`re_path()`、`url()`、`include()`(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`、entity handler);`.module`/`.theme`/`.install`/`.inc` 中的 `hook_*` 实现 |
| **Rails** | `get '/x', to: 'users#index'`、`=>` 火箭符语法 |
| **Spring** | 方法上的 `@GetMapping`、`@PostMapping`、`@RequestMapping` |
| **Play** | `conf/routes` 中的 `GET`/`POST`/… 动词路由 → `Controller.method` action(Scala + Java) |
| **Gin / chi / gorilla / mux** | `r.GET(...)`、`router.HandleFunc(...)` |
| **Axum / actix / Rocket** | `.route("/x", get(handler))` |
| **ASP.NET** | action 方法上的 `[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 selector;某个 JS 文件通过 React Native 桥调用原生模块;某个 JSX 组件委托给原生 view manager。静态 tree-sitter 抽取在每个语言边界都会停下。CodeGraph 把这些边界桥接起来,让 `codegraph_explore` 跨越缝隙把流程端到端连上 —— 调用路径与爆炸半径会*穿过*边界,而不是停在那里。
| 边界 | JS / Swift 侧 | 原生侧 | 实现方式 |
|---|---|---|---|
| **Swift → ObjC** | Swift `obj.foo(bar:)` | ObjC selector `-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-name → 原生方法映射 |
| **React Native TurboModules** | JS `import M from './NativeM'; M.fn(...)` | 符合 Codegen 规范的原生实现 | 把 `Native.ts` spec 接口视为真相来源 |
| **RN 原生 → JS 事件** | JS `new NativeEventEmitter(...).addListener('e', cb)` | ObjC `[self sendEventWithName:@"e" body:...]` · Swift `sendEvent(withName: "e", ...)` · Java/Kotlin `.emit("e", ...)` | 按事件名字面量合成跨语言事件通道 |
| **Expo Modules** | JS `requireNativeModule('X').fn(...)` | Swift / Kotlin `Module { Name("X"); AsyncFunction("fn") { ... } }` | 解析 Expo DSL 字面量;合成的方法节点通过已有的名字匹配解析 |
| **Fabric 视图组件** | JSX `` | TS Codegen spec + 原生实现类 | spec → `component` 节点;基于约定的名字+后缀查找(`View`/`ComponentView`/`Manager`/`ViewManager`)桥接到原生 |
| **旧版 Paper view manager** | JSX `` | ObjC `RCT_EXPORT_VIEW_PROPERTY` · Java/Kotlin `@ReactProp` | 与 Fabric 相同 —— Paper 时代的声明也会产出 `component` + `property` 节点 |
**已在真实代码库上验证**(每种桥接均覆盖小、中、大三种规模):
| 桥接 | 小 | 中 | 大 |
|---|---|---|---|
| Swift ↔ ObjC | [Charts](https://github.com/danielgindi/Charts) | [realm-swift](https://github.com/realm/realm-swift) | [Wikipedia-iOS](https://github.com/wikimedia/wikipedia-ios) |
| RN 旧桥 | [AsyncStorage](https://github.com/react-native-async-storage/async-storage) | [react-native-svg](https://github.com/software-mansion/react-native-svg) | [react-native-firebase](https://github.com/invertase/react-native-firebase) |
| RN 原生 → JS 事件 | [RNGeolocation](https://github.com/Agontuk/react-native-geolocation-service) | — | react-native-firebase |
| Expo Modules | expo-haptics | expo-camera | expo SDK 一组(7 个包) |
| Fabric / Paper 视图 | [react-native-segmented-control](https://github.com/react-native-segmented-control/segmented-control) | [react-native-screens](https://github.com/software-mansion/react-native-screens) | [react-native-skia](https://github.com/Shopify/react-native-skia) |
每条桥接生成的边都标有 `provenance:'heuristic'`,并把 `metadata.synthesizedBy:` 设为稳定的通道名(如 `swift-objc-bridge`、`rn-event-channel`、`fabric-native-impl`、`expo-module-extract`),让 agent 一眼看出某条跳转是怎么进图谱的。
---
## 快速开始
### 1. 运行安装程序
```bash
npx @colbymchenry/codegraph
```
安装程序会:
- 询问要配置哪些 agent —— 自动从以下列表里探测已安装的:**Claude Code**、**Cursor**、**Codex CLI**、**opencode**、**Hermes Agent**、**Gemini CLI**、**Antigravity IDE**、**Kiro**
- 提示把 `codegraph` 装到你的 PATH 上(这样 agent 才能启动 MCP 服务器)
- 询问配置是应用到所有项目,还是只应用到当前项目
- 写入所选每个 agent 的 MCP 服务器配置,并在 agent 的指引文件(`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`)中追加一小段带标记围栏的 CodeGraph 区块 —— 这就是子 agent 和非 MCP 类 agent 学会 `codegraph explore` 命令的途径,因为 MCP 服务器自身的指引只会到达主 agent。`codegraph uninstall` 会干净地移除。
- 当 Claude Code 是目标之一时,设置自动放行权限
安装程序**只接入 agent —— 不会索引你的代码。** 它结束之后,请用 `codegraph init`(第 3 步)为每个项目构建图谱。一次全局的 `codegraph install` 适用于所有项目;而 `codegraph init` 需要每个项目各跑一次。
**非交互模式(脚本 / CI):**
```bash
codegraph install --yes # 自动探测 agent,全局安装
codegraph install --target=cursor,claude --yes # 显式指定目标列表
codegraph install --target=auto --location=local # 探测到的 agent,仅当前项目
codegraph install --print-config codex # 打印片段,不写文件
```
| 标志 | 取值 | 默认值 |
|---|---|---|
| `--target` | `auto`、`all`、`none` 或 csv(`claude,cursor,...`) | 提示 |
| `--location` | `global`、`local` | 提示 |
| `--yes` | (布尔) | 每步都提示 |
| `--no-permissions` | (布尔) 跳过 Claude 自动放行列表 | 默认开启权限 |
| `--print-config ` | 打印某个 agent 的片段并退出 | — |
### 2. 重启你的 agent
重启你的 agent(Claude Code / Cursor / Codex CLI / opencode / Hermes Agent / Gemini CLI / Antigravity IDE / Kiro),让 MCP 服务器加载。
### 3. 初始化项目
```bash
cd your-project
codegraph init
```
构建按项目存储的知识图谱索引,之后每次文件改动都会自动同步。一次全局的 `codegraph install` 在你打开的每个项目里都生效 —— 不必每个项目都重跑安装程序。
完成 —— 只要存在 `.codegraph/` 目录,agent 就会自动使用 CodeGraph 工具。
手动安装(备选)
**全局安装:**
```bash
npm install -g @colbymchenry/codegraph
```
**加入 `~/.claude.json`:**
```json
{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}
```
**加入 `~/.claude/settings.json`(可选,用于自动放行):**
```json
{
"permissions": {
"allow": [
"mcp__codegraph__*"
]
}
}
```
一条通配符就自动放行所有 CodeGraph 工具 —— 默认只有 codegraph_explore 列出,但如果你通过 CODEGRAPH_MCP_TOOLS 重新启用其他工具,它们也已被允许,不会再弹提示。
Agent 工具指引
CodeGraph 的 MCP 服务器会在 MCP `initialize` 响应中**自动**把使用指引送达你的 agent。简而言之,它会告诉 agent:
- **直接用 CodeGraph 回答结构性问题** —— 它*本身*就是预先构建好的索引,所以 grep/read 循环只是在重复它已经做过的工作。把返回的源码当作已读处理。
- **几乎凡事都先用 `codegraph_explore`** —— "X 是怎么工作的"、某个流程/"X 怎么到达 Y"、或考察一片区域。一次调用即可返回相关符号按文件分组的逐字源码、它们之间的调用路径(含动态分发跳转)以及爆炸半径摘要。在查询里点名某个文件或符号,就能读到它当前带行号的源码。
- **信任结果 —— 不要再用 grep 二次验证**,并在编辑后注意过期横幅。
- **按项目工作**:通过传 `projectPath` 查询任何有 `.codegraph/` 索引的项目 —— 这样一个只索引了部分服务的单体仓库,或第二个仓库,都能在同一个会话里使用。没有索引的路径会返回清晰的、引导使用内置工具的提示;建不建索引始终由你决定。
完整文本位于 `src/mcp/server-instructions.ts` —— 主 agent 的唯一真相来源。由于子 agent 与非 MCP 框架永远看不到 MCP 指引,安装程序也会在 agent 的指引文件里写一小段带标记围栏的区块,指向 CLI 的 `codegraph explore` 等价命令。
---
## 工作原理
```
┌───────────────────────────────────────────────────────────────────┐
│ Claude Code │
│ │
│ "一个请求是如何到达数据库的?" │
│ 直接调用 CodeGraph 工具 —— 没有 Explore 子 agent │
│ │ │
└─────────────────────────────────┴─────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────┐
│ CodeGraph MCP 服务器 │
│ │
│ explore · 一次调用 → 逐字源码 + 调用流程 + 爆炸半径 │
│ │ │
│ ▼ │
│ SQLite 知识图谱 │
│ 符号 · 边 · 文件 · FTS5 全文搜索 │
└───────────────────────────────────────────────────────────────────┘
```
1. **抽取** —— [tree-sitter](https://tree-sitter.github.io/) 把源码解析为 AST。语言相关的查询抽取出节点(函数、类、方法)和边(调用、导入、继承、实现)。
2. **存储** —— 一切都写入本地 SQLite 数据库(`.codegraph/codegraph.db`),带 FTS5 全文搜索。
3. **解析** —— 抽取之后会进行引用解析:函数调用 → 定义、import → 源文件、类继承,以及框架相关的模式。
4. **自动同步** —— MCP 服务器使用 OS 原生文件事件监视你的项目。改动会经过防抖(2 秒静默窗口)、过滤(仅源码文件),然后增量同步。图谱随你编码实时新鲜 —— 无需任何配置。
---
## CLI 命令参考
```bash
codegraph # 运行交互式安装程序
codegraph install # 运行安装程序(显式)
codegraph uninstall # 从你的 agent 中移除 CodeGraph(与 install 相反)
codegraph init [path] # 初始化项目并构建图谱(一步完成)
codegraph uninit [path] # 从项目中移除 CodeGraph(--force 跳过提示)
codegraph index [path] # 全量索引(--force 重新索引,--quiet 减少输出)
codegraph sync [path] # 增量更新
codegraph status [path] # 显示统计信息
codegraph unlock [path] # 移除阻碍索引的过期锁文件
codegraph query # 搜索符号(--kind、--limit、--json)
codegraph explore # 一次拿到相关符号源码 + 调用路径(与 codegraph_explore MCP 工具输出一致)
codegraph node # 单个符号的源码 + 调用方,或带行号读取文件(与 codegraph_node 输出一致)
codegraph files [path] # 显示文件结构(--format、--filter、--max-depth、--json)
codegraph callers # 查找谁调用了某函数/方法(--limit、--json)
codegraph callees # 查找某函数/方法调用了什么(--limit、--json)
codegraph impact # 分析改动某符号会影响哪些代码(--depth、--json)
codegraph affected [files...] # 找出受改动影响的测试文件(详见下文)
codegraph daemon # 管理后台守护进程 —— 选一个停止(别名:daemons)
codegraph telemetry [on|off] # 显示或更改匿名用量遥测
codegraph upgrade [version] # 升级到最新版本(--check、--force)
codegraph version # 打印已安装版本(也可用 -v、--version)
codegraph help [command] # 显示帮助,可选指定某条命令
```
### `codegraph affected`
传递地追踪 import 依赖,找出哪些测试文件会受改动的源文件影响。
```bash
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` | 从 stdin 读取文件列表 | `false` |
| `-d, --depth ` | 最大依赖遍历深度 | `5` |
| `-f, --filter ` | 用于识别测试文件的自定义 glob | 自动检测 |
| `-j, --json` | 以 JSON 输出 | `false` |
| `-q, --quiet` | 只输出文件路径 | `false` |
**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 工具
作为 MCP 服务器运行时,CodeGraph 只暴露**一个工具** —— `codegraph_explore`。实测的 agent 行为显示:一个强力工具比一打窄工具更能引导 agent —— 错选更少,且每个会话都能节省上下文:
| 工具 | 用途 |
|------|---------|
| `codegraph_explore` | 一次调用回答几乎所有问题 —— "X 怎么工作"、某个流程("X 如何到达 Y")、或考察一片区域 —— 返回相关符号按文件分组的逐字源码、它们之间的调用路径,以及爆炸半径摘要。会暴露 grep 跟踪不到的动态分发跳转(回调、React 重渲染、interface→impl)。在查询里点名文件或符号,即可读到它当前带行号的源码,与 Read 工具的形态一致。 |
其余工具(`codegraph_node`、`codegraph_search`、`codegraph_callers`、`codegraph_callees`、`codegraph_impact`、`codegraph_files`、`codegraph_status`)依然完全可用,但**默认不列出** —— 它们返回的所有内容已经在 `codegraph_explore` 上内联呈现(它的爆炸半径段、关系图、某符号的函数体作为它的被调用方列表)。可通过 `CODEGRAPH_MCP_TOOLS` 环境变量为 MCP 表面重新启用其中任意工具(例如 `CODEGRAPH_MCP_TOOLS=explore,node,search,callers`),或使用它们的 CLI 等价命令(`codegraph node` / `query` / `callers` / `callees` / `impact` / `files` / `status`)。
即便服务器自身的根目录没有 `.codegraph/` 索引,工具也始终可用:传 `projectPath` 即可在同一会话里查询任何已索引的项目 —— 单体仓库中的某个子服务,或第二个仓库。没有索引的路径会返回清晰的、引导使用内置工具的提示,因此不会有任何东西报错失败,而是否索引仍由你决定。
---
## 作为库使用
CodeGraph 可以直接嵌入。npm 包重新导出了它的程序化 API,所以 `import` 和 `require` 都能在你自己的进程里拿到 `CodeGraph` 类 —— 适合嵌入到应用里(例如 Electron 主进程)。
```typescript
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`),让配套的、携带编译好的库与依赖的 per-platform 包随 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 的文件** —— 生成的 bundle、压缩过的 JS、第三方大块二进制。
想把别的东西也排除?加进 `.gitignore`。想把默认排除的目录重新拉**进来**(比如你确实想把某个 vendor 依赖纳入索引),加一条取反 —— `!vendor/`。默认规则一视同仁,所以把依赖或构建目录提交进仓库并不会强行让它进图谱;`.gitignore` 取反才是显式的 opt-in。
但 `.gitignore` 没法把已经**提交**进仓库的目录排除掉。对于 check-in 的第三方主题或 SDK(比如 `static/` 下的 Metronic 主题),把它列在 `codegraph.json` 的 `exclude` 下 —— gitignore 风格的模式,按"相对仓库根"路径匹配,在索引、同步、监听时一并尊重:
```json
{
"exclude": ["static/", "**/vendor/**"]
}
```
### 自定义文件扩展名
如果你的项目对某个[支持的语言](#支持的语言)使用了非标准扩展名 —— 比如用 `.dota_lua` 表示 Lua、用 `.tpl` 表示 PHP —— 这些文件默认会被跳过,因为该扩展名 CodeGraph 不认识。在项目根加一个可选的 **`codegraph.json`** 即可映射:
```json
{
"extensions": {
".dota_lua": "lua",
".tpl": "php"
}
}
```
每个值是一个受支持的语言 id。该映射会叠加到内置默认之上,冲突时以你的为准,所以你也可以重新指派某个内置映射(例如 `".h": "cpp"`)。把这个文件提交进仓库即可与团队共享。语言名拼写错误或文件格式有问题都会被警告并跳过 —— 永远不会让索引崩溃 —— 没有 `codegraph.json` 的项目行为与之前完全一致。新增或修改映射后请重新索引(`codegraph index`)。
## 遥测
CodeGraph 收集**匿名使用统计** —— 哪些工具与命令被使用、哪些语言被索引 —— 以指导语言与 agent 支持的投入方向。**绝不**收集任何代码、路径、文件或符号名、查询内容或 IP 地址;用量先在本地聚合成每日总量,再发送任何东西,且采集端点就是[本仓库里的公开代码](telemetry-worker/),强制执行文档所列的字段清单。安装程序会在最前面向你确认;随时可关:
```bash
codegraph telemetry off # 或:CODEGRAPH_TELEMETRY=0,或 DO_NOT_TRACK=1
```
[`TELEMETRY.md`](TELEMETRY.md) 列出了每一个字段、关闭开关,以及完整的数据处理细节。
## 支持平台
每次发布都附带一个自包含构建(捆绑 Node 运行时 —— 无需编译),覆盖三种桌面 OS、x64 与 ARM(arm64)双架构:
| 平台 | 架构 | 安装方式 |
|----------|---------------|---------|
| Windows | x64, arm64 | PowerShell 安装器或 npm |
| macOS | x64, arm64 | shell 安装器或 npm |
| Linux | x64, arm64 | shell 安装器或 npm |
一行安装命令见 [快速开始](#快速开始)。
## 支持的 Agent
交互式安装程序会自动探测并配置下列每一项 —— 接入 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++ 解析可能不完整) |
| Metal | `.metal` | 完整支持(vertex/fragment/kernel 函数、struct、type alias、调用边 —— MSL 按 C++ 解析,并处理 `[[attribute]]` 注解) |
| CUDA | `.cu`, `.cuh` | 完整支持(kernel 与 device/host 函数、struct、class、通过 `<<>>` 启动语法的 host→kernel 调用边 —— 含模板化启动、函数指针启动(`auto kernel = &fn<...>`)、`dim3{...}` 配置和宏定义的 kernel;处理 `__global__`/`__device__`/`__launch_bounds__` 说明符;普通 `.h`/`.hpp` 头里的 CUDA 按内容识别) |
| Swift | `.swift` | 完整支持 |
| Kotlin | `.kt`, `.kts` | 完整支持 |
| Scala | `.scala`, `.sc` | 完整支持(class、trait、method、type alias、Scala 3 enum) |
| Dart | `.dart` | 完整支持 |
| Svelte | `.svelte` | 完整支持(script 抽取、Svelte 5 runes、SvelteKit 路由) |
| Vue | `.vue` | 完整支持(script + script-setup 抽取、Nuxt page/API/middleware 路由) |
| Astro | `.astro` | 完整支持(frontmatter + script 抽取、模板里的 component/call 引用、`src/pages/` 路由) |
| Liquid | `.liquid` | 完整支持 |
| Pascal / Delphi | `.pas`, `.dpr`, `.dpk`, `.lpr` | 完整支持(类、record、interface、enum、DFM/FMX form 文件) |
| Lua | `.lua` | 完整支持(函数、带 receiver 的方法、局部变量、`require` 导入、调用边) |
| R | `.R` `.r` | 完整支持(各种赋值形式中的函数、S4/R5/R6 类与方法、`library`/`require` 导入、`source()` 文件引用、调用边) |
| Luau | `.luau` | 完整支持(含 Lua 全部能力,外加 `type`/`export type` 别名、带类型签名、Roblox 实例路径 `require`) |
| CFML | `.cfc`, `.cfm`, `.cfs` | 完整支持(标签式 ``/`` 与裸脚本 `component { ... }` 风格、`extends`/`implements`、内嵌 `` 委托、调用边) |
| COBOL | `.cbl`, `.cob`, `.cpy` | 完整支持(program、section/paragraph 含 PERFORM/GO TO 调用边、CALL 'literal' 跨程序调用、COPY copybook 导入 —— 包括独立 `.cpy` 文件 —— DATA DIVISION 的 record/field/88-level、EXEC CICS LINK/XCTL 与 EXEC SQL INCLUDE 目标;固定格式与自由格式) |
| Visual Basic .NET | `.vb` | 完整支持(类、Module、interface、structure、enum、property、event、`Declare` P/Invoke、`Handles`/`WithEvents`、`Inherits`/`Implements` 边、穿过 VB 调用/索引括号歧义的调用边、`As New` 实例化、内插字符串、LINQ、Unicode 标识符) |
| Erlang | `.erl`, `.hrl`, `.escript`, `.app.src`, `.app` | 完整支持(多子句/多 arity 分组的函数、`-spec` 签名、带字段的 record、`-type`/`-opaque` 别名、`-define` 宏、`-include`/`-include_lib`/`-import` 边、本地与 `mod:fn` 远程调用边、`fun name/arity` 引用、`spawn`/`apply`/`proc_lib`/`timer`/`rpc` 的 MFA 参数调用边、`gen_server:call/cast(?MODULE)` → 自身 `handle_call`/`handle_cast` 链接、`-behaviour` 链接、基于 `-export` 的可见性) |
| Solidity | `.sol` | 完整支持(contract、library、interface、struct、enum、modifier、event、error、state variable、`import`/`using` 指令、`emit`/`revert` 调用) |
| Terraform / OpenTofu | `.tf`, `.tfvars`, `.tofu` | 完整支持(resource、data source、module、variable、output、provider、`locals`;`var.`/`local.`/`module.`/resource 引用,遵循 Terraform 的按目录作用域;跨边界桥接 module 调用 —— 输入连到子 module 的 variable、`module.M.out` 连到子 module 的 output、`source` 连到该 module 的文件;`.tfvars` 赋值连到它设置的 variable) |
## 实测的跨文件覆盖率
影响范围与爆炸半径查询的好坏,全看背后的依赖图。所以覆盖率是**测**出来的,不是**说**出来的。**公平覆盖率** = 在每种语言的真实基准仓库上,至少拥有*一个已解析的跨文件依赖*(import、call、reference,或通过框架约定路由到它)的"含符号源文件"占比。剩余的部分始终是真正的静态分析前沿(运行时动态分发、反射/DI 容器、框架约定入口、第三方 vendored 代码),绝不会通过对分母动手脚来掩盖。
| 语言 | 基准仓库 | 覆盖率 |
|---|---|---|
| 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% |
| 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 使用文件式路由,所以它们的 page/endpoint 覆盖率就是上表中的 Svelte/SvelteKit(100%)、Vue/Nuxt(93.5%)、Astro(93.0% —— 在两个验证仓库里每个 `src/pages/` 文件都映射到一个 route 节点)。
## 故障排查
**"CodeGraph not initialized"** —— 先在项目目录运行 `codegraph init`。
**索引很慢** —— 检查 `node_modules` 等大目录是否被排除。用 `--quiet` 减少输出开销。
**MCP 报 `database is locked`** —— 当前构建本不该出现:CodeGraph 自带 Node 运行时,使用 Node 内置的 `node:sqlite`,启用 WAL 模式,并发读永远不会阻塞写。如果仍然出现:
- **你装的是老版本(pre-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 服务器连不上** —— agent 自己启动该服务器,你不需要手动启动。确保项目已初始化并索引(`codegraph status`),且 MCP 配置里的路径正确。如果还是连不上,重跑 `codegraph install` 重写配置。
**`codegraph status`/`sync` 一切正常,但 MCP 工具调用报 `Transport closed`** —— 几乎都是 WSL2 且项目位于 Windows 盘(`/mnt/c` 或 `/mnt/d` 路径)的情况:CodeGraph 用来跨会话共享同一个后台服务器的本地 socket 在该文件系统上不可靠。CodeGraph 现在会退化为在会话内 in-process 服务,而不是掉线,但如果还遇到,可以在 MCP 服务器的环境里设 `CODEGRAPH_NO_DAEMON=1` 完全跳过共享服务器(每个会话各自一个进程)。把项目挪到 Linux 原生文件系统(比如 `~/` 之下而不是 `/mnt/`)即可恢复共享服务器。
**符号缺失** —— MCP 服务器在保存时自动同步(等几秒)。必要时手动跑 `codegraph sync`。检查文件语言是否受支持、是否位于 `.gitignore` 目录或默认排除目录(如 `node_modules`、`dist`)。
**Windows 与 WSL 共用一份 checkout** —— 不要让两边指向同一个 `.codegraph/`:后台服务器锁与 SQLite 索引与写入它们的 OS 绑定,且 SQLite 锁在 WSL2/Windows 文件系统边界上不可靠。给每边各自一份索引,让它们处于同一棵代码树:在其中一边把 `CODEGRAPH_DIR` 设成不同名字 —— 比如 Windows 上设 `CODEGRAPH_DIR=.codegraph-win`,WSL 保持默认的 `.codegraph`。CodeGraph 在索引和监视时会跳过任何同级 `.codegraph-*` 目录,所以两边互不干扰。
## Star History
## 许可证
MIT
---
**为 AI 编程 agent 而生 —— Claude Code、Cursor、Codex CLI、opencode、Hermes Agent、Gemini CLI、Antigravity IDE、Kiro**
[报告 Bug](https://github.com/colbymchenry/codegraph/issues) · [请求功能](https://github.com/colbymchenry/codegraph/issues)