Bug: PreToolUse Hook 的 permissionDecision 协议未生效
环境
-
OS: macOS (Darwin 23.4.0, arm64)
-
Qoder 版本: 当前最新版
-
Hook 配置位置:
.qoder/settings.json
Hook 配置
json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": ".qoder/hooks/block-sensitive-ops.sh"
}
]
}
]
}
}
问题描述
Hook 脚本通过 stdout 输出 permissionDecision: "ask" 并以 exit 0 退出时,Qoder 并未弹出确认对话框,而是直接放行了命令执行。
复现步骤
-
配置 PreToolUse hook,脚本对
git commit命令输出以下 JSON 到 stdout 并 exit 0:json{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"ask","permissionDecisionReason":"git commit 需要人工确认,是否允许执行?"}} -
让 Agent 执行
git commit --allow-empty -m "test" -
命令直接执行成功,未出现任何确认提示
预期行为
根据文档,permissionDecision: "ask" 应弹出确认框让用户决定是否允许执行。
实际行为
Qoder 忽略了 stdout 输出的 permissionDecision,命令直接执行。
对比测试
| 方式 | exit code | 结果 |
|---|---|---|
| stderr + exit 2 | 2 | 拦截生效 |
stdout JSON permissionDecision: "ask" + exit 0 |
0 | 未生效,直接放行 |
结论
当前版本只识别 exit code 2(阻断),不支持 stdout permissionDecision 协议(ask / deny / allow)。