PreToolUse Hook 的 permissionDecision 协议不生效

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 并未弹出确认对话框,而是直接放行了命令执行。

复现步骤

  1. 配置 PreToolUse hook,脚本对 git commit 命令输出以下 JSON 到 stdout 并 exit 0:

    json
    
    {"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"ask","permissionDecisionReason":"git commit 需要人工确认,是否允许执行?"}}
    
  2. 让 Agent 执行 git commit --allow-empty -m "test"

  3. 命令直接执行成功,未出现任何确认提示

预期行为

根据文档,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)。

辛苦出现问题,右上角上报下问题报告,发下反馈码,我们分析下日志