夜雨聆风学习资料网

ARTICLE · 1146080

一个TS函数,插件装了就是root的时代开始倒计时

一个TS函数,插件装了就是root的时代开始倒计时

Anthropic把Claude Code的内核钩子整个开放了:一个TS函数就能拦截工具调用、改写界面、否决危险操作,官方还把三个内置Mod的源码直接摊开供抄作业。更狠的是所有副作用收口到可审计的$接口——MCP两年没解决的信任问题被顺手收走。代价是钩子5000ms熔断,写崩一个函数整个会话陪葬。

一个 TypeScript 函数,就能改写 Claude Code 的工具调用、界面和安全策略。Anthropic 上线 Mods 之后,这个 CLI 一夜之间从黑盒变成了平台。

原理说白了是函数钩子:每个 Mod 在入口用 register(on) 注册事件处理函数,拿到 ($, e, next) 三个参数,多个 Mod 串成洋葱式中间件——像 Express 那样,你可以放行一次工具调用,也可以改写它,或者直接拒绝。文件、网络、进程这些副作用都收口到 $ 能力接口,管理员能审计、白名单,下层插件能干什么全看上层给不给。

CLI 原生解析 .ts 文件,进程内热加载,不用打包。门槛低了,权力也大了——写得不好,一个没兜住异常的 Mod 就能拖死整个会话。

CLI 砸开黑盒,代码即插件

一个 TypeScript 函数,就能改掉 Claude Code 的工具调用、界面、甚至安全策略。

10 月初,Anthropic 上线了 Claude Code Mods。这个东西的思路简单到粗暴:把 CLI 的内部机制整个暴露给你。Claude Code 每次要调工具、每次要渲染界面、每次要过安全检查,都会经过一个个事件钩子——现在,这些钩子随便你拦截、随便你改写。

这和以前的玩法完全两个时代。

过去你想给 Claude Code 加点自己的逻辑,路只有两条:要么 fork 整个源码,跟主仓库的更新节奏死磕;要么在外面套一层 shell 脚本,用文本解析去猜它的输出,脆弱得像在沙滩上盖楼。两条路都只有资深玩家才走得动。

现在呢?

写一个普通的 TS 函数,保存,生效。就这么短的一条链路。

门槛低到什么程度:只要你的 Claude Code 是 v2.1.287 及以上版本,开箱就能用。CLI 原生就能解析 .ts 和 .js 文件,不需要打包,不需要构建链,改完直接热加载。没有 webpack,没有编译产物,没有依赖地狱。

对你的直接意义是:一台开发机、一个编辑器,你就是 Claude Code 的插件开发者。以前只有官方能动的那些环节——工具怎么被调用、输出怎么展示、哪些操作该被拦下来——现在全在你手里。

一句话:过去改 CLI 是动手术,现在写插件就是写业务代码。

洋葱模型,像写 Express 一样写钩子

Mods 的底层机制叫 Function Hooks——名字普通,东西不普通。它把 Web 后端玩了几十年的那套中间件模型,整个搬进了 agent 引擎的事件链里。

具体长这样:每个 Mod 有一个 register(on) 入口,用它注册事件处理函数。处理函数拿到三个参数:($, e, next)。写过 Express 或 Koa 的人看到这三个参数会直接会心一笑——这就是洋葱模型的标准签名。

Claude Code Mods 的核心架构与安全护栏机制

一次工具调用进来,像一颗洋葱被层层穿透。第一个 Mod 先看,看完调用 next() 交给下一个;最后一个处理完,调用才真正执行,执行结果再一层层穿出来。每一层都有三个选择:继续、改写、或者直接拒绝。

「拒绝」这一下最关键。

前面那节说的是 CLI 开放,这一节说的是更深的一层:Mod 不只是能挂在旁边看,它手里握着否决权。一个安全 Mod 判断这次工具调用要碰生产数据库,它可以不调 next,整个调用就地终止——后面注册的所有 Mod,压根看不到这次调用发生过。

改写则更狠。一个日志 Mod 可以在请求穿过去之前换掉参数,一个鉴权 Mod 可以在请求到达工具之前先拦一道。请求改写、权限校验、审计日志、输入消毒——Web 后端中间件能干的每一件事,这里都能原样照搬。

这就是为什么说它不像又一个配置文件。配置文件是声明式的,你能勾选的只有作者预埋好的开关。Function Hooks 是命令式的,你在事件链里写真正的 TypeScript 代码,逻辑随便你定义。两者的差距,相当于「选套餐」和「自己开火做饭」。

对读者来说,这件事的实际意义是:过去想在 agent 的工具调用环节加一层自己的逻辑,得等官方出功能。现在不用等了——你在 next 前后写的每一行代码,都会跑在每一次工具调用的必经之路上。

Express 用中间件统治了 Web 开发十年。现在同一条配方被端到了 agent 面前——而这一层一旦长出来,就再没有人愿意回到只能勾选开关的时代。

三个官方 Mod,直接抄作业

Mods 这套机制公开没多久,Anthropic 干了一件更少见的事:把三个官方内置 Mod 的源码直接摊开了。

不是文档示例,是随产品一起发布的、真材实料的实现代码。

第一个叫 diff。它做的事说出来很简单:把工作区里没提交的改动,渲染成一个可视化面板。但这一小块代码示范的是整套机制里最直观的能力面——UI 是可以被插件改的。命令行工具历来是黑底白字说了算,现在一个 TypeScript 函数就能往里面塞面板。做惯了 IDE 插件的人,看到这里应该已经反应过来了:这意味着 Claude Code 的界面层被打开成了可编程的。

第二个才是真正让企业安全团队坐直的那个:sec-default。它的职责是守住企业管理策略链的最外层——所有策略检查都过了、即将放行的最后一道闸,由它兜底。换句话说,Anthropic 把「企业级安全防线怎么在 Mods 里落地」这个问题的答案,直接写成了源码发给你。企业接入最怕的就是这种东西:机制懂了,但第一行代码不知道从哪下手。现在答案摆在那,抄就行了。

第三个是 telemetry,暴露一个 $.telemetry 统计接口。这是三份里对企业落地最实际的一份——每一次工具调用、每一条命令执行,都可以埋点上报。领导问「接入之后到底谁在用、用来干什么」,数据从这来。

把三个摆在一起看,覆盖面齐得不像巧合:界面、安全、可观测性,正好是企业接入一个新工具前必问的三件事。Anthropic 等于把「企业落地清单」翻译成了三份可以跑起来的代码。

对普通开发者,这是最好的教程——比任何文档都实在,看真实现学 hooks,比看 API 表快十倍。对团队负责人,这是从零造轮子和一天跑通 demo 的区别。

一句话:别再问 Mods 能干什么了,官方已经把作业拍在桌上了。

权限模型,才是真正的杀手锏

前面说了 Mods 怎么写、怎么抄作业,但真正让这件事变味的,是藏在 $ 后面的那套东西——权限模型。

传统插件是什么生态?装了就是 root。一个 VS Code 扩展、一个 MCP Server,一旦接入,读文件、发网络请求、起子进程,基本畅通无阻。用户点下「安装」那一刻,等于把自己机器的钥匙整串递了出去。MCP 火了这一年多,最大的骂声从来不是「功能不够」,是「我根本不知道它背着我干了什么」。

Mods 直接掀了这张桌子。

所有副作用——文件、网络、进程、UI——全部收口到 $ 这一个能力接口上。Mod 想读文件?走 $。想发请求?走 $。没有旁路。而 $ 背后站着的是管理员:谁调了什么能力、什么时候调的,全部可审计;能力可以设白名单,下层插件想用的能力,直接可以拒掉。

这意味着什么?意味着第三方 Mod 再野,也野不出你批的那张清单。

一句话:过去企业不敢开插件权限,是因为开了就等于失守;现在每一次能力调用都在账上,管理员第一次拿到了「敢开」的理由。

开发者未必乐见——你的 Mod 从此活在别人的清单里,想干点清单外的事,门都没有。但坐在审批席上的技术负责人,可算等来了这一天。MCP 生态折腾两年没解决的信任问题,被一个接口设计顺手收走了。

大厂会不会跟进这套玩法不好说,但插件「装了就是 root」的时代,从这一天起算是开始倒计时了。

5000ms 熔断,写 Mod 别浪

前面几节把 Mods 夸成了一朵花,这里必须泼盆冷水。

你的 Mod 是跑在 Claude Code 核心进程里面的——这句话的另一面是:它崩,整个会话跟着崩。没有沙箱,没有独立进程兜底,你和引擎同生共死。传统插件挂了顶多功能失灵,这里的插件挂了,是直接把引擎拖进坟墓。

实战里已经有人踩坑了。拦截钩子有 5000ms 的超时熔断——听上去像保护,其实是判决书。你的钩子里要是干了个重活,比如同步去调一个慢吞吞的外部 API、去解析一个巨型文件,5 秒一到,熔断触发,整个 CLI 会话死锁终止。

不是报个错那么简单,是终止。你写到一半的上下文、跑了一半的任务,全没了。

所以防御性编程在这儿不是加分项,是生死线。三条铁律:

第一,钩子里所有代码包上 try/catch,异常必须自己吞掉、自己记日志,一个未捕获的异常就是一颗子弹。第二,能快速返回就快速返回——拦截钩子的职责是「看一眼、放行或拦截」,它该像机场安检,安检员不会当场帮你把行李 unpack 了。第三,重活全部丢后台:需要联网的、需要读大文件的、需要复杂计算的,丢给异步任务或者子进程,钩子只管先返回一个「放行」,事后再补刀。

一句话判断操作该放哪儿:只拦「要不要做」,别在钩子里「真的去做」。权限校验、敏感词扫描、日志埋点,这些微秒级的活同步干;发消息、调接口、生成报告,一个都别碰。

这事得算在「进程内嵌」这个设计头上。快是真的快——没有跨进程通信的开销,钩子响应几乎零延迟,前面那些丝滑体验全靠这个。但架构从来明码标价,你借了引擎的进程,就得遵守引擎的纪律。

写惯了 Web 开发的人最容易翻车:Express 里一个中间件抛错,框架帮你兜住返回 500;这里没有那层网,你的每一个 uncaught exception 都直达内核。

所以,动手写第一个 Mod 之前,先把这 5 秒刻在脑子里。官方那三个示例之所以抄起来顺手,正是因为它们全都只干轻活——抄作业可以,别把人家没写的重载逻辑也脑补进去。

迭代还在飞,Classic Hooks 没死

10 月 7 日,v2.1.293 版本更新,官方给 mods 的 $.tool.register 又加了一个新字段——isDeferred。设成 false,工具的 schema 就从一开始直接列进 prompt,不用再等 tool search 兜一圈。

两天前的版本号还在往前蹦。这条产品线根本没有「发布完就收工」的意思,它正处在高速演进期,几乎每个版本都在往外挤新能力。

但另一边,画风完全不同。

Classic Hooks——那套通过 shell 退出码和 stdin/stdout 在事件前后执行的老机制——原地不动地躺在文档里,五种 handler 类型(command、HTTP、MCP tool、prompt、agent)一个没少,稳定得像块老石头。

一套激进,一套保守,官方明摆着在养两条线。这在新工具上是罕见的操作:大多数公司会直接砍掉旧机制逼你迁移,而这里,老钩子继续接客,新 Mods 负责抢跑。你已经上线跑着的 Classic Hooks 代码,短期内不用担心哪天醒来就报错。

所以给一条实操路线:生产环境的项目,先押 Classic Hooks 的稳定,别拿关键链路去赌一个 Early Access 的 API;内部实验、个人折腾,尽管用 Mods 抢跑,把 isDeferred 这类新字段先摸熟。

还有一句必须提醒:API 还在动,就意味着现在写的 Mod 代码随时可能要改。Early Access 的代码别当长期资产,当原型写,当试验田种,等字段稳定了再往生产搬。

上手路径其实就三步:升级到最新版本,把前面说的三个官方 Mod 拷下来改,然后写你人生第一个钩子。

门槛已经低到这个地步了——真正的分水岭只剩一个问题:你是想吃稳定,还是想吃鲜的。

第三方 Mod 想跑起来,卡点只有一个:权限模型。现在 Claude Code 给工具调用设的授权粒度太粗,企业安全团队不可能给一个来路不明的 Mod 开白名单。Anthropic 接下来大概率要做的,是给 Mod 加上细粒度的沙箱和审计接口——沙箱管它能碰哪些文件、能调哪些 API,审计让每一次操作都可回溯。这两件事落地,IT 部门才有放行的理由,Marketplace 才有真实的企业客户而不只是个人玩家。你的动作很明确:现在就把团队内部工作流封装成 Mod 的原型,等权限体系一开放,先上架的人吃掉的是整个生态的早期红利。唯一要盯的问题是:Anthropic 会不会把权限模型做成闭源的黑盒——如果沙箱规则外部无法审计,企业级放行就永远差最后一口气。

相关学习资料