乐于分享
好东西不私藏

Claude Code 51万行源码意外泄露,我把 Claude Code 架构扒了个底朝天

本文最后更新于2026-03-31,某些文章具有时效性,若有错误或已失效,请在下方留言或联系老夜

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 -rfgit 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