跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

Hooks 输入输出与退出码

用结构化拒绝和停止控制事件,避免 stdout 污染造成放行。

Hook 从 stdin 读取一个 JSON 输入对象,向 stdout 写最终 JSON 对象,诊断写 stderr。外部脚本、启动提示和调试输出也不能污染 stdout。

通用输入

字段含义
session_id会话标识
transcript_path会话 transcript JSON 的绝对路径
cwd当前工作目录
hook_event_name本次事件名称
timestampISO 8601 时间

每种事件另有专属字段,不能假设每次输入都有 tool_input 或 prompt_response。

常用输出

字段用途
decisionallow 或 deny;block 是拒绝别名
reason拒绝反馈,具体接收者由事件决定
continuefalse 请求停止 Agent 循环,部分观察事件会忽略
stopReason停止时给用户的说明
systemMessage向终端用户显示文字
suppressOutput隐藏内部 Hook 元数据日志与遥测
hookSpecificOutput事件专属改写、上下文等结果

这些是通用能力集合,不表示每个事件都接受全部字段。例如 BeforeToolSelection 不支持 decision、continue、systemMessage。

退出状态

退出码处理
0解析 stdout JSON;包括有意的 deny
2阻止该事件目标,以 stderr 为原因,具体效果随事件变化
其他非致命警告,使用原参数继续

BeforeTool 的 exit 2 拒绝工具但允许 Agent 继续;AfterTool 隐藏结果;AfterAgent 触发重试;BeforeModel/AfterModel 则阻止该轮模型处理。不能把 exit 2 一律写成“退出整个 CLI”。

有意拒绝

{
  "decision": "deny",
  "reason": "The proposed change failed validation."
}

输出合法 JSON 并 exit 0 是官方推荐的结构化拒绝方式。要停止整个循环,使用受该事件支持的 continue false,而不是误用 deny。

解析失败的后果

Hooks 概览说明,stdout 混入普通文本会导致 JSON 解析失败,默认 Allow 并把输出视为 systemMessage。因此通用脚本崩溃或非 JSON 输出不能被当成可靠的安全拦截。部署前分别验证允许、拒绝、解析失败和退出码路径。