另一个有用的钩子
除了本课程中讨论的 PreToolUse和 PostToolUse钩子之外,还有更多钩子类型:
-
• Notification- 当 Claude Code 发送通知时运行,这发生在 Claude 需要使用工具的权限时,或者在 Claude Code 空闲 60 秒后 -
• Stop- 当 Claude Code 完成响应时运行 -
• SubagentStop- 当子代理(在 UI 中显示为"任务")完成时运行 -
• PreCompact- 在压缩操作发生之前运行,无论是手动还是自动
这里是令人困惑的部分:
-
1. 命令的标准输入会根据执行的钩子类型( PreToolUse、PostToolUse、Notification等)而改变 -
2. 其中包含的 tool_input会根据调用的工具而不同(在PreToolUse和PostToolUse钩子的情况下)
例如,这是钩子的标准输入样本,其中钩子是监视 TodoWrite工具使用的 PostToolUse。作为参考,这是 Claude 用来跟踪待办事项的工具。
{
"session_id": "9ecf22fa-edf8-4332-ae85-b6d5456eda64",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "PostToolUse",
"tool_name": "TodoWrite",
"tool_input": {
"todos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
},
"tool_response": {
"oldTodos": [],
"newTodos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
}
}
作为对比,这是 Stop钩子输入的示例:
{
"session_id": "af9f50b6-f042-4773-b3e2-c3a4814765ce",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "Stop",
"stop_hook_active": false
}
*如你所见,命令的标准输入会根据钩子类型(PreToolUse、PostToolUse、Stop等)以及使用的匹配器(在 PreToolUse和 PostToolUse的情况下)而显著不同。这会使编写钩子变得困难 - 你可能不知道命令输入的确切结构!*
为了处理这个挑战,建议使用这样的钩子:
"PostToolUse": [ // 或者 "PreToolUse" 或 "Stop" 等
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "jq . > post-log.json"
}
]
},
]
注意提供的命令。它会将此钩子的输入写入 post-log.json文件,这允许你检查确切的内容,了解会输入到你的命令中!这使你更容易理解命令应该检查什么数据。

