一、事件经过:一次失误引发的全曝光
Bun 打包器默认开启 source map 生成,但发布脚本的 .npmignore 没有排除 *.map 文件,导致 59.8MB 的 source map(包含完整 TypeScript 原始代码)被打包进 npm 生产版本。
cli.js.map(59.8MB)Anthropic 专门构建了 Undercover Mode 防止 AI 在代码提交中泄露内部信息 —— 结果源码本身通过一个 .npmignore 疏漏完整泄露,包括 Undercover Mode 本身的完整实现、所有内部代号和未发布功能。
二、整体架构:1906个文件的秘密
技术栈
Claude Code 的技术栈出乎很多人意料:
- 运行时:Bun(不是 Node.js),使用
bun:bundle的编译期特性门控 - UI 框架:React + Ink(将 React 渲染到终端 Terminal,而不是浏览器 DOM)
- CLI 解析:Commander.js
- Feature Flag:GrowthBook(从 Statsig 迁移中)
核心目录结构
src/
├── main.tsx # CLI 入口 (~800KB),含引导、REPL、主循环
├── QueryEngine.ts # 核心 LLM 调用引擎
├── Tool.ts # 工具基类
├── tools/ # 184 个文件,40+ 工具
│ ├── AgentTool/ # 子 Agent 管理
│ ├── BashTool/ # Shell 执行(含安全模块)
│ ├── FileEditTool/ # 文件编辑
│ ├── WebSearchTool/ # 网页搜索
│ └── MCPTool/ # MCP 协议工具
├── services/ # 130 个文件
│ ├── analytics/ # GrowthBook + 事件埋点
│ ├── autoDream/ # 后台记忆整理(Dream 系统)
│ └── MCP/ # MCP 服务器管理
├── buddy/ # 6 个文件 — 宠物伙伴系统
├── commands/ # 207 个文件 — CLI 命令
├── components/ # 389 个文件 — React 组件
├── utils/ # 564 个文件 — 工具函数
└── migrations/ # 11 个文件 — 数据迁移历史
编译期特性门控(完整列表)
Claude Code 使用 Bun 的 feature() 函数实现编译期死码消除,发布版本中所有 false 的门控分支都不会出现在最终 JS 里。以下是从源码中找到的完整未发布功能清单:
| 特性名 | 功能说明 | 状态 |
|---|---|---|
PROACTIVE / KAIROS | 永续助手模式,主动观察和行动 | 未发布 |
BRIDGE_MODE | 与 claude.ai 远程连接控制 | 未发布 |
DAEMON | 后台守护进程常驻模式 | 未发布 |
VOICE_MODE | 语音输入命令 | 未发布 |
COORDINATOR_MODE | 多 Agent 编排协调器 | 未发布 |
TRANSCRIPT_CLASSIFIER | ML 自动审批(AFK 模式) | 未发布 |
BUDDY | Terminal 宠物伙伴系统 | 未发布 |
WORKFLOW_SCRIPTS | 工作流自动化脚本 | 未发布 |
三、Undercover Mode:专为卧底内部员工设计的隐身模式
这是泄露源码里最有意思的功能之一。Anthropic 内部员工大量使用 Claude Code 参与开源开发,但为了防止 AI 在 commit 消息、PR 描述中无意泄露内部信息,专门为此构建了 Undercover Mode。
工作原理
// src/utils/undercover.ts
export function isUndercover(): boolean {
if (process.env.USER_TYPE === 'ant') {
// 强制开启
if (isEnvTruthy(process.env.CLAUDE_CODE_UNDERCOVER)) return true
// 自动模式:不在内部仓库白名单就开启
return getRepoClassCached() !== 'internal'
}
return false // 外部用户不生效
}
三档激活逻辑:① 环境变量强制 → ② 自动模式(不在内部白名单就开启) → ③ 没有强制关闭选项(安全优先)
隐藏的内容类型
当 Undercover Mode 开启时,系统提示词会注入以下指令,要求 AI 在 commit/PR 内容中隐藏:
- 内部模型代号(Capybara、Tengu、Fennec 等动物名)
- 未发布模型版本号(如 opus-4-7、sonnet-4-8)
- 内部仓库名称(claude-cli-internal、anthropics/...)
- 内部工具链、Slack 频道、短链(go/cc、#claude-code-...)
- "Claude Code" 这个词本身以及"你是 AI"这个事实
- Co-Authored-By 署名行
四、Fast Mode = 企鹅模式(Penguin Mode)
源码直接确认了 Fast Mode 的内部代号是 Penguin Mode(而不是坊间猜测的其他名字)。
// API 端点
const endpoint = `/api/claude_code_penguin_mode`
// 配置键
penguinModeOrgEnabled
// 杀死开关(GrowthBook)
tengu_penguins_off
// 分析事件
tengu_org_penguin_mode_fetch_failed
tengu_fast_mode_fallback_triggered
状态机架构
Fast Mode 有完整的四层状态机:
isFastModeEnabled()— 全局开关isFastModeAvailable()— 可用性检查(含 Statsig 门控)isFastModeSupportedByModel()— 仅限 Opus 4.6isFastModeCooldown()— 速率限制冷却计时
不可用原因:free(免费账户)/ preference(组织禁用)/ extra_usage_disabled(超额计费未开启)
冷却触发:rate_limit 或 overloaded,冷却时长由 API 返回的 resetTimestamp 决定
五、Buddy 宠物系统:Terminal 里的电子鸡
这是泄露代码里最令人意外的发现。Anthropic 正在开发一个在终端里显示的宠物伙伴系统,完整度相当高——不是玩笑项目,是正经的产品规划。
19 个物种(不是 18 个)
所有物种名通过 String.fromCharCode() 混淆,防止在源码搜索中暴露:
| 🦆 duck | 🪿 goose | 🫧 blob | 🐱 cat |
| 🐉 dragon | 🐙 octopus | 🦉 owl | 🐧 penguin |
| 🐢 turtle | 🐌 snail | 👻 ghost | 🦎 axolotl |
| 🐭 capybara | 🌵 cactus | 🤖 robot | 🐰 rabbit |
| 🍄 mushroom | 🐾 chonk | (19个,社区普遍说18个,实际多一个 chonk) | |
抽卡系统
| 稀有度 | 概率 | 属性下限 |
|---|---|---|
| Common | 60% | 5 |
| Uncommon | 25% | 15 |
| Rare | 10% | 25 |
| Epic | 4% | 35 |
| Legendary | 1% | 50 |
5 项属性:DEBUGGING(调试力)/ PATIENCE(耐心)/ CHAOS(混乱度)/ WISDOM(智慧)/ SNARK(毒舌度)
确定性:使用 Mulberry32 PRNG,种子 = hash(userId + 'friend-2026-401'),同一用户永远抽到同一只宠物。只有 "Soul"(AI 生成的名字和个性)会持久化存储。
六、Dream 记忆整理:后台运行的 AI 整理工
Dream 系统是 Claude Code 的后台记忆整理机制,当满足特定条件时自动 fork 一个子 Agent 在后台整理你的 memory 文件。
三门触发机制
门1:时间门 → 距上次整理 >= 24小时
门2:会话门 → 新会话数 >= 5
门3:锁门 → 获取排他锁(防止并发)
全部通过 → Fork 子 Agent 执行整理
四阶段整理流程
- Phase 1 - Orient:读取 MEMORY.md,了解已有结构,避免重复
- Phase 2 - Gather:读日志、找矛盾记忆、grep 关键信息
- Phase 3 - Consolidate:合并信息,相对日期转绝对日期,删除矛盾
- Phase 4 - Prune:MEMORY.md 控制在 <200行/<25KB,每条索引 <150 字符
Dream Agent 的 Bash 权限严格受限,只允许 ls、grep、cat 等只读命令,所有写操作全部拒绝。无法被利用做危险操作。
七、模型代号与演进历史
动物命名体系
源码 migrations/ 目录里的迁移文件揭示了完整的模型演进路径:
// migrateFennecToOpus.ts
'fennec-latest' → 'opus'
'fennec-latest[1m]' → 'opus[1m]'
'fennec-fast-latest' → 'opus[1m]' + fastMode: true
// migrateSonnet45ToSonnet46.ts
'claude-sonnet-4-5-20250929' → 'sonnet'
'sonnet-4-5-20250929[1m]' → 'sonnet[1m]'
确认的代号体系:
- Fennec(耳廓狐)→ Opus 的历史代号
- Tengu → Claude Code 项目本身的内部代号
- Capybara(水豚)→ 新一代模型系列(Anthropic 正在工程化)
源码揭示 Anthropic 观察到 Capybara 模型在 Prompt 形状类似 turn boundary 时会提前停止生成。已实施缓解措施:强制插入 Tool loaded. 安全标记、重新定位有风险的兄弟块、压缩工具输出内容。
八、8个未发布功能全景
| 功能 | 内部代号 | 说明 | 状态 |
|---|---|---|---|
| 永续助手 | KAIROS |
不等用户输入,主动观察和行动的后台 Agent | 未发布 |
| 超长规划 | ULTRAPLAN |
30分钟 CCR 远程规划会话(Opus 4.6) | 未发布 |
| 记忆梦想 | Dream | 后台记忆整理 Agent(已见上文) | 未发布 |
| 宠物伙伴 | Buddy | Terminal 电子鸡(已见上文) | 未发布 |
| 多 Agent 编排 | COORDINATOR |
并行工作 Agent + 协调器 | 未发布 |
| Agent 群 | Agent Swarms | 跨进程队友协作(需 opt-in) | 需申请 |
| 计算机使用 | Chicago | @ant/computer-use-mcp 集成 | Max/Pro限定 |
| 语音输入 | VOICE_MODE |
语音命令输入 | 未发布 |
九、技术观点与安全启示
工程质量评价
优秀方面:
- 编译期死码消除 + GrowthBook 运行时控制的双层特性门控,设计成熟
- GrowthBook 内存→磁盘→网络三级缓存降级,容错能力强
- Dream 系统四阶段提示词精细,三门触发避免过度运行
- 宠物系统确定性好(Mulberry32)+ 隐私保护兼顾,产品完整度高
需要改进的地方:
- npm 发布流程缺少产物检查(最低成本的安全措施)
String.fromCharCode()混淆只是掩耳盗铃,反而增加了可读性负担
与社区分析的差异
基于直接阅读源码,对社区流传分析的几点修正:
- 物种数量:流传版本说 18 个,源码确认是 19 个(增加了 chonk)
- Undercover Mode:没有强制关闭选项,外部用户完全不受影响
- Dream 触发条件:不是单独的时间或次数,是时间门 + 会话门 + 锁门三个同时通过
- Beta Headers:完整列表有 16 个,包含 task-budgets-2026-03-13、token-efficient-tools-2026-03-28 等比较新的
这次泄露最大的意义不是"Claude Code 有多少 bug",而是揭示了 AI 工具的真实研发节奏:发布版本只是冰山一角,大量功能已经完成甚至生产就绪,只是通过特性门控锁住。Anthropic 在 Claude Code 上的投入,远超产品表面呈现的规模。