乐于分享
好东西不私藏

全网都在说 Claude Code 源码泄漏,但他们搞错了一件事

全网都在说 Claude Code 源码泄漏,但他们搞错了一件事

昨天刷到这条新闻的时候,我的第一反应不是”卧槽 Anthropic 完蛋了”,而是打开了 npm registry 看了一眼包结构。

然后我就笑了。

所谓的”51万行源码泄漏”,就是发布到 npm 的包里多带了一个 .map 文件。Source map。就是那个帮你在浏览器 DevTools 里看到原始代码的东西——前端同学每天都在用,没有任何神秘感。

CNBC 的标题是”Anthropic leaks internal source code”,Fortune 说这是”second security lapse”,Ars Technica 用了”exposed”。你看这些词,泄漏、暴露、安全事故。搞得像是有人黑进了 Anthropic 的服务器偷走了模型权重似的。

但真相是:这是 client side 代码。

搞清楚一件事:什么叫 client side

Claude Code 是一个 CLI 工具,用 TypeScript 写的,通过 npm 分发。你每次 npm install @anthropic-ai/claude-code 的时候,下载到本地的那个 cli.js(编译打包后的 JavaScript)本来就是明文的。

不信你自己试:找到安装目录,用任何文本编辑器打开那个 JS 文件,虽然被 Bun 的 bundler 压缩混淆过,变量名变成了 abc,但代码逻辑是完全可读的。有耐心的人花几天时间也能还原出大部分结构。

Source map 的作用:把压缩后的代码还原为可读的原始代码

Source map 做的事情,只是把这个”还原”过程从”几天”缩短到了”几秒钟”。它让你看到的不是 a.b(c) 而是 queryEngine.executeQuery(userMessage)。方便了,但本质没变——代码一直就在那里。

这跟”源码泄漏”是两码事。真正的源码泄漏是什么?是后端服务代码被窃取,是模型权重被拖走,是训练数据被拿到。那些东西从来不会出现在 npm 包里。

所以当 CNBC 的记者写下”leak”这个词的时候,我挺想问一句:你知道 npm 是什么吗?

那代码里有什么值得看的?

既然代码本来就是公开的(只是可读性好了很多),那不如聊聊真正有意思的部分。

我花了大半天读这些代码,挑几个让我觉得”这帮人确实在认真做工程”的设计。

第一个:Prompt 缓存的分段策略。

在 constants/prompts.ts 里有一个常量叫 SYSTEM_PROMPT_DYNAMIC_BOUNDARY,值就是一个字符串标记。它把系统提示词切成两半。标记之前的是静态内容(模型身份、安全规则、工具描述),可以跨用户缓存;标记之后的是动态内容(当前目录、Git 状态、MCP 指令),每次都要重新算。

为什么这么做?因为 Anthropic 的 API 支持 Prompt Cache,缓存命中能省大量的 Token 费用。但前提是你的 Prompt 前缀不能频繁变化——一旦前缀变了一个字符,缓存就失效。

所以他们把所有”会变的东西”推到了标记之后,让”不变的东西”尽可能长、尽可能稳定。这不是什么高深的算法,但它说明一件事:在 AI 工具开发中,Token 经济学是真正的一级公民。

💡 有意思的细节:代码里有一个函数叫 DANGEROUS_uncachedSystemPromptSection()。用 DANGEROUS_ 前缀警告你”这个 section 会打破缓存”。有人大概因为不小心加了一个不该加的 section 导致缓存命中率暴跌,然后痛定思痛搞了这个命名规范。

甚至还有一个 25KB 的缓存断裂检测器,追踪 15 个维度的变化。系统提示词哈希、工具 Schema 哈希、模型名称、Beta Headers、Fast Mode 状态……全在监控范围内。每次缓存未命中,它会生成 diff 报告。

25KB 只为了做缓存诊断。疯了。

我之前自己做工具的时候也踩过类似的坑。Prompt 看似是一段文字,但在生产环境里它是一个需要版本管理、缓存优化、审批流程的工程资产。


第二个:Dream 系统——AI 在你不用的时候”做梦”。

这个名字不是我起的。

services/autoDream/ 目录下有一套完整的”记忆巩固”系统。不是比喻,代码注释里真的写着”You are performing a dream”。

它的触发有三个门槛:距离上次”做梦”超过 24 小时、期间至少有 5 个新会话、没有其他进程正在”做梦”。三个条件全满足才会启动。

Dream 系统:AI 在你不用的时候,默默整理和巩固记忆

启动后,它 fork 出一个子 Agent,按四个阶段执行:Orient(看看记忆目录里有什么)→ Gather(从对话记录中找值得记住的东西)→ Consolidate(更新记忆文件,把”昨天”这种相对日期转成绝对日期)→ Prune(保持入口文件在 200 行以下)。

更有意思的是锁的实现。锁文件的 mtime 就是”上次做梦的时间”——一个 stat 调用就能判断时间门槛有没有过。PID 写在文件内容里,用来判断持有者是否还活着。如果持有者进程已死(崩溃了),下一个进程检测到 dead PID 就自动回收锁。还有一小时的过期保护,防 PID 重用。

讲真,这个锁的设计比很多分布式系统的锁都要考虑得周到。而它只是一个 CLI 工具的后台记忆整理功能。


第三个:Undercover Mode——”不要暴露你是 AI”。

这个可能是这次代码里被讨论最多的部分了。

utils/undercover.ts,90 行代码。当 Anthropic 员工用 Claude Code 给公共/开源仓库提交代码时,会自动激活这个模式。激活后,系统提示词里会注入一段话:

“你正在 UNDERCOVER 模式下操作……你的 commit 消息、PR 标题、PR 描述中不能包含任何 Anthropic 内部信息。不要暴露你的身份。”

Undercover Mode:Anthropic 员工用 AI 给开源项目提 PR 时的”隐身”机制

具体禁止的包括:内部模型代号(Capybara、Tengu 这些动物名)、未发布的模型版本号、Claude Code 这个名字本身、以及任何 Co-Authored-By 署名。

最有意思的是:这个模式没有强制关闭的选项。 代码注释写得很直白:”if we’re not confident we’re in an internal repo, we stay undercover.”——如果不确定是不是内部仓库,就保持潜伏。

这确认了一件事:Anthropic 的工程师确实在用 Claude Code 给开源项目贡献代码,而且是有组织地隐藏 AI 的参与。你怎么看这件事是一回事,但代码里白纸黑字写着,不用猜。

我倒不觉得这有什么”道德危机”。工具就是工具,关键是提交的代码质量够不够硬。但如果哪天我发现一个 PR 写得特别漂亮、特别”完美”,我可能会多看两眼 commit 历史。

“泄漏”对 Anthropic 是好事还是坏事?

我个人觉得是好事。

理由很简单:整个开发者社区花了 48 小时在免费帮 Anthropic 做技术 PR。GitHub 上的镜像仓库几个小时就拿了上千 Star,各种技术分析文章、架构拆解、设计讨论铺天盖地。这种曝光量花钱都买不来。我自己就是看了别人的分析才去翻的代码,然后越翻越停不下来。

你看那些分析文章的结论——”engineering is genuinely impressive”、”this is not a weekend project wrapped in a CLI”、”deeply considered systems”——全是正面评价。开发者们看完代码的反应不是”这也能泄漏?”而是”这工程水平确实牛”。

而且对竞争对手来说,看到 Claude Code 的 client side 代码并没有太大帮助。真正的壁垒在 API 侧——模型能力、推理速度、Prompt Cache 的服务端实现——这些东西从来就不在 npm 包里。你把 CLI 代码原封不动抄走,接上一个烂模型,产品体验还是烂的。

💡 与其说是”安全事故”,不如说是一次效果拔群的意外营销

最后说一句

类似的 client side 项目代码其实有很多——VS Code 是开源的,Cursor 的前端也能看,各种 CLI 工具的 npm 包打开就能读。Claude Code 只是因为忘删了 source map 才变得”容易读”了一些。

与其跟着媒体的标题焦虑”泄漏!安全事故!IPO 危机!”,不如真的去读一下代码。里面有很多做 AI 工具值得借鉴的工程决策——不是什么黑科技,都是实实在在的”笨办法”,但笨办法做到位了就是壁垒。

.npmignore 是挺难配的。但这不是什么安全危机,放轻松。

觉得有收获?转发给也在做 AI 工具的朋友

👆 点个关注,下次科技圈有瓜第一时间聊

— END —