Gas Town 如何用 gt hooks sync、diff 与 override 管理各角色的 Claude Code hook 配置【免费下载链接】gastownGas Town - multi-agent workspace manager项目地址: https://gitcode.com/GitHub_Trending/ga/gastown在多 rig 的 Gas Town workspace 中crew、witness、refinery、polecats 以及镇级的 mayor/deacon 各自运行 Claude Code 会话每个角色目录下的.claude/settings.json里的hooks段落都决定了该角色在 SessionStart、PreToolUse、Stop 等生命周期事件上执行什么命令。gt hooks命令组把这套配置收敛为“一个 base 配置 按角色/rig 的 override”的单一事实来源gt hooks sync负责把合并结果写回各角色的 settings 文件gt hooks diff在不写入的前提下预览差异gt hooks override负责编辑某个目标的角色级覆盖。这篇文章描述如何沿这条链路完成一次“修改 hook 配置并安全下发”的完整操作。前提你已经在 Gas Town workspace 内工作命令会先定位 town root不在 workspace 内会报not in a Gas Town workspace。gt hooks系列命令针对 Claude Code以及 Gemini的settings.json生命周期 hook 机制其他 agentOpenCode、Copilot 等走各自的模板文件路径本文不涉及。配置从哪里来base、override 与合并顺序Gas Town 的 hook 配置分两层~/.gt/hooks-base.json ← 共享 base 配置所有 agent ~/.gt/hooks-overrides/ ├── crew.json ← 所有 crew 角色的 override ├── witness.json ← 所有 witness 角色的 override ├── gastown__crew.json ← 仅 gastown rig 的 crew └── ...如果设置了GT_HOME环境变量上述路径变为$GT_HOME/.gt读操作还会级联回落到~/.gt未设置时直接使用~/.gt。每个目标按base → role → rigrole的顺序合并更具体的配置优先。例如目标gastown/crew会依次应用 base、crewoverride、gastown/crewoverride。override 文件名中用__代替/gastown/crew→gastown__crew.json。sync 的写入目标在 rig 的共享父目录而不是每个 worktree目标路径override keyCrew共享rig/crew/.claude/settings.jsonrig/crewWitnessrig/witness/.claude/settings.jsonrig/witnessRefineryrig/refinery/.claude/settings.jsonrig/refineryPolecats共享rig/polecats/.claude/settings.jsonrig/polecatsMayormayor/.claude/settings.jsonmayorDeacondeacon/.claude/settings.jsondeacon生成的 settings 通过--settings path传给 Claude Code作为独立优先级层与项目设置叠加客户仓库本身保持干净。第一步查看当前各目标的同步状态先弄清有哪些受管目标、各自用了哪些 override、是否已同步gt hooks list # 表格形式列出所有目标 gt hooks list --json # 机器可读输出每个目标显示 override 链和四种状态之一✓ in sync、⚠ out of sync、- missingsettings 文件尚不存在、✖ error。底部还显示 base 配置路径及其是否存在、~/.gt/hooks-overrides下的 override 文件数量。看到out of sync就意味着磁盘上的 settings 与 baseoverrides 的合并结果不一致这是判断“是否需要 sync”的直接依据。辅助手段是扫描 workspace 里现存 settings 文件中的 hookgt hooks scan # 列出所有 hook gt hooks scan --verbose # 附带显示 hook 命令 gt hooks scan --json # JSON 输出第二步修改 base 或某个目标的 overridebase 对所有角色生效编辑入口是gt hooks base # 在 $EDITOR 中打开 ~/.gt/hooks-base.json gt hooks base --show # 打印当前 base 配置如果 base 文件尚不存在gt hooks base会先创建一份带默认值的配置输出Created default base config默认包含 SessionStart/PreCompact 的 PATH 设置 gt prime --hook、UserPromptSubmit 的 PATH 设置 gt mail check --inject、Stop 的 PATH 设置 gt costs record。编辑结束后命令会重新加载文件做校验输出提示Base config updated. Run gt hooks sync to propagate changes.——修改不会自动生效必须显式 sync。只针对某个角色或 rigrole 做覆盖时用 overridegt hooks override crew # 编辑所有 crew 的 override gt hooks override gastown/crew # 编辑 gastown rig 的 crew override gt hooks override crew --show # 打印当前 override 配置合法的 target 是角色名crew、witness、refinery、polecats、mayor、deaconpolecat会自动规范化为polecats或rig/role组合。文件不存在时会先创建空 override。override 的合并粒度是 per-matcher三条规则决定行为override 与 base 有相同 matcher的条目override整体替换base 条目不同 matcher两条都保留追加override 中某 matcher 带空 hooks 列表表示显式删除该 matcher禁用某条 hook。文档中的一个具体例子base 的SessionStart是gt primewitness override 给同一个空 matcher 配了gt prime --witness最终 witness 得到的是gt prime --witness而不是两者并存。此外除了磁盘上的 base/override实现里还内置了一组角色默认 overrideDefaultOverrides见 internal/hooks/config.go例如 crew 在 PreCompact 上自动执行gt handoff --cycle --reason compactionpolecats 在 Stop 上执行幂等的gt tap polecat-stop-checkwitness/deacon/refinery 带 patrol formula guard。磁盘 override 叠加在这些内置默认之上理解 diff 输出时要把这层算进去。第三步用 gt hooks diff 预览变更改完配置先不要写盘用 diff 核对将发生什么gt hooks diff # 显示所有目标的待变更 gt hooks diff gastown/crew # 只看某个目标 gt hooks diff --no-color # 纯文本输出见 HOOKS.md 记录diff 将每个目标当前的 settings 与 baseoverrides 的合并结果比较按 hook 事件类型PreToolUse、PostToolUse、SessionStart、Stop、PreCompact、UserPromptSubmit、WorktreeCreate、WorktreeRemove输出增减行新增用、移除用-标注matcher 为空时显示为 (all)。退出码对脚本友好0表示无待变更输出No changes pending - all targets in sync1表示存在将被应用的变更。第四步用 gt hooks sync 下发确认 diff 符合预期后执行gt hooks sync # 写入所有受管 settings 文件 gt hooks sync --dry-run # 只预览不写盘sync 对每个 Claude 目标执行加载 base → 应用 role override → 应用 rigrole override → 把合并后的hooks段合并进现有 settings.json保留editorMode、enabledPlugins等非 hook 字段未知字段也会原样保留→ 写入。dry-run 时输出会把状态标为~ ... (would create)/~ ... (would update)正常写入时为✓ ... (created)/✓ ... (updated)/· ... (unchanged)最后给出汇总例如Synced 5 targets (0 created, 1 updated, 4 unchanged)。两种失败情形要知道普通失败hooks sync failed: N target(s) failed (目标列表)命令返回错误。integrity violation某个 settings.json 解析失败时按“fail closed”处理输出hooks sync failed closed: N integrity violation(s) across ...。这时不应直接重试覆盖先手工检查该文件内容。验证结果下发后按顺序确认gt hooks list中相关目标变为✓ in sync再次gt hooks diff无变更时输出No changes pending - all targets in sync且退出码为 0抽查具体角色文件如rig/crew/.claude/settings.json确认hooks段落与预期一致、非 hook 字段未被改动。持续保障方面gt doctor的hooks-sync检查会校验所有受管 settings 是否与gt hooks sync的生成结果一致gt doctor --fix可自动修复 out of sync 的目标。另外gt rig add创建新 rig 时会自动对该 rig 的全部目标crew、witness、refinery、polecats执行一次 hooks sync不需要手工补。限制与已知边界registry 是目录不是事实来源。~/gt/hooks/registry.toml列出可用 hook当前 7 个5 个默认启用如 SessionStart 的session-prime、UserPromptSubmit 的mail-check、Stop 的costs-record、PreToolUse 的pr-workflow-guard与dangerous-command-guard真正决定哪些 hook 在哪个目标生效的是 base/overrides。gt hooks registry浏览、gt hooks install hook-id会把 registry 中的 hook 拷贝进 base 配置。部分 hook 尚未进 registrybd init guard、mol patrol guards、tmux clear-history、SessionStart 的.beads/校验gt hooks install还不能管理它们。禁用单个 hook 的方式是 override 空 hooks 列表见上面第 3 条合并规则目前没有gt tap disable/enable之类的便捷命令。settings.local.json个人覆盖不受 Gas Town 管理gt hooks list检查的同步状态不含它。gt hooks init只在 base 尚不存在时可用它分析现有 settings 文件把公共 hook 提取为 base、把各目标的差异生成为 override已有 base 时用gt hooks base编辑。hook 顺序无需担心合并链base → override产生确定性顺序per-matcher 合并保证每个事件类型下每个 matcher 只有一条记录。参考资料docs/HOOKS.md、internal/cmd/hooks_sync.go、internal/cmd/hooks_diff.go、internal/cmd/hooks_override.go、internal/hooks/merge.go、internal/hooks/config.go。【免费下载链接】gastownGas Town - multi-agent workspace manager项目地址: https://gitcode.com/GitHub_Trending/ga/gastown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考