Skip to content

CodeGraph 阅读笔记

阅读对象:colbymchenry/codegraph main 分支。
阅读时间:2026-05-29。
说明:本笔记基于 README、文档、benchmark 记录和关键源码阅读;未本地构建、未运行测试、未复跑 benchmark。

1. 一句话结论

CodeGraph 是一个给 AI 编程 agent 用的本地代码语义索引系统:它先把项目解析成 SQLite 代码图谱,再通过 MCP 工具把“符号搜索、调用链、相关代码上下文、影响范围”暴露给 Claude Code、Codex、Cursor、Gemini 等 agent。

它解决的不是“模型不会读代码”,而是“模型在大仓库里读到正确代码之前,会消耗大量 grep、glob、Read 和子 agent 探索成本”。

2. 它想解决什么问题

AI agent 分析大仓库时,常见路径是:

  1. 先猜关键词。
  2. 用 grep/glob 找文件。
  3. Read 多个候选文件。
  4. 继续沿调用链、路由、类型、导入关系搜索。
  5. 上下文膨胀,工具调用变多,成本和延迟上升。

CodeGraph 的思路是把这部分探索前置:

  1. 初始化时扫描项目。
  2. 用 tree-sitter 抽取符号。
  3. 用 resolver 补全跨文件关系。
  4. 存成本地 SQLite 图。
  5. agent 提问时,先查图,再按需读取少量源码片段。

所以它更像“代码库导航索引”,不是传统向量 RAG,也不是运行时分析器。

3. 用户侧使用方式

README 给出的主路径:

bash
codegraph init -i

init 创建项目内 .codegraph/ 目录;-i 会同时建立初始索引。

安装器可自动配置多个 agent:

  • Claude Code
  • Cursor
  • Codex CLI
  • opencode
  • Hermes Agent
  • Gemini CLI
  • Antigravity
  • Kiro

CLI 入口在 src/bin/codegraph.ts。无参数运行时进入交互安装器;有参数时进入普通 CLI。主要命令包括:

  • codegraph init
  • codegraph index
  • codegraph sync
  • codegraph status
  • codegraph query
  • codegraph files
  • codegraph context
  • codegraph callers
  • codegraph callees
  • codegraph impact
  • codegraph affected

4. 项目源码分层

源码主要分层:

text
src/
  bin/          CLI 入口、Node 版本检查、卸载逻辑
  db/           SQLite 连接、schema、query 封装、迁移
  extraction/   文件扫描、语言检测、tree-sitter 解析、WASM worker
  resolution/   引用解析、import 解析、框架 resolver、跨语言桥接
  graph/        BFS/DFS、调用图、影响范围、依赖图查询
  context/      从用户任务构建相关代码上下文
  mcp/          MCP server、daemon、session、tools
  sync/         文件监听、git hook、增量同步、worktree 检测
  installer/    各 agent 配置写入/卸载
  search/       查询解析、搜索词处理、路径/测试文件评分

这套分层很直接:先建图,再查图,再把结果包装成 agent 能用的 MCP 输出。

5. 核心数据模型

核心 schema 在 src/db/schema.sql

5.1 nodes

nodes 表表示代码符号。典型字段:

  • kind
  • name
  • qualified_name
  • file_path
  • language
  • start_line / end_line
  • signature
  • docstring
  • visibility
  • is_exported
  • is_async
  • decorators

支持的节点类型在 src/types.ts

  • file
  • module
  • class
  • struct
  • interface
  • trait
  • protocol
  • function
  • method
  • property
  • field
  • variable
  • constant
  • enum
  • type_alias
  • namespace
  • parameter
  • import
  • export
  • route
  • component

这说明 CodeGraph 不只关心函数,也把路由、组件、类型结构放进图里。

5.2 edges

edges 表表示符号关系。主要关系:

  • contains
  • calls
  • imports
  • exports
  • extends
  • implements
  • references
  • type_of
  • returns
  • instantiates
  • overrides
  • decorates

edge 带 provenance 字段,用来区分来源:

  • tree-sitter
  • scip
  • heuristic

这一点很重要:它没有假装所有关系都同等可靠。动态回调、框架约定等关系可以用 heuristic 补边。

5.3 FTS

schema 里有 nodes_fts,基于 SQLite FTS5,索引:

  • name
  • qualified_name
  • docstring
  • signature

这也是它搜索快的关键。它不是 embedding 检索,而是符号/文本检索 + 图扩展。

6. 索引流程

主类在 src/index.ts,核心方法是 CodeGraph.indexAll()

完整流程大致是:

  1. 初始化 tree-sitter grammar。
  2. 扫描项目文件。
  3. 检测框架。
  4. worker 线程解析文件。
  5. 写入 nodes、edges、unresolved refs。
  6. resolver 解析 unresolved refs。
  7. 框架 resolver 做 post-extract 修正。
  8. SQLite 做 PRAGMA optimize 和 WAL checkpoint。

6.1 文件扫描

扫描逻辑在 src/extraction/index.ts

优先用 git:

  • git ls-files -c --recurse-submodules
  • git ls-files -o --exclude-standard
  • 支持嵌套 git repo
  • 支持 submodule

非 git 项目走 filesystem walk,并解析 .gitignore

内置默认忽略大量噪声目录:

  • node_modules
  • dist
  • build
  • .next
  • .nuxt
  • .venv
  • target
  • vendor
  • .build
  • Pods
  • DerivedData
  • coverage

这里取舍很明确:CodeGraph 索引“用户代码”,不是依赖、构建产物和生成噪声。

6.2 解析策略

解析用 tree-sitter WASM grammar。为了防止 WASM 内存膨胀,代码里做了几层保护:

  • 单文件大小上限:1MB。
  • 解析 worker 超时:基础 10s,大文件额外加时。
  • worker 每解析 250 个文件回收一次。
  • worker 崩溃或超时时重启。
  • WASM memory error 会重试。
  • 最后会尝试 strip comment-only lines 再解析部分失败文件。

这些处理说明项目作者实际遇过大仓库、生成文件、语法边界、WASM 内存等问题,不是 demo 级实现。

6.3 框架检测

索引前会用扫描到的文件做框架检测。resolver 初始化时也会检测框架。

README 中列出的框架覆盖包括:

  • Django / Flask / FastAPI
  • Express / NestJS
  • Laravel / Drupal / Rails
  • Spring
  • Gin / chi / gorilla / mux
  • Axum / actix / Rocket
  • ASP.NET
  • Vapor
  • React Router / SvelteKit

框架检测的核心价值:把 URL route 和 handler 绑定成图关系。这样 agent 问“请求如何到 service”,CodeGraph 能从路由节点走到 handler,再走调用链。

7. 引用解析

src/resolution/index.ts 是引用解析 orchestrator。

它处理:

  • import 解析
  • JVM import
  • Go module
  • tsconfig/jsconfig path alias
  • C/C++ include dirs
  • re-export
  • 框架 resolver
  • callback edge synthesis
  • Swift/ObjC、React Native、Expo Modules 等桥接

resolver 内部有多个 LRU cache:

  • file content cache
  • import mapping cache
  • name cache
  • qualified name cache
  • lower name cache

这里的重点不是“所有语言完美解析”,而是“常见路径足够实用,并且内存有边界”。

8. 查询和上下文构建

src/context/index.ts 是 agent 问题转代码上下文的核心。

codegraph_context 的路径:

  1. 从自然语言任务中提取潜在符号名。
  2. 精确查找符号。
  3. 对类名/接口名做前缀匹配。
  4. 用 FTS 做文本匹配。
  5. 合并结果并重新评分。
  6. 降低测试文件权重。
  7. 对核心目录做 boost。
  8. 从入口节点做图遍历。
  9. 提取关键源码片段。
  10. 输出 markdown 或 JSON。

它不是简单搜索。它在做一套面向 agent 的排名策略:

  • 精确符号优先。
  • 同文件多符号共现加分。
  • 测试文件默认降权。
  • 大项目核心目录加分。
  • 图扩展补齐上下文。
  • 源码片段有大小限制,防止污染上下文。

9. MCP 工具设计

MCP 工具定义在 src/mcp/tools.ts

主要工具:

工具用途
codegraph_search快速符号搜索,只返回位置,不返回源码
codegraph_context主工具,适合架构、bug、功能理解
codegraph_callers查某符号调用方
codegraph_callees查某符号被调用了什么
codegraph_impact改某符号的影响范围
codegraph_node查单个符号详情,可带源码
codegraph_explore一次返回多个相关文件的源码片段
codegraph_status查索引健康状态
codegraph_files查索引文件树
codegraph_trace查两个符号间调用路径

比较关键的设计:

  • codegraph_context 文案明确要求 agent 首先使用它。
  • codegraph_explore 输出预算按项目文件数调整。
  • 小项目减少输出,避免 MCP 自身开销超过收益。
  • 大项目允许更大输出,因为避免多轮 Read/Grep 更重要。
  • codegraph_node 对 class/interface 等容器节点默认给结构 outline,避免输出巨大 body。

这说明作者把“工具输出如何影响 agent 行为”当成核心问题,不只是做 API。

10. 同步和新鲜度

CodeGraph 最大风险之一是索引过期。它有三层处理。

10.1 watcher 自动同步

src/sync/watcher.ts 用 chokidar 监听源文件变化:

  • 默认 debounce:2000ms。
  • 支持 CODEGRAPH_WATCH_DEBOUNCE_MS
  • 忽略范围和索引器共用同一套规则。
  • 不监听 .git/.codegraph/
  • watcher 失败时不崩溃,用户可手动 codegraph sync

10.2 pending files 提示

watcher 会记录已改但未同步的文件。MCP 工具返回中会插入 stale notice,提示 agent 对这些文件直接 Read。

这比“强行等待同步完成”更实用:agent 可以继续工作,但不会误信旧索引。

10.3 connect-time catch-up

MCP engine 启动后会跑一次 sync(),处理 agent 启动前发生的改动,例如:

  • git pull
  • checkout
  • 另一个编辑器改了文件
  • 上次 agent 退出后文件变化

第一轮工具调用会等待 catch-up gate,避免刚启动就返回旧结果。

11. DB 和并发处理

SQLite 层在 src/db/index.tssrc/db/sqlite-adapter.ts

关键点:

  • 使用 Node 内置 node:sqlite
  • WAL 模式。
  • busy_timeout = 5000
  • foreign_keys = ON
  • synchronous = NORMAL
  • mmap_size = 256MB
  • 批量写后做 PRAGMA optimize
  • 批量写后做 passive WAL checkpoint。

CodeGraph.indexAll()sync() 同时用:

  • 进程内 mutex
  • 跨进程 file lock

这样 CLI、MCP server、git hook 同时触发索引时,不会互相踩数据库。

12. MCP server / daemon 模型

src/mcp/engine.ts 里有 shared engine。

设计意图:

  • direct mode:一个 stdio session 一个 engine。
  • daemon mode:一个 engine,多 session 共享。
  • 共享 SQLite 连接/索引和 watcher。
  • 避免每个 session 都建立一套 inotify watch。

这个设计针对 agent 场景很实际:多个连接、多个项目、多个工具调用同时存在时,不能每次都重新打开项目、重新监听文件。

13. benchmark 信息

README 当前 benchmark 写的是 v0.9.7 + Opus 4.8,2026-05-28 重新验证:

  • 平均 18% cheaper
  • 51% fewer tokens
  • 16% faster
  • 57% fewer tool calls

README 也主动说明:小仓库上成本可能不降,甚至略贵。原因是 CodeGraph 的丰富响应本身会消耗 input tokens,而现代模型原生搜索小仓库已经很便宜。

docs/benchmarks/codegraph-ab-matrix.md 另有 2026-05-24、v0.9.4 的 A/B 矩阵:

  • 37 个语言/规模组合。
  • with CodeGraph:38 reads / 22 greps。
  • without CodeGraph:159 reads / 72 greps。
  • 文件读取减少 76%。
  • grep 减少约 69%。
  • with-arm 0 Bash、0 sub-agent。

benchmark 的核心结论不是“所有成本都必降”,而是:

  • 大仓库探索工具调用显著下降。
  • 中大型真实 backend flow 最明显。
  • tiny repo 进入收益不明显区域。

14. 优点

14.1 面向 agent 行为设计

它不是只做一套查询 API。工具描述、输出预算、stale banner、context builder 都在引导 agent 少走弯路。

14.2 本地优先

不上传代码,不需要外部服务。对私有仓库和企业代码更友好。

14.3 图结构比纯 grep 更适合架构问题

“谁调用谁”“路由到哪里”“改这里影响哪里”这类问题,图比文本搜索更自然。

14.4 工程防护多

WASM worker 回收、文件大小限制、默认 ignore、LRU cache、WAL、lock、watcher fallback 都是大仓库真实问题的防线。

14.5 框架 resolver 增强实用性

很多代码关系不是语言语法本身表达的,而是框架约定表达的。例如:

  • Django urls.py
  • Express router
  • NestJS decorator
  • Rails routes
  • Laravel Route
  • React Native bridge

CodeGraph 把这些规则放进 resolver,是它比普通 tree-sitter symbol index 更有价值的地方。

15. 限制和风险

15.1 静态分析天然不完整

动态 dispatch、反射、运行时注册、字符串拼接路由、魔法方法,都可能断边。

CodeGraph 用 heuristic 补一些 callback/event edge,但这不能等于运行时真相。

15.2 需要初始索引

大项目首次索引会花时间。对于一次性、小仓库、简单任务,可能不划算。

15.3 查询质量依赖语言和框架支持

常见语言和框架效果更好。冷门语言、复杂宏、强动态框架,结果会弱。

15.4 输出本身也有 token 成本

README 已承认:小仓库或短问题里,CodeGraph 的上下文可能比直接 Read 更贵。

15.5 索引新鲜度不是零延迟

watcher 默认 2 秒 debounce。CodeGraph 用 stale banner 降低误读风险,但不是实时 AST。

15.6 不是完整 IDE 语义引擎

它不等同 TypeScript server、rust-analyzer、JDT、clangd。它更偏跨语言、跨框架、agent-friendly 的静态导航层。

16. 和常见方案对比

16.1 对比 grep/rg

grep 简单可靠,但不知道符号关系。CodeGraph 多了图关系和框架语义。

16.2 对比 LSP

LSP 精准但语言内聚,跨语言、跨框架、agent 输出不一定方便。CodeGraph 精度可能低于 LSP,但面向 agent 聚合上下文。

16.3 对比 embedding RAG

embedding 适合语义相似文本。CodeGraph 更适合结构化问题:调用、引用、继承、路由、影响范围。

16.4 对比 SCIP/Sourcegraph 风格索引

CodeGraph 更轻、更本地、更 agent-specific;但也没有完整企业代码搜索平台的权限、UI、跨 repo 索引能力。

17. 值得借鉴的设计

17.1 让工具直接匹配 agent 工作流

codegraph_context 不是“低层 API”,而是“一次回答架构问题”的高层工具。这个设计很适合 agent。

17.2 输出预算按项目规模调节

小仓库少给,大仓库多给。避免固定 token budget。

17.3 明确暴露不确定性

stale banner、heuristic provenance、status、worktree mismatch notice 都是在告诉 agent:“这个结果可能不是最终真相,需要补读。”

17.4 benchmark 用真实 agent 行为衡量

它不是只测 parser 速度,而是测 Claude headless 在真实仓库回答架构问题时的工具调用、tokens、时间、成本。

17.5 默认忽略噪声

把依赖、构建产物、cache、生成文件排除,是代码索引质量的基础。

18. 如果继续深入,建议读这些文件

  • src/index.ts:主类和生命周期。
  • src/extraction/index.ts:扫描、解析、worker、增量同步。
  • src/types.ts:节点/边/语言类型。
  • src/db/schema.sql:数据库结构。
  • src/resolution/index.ts:引用解析总入口。
  • src/resolution/frameworks/:框架 resolver。
  • src/context/index.ts:自然语言任务到上下文的转换。
  • src/mcp/tools.ts:MCP 工具定义和输出策略。
  • src/sync/watcher.ts:文件变更监听和 pending files。
  • src/mcp/engine.ts:MCP session/daemon 共享状态。
  • docs/benchmarks/:A/B benchmark 和评估说明。
  • docs/design/:动态 dispatch、callback edge、iOS/RN bridge 的设计文档。

19. 我的判断

CodeGraph 的价值点不在“解析所有代码绝对准确”,而在“给 agent 一个足够好的局部地图,让它更快走到正确文件”。这是很务实的方向。

它最适合:

  • 大仓库架构分析
  • 请求链路/调用链追踪
  • 改动影响分析
  • 多语言/多框架项目
  • agent 编码前快速建上下文

它不适合被当成:

  • 运行时真相来源
  • 完整 IDE language server
  • 小仓库所有任务的默认最优解
  • 绝对准确的 dependency graph

一句话:CodeGraph 是给 AI agent 用的“本地代码地图”。地图不等于实地,但能显著减少找路成本。

20. 资料链接

基于 VitePress 的个人知识库骨架