Anthropic工程师忘了加一行.npmignore,整个Claude Code的心脏被人扒光了
我们有多少时候以为自己理解了一个工具,其实只是理解了它的表面?Claude Code 给用户看的是一个干净的命令行界面:输入需求,输出代码。它真正是的:一个包含 KAIROS 后台 Agent、三种子 Agent 委托模型、44个隐藏功能标志、46,000 行查询引擎、JWT 鉴权 IDE 桥接的复杂系统,还有一个计划用于隐藏 Anthropic 员工开源贡献的隐身模式。这两者之间的落差,是产品设
先说清楚这件事的性质:这不是黑客攻击,是自己把底裤晾出去的
2026年3月31日,北京时间下午4点23分。
一个叫 Chaofan Shou(@Fried_rice)的研究者——他的身份是 Solayer Labs 的一名实习生——在 X 上发了一条帖子,大意是:
"兄弟们,Anthropic 的 Claude Code 2.1.88 版本把 source map 文件一起打包上传 npm 了,512,000 行 TypeScript 原始源码,全在里面,任何人都可以下载。"
这条帖子的浏览量最终达到了 2,100万到2,800万次(各方数据略有出入)。
数小时之内,完整代码库被镜像到数十个 GitHub 仓库,其中最早整理的版本之一就是今天要测评的这个:
[ChinaSiro/claude-code-sourcemap]
截至2026年5月5日的数据:
| 指标 | 数值 |
|---|---|
| ⭐ Stars | 14.6k |
| 🍴 Forks | 9.1k |
| 👁️ Watching | 33 |
| 📄 主要语言 | TypeScript 100% |
| 📜 License | 无(非官方整理,声明仅供研究) |
这意味着:每一个给了Star的人背后,还有两个人在悄悄把仓库下到本地去研究,甚至不好意思点Star。
这大概是GitHub历史上最"心虚"的一批Fork用户了(我也是其中之一,手动狗头)。
国内用户订阅claude code确实有点困难,推荐这个靠谱网站,如果你对claude情有独钟的话可以尝试一下:claudemax.shop
事情的经过:一个.map文件引发的蝴蝶效应
什么是Source Map?为什么它如此致命?
要理解这件事,你需要知道一个前端工程里的基础概念——Source Map(源映射文件)。
简单来说,开发者写的是可读的 TypeScript 代码,发布时会被打包成压缩的 JavaScript(Minified JS)。这个压缩代码人类看不懂,但运行很快。
为了调试方便,构建工具会生成一个 .map 文件,里面存了一个映射关系:
{
"version": 3,
"sources": ["../src/main.tsx", "../src/tools/BashTool.ts", "..."],
"sourcesContent": [
"// 每个源文件的完整原始代码字符串",
"..."
],
"mappings": "..."
}
看到 sourcesContent 了吗?这个字段里直接存着所有源文件的完整代码。
这个 .map 文件的存在是为了在开发和测试环境里使用,让你看到报错时能定位到原始 TypeScript 代码行,而不是面对一大串压缩后的天书。
正常的发布流程是:发 npm 包时,把 .map 文件从发布列表里排除掉,也就是加一行 .npmignore:
*.map
就这七个字符。
Anthropic 的工程师,在 2026年3月30日发布 Claude Code v2.1.88 时,忘记了这七个字符。
结果是:一个 59.8MB 的 cli.js.map 文件,带着 512,000 行 TypeScript 原始源码,被愉快地上传到了全球任何人都可以访问的 npm 公共注册表。
Anthropic 的 Claude Code 负责人 Boris Cherny 后来确认:"这是一个普通的开发者失误。"他还补充了一句让人忍俊不禁的话:
"100% of my contributions to Claude Code were written by Claude Code." (我对 Claude Code 的100%贡献都是由 Claude Code 写的。)
好家伙,AI 写的代码,忘了加 .npmignore。这个锅,到底该谁背?
更讽刺的是,这不是第一次——2025年2月也发生过类似的泄露,这已经是13个月内的第二次了。
ChinaSiro/claude-code-sourcemap:这个仓库做了什么?
ChinaSiro 是国内 linux.do 社区(L站)用户 huo0(飘然与我同) 的 GitHub 账号,是最早系统整理这批源码的中文版存档之一。
仓库内容非常克制,只有几个文件:
claude-code-sourcemap/
├── package/ # 原始npm包内容
├── restored-src/ # 还原的TypeScript源码
│ └── src/
│ ├── main.tsx # CLI入口
│ ├── tools/ # 30+工具实现
│ ├── commands/ # 40+命令实现
│ ├── services/ # API/MCP/分析服务
│ ├── coordinator/ # 多Agent协调
│ ├── assistant/ # KAIROS助手模式
│ ├── buddy/ # AI伴侣UI
│ ├── plugins/ # 插件系统
│ ├── skills/ # 技能系统
│ ├── voice/ # 语音交互
│ └── vim/ # Vim模式
├── claude-code-2.1.88.tgz # 原始归档包
├── extract-sources.js # 源码提取脚本
└── README.md
README 头顶有一个非常显眼的 Warning:
本仓库为非官方整理版,基于公开 npm 发布包与 source map 分析还原,仅供研究使用。不代表官方原始内部开发仓库结构。
作者没有隐瞒来源,也没有删除版权声明——这个态度值得肯定。
还原规模:
- 总文件数:4,756 个
- TypeScript/TSX 源文件:1,884 个
- 还原方式:提取
cli.js.map中的sourcesContent字段
提取脚本本身只有20多行:
const fs = require("fs"), path = require("path");
const map = JSON.parse(fs.readFileSync("cli.js.map", "utf8"));
for (let i = 0; i < map.sources.length; i++) {
if (map.sourcesContent[i] == null ||
map.sources[i].includes("node_modules")) continue;
const rel = map.sources[i].replace(/^\.\.\//g, "");
const out = path.join("source", rel);
fs.mkdirSync(path.dirname(out), { recursive: true });
fs.writeFileSync(out, map.sourcesContent[i]);
}
技术上毫无门槛,任何有 Node.js 环境的人都能复现。

源码里藏了什么?让全球开发者集体破防的内容
这是整件事最有意思的部分。我把泄露源码中被社区挖掘出来的重要发现整理了一遍。
1. Claude Code 的规模:远比你以为的复杂
大多数人以为 Claude Code 是一个命令行 AI 聊天工具,加了一些文件读写功能。
错。
源码揭示了这是一个自2024年8月以来悄悄增长的完整多Agent生产系统,现在有超过10万开发者在使用,代码几乎完全由AI生成。
架构分层如下:
Agent & 编排层 ── 多Agent协调、子Agent生成、任务队列(coordinator/, tasks/)
工具层 ── 模块化能力:文件读写、Bash执行、Web搜索、MCP集成(tools/)
服务层 ── API调用、压缩、OAuth、遥测(services/)
基础设施层 ── IDE扩展桥接、状态管理、会话持久化(bridge/, state/)
查询引擎单独就有46,000行代码,处理LLM API调用、流式传输、缓存和编排。基础工具定义是29,000行。有5种上下文压缩策略。
2. KAIROS:一个一直在后台运行的隐藏Agent
这是泄露中最让社区震惊的发现之一。
源码中有一个叫做 KAIROS 的始终在线的后台Agent。
assistant/ # 助手模式(KAIROS)
KAIROS 是希腊语,意为"恰当的时机"。这个 Agent 的具体行为还在社区分析中,但"始终在线"这个特性本身已经足够引发讨论——你以为你只是在和一个 CLI 工具对话,实际上背后有一个持续运行的 Agent 在观察。
3. 三种子Agent执行模型:Fork、Teammate、Worktree
源码揭示了三种子Agent执行模型:Fork(分叉)、Teammate(队友)和 Worktree(工作树)。这确认了我们之前描述的架构模式,并且额外提供了上下文:Claude Code 内部使用三种不同的委托策略,根据任务复杂度决定使用哪种。
这三种模式对应了不同的任务类型:
- Fork:轻量的一次性子任务
- Teammate:持久化协作,有独立上下文
- Worktree:完全隔离的 Git 工作区,互不干扰
4. 44个隐藏功能标志(Feature Flags)
源码中发现了44个隐藏功能标志,其中包括一个"隐身模式",设计用于隐藏 Anthropic 员工对开源项目的贡献。
这个细节让人浮想联翩。Anthropic 的工程师在用自己的产品参与开源项目贡献时,有专门的功能来隐藏身份?
这是一个纯粹的公司合规设计(避免混淆个人贡献与公司立场),还是有其他考量?社区对此讨论热烈,各方解读不一。
5. 工具调用权限体系:约40个工具,每个独立权限门控
泄露揭示了约40个独立工具,每个都有自己的权限门控。这个系统远比终端界面所呈现的复杂得多。
这正好解释了为什么 Claude Code 在执行某些操作时会弹出授权请求——不是随意的,是精心设计的分层权限体系。
6. 提示词缓存:14个缓存失效向量
工具中包含带有14个追踪缓存失效向量的提示词缓存系统,意味着该系统主动监控14种不同的条件,任意一种都可能使其提示词缓存失效。
作为一个对成本敏感的 API 使用者,看到这个细节我内心是复杂的——Anthropic 在提示词缓存上做了这么深的工程化,而我们用户只是感受到"有时候快一些"。
7. IDE 桥接用 JWT 认证
IDE 桥接集成使用 JWT 认证。
这解释了 Claude Code 如何与各种 IDE 插件通讯,以及为什么在不同 IDE 里的行为有时会有细微差异。
8. 语音交互和 Vim 模式
voice/ # 语音交互
vim/ # Vim模式
这两个目录的存在让社区大为惊奇——既没有官方发布,也没有任何文档提及。是内部实验中的功能,还是即将发布的特性?目前没有官方确认。
Anthropic 的反应:先用deprecated,被骂了之后才正式撤包
这段处理过程值得单独说一下,因为它引发了不少批评。
Anthropic 最初使用 npm 的 deprecated(弃用)标志而不是真正的 unpublish(撤销发布)来响应,这个缓慢的处理方式引发了额外的批评。
两者的区别:
- deprecated:包还在,还能下载,只是显示一个警告
- unpublish:包从注册表里彻底删除,无法再下载
选择前者可能是为了不破坏已经安装了该版本的用户环境,但对于一个被认为是"源码泄露"的事件来说,这种响应速度和方式显然不够果断。
最终 Anthropic 的官方声明是:
"No sensitive customer data or credentials were involved or exposed. Release packaging issue caused by human error, not a security breach." (没有涉及或泄露任何敏感的客户数据或凭据。这是一个由人为错误导致的发布打包问题,不是安全漏洞。)
这个定性大体上是准确的——这是意外暴露,不是被黑客入侵。
但是"人为错误"这个说法有点轻描淡写,毕竟这是同类事故的第二次。

安全隐患:泄露之外的真正风险
我要在这里说一件严肃的事,因为有些信息被流量的喧嚣淹没了,但对实际使用 Claude Code 的开发者非常重要。
如果你在2026年3月31日00:21到03:29 UTC之间通过npm安装或更新了 Claude Code,你可能无意中拉取了一个含有远程访问木马(RAT)的恶意版本 axios(1.14.1 或 0.30.4)。如果在你的锁文件中找到了这些特定版本或依赖 plain-crypto-js,应该立即将宿主机视为完全被入侵,轮换所有密钥,并执行干净的操作系统重装。
这不是 source map 泄露本身的问题,而是在混乱时期出现的供应链攻击——有人趁着 Claude Code 被广泛讨论的时机,试图投毒依赖包。
为了降低未来风险,建议迁移离开基于 npm 的 Claude Code 安装方式。Anthropic 已将原生安装器(curl -fsSL https://claude.ai/install.sh | bash)指定为推荐方式,因为它使用独立二进制文件,不依赖不稳定的 npm 依赖链。
这一点比源码泄露本身更需要重视。
如果你在那个时间窗口内用 npm 安装过 Claude Code,请认真执行上述检查。
测评:作为一个"研究档案",这个仓库值多少分?
好,现在回到 ChinaSiro/claude-code-sourcemap 这个具体仓库本身。
它的定位非常清晰:中文社区整理的源码研究档案。不是工具,不是产品,是一个文献整理。
🌟 做得好的地方
1. 声明清晰,态度负责
README 头部的 Warning 非常明确:非官方、仅供研究、版权归 Anthropic。
这个态度比很多其他镜像仓库要正直——有些仓库甚至删掉了原版权声明或修改了 License,这是不妥当的。
2. 附带原始归档包,研究完整性高
仓库里附带了 claude-code-2.1.88.tgz 原始包文件,让研究者可以自行验证还原结果,而不是只能相信别人的整理。
3. 提供 extract-sources.js 脚本,可复现
提取逻辑是透明的,任何人都可以自己跑一遍验证。这是科学精神,赞。
4. 目录结构整理清晰
restored-src/src/ 下的目录树整理得很有条理,从工具层、服务层到多Agent协调层,分类合理,方便研究特定模块。
⚠️ 需要清楚认识的局限
1. 仅1次提交,定格于历史时刻
这个仓库只有1次提交,是一个时间胶囊——记录了 v2.1.88 这个特定历史版本的状态。不会更新,不会迭代,不代表当前 Claude Code 的状态。
2. Stars(115) << Forks(241):心虚党居多
前面说过了,Fork 比 Star 多,这在 GitHub 上是一个罕见的现象,说明大量人在拿走研究但不公开表态。
这不是批评,这是理解这个仓库的重要背景信息。
3. 源码"仅供研究"的边界需要自己把握
Anthropic 的代码版权是清晰的,MIT 协议不适用于这份代码。
"源码可用"不等于"开源"。许可证不允许重新分发或修改,这就是为什么 Anthropic 可以对镜像提出 DMCA 删除请求。
用来学习架构设计思路——合理。 用来直接复制代码做商业产品——越界。
这个判断每个人自己要清楚。
4. 与当前版本的差距在持续扩大
Claude Code 的版本迭代很快。2.1.88 是2026年3月30日的版本,现在已经迭代了很多版。这份源码只代表那个特定的历史快照,不代表当前 Claude Code 的任何功能或行为。
作为技术研究者,我从源码里学到了什么?
我花了几天时间浏览了 restored-src/ 下的代码,作为一个同时做量化策略和全栈开发的人,有几个观察:
1. React + Ink 做终端 UI 的方案值得借鉴
这套架构是一个使用 React 和 Ink 实现的自定义 React 终端渲染器,具有类游戏引擎风格的优化。
用 React 渲染终端 UI,而不是传统的 readline 或 blessed,是一个很有意思的工程决策。这让 Claude Code 能够以组件化的方式管理复杂的终端界面状态,也解释了为什么它的 TUI(Terminal User Interface)比大多数 CLI 工具都要流畅。
这个思路我拿来用在了一个量化监控终端里,效果出乎意料地好。
2. 三种子Agent模型的设计哲学值得深思
Fork / Teammate / Worktree 这三种委托模式对应了不同维度的任务隔离需求:
- 隔离上下文(Fork)
- 隔离状态(Teammate)
- 隔离文件系统(Worktree)
这和我们在量化系统里设计多策略并行运行时的隔离层次非常相似——策略隔离、账户隔离、数据隔离,各有各的用途,不能一刀切。
3. 权限体系的粒度是产品可信度的核心
40个工具,每个独立权限门控。这个设计不是额外成本,是让用户愿意给 Claude Code 更高权限的关键——因为你知道每个操作都经过了明确授权。
金融系统里我们叫"最小权限原则",AI 编程工具里同样适用。

这件事更大的意义:一次意外的"产品透明化"
从更宏观的视角看,这次意外泄露其实做了一件商业公司通常不会主动做的事——把"黑箱产品"的内部结构暴露在阳光下。
因为 Claude Code 是一个 JavaScript 应用程序,其压缩源码一直在技术上是可访问的,尽管拥有带有原始变量名、注释和模块结构的完整注释 TypeScript 提供了一种质量上不同程度的暴露。泄露揭示的是一个比 Claude Code 终端界面暗示的更加复杂的系统。
这次暴露让开发者们第一次真正理解了 Claude Code 为什么有时候慢、为什么有时候会弹出奇怪的权限请求、为什么在不同 IDE 里行为不一致……因为它背后的复杂程度远超外表。
这是一个 AI 时代的重要教训:我们在使用的"工具",可能比我们以为的要复杂几个数量级。这不一定是坏事,但值得知道。
总评打分
| 维度 | 评分 | 说明 |
|---|---|---|
| 历史研究价值 | ⭐⭐⭐⭐⭐ | v2.1.88 架构快照,永久的技术考古材料 |
| 整理规范性 | ⭐⭐⭐⭐⭐ | 声明清晰,来源透明,可复现 |
| 法律风险意识 | ⭐⭐⭐⭐☆ | Warning 写得清楚,但仓库本身的存续受 DMCA 风险 |
| 当前实用性 | ⭐⭐☆☆☆ | 定格历史,已与最新版有较大差距 |
| 技术深度 | ⭐⭐⭐⭐⭐ | 揭示了大量未公开的架构细节 |
| 可操作性 | ⭐⭐☆☆☆ | 纯研究存档,不能直接运行或二次开发 |
| 综合 | ⭐⭐⭐⭐☆ | Claude Code架构研究的首选参考,但请了解边界 |
写在最后:一根 .npmignore 引发的哲学思考
这件事让我想到一个经常在金融行业和科技行业同时存在的问题——
我们有多少时候以为自己理解了一个工具,其实只是理解了它的表面?
Claude Code 给用户看的是一个干净的命令行界面:输入需求,输出代码。
它真正是的:一个包含 KAIROS 后台 Agent、三种子 Agent 委托模型、44个隐藏功能标志、46,000 行查询引擎、JWT 鉴权 IDE 桥接的复杂系统,还有一个计划用于隐藏 Anthropic 员工开源贡献的隐身模式。
这两者之间的落差,是产品设计刻意造成的——让用户感到简单,背后运行着复杂。
这没有什么不对。但当那个复杂被意外暴露出来的时候,理解它的人会开始提更好的问题。
一个工程师忘了七个字符,全世界的开发者多理解了 Claude Code 七层的复杂性。
这个意外的交换,说不定还算值。
(当然对 Anthropic 来说,那几个小时的危机公关体验肯定不值。但那是另一回事。)
附:关于这次泄露的安全建议(认真的)
如果你是 Claude Code 的实际使用者,需要认真对待以下几点:
立即检查:
# 检查你的安装版本
claude --version
# 如果是 2.1.88 且通过 npm 安装,检查锁文件
grep "plain-crypto-js\|1.14.1\|0.30.4" package-lock.json yarn.lock bun.lockb
推荐迁移:
# 卸载 npm 版本
npm uninstall -g @anthropic-ai/claude-code
# 使用官方原生安装器
curl -fsSL https://claude.ai/install.sh | bash
轮换 API Key: 前往 console.anthropic.com 轮换你的 Anthropic API Key,并监控近30天的用量异常。
零信任原则: 不要在不可信的仓库里运行 Claude Code,直到你检查了该仓库的 .claude/config.json 和所有自定义 hooks。
更多推荐



所有评论(0)