⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Fight/codegraph-agent-code-map/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

Claude Code 在大仓库里有个让人上头的毛病,它会迷路。你让它查一个模块的调用链,它先 ls,再 grep,再 Read 三个文件,发现不对,换关键词再搜,再开个子 agent 去探,子 agent 又读了七八个文件。转一圈回来,实际需要的那段代码只有两百行。

浪费时间还是其次,token 花掉这么多才让人难受。

它烧的不是时间,是上下文

CodeGraph 的产品界面

这不是模型太笨,是它手上没有地图。每次开工都得现场探索,就像你每次进一栋楼都要从地下室开始摸,而不是先看一眼楼层导览图。

CodeGraph 做的就是这张导览图。它在 agent 动手之前先把代码结构预建成一张图,agent 从定向查询开始,而不是从盲目探索开始。

效果官方拿数字量过。7 个真实开源仓库、7 种语言,每个仓库问一个架构问题,开与不开各跑 4 次取中位数,用的是较新的模型与较新的构建。通用结论是工具调用少 88%、速度快 53%、Token 少 62%、成本低 44%,七个仓库的文件读取全部降到零。不开图谱时,agent 最多要烧掉 43 次工具调用和 19 次文件读取。

代码库 语言与规模 工具调用 时间 文件读取 Token 成本
VS Code TypeScript 约 1.1 万文件 2 对 28 快 2.2 倍 0 对 12 少 77% 低 71%
Excalidraw TypeScript 约 640 文件 2 对 43 快 3.6 倍 0 对 18 少 84% 低 78%
Django Python 约 3 千文件 3 对 14 快 35% 0 对 8.5 少 41% 低 13%
Tokio Rust 约 790 文件 3 对 29 快 2.6 倍 0 对 19 少 65% 低 64%
OkHttp Java 约 645 文件 1 对 6 快 43% 0 对 2 少 54% 低 21%
Gin Go 约 110 文件 1 对 7 快 39% 0 对 4 少 52% 基本持平
Alamofire Swift 约 110 文件 4 对 33 快 2.6 倍 0 对 16.5 少 59% 低 57%

表里最值得看的其实是文件读取那一列。开着图谱时,agent 在七个仓库上一个文件都没打开,问题就答完了。这才是省 token 的主要来源,不是模型变快了,是它不再乱翻。

两个极端也说明问题。Excalidraw 那行,工具调用从 43 次降到 2 次,成本低 78%;Tokio 那行成本低 64%。反过来看 Gin,一百多个文件的项目,原生搜索本来就快,省下的成本基本可以忽略。

成本那一列的波动比另外三列大得多,因为它跟着问题需要多少探索走。在那些不开图谱要跑 28 到 43 次调用的仓库上,能省 57% 到 78%;而在 Django 和 Gin 上只有 13% 和持平。但开着图谱时,它俩仍然分别只用 3 次和 1 次调用,文件读取同样是零。

所以它对你有多大用,取决于你的仓库有多大、问题有多绕。

它凭什么知道代码在哪

建图流程示意

这张图不是搜索出来的,是解析出来的。每一层的选择都挺务实。

解析这一层用的是内核实现,把源码读成结构化的图,函数在哪、类继承了谁、这个 import 指向哪个文件,全部落成节点和边。不是为了快而快,官方给了一条硬标准,每种语言上线前,它跑出来的图谱都要和参考引擎在真实仓库上逐字节一致,从小型库一直测到 Linux 内核。目前覆盖二十种语言,平台没有预编译产物或者文件有语法错误时会按文件回退,图谱结果一样。

结果落在一个本地 SQLite 数据库里,路径是 .codegraph/codegraph.db,同时开了 FTS5 全文搜索。SQLite 够轻,没有服务要维护,冷启动和查询都快,不需要你先跑一个容器。

保持同步靠的是操作系统原生的监听事件。macOS 上是 FSEvents,Linux 上是 inotify,Windows 上是 ReadDirectoryChangesW,攒一小段 debounce 窗口之后增量更新。你不用手动重建索引。

最后以 MCP Server 的形式接出去,把能力暴露给 Claude Code、Cursor、Codex CLI、opencode、Hermes Agent、Gemini CLI、Antigravity IDE、Kiro 和 GitHub Copilot。Copilot 这一家还细分了三个入口,VS Code 里的 Copilot Chat、Copilot CLI,以及 JetBrains 里的 Copilot 插件。

整套东西都在本地跑,不联网也能用。

现在只暴露一个入口

这里跟很多人的印象不太一样。CodeGraph 通过 MCP 只暴露一个工具,codegraph_explore。

官方解释是实测出来的,一个强工具比一排窄工具更能引导 agent,误选更少,而且每次会话都能省下描述一堆工具的上下文。

这一个入口能一次回答好几类问题。问「某个功能怎么工作」、问「X 怎么走到 Y」、或者干脆让它调研某个区域,它返回按文件分组的符号原文、这些符号之间的调用路径,外加一份影响范围摘要。它还能跟住 grep 根本跟不了的动态分派跳转,回调、React 的重渲染、接口到实现的跳转都在里面。

其余工具并没有消失。codegraph_node、codegraph_search、codegraph_callers、codegraph_callees、codegraph_impact、codegraph_files、codegraph_status 功能都还在,只是默认不列出来,因为它们能返回的东西已经被那一个入口涵盖了。

想拆小逻辑的时候仍然用得上单跳遍历。查谁在调这个函数、这个函数又调了谁,用 callers 和 callees 更直接。

路由才是后端的真实入口

Web 后端项目有个特殊性,代码的真实入口不是 main,是路由。/api/user/login 这个地址到底走到哪个 controller、哪个 handler、哪个 view,不同框架写法差异很大,人去找都费劲,agent 更费劲。

CodeGraph 专门处理了这一类。它识别 Web 框架的路由文件,生成 route 节点,再用 references 边连到处理函数或类。你查一个 view 或 controller 的调用方时,能直接看到绑定它的那个 URL。

覆盖面比想象中宽,Django、Flask、FastAPI、Express、NestJS、Laravel、Drupal、Rails、Spring、Play、Gin 与 chi 与 gorilla 与 mux、Axum 与 actix 与 Rocket、ASP.NET、Vapor、Astro 都在里面,一共十七类框架。

举个具体的。以前让 agent 去追一个 NestJS 里 @Post('/auth/login') 到底走到哪个 service,它得翻好几层装饰器才找得到。现在直接把 handler 和那条 URL 一起给它。

装它只用三步

安装界面

第一步装命令行,安装包自带运行时,不需要你先装 Node。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

装完记得开一个新终端。 安装器会把命令放进 PATH,但它改不了你当前这个 shell,不开新终端下一步的命令解析不到。

第二步,在新终端里把它接上你的 agent。

codegraph install

这条命令会自动检测你装了哪几家 agent,然后问你要配哪几个,把 MCP server 写进去。Claude Code、Cursor、Codex CLI 这些都在支持列表里。

注意这一步只接 agent,不建索引,也不再往项目里写指令文件,用法指引由 server 自己带着。

第三步,进项目目录建索引。

cd your-project
codegraph init -i

之后只要项目里有 .codegraph/ 目录,agent 就会自动走 CodeGraph,不用你每次交代。整个过程正常项目十分钟内能搞完,首次建索引要等一下,之后都是增量同步。

以后升级就用一条。

codegraph upgrade

加上参数可以只检查有没有新版本,也可以锁到指定版本。

它吃哪些语言

支持二十种语言,对多语言仓库有实际参考价值。TypeScript 含 .tsx、JavaScript 含 .mjs、Python、Go、Rust、Java、C#、PHP、Ruby、C 与 C++、Swift、Kotlin、Scala、Dart、R、Lua、Luau,Metal 与 CUDA 走 C++ 那条路径。

全栈项目前后端语言混着用,TypeScript 加 Python、Go 加 TypeScript 这类组合,一套索引全部建进去,agent 查的时候不用按语言切换工具。

几个容易踩空的地方

MCP 配置不对,agent 会直接绕开它。 工具装了但配置没写进去,或者 server 没在跑,agent 照样开 grep 与 Read 的循环,你以为在省 token,其实什么都没变。装完先确认一下状态。

小仓库别期望太高。 Gin 那行就是证据,一百多个文件的项目原生搜索本来就不慢。它的目标受众是中大型仓库。

首次建索引要等。 VS Code 那种一万多文件的规模,第一次建索引有耗时,好在之后都是增量。

注意 .gitignore 的覆盖范围。 它默认尊重你的忽略规则,node_modules 和构建产物不会被索引。但如果仓库里有大量提交进去的依赖目录,记得手动补进去。

网络盘和 WSL2 挂载目录下可能出问题。 SQLite 在网络文件系统上的老毛病,遇到锁库报错时先看一眼状态里 Journal 是不是 wal。如果不是,把项目连同 .codegraph/ 一起挪到本地磁盘就好了。

它值得跟,但别指望它救小项目

热度那一节的配图

回头说它当时为什么火。五月底那一周它涨了一万四千多 Star,冲上 TypeScript 全球趋势第一,HN 上那个帖子五百多赞、两百多条评论。这个量级对开发工具来说不小。

现在它已经有七万三千多 Star,一月建库,最近还在提交。

火的逻辑不难理解。大家用 agent 用得越来越重,同时也越来越清楚一件事,模型能力已经不是瓶颈,上下文质量才是。agent 读了一堆无关文件,上下文被污染,回答质量自然下来。不是模型不够强,是你喂给它的东西不对。

CodeGraph 走的就是这条路,在 agent 开始工作之前给它一张预建的、干净的地图。这个思路比换更强的模型更实际,也更便宜。Tokio 那行就是例子,差的不是模型版本,是有没有一张地图。

仓库首页实时截图

同类工具已经冒出来一批。有的覆盖面更宽,数据库结构、PDF、视频都能建图;各种打着「代码库记忆」旗号的 MCP 服务也在增加,思路都差不多,给 agent 补一层它现在没有的外部记忆。

CodeGraph 在这条赛道里做得比较干净的地方是零配置、自带运行时、一行安装,和主流 agent 的集成是现成的。它没想做万能助手,只做地图这一件事。

至于你该不该装,看仓库规模。几千个文件以上、agent 经常在大范围找东西,收益很明显。一百多个文件的小项目,先别折腾。

仓库在 https://github.com/colbymchenry/codegraph

文章目录
  1. 1. 它烧的不是时间,是上下文
  2. 2. 它凭什么知道代码在哪
  3. 3. 现在只暴露一个入口
  4. 4. 路由才是后端的真实入口
  5. 5. 装它只用三步
  6. 6. 它吃哪些语言
  7. 7. 几个容易踩空的地方
  8. 8. 它值得跟,但别指望它救小项目