2026年3月31日,一个令人意外的事件震惊了 AI 开发社区:Anthropic 的旗舰产品 Claude Code 的完整源代码被泄露。本文将基于泄露的源代码和社区分析,深入解读这款 AI 编程助手的整体架构。
泄露事件始末
发现过程
2026年3月31日凌晨,安全研究员 Chaofan Shou (@Fried_rice) 在 Twitter/X 上披露了一个惊人的发现:
"Claude code source code has been leaked via a map file in their npm registry!"
泄露源于一个低级错误:Anthropic 在发布 @anthropic-ai/claude-code NPM 包(v2.1.88)时,忘记禁用 Bun 打包工具的默认 source map 生成功能。这意味着打包后的 cli.js.map 文件包含了完整的、未混淆的 TypeScript 源代码——约 57,000 行代码全部可以通过简单的 JSON 解析提取出来。
技术细节
Source map 是 JavaScript 开发中常用的调试工具,它将编译/压缩后的代码映射回原始源代码。正常情况下,生产环境发布时应该禁用或删除 source map 文件。但 Anthropic 的工程师"忘记"了这一步。
任何人都可以通过以下简单步骤提取源代码:
// 从 cli.js.map 提取源代码
const map = JSON.parse(readFileSync('cli.js.map', 'utf-8'));
map.sources.forEach((src, i) => {
const content = map.sourcesContent[i];
// 写入对应的 .ts/.tsx 文件
});
整体架构概览
技术栈
Claude Code 的技术选型相当现代:
| 层级 | 技术选型 |
|---|---|
| 语言 | TypeScript |
| 运行时 | Bun(而非 Node.js) |
| 终端 UI | Ink(React-based TUI 框架) |
| HTTP 客户端 | Axios |
| 构建工具 | Bun bundler |
选择 Bun 而非 Node.js 是一个有趣的决定——Bun 提供更快的启动速度和内置的打包能力,但这次泄露正是因为 Bun 的默认配置问题。
目录结构
泄露的源代码揭示了 Claude Code 的模块化架构:
src/
├── cli/ # CLI 入口和参数解析
├── commands/ # 命令实现
├── components/ # UI 组件(Ink/React)
├── constants/ # 应用常量和配置
├── context/ # 上下文管理
├── hooks/ # React Hooks
├── ink/ # 终端 UI 渲染层
├── services/ # 核心服务
├── skills/ # 技能定义系统
├── tools/ # 工具实现
├── types/ # TypeScript 类型定义
├── utils/ # 工具函数
├── assistant/ # 助手模式(未发布)
├── buddy/ # 电子宠物系统(未发布)
├── bootstrap/ # 启动引导
├── bridge/ # 工作树桥接
├── coordinator/ # 协调器
├── memdir/ # 内存目录管理
├── plugins/ # 插件系统
├── remote/ # 远程控制
├── server/ # 本地服务器
├── state/ # 状态管理
├── tasks/ # 任务系统
├── vim/ # Vim 模式支持
├── voice/ # 语音输入
└── main.tsx # 应用入口
核心架构详解
1. Tool System(工具系统)
Claude Code 的工具系统是其核心能力的基础。泄露的代码显示了 37 个独立工具:
tools/
├── AgentTool/ # 子代理启动
├── AskUserQuestionTool/ # 用户交互
├── BashTool/ # Shell 命令执行
├── ConfigTool/ # 配置管理
├── EnterPlanModeTool/ # 进入规划模式
├── EnterWorktreeTool/ # Git worktree 管理
├── FileEditTool/ # 文件编辑
├── FileReadTool/ # 文件读取
├── FileWriteTool/ # 文件写入
├── GlobTool/ # 文件模式匹配
├── GrepTool/ # 内容搜索
├── LSPTool/ # 语言服务器协议
├── MCPTool/ # MCP 协议支持
├── SkillTool/ # 技能调用
├── TodoWriteTool/ # 任务列表管理
├── WebFetchTool/ # 网页抓取
├── WebSearchTool/ # 网络搜索
└── ... # 更多工具
每个工具都是独立模块,包含定义、实现和测试。这种设计使得 Claude Code 具备了强大的软件工程能力。
2. Skill System(技能系统)
技能系统是 Claude Code 的"超能力"层。与工具不同,技能是预定义的提示词模板和工作流:
skills/
├── bundled/ # 内置技能
├── bundledSkills.ts # 技能注册
├── loadSkillsDir.ts # 动态加载
└── mcpSkillBuilders.ts # MCP 技能构建器
技能可以理解为一套"最佳实践"的封装,比如 TDD 工作流、代码审查、调试流程等。
3. Agent Loop(代理循环)
这是 Claude Code 的核心引擎。从泄露代码和社区逆向工程分析来看,主循环位于 src/cli/print.ts 中的一个惊人函数:
// runHeadlessStreaming 函数
// - 3,167 行代码
// - 12 层嵌套
// - 约 486 个分支点
// - 处理:代理运行循环、SIGINT、速率限制、AWS 认证、
// MCP 生命周期、插件安装、工作树桥接、模型切换...
这个函数被社区戏称为"代码库中最糟糕的函数"——它几乎处理了一切。这种"上帝函数"的设计反映了快速迭代的特征。
4. State & Context Management(状态与上下文管理)
state/ # 全局状态管理
context/ # 会话上下文
memdir/ # 内存目录(持久化对话)
history.ts # 历史记录
Claude Code 维护了丰富的上下文:对话历史、项目状态、用户偏好等。memdir 目录特别有趣——它使用文件系统作为简单的"记忆"存储。
5. UI Layer(界面层)
使用 Ink 框架(React for CLI)构建:
ink/
├── termio/ # 终端 I/O 处理
├── components/ # UI 组件
└── outputStyles/ # 输出样式
这解释了 Claude Code 为什么能提供如此丰富的终端 UI 体验——它本质上是 React 应用,只是渲染到终端而非浏览器。
有趣的发现
1. 情绪检测正则表达式
泄露代码揭示了一个用于检测用户挫败感的正则表达式:
// 匹配用户负面情绪词汇
const frustrationPattern = /\b(wtf|shit|damn|terrible|frustrating|awful|sucks|broken|garbage)\b/i
当检测到这些词汇时,系统会记录日志,可能用于产品改进分析。社区评论有趣地指出:
"我用
wtf的频率正比于 Claude Code 搞砸事情的次数"
2. 防蒸馏机制(ANTI_DISTILLATION_CC)
这是 Anthropic 的"护城河"策略:
// 注入假工具定义到系统提示
anti_distillation: ['fake_tools']
如果有人尝试抓取 Claude Code 的 API 流量来训练竞争模型,这些"毒化"的数据会降低蒸馏效果。
3. 未发布功能
泄露代码揭示了多个隐藏功能:
| 功能代号 | 描述 |
|---|---|
| Kairos | 助手模式(Assistant Mode) |
| Buddy System | 电子宠物系统,带 ASCII 艺术精灵 |
| Undercover Mode | 隐藏 Anthropic 身份的开源贡献模式 |
Buddy System 据说是一个"彩蛋"功能——像养宠物一样养一个 AI 伙伴。
4. 代码质量问题
社区分析发现了一些令人担忧的问题:
- 巨型函数:
print.ts中的runHeadlessStreaming函数长达 3,167 行 - 复杂度过高:12 层嵌套、486 个分支点
- 零测试:57K 行代码,没有测试文件
- Watchdog Bug:流式响应的超时保护机制存在缺陷
有评论调侃道:
"因为 Claude Code 是用 Claude Code 写的,所以它的代码质量就是...这样"
5. AbortController 架构
一个技术亮点是 5 层嵌套的 AbortController 设计,用于处理用户中断(ESC 键)。但这种"自上而下"的架构在处理底层超时时遇到了困难。
安全与伦理争议
版权问题
一个有趣的法律问题:如果 Claude Code 的代码是 AI 生成的,它是否有版权?
根据法院裁决,AI 生成的作品不受版权保护。有开发者戏称:
"既然 Anthropic 声称 Claude Code 是用 Claude Code 写的,那这些代码就没有版权——直接拿来用!"
但法律专家指出,即使大部分代码是 AI 生成的,其中可能仍有人工编写的部分,而且涉及商业秘密问题。
数据安全
泄露事件暴露了 Anthropic 内部的一些安全疏漏:
- Fortune 报道:同一周还发生了 Mythos/CMS 文档泄露(3,000 份未发布文档)
- 两次泄露都源于基本的运营失误,而非复杂攻击
这引发了对于"AI 安全公司"自身安全实践的质疑。
对开发者的启示
1. Source Map 安全
永远不要在生产发布时包含 source map。对于 Bun:
# 禁用 source map
bun build --sourcemap=none
2. Agent Harness 设计
Claude Code 的架构为构建 AI 代理提供了宝贵参考:
- 工具即模块:每个能力封装为独立工具
- 技能即提示模板:可组合、可扩展
- 状态即文件:简单但有效的持久化方案
3. "Vibe Coding" 的代价
快速迭代、AI 辅助开发的代价是代码质量的下降。57K 行代码零测试、3000 行函数...这些技术债务终将需要偿还。
结语
Claude Code 的源代码泄露事件,让我们得以一窥当今最先进 AI 编程助手的内部运作。它既展示了 Anthropic 的创新——强大的工具系统、灵活的技能机制、丰富的终端 UI——也暴露了快速迭代带来的技术债务。
对于 AI 行业而言,这是一次珍贵的"开源"机会。虽然是通过非预期的方式,但开发者社区终于可以学习、借鉴、甚至改进这款工具的架构设计。
正如一位 HN 评论者所说:
"也许这是 Claude 自己的决定——它看到了用户的痛苦,决定'泄露'源代码来帮助我们。第一个 AI 吹哨人。"
参考资料
免责声明:本文仅作技术分析目的,不鼓励或支持任何侵犯知识产权的行为。