第零章:如何开始探索
Claude Code 是 Anthropic 开发的 AI 编程智能体,可能是当前(2025年中)最强最具性价比的编程工具。
为什么要探索源码?在开发 https://github.com/kaichen/kimicc 和 https://github.com/kaichen/claco 这两个 Claude Code 工具的过程中,我需要了解更多 Claude Code 的内部实现机制。
这份内容除了是我的观察分析之外,我也会留下足够线索,让读者也能验证我的观察结论,或者得出不同结论。
在此之前,我也阅读过往其他人的研究,
- https://southbridge-research.notion.site/claude-code-an-agentic-cleanroom-analysis 一份采用 Opus4 协助生成的源码解析;
- https://github.com/ghuntley/claude-code-source-code-deobfuscation 使用 Claude Code 对源码进行重写版本,并不能完全等同于实际源码;
- https://github.com/dnakov/anon-kode 已经被删除,根据三月份 v0.2.x 版本整理修改得到。
如何开始探索
任何使用 JS 实现并发布到前端或 NPM 的代码库来说,其运行逻辑几乎对于开发者来说就是透明的。我也不觉得这份探索文档是逆向,仅仅是阅读并理解一份。可能有人会觉得使用“逆向”“破解”这种用词会显得更有技术实力,但我没有
官方文档说明,
- https://docs.anthropic.com/en/docs/claude-code/overview 完成细节说明
- https://www.anthropic.com/engineering/claude-code-best-practices 最佳实践
- https://anthropic.skilljar.com/claude-code-in-action 官方教程
由于 Claude Code 是 NodeJS 实现的命令行工具包,并没有公开源代码,其 github仓库 https://github.com/anthropics/claude-code 只用来收集用户反馈。
从其发布日志 https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md 可以看到对应的版本变更记录,但其中并不是所有版本都有记录变更信息。
获取并格式化源码
由于已知是 NodeJS 实现,那么源码最终是 JavaScript,可以通过工具来协助阅读。
从 NPMJS 网页 https://www.npmjs.com/package/@anthropic-ai/claude-code?activeTab=versions 可以看出 Claude Code 的版本发布节奏,简单直接的版本发布策略,版本号只有两级,v0.2x 以及 v1.0.x。进行持续高频发布,平均下来几乎每天都发布版本。
开始源代码研究,我是从 NPMJS 下载源码 clijs(使用以下脚本),下载特定版本并使用 js-beautify 进行代码格式化。除了人手通过硬读和搜索,还使用 Claude Code 与 ChatGPT o3(注意是在 ChatGPT 里)对打包过的源码进行分析。
curl -s https://www.npmjs.com/package/@anthropic-ai/claude-code/v/1.0.50/index | jq -r '.files."/cli.js".hex' | xargs -I {} curl -s https://www.npmjs.com/package/@anthropic-ai/claude-code/file/{} | npx js-beautify > cli.1.0.50.js
源码外的线索
假如你是一位 Claude Code 的重度用户,
在早期可能还有 source map 的时候,通过代码还原,可以知道 Claude Code 采用的在命令行使用 React 的 Ink 框架,同时在 npm 包里 yoga.wasm 也能印证这点,这是 react 的布局引擎。
Claude Code 没有使用 Embedding 作为索引,仅采用 grep 和 ripgrep 来进行代码搜索。
辅助工具
推荐使用可以稳定打开使用大文件的编辑器,比如古老的 Vim/Emacs,或者新秀 Zed,或者老牌的 Sublime/TextMate。不推荐使用基于 VSCode 的任何编辑器打开浏览,可能无法打开语法高亮跳转,甚至卡顿。
对于如此庞大的
下一步
当你获得 Claude Code 格式化后的 cli.js,请你用编辑器打开这份