mcpField
H
hook-manager

hook-manager

github.com/b-open-ioAgent 工作流1652 次安装4 周前更新
代码仓库

关于 hook-manager

用于管理 b-open-io core 插件所带钩子的技能,适用于 Claude Code、Codex 和 Grok Build 用户。它读取实时清单,并通过分层配置启用或停用钩子,也提供设置与故障诊断流程。

主要功能

  1. 01读取插件中的钩子清单
  2. 02按项目或用户配置钩子开关
  3. 03引导首次设置与分层选择
  4. 04诊断配置判定和运行前提

适用场景

  1. 01首次配置插件钩子的启用状态
  2. 02按项目调整工作流钩子
  3. 03排查钩子为何拦截或跳过操作

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/b-open-io/prompts --skill hook-manager

安装后在 Claude Code 中输入/hook-manager确认已加载。

附带文件.clawnet/unsigned-skill.jsonREADME.md

详细介绍

Hook Manager

管理 Claude Code、Codex 和 Grok Build 随核心插件附带的钩子。清单的权威来源是已安装插件中的 hooks/manifest.json——应实时读取,而不要相信记忆中的列表:

cat "$(ls -d ~/.claude/plugins/cache/b-open-io/core/*/ | sort -V | tail -1)hooks/manifest.json"

每个条目都包含 name、event、matcher、tier、runtimes、summary 和 description。安装插件时会自动注册钩子;此技能用于控制哪些钩子实际运行。

配置文件

每个钩子的启用或禁用状态保存在 JSON 配置文件中。解析顺序如下(首个对某个钩子给出明确 true/false 判定的文件优先):

  1. $BOPEN_HOOKS_CONFIG — 显式覆盖(测试、脚本)
  2. <project>/.claude/bopen-hooks.json — 项目级(Claude)
  3. <project>/.grok/bopen-hooks.json — 项目级(Grok)
  4. ~/.claude/core/hooks-config.json — 用户级(Claude)
  5. ~/.grok/core/hooks-config.json — 用户级(Grok)
{
  "version": 1,
  "hooks": {
    "bouncer": true,
    "damage-control": true,
    "publish-gate": true,
    "agent-browser-solo": true,
    "session-context": true,
    "hammertime": true,
    "browser-intent": true
  }
}

只有显式设置为 false 才会禁用钩子。文件缺失、键缺失或 JSON 无法解析,都表示启用——配置出错绝不能悄无声息地关闭防护。更改会在下一次调用钩子时生效;无需重启。

首次设置([BOPEN-HOOKS-SETUP] 指令)

当会话上下文中包含 [BOPEN-HOOKS-SETUP] 时,表示用户尚无配置。不要打断他们的任务;在自然停顿时提供设置选项。流程如下:

  1. 读取清单(使用上面的命令),并通过 AskUserQuestion(multiSelect)按两个层级展示钩子:
    • 防护(建议启用):tier: "guard" 的条目——可防止工作丢失、机密泄露和未关联工单的发布。
    • 工作流(按偏好选择):tier: "workflow" 的条目。
  2. 运行下面的前置条件检查,并将检查结果纳入建议(例如,未安装 agent-browser 时,agent-browser-solo 会静默回退到原生 WebFetch——仍可安全地保持启用)。
  3. 将完整的钩子映射写入 ~/.claude/core/hooks-config.json(Claude/Codex)或 ~/.grok/core/hooks-config.json(Grok)——必须为每个钩子显式填写布尔值,即使全部使用默认值也一样。写入该文件后,设置提示才会永久消失。

启用 / 禁用钩子

使用 Read 和 Write 工具编辑用户配置(或项目级变更对应的项目配置)——读取文件、更改布尔值,然后写回。文件不存在时,根据上面的模板创建。绝不要编辑插件缓存中的文件;更新会覆盖这些文件。

每次写入配置都需要确认:damage-control 将这些文件视为 ask 级,因此未经用户明确同意,绝不能解除防护(在 Codex 上,写入会被直接拒绝——请用户自行编辑文件)。这是有意设计;不要绕过此机制。

禁用防护钩子前先提醒用户:bouncer 会阻止 git reset --hard 这类可能导致工作丢失的操作,damage-control 会对 .env 等路径强制实施零访问限制,publish-gate 会拦截未关联工单的 npm/链上发布。是否禁用由用户决定,但要明确说明禁用后会失去哪些保护。

诊断

当钩子行为异常,或用户询问“为什么 X 被拦截 / 跳过”时:

# Which config verdict applies to a hook?
for f in "$BOPEN_HOOKS_CONFIG" ./.claude/bopen-hooks.json ./.grok/bopen-hooks.json ~/.claude/core/hooks-config.json ~/.grok/core/hooks-config.json; do
  [ -f "$f" ] && echo "$f: $(jq -r '.hooks["<name>"] // "no verdict"' "$f")"
done

# Prerequisites
command -v jq || echo "jq missing — hooks skip JSON parsing without it"
command -v agent-browser || echo "agent-browser missing — agent-browser-solo falls back to native WebFetch"
[ -n "$LINEAR_API_KEY" ] || echo "LINEAR_API_KEY unset — publish-gate denies gated publishes"
command -v python3 || echo "python3 missing — hammertime and JSON escaping degrade"
  • 硬性拒绝会以结构化权限拒绝的形式呈现给模型;在 Codex 运行时中,它们会以退出码 2 的 stderr JSON 形式到达。这两种情况都是有意设计。
  • hammertime 也有自己的控制项——Skill(core:hammertime) 和 hammertime:manage skill——可用于在启用 / 禁用之外调整规则级设置。
  • 每个钩子的权威行为说明都在插件 hooks/ 目录中的对应脚本头部;在猜测之前先读取。

此技能绝不会做什么

  • 绝不将钩子文件复制到 ~/.claude——钩子随插件一起提供,并通过 claude plugin update core@b-open-io 更新。
  • 绝不编辑 hooks/*.sh、claude-hooks.json 或插件缓存中的任何内容。
  • 禁用防护钩子前,绝不隐瞒它原本提供的保护。

评论

支持 Markdown