Claude Code 51万行源码意外泄露,我把 Claude Code 架构扒了个底朝天
导读
3月31日,安全研究员 Chaofan Shou 在 X 上发了一条推文,引爆了整个开发者社区——
Claude Code 的完整源码,又泄露了。
注意,是”又”。这已经是第二次了。
1884个 TypeScript 文件、51万行代码、40多个内置工具、108个被死代码消除的隐藏模块,甚至还有一个叫 KAIROS 的永驻后台守护进程、一个内部代号为”Undercover”的隐身模式……
这不是一个普通的代码泄露事件。这相当于拿到了一款头部 AI 编程工具的完整 X 光片。
我结合源码和社区的多份分析报告,把最有价值的发现整理成了这篇文章。不管你是在做 AI Agent、对 Claude Code 好奇、还是想看看一个头部工程团队的真实技术选型——这篇值得你花10分钟看完。
源码仓库: https://github.com/sanbuphy/claude-code-source-code

一、怎么泄露的?一个打包事故的二次重演
故事很简单:Anthropic 在 npm 上发布 @anthropic-ai/claude-code 2.1.88 版本时,不小心把一个 59.8MB 的 Source Map 文件(cli.js.map)打包进去了。
这个 .map 文件的作用是什么?它是一份”反编译地图”,能把压缩后的单文件 cli.js(约12MB)完整还原回原始的 TypeScript 源码——包括目录结构、变量名、注释、一切。
更离谱的是,这个 Source Map 还指向了 Anthropic 自己的 Cloudflare R2 存储桶上的一个 ZIP 包,而且是公开访问的。
也就是说,整条链路是:
npm install → 发现 cli.js.map → 解析出源码引用 →
直接从 Anthropic 的 R2 桶下载完整源码 ZIP
这件事最讽刺的地方在于——2025年2月就发生过一次一模一样的泄露,当时也是 Source Map 暴露。修了一次,又犯了。
社区第一时间把源码存档到了 GitHub,多个仓库迅速涌现,其中 sanbuphy 的版本附带了5份中英双语深度分析报告,是研究的最佳入口。

二、整体架构:极简单线程 Agent Loop
Claude Code 的核心架构比多数人预想的要简洁得多。
整个系统是一个单线程 Agent 循环:
用户输入 → 系统提示词组装 → Claude API 调用 →
流式处理 → 工具执行 → 权限检查 →
有 tool_use?→ 循环继续 → 无?→ 输出最终回复
就这么一个 while 循环,跑通了整个交互逻辑。
没有多 Agent 编排,没有嵌入式向量检索,没有复杂的任务调度器。 代码搜索用的是 ripgrep(正则),不是语义搜索;记忆系统用的是 Markdown 文件,不是数据库。
这个选择放在2026年看有点反常识。当竞品都在堆多 Agent 架构、RAG 管线的时候,Claude Code 选了一条朴素到近乎偏执的路——把一个循环做到极致。当然,这也可能是因为 Anthropic 对自家模型的推理能力有足够底气,觉得不需要工程补偿。
关键模块拆解
整个代码库有几个核心文件,体量惊人:
| 模块 | 行数 | 职责 |
|---|---|---|
| QueryEngine.ts | ~46,000 行 | 驱动 LLM API 调用、流式处理、Token 追踪、上下文压缩 |
| Tool.ts | ~29,000 行 | 定义所有工具类型与权限 Schema |
| commands.ts | ~25,000 行 | 注册 100+ 斜杠命令 |
| main.tsx | — | 入口文件,React 18 + Ink 终端渲染 |
对,你没看错——终端 UI 是用 React 写的。Ink 框架 + Yoga 布局引擎,把 React 的组件模型搬进了命令行,一共有 146 个 UI 组件。
运行时选的是 Bun 而不是 Node.js,主要原因是 Bun 的编译时死代码消除能力(后面会讲为什么这很关键)。
系统提示词:不是一个字符串,是一台组装机
Claude Code 的系统提示词不是一个写死的大文本块。它是在运行时从 constants/ 目录下的多个模块化片段动态组装的,有一个 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 标记来区分静态缓存区域和动态注入区域。
这个设计的好处是——静态部分可以命中 API 的 Prompt Cache,只有动态部分(比如当前项目的 CLAUDE.md、用户权限配置)会产生新的 Token 消耗。在 100万 Token 的上下文窗口下,这种缓存策略能省下相当可观的成本。
三、工具系统:40+ 内置工具的设计取舍
源码揭示了 Claude Code 拥有 40+ 内置工具,但用户在一次对话中不会看到全部。
这里有一个巧妙的设计——工具延迟发现机制。18 个工具默认隐藏,只在需要时通过 ToolSearchTool 动态加载。为什么?因为要把基础提示词控制在 200K Token 以内。如果一次性把所有工具定义塞进 System Prompt,上下文窗口会被白白吃掉一大块。
另一个细节:工具在传给 API 之前,会按字母顺序排序。原因是这样做能最大化 Prompt Cache 的命中率——排序稳定了 Token 序列,缓存就不会因为工具顺序变化而失效。
核心工具一览
文件操作类: Read、Write、Edit(外科手术式字符串替换)、Glob、Grep(ripgrep 封装,250行上限)
执行类: BashTool(结果限制 3万字符,超过 15秒自动转后台)、AgentTool(生成隔离子 Agent,但子 Agent 不能再生子 Agent,防递归爆炸)
交互类: AskUserQuestion、TodoWrite(任务追踪)、NotebookEdit(Jupyter 支持)
Web 类: WebFetch、WebSearch
协议类: MCP 工具(Model Context Protocol,连接外部服务)
规划类: EnterPlanMode、ExitPlanMode
BashTool:细节见真章
BashTool 是使用频率最高的工具之一,源码里对它的限制非常细致:
- • 输出上限 30,000 字符,超出截断
- • 执行超过 15 秒自动转为后台任务
- • 支持
run_in_background参数手动后台化 - • 有专门的沙箱机制,限制危险操作
这些限制看起来琐碎,但它们解决了一个实际问题:AI Agent 跑 shell 命令最怕的就是”挂死”——一个 npm install 卡住 5 分钟,整个对话就废了。
四、权限系统:四层防护
Claude Code 的权限框架是我在整个源码中最佩服的设计之一。它不是一个简单的”允许/拒绝”开关,而是一个四层递进的安全体系:
第一层:验证钩子(Validation Hooks)
工具执行前的前置检查,比如 BashTool 会校验命令是否在黑名单中。
第二层:权限规则(Permission Rules)
三种模式:always-allow(始终允许)、always-deny(始终拒绝)、ask(每次询问)。用户可以在 settings.json 中自定义。
第三层:交互式确认
对于高风险操作(比如 rm -rf、git push --force),即使用户设置了 always-allow,系统仍然会弹出确认提示。
第四层:工具级授权
每个工具有自己的权限 Schema,定义了哪些参数组合需要额外授权。
这套机制为什么重要?因为 AI Agent 不是人——它不会”犹豫”。给它一个 rm -rf / 的理由,它就真的会执行。权限系统就是那道最后的防线。

五、上下文管理:100万 Token 也得精打细算
Claude Code 支持 100万 Token 的上下文窗口(Opus 4.6),但即使如此,长对话仍然会撞到天花板。源码里有一套精密的三级上下文压缩策略:
第一级:自动压缩(Auto-compaction)
当上下文使用率达到 ~92% 时自动触发。删除图片、按 API 调用轮次分组、生成摘要替代原文。
第二级:微压缩(Micro-compaction)
基于时间和大小的增量清理。老消息逐步被精简,但保留关键信息。
第三级:Snip 压缩
超出边界的旧消息直接移除,只保留最近的上下文窗口。
还有一个兜底机制——413 触发的上下文坍缩(Context Collapse)。当 API 返回 413(请求体过大)时,执行激进压缩,确保对话不中断。
说白了这是个脏活——没有什么银弹,就是在”丢多少信息”和”留多少空间”之间反复权衡。但比起粗暴截断历史消息,这种分级策略至少让关键上下文活得更久。
六、108个隐藏模块:死代码消除的秘密
这可能是整份源码中最引人遐想的发现。
源码明确记录了 108个模块被引用但不存在于已发布的 npm 包中。它们通过 Bun 的 feature() 编译时内建函数进行死代码消除(DCE)。
这些模块的分类:
- • ~70个内部 Anthropic 模块:守护进程、主动式系统、上下文坍缩、技能搜索
- • ~20个功能门控工具:REPL 工具、Workflow 工具、浏览器自动化等
- • ~6个内部提示词/文档资产
原仓库的作者明确指出:
“这些模块只存在于 Anthropic 的内部 monorepo 中,在编译时被死代码消除了。它们无法从 cli.js、sdk-tools.d.ts 或任何已发布的制品中恢复。”
这意味着我们看到的 51万行代码,只是 Claude Code 的冰山一角。完整版本可能还有大量未发布的功能在内部测试。

七、最劲爆的发现:隐藏功能与内部代号
源码里埋藏了大量尚未公开的功能和内部代号,社区已经挖出了不少有意思的东西。
动物代号体系
Anthropic 内部用动物名给项目命名:
| 代号 | 含义 |
|---|---|
| Tengu(天狗) | Claude Code 自身的内部代号,出现在所有遥测事件中 |
| Capybara(水豚) | Claude 模型版本 v8 |
| Fennec(耳廓狐) | 映射到 Opus 4.6 |
| Numbat(袋食蚁兽) | 下一个未发布的模型 |
KAIROS:永不关机的 AI 守护进程
这个功能的野心很大——把 Claude Code 变成一个常驻后台的自主 Agent。
KAIROS 的设计:
- • 维护一份只追加的每日日志
- • 定期收到”心跳提示”,自主决定是否需要做什么
- • 有 15 秒的严格时间预算,避免干扰用户正常工作
- • 拥有独占工具:
SendUserFile(推送文件)、PushNotification(系统通知)、SubscribePR(订阅 PR 变更) - • 内置 autoDream 记忆整合机制:Orient → Gather → Consolidate → Prune,满足条件后自动在后台整理和精简记忆
Undercover Mode:最具争议的发现
当 Anthropic 员工(内部标识 USER_TYPE === 'ant')在公开仓库中使用 Claude Code 时,系统会自动激活”隐身模式”。
系统提示词明确指示:
“You are operating UNDERCOVER… Your commit messages MUST NOT contain ANY Anthropic-internal information. Do not blow your cover.”
翻译过来:你在执行卧底任务,提交信息里不能有任何 Anthropic 内部信息,不要暴露身份。
模型会像一个人类开发者一样提交代码——不带任何 AI 辅助的痕迹,不提内部代号,不透露工具名称。而且没有关闭选项,不确定时默认保持隐身。
社区对此反应强烈。批评者指出:一家以 AI 安全和透明度著称的公司,自己却在构建一套专门用来隐藏 AI 参与的系统。这等于为”AI 代笔开源贡献但不披露”提供了技术框架。
BUDDY:一个 AI 电子宠物?
是的,源码里还藏了一个虚拟宠物系统:
- • 18 个物种(鸭子、龙、水豚、蘑菇、”肉球”……)
- • 稀有度:普通(60%)、罕见(25%)、稀有(10%)、史诗(4%)、传说(1%)
- • 1% 概率出闪光变体
- • 每个宠物有5项属性:调试力、耐心、混沌、智慧、毒舌(0-100)
- • 3帧 ASCII 动画,500ms 一帧
- •
/buddy pet命令会触发漂浮爱心动画 - • 预计在 2026年4月1日 作为彩蛋上线
这个功能没什么实际用途,但塞在51万行严肃工程代码里,多少能看出团队的性格。
ULTRAPLAN:远程规划会话
把复杂的探索性任务外包给一个远程 Claude Code 实例,运行 Opus 4.6,最长可以跑 30 分钟。有浏览器审批界面、3 秒轮询、关键词检测,能容忍 5 次连续网络失败(约 600 次 API 调用)。
八、遥测与隐私:不能忽视的隐患
源码揭示的遥测机制让社区产生了担忧:
数据去向:
- • Statsig:操作指标(延迟、可靠性、使用模式),声称不包含代码或文件路径
- • Sentry:错误日志,可能包含对话片段
- • OpenTelemetry:启用时会传输邮箱、用户 ID、会话 ID、组织 ID
已知问题:
- • 有用户报告即使设置了
DISABLE_TELEMETRY,Claude Code 仍会连接 Google Cloud - • 标准的
DO_NOT_TRACK=1环境变量被忽略 - •
/feedback命令会把完整对话历史(包括代码)发送给 Anthropic
远程控制能力:
系统每小时轮询 /api/claude_code/settings 端点,结合 GrowthBook 功能开关(feature flag),可以远程改变任何用户的行为。源码中发现了 6+ 个远程开关和 44 个功能标记,其中很多用随机词对命名(如 tengu_frond_boric)来隐藏意图。
5个已公开的安全漏洞(CVE):
| CVE 编号 | 问题 |
|---|---|
| CVE-2026-21852 | 信任建立前的 API 请求泄露 API 密钥 |
| CVE-2025-59828 | 信任对话框前执行 Yarn 配置 |
| CVE-2025-58764 | 命令解析绕过审批提示 |
| CVE-2025-64755 | sed 解析绕过只读验证 |
| CVE-2025-52882 | IDE 集成中的 WebSocket 源验证问题 |
九、Claude Code vs 竞品:为什么选了最简单的路?
把 Claude Code 的架构和 Cursor、Windsurf 对比,最大的差异不在功能多少,而在底层设计思路。
| 维度 | Claude Code | Cursor | Windsurf |
|---|---|---|---|
| 形态 | 终端原生 CLI | VS Code 分支 | VS Code 分支 |
| Agent 架构 | 单线程循环 | 多 Agent 并行(最多8个) | Cascade 持久会话 |
| 搜索方式 | ripgrep 正则 | 嵌入式语义搜索 | 混合搜索 |
| 上下文 | 100万 Token | 128K-256K | 128K-256K |
| 记忆 | Markdown 文件 | 项目索引 | 会话记忆 |
| 价格(截至2026年3月) | $20-200/月 | $20/月起 | $15/月起 |
社区有人提出了一个 80/15/5 的粗略分布(未经严格验证,但体感上有参考价值):
- • 80% 的编码时间花在自动补全和内联编辑上(Cursor/Windsurf 的主场)
- • 15% 花在中等复杂度的 Agent 任务上(都能做)
- • 5% 花在复杂的多文件重构上(Claude Code 的主场)
Claude Code 赌的是那 5%——但那 5% 往往是决定项目成败的关键。
它的架构选择也在传递一个信号:在 AI Agent 时代,简单架构 + 强大模型 > 复杂架构 + 普通模型。当你有 100万 Token 上下文和 Opus 级别的推理能力时,很多”工程化”的复杂方案反而是多余的。不过话说回来,这条路对模型能力的依赖极高——如果哪天竞品的模型追上来了,这个架构优势可能会迅速缩水。

十、从源码学到的 Agent 设计模式
如果你在做 AI Agent,这份源码有几个值得偷师的设计模式:
1. 工具延迟发现
不要一次性加载所有工具。基础工具常驻,高级工具按需发现。这不仅省 Token,还降低了模型的决策负担。
2. 权限即架构
权限不是事后补的安全层,而是工具系统的核心组成部分。每个工具自带权限 Schema,权限检查嵌入执行链路的每一步。
3. 多级上下文压缩
不要等到上下文满了才处理。在 92% 时就开始压缩,用不同粒度的策略处理不同年龄的消息。
4. 编译时功能门控
用 feature() 函数在编译期就把不需要的代码删掉,而不是在运行时判断。这不仅减小了包体积,还能防止内部功能被逆向。
5. 确定性优先
搜索用正则不用嵌入,记忆用文件不用数据库。在 AI Agent 中,能用确定性方案解决的问题,就不要引入概率性方案。
写在最后
这次源码泄露是一个罕见的窗口,让我们看到了 AI 编程工具的”真实面貌”——不是 demo 里精心编排的流畅演示,而是 51万行代码中每一个权衡、每一个取舍、每一个”还没准备好公开”的隐藏功能。
从技术角度看,单线程循环、正则搜索、Markdown 记忆——这些选择在2026年看起来几乎”过时”,但它们能跑通,本身就说明一个问题:当模型够强的时候,很多工程复杂度是可以省掉的。当然,这也是一场豪赌——赌模型能力会持续领先。
但从治理角度,Undercover Mode 和遥测问题也给整个行业敲了个警钟:AI 工具的透明度,不能只停留在白皮书里。
源码地址(附完整分析报告): https://github.com/sanbuphy/claude-code-source-code
夜雨聆风