Hooks: Создайте свой рабочий процесс
Встраивайте пользовательскую логику на каждом этапе вызова инструментов Claude Code — форматирование, тестирование, проверка безопасности — всё автоматизировано
Что такое Claude Code Hooks?
Hooks — система событий Claude Code, позволяющая запускать пользовательские скрипты до и после вызова инструментов. Автоматический запуск линтеров, выполнение тестов, оповещения при доступе к конфиденциальным файлам — всё без ручного вмешательства.
Настройка состоит из трёх уровней: событие, фильтр matcher для инструментов и ваш скрипт во внутреннем массиве hooks. Скрипт читает JSON события из stdin и отвечает кодом выхода: 0 — нет возражений, 2 блокирует вызов там, где это разрешено. Ниже четыре частых события, а не весь список из справки; для них хук command отменяется по умолчанию через 600 секунд (проверено 2026-09-22).
Типы хуков
Хуки Claude Code покрывают узлы жизненного цикла — вызовы инструментов, сессию, компакцию — и принимают обработчики трёх видов: command, http и agent
PreToolUse: до вызова
Срабатывает перед выполнением — валидация параметров, проверка прав, автоматическое одобрение или отклонение
PostToolUse: после вызова
Срабатывает после выполнения — автоформатирование, запуск тестов, отправка уведомлений
Notification: при уведомлении
Срабатывает при уведомлениях Claude Code — интеграция со Slack, email и другими каналами
Stop: когда ответ завершён
Срабатывает при завершении ответа Claude Code — логирование или очистка
Три практичных сценария автоматизации
Все три примера ниже построены одинаково: выбираете событие, сужаете его фильтром matcher и помещаете скрипт во внутренний массив hooks. Фрагменты показывают только замысел, а поля и вложенность берите из официальной справки; нужные для проверки данные приходят в JSON на stdin.
Форматирование перед коммитом
Когда Claude собирается выполнить git commit, PreToolUse сначала передаёт аргументы вашему скрипту. Скрипт узнаёт команду коммита, запускает форматирование и отвечает кодом выхода: 0 разрешает вызов, 2 блокирует. Всё происходит до выполнения, поэтому при блокировке рабочее дерево не меняется.
{
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"command": "if echo \"$TOOL_INPUT\" | grep -q 'git commit'; then npm run format; fi"
}]
}
}
Уведомление после тестов
PostToolUse срабатывает только после успешного возврата команды, поэтому скрипт узнаёт pytest или npm test и отправляет уведомление на рабочий стол. Завершённый вызов уже не отменить, а при ошибке событие молчит, значит уведомление говорит о готовности результата, а не о том, что тесты прошли.
{
"hooks": {
"PostToolUse": [{
"matcher": "Bash",
"command": "if echo \"$TOOL_INPUT\" | grep -q 'pytest\\|npm test'; then notify-send 'Tests completed'; fi"
}]
}
}
Запрет на изменение секретов
Навесьте PreToolUse на Edit и Write: скрипт берёт целевой путь из stdin и возвращает код 2, если имя совпадает с .env, credentials и подобным. Запись отклоняется до изменения файла, поэтому откатывать нечего. Значение matcher Edit|Write закрывает оба инструмента сразу.
{
"hooks": {
"PreToolUse": [{
"matcher": "Edit|Write",
"command": "if echo \"$TOOL_INPUT\" | grep -qE '\\.env|credentials|secrets'; then exit 2; fi"
}]
}
}
Headless-режим и CI/CD
Запуск Claude Code в CI/CD-конвейерах с флагом -p для автономных задач
Флаг -p: неинтерактивный режим
Добавьте флаг -p (или --print) к любой команде claude, чтобы выполнить запрос без интерактивного режима и получить результат в конце.
Встраивание в CI
Неинтерактивный режим читает stdin и пишет результат в stdout; код выхода 0 означает успех, и скрипты сборки могут на него реагировать.
Структурированный вывод JSON
Флаг --output-format задаёт вид ответа: в формате json результат отдаётся с идентификатором сессии и метаданными, удобно разбирать скриптом.
# Запуск ревью в неинтерактивном режиме: JSON, максимум 5 ходов
claude -p "Review this PR and suggest improvements" \
--output-format json \
--max-turns 5
Пример настройки settings.json
Определите хуки в .claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "~/scripts/pre-bash-hook.sh"
},
{
"matcher": "Edit|Write",
"command": "~/scripts/protect-sensitive-files.sh"
}
],
"PostToolUse": [
{
"matcher": "Bash",
"command": "~/scripts/post-bash-hook.sh"
}
],
"Notification": [
{
"command": "~/scripts/send-notification.sh"
}
],
"Stop": [
{
"command": "~/scripts/on-stop.sh"
}
]
}
}
Практика написания хуков
Эти четыре пункта опираются на справочник Hooks в документах Claude Code, включая раздел о безопасности; проверено 2026-09-22. Здесь о том, как писать сами скрипты, а форма конфигурации — в разделе про settings.json выше.
Блокировка кодом выхода 2
В справочнике сказано: для большинства событий хуков только код выхода 2 блокирует сам по себе, любой другой код — неблокирующая ошибка, и действие продолжается. Скрипту, который соблюдает политику, нужно возвращать exit 2.
Точная настройка matcher
Поле matcher фильтрует срабатывания. Имя совпадает точно, а значение с прочими символами читается как регулярка JavaScript без якорей: в примере Edit.* попадает и на Edit, и на NotebookEdit, для всей строки добавляйте якоря.
Тайм-аут — не блокировка
Claude Code снимает хук по тайм-ауту и отбрасывает вывод: на большинстве событий решения не будет. В справочнике отмечено, что на PreToolUse такой command-хук вызов не остановит, а на PreModelSwitch остановит переключение. Детали выполнения пишутся в debug-лог.
Входные данные — недоверенные
В перечне по безопасности: не доверять входным данным вслепую, переменные оболочки брать в кавычки, проверять пути на ../ и обходить чувствительные файлы вроде .env или .git. На вход хуку приходит JSON, и в поля может попасть что угодно извне.
Частые вопросы
Откуда скрипт хука берёт входной JSON?
Хук-команда получает JSON через stdin. Общие поля — session_id, transcript_path, cwd, hook_event_name, а дальше каждое событие добавляет свои: у событий инструментов это tool_name и tool_input.
Как заставить хук заблокировать вызов инструмента?
Привяжите скрипт к PreToolUse и возвращайте код выхода 2, когда пускать нельзя: в таблице PreToolUse помечен как блокируемый, код 2 останавливает вызов. Альтернатива — JSON с permissionDecision. Код 1 не блокирует почти ничего.
Что будет, если хук не успеет за отведённое время?
Хук по тайм-ауту отменяется, вывод отбрасывается: решения просто нет, и лишь PreModelSwitch блокируется. Ошибка в пути к скрипту — тоже неблокирующая, и в справочнике советуют поймать это сообщение при первом запуске policy-хука.
В каком файле хранят конфигурацию хуков?
Область зависит от места определения: ~/.claude/settings.json — все проекты, только на этой машине; .claude/settings.json — один проект, его можно коммитить; .claude/settings.local.json — тоже один проект, и он уходит в gitignore, когда Claude Code сохраняет туда настройку.
Корпоративная автоматизация с QCode.cc
Комбинируйте платформа разработчиков QCode.cc с системой хуков для корпоративных AI-конвейеров
Подключение через шлюз: ANTHROPIC_BASE_URL
В официальном справочнике переменных Claude Code сказано, что ANTHROPIC_BASE_URL может направить запросы к прокси или шлюзу; на сайте QCode есть гайд по такой настройке (проверено 2026-09-22).
Сначала тормоза, потом автоматизация
Прежде чем автоматизировать — поставьте тормоза: официальный пример показывает скрипт, который сверяет путь со списком защищённых паттернов и кодом выхода 2 блокирует правку чувствительных файлов.
Одна настройка на всю команду
В официальной таблице размещения хуков сказано, что .claude/settings.json можно коммитить в репозиторий; в паре с общим командным ключом QCode поведение хуков у всех будет одинаковым.
QCode также поддерживает OpenAI Codex / GPT-5.6
Баланс плана QCode единый для Claude Code и OpenAI Codex CLI — без двойной оплаты.
Автоматизируйте рабочие процессы Claude Code
Раскройте полный потенциал AI-кодирования с Hooks + QCode.cc
Обновлено 2026-09-22