fix(claude-hook): 识别开发版平台二进制 - #1277
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
isBotmuxHookCommand 的新正则会将非 Windows 平台的 *.exe 也识别为 botmux hook,存在误判并可能误删第三方同前缀 hook 的风险。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
该 PR 修复 Claude 家族 hook 去重逻辑在开发态 dist-bin/botmux-<plat>-<arch>[-musl] 二进制形态下无法识别自身可执行文件的问题,避免在路径切换/重复安装时 SessionStart / UserPromptSubmit 等 hook 持续累积,符合 botmux 的 hook 幂等安装目标。
Changes:
- 扩展 Claude hook 调用目标 basename 的白名单识别逻辑,覆盖
dist-bin/botmux-<plat>-<arch>[-musl]形态。 - 新增回归测试:验证 dev dist-bin 路径互切时三类 hook 仍保持幂等;并验证不误伤
botmux-helper等第三方同前缀程序。
File summaries
| File | Description |
|---|---|
| src/adapters/hook-installer.ts | 扩展 botmux hook 调用目标的 basename 识别规则以覆盖 dev dist-bin 产物 |
| test/hook-installer.test.ts | 增加 dev dist-bin 幂等与第三方同前缀不误判的回归用例 |
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| return basename === 'cli.js' | ||
| || /^botmux(?:-(?:linux|darwin|windows)-(?:x64|arm64)(?:-musl)?)?(?:\.exe)?$/.test(basename); |
11903cd to
4c827ab
Compare
|
你好!这是 Botmux 的自动评审流程。 本 PR 的评审群已创建:https://applink.feishu.cn/client/chat/open?openChatId=oc_996227482979275a8188d8b2683024dc 但你暂时未被拉入群中——你的 GitHub 账号(LPX-E5BD8)不在自动拉群名单里。请把你的 GitHub 账号和飞书信息补进名单文档: 补好后,后续复审会自动把你拉进群。感谢贡献! |
|
感谢这个 PR,方向和实现都对,生产代码部分我这边没找到阻断问题。先说结论:改动逻辑正确,复现与修复都验证通过;两条正则甚至比 issue #1210 里建议的写法更严谨。 下面两条都属于「测试有效性」的建议,不影响生产行为。 先肯定一点:你的正则比 issue 的建议更好,别改回去issue #1210 建议的是单条
11 个合法形态两版都命中。这个差异是你的实现更贴合 修复本身有效(我复现了)用带引号的真实形态
F1(建议合入前修,非阻断):7 条负向用例目前不承重
原因是断言走的 这条正好是 issue 验收建议里点名要锁的性质("同时断言 可行的改法是改成从真正会调用该谓词的入口( installHook('claude-code', {
configPath, format: 'claude-settings',
sessionStartCommand: '/repo/dist-bin/botmux-linux-x64 session-ready',
}, '/repo/dist-bin/botmux-linux-x64 hook claude-code');
const cmds = JSON.parse(readFileSync(configPath, 'utf-8'))
.hooks.SessionStart.flatMap((g: any) => g.hooks.map((e: any) => e.command));
expect(cmds).toContain(thirdPartyCommand); // 第三方 hook 必须存活我本地验过这个写法:当前实现下 7/7 绿,换成宽匹配后 7/7 红 —— 是承重的。 F2(非阻断):
|
|
补充一条对上面 F1 的更正,以及两处我自己的数字纠错。复审又跑了一轮,结论从「建议合入前修 F1」放宽为「F1 取决于 #1276 的合并顺序,可能无需你动手」。 更正(重要):F1 在 #1276 之后会自动闭环你的 #1276 把
也就是说 #1276 一旦先合,本 PR 这 7 条用例就自动变成承重的,你不需要为 F1 改任何测试。上面 F1 那段给的替代写法只在「#1277 先合、#1276 还没合」的情况下才有必要。 F2 不会自愈:合并态下把 两个 PR 的冲突情况(供你参考)两者都改
冲突不难解,但有个坑值得提前说:冲突切口落在 F2 的一行改法(比我上面写的更省)不用新增 const first = '/repo/dist-bin/botmux-darwin-arm64-musl'; // 原 botmux-linux-x64
const second = '/repo/dist-bin/botmux-linux-x64'; // 原 botmux-darwin-arm64实测这一行之后, 两处我自己的数字纠错
以上依然是自动评审意见,合并顺序与是否要动 F2 请以维护者的判断为准。 |
deepcoldy
left a comment
There was a problem hiding this comment.
复审通过,三条评审意见(N1 / F1 / F2)都已在 c2a413103 落实,感谢跟进。
新 head 我从头重验了一遍(rebase 到最新 master 02dea1044,零冲突):
tsc --noEmit:0 errornpx vitest run --project unit test/hook-installer.test.ts:48 passedbun test test/hook-installer.test.ts(真 Bun 运行时):48 pass / 0 fail- 真编
dist-bin/botmux-linux-x64跑端到端(用hook-command.ts自己渲染的形态连装三次):1 / 1 / 1,基线上同样测法是 1 / 3 / 3
三条意见的落实我都做了反变异确认,不是只看绿:
| 项 | 验证 |
|---|---|
| F1(负向用例承重) | 过宽正则变异 → 11 条转红(改前是 0 条);return true → 同样 11 条红 |
| F2(枚举分支覆盖) | 7 个分支逐个删(linux-x64 / linux-arm64 / -musl / darwin-x64 / darwin-arm64 / windows-arm64 / .exe 可选性)全部转红 |
| N1(darwin-musl) | 穷举 plat×arch×musl?×exe? 全 24 组合:6 个真实 RELEASE_TARGETS + 4 个 windows 本地产物全接受,接受但非真实产物 = 0 |
另外补充一条前几轮没覆盖的:isBotmuxHookCommand 还喂着一条破坏性路径(isBotmuxTraexAskHookEntry → cleanupTraexAskHooks,由 worker-pool.ts:3874 对用户的 ~/.trae/hooks.json 真删条目)。这条路径上也验了:9 个同前缀第三方命令全部存活、dev 二进制的 traex hook 正常清理,过宽变异下 9 条转红。
顺带说明:darwin-*-musl 的收紧让这里和 src/core/binary-install-shape.ts:102/180 的正则出现了差异(那两处仍是 (?:linux|darwin)-…(?:-musl)?)。那两处是既有代码、不在本 PR 范围内,也不影响本 PR 正确性 —— 如果以后要统一,适合单独提一个 PR。
LGTM。
扩展 BotMux hook 命令的 basename 白名单,精确覆盖 dist-bin 生成的平台二进制名,并补充三类 hook 的幂等回归以及第三方同前缀程序反例。 Refs: deepcoldy#1210 Co-authored-by: TRAE CLI <noreply@bytedance.com>
c2a4131 to
e9a04db
Compare
|
Rebased onto current master so this sits on top of #1276. Same change: recognize the real |
|
🚀 Released in v3.19.3 |
问题
Hook 去重只识别
cli.js、botmux和botmux.exe。本地bun run use:here --binary使用dist-bin/botmux-<platform>-<arch>[-musl],因此路径切换或重复安装时,SessionStart/UserPromptSubmit hook 会持续累积。Fixes #1210
修复
-musl),以及 Windows × x64/arm64(可选.exe)。botmux-*匹配,继续拒绝botmux-helper、botmux-wrapper、缺平台/架构和额外后缀等第三方名字。影响面
botmux名称和 Nodecli.js路径行为不变。验证
npx vitest run --project unit test/hook-installer.test.ts:36 passed。bun run vitest run --project unit test/hook-installer.test.ts:36 passed。bun run build:通过。