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 万行代码。
夜雨聆风