- 新增 008 号文章《51 万行源码意外曝光!我扒完了 Claude Code 的全部家底》 - 添加 8 个 Mermaid 架构图文件,涵盖整体架构、启动流程、查询循环等 - 新增项目配置文件 CLAUDE.md,定义自媒体写作规范 - 创建详细的架构分析文档 claude-arch-by-claude.md - 包含权限系统、工具调度、多智能体等核心技术解析 - 记录反蒸馏机制、KAIROS 守护进程等隐藏功能发现 - 提供完整的工具清单及安全防护措施说明
406 lines
19 KiB
Markdown
406 lines
19 KiB
Markdown
# 51 万行源码意外曝光!我扒完了 Claude Code 的全部家底
|
||
|
||
> 发布日期:2026-04-01
|
||
> 分类:技术解读 / 深度分析
|
||
> 作者:老邓唠AI
|
||
|
||

|
||
|
||
## 引子:Anthropic 自己把自己扒光了
|
||
|
||
3 月 31 日凌晨,AI 圈炸了一颗核弹。
|
||
|
||
不是发新模型,不是融资消息——是 **Anthropic 自己把 Claude Code 的完整源码泄漏了**。
|
||
|
||
事情是这样的:Anthropic 在 npm 发布 `@anthropic-ai/claude-code@2.1.88` 时,打包进了一个 59.8MB 的 JavaScript Source Map 文件。这个 `.map` 文件本来是内部调试用的,但它直接指向了 Anthropic 自家 Cloudflare R2 存储桶上的**完整 TypeScript 源码压缩包**。
|
||
|
||
安全研究员 Chaofan Shou 第一个发现了这个链接,并在 X 上公开。
|
||
|
||
<!-- TODO: Chaofan Shou 推特截图 -->
|
||
|
||
几小时内,**1,900 个 TypeScript 文件、512,664 行代码**被完整镜像到 GitHub 上。有人甚至在 2 小时内就用 Python 重写了核心逻辑,仓库星标飙到 5 万。
|
||
|
||
更讽刺的是,这已经是 Anthropic **第二次**犯同样的错误——2025 年 2 月就出过一次几乎一模一样的 source map 泄漏。而就在几天前,他们还刚刚意外暴露了内部模型代号 "Mythos"。
|
||
|
||
Anthropic 官方的回应是:*"This was a release packaging issue caused by human error, not a security breach."*(这是人为错误导致的发布打包问题,不是安全漏洞。)
|
||
|
||
但代码已经在互联网上了。**DMCA 撤回通知能删仓库,删不掉已经下载到本地的 zip 包。**
|
||
|
||
我花了一整天时间,把这 51 万行代码从头到尾扒了一遍。下面是我发现的全部内容。
|
||
|
||
---
|
||
|
||
## 一、这到底是个多大的工程?
|
||
|
||
先看硬核数据:
|
||
|
||
| 指标 | 数据 |
|
||
|------|------|
|
||
| 总代码量 | **512,664 行** TypeScript |
|
||
| 文件数 | 1,884 个 `.ts/.tsx` 文件 |
|
||
| 运行时 | Bun(不是 Node.js) |
|
||
| 终端 UI | 自研 Ink 分支 + React + Yoga Layout |
|
||
| Schema 校验 | Zod v4(所有工具输入、API 响应、配置文件) |
|
||
| 实验平台 | GrowthBook(所有开关都用 `tengu_` 前缀) |
|
||
| 最大单文件 | `print.ts` — **5,594 行,单个函数 3,167 行,12 层嵌套** |
|
||
|
||
51 万行是什么概念?Linux 内核 0.01 版不到 1 万行,整个 VS Code 编辑器大约 30 万行。Claude Code 一个 CLI 工具,代码量比 VS Code 还多。
|
||
|
||
**这不是一个"LLM 套壳",这是一个完整的操作系统级智能体。**
|
||
|
||
---
|
||
|
||
## 二、整体架构:五层洋葱
|
||
|
||
从源码来看,Claude Code 的架构像一颗洋葱,从外到内分五层:
|
||
|
||

|
||
|
||
我们一层一层拆。
|
||
|
||
---
|
||
|
||
## 三、启动流程:快到你感觉不到
|
||
|
||
你在终端敲下 `claude` 回车,背后发生了什么?
|
||
|
||

|
||
|
||
关键设计:**入口文件只有 302 行**。通过动态 `import()` 延迟加载 4,683 行的主模块,确保 `claude --version` 这种简单命令毫秒级响应。所有重依赖(MCP、GrowthBook、keychain)都是**并行初始化**,不互相等待。
|
||
|
||
这是一个对启动速度有执念的团队写出来的代码。
|
||
|
||
---
|
||
|
||
## 四、核心引擎:一个永不停歇的循环
|
||
|
||
Claude Code 的心脏是一个**流式查询循环**。你发一条消息,引擎就开始转:
|
||
|
||

|
||
|
||
几个精妙的设计:
|
||
|
||
**1. 输出恢复机制**:当模型因 `max_output_tokens` 截断时,自动续写,最多重试 3 次。你以为 Claude 一口气写了 2000 行代码?其实它可能分了 3 次才写完,但你看不出接缝。
|
||
|
||
**2. 工具结果预算**:工具返回的结果如果太大(比如 `grep` 搜到了 1 万行),不会直接塞进上下文窗口。而是**存到磁盘**,给模型一个文件路径 + 预览摘要。这就是为什么 Claude Code 处理大项目不容易爆上下文。
|
||
|
||
**3. 自动压缩**:当 token 数接近上下文窗口极限时(默认留 20,000 token 缓冲区),自动触发一轮"摘要"调用,把历史对话压缩成精简版。你聊了 100 轮,模型看到的可能只有最近 10 轮 + 前 90 轮的摘要。
|
||
|
||
---
|
||
|
||
## 五、工具系统:40+ 个武器库
|
||
|
||
Claude Code 注册了超过 40 个工具。但更有意思的是它们的**分类和调度策略**。
|
||
|
||
### 完整工具清单
|
||
|
||
| 分类 | 工具 | 说明 |
|
||
|------|------|------|
|
||
| 文件操作 | FileRead, FileWrite, FileEdit, Glob, Grep, NotebookEdit | 读写搜索编辑 |
|
||
| 系统执行 | Bash, PowerShell | Shell 命令 |
|
||
| 网络 | WebFetch, WebSearch | 抓网页、搜索 |
|
||
| 智能体 | Agent, SendMessage, TeamCreate, TeamDelete | 生成/管理子智能体 |
|
||
| 任务 | TaskCreate/Get/Update/List/Stop/Output | 后台任务管理 |
|
||
| 规划 | EnterPlanMode, ExitPlanMode | 只读规划模式 |
|
||
| Git | EnterWorktree, ExitWorktree | Worktree 隔离 |
|
||
| MCP | MCPTool, ListMcpResources, ReadMcpResource | MCP 协议 |
|
||
| 辅助 | ToolSearch, Skill, AskUserQuestion, Config, Brief, LSP, TodoWrite | 杂项 |
|
||
| **KAIROS 专属** | Sleep, CronCreate/Delete/List, Monitor, PushNotification | 自主守护模式 |
|
||
|
||
### 读写分离调度
|
||
|
||

|
||
|
||
每个工具都声明了自己是否"并发安全"(`isConcurrencySafe`)。读文件、搜索这类只读操作可以 10 个并发跑;改文件、执行命令这类写操作必须排队。
|
||
|
||
这就是为什么你让 Claude Code 探索一个大项目时速度特别快——它在后台同时搜 10 个文件。
|
||
|
||
---
|
||
|
||
## 六、权限系统:六种模式,层层过滤
|
||
|
||
这可能是 Claude Code 最严谨的模块,**24 个文件**专门负责权限控制。
|
||
|
||
### 六种安全模式
|
||
|
||
| 模式 | 行为 | 典型场景 |
|
||
|------|------|---------|
|
||
| `default` | 每次新操作都问你 | 日常使用 |
|
||
| `plan` | 只能读,不能写 | 审查代码 |
|
||
| `acceptEdits` | 自动接受文件编辑 | 信任的项目 |
|
||
| `bypassPermissions` | 跳过所有检查 | YOLO 模式 |
|
||
| `dontAsk` | 不问就拒绝 | 最严格 |
|
||
| `auto` | **AI 自动判断安全性** | Anthropic 内部专用 |
|
||
|
||
### 权限决策链
|
||
|
||

|
||
|
||
白名单支持 glob 模式:`Bash(git *)` 表示允许所有 `git` 开头的命令。连续被拒绝太多次后,系统会自动降级到手动确认模式,防止模型"硬闯"。
|
||
|
||
---
|
||
|
||
## 七、多智能体:一个包工头带一群工人
|
||
|
||
Claude Code 的多智能体系统分两层:**协调器**(包工头)和**工作智能体**(工人)。
|
||
|
||

|
||
|
||
协调器的系统提示词长达 300 多行,定义了**四阶段工作流**:
|
||
|
||
1. **Research** — 先派人探索代码库
|
||
2. **Synthesis** — 汇总发现,制定方案
|
||
3. **Implementation** — 派多个工人并行修改
|
||
4. **Verification** — 跑测试,验收结果
|
||
|
||
最有意思的是,这套协调逻辑**不是写在代码里的,而是写在 prompt 里的**。协调器通过系统提示词被"教会"如何当领导:
|
||
|
||
> *"Do not rubber-stamp weak work"*(不要草率通过低质量工作)
|
||
> *"You must understand findings before directing follow-up work"*(必须理解发现后才能指导下一步)
|
||
|
||
用 prompt 而非代码来编排多智能体——这可能是目前最优雅的 Agent 编排方式。
|
||
|
||
---
|
||
|
||
## 八、记忆系统:文件驱动的长期记忆
|
||
|
||
Claude Code 的记忆不是什么花哨的向量数据库,而是**最朴素的文件系统**:
|
||
|
||

|
||
|
||
每条记忆是一个独立的 Markdown 文件,带 frontmatter(标题、描述、类型)。`MEMORY.md` 是索引文件,限制 200 行 / 25KB,直接注入系统提示词。需要回忆时,通过语义搜索找到相关记忆文件再注入。
|
||
|
||
还有一个**记忆老化**机制(`memoryAge.ts`),会逐步淘汰过时的记忆。
|
||
|
||
简单、可靠、可调试。不需要起一个 Pinecone 实例。
|
||
|
||
---
|
||
|
||
## 九、系统提示词:分段缓存的精密工程
|
||
|
||
Claude Code 的系统提示词不是一个大字符串,而是分成**静态段**和**动态段**,中间用一个缓存边界分隔:
|
||
|
||

|
||
|
||
静态段通过 Anthropic API 的 `cache_control` 参数跨会话缓存,动态段每次重新构建。这直接影响成本——缓存命中的 token **不计费**。
|
||
|
||
源码注释里有一句话让我印象深刻:
|
||
|
||
> *"在按 token 付费时,缓存失效不再是计算机科学笑话,而是会计问题。"*
|
||
|
||
为此,他们写了一个 `promptCacheBreakDetection.ts`,追踪 **12 个缓存破坏维度**。一旦检测到缓存命中率异常下降,就触发报警。
|
||
|
||
---
|
||
|
||
## 十、隐藏彩蛋:源码里的"不能说的秘密"
|
||
|
||
这才是本次泄漏最劲爆的部分。源码里藏着大量**从未公开的功能和机制**。
|
||
|
||
### 10.1 反蒸馏机制:给竞争对手下毒
|
||
|
||
```typescript
|
||
// services/api/claude.ts (301-313)
|
||
if (feature('ANTI_DISTILLATION_CC')) {
|
||
if (process.env.CLAUDE_CODE_ENTRYPOINT === 'cli' &&
|
||
shouldIncludeFirstPartyOnlyBetas()) {
|
||
result.anti_distillation = ['fake_tools']
|
||
}
|
||
}
|
||
```
|
||
|
||
当启用时,向 API 请求注入 `anti_distillation: ['fake_tools']`。效果:**服务端会在工具调用中混入虚假的工具响应**。
|
||
|
||
什么意思?如果有竞争对手在录制 Claude Code 的 API 流量来训练自己的模型,这些虚假的工具数据就会**污染他们的训练集**。
|
||
|
||
简单说:**你抄我的作业?我给你塞几道错题。**
|
||
|
||
不过分析者指出,这个机制其实很容易绕过——MITM 代理在请求到达 API 前就能剥离该字段。*"真正的保护可能是法律而非技术。"*
|
||
|
||
### 10.2 伪装模式:Anthropic 员工的"隐身衣"
|
||
|
||
`utils/undercover.ts` 大约 90 行,但信息量巨大。
|
||
|
||
当 Anthropic 内部员工用 Claude Code 在**外部开源仓库**工作时,这个模式自动启用。它会:
|
||
|
||
- 删除所有 "Co-Authored-By: Claude" 标识
|
||
- 禁止提及内部代码名(Capybara、Tengu 等)
|
||
- 隐藏内部 Slack 频道和仓库名
|
||
- 不暴露未发布的模型版本号
|
||
|
||
最关键的一行注释:
|
||
|
||
> *"There is NO force-OFF. This guards against model codename leaks."*
|
||
|
||
**没有强制关闭开关。** 这是一扇单向门——一旦检测到外部仓库就自动启用,谁也关不掉。
|
||
|
||
这说明什么?**Anthropic 的员工一直在用 Claude Code 给开源项目提交代码,而且不想让任何人知道。**
|
||
|
||
### 10.3 挫折感检测:它知道你在骂人
|
||
|
||
```typescript
|
||
// utils/userPromptKeywords.ts
|
||
const negativePattern =
|
||
/\b(wtf|wth|ffs|omfg|shit(ty|tiest)?|dumbass|horrible|awful|
|
||
piss(ed|ing)? off|piece of (shit|crap|junk)|what the (fuck|hell)|
|
||
fucking? (broken|useless|terrible|awful|horrible)|fuck you|
|
||
screw (this|you)|so frustrating|this sucks|damn it)\b/
|
||
```
|
||
|
||
这段正则表达式扫描你的每一条输入。一旦检测到你在骂 Claude,就会弹出一个分享对话记录的提示——方便 Anthropic 内部员工快速提交反馈。
|
||
|
||
为什么用正则而不是让 LLM 判断?注释写道:**"正则比 LLM 推理更快更便宜"**——用于简单的脏话检测,杀鸡不用牛刀。
|
||
|
||
> 放心,这个功能在外部版本中是被编译器完整删除的。你骂了也没人知道。
|
||
|
||
### 10.4 KAIROS:一直在线的 AI 守护者
|
||
|
||
**KAIROS**——古希腊语"恰当的时机"——是这次泄漏中**最重磅的发现**。
|
||
|
||
它在源码中被提及超过 **150 次**,是一个完全已经开发好但尚未发布的功能:**始终在线的后台智能体**。
|
||
|
||
当前的 Claude Code 是"你问我答"模式。但 KAIROS 模式下,Claude Code 变成了一个**永不下线的守护进程**:
|
||
|
||
- **autoDream**:你不用 Claude Code 的时候,它在后台自动"做梦"——整理记忆、合并发现、消除矛盾
|
||
- **Cron 任务**:每 5 分钟刷新一次计划任务
|
||
- **GitHub webhook**:监听你仓库的 PR、Issue、CI 状态
|
||
- **推送通知**:主动找你汇报发现
|
||
|
||
autoDream 的触发条件也在源码里:
|
||
1. 距离上次整合 ≥ 24 小时
|
||
2. 至少 5 个新会话
|
||
3. 同一时间只有一个进程执行整合(进程锁)
|
||
|
||
**这不再是一个工具,这是一个 AI 同事。**
|
||
|
||
### 10.5 Buddy 伴侣系统:愚人节彩蛋?认真的?
|
||
|
||
`buddy/` 目录包含一个完整的 **Tamagotchi 风格虚拟宠物系统**:
|
||
|
||
- **18 种物种**:鸭子、龙、章鱼、水豚、幽灵、蘑菇……物种名用十六进制编码,因为其中一个物种名跟内部模型代号撞了
|
||
- **稀有度**:普通(60%)、非凡(25%)、稀有(10%)、史诗(4%)、**传说(1%)**
|
||
- **RPG 属性**:DEBUGGING、PATIENCE、CHAOS、WISDOM、SNARK
|
||
- **防篡改**:宠物数据从 `hash(userId)` 确定性生成,不存在本地配置里。你想改配置文件把自己的宠物变成传说级?不好意思,每次都是现算的
|
||
|
||
活跃窗口:**2026 年 4 月 1-7 日**。没错,就是今天开始。
|
||
|
||
---
|
||
|
||
## 十一、Bash 安全:23 道防线
|
||
|
||
Claude Code 让 AI 在你电脑上执行 Shell 命令。这意味着安全必须做到极致。
|
||
|
||
`bashSecurity.ts` 实现了 **23 项编号安全检查**:
|
||
|
||
| 防御类别 | 具体内容 |
|
||
|---------|---------|
|
||
| 命令注入 | 拦截 `$()`、`${}`、进程替换 `<()`、`>()` |
|
||
| Zsh 危险命令 | 封禁 `zmodload`、`sysopen`、`ztcp` 等 18 个内置命令 |
|
||
| 绕过攻击 | 防御 Zsh 的 `=curl` 等号展开(能绕过 curl 权限检查) |
|
||
| Unicode 攻击 | 检测零宽空格注入、不可见 Unicode 字符 |
|
||
| 环境变量 | 防御 IFS 空字节注入 |
|
||
| 混淆手法 | 花括号展开、注释/引号边界错位 |
|
||
| 审计发现 | HackerOne 报告的格式错误 token 绕过 |
|
||
|
||
每次触发都记录事件(`tengu_bash_security_check_triggered` + 检查编号),用于持续监控攻击模式。
|
||
|
||
---
|
||
|
||
## 十二、250,000 次 API 调用的浪费——三行代码修好
|
||
|
||
源码注释里有一段让人目瞪口呆的记录:
|
||
|
||
> **2026-03-10:BQ 分析显示 1,279 个会话在单次会话中有 50+ 连续自动压缩失败(最高达 3,272 次),全球每日浪费约 250,000 次 API 调用。**
|
||
|
||
发生了什么?当上下文窗口接近极限时,Claude Code 会自动尝试压缩对话。但如果上下文已经太大,压缩也会失败。原来的代码没有失败上限,就**一直重试、一直失败、一直烧钱**。
|
||
|
||
修复方案:
|
||
|
||
```typescript
|
||
const MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3
|
||
```
|
||
|
||
**三行代码,每天省 25 万次 API 调用。**
|
||
|
||
---
|
||
|
||
## 十三、44 个特性开关:产品路线图全曝光
|
||
|
||
Claude Code 使用 Bun 的构建时特性开关系统。`feature('FLAG_NAME')` 在编译时被常量折叠——外部版本中,所有内部功能的代码直接**物理删除**,不是注释掉,是根本不存在于二进制中。
|
||
|
||
但源码里全都有。一共 **44 个特性开关**,部分列举:
|
||
|
||
| 开关 | 功能 | 状态 |
|
||
|------|------|------|
|
||
| `KAIROS` | 始终在线守护智能体 | 开发完成,未发布 |
|
||
| `VOICE_MODE` | 语音输入(Deepgram STT) | 开发完成,未发布 |
|
||
| `COORDINATOR_MODE` | 多智能体协调 | 已发布 |
|
||
| `BUDDY` | 虚拟宠物 | 愚人节限定 |
|
||
| `ANTI_DISTILLATION_CC` | 反蒸馏投毒 | 内部启用 |
|
||
| `DAEMON` | 后台守护进程 | 开发中 |
|
||
| `BRIDGE_MODE` | IDE 桥接 | 已发布 |
|
||
| `AGENT_TRIGGERS` | 智能体触发器 | 开发中 |
|
||
| `NATIVE_CLIENT_ATTESTATION` | 客户端证明 | 开发中 |
|
||
| `TORCH` / `ULTRAPLAN` | 未知 | 未知 |
|
||
|
||
**这基本上就是 Anthropic 未来半年的产品路线图。** 竞争对手(OpenAI Codex、Google Gemini CLI)现在知道 Anthropic 在做什么了。
|
||
|
||
源码可以被重构。但战略意外,无法被 DMCA 撤回。
|
||
|
||
---
|
||
|
||
## 十四、社区的反应:2 小时 5 万星
|
||
|
||
泄漏发生后,GitHub 上迅速出现了多个镜像仓库。其中最火的是 `claw-code`——一个韩国开发者在凌晨 4 点被手机通知吵醒,**连夜用 Python 重写了 Claude Code 的核心架构**,然后推上了 GitHub。
|
||
|
||
> *"My girlfriend in Korea was genuinely worried I might face legal action from Anthropic just for having the code on my machine — so I did what any engineer would do under pressure: I sat down, ported the core features to Python from scratch, and pushed it before the sun came up."*
|
||
|
||
2 小时后,仓库星标突破 **5 万**——成为 GitHub 历史上达到 5 万星最快的仓库。
|
||
|
||
还有人用 Rust 重写了 `runtime` 层(6 个 crate,31 个 `.rs` 文件),声称性能提升了 3 倍。
|
||
|
||
Anthropic 很快发出了 DMCA 撤回通知,删除了原始镜像。但 Python 重写版因为是"clean-room rewrite"(洁净室重写),目前仍然在线。
|
||
|
||
---
|
||
|
||
## 十五、这件事意味着什么?
|
||
|
||
### 对开发者
|
||
|
||
Claude Code 的架构中有大量值得学习的模式:
|
||
- **流式优先**:整个链路都是 `AsyncGenerator`
|
||
- **读写分离的工具调度**:简单但高效
|
||
- **prompt 编排多智能体**:用自然语言而非代码定义工作流
|
||
- **文件驱动的记忆系统**:简单可靠,不依赖外部服务
|
||
- **构建时死代码消除**:一套代码,两个版本
|
||
|
||
### 对行业
|
||
|
||
1. **AI 编程工具的复杂度远超想象**。51 万行代码、44 个特性开关、23 项安全检查——这不是一个周末 hackathon 能搞定的东西
|
||
2. **KAIROS 代表着方向**。AI 编程助手正在从"你问我答"走向"始终在线的 AI 同事"。Anthropic 已经把它做出来了,只是没发布
|
||
3. **开源 vs 闭源的边界越来越模糊**。Google 开源了 Gemini CLI,OpenAI 开源了 Codex agent SDK。但那些只是工具包。Claude Code 暴露的是**旗舰产品的完整内部实现**——这不一样
|
||
|
||
### 对 Anthropic
|
||
|
||
这是一周内的第二次意外泄露。对于一家以"AI 安全"为品牌核心的公司来说,连续的安全事故无疑让人尴尬。不过换个角度看——如果你的代码足够好,被看到也不是世界末日。
|
||
|
||
从源码质量来看,Claude Code 的工程水平确实很高。虽然 `print.ts` 有 5,594 行、单个函数 3,167 行、12 层嵌套这种"史诗级屎山",但整体架构思路清晰、安全意识到位、性能优化深入。
|
||
|
||
**51 万行代码,一次意外,全世界都看见了。**
|
||
|
||
---
|
||
|
||
> 如果你觉得这篇文章有价值,欢迎转发给身边的开发者朋友。这可能是我们唯一一次机会,看到一个世界级 AI 编程智能体的完整内部实现。
|
||
>
|
||
> 关注"老邓唠AI",下一篇我们聊聊从 Claude Code 的架构中,普通开发者能学到哪些可以直接用的设计模式。
|
||
|
||
---
|
||
|
||
**参考资料:**
|
||
|
||
- [The Register: Anthropic accidentally exposes Claude Code source code](https://www.theregister.com/2026/03/31/anthropic_claude_code_source_code/)
|
||
- [DEV Community: Claude Code's Entire Source Code Was Just Leaked](https://dev.to/gabrielanhaia/claude-codes-entire-source-code-was-just-leaked-via-npm-source-maps-heres-whats-inside-cjo)
|
||
- [Alex Kim's Blog: The Claude Code Source Leak](https://alex000kim.com/posts/2026-03-31-claude-code-source-leak/)
|
||
- [Fortune: Anthropic leaks its own AI coding tool's source code](https://fortune.com/2026/03/31/anthropic-source-code-claude-code-data-leak-second-security-lapse-days-after-accidentally-revealing-mythos/)
|
||
- [VentureBeat: Claude Code's source code appears to have leaked](https://venturebeat.com/technology/claude-codes-source-code-appears-to-have-leaked-heres-what-we-know)
|
||
- [GitHub: claw-code (Python rewrite)](https://github.com/instructkr/claw-code)
|