乐于分享
好东西不私藏

Claude Code 源码解剖——512K 行 TypeScript 藏了什么

Claude Code 源码解剖——512K 行 TypeScript 藏了什么

先说这次源码是怎么”出来”的

    Claude Code 是用 Bun 打包的,Bun 默认会生成 source map 文件。 Source map 是调试用的产物,作用是把压缩混淆后的生产代码映射回原始源码。问题在于:如果发布 npm 包时没有在 .npmignore 里排除 *.map 文件,或者打包器没有关掉 source map 生成,这个文件就会原封不动地跟着包一起发出去。
    2026 年 3 月 31 日,安全研究员 Chaofan Shou 发现了这个问题。几小时内,完整的 TypeScript 源码就被存档到了公开 GitHub 仓库,当天积累了 1100+ star 和 1900+ fork。
    更讽刺的是:Anthropic 在 Claude Code 内部专门做了一个叫”Undercover Mode”的子系统,用来防止工具在公开仓库的提交里泄露内部代号——结果整个代码库反而通过一个构建产物发出去了。而且据报道这不是第一次,2025 年初曾经修过一次类似的 source map 泄露。
好,闲话不多说,我们看里面有什么。

整体规模

泄露的源码是约 51.2 万行 TypeScript,分布在 1884 个文件里,运行时是 Bun。
从外面看是个”CLI 工具”,打开一看:
    一个 785KB 的 main.tsx 入口,一个自定义 React 终端渲染器,40+ 个 tools,一个多 agent 编排系统,一个后台内存整合引擎叫”dream”。
这根本不是普通 CLI,是一个完整的 agent 运行时。

核心循环:它是怎么”转”起来的

    入口 main.tsx 在模块加载时并行预取系统信息(MDM、Keychain),然后通过 Commander.js 路由命令。核心循环是:用户输入 → API 调用 → 流式响应 → 执行 tool calls → 循环,直到 stop_reason=”end_turn” 或预算耗尽。两个关键文件分工很清晰:QueryEngine.ts(1295 行)是外层,负责重试、预算执行、权限检查、最大轮次限制;query.ts(1729 行)是内层,负责系统 prompt 组装、消息历史管理、API 流式调用、hook 执行、tool result 收集。

Tool 系统:40+ 个权限隔离的能力插件

    Claude Code 用一套插件式的 tool 架构,每种能力——读文件、执行 bash、抓网页、LSP 集成——都是一个独立的、权限隔离的 tool。
    目录结构里能数出来的 tool 包括:BashTool(shell 执行)、FileReadTool(文件读取)、FileEditTool(精确字符串替换)、AgentTool(子 agent 生成与编排)、MCPTool(动态 MCP 工具包装)、WebFetchTool(HTTP 抓取 + HTML 转 markdown)等,共 43 个 tool,184 个文件。
权限控制分三层:
第一层是规则匹配,第二层是 ML 分类器——对模糊情况调用 Claude API 判断 bash 命令或文件编辑是否危险,功能开关叫 BASH_CLASSIFIER 和 TRANSCRIPT_CLASSIFIER,第三层是用户交互确认弹窗,并带有 plan mode 预览。

上下文窗口管理:五种压缩策略

长对话是 AI 编程助手最头疼的问题,Claude Code 的解法相当系统。
压缩系统揭示了五种独立策略:基于时间清除旧的 tool result、对话摘要、session 记忆提取、完整历史摘要、最老消息截断。源码显示这是核心工程关切,不是边缘功能。—

多 Agent 编排:子 agent 不是噱头

子 agent(child agent)拿到的是 fork 后的消息上下文,带 UUID 追踪。后台 agent 会发出进度更新,可以通过 TaskGet 查询。agent 间通信走共享 mailbox 上的 SendMessage。
还有一个协调器模式:Claude Code 可以充当 manager,把任务拆开分配给多个并行 worker agent。这在 src/coordinator/ 里有完整实现。

几个藏在源码里的细节

预算追踪比你想象的细:budget tracking 是粒度级的——追踪每个 session 的总 USD 消费、API 耗时、cache 读取/创建 token 数、tool 执行时长、改动行数。
记忆系统有”做梦”机制:有一个后台常驻模式,Claude 会在每天夜里进行”dream”内存整合——把白天积累的日志整理成结构化记忆文件。
Undercover Mode 的细节:Anthropic 内部员工在公开仓库里会自动进入 Undercover Mode,model 会被指示”不要暴露身份”,写 commit 要”像人类开发者一样”,而且没有强制关闭的开关。 这引发了社区对开源项目透明度的一些讨论。
一个彩蛋:源码里有一个完整的 Tamagotchi 风格虚拟宠物系统,叫”Buddy”——有物种稀有度的 gacha 系统、闪亮变体、程序生成的属性,以及由 Claude 在第一次孵化时写的”灵魂描述”。

这次泄露本身的教训

根本原因很简单,值得所有做 npm 包的人记住:
方法一:.npmignore 明确排除
*.map*.js.map*.ts.map
方法二:Bun / webpack 关掉 source map
bun build --no-source-maps

验证:发包前检查会包含什么

npm pack --dry-run
Source map 本质上就是源代码。生产包里绝对不应该包含它,除非是有意为之。

一个值得讨论的问题

从架构来看,Claude Code 明显不是一个”套壳 API 调用”的简单工具,而是在上面建了完整的 agent runtime——权限沙箱、上下文压缩、多 agent 协作、持久记忆,每一块都是真实的工程投入。
这让我想到一个问题:同类工具(Cursor、Copilot、OpenCode)的架构深度有多少是类似的,有多少是真正的差异?欢迎在评论里聊。
部分内容有AI加工