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。
-
Windows/macOS安装Node.js教程可在公众号对话框发送数字64下载
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), { recursive: true });// 写入文件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.json、tsconfig.json等构建配置,无法安装依赖或编译。
私有依赖缺失:代码引用了大量未公开的内部私有包(如@anthropic-ai/sandbox-runtime),公开npm仓库中不存在,导致报错。
构建逻辑失效:源码中包含依赖特定编译环境的编译时逻辑(如 Feature Flags),直接运行会因找不到对应的全局变量或函数而崩溃。
路径引用断裂:还原的文件目录结构可能与原始引用路径不一致,导致模块导入失败。
夜雨聆风