先说清楚这件事的性质:这不是黑客攻击,是自己把底裤晾出去的

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。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐