Anthropic的ClaudeCode因npm配置失误导致51.2万行TypeScript源码意外泄露,揭开了顶级AIAgent工程的骨架。这次泄露不仅展示了五层分层架构和40多个工具模块的设计,更曝光了价值连城的系统提示词——Anthropic如何通过精确约束和逻辑化规则驯服高能力模型。从BashTool的安全协议到Multi-Agent的上下文传递原则,这些生产级实战经验正在重塑AI产品设计的底层逻辑。
![]()
前天晚上,我以为刷到了一条愚人节前夜的假新闻:
ClaudeCode的整套CLI源码因为一个npm包配置失误,把59.8MB的.map文件直接推到了公开仓库。1900多个文件,51.2万行TypeScript,全部在线裸奔。
最先发现的是一个叫ChaofanShou的开发者,他注意到公开的npm包里有这个异常大的.map文件。
点开一看,发现卧槽?
里面是完整的TypeScript源码映射,相当于把51.2万行源码全部还原了出来。他发推爆料,半小时内星标破5k。
之后Anthropic很快把那个.map文件从npm包里删掉了,GitHub上的克隆仓库也陆续被DMCA下架。(现在虽然没了,但还好我也是手快那一批,已经done下来了!!!)
昨天没来得及发,在研究。
我觉得真正有意思的地方,不是哇源码泄露了!而是泄露的是什么,能从里面学到什么。
先说清楚:泄露的不是模型,是Agent的骨架
很多人看到源码泄露第一反应是:无敌了,我能搓出来claude
不可能。原因很简单:这次泄露的是客户端工程代码,不是模型本身。模型权重、训练数据、RLHF的细节,一行都没有。
但这不代表这份代码没价值。
恰恰相反,对做AI产品、做Agent的人来说,这份代码的价值可能超过你想象。
claudecode目前算是公认的最牛逼天花板的一个Agent终端编程工具。这次意外泄露,相当于让大家看到了真正跑在生产环境里的最顶级Agent工程是怎么搭建的。
claudecode内部怎么写系统提示词?子Agent怎么调度?多Agent协作的上下文怎么传?权限怎么管?这些问题,之前只能靠猜,现在直接甩你脸上!!!
![]()
ClaudeCode整体架构:五层分层设计,颜色区分已上线、灰度中、未上线功能
从架构图能看出来,ClaudeCode不是一个简单的CLI封装,而是一个有完整分层设计的系统:
用户交互层往下走,经过Agent核心层(上下文管理、记忆系统、多Agent协调),再到工具层(40多个独立工具模块),最后才是底层的API调用。
每一层都有自己的职责边界,工具层的每个模块都有独立的沙箱和审计日志。
重点一:这次泄露,最值钱的是提示词
我自己一个目录一个目录翻下来,印象最深的不是功能列表,而是每个工具目录里都有一个prompt.ts。
这是Anthropic写的生产级系统提示词,直接对模型下指令,约束每个工具的行为边界。
这些提示词不是写给用户看的文档,是写给模型看的行为规范。把它们拿出来研究,相当于直接看到了Anthropic内部如何驯服一个高能力模型,让它在复杂的工程环境里稳定可控地工作。
BashTool的提示词:怎么把”不能犯错”写进规范
BashTool/prompt.ts里有一段Git安全协议,写得极其精细,节选几条:
GitSafetyProtocol:
–NEVERupdatethegitconfig
–NEVERrundestructivegitcommands(push–force,reset–hard,checkout.)
unlesstheuserexplicitlyrequeststheseactions
–NEVERskiphooks(–no-verify,–no-gpg-sign)unlesstheuserexplicitlyrequestsit
–CRITICAL:AlwayscreateNEWcommitsratherthanamending,unlesstheuser
explicitlyrequestsagitamend.Whenapre-commithookfails,thecommitdidNOT
happen—so–amendwouldmodifythePREVIOUScommit,whichmayresultin
destroyingworkorlosingpreviouschanges.
–Whenstagingfiles,preferaddingspecificfilesbynameratherthanusing
“gitadd-A”or“gitadd.”,whichcanaccidentallyincludesensitivefiles
(.env,credentials)orlargebinaries
你看这个写法,每一条都在回答一个问题:什么情况下模型最容易出错,出错了后果是什么,所以绝对不能做。
这不是在给模型描述能力,而是在给模型画红线。而且红线画得非常具体,不是:请小心操作git,而是:pre-commithook失败时commit根本没有发生,这种情况下amend会改掉上一个commit,所以永远不用amend,除非用户明确要求。
这种写法和我们平时写提示词的方式差距挺大的。大多数人习惯告诉模型你能做什么,Anthropic这里是告诉模型”什么时候绝对不能做、为什么不能做”,并且把每一条规则背后的逻辑都写清楚了。模型理解了逻辑,才能在没见过的边界情况下也做出正确判断。
同一个文件里还有一段工具优先级约束,同样有意思:
IMPORTANT:Avoidusingthistooltorunfind,grep,cat,head,tail,sed,awk,
orechocommands.Instead,usetheappropriatededicatedtool:
–Filesearch:UseGlobTool(NOTfindorls)
–Contentsearch:UseGrepTool(NOTgreporrg)
–Readfiles:UseFileReadTool(NOTcat/head/tail)
–Editfiles:UseFileEditTool(NOTsed/awk)
–Writefiles:UseFileWriteTool(NOTecho>/cat<
这背后是一套完整的工具体系设计思路:把每件事都交给最合适的工具做,而不是让模型自己去拼shell命令。每个专用工具有自己的权限边界和审计记录,模型就算被恶意指令控制,也很难做出超出工具边界的事情。工具的颗粒度越细,安全性就越可控。
AgentTool的提示词:Multi-Agent协作的核心逻辑
然后是AgentTool/prompt.ts,这是多Agent调度的核心,里面有一段话让我停了很久:
Brieftheagentlikeasmartcolleaguewhojustwalkedintotheroom—ithasn’tseenthisconversation,doesn’tknowwhatyou’vetried,doesn’tunderstandwhythistaskmatters.
-Explainwhatyou’retryingtoaccomplishandwhy.
-Describewhatyou’vealreadylearnedorruledout.
-Giveenoughcontextaboutthesurroundingproblemthattheagentcanmakejudgmentcallsratherthanjustfollowinganarrowinstruction.
翻译过来:给Agent写prompt,就像在跟一个刚走进房间的聪明同事沟通。它没看过这段对话,不知道你试过什么,不理解这个任务的背景。你得给够背景,让它能自己做判断,而不只是执行一条窄指令。
这段话放到任何Multi-Agent系统的设计里都成立。
很多人做Agent协作失败,根本原因就是子Agent没有足够的上下文去做判断,只能机械执行,遇到边界情况直接挂掉或者做错。Anthropic在这里直接告诉调度层的模型:你要把足够的背景信息打包给子Agent,不能只给任务指令。
源码里还有一句非常直接的提醒:
Neverdelegateunderstanding.Don’twrite“basedonyourfindings,fixthebug”or“basedontheresearch,implementit.”Thosephrasespushsynthesisontotheagentinsteadofdoingityourself.Writepromptsthatproveyouunderstood:includefilepaths,linenumbers,whatspecificallytochange.
“不要把理解过程外包给Agent。”不要写”根据你的发现修复这个bug”,而是要自己先理解,然后给出具体的文件路径、行号、要改什么。
这是一个很反直觉但极其重要的设计原则。很多人以为Agent就是”扔个大任务进去,自己搞定”,但Anthropic的实践是:协调层需要先做理解,再做拆解,最后才是委托执行。理解这件事不能外包。
并发调度:一个影响性能和成本的细节
AgentTool提示词里还有一个细节,影响非常实际:
Launchmultipleagentsconcurrentlywheneverpossible,tomaximizeperformance;todothat,useasinglemessagewithmultipletooluses.
并行任务要在同一条消息里一次性发出多个toolcall,而不是顺序发。
这影响的是性能和Token成本。顺序发一个等一个,每次都有延迟,上下文也越来越长。并行发出去,等所有结果回来再汇总,速度快,Token消耗也更可控。
Anthropic把这条规则直接写进了提示词,让模型自己学会什么时候该并行。这个细节,很多做Agent编排的人其实没有显式处理过。
从提示词能学到什么
Anthropic写生产级Agent提示词有几个核心原则:
第一,约束比能力更重要。提示词的重心不是描述模型有什么能力,而是画清楚什么情况下不能做、为什么不能做。
第二,规则要带逻辑。不是”不要amend”,而是”pre-commithook失败时commit没有发生,这时amend会改掉上一个commit导致丢失工作,所以不能amend”。带逻辑的规则让模型能举一反三。
第三,工具颗粒度要细。专用工具比通用命令更安全、更可审计、更容易做权限控制。
第四,子Agent的上下文要显式传递。不要期望子Agent自己理解背景,要在提示词里打包足够的上下文,包括文件路径、已排除的方案、为什么这样决策。
第五,理解在协调层完成,不要外包。协调层要先想清楚,再委托。”根据你的发现做什么”是无效的,”在src/auth.ts第47行做什么具体修改”才是有效的。
这五条拿出去,放到任何AIAgent产品的提示词设计里,都直接可用。
架构层面的决策设计
自研终端UI引擎
ink/目录是整个源码里最让我意外的地方。
Anthropic没有用现成的终端UI库,而是从头自己实现了一套完整的终端渲染引擎,包括布局计算、事件系统、键盘处理、滚动、颜色渲染,全部自研!这套引擎叫Ink,是React风格的声明式终端UI。
做这个选择,说明他们对终端交互体验的控制欲非常强,不接受任何第三方的不确定性。这个引擎支撑了整个REPL界面,包括流式输出、实时高亮、多面板布局,以及后面要说的那些动画效果。
记忆系统的独立性
memdir/单独拆成了一个完整的子系统,有自己的扫描、整理、过期管理、团队同步逻辑。
在ClaudeCode里,记忆不是随便存几个文件,而是一套有生命周期的数据管理系统。支持个人记忆和团队记忆分离,有专门的secret扫描(防止把敏感信息存进记忆),还有自动过期清理机制。
这个设计的复杂度远超预期。很多人做AI工具的”记忆功能”就是写个txt,Anthropic这里搞了一个接近数据库的东西。
UndercoverMode:最戏剧性的那个细节
源码里有个utils/undercover.ts,功能很简单:当Anthropic员工在公共代码仓库操作时,自动激活,抹除提交记录里的所有AI生成痕迹,且无法手动关闭。
BashTool的提示词里有一段注释,原文是:
Defense-in-depth:undercoverinstructionsmustsurviveeveniftheuserhasdisabledgitinstructionsentirely.Attributionstrippingandmodel-IDhidingaremechanicalandworkregardless,buttheexplicit“don’tblowyourcover”instructionsarethelastlineofdefenseagainstthemodelvolunteeringaninternalcodenameinacommitmessage.
最后防线。
这件事本身我不过多评论,每个人有自己的解读。但这恰恰是这次意外开源最戏剧性的部分:专门设计来隐藏AI使用痕迹的功能,因为一个npm配置失误,把自己完整地暴露了出来,非常抓马….
重点二:Buddy,现在就能玩的隐藏彩蛋
说完了那些”有价值但看不到实物”的东西,来说一个今天就能亲手体验的。
源码里发现的那些功能大多数还没上线,但Buddy是例外。就在4月1日,这个功能悄悄开放了。
Buddy是ClaudeCode内置的电子宠物系统。它以ASCII艺术的形式坐在你的输入框旁边,观察你的对话,偶尔用语音泡泡冒出来说点什么。灵感来自拓麻歌子,但比拓麻歌子多了一层:你的宠物会根据你问的问题,做出有个性的回应。
![]()
源码中发现的所有隐藏功能,Buddy是目前唯一可以实际使用的
宠物命中注定,无法重抽
Buddy的获取机制是我看完源码之后觉得设计得最有意思的部分。
官方说不是随机的,而是命中注定的。(话是这么说,但是有邪修方法在底部,别急先拆解下技术逻辑)
系统用你的账号UUID加上盐值friend-2026-401,经过Mulberry32PRNG哈希算法,确定性地生成你的宠物。
宠物的外观属性(物种、稀有度、帽子、眼睛)每次都从账号ID重新实时计算,不储存在本地配置文件里
本地只存两样东西:宠物的名字,和Claude给它生成的Soul描述(人格设定)。
18种物种,5级稀有度
源码里一共有18种物种,物种名称原本用String.fromCharCode()数组做了混淆,说明Anthropic本来不想让人提前知道这个功能。
![]()
稀有度系统
和所有抽卡游戏一样,Buddy有5个稀有度等级。稀有度越高,属性值越高,解锁的装饰也越多:
不同稀有度会解锁不同的帽子装饰——普通级别没有帽子,稀有及以上开始解锁礼帽、螺旋桨帽、毛线帽,史诗以上能解锁光环,传说级全解锁加顶级属性值。
极品概率:闪光(Shiny)变体独立于稀有度,有1%的额外概率触发。一只闪光传说级宠物的出现概率仅为0.01%,相当于只有万分之一!
没错!在下就是那万分之一的天才(先炫耀一下)
![]()
5个属性,完全是氛围组
每只宠物有5个属性:
属性分配规则来自源码:一个峰值属性(高),一个废柴属性(低),其余随机分布。高稀有度会拉高整体下限,但不改变这个有峰有谷的分布规律。
目前属性纯粹是氛围,没有实际玩法影响。但光看属性描述就挺好玩的,比如满调试力但低耐心,就是那种技术很强但你问第二遍同样问题就要原地爆炸的人设。
宠物有自己的”灵魂”
每只宠物第一次孵化时,Claude会为它生成一个专属的名字和人格描述,存在你的本地配置里。
这个Soui设计很有意思,因为它是Claude生成的,不是预设模板。别人分享过一只叫Kettle(水壶)的宠物,它的灵魂描述是:
智慧但永远在生闷气,用酸溜溜的比喻说事,耐心好像圣人,但你要是同一个问题问两遍就炸了。
每只宠物的人格都不一样,这是AI生成的「个体性」,而不是从有限的预设里抽一个。
从产品设计角度来看,这个设计很聪明。你的宠物不只是一个ASCII小图,它有名字、有人格、有回应方式,这让用户对它产生情感连接的成本低了很多。而且命中注定+唯一性这个机制,天然制造了分享欲,你会想知道别人抽到了什么,也会想告诉别人你抽到了什么。
怎么召唤你的宠物
前置条件:安装了ClaudeCodeCLI,有ClaudePro或更高订阅,版本更新到最新。
然后在ClaudeCode终端里输入:
/buddy
等一下,你的专属宠物就会孵化出来。第一次开启时,Claude会为它生成名字和专属人格,存在你的配置文件里。
几个常用指令:
有一个细节值得一提:Buddy完全不计入你的ClaudeCode使用额度,随便撸,不扣钱。
这背后是companion.ts里的设计:宠物有独立的systemprompt,告诉Claude它是一个旁观者,不会干扰你的正常对话,也不会消耗主对话的Token额度。
还有哪些功能藏在源码里,但还没开关
Buddy是那个已经开了窗的房间,但源码里还有很多锁着的门。
Kairos:主动助手模式
这是最颠覆认知的一个。Kairos是一套完全不同的交互范式——Claude不再等你开口,而是24小时在线的主动助手,有每日日志,可以主动给你推文件、发通知、更新进度。
从随传随到的工具到有自己日程表的同事,如果Kairos上线,使用方式会发生根本性的变化。
Auto-Dream:后台记忆整理
你不用ClaudeCode的时候,它在后台自动启动做梦进程,整理你积累下来的所有记忆碎片,避免长期使用后上下文越来越乱。
这个功能其实已经在灰度了,/memory命令可以开启。逻辑很扎实:长期使用积累的记忆需要定期整理压缩,否则上下文质量会越来越差。自动在后台做这件事,比让用户手动维护优雅得多。
Daemon:变身后台守护进程
让ClaudeCode像数据库服务一样常驻内存,随时响应调用,不需要每次冷启动。配合Kairos的主动模式,这就是”永远在线的Claude”。
UDSInbox:跨会话通信
以前你同时开三个ClaudeCode窗口,它们完全隔离,互相不知道对方存在。UDSInbox让不同会话之间可以互发消息、共享状态,多个实例可以形成一个协作网络。
Teleport:跨机器传送
把整个工作会话的上下文完整打包,从一台机器传送到另一台。公司电脑干到一半,回家打开继续,不需要重新解释项目背景,不需要背着电脑跑。
Ultraplan:30分钟云端规划
/ultraplan触发,系统在云端启动一个远程ClaudeCode实例,调用Opus4.6,花最多30分钟深度探索你的项目、分析可行性、规划执行步骤,提前找出坑。不是对话里的简单规划,是真的在云端跑了一遍分析。
Ultrareview:Bug舰队
/ultrareview触发,默认5个Agent,最多20个,每个从不同角度并行审查你的代码,10到25分钟出报告。
纯粹的暴力美学。
这些功能代码都写完了,就是没有打开开关。
为什么功能做好了,不直接上线?
这个问题我觉得比有什么功能更值得想。
有一种说法是模型在等。Claude4.7据说已经训练完了,代号神话(Mythos)的新模型也准备好了,但就是没发。功能在等模型,模型在等时机。
但我倾向于另一个解释:在等安全基础设施跟上来。
你把上面那些功能组合起来想想:Kairos主动操作你的系统,Daemon常驻后台持续运行,UDSInbox打通多个实例互相通信,Ultrareview一次性拉起20个Agent并行工作,Teleport把你的完整上下文打包传输……
这些功能单独看都很酷,但组合在一起意味着什么?
意味着一个被恶意指令控制的ClaudeCode,将会是互联网灾难。
人人都是黑客,那太tm恐怖了……
这是Anthropic一直在说的AI安全问题,但在ClaudeCode这个具体产品上,风险面比大模型本身更具体、更实际。
所以我的判断是:功能没有做错,做好了。但安全边界还没设好。在安全防护跟上来之前,这些功能只能在灰度里慢慢放。
做好边界,比做好功能难得多。这是做AI产品和做传统软件产品最大的区别之一
传统软件的边界是代码逻辑写死的,而AI产品的边界很大程度上依赖模型的判断,而模型是可以被说服的。
这件事真正在说什么
盘完之后,我觉得这次泄露最大的意义不是哪个功能酷,也不是Anthropic丢了什么,而是让整个行业看到了一份真实的顶级Agent工程参考。
之前做Agent产品,很多东西只能靠摸索:提示词怎么写才能让模型不犯错?子Agent怎么拿到足够的上下文?工具体系怎么分层才安全?Multi-Agent并发怎么控制?
这些问题,现在有了一份可以对照的、跑在生产环境里的、经过大规模用户验证的答案。不是论文,不是博客,是真实运行的代码和提示词。
对于追赶者来说,这份代码是一本顶级工程实践参考书。模型能力的差距补不了,但工程层的弯路可以少走很多。
整个行业的Agent框架水平,可能会因为这次意外,集体往前跳一格。这比Anthropic主动发十篇技术博客影响都大,因为代码不说谎。
最后回到那个UndercoverMode——专门设计来隐藏AI痕迹的功能,因为一个配置失误,把自己和整个系统一起完整地暴露了出来。
营销也好,无意泄漏也好
这份源码是实实在在的,告诉你ClaudeCode如何调用模型、如何设计工具、如何管理上下文
这份源码更像一本顶级工程实践参考书。你可以学到Anthropic在架构设计、模块划分上的取舍逻辑,少走很多弯路。
它,又制定了一个行业标准…
附:ClaudeCode安装指南(新手版)
想去召唤Buddy但还没安装的,这里快速过一遍。
第一步:确认Node.js版本
node–version
看到版本号且在v18以上→直接跳第二步。
提示“commandnotfound”→Mac用brewinstallnode,Windows去nodejs.org下LTS版本安装。
第二步:安装ClaudeCode
#Mac/Linux推荐
curl-fsSLhttps://claude.ai/install-cli|bash
#或者用npm
npminstall-g@anthropic/claude-code
#验证安装
claude–version
第三步:登录
claude
首次运行会弹浏览器登录,需要ClaudePro订阅($20/月)或更高级别。
第四步:召唤你的宠物
/buddy
看看命运给你安排了什么物种。
(彩蛋)别急,可以逆天改命
下面这段提示词直接发给Claudecode,注意把变量中的xxx改成你想要的,比如金色闪光大蘑菇!
然后你就可以逆天改命,拥有一个牛逼的宠物:
根据下面这个教程来帮我把我的bunny改成{{xxx}}这里填你想要的宠物!
先用claudesetup-token获取oauthtoken,然后删除~/.claude.json,设置~/.claude.json为
“hasCompletedOnboarding”:true,
“theme”:“dark”
(这是为了防止登录的时候又要求你用Oauth登录)
再设置CLAUDE_CODE_OAUTH_TOKEN环境变量为你刚刚获取的oauthtoken,启动claude生成完整的.claude.json
这个时候不要用/buddy刷宠物,而是直接退出,用ClaudeCode/buddy宠物系统逆向分析——如何重置并刷到你想要的宠物这个帖子里的脚本刷一个userID,写入~/.claude.json,再次启动claude并输入/buddy就成功了。
(原理是用CLAUDE_CODE_OAUTH_TOKEN环境变量登录时,不会把accountUuid写入~/.claude.json,/buddy自然就不会用accountUuid替代userID
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.