Claude Code 源代码泄露:揭秘 Anthropic 旗舰 AI 编程助手的架构

0 阅读8分钟

Claude Code Source Leak

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)
终端 UIInk(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 内部的一些安全疏漏:

  1. Fortune 报道:同一周还发生了 Mythos/CMS 文档泄露(3,000 份未发布文档)
  2. 两次泄露都源于基本的运营失误,而非复杂攻击

这引发了对于"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 吹哨人。"


参考资料


免责声明:本文仅作技术分析目的,不鼓励或支持任何侵犯知识产权的行为。