51万行源码泄露之后,我决定认真读一遍 Claude Code

说实话,我第一次听到这个消息的时候,反应跟大多数人一样:哦,泄露了,然后呢?
2026年3月31号,有人在 npm 上发现 Claude Code v2.1.88 的发布包里夹带了一个59.8MB的 source map 文件。source map 本身是给浏览器调试用的,正常情况下不会包含完整源码。但 Anthropic 这次打包的时候翻了个低级错误——这个 map 文件里,直接包含了从编译产物到原始 TypeScript 源码的完整映射。
51.2万行代码,一览无余。
泄露之后发生了什么
泄露本身的过程其实挺戏剧性的。
npm 包是 Anthropic 自己发的。不是被黑客入侵,不是内部员工爆料,就是打包脚本没把 source map 剔干净。而且这已经是第二次了——一年多前就泄露过一次。
有意思的是后续。Anthropic 反应过来之后,发了 DMCA 下架通知,要求 GitHub 删除所有托管泄露源码的仓库。结果 GitHub 的自动化处理批量操作时,误删了大约 8100个无关仓库。有开发者辛苦维护的开源项目,就因为恰好用了类似的名字或者 fork 过相关内容,一夜之间没了。
这件事在 Reddit 和 HN 上吵了好几天。有人骂 Anthropic 工程能力不行,有人分析泄露代码里的安全隐患,还有安全厂商发现有人拿泄露代码当诱饵在 GitHub 上传播恶意软件。
但整个舆论场里,我看到的大多是情绪:愤怒、嘲讽、幸灾乐祸、焦虑。几乎没有人认真翻开这些代码,看看它们到底是怎么写的。
所以我做了一件笨事
我把源码 clone 下来了。
GitHub 上有人做了还原和整理,我下的是一个相对完整的版本,1987个 TypeScript 文件,可以直接用 Bun 跑起来。package.json 里写的包名还是 @anthropic-ai/claude-code,版本号改成了 999.0.0-restored。
然后我做了第二件笨事:开始一个目录一个目录地读。
很多人觉得读源码没用——”你看不懂的””看完了也用不上””不如看官方文档”。我以前也这么想。但这次不一样,因为 Claude Code 不是普通的 npm 包。它是目前市面上最成熟的 AI 编程工具,由 Anthropic 亲自打造。它的架构决策背后,藏着这个领域最前沿的设计思路。
读这些代码,等于在偷看班里最聪明的那个同学的答卷。
这坨代码里到底有什么
先给你一个全景。
Claude Code 的技术栈是 TypeScript + Bun + React Ink。你没看错,它用 React 渲染终端界面。整个应用跑在 Bun 运行时上,不依赖 Node.js 传统的 CommonJS 模块系统。
源码目录大概长这样:
src/├── entrypoints/ # 入口点├── tools/ # 30+ 工具实现├── state/ # 状态管理├── hooks/ # 钩子系统├── skills/ # 技能系统├── plugins/ # 插件系统├── services/ # 业务服务(API、MCP等)├── coordinator/ # 多Agent协调├── assistant/ # AI助手核心├── components/ # React UI组件├── screens/ # 终端界面屏幕├── ink/ # React Ink终端框架├── bootstrap/ # 应用启动引导├── context/ # 上下文管理├── bridge/ # 桥接层├── buddy/ # 彩蛋:随机宠物陪伴└── voice/ # 语音交互
如果你是一个写过几年代码的程序员,看到这个结构,第一感觉应该是:这不就是一个正经的大型前端应用的架构吗?
没错。Claude Code 的代码组织方式,跟你见过的任何成熟的 React 项目没有本质区别。分层清晰、职责明确、模块解耦。如果你做过复杂的前端项目,读起来不会有太大的认知障碍。
但真正有意思的,不是目录结构,而是里面的一些设计决策。我挑几个说。
1. 用 React 渲染终端
这是让我意外的一个点。Claude Code 的终端界面不是用传统的命令行库(比如 inquirer.js、blessed)做的,而是用 React Ink——一个把 React 组件渲染到终端的框架。
启动代码里有一段很能说明问题:
// replLauncher.tsxexport async function launchRepl(root, appProps, replProps, renderAndRun) { const { App } = await import('./components/App.js') const { REPL } = await import('./screens/REPL.js') await renderAndRun(root,<App {...appProps}> <REPL {...replProps} /> </App>)}
用 JSX 写终端 UI。这意味着什么?意味着 Anthropic 的团队可以用他们最熟悉的 React 生态来构建命令行界面——状态管理、组件复用、事件处理,全部享受 React 的红利。对开发者来说也是好消息:如果你会写 React,你看这些 UI 代码基本没有门槛。
2. 工具是第一等公民
整个应用的核心不是什么花哨的算法,而是一个工具注册和调度系统。
tools 目录里有30多个工具:Bash、PowerShell、文件读写、Grep、Glob、Agent(子Agent生成)、MCP(外部工具协议)、LSP(语言服务器)、WebFetch、WebSearch、NotebookEdit……每个工具一个目录,里面有独立的实现文件、权限检查、UI组件、Prompt 模板。
工具的注册方式很直接——tools.ts 里统一管理,支持根据环境变量和 Feature Flag 动态加载:
// 简化示意if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) { const simpleTools = [BashTool, FileReadTool, FileEditTool] return filterToolsByDenyRules(simpleTools, permissionContext)}
还可以设置”极简模式”,只保留最基础的三个工具。这个设计思路很实在:不是所有场景都需要全部能力,给用户选择权。
3. 安全系统比想象中复杂
Bash 工具单独拆出了一个 bashSecurity.ts,专门做命令安全检测。防注入、识别危险命令(rm -rf、git push –force)、沙箱执行……权限模型分了三种模式:default(每次询问)、bypass(跳过权限,仅限沙箱环境)、auto(自动批准只读操作)。
还有一段代码让我印象很深:
// setup.tsif (!isSandboxed || hasInternet) { console.error('--dangerously-skip-permissions can only be used ' + 'in Docker/sandbox containers with no internet access') process.exit(1)}
想跳过权限检查?可以,但必须在断网的沙箱容器里。这不是建议,是硬编码的强制要求。安全底线是写死在代码里的,不是靠文档劝导。
4. Feature Flag 满天飞
build.ts 里定义了上百个 Feature Flag。有些一眼就能看懂用途,比如 BASH_CLASSIFIER(Bash 命令分类器)、AUTO_THEME(自动主题),有些就比较有意思了:
-
• ANTI_DISTILLATION_CC——防蒸馏保护,防止别人用 Claude Code 的输出训练竞品模型 -
• AGENT_TRIGGERS——Agent 触发器 -
• BG_SESSIONS——后台会话 -
• KAIROS——内部代号,对应 assistant 模块
这些 Flag 告诉你一件事:Claude Code 还在不断快速迭代中。很多功能是实验性的,随时可能开启或关闭。也能看出 Anthropic 在关注什么方向——反蒸馏、后台会话、多Agent协调。
5. 有个叫 Buddy 的彩蛋
buddy 目录里实现了一个随机宠物陪伴系统。会生成一个随机的虚拟宠物形象,有名字、有属性,跨会话持久化。纯粹是工程师文化的小彩蛋。
这个细节让我觉得挺温暖的。在51万行的严肃工程代码里,有人在上面加了个电子宠物。
这个系列要做什么
接下来几篇,我会按模块一个一个拆:
-
• 启动链路:从敲下 claude到看到那个闪烁的光标,中间发生了什么 -
• 工具系统:30+ 工具怎么注册、调度、做权限控制 -
• 上下文管理:AI 怎么知道你的项目状态、文件结构、git 历史 -
• 扩展架构:技能系统、插件系统、MCP 协议 -
• 总结篇:读完之后,对程序员 AI 转型的真实启发
不会翻译代码,不会列 API。我会做的是:从一个14年程序员的角度,看 Anthropic 的工程师在这些设计选择背后到底在想什么,以及这些思路对我们意味着什么。
读源码这件事,改变不了你的简历。但它能改变你看问题的视角。
当你理解了目前最先进的 AI 编程工具是怎么构建的,你对 AI 工具的认知会从「用户视角」升级到「工程师视角」。
这个视角的转变,比学任何具体技术都重要。
下一篇:一个终端 AI 助手的骨架——从启动到 REPL 的完整链路
我是贾昆,14年全栈程序员,正在 AI 转型路上。如果你也在纠结往哪个方向走,欢迎看看这篇:一个14年程序员的清醒与行动
夜雨聆风