前言
全球头部Ai公司 Anthropic 的Claude Code Cil源码被泄露?因一次打包失误意外泄露约51 万行 TypeScript 客户端源码,瞬间引爆开发者社区。这份被称为 “AI 编程工程教科书” 的代码库,不仅暴露了 Anthropic 的发布疏漏,更揭开了 Claude Code 登顶 AI 编程工具的核心设计逻辑。
泄露始末
同一个坑Anthropic摔了两次,本次泄露并非黑客攻击,而是典型的人为发布失误,且是重复犯错。
泄露根源
Anthropic 通过 npm 发布 Claude Code 2.1.88 版本时,打包工具 Bun 默认生成Source Map(源码映射) 文件(.map),该文件是开发调试用的 “代码翻译表”,可将压缩代码还原为原始源码,生产环境必须剔除。但工程师未在发布配置中排除该文件,导致59.8M 的 cli.js.map被直接上传至公开 npm 仓库。
扩散过程
安全研究员率先发现漏洞并在 X 平台曝光,数小时内 GitHub 出现多个镜像仓库,单个仓库单日 Star 逼近 10 万,源码彻底全网扩散。Anthropic 紧急下架问题版本、删除文件,但已无法挽回。
致命重复
2025 年 2 月,Claude Code 早期版本就因完全相同的
Source Map疏漏泄露过源码,短短一年再次犯同样错误,引发业界对其发布流程的质疑。
泄露核心范围
这次泄露的是 Claude Code 客户端 的完整源码:
TypeScript 文件数量:1906 个
总代码行数:约 51.2 万行
覆盖模块:Agent 循环引擎、40+ 内置工具、系统提示词组装、记忆系统、上下文压缩、权限控制,还有大量未上线的实验功能
服务端的模型训练代码和 API 后端逻辑不在泄露范围内。
下面我们从 6 个维度来拆解它的设计精髓。
Agent 循环
很多人以为 AI Agent 背后是多复杂的框架。打开 query.ts 一看,核心就是一个无限循环:
async function* queryLoop(params, consumedCommandUuids) {
let state = { /* ... */ }
while (true) { // [!code highlight]
// 1. 压缩上下文(避免 token 爆炸)
// 2. 调用大模型,获取流式响应
// 3. 解析模型返回的工具调用请求
// 4. 执行工具,拿到结果
// 5. 把结果追加到对话历史
// 6. 如果没有工具调用了,结束;否则继续
}
}这就是经典的 ReAct(推理+行动) 模式:模型自己形成思考 → 行动 → 观察 → 再思考的闭环。每次循环通过 queryModel 调用模型,只要返回的 tool_use 不为空就继续。
有意思的是,循环上方有一段注释,被工程师称为 巫师守则 是关于模型思考块(thinking block)的三条铁律,还警告说“不遵守的话,你将受到整整一天 debug 和拔头发的惩罚”。
工具系统
在 tools.ts 里,getAllBaseTools() 列出了所有内置工具:Bash、文件读写、网络请求、搜索、待办事项、子 Agent 生成等等。但真正精妙的不在列表本身,而在于两处设计。
当用户接了很多 MCP 插件、工具数量爆炸时,Claude Code 不会把所有工具的完整 Schema 都塞进提示词。它会先给模型一份 精简清单(只有工具名和一句话描述),让模型自己选需要哪些,再按需加载完整定义。这省下了大量 token。
每个工具通过工厂函数 buildTool 创建,其默认值设计非常讲究:
const TOOL_DEFAULTS = {
isConcurrencySafe: () => false, // 默认不允许并发 // [!code highlight]
isReadOnly: () => false, // 默认认为会修改数据 // [!code highlight]
isDestructive: () => false,
toAutoClassifierInput: () => '',
}注释里写的是 “fail‑closed where it matters”。也就是说,如果开发者忘了声明“我这个工具只读不写”,系统就自动把它当成危险操作。这种 默认禁止 的思路,比默认允许安全太多了——毕竟 AI 直接操作你的代码库,虽然有 Git 。
并发执行
AI 同时想读三个文件、再改一个文件,是排队还是并发?Claude Code 在 toolOrchestration.ts 里做了一个简洁的 读写分离 调度。
核心逻辑是:连续几个只读工具可以并发跑,但一旦遇到写操作,就必须等前面批次全部完成
function partitionToolCalls(toolUseMessages, toolUseContext) {
return toolUseMessages.reduce((acc, toolUse) => {
const isSafe = /* 判断是否只读且安全 */
if (isSafe && acc[acc.length-1]?.isConcurrencySafe) {
acc[acc.length-1].blocks.push(toolUse) // 并入当前并发批次
} else {
acc.push({ isConcurrencySafe: isSafe, blocks: [toolUse] }) // 新开一个批次
}
return acc
}, [])
}而且,如果判断 isConcurrencySafe 的过程中抛了异常,也直接当成不安全——又是 fail‑closed。所有并发批次跑完后,上下文修改不会立刻生效,而是排队按顺序应用。这不就是数据库里“读读并行、读写互斥”的简化版吗?基础知识换个场景依然管用。
记忆系统
用过 AI 编程工具的人都知道,聊久了 AI 就“断片”。Claude Code 的解决方案是一套 三层记忆架构 。
热层
相当于一本书的目录,每次对话都加载。但它的尺寸被严格限制:最多 200 行、25KB。代码里不仅有行数截断,还加了字节截断(因为有人虽然没超行数,但一行写了上千字符)。截断后会追加一条 WARNING,告诉 AI “这个索引没加载完整”。
温层
编码偏好、项目约定、踩过的坑都存在单独的话题文件里。新对话开始时,Claude Code 会用 一个小模型(Sonnet)来挑选最多 5 个相关文件加载。
在召回逻辑的提示词里有一条很妙:如果某个工具正在被使用,就不要加载它的使用文档(你已经在用了,说明你会),但一定要加载它的已知问题和坑。这正是“雪中送炭”而不是“锦上添花”。
另外,这套记忆不存代码——因为代码会变,记忆不会自动更新,存代码迟早产生误导。它只存人的偏好和判断,代码的事实永远去源码里实时读。
冷层
更早的对话存成 .jsonl 文件,需要时直接用 grep -rn 搜关键词。
总结:热的常驻、温的按需、冷的搜索。这套分层设计,面试时讲出来绝对加分。
上下文压缩
随着对话变长,token 会飞速膨胀。Claude Code 设计了 五级压缩策略,从轻到重依次触发:
在自动压缩模块里,我看到了一个 断路器 的设计。注释里写:2026 年 3 月统计发现,有 1279 个会话连续压缩失败 50 次以上,最夸张的一个会话失败了 3272 次还在重试,全球每天浪费 25 万次 API 调用。
于是他们加了硬限制:连续失败 3 次就停止重试。这种基于真实数据反馈的优化,才是工程成熟度的体现。
安全
Claude Code 有个 --dangerously-skip-permissions 模式(也叫 YOLO 模式),理论上跳过所有确认。但你以为这就完全不设防了?其实背后偷偷跑着一个 独立的 AI 分类器。
// yoloClassifier.ts
export async function classifyYoloAction(toolName, toolInput) {
// 返回 'allow' | 'soft_deny' | 'hard_deny' // [!code highlight]
}每次主 AI 要执行操作,这个影子 AI 都会过一遍,给出“允许/软拒绝(降级成手动确认)/硬拒绝”的判断。
而且权限系统不止这一关:运行模式、用户 hooks 规则、Bash 危险命令检测(有 23 种检查规则,包括 Unicode 零宽空格混淆、Zsh 的 zmodload 等高级攻击手法)、配置文件规则引擎……多层防线取最严格的结果。
怪不得我开着 YOLO 模式用了那么久,从来没出过事——原来是有 AI 在背后负重前行。
其他亮点
源码中大量出现 feature('XXX') 判断。通过这些 Flag,我们可以一窥 Claude Code 的 roadmap:
KAIROS:长期助手模式,AI 可以 24 小时持续运行,还有 “AutoDream” 自动做梦功能(夜间整理记忆)
COORDINATOR_MODE:多 Agent 协作,一个协调者指挥多个 worker 干活。工作流分四个阶段:Research → Synthesis → Implementation → Verification,子智能体通过基于文件的消息队列通信
VOICE_MODE 语音模式
WEB_BROWSER_TOOL 浏览器操作
反蒸馏
为了防止竞争对手通过 API 流量蒸馏 Claude Code 的能力,Anthropic 在请求里注入了 假工具定义:
if (feature('ANTI_DISTILLATION_CC') && ...) {
result.anti_distillation = ['fake_tools'] // [!code highlight]
}不是加密或限速,而是直接给你喂假数据——让你拿去训练的模型越训越差。堪称反间计。
卧底模式
Anthropic 内部员工往开源项目提交代码时,会启用 卧底模式 undercover.ts 。它自动剥离所有归因信息,避免泄露内部模型代号。注释里明确写:“There is NO force‑OFF”,不能强制关闭。
彩蛋
在 buddy/ 目录下,藏着一套完整的虚拟宠物系统,共 18 种物种:鸭子、鹅、水滴、猫、龙、章鱼、猫头鹰、企鹅、乌龟、蜗牛、幽灵、蝾螈、水豚、仙人掌、机器人、兔子、蘑菇、胖墩。原本计划 5 月上线,结果被提前泄露了。
结语
看完这 51 万行代码,你会发现 Claude Code 里并没有什么黑魔法,至于泄露的影响?我觉得其他 AI 编程工具的竞争对手们肯定开心坏了,大家学到了知识,博主们也有了流量,用 Claude Code 的人反而更多了。