Another useful hook
Помимо хуков PreToolUse и PostToolUse, рассмотренных в этом курсе, существуют и другие хуки:
Notification- Запускается, когда Claude Code отправляет уведомление, что происходит, когда Claude требуется разрешение на использование инструмента или после 60 секунд бездействия Claude Code.Stop- Запускается, когда Claude Code завершил ответ.SubagentStop- Запускается, когда субагент (они отображаются как "Task" в пользовательском интерфейсе) завершил работу.PreCompact- Запускается перед операцией компактирования, будь то ручной или автоматической.UserPromptSubmit- Запускается, когда пользователь отправляет запрос, до того как Claude его обработает.SessionStart- Запускается при начале или возобновлении сессии.SessionEnd- Запускается при завершении сессии.
Что может сбить с толку
Вот что может сбить с толку:
- Входные данные
stdinдля ваших команд будут меняться в зависимости от типа выполняемого хука (PreToolUse,PostToolUse,Notificationи т.д.) - Содержащийся в них
tool_inputбудет отличаться в зависимости от вызванного инструмента (в случае хуковPreToolUseиPostToolUse).
Пример входных данных для хука PostToolUse
Например, вот образец входных данных stdin для хука, где хук — это PostToolUse, который отслеживал использование инструмента TodoWrite. Для справки, это инструмент, который 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
А для сравнения, вот пример входных данных для хука Stop:
{
"session_id": "af9f50b6-f042-4773-b3e2-c3a4814765ce",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "Stop",
"stop_hook_active": false
}
Как вы видите, входные данные stdin для вашей команды будут значительно отличаться в зависимости от хука (PreToolUse, PostToolUse, Stop и т.д.) и используемого matcher (в случае PreToolUse и PostToolUse). Это может усложнить написание хуков — вы можете не знать точную структуру входных данных для вашей команды!
Создание вспомогательного хука
Чтобы справиться с этой проблемой, попробуйте создать вспомогательный хук следующим образом:
"PostToolUse": [ // Or "PreToolUse" or "Stop", etc
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "jq . > post-log.json"
}
]
},
]
Обратите внимание на предоставленную команду. Она запишет входные данные для этого хука в файл post-log.json, что позволит вам точно проверить, что было бы передано вашей команде! Это значительно упрощает понимание того, какие данные должна проверять ваша команда.