- 在工具执行前拦截危险操作
- 写文件后自动跑 lint,保持代码风格一致
- Agent 完成任务时弹出桌面通知,不用一直盯着 IDE
支持的事件
当前 IDE / JB 插件支持以下五种 Hook 事件:快速开始
下面用一个例子,演示如何拦截rm -rf 这类危险命令。
1
创建脚本
2
添加配置
在
~/.qoder/settings.json 中添加:3
验证效果
打开 IDE,在 Qoder 插件面板中让 Agent 执行包含
rm -rf 的命令。Hook 会阻止执行,并把错误信息反馈给 Agent。适用场景
工作原理
Hook 的使用流程可以概括为三步:编写脚本 → 注册配置 → 自动生效。 当 Agent 执行到某个生命周期节点时(如工具调用前),插件会检查配置中是否有对应的 Hook:- 插件在启动时加载所有 Hook 配置
- Agent 运行过程中,到达某个事件节点(如
PreToolUse) - 插件遍历该事件下所有 Hook 分组,用
matcher匹配当前上下文 - 匹配成功的 Hook 按顺序执行对应的 shell 脚本
- 脚本通过
stdin接收事件上下文(JSON),通过exit code和stdout返回决策 - 插件根据返回结果决定后续行为(放行 / 阻断)
前置条件
- jq:示例脚本依赖 jq 解析 JSON。macOS 下执行
brew install jq,Linux 下执行apt install jq。 - 脚本权限:所有 Hook 脚本需要有可执行权限(
chmod +x)。
创建 Hooks
1. 确定需求:选择事件和匹配范围
首先明确你要在哪个节点介入,以及匹配什么条件:2. 编写 Hook 脚本
Hook 脚本是一个标准的 shell 脚本,遵循以下协议: 输入:通过stdin 接收 JSON 格式的事件上下文
输出:通过 exit code 控制行为
3. 注册到配置文件
将脚本路径写入配置文件的对应事件下:4. 测试与调试
可以直接在终端用管道模拟测试:配置 Hooks
配置文件位置
Hook 配置从以下文件加载,多级配置会被合并执行(优先级从低到高):IDE / JB 插件与 CLI 共享同一套配置文件。当前版本暂不支持热加载,修改配置文件后需要重启 IDE 才能生效。
配置格式
一个事件下可以配置多个 matcher 分组,每个分组可以包含多个 Hook 命令。
matcher 匹配规则
matcher 用于过滤 Hook 的触发范围,不同事件匹配不同的字段(见各事件说明)。
工具名映射
Qoder 支持两套工具名——原生工具名与 Claude Code 兼容工具名。配置 Hook 时可使用任意一套,插件内部会统一映射后执行匹配。例如matcher: "Bash" 和 matcher: "run_in_terminal" 等价。
编写 Hook 脚本
Hook 脚本通过 stdin 接收 JSON 输入,通过 exit code 和 stdout 输出来控制行为。本节说明所有事件通用的输入输出格式,各事件的额外字段见 Hooks 事件。输入
Hook 脚本通过 stdin 接收 JSON 数据。所有事件都包含以下通用字段:
不同事件会在此基础上附加额外字段(见各 Hooks 事件)。
用
jq 解析输入:
输出
Hook 通过 exit code 和 stdout 控制行为。 exit code 决定基本行为:
stdout JSON(仅 exit 0 时解析)可为部分事件提供精细控制,具体支持的字段见各事件说明。exit 非 0 时 stdout 被忽略。
环境变量
Hook 脚本执行时,插件会注入部分环境变量供脚本使用。具体注入的环境变量列表待补充确认。Hooks 事件
UserPromptSubmit
用户在 IDE 插件面板中提交 Prompt 后、Agent 开始处理前触发。可用于 Prompt 审查、内容过滤、自动补充上下文等场景。 matcher 匹配: 无匹配字段,该事件对所有用户输入统一触发。 额外输入字段:
示例:自动给 Prompt 补充项目规范
PreToolUse
工具执行前触发。可以阻止工具执行。 这是最常用的 Hook 事件,适用于危险命令拦截、文件路径校验、权限检查等场景。 matcher 匹配: 工具名(如Bash、Write、Edit、Read、Glob、Grep,MCP 工具名如 mcp__server__tool)
额外输入字段:
PostToolUse
工具执行成功后触发。不可阻断。适用于自动 lint、日志记录、结果分析等场景。 matcher 匹配: 工具名 额外输入字段:PostToolUseFailure
工具调用失败后触发。不可阻断。适用于错误监控、失败重试提示、日志记录等场景。 matcher 匹配: 工具名 额外输入字段:Stop
Agent 完成响应后触发(主 Agent 无待执行的工具调用时)。不可阻断。适用于桌面通知、日志记录、任务状态汇报等场景。当前版本 Stop 事件不支持阻断(即无法通过 exit 2 让 Agent 继续工作)。该能力计划在下个版本中支持。
场景示例
拦截危险命令
在 Agent 执行 shell 命令前检查是否包含危险操作,如rm -rf、DROP TABLE 等。
脚本 ~/.qoder/hooks/block-dangerous.sh:
PreToolUse,matcher Bash,command ~/.qoder/hooks/block-dangerous.sh。
写文件后自动 Lint
每次 Agent 写入或编辑文件后,自动执行 lint 检查。 脚本${project}/.qoder/hooks/auto-lint.sh:
PostToolUse,matcher Write|Edit,command .qoder/hooks/auto-lint.sh。
工具失败时记录日志
当 Agent 调用的工具执行失败时,自动记录到日志文件,便于排查问题。 脚本~/.qoder/hooks/log-failure.sh:
PostToolUseFailure,无 matcher(匹配所有工具),command ~/.qoder/hooks/log-failure.sh。
Agent 完成后桌面通知
Agent 完成任务后弹出系统通知,适合长时间运行的任务。 脚本~/.qoder/hooks/notify-done.sh(macOS):
Stop,无 matcher,command ~/.qoder/hooks/notify-done.sh。
Prompt 内容审查
在用户提交 Prompt 时,检查是否包含敏感信息(如密码、密钥等),防止意外泄露。 脚本~/.qoder/hooks/check-prompt.sh:
UserPromptSubmit,无 matcher,command ~/.qoder/hooks/check-prompt.sh。
完整配置示例
以下是一个包含所有五种事件的完整配置:注意事项
- 超时处理: Hook 脚本默认超时 30 秒。超时后脚本将被终止,按放行处理。自定义超时时间将在下个版本中支持。
- 错误处理: 脚本异常退出(exit code 非 0 且非 2)时,错误信息显示给用户,Agent 流程不受影响继续执行。
- 脚本权限: 确保脚本具有可执行权限(
chmod +x)。 - 配置合并: 多级配置文件中的同一事件 Hook 按优先级从低到高依次执行,任一 Hook 返回阻断(exit 2)则终止后续执行。
- jq 依赖: 示例脚本依赖
jq命令行工具来解析 JSON。请确保系统已安装 jq(macOS:brew install jq,Linux:apt install jq)。