AREX Feed Article
Claude Code 官方公布 Function Hooks 预览:尚未上线,先征集开发者反馈
北京时间 9 月 4 日凌晨 2:01(UTC 9 月 3 日 18:01),Claude Code 官方账号 @ClaudeDevs(主页简介自称面向 Claude AI 开发者的官方更新)称,团队正在探索一种让用户扩展和定制 Claude Code 的新方式:Function Hooks,并附两条演示视频。
帖文原文写明:“它还没有发布(It hasn't shipped yet),我们很乐意在我们的 GitHub issue 上听到你的反馈。”
帖文发出约一分钟前,GitHub 用户 poteat 已在 anthropics/claude-code 仓库打开 ,标题为 “Function Hooks - make plugins 10x more powerful”。他在正文里说自己是“受命来征集社区对一个内部提案的反馈”,并附上架构文档与九段演示视频。poteat 还写道:如果你想要这个功能,请在这里参与,社区的反应很可能决定它是否会发布。
约 70 分钟后,账号简介同样标注 “Claude Code @anthropicai” 的 Boris Cherny(@bcherny),问开发者“你会用它吗”,说这是“我们对如何让 Claude Code 变得远比现在更可扩展的一些早期思考”,“有点疯狂,也非常令人兴奋”。
截至发稿前核验时,官方主帖已获逾 40 万次浏览、约 2,200 次点赞和 140 余条回复,issue 下方已有 54 条评论。
官方口径:没有上线,只有演示和 issue
官方这次公开的,只有两段演示视频、一个附架构文档与九段视频的 GitHub issue,以及“尚未上线”的明确声明。两条帖文与 issue 正文都没有给出任何发布时间表或承诺。
“先放演示、后收反馈”的节奏也带来怀疑。X 用户 herman 在官方帖下评论:“GitHub issue 本身就是那个功能。那些视频展示的东西,我现在还打不开。”
创业者 Johnny Nel 则在转发里提醒同行,在它真正发布之前,不要把自己的线上工作流押在 Function Hooks 上。
一个钩子是一段 TypeScript 中间件
按 poteat 在 issue 里的摘要,提案的核心是:让用户用 TypeScript 函数钩住 Claude Code 的内部运行,深度修改其行为。
安全与组合是两条设计主轴:副作用通过参数化 $ 对象追踪,执行顺序由注册次序决定,按 next 续延模型层层嵌套,poteat 称之为“类似 Express 或 Koa 的做法”(二者均为 Node.js 中间件框架)。
注册顺序即嵌套:先注册的钩子包在外层、权限更大,构成“洋葱模型”。poteat 在回复中解释,先注册的插件“拥有”某个事件实例上后续的所有钩子,链条下方的插件无法抑制上方的插件,管理员把自己的插件放在最前面即可控制全局。
副作用只有 $ 一条通道:文件、网络、终端、权限等能力都挂在 $ 对象上,没有环境自带的副作用通道,管理员因而可以审计、放行、拒绝或记录每一个调用。
钩子还能改界面。Claude Code 的界面基于 React(JavaScript 界面库),提案允许钩子挂在组件上修改 props 或包裹返回的渲染节点。
运行形态也被点明:钩子以进程内方式跑在 Bun(JavaScript 运行时)上。poteat 回复用户时称,全进程内运行“会快得惊人”,内部原型的目标是每个钩子 p99(99% 分位延迟)50 微秒。
deafsquad 在评论区据此计算,这比启动一个子进程快约 1,800 倍,同时提醒:这个数字只是分发(dispatch)成本,钩子自身要做的工作,在哪种运行时里都省不掉。
九段演示:拒绝、改界面与“一句话生成插件”
issue 里的九段视频分三组:四段 Basic 和三段 Advanced 各 60 秒,两段 Case Studies 约两分钟。帖子附带一则 AI 使用披露:缩略图由 AI 生成,演示与代码是真实的,“跑在实际二进制上”。
四段基础演示覆盖四种能力:钩子即 TypeScript 函数,带完整类型定义与 LSP(语言服务器协议)支持;用钩子“说不”,限制行为以保安全;插件可以改界面,即修改组件 props 或包裹渲染结果;管理员以钩子形式从 $ 上移除一种能力,注册在下的所有插件便无法再调用该副作用。
三段进阶演示展示:顺序即嵌套;一个挂在 ui.press 上的钩子能同时接住终端和桌面应用里同一个按钮的点击;单个挂在 * 上的钩子能看见包括插件自身 $ 调用在内的全部事件,写审计日志因此“只是一个函数”。
两段案例更接近真实工作流。其一是“一句话、一个插件”:Claude 根据一句简短请求,写出、校验并加载一个插件,在模型读到工具输出之前替换其中的密钥。
其二是“改变 Claude Code 显示的内容”:一个插件在 Claude Code Desktop 里隐藏敏感值,鼠标悬停才显示,方便用户共享屏幕而不泄露数据。
poteat 在回复中表示,他个人的目标是让这套机制跑在“任何由 Claude Code 二进制驱动的表面上”,内部原型目前支持本地 Claude Code Desktop。
shell 钩子的缺口,用户早量出来了
要理解这次预览想解决的问题,得先知道 Claude Code 现在能怎么扩展。issue 评论区里,用户 AdityaRon 介绍自己维护的 claude-code-harness 就“建立在今天的命令钩子模型上(PreToolUse/PostToolUse,通过 settings.json 加 bash)”。也就是说,Claude Code 现阶段的扩展钩子,是写在 settings.json 里、以 bash 等 shell 命令实现、挂在 PreToolUse/PostToolUse 等固定事件点上的。
重度用户报出的数据说明了这个模型的规模。自称重度钩子用户的 DareDev256 运行着 42 个活跃钩子、分布在 19 个事件上,其中 35 个“无法返回非零退出码”。
他的原话点出了问题的形状:“失败在它们的契约里无法表达,下游任何东西都无法区分‘跑过且成功了’与‘跑过却什么都没做’。”他只能另写一个定时任务去 grep 日志,判断钩子是否还活着。
另一名用户 DolphusCY 报告了 116 条钩子注册、99 个脚本、覆盖 18 个事件。Windows 用户 deafsquad 则测得,一个裸 Python 钩子以子进程方式启动要耗时 86~99 毫秒。
这些评论构成了对提案的直接背书:把钩子从外部 shell 脚本变成进程内、带类型、结构化参数的函数,能解决正则被绕过、失败无法表达、子进程开销等一串结构性问题。
用户 Monte9 甚至已在 GitHub 放出用 TypeScript 复刻该设计的原型仓库 claude-function-hooks,自称与 Anthropic 无关、跑了 17 个测试。他的概括是:真正的一行改动,是把现有文档里“所有匹配的钩子并行运行”替换成“有序折叠,顺序即权威”。
批评与支持同时进场,错误语义尚无定论
声浪并不全是叫好。GitHub 用户 andreimaxim 一边说“这是 Claude Code 必须具备的绝佳功能”,一边批评演示与文档质量“差得让人震惊”:“拜托,它就是个中间件!”
poteat 回复道歉,称自己“确实花了一周校对文案、反复录制,我自己也不满意,但我想这周就把它发出来,而不是再花一周打磨演示”。X 上的批评集中在视频旁白,软件工程师 Corey Ward 说,希望“别再用那种恼人的 Claude 式文字写视频脚本了”。
另一边,简介同样标注 “Claude Code @anthropicai” 的 @trq212 数小时后转发称:“我们正在让 Claude Code 变得可改造得多,请给我们反馈!”
更实质的交锋在错误语义上。poteat 最初表示,如果链条里没人接住错误,引擎就按“没有注册任何插件时的默认行为”再走一遍,即出错放行(fail-open)。
deafsquad 随即反驳:出错即放行,与提案里“管理员移除 $ 能力即机械生效”的卖点冲突,而“那是我最希望这个提案保留下来的部分”。几轮讨论后,poteat 改口称自己“现在非常倾向于捕获所有错误、记录日志并绕开出错的那个钩子”,但实现细则仍在来回。
用户 PrimeLineDirekt 则从建模层面发问:事件被定义为 $ 上的方法调用,而“生命周期时刻不是方法调用”,撞上用量上限、定时任务这类时刻可能没有对应钩子可挂。
deafsquad 还指出这套模型“没有归并(collapse)”:一条链只传一个值,每一层只能看到紧挨着它的下一层返回的结果,多个钩子基于不同理由的反对如何汇总,文档没有回答。
截至发稿前核验时,这条“无归并”的结构性批评仍是 issue 里的最后一条评论,poteat 尚未回复;而对错误语义,他本人此前的答复也只停在“非常倾向于”某个方向的表态,并承认取舍“还很悬而未决”。