Hooks — автоматизация
Хуки запускают shell-команды при событиях Claude Code: до и после правки файлов, до и после задачи, при сабмите промпта. Так агент сам форматирует код, гоняет линтер и тесты.
Типы хуков
| Хук | Когда срабатывает | Типичное применение |
|---|---|---|
PreToolUse | Перед вызовом инструмента (Edit, Write, Bash) | Блокировать опасные команды, валидация ввода |
PostToolUse | После успешного вызова инструмента | Автоформат, линтер, запуск тестов |
Stop | Когда агент завершает ответ | Финальная проверка сборки, уведомление |
UserPromptSubmit | При отправке промпта пользователем | Инъекция контекста, проверка политики |
Notification | Событие уведомления (агент ждёт ввода) | Звук, push, сообщение в мессенджер |
Пример: автоформат после правки
Хук PostToolUse форматирует только что изменённые файлы. Выбери свой стек — команда подстроится. Выбор запоминается.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "vendor/bin/pint $CLAUDE_FILE_PATHS" }
]
}
]
}
}
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "black $CLAUDE_FILE_PATHS && ruff check --fix $CLAUDE_FILE_PATHS" }
]
}
]
}
}
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "php -l $CLAUDE_FILE_PATHS && vendor/bin/phpcbf $CLAUDE_FILE_PATHS" }
]
}
]
}
}
Частые ошибки
Хук вообще не запускается
Проверь путь: хуки читаются из .claude/settings.json в корне проекта (или из глобального ~/.claude/settings.json). Имя события чувствительно к регистру — PostToolUse, не posttooluse.
Бесконечный цикл правок
Если PostToolUse сам меняет файл (форматтер), он может снова стриггерить событие. Используй matcher поуже и убедись, что форматтер идемпотентен — второй прогон не меняет файл.
Команда «висит»
Интерактивные команды ждут ввода и блокируют агента. Добавляй неинтерактивные флаги (--no-interaction, --force) и держи таймаут хука разумным.
Тихий фейл
Скрипт упал, но вернул код 0 — агент думает, что всё ок. Начинай shell-хуки с set -e и возвращай ненулевой код, чтобы Claude Code увидел ошибку.