Hooks 允许在 Qoder CN CLI 的关键节点接入 Agent 的主执行流,同时与 CLI 保持解耦。常见用途包括:工具执行前拦截危险操作、任务完成后发送桌面通知、写文件后自动跑 lint 等。
Hooks 通过 JSON 配置文件定义,不需要修改代码,编辑配置文件即可生效。
以下示例演示如何用 Hook 拦截危险命令——当 Agent 尝试执行
第二步:编辑配置文件
在
第三步:验证效果
启动 Qoder CN CLI,让 Agent 执行包含
Hook 配置从以下三个文件加载,三级配置会被合并执行:
字段说明:
一个事件下可以配置多个 matcher 分组,每个分组可以包含多个 hook 命令。
Hook 脚本通过 stdin 接收 JSON 输入,通过 exit code 和 stdout 输出来控制行为。本节说明所有事件通用的输入输出格式,各事件的额外字段见"支持的事件"。
Hook 脚本通过 stdin 接收 JSON 数据。所有事件都包含以下通用字段:
不同事件会在此基础上附加额外字段(见各事件说明)。用
Hook 通过 exit code 和 stdout 控制行为。exit code 决定基本行为:0 成功,2 阻塞(stderr 内容注入对话,仅对支持阻塞的事件生效),其他值为非阻塞错误。stdout JSON(仅 exit 0 时解析)可为部分事件提供精细控制,具体支持的字段见各事件说明。exit 非 0 时 stdout 被忽略。
Hook 脚本执行时可以使用以下环境变量:
Qoder CN CLI 支持以下 Hook 事件,覆盖会话生命周期的各个阶段。
会话开始时触发。
matcher 匹配: 会话来源
额外输入字段:
会话结束时触发。
matcher 匹配: 结束原因
额外输入字段:
用户提交 Prompt 后、Agent 处理前触发。
额外输入字段:
工具执行前触发。可以阻止工具执行。
matcher 匹配: 工具名(如
阻止工具执行: exit code 2,stderr 内容作为错误返回给 Agent。完整示例见"快速开始"。
工具执行成功后触发。
matcher 匹配: 工具名
额外输入字段:
工具执行失败后触发。
matcher 匹配: 工具名
额外输入字段:
Agent 完成响应后触发(主 Agent,无待执行的工具调用时)。可以阻止 Agent 停止,让其继续工作。
阻止 Agent 停止: exit code 2,stderr 内容作为消息注入对话,Agent 继续工作。
子 Agent 启动和完成时触发。SubagentStop 与 Stop 类似,可以阻止子 Agent 停止。
matcher 匹配: Agent 类型名
额外输入字段:
上下文压缩前触发。
matcher 匹配: 触发方式
额外输入字段:
通知事件触发(权限请求、任务完成等)。
matcher 匹配: 通知类型
额外输入字段:
工具执行需要用户授权时触发。
matcher 匹配: 工具名
额外输入字段:
当 Agent 完成任务或需要授权时,弹出桌面通知。脚本
配置:
每次 Agent 写入或编辑文件后,自动执行 lint 检查。脚本
配置:事件
在 Agent 停止时检查是否还有未完成的任务,如果有则注入消息让 Agent 继续。脚本
配置:事件
快速开始
以下示例演示如何用 Hook 拦截危险命令——当 Agent 尝试执行 rm -rf 时自动阻止。
第一步:创建脚本
~/.qoder-cn/settings.json 中添加:
rm -rf 的命令,Hook 会阻止执行并提示 Agent。
配置
配置文件位置
Hook 配置从以下三个文件加载,三级配置会被合并执行:
配置格式
| 字段 | 必填 | 说明 |
|---|---|---|
type | 是 | 固定为 "command" |
command | 是 | 要执行的 shell 命令 |
timeout | 否 | 超时时间(秒),默认 60 |
matcher | 否 | 匹配条件,不填则匹配所有 |
matcher 匹配规则
matcher 用于过滤 hook 的触发范围,不同事件匹配不同的字段(见各事件说明)。
写法 | 含义 | 示例 |
不填或 | 匹配所有 | 所有工具都触发 |
精确值 | 精确匹配 |
|
| 匹配多个值 |
|
正则表达式 | 正则匹配 |
|
Hook 脚本编写
Hook 脚本通过 stdin 接收 JSON 输入,通过 exit code 和 stdout 输出来控制行为。本节说明所有事件通用的输入输出格式,各事件的额外字段见"支持的事件"。
输入
Hook 脚本通过 stdin 接收 JSON 数据。所有事件都包含以下通用字段:
| 字段 | 说明 |
|---|---|
session_id | 当前会话 ID |
cwd | 当前工作目录 |
hook_event_name | 触发的事件名称 |
jq 解析输入:
输出
Hook 通过 exit code 和 stdout 控制行为。exit code 决定基本行为:0 成功,2 阻塞(stderr 内容注入对话,仅对支持阻塞的事件生效),其他值为非阻塞错误。stdout JSON(仅 exit 0 时解析)可为部分事件提供精细控制,具体支持的字段见各事件说明。exit 非 0 时 stdout 被忽略。
环境变量
Hook 脚本执行时可以使用以下环境变量:
| 变量 | 说明 |
|---|---|
QODER_PROJECT_DIR | 当前项目的工作目录 |
支持的事件
Qoder CN CLI 支持以下 Hook 事件,覆盖会话生命周期的各个阶段。
SessionStart
会话开始时触发。
matcher 匹配: 会话来源
| matcher 值 | 触发场景 |
|---|---|
startup | 新会话启动 |
resume | 恢复已有会话 |
compact | 上下文压缩完成后 |
SessionEnd
会话结束时触发。
matcher 匹配: 结束原因
| matcher 值 | 触发场景 |
|---|---|
prompt_input_exit | 用户退出输入(Ctrl+D 等) |
other | 其他原因 |
UserPromptSubmit
用户提交 Prompt 后、Agent 处理前触发。
额外输入字段:
PreToolUse
工具执行前触发。可以阻止工具执行。
matcher 匹配: 工具名(如 Bash、Write、Edit、Read、Glob、Grep,MCP 工具名如 mcp__server__tool)
额外输入字段:
PostToolUse
工具执行成功后触发。
matcher 匹配: 工具名
额外输入字段:
PostToolUseFailure
工具执行失败后触发。
matcher 匹配: 工具名
额外输入字段:
Stop
Agent 完成响应后触发(主 Agent,无待执行的工具调用时)。可以阻止 Agent 停止,让其继续工作。
阻止 Agent 停止: exit code 2,stderr 内容作为消息注入对话,Agent 继续工作。
SubagentStart / SubagentStop
子 Agent 启动和完成时触发。SubagentStop 与 Stop 类似,可以阻止子 Agent 停止。
matcher 匹配: Agent 类型名
额外输入字段:
PreCompact
上下文压缩前触发。
matcher 匹配: 触发方式
| matcher 值 | 触发场景 |
|---|---|
manual | 用户手动执行 /compact |
auto | 上下文窗口满时自动触发 |
Notification
通知事件触发(权限请求、任务完成等)。
matcher 匹配: 通知类型
| matcher 值 | 触发场景 |
|---|---|
permission | 权限请求通知 |
result | Agent 产出结果通知 |
PermissionRequest
工具执行需要用户授权时触发。
matcher 匹配: 工具名
额外输入字段:
实用场景
桌面通知提醒
当 Agent 完成任务或需要授权时,弹出桌面通知。脚本 ~/.qoder-cn/hooks/notify.sh(macOS):
写文件后自动 Lint
每次 Agent 写入或编辑文件后,自动执行 lint 检查。脚本 ${project}/.qoder/hooks/auto-lint.sh:
PostToolUse,matcher Write|Edit,command .qoder/hooks/auto-lint.sh。
让 Agent 继续工作
在 Agent 停止时检查是否还有未完成的任务,如果有则注入消息让 Agent 继续。脚本 ~/.qoder-cn/hooks/check-continue.sh:
Stop,command ~/.qoder-cn/hooks/check-continue.sh。