AREX Feed Article
Boris Cherny 称 Claude Mods 正在落地,社区成员把俄罗斯方块做进了 Claude Code
北京时间 9 月 15 日凌晨 1 时 30 分,X 账号 发帖称「Claude Mods 正在落地」,并说已经有人做出了一个「Claude 里的俄罗斯方块」mod(模组)。发帖人是 Boris Cherny,账号简介写着「Claude Code @anthropicai」。帖文让读者去看编号 #91870 的 GitHub issue(公开讨论帖)里的「最新的社区更新、技术细节和更多演示」。截至发稿,这条帖文有 48.7 万次浏览、2,425 个赞和 269 条回复。
帖文里的 GitHub 链接指向 issue 里一条发布于约两小时前的评论: 在那里贴出了自己写的插件 cc-arcade。他在评论里写道,就他所知,这是第一个用 function hooks(以 TypeScript 函数挂进引擎的钩子)画出可交互界面的插件:俄罗斯方块和另外七款游戏画在输入框上方,Claude 工作时可以玩,不消耗 token。
cc-arcade 把九款游戏和一只宠物画在输入框上方
按 现在的 README,这套插件里有九款游戏,分别是 snake、Tetris、Doom、2048、Minesweeper、Flappy、Pong、一个打字测试和 Space Invaders,另外还有一只宠物(他在评论里介绍这个插件时,写的是「俄罗斯方块,外加另外七款游戏」)。用法是运行 /arcade,输入框上方出现一排按钮,点一款开始;点一下棋盘,键盘才交给游戏,按 Esc 把键盘还给输入框;Claude 的回合结束时游戏暂停,状态行会写明这件事。宠物则随着 Claude 跑通测试、提交代码、编辑文件而长大。
作者在评论里说明了它是怎么接上去的:ui.render 挂到 AbovePrompt 这个界面区域,每个棋盘一个 Client 模块,turn.complete 用来在 Claude 结束时暂停,tool.call 用来喂宠物,分数存在 $.store 里。不花 token 的原因写在 README 里:每一次点击和命令都由插件自己回应,不去问模型,因此不产生模型推理开销。他也列了自己踩过的坑:surface(界面层)模块里 h 这个局部变量的规则、Client 模块路径必须写成字符串字面量,以及这条横带大约占半个终端、每秒重绘十次左右。他说这些都能用,只是目前没有文档。
这个插件只画在交互式终端里,claude -p、桌面端和移动端什么都不显示;终端需要能上报鼠标、能画制表符和方块字符。
cc-arcade 创建于 9 月 13 日,MIT 许可,用 TypeScript 写成;截至发稿有 23 个 star 和 2 个 fork。README 末尾注明,这些游戏是同类玩法的自制品,与 Tetris Holding、Taito、Atari 和 id Software 没有隶属或背书关系。
9 月 3 日,poteat 为一份内部提案征求社区反馈
Cherny 帖文指向的 叫「Mods - make Claude 10x more extensible」,由 GitHub 用户 poteat 在 9 月 3 日发起。发起帖写明,这是在为一个内部提案向社区征求反馈,设想的形态是用 TypeScript 函数挂进 Claude Code,像 Express 或 Koa 那样;所有副作用都经过一个参数化的 $ 对象,因而可以被跟踪、允许或拒绝;多个插件则按注册顺序用 next 续延组合起来。帖子附了一份架构文档和九段演示视频,结尾写着:想要它,就来这里参与,「社区的反应很可能决定这东西是否发布」。
同一天,Cherny 本人也发过,说这是「我们如何让 Claude Code 更可扩展」的一个早期预览,问大家会不会用;面向开发者的官方账号 则在帖中写明,它当时还没有发布,「我们很想在这个 GitHub issue 上听到反馈」。
9 月 9 日,poteat 在主帖顶部挂出社区更新:团队承诺在「以周计」而不是「以天或月计」的时间里发布 function hooks;产品名定为 Claude Mods,function hook 作为文档化的实现原语保留;前三个内置 mod 的源码公开;试用开关 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude 也一并公开。查看时,这个 issue 积累了 177 条评论。
Anthropic 仓库里现在有一个 ,里面的定义是:一个 mod 就是一个 Claude Code 插件,行为写在一个 hooks module(钩子模块)里,由一个 register(on, options) 入口把引擎的事件当成函数 ($, e, next) 挂上去。目录里是三个随 Claude Code 一起内置的 mod:sec-default 负责把组织的经典 hooks、提示词内容、托管设置和工具策略挡在个人安装的插件之外;diff 是 /diff 那个常驻 diff 面板;telemetry 给插件提供 $.telemetry。
公开文档里,这条路径仍是 early access
截至 9 月 15 日,Anthropic 自己在 末尾还写着:early access(早期访问),hooks module 只在 function hooks 开启的地方加载,这些 mod 写在其上的 API 可能在不同版本之间变化,不另行通知。cc-arcade 的也仍然要求先设好 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1,并要求 Claude Code 2.1.269 或更高;按它的说法,2.1.269 是第一个把 function hooks 画到输入框上方的版本。
把这些和帖文放在一起,能确认的是阶段而非日期:机制已经内置在发布的 Claude Code 里,社区在开关后面使用和构建。
帖子发出后,社区在 issue 里又贴出一批 mod
从 Cherny 发帖到发稿的不到一天里,issue 里又出现了几批社区作品。这些都是作者自己的说法。
贴出了三个会话跟踪 mod,代码放在 :context-lens 在输入框下方常驻一行 /context,加一个面板显示上下文窗口填充度、每回合增长、距压缩还剩多少回合;quota-meter 显示 5 小时与 7 天配额窗口、重置倒计时和燃烧速率预测;token-ledger 按每回合 $.session.usage().cost.usd 的变化列出花费、token 数、缓存命中率和耗时。他还报告,2.1.270 上 $.session.usage({ breakdown: "full" }) 在类型声明里存在却返回不了 breakdown,随后更新说 2.1.272 已经提供。
给 cc-arcade 提了一个还没合并的 PR(合并请求),要把 1993 年的 Doom 放进来:用 diekmann 的 WebAssembly 版 linuxdoom-1.10,首次启动时抓取并校验 SHA-256;因为插件的运行环境没有 WebAssembly,引擎跑在它自己启动的进程里,通过 $.http.fetch 走本地 127.0.0.1:47321 访问。
把一个 26 万参数的 TinyStories transformer 整个放进了 hooks module,在输入框上方写关于 Claude 正在做的事的短文,全部在本地 TypeScript 里生成;他说速度约每秒 2,600 个 token,为了读起来像打字限速到每 80 毫秒两个 token,同一个 checkpoint(模型检查点)在他的 Game Boy Color 上每 2 分 49 秒才吐一个 token。
则写了一个夜间扫描器,把结果整理成 :它搜索 GitHub、克隆候选仓库,再用 Claude Code 自己的 claude plugin validate 逐个检查 plugin.json。他给出的统计是 31 个 Claude Mods,来自 92 个候选仓库,其中 14 个能运行主机进程、4 个能访问网络、13 个能看到每一次工具调用、1 个通不过 2.1.272 的校验。他自己强调,这是能力画像,不是滥用的证据。
Marat 的实测:hook 超时后会放行它下面的调用
issue 里目前最新的一条反馈来自。他自称从 v259 起就在 function hooks 上做东西,现在跑在 2.1.272 上,把自己对这套机制的观察列成五条。
第一条是他实测的:在 agent.spawn 上,hook 超时会被跳过,而它下面的东西照常运行。在他看来,这个不对称才是问题所在:对一个以「说不」为职责的 mod 来说,否决权可以因为 hook 变慢而消失,而不是因为它被关掉。他点名提到内置 mod sec-default,并要求给 hook 加一个显式声明的 failMode: 'open' | 'closed',因为今天想做到 fail closed,只能自己用 Promise.race 和一个硬编码的预算手写。
另外两条是:$.model.complete 没有 effort 也没有 timeoutMs,而 turn.step 上 effort 是一等公民、可以被 hook 改写;turn.step 能替换一次模型请求,却不能把请求转发出去,因为消息由引擎固定,想转发或审计就得自己用 $.session.messages() 重建请求,任何偏差作者都看不到。
前一天, 报告了四个小问题,其中一个是:装在 ~/.claude/skills/ 下的 mod 不会热重载,交互式会话连续三次跑的都是旧模块,而 claude -p 总是加载新代码,于是他在无头检查通过的情况下,去追了一个自己早就修好的 bug。
Marat 列出的这五条发布于 9 月 15 日,目前仍排在该 issue 评论区的最后;这个从 9 月 3 日开着的 issue,也还开着。