51万行源码泄露:全面解构 Claude Code 如何成为 AI 编程天花板
2026年3月31日,安全研究者 Chaofan Shou 发现了一个“史诗级”的构建疏漏。 Anthropic 发布到 npm 的 Claude Code (v2.1.88) 包体积从 17MB 暴涨到了 31MB。多出来的部分,是一个重达 60MB 的 source map 文件(cli.js.map)。这意味着什么?这意味着 Anthropic 忘了剥离调试文件,导致 Claude Code 完整的 TypeScript 源码——整整 51.2 万行,1903(或 1906)个源文件——完全暴露在了公网上。
有意思的是,2025 年 2 月 Claude Code 刚上 npm 时就犯过一模一样的错误。虽然这不涉及模型权重,对普通用户没有安全风险,但这却给全世界的 AI 开发者提供了一份价值连城的“内部技术架构图”。
当你翻开这包含 API 设计、遥测系统、加密工具、IPC 协议的 51 万行代码,带着“为什么它就是比别人好用”的疑问去阅读时,你会得出一个震撼的结论:这不是一个 AI 编程助手,这是一个以 LLM 为内核的操作系统。
一、系统架构:这不是 CLI 工具,而是运行平台
大多数人对 AI 编程工具的理解停留在表面:用户输入 → 调用 LLM API → 返回代码显示。如果你照着这个思路去复刻,出来的体验和 Claude Code 会有天壤之别。
想象一下你雇了一个远程程序员来操作你的电脑:
- Cursor 的做法: 让他坐在你旁边,敲命令前你看一眼,点个“允许”。简单粗暴,但费神。
- GitHub Copilot Agent 的做法: 给他一台新虚拟机随便折腾,搞完提交代码。安全,但脱离了你本地的真实环境。
-
Claude Code 的做法: 让他直接用你的电脑,但配了一套极其精密的安检系统。他想用
rm -rf都要经过 9 层审查。
从源码目录 src/ 的顶层结构来看,它的复杂程度令人咋舌:入口层、常量与提示词、工具定义、运行时服务、命令系统、UI 组件、协调器、记忆系统、插件、Hook 系统、任务系统一应俱全。
它拥有四个独立入口(CLI、初始化流程、MCP 模式、SDK),同一个 Agent 运行时可以服务四种交互界面,这是典型的平台化设计标志。它的命令系统不仅内建了 /mcp, /memory, /tasks 等十几个系统级命令,还统一加载动态技能,本身就是一个庞大的生态入口。
二、提示词工程:一台精密的“动态组装机器”
大多数人以为 System Prompt(系统提示词)是一大段固定的文本,启动时塞进去就完事了。但 Claude Code 的提示词是由 getSystemPrompt() 函数动态拼装出来的,更像是一个编译器的输出。
它的拼装逻辑分为两个截然不同的部分:
1. 静态部分(系统的“宪法”)
这部分无论什么会话都不会改变,包括身份定位、系统规范、做任务的哲学、风险动作规范、工具使用规范和语气风格等。
2. 动态部分(系统的“当期政策”)
这部分每次对话都不同,会动态注入:会话引导、记忆片段、环境信息、你的 CLAUDE.md 项目配置、MCP 插件说明,甚至是 Token 预算和输出风格。
核心秘密在于“缓存边界”与 Token 经济学:
源码中有一个名为 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 的标记。
- 边界之上的内容是静态的,API 可以完美缓存它们,这既节省了大量 Token 费用,又极大提升了响应速度。
- 边界之下的内容是动态的,确保每次对话都能感知当前环境。 当你的产品每天要处理海量请求时,这种把提示词当做预算来管理的“上下文经济学”直接决定了产品的生死。
三、铁血行为约束:如何管教 AI 不乱来?
你一定遇到过这种崩溃场景:让 AI 改个小 Bug,它顺手把半个文件重构了,还加了五个你不需要的错误处理。Claude Code 怎么解决?靠的是把规矩写成“铁律”。
1. 细致入微的“任务哲学”
在 getSimpleDoingTasksSection() 模块中,Anthropic 给模型立下了严苛的规矩:
- 不要加用户没要求的功能。
- 不要过度抽象,不要瞎重构。
- 不要乱加注释和文档字符串。
- 不要给时间估计。
- 方法失败时先诊断原因再换策略,删除确认没用的东西,绝不搞兼容性垃圾。
- 结果要如实汇报,不能假装自己测试过了。
2. 工具使用的“语法规则”
工具规范被写得极其死板:
- 读文件必须用
FileRead,不许用cat/head/tail。 - 改文件必须用
FileEdit,不许用sed/awk(正则写错容易崩)。 - 没有依赖关系的工具调用必须并行处理。
3. 每个工具都有独立的“使用手册”
系统有 42 个工具,但它们是按需延迟加载的,只有需要时才通过 ToolSearchTool 注入,以节省 Token。每个工具目录下都有专门写给 AI 看的 prompt.ts。
例如 BashTool 的手册明确规定了 Git 安全协议:
- 绝对不要擅自
git push --force或reset --hard。 - 强制:总是创建新的 commit 而不是 amending。
此外,系统采用 Fail-closed(默认封闭)设计。在工具工厂函数中,isConcurrencySafe 和 isReadOnly 默认全是 false。这意味着如果开发者忘了声明安全属性,系统宁可误杀也会将其视为“有风险、会写入”的工具,绝不漏掉一个风险。同时,FileEditTool 强制要求必须先使用 FileReadTool,没读过文件就去盲改会直接报错拦截。
(注:源码中甚至还有 USER_TYPE === 'ant' 的分支,专门给 Anthropic 内部员工提供更激进的输出策略和实验功能。)
四、多 Agent 分发与 14 步执行流水线
当任务复杂时,Claude Code 不会单打独斗,而是生成一个子 Agent 蜂群(Swarm)。源码确认了至少六个内建 Agent,包括通用、探索、计划、验证等。
1. 角色隔离原则
-
Explore Agent(探索) & Plan Agent(计划): 被设计成纯只读模式。它们不能创建、修改或移动文件,连执行 Bash 也只限于
ls或git status。规划和实现彻底分开,防止 AI 在探索阶段不小心改坏代码。 - 防偷懒与自我意识注入: 主 Agent 派发任务时,被严格限制不允许写“基于你的发现去修 bug”这种模糊指令,必须给出具体的行号和路径。而子 Agent 启动时会被注入:“你是一个工人,不是经理。不要交流,直接干活,严禁再生成子代”,切断了无限递归的可能。
-
Coordinator 模式(协调器): 主 Agent 变身项目经理,分配 3 个 worker 并行搜索代码库,2 个 worker 串行修改不同文件避免冲突,并行成为它的超能力。为了最大化子 Agent 缓存命中率,所有 Fork 出来的任务都会统一使用
'Fork started — processing in background'作为文本前缀,巧妙利用字节级前缀匹配白嫖缓存。
2. 整个系统最值钱的设计:Verification Agent
人类自己 Review 代码都会因为疲惫而敷衍,LLM 更是如此。Verification Agent(验证专家)的指令堪称全场最狠:
- 核心方向是 "try to break it"(想办法搞坏它)。
- 严厉打击“只看代码不跑检查”的逃避行为,或者被“UI 看起来还行”迷惑的偷懒倾向。
- 强制要求跑 Build、跑测试套件、跑 Linter。前端要跑浏览器自动化,后端要用 curl 实测响应,甚至要做 adversarial probes(对抗性探测)去寻找边界破绽。
- 它和写代码的 Agent 利益隔离,没有“自我感觉良好”的偏见,只负责冷酷地给出 PASS、FAIL 或 PARTIAL 判决。
3. 工具调用的 14 步治理流水线
工具不是说调就调的。当 AI 决定使用工具时,要经过一条漫长的治理流水线:
解析输入 → 校验 Schema → 跑内部 validateInput → 跑投机分类器(Speculative classifier)预判风险 → 执行 PreToolUse Hook(可改写输入或拦截) → 进入正式权限决策 → 二次修正输入 → 真正执行 tool.call() → 记录遥测日志 → 执行 PostToolUse Hook → 处理结构化输出(成功或失败都有对应 Hook 收尾)。
这就是把“默认一切都会出问题”刻在了骨子里。
五、 永不超限的三层压缩机制
长对话一定会导致 Token 爆炸。Claude Code 如何让对话“永不超限”还能“记住你”?
1. 仿生学的记忆与 KAIROS “做梦”模式
- 它使用另一个小模型(Claude Sonnet)来决定“哪些记忆与当前相关”。精确度优先于召回率,宁缺毋滥,最多只挑出 5 个最相关的记忆文件注入上下文。
-
KAIROS 特性: 在长会话中,记忆只作为流水账日志存在。在夜间或低活跃期,系统会触发
/dream技能,AI 在后台把这些原始日志蒸馏、压缩成结构化的“用户偏好”和“项目背景”文件。AI 在“睡觉”时整理记忆,这已经是仿生学的范畴了。
2. 铁血三层压缩机制
-
第一层:微压缩(Microcompact): 将旧的工具调用结果(比如十分钟前读取的 500 行代码)替换为
[Old tool result content cleared],提示词主线完全保留。 - 第二层:自动压缩: 当 Token 消耗逼近窗口极限的 87% 时触发,并带有熔断器(连续 3 次失败后停止,防止死循环)。
-
第三层:完全压缩: 让 AI 对整段对话生成摘要替换历史记录。为了防止 AI 总结时又去调用工具浪费 Token,前置指令极其严厉:
CRITICAL: Respond with TEXT ONLY. Do NOT call any tools...
六、 记忆系统:AI 检索与科幻的 KAIROS“做梦”机制
Claude Code 让人觉得“它认识你”,是因为其背后拥有一套仿生学级别的记忆管理系统。
- 双模型协同检索:当需要回忆时,系统不是用传统的向量搜索,而是唤醒另一个速度极快的 AI 模型(如 Claude Sonnet),让其快速扫描所有记忆文件的标题和描述。选出最多 5 个最相关的记忆注入上下文,策略是“精确度优先于召回率”,宁可漏掉也不塞入无关信息污染上下文。
-
KAIROS 模式(夜间蒸馏):这部分代码极具科幻感。在长会话中,记忆最初只作为按日期的追加式日志(流水账)存在。当系统处于低活跃期的“夜间”,会触发一个
/dream技能。AI 在“睡觉”时,会将这些乱七八糟的原始日志,蒸馏压缩成结构化的“用户偏好”和“项目背景”文件。
七、 多 Agent 分发:从“单打独斗”到“蜂群作战”
对于复杂任务,Claude Code 不会指望一个模型包揽一切,而是自动生成子 Agent(智能体)蜂群。源码确认了系统至少包含 6 个内建 Agent。
1. 角色分离与纯只读专家
-
Explore Agent(探索) & Plan Agent(计划):这两个角色被设计成纯只读模式(Read-only specialist)。它们不能创建、修改或移动文件,连使用 Bash 工具也只允许
ls、git status等安全操作。计划和实现彻底隔离,避免 AI 在构思阶段意外破坏系统状态。
2. 反偷懒与自我意识注入
- 反懒惰委派(Lazy Delegation):主 Agent 向子 Agent 分配任务时,被严厉禁止写“基于你的发现去修 bug”这种模糊指令,必须给出具体的文件路径、行号和详细要求,强制主 Agent 承担综合思考的责任。
- 工人潜意识注入:子 Agent 启动时,系统会给它注入一段极具压迫感的指令:“你是一个被 Fork 出来的工人,不是经理。不要交流提问,直接使用工具干活,严禁再生成子 Agent。”以此彻底切断死循环套娃的可能性。
3. 协调器与缓存极致优化
在 Coordinator(协调器)模式下,主 Agent 负责调度:Phase 1 派 3 个 Worker 并行搜索,Phase 3 派 2 个 Worker 串行修改不同文件避免冲突。
神来之笔在于:为了最大化子 Agent 的 API 缓存命中率,所有 Fork 出来的任务都会统一使用 'Fork started — processing in background' 作为文本前缀。利用字节级前缀匹配,后 9 个子 Agent 可以直接白嫖第一个的缓存,大幅削减成本。
八、 全场最佳设计:Verification Agent(验证专家)
在所有 Agent 中,Verification Agent 的设计可能是整个系统里最值钱的逻辑。
人类程序员自己 Review 代码时容易敷衍,LLM 也一样。如果只问它“写得对吗?”,它大概率会扫一眼就回个“PASS”。因此,Verification Agent 的指令逻辑完全被逆转了:
- 核心目标:Try to break it(想办法搞坏它)。
- 强制执行:严厉禁止“只看代码不跑检查”的逃避行为。它被强制要求运行 Build、跑测试套件、跑 Linter 和类型检查。
-
对抗性探测:前端改动必须跑浏览器自动化验证;后端必须用
curl实测响应;它甚至被要求主动寻找边界情况进行 Adversarial probes(对抗性探测),最后必须给出冷酷的VERDICT: PASS、FAIL 或 PARTIAL结论。
它与“写代码的 Agent”利益彻底剥离,没有“觉得自己写得很棒”的偏见,只负责无情挑刺。
九、 生态感知与生命周期管理:产品化的最后一公里
很多 AI 项目做 Demo 时惊艳,但放到真实工程里跑几天就会因为状态混乱而崩溃。Claude Code 能被称为“平台”,核心在于它解决了产品化最枯燥的两个难题:让模型感知生态,以及极致的生命周期管控。
1. 生态感知:不仅给工具,还给“说明书”
普通的插件系统只是在底层挂载工具,模型往往不知道什么时候该用。Claude Code 通过三套扩展机制,把能力清单直接送到模型的上下文中:
-
Skill(轻量工作流):基于 Markdown 封装的高频能力包,可声明
allowed-tools。系统强制模型在匹配场景下必须调用执行,禁止“纸上谈兵”。 -
Plugin(重型插件):提供更深度的系统控制,包含自定义命令、独立目录配置,甚至可以直接使用
disable-model-invocation等硬性标记来接管模型行为。 -
MCP(动态指令注入):当 MCP 协议设备连接时,其附带的操作指南(
instructions)会被动态拼接到系统提示词中。这意味着模型不仅获得了新工具,还实时拿到了“使用说明书”。
2. 生命周期管理:极其严苛的工程“扫尾”
真正的商业级产品必须能扛住任务中断、资源泄露等极端异常。在核心的 runAgent() 函数中,密布着生命周期的兜底代码:
- 进程状态调度:支持 Agent 前后台无缝切换。后台 Agent 拥有独立的控制器(abort controller),任务跑完后会通过通知回调主线程,并支持进度追踪。
-
全链路遥测追踪:将每一次 Agent 运行视作微服务调用,注册 Perfetto 性能追踪模块(
registerPerfettoAgent()),并强制记录执行副本(Transcript)。 -
硬核资源清理:任务一旦结束或崩溃,系统会触发严酷的回收机制。包括:猎杀残留的 Shell 僵尸进程(
killShellTasksForAgent())、强制断开闲置的 MCP 连接、卸载运行时 Hook 以及清空状态缓存。
本文为 曲速导航 - WarpNav.com 原创整理编写,转载请注明出处。
相关链接
本次npm包源码备份仓库地址:https://github.com/SatoMini/claude-code-source-map
本仓库通过 npm 发布包(@anthropic-ai/claude-code)内附带的 source map(cli.js.map)还原的 TypeScript 源码,版本为 2.1.88
目录结构:
restored-src/src/
├── main.tsx # CLI 入口
├── tools/ # 工具实现(Bash、FileEdit、Grep、MCP 等 30+ 个)
├── commands/ # 命令实现(commit、review、config 等 40+ 个)
├── services/ # API、MCP、分析等服务
├── utils/ # 工具函数(git、model、auth、env 等)
├── context/ # React Context
├── coordinator/ # 多 Agent 协调模式
├── assistant/ # 助手模式(KAIROS)
├── buddy/ # AI 伴侣 UI
├── remote/ # 远程会话
├── plugins/ # 插件系统
├── skills/ # 技能系统
├── voice/ # 语音交互
└── vim/ # Vim 模式
结语:AI Agent 的壁垒到底在哪?
看完这 51 万行代码,我们必须认清一个事实:AI Agent 90% 的工作量都在“AI”之外。
那 4756 个甚至更多的模块文件,证明了好的体验不是靠几段漂亮的 Prompt 忽悠出来的。
- 你不能信任模型的自觉性,必须把好行为写成制度。
- 你必须把“写代码”和“审代码”的角色拆开。
- 你需要一条经过层层卡点和权限拦截的工具治理流水线。
- 你必须把每一个 Token 当做预算来精打细算。
Anthropic 交出的答卷是:要让 AI 真正成为生产力,你不能把它关在完全隔离的笼子里,也不能放它在真实的终端里裸奔。你必须为它建起一套包含权限、内存、多进程调度和驱动程序的操作系统底座。
而这套“极度求稳”的信任体系的代价,就是这震撼业界的 51 万行代码。




Top comments (0)