钩子
钩子是 DSCC 在工具调用前后执行的 shell 命令。在
settings.hooks.PreToolUse[] 和
settings.hooks.PostToolUse[] 中声明(shell
命令数组,config.rs:568–572)。
事件
定义在 crates/runtime/src/hooks.rs:8–21。
| 事件 | 触发时机 |
|---|---|
PreToolUse |
工具执行前 |
PostToolUse |
工具返回后 |
Stdin 载荷
每个钩子从 stdin 读取 JSON(hooks.rs:118–126):
{
"hook_event_name": "PreToolUse",
"tool_name": "bash",
"tool_input": {...},
"tool_input_json": "{...}",
"tool_output": null,
"tool_result_is_error": false
}
环境变量
在钩子运行前设置(hooks.rs:169–178):
| 变量 | 是否出现 |
|---|---|
HOOK_EVENT |
总是 |
HOOK_TOOL_NAME |
总是 |
HOOK_TOOL_INPUT |
总是(JSON) |
HOOK_TOOL_IS_ERROR |
总是 |
HOOK_TOOL_OUTPUT |
仅 PostToolUse |
退出码
来自 hooks.rs:164–213:
| 退出码 | 效果 | stdout 含义 |
|---|---|---|
0 |
放行 | 信息性消息 |
2 |
拒绝 | 拒绝理由 |
| 其他 | 警告并继续 | — |
| 信号 | 警告并继续 | — |
Shell
| 系统 | 调用方式 |
|---|---|
| Unix | /bin/sh -lc(hooks.rs:76–103) |
| Windows | cmd /C(hooks.rs:76–103) |
示例 · 拒绝 rm -rf /
{
"hooks": {
"PreToolUse": [
"if [ \"$HOOK_TOOL_NAME\" = \"bash\" ] && echo \"$HOOK_TOOL_INPUT\" | grep -q 'rm -rf /'; then echo 'refusing rm -rf /' >&2; exit 2; fi"
]
}
}
相关
- config-files.md
settings.hooks的加载来源。 - permissions.md 工具调用的另一道关卡。