2026年8月13日
calldiff:别只看代码改了几行,还要看调用链怎么变了
AI 编码 Agent 一次能改很多文件,但传统 git diff 主要展示文本增删,很容易把真正重要的调用关系变化埋在线条里。calldiff 是一个面向 Agent 代码审查的 MIT 开源命令行工具:它比较两个 Git 状态中的函数调用树,让“谁开始调用谁、哪条路径被移走”
AI 编码 Agent 一次能改很多文件,但传统 git diff 主要展示文本增删,很容易把真正重要的调用关系变化埋在线条里。calldiff 是一个面向 Agent 代码审查的 MIT 开源命令行工具:它比较两个 Git 状态中的函数调用树,让“谁开始调用谁、哪条路径被移走”直接可见。
📌 这个项目是干什么的
calldiff 会读取提交、分支或工作区中的源码,按文件扩展名选择 Tree-sitter 语法,提取函数及其被调用对象,再生成调用树。它提供三种核心视角:diff 比较调用树变化,tree 查看指定入口的完整调用结构,reach 查找一个符号到另一个符号的所有调用路径。
项目声明支持 TypeScript、Python、Go、Rust、Java、C/C++ 等 22 种语言;输出既可以是适合人读的 ASCII 树,也可以转成 JSON、YAML、Markdown 或 JSONL,交给 Agent 和自动化脚本继续处理。
🔍 为什么值得关注
第一,它补上了 Agent 审查中的“结构差异”。代码行看似只是抽取函数,实际可能改变鉴权、日志或错误处理的执行顺序。按入口函数展开前后调用树,比逐文件追踪更快抓住这类变化。
第二,它同时照顾人和机器。开发者可在终端阅读带增删标记的树;Agent 则能读取结构化结果,还可通过项目提供的 skills add 和 mcp add 接入工作流。这比把整份 diff 原样塞进上下文更聚焦。
第三,它适合做定向验证。比如从支付入口追踪是否仍能到达 sendEmail,或只检查某个路由文件导出的入口,而不是笼统要求 Agent“再审一遍代码”。
🧪 谁适合试,怎么开始
适合正在使用 Claude Code、Codex 等编码 Agent,或需要审查跨文件重构的开发者。无需全局安装,可先在一个有明确入口函数的小仓库运行:
npx calldiff@latest diff main HEAD --entry createAgentSession
然后用 tree -e 函数名 --locs 查看调用位置,用 reach -e 起点 --to 终点 验证关键链路。接入 Agent 前,建议先人工对照一次源码,确认它在你的语言和代码风格下能正确识别。
⚠️ 使用提醒
calldiff 做的是基于 AST 的语法分析,不是完整类型检查器;动态调用、依赖注入、反射和运行时分派可能无法解析,因此不能替代测试、静态分析或安全审计。部分 Tree-sitter grammar 首次使用还会下载安装到本地缓存,离线或受限网络环境需提前准备。
项目目前很早期,仓库尚无正式 GitHub Release。实测主分支 250 项测试中 241 项通过,Swift grammar 下载受网络错误影响,另有 Kotlin、OCaml 用例超时。团队试用时应固定版本,并先验证自己的主力语言。
🔗 参考资源
- GitHub:https://github.com/tanishqkancharla/calldiff
- README 与命令示例:https://github.com/tanishqkancharla/calldiff/blob/main/README.md
- 示例代码:https://github.com/tanishqkancharla/calldiff/tree/main/examples
- npm 包:https://www.npmjs.com/package/calldiff
- MIT 许可证:https://github.com/tanishqkancharla/calldiff/blob/main/LICENSE