Продвинутая функция

Hooks: Создайте свой рабочий процесс

Встраивайте пользовательскую логику на каждом этапе вызова инструментов Claude Code — форматирование, тестирование, проверка безопасности — всё автоматизировано

#Hooks #Automation #ClaudeCode #CI/CD

Что такое Claude Code Hooks?

Hooks — система событий Claude Code, позволяющая запускать пользовательские скрипты до и после вызова инструментов. Автоматический запуск линтеров, выполнение тестов, оповещения при доступе к конфиденциальным файлам — всё без ручного вмешательства.

Настройка состоит из трёх уровней: событие, фильтр matcher для инструментов и ваш скрипт во внутреннем массиве hooks. Скрипт читает JSON события из stdin и отвечает кодом выхода: 0 — нет возражений, 2 блокирует вызов там, где это разрешено. Ниже четыре частых события, а не весь список из справки; для них хук command отменяется по умолчанию через 600 секунд (проверено 2026-09-22).

Пользователь
Отправляет запрос
Точка перехвата
Проверка перед запуском, может заблокировать
Запуск инструмента
Лишь затем выполняется инструмент

Типы хуков

Хуки Claude Code покрывают узлы жизненного цикла — вызовы инструментов, сессию, компакцию — и принимают обработчики трёх видов: command, http и agent

PreToolUse: до вызова

Срабатывает перед выполнением — валидация параметров, проверка прав, автоматическое одобрение или отклонение

"PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command" }] }]

PostToolUse: после вызова

Срабатывает после выполнения — автоформатирование, запуск тестов, отправка уведомлений

"PostToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command" }] }]

Notification: при уведомлении

Срабатывает при уведомлениях Claude Code — интеграция со Slack, email и другими каналами

"Notification": [{ "matcher": "permission_prompt", "hooks": [{ "type": "command" }] }]

Stop: когда ответ завершён

Срабатывает при завершении ответа Claude Code — логирование или очистка

"Stop": [{ "hooks": [{ "type": "command", "command": "~/scripts/on-stop.sh" }] }]

Три практичных сценария автоматизации

Все три примера ниже построены одинаково: выбираете событие, сужаете его фильтром matcher и помещаете скрипт во внутренний массив hooks. Фрагменты показывают только замысел, а поля и вложенность берите из официальной справки; нужные для проверки данные приходят в JSON на stdin.

1

Форматирование перед коммитом

Когда Claude собирается выполнить git commit, PreToolUse сначала передаёт аргументы вашему скрипту. Скрипт узнаёт команду коммита, запускает форматирование и отвечает кодом выхода: 0 разрешает вызов, 2 блокирует. Всё происходит до выполнения, поэтому при блокировке рабочее дерево не меняется.

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "command": "if echo \"$TOOL_INPUT\" | grep -q 'git commit'; then npm run format; fi"
    }]
  }
}
2

Уведомление после тестов

PostToolUse срабатывает только после успешного возврата команды, поэтому скрипт узнаёт pytest или npm test и отправляет уведомление на рабочий стол. Завершённый вызов уже не отменить, а при ошибке событие молчит, значит уведомление говорит о готовности результата, а не о том, что тесты прошли.

{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Bash",
      "command": "if echo \"$TOOL_INPUT\" | grep -q 'pytest\\|npm test'; then notify-send 'Tests completed'; fi"
    }]
  }
}
3

Запрет на изменение секретов

Навесьте 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 результат отдаётся с идентификатором сессии и метаданными, удобно разбирать скриптом.

Пример неинтерактивного вызова в CI
# Запуск ревью в неинтерактивном режиме: JSON, максимум 5 ходов
claude -p "Review this PR and suggest improvements" \
  --output-format json \
  --max-turns 5

Пример настройки settings.json

Определите хуки в .claude/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

Сначала попробуйте, потом решайте

Не уверены, какой тариф выбрать? Начните со «Стартового» ($8.57/мес), а при апгрейде остаток старого тарифа вернётся на баланс.