Windows 钩子用 commandWindows,别指望 PATH 上的 bash

跨平台钩子保留 command,Windows 另写 command_windows。系统 PATH 上的 bash 经常是 WSL 垫片,跑 Windows 路径会直接 Failed。

钩子的 command 保持 Unix 可移植写法。Windows 运行时只看可选覆盖:

[[hooks.PreToolUse]]
matcher = "^Bash
quot; [[hooks.PreToolUse.hooks]] type = "command" command = "python3 /enterprise/hooks/pre_tool_use_policy.py" command_windows = "py -3 C:\\enterprise\\hooks\\pre_tool_use_policy.py" timeout = 30 statusMessage = "Checking Bash command"

TOML 里 command_windowscommandWindows 都能写;hooks.json 用 camelCase。信任哈希按当前系统选中的那条命令计算。

企业托管钩子还要分目录:Unix 用 managed_dir,Windows 用 windows_managed_dir,脚本本身不会随 Codex 分发。命令写成托管目录下的绝对路径。

原生 Windows 上 bash 常解析到 %LOCALAPPDATA%\Microsoft\WindowsApps\bash.exe(WSL 垫片),它执行不了 C:\... 这种脚本路径,市场插件钩子会全部显示 Failed。不要依赖 PATH 里的 bash:改用 Git Bash 的绝对路径,或直接 commandWindowspy / pwsh。命令钩子可设 async = true 放到后台;SessionEnd 仍强制同步,后台钩子不能拦操作。

仓库钩子不要写相对路径 .codex/hooks/...。从子目录启动时 cwd 会变,用 git rev-parse --show-toplevel 锚定到仓库根。

来源