乐于分享
好东西不私藏

Claude Code 源码:我们看懂了什么

Claude Code 源码:我们看懂了什么

51万行代码全裸:Claude Code源码泄露,AI编程工具的秘密被扒光了

2026年3月31日,Anthropic一次意外的打包失误,让51万行Claude Code源码彻底暴露在所有人面前。技术圈沸腾了——不是因为黑客攻击,而是因为一个漏掉的.npmignore配置,把整个AI编程工具的灵魂全数公开。

01 愚人节前夜的意外”开源”

3月31日深夜,独立安全研究员 Chaofan Shou 在例行检查 npm 新发布包时,注意到 @anthropic-ai/claude-code v2.1.88 的 dist 目录末尾有一行熟悉的注释:sourceMappingURL

他访问了那个链接,然后怔住了。

返回的不是几 KB 的调试映射,而是一个 59.8 MB 的巨型 JSON 文件,里面装着 1903 个 TypeScript 源文件、51万行完整代码,注释、变量名、类型注解……一应俱全。

事情经过其实很简单:Claude Code 基于 Bun 构建,Bun 默认生成 source map 文件。某个发布人员忘记在 .npmignore 里排除 .map 文件,结果 cli.js.map 就这样随包一起上了线。

这不是黑客,不是泄露,就是一个发布配置的疏漏

几小时内,代码被镜像到多个 GitHub 仓库,其中一个 clean-room 重写版本在两小时内获得50,000颗星——可能是 GitHub 历史上增长最快的仓库。

02 你以为的 Claude Code vs 实际的 Claude Code

大多数人以为 AI 编程工具的工作原理是这样的:

 用户输入 → 调用 LLM API → 返回结果 → 显示给用户 `

源码告诉我们,Claude Code 实际上是这样的:

` 用户输入 → 动态组装 7 层系统提示词 → 注入 Git 状态、项目约定、历史记忆 → 42 个工具各自附带使用手册 → LLM 决定使用哪个工具 → 9 层安全审查(AST解析、ML分类器、沙箱检查……) → 权限竞速解析(本地键盘/IDE/Hook/AI分类器 同时竞速) → 200ms 防误触延迟 → 执行工具 → 结果流式返回 → 上下文接近极限?→ 三层压缩 → 需要并行?→ 生成子 Agent 蜂群 → 循环直到任务完成 `

51万行代码,真正调用 LLM API 的部分不超过 5%。其余 95% 都是”脚手架”——权限系统、上下文管理、错误恢复、多 Agent 协调、UI 交互……

03 核心 Agent Loop:极简主义的胜利

源码中最令人惊讶的发现之一:Claude Code 的核心 Agent Loop 极其简洁

一个 while-true 循环,调用 LLM,执行工具,再调用 LLM……如此往复。

但在这个简单循环之上,Anthropic 叠加了 12 层工程包装

提示词动态组装:7层提示词,含版本信息、身份定位、详细指令、Git状态、项目规范……

工具系统:42个工具,每个都附带详细的使用说明书

权限系统:四层防御纵深(见下文)

上下文压缩:三重策略,智能保留关键信息

子代理系统:四种 Spawn 模式,支持蜂群协作

Skills 系统:按需注入,渐进式披露

会话持久化:完整的 Transcript 恢复机制

MCP 集成:模块化外部工具接入

Hook 系统:25+ 生命周期事件

提示词缓存:精确管理缓存边界,降低 Token 成本

错误熔断:3次失败后停止自动压缩

特征门控:120+ 隐藏环境变量,35个编译时 Feature Flag

04 六级安全架构:让 AI 安全地帮你敲命令

Claude Code 最令开发者称道的,是它那套异常认真的安全体系

仅 BashTool(执行 Shell 命令)这一个工具,就配了 18 个安全专用文件、42 项静态检查

四层权限纵深

每次工具调用都要经过:

权限模式层:allow / deny / ask / passthrough 四态决策

规则匹配层:本地键盘确认、IDE 审批、Hook 响应、AI 分类器——多个解析器同时”竞速”,最快响应的获胜

200ms 防误触层:防止用户手滑确认

沙箱执行层:所有外部命令在独立沙箱中运行

42 项 Shell 注入防护

安全文件里记录了 42 种已知攻击路径,包括一些冷门但真实存在的威胁:

• Zsh zmodload 攻击:加载 zsh/net/tcp 模块实现隐蔽网络泄露

• IFS 注入:操纵内部字段分隔符改变 Shell 解析

• Git 提交替换:把命令执行藏在 commit message 模板里

• Heredoc-in-substitution:把 heredoc 嵌套在 $() 里来躲避解析器

这份清单是真实的安全经验,覆盖了 OWASP 指南未提及的大量攻击路径。

05 提示词不是写出来的,是”拼装”出来的

打开 src/constants/prompts.ts,你会看到一个关键边界标记:SYSTEM_PROMPT_DYNAMIC_BOUNDARY。

这条线把系统提示分成两部分:

• 上方:完全静态,可缓存,包含工具说明、身份定位等不变内容

• 下方:动态组装,随会话变化,包含 Git 状态、项目约定、用户偏好……

为什么要这样分?

因为一旦缓存边界被破坏,所有 Token 缓存失效,API 成本飙升。Anthropic 甚至写了一个专门的 promptCacheBreakDetection.ts,每次 API 调用都对系统提示进行哈希比对,监控任何可能破坏缓存的变动。

CLAUDE.md 文件每次查询都会重新读取(不只是会话开始时),且支持四级继承:

` ~/.claude/CLAUDE.md          # 全局偏好 project/CLAUDE.md            # 项目约定 .claude/rules/*.md           # 模块化规则 .claude/CLAUDE.local.md      # 本地笔记(gitignore) `

字符上限是 40,000 字符——大多数用户只用了一小部分。

06 上下文压缩:AI 的”记忆管理”

Claude Code 把记忆分成 user / feedback / project / reference 四种类型,分别对应不同的生命周期和优先级。

当对话 Token 接近上限时,会触发三重压缩策略:

微压缩:只清理最早的工具结果

自动压缩:LLM 生成对话摘要,替换历史消息(压缩时有严格指令:不允许调用工具,防止 Token 浪费)

完全压缩:极端情况下重建上下文

压缩后的 Token 预算精确管理:

• 文件恢复:50,000 tokens

• 每个文件上限:5,000 tokens  

• Skills 内容:25,000 tokens

代码注释里甚至留着一条工程日志:

“BQ 2026-03-10:1,279 个会话在单个会话中连续失败 50 次以上(最多 3,272 次),导致全球每天浪费约 25 万次 API 调用。”

解决方案:MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3。三次失败后熔断,停止自动压缩。

07 子代理蜂群:多个 Claude 协同干活

源码中发现了一个 Swarm 模式(feature-gated,尚未公开),允许主 Agent 生成多个子 Agent 并行工作,通过”邮件系统”互相通信。

现有的四种 Spawn 模式:

串行子任务:顺序执行,结果传回主 Agent

Fork Agent:分叉执行,成功则合并,失败则回滚

并行批处理:同时启动多个子 Agent 处理不同文件

Kairos 持久化模式(未发布):拥有跨会话长期记忆,用户不在时自动执行四阶段记忆整合

08 隐藏彩蛋:Anthropic 工程师的另一面

在这堆严肃的工业代码里,社区还扒出了不少人情味的东西。

电子宠物系统

buddy/companion.ts 里藏着一个完整的 Tamagotchi 风格 ASCII 宠物系统:

• 代号 Buddy,18 种物种(鸭子、水豚、章鱼、龙……)

• 完整的抽卡稀有度体系:普通60%、传奇1%、闪光款

• RPG 属性:DEBUGGING、CHAOS、SNARK

• 宠物坐在你的输入框旁边,响应你的编码

每个用户的宠物由账户 ID 唯一生成。全球独一份。

时间戳显示:4月1日首次亮相。愚人节彩蛋。

有趣的是,某个物种名称与内部模型代号冲突,他们的解决方案是:把所有18个物种名都用十六进制编码

`typescript export const duck = String.fromCharCode(0x64, 0x75, 0x63, 0x6b) `

这就是 duck 这个词。因为内部扫描器会报警,他们把 duck 给编码了。

“卧底模式”

当 Anthropic 员工使用 Claude Code 向公开开源项目提交代码时,utils/undercover.ts 会自动激活:

“您正在公共代码库中进行秘密操作。您的提交信息、PR 标题绝对不能包含任何 Anthropic 内部信息。请勿暴露您的身份。”

禁止提及:内部模型代号(Capybara、Tengu等)、”Claude Code”短语、任何提及 AI 的内容……

代码屎山

print.ts:5,594行,一个函数 3,167 行,12 层嵌套。

460 条 eslint-disable 注释。

50+ 个名字里带 _DEPRECATED 但仍被正常调用的函数。

其中最有代表性的:writeFileSyncAndFlush_DEPRECATED()` ——它负责保存你的认证信息到磁盘,一直在用。

09 Anthropic 把 Claude Code 当操作系统在做

读完这份源码,一位开发者总结了一个让人深思的类比:

| Claude Code 组件 | 操作系统概念 | |—|—| | 42 个工具 | 系统调用 | | 权限系统 | 用户权限管理 | | Skills 系统 | 应用商店 | | MCP 协议 | 设备驱动 | | Agent 蜂群 | 进程管理 | | 上下文压缩 | 内存管理 | | Transcript 持久化 | 文件系统 |

这不是一个”聊天机器人加几个工具”,这是一个以 LLM 为内核的操作系统

AI Agent 的 90% 工作量在”AI”之外。51 万行代码里,真正调用 LLM 的部分极少,其余全是工程基础设施。

10 这次泄露意味着什么?

对 Anthropic 来说,损失可能没有看起来那么大——护城河是模型,不是 CLI。核心权重、训练数据、用户数据没有泄露。

但对整个行业来说,这次意外”开源”意义深远:

对开发者:CLAUDE.md 和 Hook 系统是 Anthropic 没有重点宣传的强大配置接口,现在大家都知道了。

对竞争对手:源码里甚至有一段”抗蒸馏”代码(Transform.ts),专门在输出中注入虚假工具调用,让任何试图用 API 流量训练竞品模型的人学到一堆不存在的工具。

对 AI Agent 行业:这份源码是目前最真实的、最完整的工业级 Agent 系统参考实现。从权限体系到上下文管理,从多 Agent 协调到 Skills 架构,教科书都没有这么详细。

对安全工程师:那 42 项 Shell 注入防护清单,是一份难得的真实攻击路径汇总。

51万行代码。1903个文件。18个安全文件只为一个 Bash 工具。9层审查只为让 AI 安全地帮你敲一行命令。

这是 Anthropic 用工程实力给出的答案:要让 AI 真正有用,你不能把它关在笼子里,也不能放它裸奔,你得给它建一套完整的信任体系。

而这套体系的代价,是 51 万行代码。