Claude Code 源码深度解析

前言

作者 杨艺韬 · 1,930 字

写作动机

2026 年,AI 编程助手从"玩具"变成了"生产力工具"。Cursor、Copilot、Windsurf 争相涌现,但它们大多是黑盒。你可以用它们写代码,却无法理解它们如何决定该调用哪个工具、如何管理上下文窗口、如何在安全和自由之间取得平衡。

2026 年 3 月,Claude Code 的完整源码通过 npm 分发包的 source map 意外泄露。51 万行 TypeScript 代码、40+ 工具、80+ 命令、完整的 MCP 协议集成、多 Agent 协调系统——一个生产级 AI 编程助手的内部实现第一次完整地暴露在开发者面前。

当我第一次读到这份源码时,我意识到:这可能是理解"AI Agent 系统应该如何设计"的最佳教材。不是因为它完美无缺,而是因为它是真正在生产环境中被数百万开发者使用的系统,每一个设计决策背后都有真实的工程权衡。

这个专栏讲什么

本专栏不是 Claude Code 的使用手册——官方文档已经做得很好了。

本专栏关注的是为什么

我们会从 main.tsx 的第一行开始,沿着代码的执行路径,逐层深入每一个子系统。每一章聚焦一个核心模块,先讲设计意图,再看代码实现,最后总结可迁移的设计模式。

本专栏读者

本专栏的组织

全专栏分为七个部分,按照 Claude Code 的执行路径从外到内组织:

第一部分:开篇(第 1 章)——Claude Code 解决的是什么问题,以及为什么值得读它的实现。

第二部分:启动与核心循环(第 2-5 章)——从 main.tsx 启动到 Agent 循环的完整链路。这是整个系统的骨架。

第三部分:工具系统(第 6-8 章)——40+ 工具的类型系统、编排引擎和核心实现。工具是 Agent 与世界交互的桥梁。

第四部分:权限与安全(第 9-10 章)——五级权限模型和 Bash 沙箱。这是 Claude Code 区别于"玩具 Agent"的关键。

第五部分:协议与集成(第 11-13 章)——MCP 协议、IDE Bridge、LSP。Claude Code 不是孤岛,它是一个生态系统的节点。

第六部分:Agent 进阶(第 14-16 章)——多 Agent 协调、Skill 插件、上下文压缩。这些是 Claude Code 的"高级技巧"。

第七部分:终端 UI 与工程实践(第 17-18 章)——React + Ink 终端 UI 的架构,以及贯穿全专栏的设计模式总结。

每章遵循 "设计意图 → 源码实现 → 可迁移模式" 的三段式结构。你可以按顺序阅读获得完整理解,也可以直接跳到感兴趣的章节——每章开头都有背景介绍。

源码版本与获取方式

本专栏基于 Claude Code 2026.3.31 源码快照分析,对应 npm 包 @anthropic-ai/claude-code@2.1.89(该版本于 2026-03-31 发布)短暂随包分发的 source map 所还原出的 TypeScript 源码树。

先把话说清楚:这份源码今天已经拿不到了

这个专栏必须在开头交代清楚,否则你会白白浪费时间去找:

1. github.com/anthropics/claude-code 里没有产品源码。 那个仓库是 Claude Code 的 issue 跟踪、文档、示例与插件仓库——实测共 229 个文件, 内容是 CHANGELOG.mdREADME.mdexamples/plugins/.claude-plugin/ 和几个 issue 运维脚本。它不包含 src/,更没有 main.tsx。clone 它对照本专栏, 一行都对不上。

2. npm 包里也已经没有 source map 了。2.1.89 的 tarball 拉下来解开可以自己验证:整包只有 19 个文件, 主体是一个 13MB、16824 行的压缩后 cli.js,外加 vendor 目录下的 ripgrep 与 audio-capture 二进制。没有任何 .map 文件,cli.js 末尾也没有 sourceMappingURL 注释

curl -sSL $(npm view @anthropic-ai/claude-code@2.1.89 dist.tarball) -o cc.tgz
tar tzf cc.tgz                    # 19 个文件
tar xzf cc.tgz package/cli.js
grep -c sourceMappingURL package/cli.js   # 0

所以本专栏的定位是:替你读过源码。 本专栏每一处引用都标注了文件路径与行号, 它们指向的是上述快照的目录结构,用于说明"这段逻辑在系统里的位置", 而不是让你去 clone 一份对照——那条路今天走不通,本专栏不会假装它走得通。

那么怎么读这个专栏才有效?

由于 Claude Code 在持续迭代(截至 2026 年 8 月,npm 上已发布 478 个版本), 部分代码细节必然与最新版本有差异,但核心架构设计相对稳定。凡是本专栏能确认已经变化的地方, 相应章节都会给出说明。

代码引用的约定

正因为你无法自己 clone 一份对照,本专栏更有义务把引用规则讲清楚。正文里代码块顶部的标注:

// 源码文件:src/Tool.ts

指的是该逻辑在上述快照目录结构中的位置。关于这些代码块:

它们是节选,不是原文粘贴。 为了让主干逻辑读得完,正文通常会删去完整的泛型与 类型参数、省略防御性分支与遥测调用、把多行签名压成一行,并补上中文注释。

但常量的值、报错信息的文本、字段名与方法名,一律按原文引用。 这些是理解系统行为的 锚点,改写它们等于制造错误答案。

还有一点必须坦白:本专栏的代码引用无法由读者独立复核——原因见上面那个警告框。 因此凡是能在公开渠道交叉印证的地方,本专栏都会尽量给出印证路径,例如工具名与命令名 可以在 npm 包的 cli.js 里 grep 到,权限与配置行为可以用当前版本的 Claude Code 实际跑一遍。读到与你的观察不一致的地方,请以你的观察为准,并欢迎反馈。

感谢 Anthropic 团队构建了 Claude Code 这样精妙的系统。本专栏的分析基于公开可获取的源码快照,仅用于教育和技术研究目的。