User 类的定义就在眼前,它还是来回读、猜、再读。那一刻我意识到,我一直在给 Agent 补各种能力,偏偏漏了最基础的一样:一张精确的代码地图。而市面上号称能补这块的,一个个 README 吹得天花乱坠,真假虚实全凭它们自己说。所以今天这篇,我们就不给面子了,直接上硬货:serena、codegraph、graphify、repomix,四个都是给 Agent 装「代码理解能力」的开源项目。同一台机器、同一组任务,谁行谁不行,拉出来溜一溜。来吧,揭晓答案。
这次怎么测的
同一台 Linux 机器,同一个测试项目(两个 Python 文件:user.py 定义 User 类和 greet(),main.py 引用它),四个工具全部实测:
•serena 1.6.1,uv tool install serena-agent
•codegraph 1.5.0,npm i -g @colbymchenry/codegraph
•graphify 0.9.36,uv tool install graphifyy
•repomix 1.18.0,npx repomix@latest
基准任务统一:装好 → 建索引/图谱 → 用「查 User 类」这个动作看它给出什么。GitHub 直连拉代码时踩了不少坑(这个放到最后说),但四个都跑通了。
四家的第一印象
find_symbol | ||||
query User | ||||
query | ||||
npx |
表格只能放一句话,下面逐个说清楚。

四个代码检索 Skill 横向对比总览
serena,最重的那个,也最像 IDE
安装是四个里最「正式」的:uv tool install -p 3.13 serena-agent,装完有 serena、serena-agent、serena-hooks 三个命令。在项目里 serena init 一次成功,自动配置 LSP 后端,还提示可以用 serena setup claude-code 接进 Claude Code。
$ serena initSerena version: 1.6.1Configuration file: ~/.serena/serena_config.ymlLanguage backend: LSPSerena has been initialised successfully.
serena tools list 拉开一看,全是 symbol 级的工具:find_symbol、find_declaration、find_referencing_symbols、find_implementations、rename_symbol、replace_symbol_body…… 别的工具是「帮你搜」,它是「帮你改」。如果你要的是让 Agent 对代码做重构、跨文件改引用,这是唯一一个原生支持这类操作的。
结论:重但值。 代价是要装 uv、要起 LSP 后端;换来的是四个里唯一 IDE 级的语义能力。
codegraph,索引快得离谱
npm i -g @colbymchenry/codegraph,Rust 内核,装完直接 codegraph init:
$ codegraph initIndexed 2 files● 8 nodes, 10 edges in 446ms(生成 .codegraph/codegraph.db,159KB)
446ms 建完两个文件的图谱,这个速度在四个里没有对手。查 User 类:
$ codegraph query "User"class Usersrc/user.py:4import usersrc/main.py:1from user import Userfile user.pysrc/user.py:1method saysrc/user.py:7
更贴心的是 codegraph node User 会把类的成员和调用链一次给全(Called by ← main.py),Agent 不用再自己拼。命令名和它 MCP 工具名一致,意味着 Agent 拿到的能力跟命令行测出来的一样,没有两套。
结论:如果要「快」和「给 Agent 的直接」,这是首选。 唯一小注意:它会收集匿名使用统计,codegraph telemetry off 可关。
graphify,唯一能「看」的
uv tool install graphifyy 装出 graphify 和 graphify-mcp 两个命令。跑一遍:
$ graphify .[graphify extract] found 2 code, 0 docs...[graphify extract] wrote graphify-out/graph.json: 6 nodes, 7 edges, 2 communities
它会生成 graph.html,浏览器打开能点节点、筛选、搜索。这是四个里唯一带可视化界面的。查询用的是 BFS 遍历:
$ graphify query "User 类依赖什么"NODE User [src=src/user.py loc=L4 community=0]EDGE User --method [EXTRACTED]--> .__init__() at src/user.py:L5EDGE User --method [EXTRACTED]--> .say() at src/user.py:L7EDGE .say() --calls [EXTRACTED]--> greet() at src/user.py:L8
它把 imports / contains / method / calls 这些边全标出来,还有 god-nodes(找枢纽)、path A B(两节点最短路径)、merge-graphs(跨仓库合并)。想「看懂一个陌生代码库长什么样」,它最合适。
结论:想看全景、想找枢纽节点,选它。 代价是它在生成可交互图这件事上花的心思,比纯「查得准」更多。
repomix,思路完全不同
npx repomix@latest,免安装,一行跑完。它不做索引,而是把整个代码库合并成一个 AI 友好文件:
$ npx -y repomix@latest --style markdown -o repomix-out.mdTotal Files: 10 filesTotal Tokens: 3,064 tokensSecurity: ✔ No suspicious files detected
生成 repomix-out.md(9,957 chars),带文件树、token 统计、安全扫描。你把它丢给 LLM,说「这个文件是全部代码,帮我分析」,它一次就能看到全部上下文,不用一点点翻。
结论:跟前三个不是一回事。 它解决的不是「检索」,是「把整个库一次喂给 LLM」。适合一次性分析、代码评审、给模型做全量上下文,不适合需要频繁精确查符号的场景。
拿一个「刁钻」任务压一压
我挑了个稍微带点语义的任务:问 User 类里 say() 调用了什么。

实测现场:同一个任务四个工具各给什么
•codegraph:codegraph node User 直接给出 Called by ← main.py 和成员列表,一步到位。
•graphify:query 把 EDGE .say() --calls --> greet() 这条边原样吐出来,带行号。
•serena:find_referencing_symbols / replace_symbol_body 这种粒度是另外两个给不了的,但它更偏向「改」而非「查」。
•repomix:不回答「谁调用谁」,但你把 repomix-out.md 丢给 LLM 后,它能把整个依赖关系讲明白。
如果 Agent 只是要快速定位,codegraph 和 graphify 都够用;如果要动手改,serena 独一档;如果是要一次性看懂整个库,repomix 是对的。
如果是我,我会怎么装
按需求选,不用纠结:
•要 Agent 对代码做重构、跨文件改引用 → serena,IDE 级能力只有它有。
•要轻、要快、要 Agent 能直接调 → codegraph,446ms 建索引,命令和 MCP 工具同名。
•想先看懂一个陌生库长什么样 → graphify,唯一带可视化,还有 god-nodes 找枢纽。
•要一次性把整个库喂给 LLM → repomix,免安装,安全扫描都替你做了。
另外两个小提醒:一是装这些前先确认有 uv(serena 和 graphify 都要)和 Node(codegraph 和 repomix 要);二是 GitHub 直连拉代码不稳,我这次 clone 超时了好几次,后来用 git clone https://gh-proxy.com/https://github.com/<owner>/<repo>.git 镜像才顺,装之前先把这个准备好。
来源:https://github.com/oraios/serena / https://github.com/colbymchenry/codegraph / https://github.com/Graphify-Labs/graphify / https://github.com/yamadashy/repomix
关注Agent技能库,每天认识一个可用的AI Agent Skill。
夜雨聆风