乐于分享
好东西不私藏

Claude Code 源码还原教程

Claude Code 源码还原教程

视频教程

一 事件背景

2026年3月31日, 华人安全研究员Chaofan Shou(寿超璠个人主页:https://scf.so) 发现Anthropic公司发布的 Claude Code v2.1.88 版本的 npm 安装包中,错误地包含了一个名为 cli.js.map 的 59.8MB 源码映射文件(Source Map),这直接导致了Claude Code的源代码——1,900多个文件、51.2万行代码,全部以未混淆的形态暴露在公网上。

  • Source Map是什么? 这个source map文件本是前端开发的调试工具,用于将压缩混淆后的代码映射回原始源码。开发者为了让代码运行更快,通常会将代码压缩混淆成一团乱麻(生产代码),而Source Map的作用就是将这些乱麻还原回清晰可读的原始代码,仅供内部调试使用,对外发布时理应删除

  • 后果是什么? 这个文件被公开后,任何人都能轻松还原出Claude Code的完整架构、工具调用逻辑、安全校验机制,甚至是尚未发布的隐藏功能。这相当于一家公司不仅把产品摆上了货架,还顺手把产品的核心设计图纸、生产流程和未来路线图都贴在了包装盒上。

Chaofan Shou 博客

Claude Code 之父 Boris Cherny 回应

Anthropic 公关灾难

面对核心资产的“大出血”,Anthropic的应急响应堪称“病急乱投医”,将事件推向了高潮。

为了遏制代码扩散,Anthropic向GitHub发起了大规模的DMCA(数字千年版权法) 下架请求。然而,他们使用了过于简单粗暴的自动化脚本,导致了一场“无差别轰炸”:

大规模误伤:数千个与泄露代码无关的、合法的开源项目仓库被错误地判定为侵权并遭到删除,其中甚至包括Anthropic自己官方示例库的派生版本。

开发者集体抗议:这一行为彻底激怒了开发者社区,被指责为滥用版权法。在巨大的舆论压力下,Anthropic不得不承认误操作,并撤回了大部分下架请求。

事件的深远影响

这次事件的影响远远超出了Anthropic一家公司:

技术平权:泄露的51万行代码,为全球的AI开发者提供了一份“工程教科书”级别的参考。它极大地降低了AI Agent的工程化门槛,让中小团队也能窥见顶级产品的技术实现路径,加速了整个行业的技术迭代与竞争。

信任危机:对于一向标榜“AI安全”的Anthropic来说,连续发生此类运营安全事故,对其“安全标杆”的形象造成了沉重打击。

国产工具的机遇:这次信任危机让许多企业客户开始重新审视对单一闭源工具的依赖,为强调安全可控、本地化部署的国产AI编程工具创造了市场窗口和弯道超车的机会。

二 还原方式

2.1 下载 npm 包

重要提醒源码版权归Anthropic所有,仅供学习研究,严禁商用,否则可能面临法律风险。

Anthropic官方已将 @anthropic-ai/claude-code@2.1.88 下架,无法直接从官方npm仓库直接下载。

腾讯云镜像

https://mirrors.cloud.tencent.com/npm/@anthropic-ai/claude-code/-/claude-code-2.1.88.tgz

下载后解压

  • Windows:使用解压工具

  • Linux:tar xzf anthropic-ai-claude-code-2.1.88.tgz

2.2 安装 Node.js

还原代码需要使用到 Node.js 相关命令,因此需要安装Node.js。

2.3 创建还原脚本

进入解压后文件夹,在package文件夹同级创建一个 restore.js 文件,内容如下:

const fs = require('fs');const path = require('path');// 读取 .map 文件const map = JSON.parse(fs.readFileSync('cli.js.map''utf8'));// 设置输出目录const outDir = './claude-code-source';// 遍历所有源文件for (let i = 0; i < map.sources.length; i++) {  const content = map.sourcesContent[i];  // 跳过没有内容的文件  if (!content) continue;  let relPath = map.sources[i];  // 清理路径中的 '../' 前缀  while (relPath.startsWith('../')) relPath = relPath.slice(3);  const outPath = path.join(outDir, relPath);  // 创建目录  fs.mkdirSync(path.dirname(outPath), { recursivetrue });  // 写入文件  fs.writeFileSync(outPath, content);}console.log('源码还原完成!');

2.4 运行还原脚本

在命令行中,进入restore.js文件所在的目录,然后执行以下命令:

node restore.js

脚本执行成功后,会在当前目录下生成一个名为claude-code-source 的文件夹,里面就是还原出的完整源码目录结构。

三 目录结构说明

📂 claude-code-source/├── 📁 node_modules                      # 第3方依赖包目录├── 📁 src│   📄 commands.ts                       # 命令定义│   📄 context.ts                        # 全局上下文│   📄 cost-tracker.ts                   # 费用追踪│   📄 dialogLaunchers.tsx               # UI 交互组件│   📄 history.ts                        # 历史记录管理│   📄 ink.ts                            # 封装了 Ink 相关的逻辑│   📄 interactiveHelpers.tsx            # UI 交互组件│   📄 main.tsx                          # 程序的入口点│   📄 projectOnboardingState.ts         # 项目引导状态│   📄 query.ts                          # 主代理循环│   📄 QueryEngine.ts                    # 查询引擎│   📄 replLauncher.tsx                  # REPL 启动器│   📄 setup.ts                          # 负责初始化配置、环境检查等启动前的准备工作│   📄 Task.ts                           # 任务管理│   📄 tasks.ts                          # 任务管理│   📄 Tool.ts                           # 工具接口│   📄 tools.ts                          # 工具注册│   ├── 📁 assistant                     # 会话历史管理│   ├── 📁 bootstrap                     # 引导程序│   ├── 📁 bridge                        # 桥接层│   ├── 📁 buddy                         # # 子代理系统│   ├── 📁 cli                           # 命令行参数│   ├── 📁 commands                      # 斜杠命令定义│   ├── 📁 components                    # React UI 组件│   ├── 📁 constants                     # 常量定义│   ├── 📁 context                       # 上下文管理│   ├── 📁 coordinator                   # 协调器,负责编排复杂的任务流。│   ├── 📁 entrypoints                   # 应用入口点│   ├── 📁 hooks                         # React Hooks│   ├── 📁 ink                           # 自定义 Ink 终端渲染引擎│   ├── 📁 keybindings                   # 快捷键处理│   ├── 📁 memdir                        # 记忆目录│   ├── 📁 migrations                    # 数据迁移│   ├── 📁 moreright                     # 权限系统│   ├── 📁 native-ts                     # 原生 TS 工具│   ├── 📁 outputStyles                  # 样式定义│   ├── 📁 plugins                       # 插件│   ├── 📁 query                         # 查询处理│   ├── 📁 remote                        # 远程功能│   ├── 📁 schemas                       # 数据模式│   ├── 📁 screens                       # 页面视图│   ├── 📁 server                        # 本地服务器│   ├── 📁 services                      # 业务逻辑层│   ├── 📁 skills                        # 技能│   ├── 📁 state                         # 状态管理│   ├── 📁 tasks                         # 任务实现│   ├── 📁 tools                         # 工具实现│   ├── 📁 types                         # TypeScript 类型定义│   ├── 📁 upstreamproxy                 # 上游代理│   ├── 📁 utils                         # 工具│   ├── 📁 vim                           # Vim 模式支持│   └── 📁 voice                         # 语音功能└── 📁 vendor                            # 原生模块存根    ├── 📁 audio-capture-src             # 音频输入    ├── 📁 image-processor-src           # 图像处理    ├── 📁 modifiers-napi-src            # 原生修饰符    └── 📁 url-handler-src               # URL处理

四 源码解析

网络上已有很多的源码分析,或者大家可以直接把源码丢给大模型进行分析

五 编译运行

有了源码之后,怎么编译并在本地运行起来?

通过cli.js.map还原出来的代码是原始TypeScript源码,但它并不是一个完整、可独立构建的项目。还需要进行修补工作。

缺失配置文件.map文件只包含代码内容,不包含package.jsontsconfig.json等构建配置,无法安装依赖或编译。

私有依赖缺失:代码引用了大量未公开的内部私有包(如@anthropic-ai/sandbox-runtime),公开npm仓库中不存在,导致报错。

构建逻辑失效:源码中包含依赖特定编译环境的编译时逻辑(如 Feature Flags),直接运行会因找不到对应的全局变量或函数而崩溃。

路径引用断裂:还原的文件目录结构可能与原始引用路径不一致,导致模块导入失败。