夜雨聆风学习资料网

ARTICLE · 1114746

DeepSeek 说一切皆插件,于是 Claude Code 用 mod 拆了自己

DeepSeek 说一切皆插件,于是 Claude Code 用 mod 拆了自己
  

Claude Code 自带的 /diff,现在已经不是写死在里面的了。

10 月 1 日(美国时间),Anthropic 给 Claude Code 上线了 mod,/diff 被改成了其中一个。你可以在 /plugin 里把它关掉,或者换成自己写的版本。AGENTS.md(另一种写给 AI 看的项目说明文件)的支持,也是用 mod 做的。

官方说,这只是开始:

We plan to move more built-in features to mods over time, so you can pare Claude Code down to a small core and add back only what you want.

意思是:他们打算陆续把更多内置功能挪成 mod,让你能把 Claude Code 削成一个小内核,只加回自己要的。

照这个方向,以后的 Claude Code 是一个内核加一堆能拆能换的零件。mod 就是这些零件,而且谁都能做。

这条路不是 Anthropic 一家在走。开源的 Pi 一开始就只留很小的内核,其余靠 TypeScript 扩展挂在事件上;DeepSeek 8 月开源的 DeepSeek Harness 直接喊出"Everything is a Plugin"。Claude Code 的不同在于,它是把已经做好的功能一件件拆出来。

  

§mod 是什么

mod 是一段 TypeScript 或 JavaScript 函数,挂在 Claude Code 的某个动作上,这个动作发生时它来插手。它装在插件里,CLI 和桌面端都能用。

Claude Code 本来就能定制,区别在于离它的运转有多近:

  • –CLAUDE.md 和 skills 是写给 Claude 看的说明,它读了,照不照做由它。
  • –hooks 在某个时刻跑一条 shell 命令,跑完就走。记日志、做检查、拦一下都行。
  • –mod 加载一次就一直留在会话里。它能记住状态,能改写正在发生的事,能画界面,还能顶替内置功能。

官方自己说,hooks 有三件事做不到:改写事件、画新界面、替换功能。这三件 mod 都能做。

打个比方:Claude Code 的每个动作像流水线上经过的包裹。hooks 站在流水线旁边,包裹经过时能记一笔,或者喊一声停;mod 站在流水线上,能把包裹拆开改了再放回去,能换一个包裹送出去,还能在旁边挂一块随包裹变化的显示屏。看包裹经过三处时的差别:

  

§它怎么工作:一切都是事件

Claude Code 每做一件事,都会发出一个事件。调用工具是一个事件,问你要权限是一个事件,往屏幕上画一块界面也是一个事件。

mod 就是挂在事件上的函数,可以在事件之前跑、之后跑、代替它跑,或者把它包起来前后都跑。官方给的骨架大致是这样:

on('tool.call', { tool: 'Bash' },  async ($, e, next) => {    return next(e)  })

这几行的意思是:Claude 每次要跑 Bash 命令,先经过这个函数。

  • –e 是这次事件的内容,比如要执行的那条命令。
  • –next(e) 把它交给下一个 mod,最后交回 Claude Code 自己去执行。
  • –$ 是官方给的工具箱。mod 想对外做任何事,读文件、跑进程、开面板、存状态,都要经过它。

写过 Node.js 的人应该眼熟,这和 Express 的中间件是一个思路:每个函数处理完,调用 next 交给下一个。官方指南也直接说,这些函数串成一条链,像中间件。

一个函数能做的,归起来是三种动作:观察、改写、应答。看这张动图:

  

观察是看一眼就原样放行;改写是改完再放行;应答是不调用 next,自己给出结果,比如回一句 deny 拒绝掉,内置动作根本不会运行。

官方列的几个例子,都是一个函数就能做到:在 prompt 到达模型之前改写它;拦截、改写或重试一次工具调用;批准或拒绝一次权限请求;在 Claude 读到工具输出之前,把里面的密钥抹掉。

最后一个我觉得最实用:.env 里的密钥,不会再跟着工具输出一起送到模型那边。

界面也一样。mod 可以改掉或替换 Claude Code 画出来的一部分,比如一条工具结果、一个 Claude 提出的问题,还能加按钮和输入框。目前可以针对终端、桌面端,或者两边一起。

多个 mod 挂在同一个事件上,按加载顺序排队:先加载的最先看到事件,也最后看到结果。不同作者的 mod 就是这样叠在一起用的。

  

§长什么样:三个官方示例

Token Weather,约 80 行。在输入框上方画一条"天气预报",告诉你上下文窗口用了多少:不到 25% 是晴,到 90% 以上显示"Compact soon",旁边是最近 12 轮的小柱状图。以前要敲 /context 或者自己配状态栏才能看到用量,现在它一直挂在输入框上方。

  

Blast Radius。Claude 要执行 rm -rf、git reset --hard、强制推送、数据库迁移这类命令时,它先把调用拦下来,算出这条命令会动哪些东西,开一个面板让你选继续还是取消。下图里拦下的是 rm -rf build,面板列出要删的 9 个文件,选了 Cancel,什么都没删:

  

Replay Theater。不碰任何一次编辑,只把一轮里的每次 Edit 和 Write 记下来,包括改前改后的文字。这一轮结束后,它开一个面板让你一步一步回放,不用对着一个巨大的 diff。下图是把函数 greet 改名成 welcome,跨 4 个文件改了 6 处,逐步翻看:

  

三个例子里,Token Weather 和 Replay Theater 都是只看不改,再把看到的东西画成界面;Blast Radius 是拦下来,等你应答。

§什么时候该用 mod

不是什么都要写成 mod。我的经验是按你想做的事来挑:

  • –想让 Claude 知道项目约定、按某种习惯做事:写 CLAUDE.md 或 skills。
  • –只想在某个时刻跑个检查、记个日志:hooks 就够了,更简单。
  • –想改掉正在发生的事、跨多个事件记住状态、要一块跟着变化的界面,或者想换掉某个内置功能:这才需要 mod。

拿三个具体的需求对一下:

  

还有两条边界,决定你敢不敢用、能用多重。

第一,mod 的权限和 Claude Code 一样大,能读文件、能跑程序,不在沙箱里。官方的建议是只装你信得过的来源,就像在电脑上装任何程序一样。

第二,挂在事件上的每个函数,每处理一次事件只有 10 秒自己的运行时间;在 $ 调用里等待的时间不算。重活交给 $ 去做,函数本身要轻。

团队用也能管:mod 跟着插件走,管理员可以允许或屏蔽插件市场。Team 和 Enterprise 套餐还有一个内置的 sec-default mod 最先加载,会拦住用户自己装的 mod 去做危险的事,比如覆盖你的权限 deny 规则。

§想象空间:给大脑配一个小脑

mod 让你能在 Claude 的每一步插手。可是插手之前,得先有判断:这一步该不该放行?这件事要花多大力气?

这些判断交给 Claude 自己做,每次都要它写一段话,又慢又贵。写成死规则,又总有漏掉的情况。

一个思路是:Claude 当大脑,负责想和做;另外配一个小脑。这个比方只取一点:小脑快,不说话,每一步都在场,在动作发出之前做一个小判断。

小脑可以用 Jev,TypeSafe 公司的一个模型,我们和 TypeSafe 没有商业关系。它不写文字,只从你事先给好的选项里挑一个,再给出一个概率。它按输入计费,输出不收钱,快到能放进每一步里。我们做了一个 mod,claude-jev-mod[1],把 Jev 接进 Claude Code,装上之后别的 mod 就能直接问它。

  

有了小脑,至少能打开三类用法。

按任务定力气。 每轮开始,小脑先读你这句 prompt,判断它是查个东西、改一行,还是要做设计、查一个原因不明的 bug。简单的换便宜模型,比如从 Opus 换成 Sonnet,再把 effort(让模型想多深)调低;难的把 effort 调高。

能做到这一点,是因为 Claude Code 每次向模型发请求之前也会发出一个事件,mod 可以在这一刻换掉这次请求用的模型和 effort。降档要设门槛,比如小脑的把握达到 0.9 才降:升档判错了,顶多多花点钱;降档判错了,活就可能干坏。还要算一笔账:换模型会丢掉原来那个模型的提示词缓存,来回换得太勤,可能反而更贵。

按 prompt 挑工具和 skills。 Claude Code 现在已经会把一部分工具先藏起来,用到再取,比如外接的 MCP 工具,但藏哪些是引擎定的规则。mod 能改这条规则:每个工具是直接摆给模型,还是先藏到"工具搜索"后面,由 mod 来定。skill 清单也是一段 mod 能改写的文字。

让小脑先读一遍 prompt,判断这次要用哪几样,只把它们摆出来,上下文就更干净。这个决定默认一次会话只做一次,中途要换就得让它重算,提示词缓存也要重来。

执行之前纠偏。 Blast Radius 认的是一张固定的命令清单。小脑不看命令长什么样,只问一句"这会不会毁掉重建不了的东西",判成"会"的概率超过 0.9 就拦下,并附上理由;小脑出错或超时就放行,不耽误干活。

同样的办法可以用在每一次工具调用上,问的也不只是"危不危险",还可以是"这一步还在不在任务上"。大模型往前走,小脑在每一步旁边判一句,跑偏的那一刻就能拦下来。

这几件事都有同样的边界:

  • –每多问一次小脑,就多一次网络往返和一笔费用。
  • –发给小脑的只有你传进去的内容,只发给你选的那一家模型服务;传什么,自己先过滤。
  • –小脑只认你给的选项。问题写得含糊、没留"都不是"这个选项,它也会很有把握地挑一个。是非题给出接近 0.5 的概率,意思是"拿不准",不是"中等"。
  • –文件内容和工具结果里可能藏着故意写给 AI 的指令,小脑也会读到。问题的标准要写明确,还要专门测一下这种情况。

§怎么上手

先确认 Claude Code 是 2.1.287 或更高版本。按投入从小到大,有三档:

  

装现成的。 在 CLI 里输入 /plugin,或者去官方的插件目录 Claude directory 找。装之前当成"在自己电脑上装一段程序"来对待:看作者,看源码。

想接上我们的小脑,输入下面两条,再在 /plugin 里给 jev 填一家模型服务的凭证,重启。它只是把 Jev 接进来,装完不会有任何变化,要用它,还得写一个去问它的 mod:

  • –/plugin marketplace add chrishan17/claude-jev-mod
  • –/plugin install jev@jev-mod

让 Claude 替你写。 官方有一句话:你可以用 Claude Code 去改装 Claude Code。把需求用一段话说出来,比如 Token Weather 要几档图标、什么颜色、显示百分比和小图表,Claude 就会写好插件,放进一个改了就立刻生效的文件夹。你接着说"让 Storm 从 70% 开始",或者"末尾加上美元成本",界面当场就变。这样写出来的 mod 只在当前会话里有效,想留着,要把文件夹拷出来装成插件。

自己写。 Claude Code 加载 mod 时,会把类型声明写进 mod 的 .claude-plugin/types/ 文件夹,每个事件、每个 $ 方法都在里面,这是最全的参考。热重载会清空模块里的变量,要留的数据放进 $.state。写完跑一遍 claude plugin validate .。我们踩过一个坑:加载器看不懂某个函数里的 $ 调用时,会直接不加载它,也不提示。

如果只想先试一件事,就让 Claude 给你写一个最小的 Token Weather。在输入框上方看到上下文用量,是最快能感到变化的一步。

§关于我

我是金石,想用大白话帮你看懂 AI 发展的方向、趋势和新闻。如果你觉得这篇文章有帮助,欢迎关注。我们一起探索 AI。

引用链接

[1] claude-jev-mod: https://github.com/chrishan17/claude-jev-mod

相关学习资料