Перейти к основному контенту

Хуки Claude Code: практическое руководство по автоматизации рабочего процесса

Узнайте, как работает автоматизация на базе хуков, и начните использовать хуки Claude Code для автоматизации задач вроде тестирования, форматирования и уведомлений.
Обновлено 22 июл. 2026 г.  · 15 мин читать

Изучить с помощью AI

Открыть в ChatGPTОткрыть в ClaudeОткрыть в Perplexity

При работе с Claude Code вы быстро заметите распространённую проблему: он пишет хороший код, но забывает важные шаги — форматирование, запуск тестов, соблюдение правил безопасности. Вам приходится повторять одни и те же напоминания снова и снова. Хуки Claude Code позволяют автоматизировать эти напоминания, автоматически выполняя shell-команды в определённые моменты вашего процесса.

В этом руководстве я покажу, как настроить хуки для форматирования кода, запуска тестов, уведомлений и защиты файлов. Вы создадите систему автоматизации, которая обеспечивает соблюдение ваших стандартов разработки без ручного вмешательства.

Чтобы узнать больше о Claude Code, ознакомьтесь с нашим гайдом по лучшим практикам Claude Code и учебником по Claude Skills. Если вы хотите настроить инструкции на уровне проекта, см. руководство по написанию CLAUDE.md.

Кратко

  • Хуки Claude Code — это shell-команды, которые запускаются автоматически в определённые моменты жизненного цикла Claude Code (до/после вызова инструментов, при старте сессии, при остановке Claude)

  • Их настраивают в .claude/settings.json (проект) или ~/.claude/settings.json (глобально) с помощью JSON с событиями, матчерами и командами

  • Используйте хуки PreToolUse, чтобы блокировать опасные операции до их выполнения (код выхода 2 = блокировка)

  • Используйте хуки PostToolUse для задач очистки, таких как форматирование, линтинг или запуск тестов после того, как Claude написал код

  • Хуки получают JSON-контекст через stdin и сообщают результаты через коды выхода, stdout и stderr

Что такое хуки Claude Code?

Хуки Claude Code — это shell-команды, которые запускаются автоматически при наступлении определённых событий во время вашей AI-сессии кодирования. Представьте их как автоматические триггеры, которые выполняют ваши скрипты в нужные моментыперед тем как Claude запишет файл, после выполнения команды или при отправке вам уведомления.

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

Вот базовый хук, который запускает форматтер кода каждый раз, когда Claude записывает Python-файл:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "python -m black ."
          }
        ]
      }
    ]
  }
}

У этого хука три части: 

  • Событие: PostToolUse (после завершения действия Claude)

  • Матчер: Write (только при записи файлов)

  • Команда: python -m black . (форматировать Python-файлы в текущем каталоге)

Хук получает подробную информацию о том, что только что сделал Claude, через JSON-данные, отправляемые на вход скрипта, поэтому вы можете строить более сложную автоматизацию, реагирующую на конкретные изменения файлов.

Если хотите пойти дальше с автоматизацией Claude Code, наш учебник по Claude Code Routines показывает, как запускать хуки и агентов по расписанию в облаке.

Давайте посмотрим, как создавать хуки с нуля и регистрировать их в Claude Code.

Предварительные требования

Перед началом вам понадобится следующее:

  • Установленный и запущенный Claude Code: Вы должны уверенно пользоваться Claude Code для базовых задач кодирования

  • Знакомство с командной строкой: Хуки запускают shell-команды, поэтому вам нужно уметь писать базовые команды терминала для вашей ОС

  • Текстовый редактор: Вы будете редактировать JSON-конфигурации для настройки хуков

  • Каталог проекта: Проект, где можно безопасно тестировать хуки, не рискуя важной работой

Не обязательно быть экспертом по shell-скриптам, но понимание команд вроде ls, cd и базовых операций с файлами поможет следовать примерам. Если вы новичок в bash или терминале, рекомендую наш курс Introduction to Shell.

Начало работы с хуками Claude Code

Теперь, когда вы понимаете, что такое хуки, давайте настроим вашу первую автоматизацию. Процесс включает выбор подходящего события, конфигурацию простого правила и тестирование базовой команды.

Понимание событий хука

Claude Code предоставляет более 25 событий хука. В таблице ниже — 10 самых часто используемых. Полный список см. в официальной справке по хукам.

PreToolUse и PostToolUse — самые распространённые события. PreToolUse запускается до того, как Claude выполнит действие, вроде записи файла или запуска команды, что делает его идеальным для валидации или блокировки опасных операций. PostToolUse запускается после завершения действия Claude, что подходит для задач очистки — форматирования кода или запуска тестов.

UserPromptSubmit срабатывает, когда вы отправляете подсказку Claude, до её обработки. Это можно использовать для добавления контекста к разговору или проверки, что подсказки соответствуют требованиям.

Notification запускается, когда Claude отправляет вам оповещения, например запрашивает разрешение на выполнение команды или ждёт вашего ввода. PermissionRequest срабатывает, когда Claude Code показывает диалог разрешений, позволяя автоматически одобрять или отклонять запрос от имени пользователя.

Stop и SubagentStop срабатывают, когда Claude заканчивает отвечать, что полезно для финальных проверок или формирования отчётов. Разница в том, что Stop возникает при завершении общего ответа Claude, а SubagentStop — когда инструмент порождает помощника («субагента»), и тот завершает работу.

Оставшиеся события, PreCompact, SessionStart и SessionEnd, отвечают за ситуации жизненного цикла. PreCompact запускается прямо перед тем, как Claude сокращает историю диалога. «SessionStart» срабатывает в начале новой сессии для установки значений по умолчанию, а SessionEnd — при закрытии сессии, позволяя выполнить очистку или финальное отчётность.

Название события

Момент срабатывания

Основные сценарии

PreToolUse

До того, как Claude выполнит действие (например, запись файла, запуск команды).

Валидация действий или блокировка опасных операций.

PostToolUse

После завершения действия Claude.

Задачи очистки, форматирование кода или запуск тестов.

UserPromptSubmit

При отправке подсказки, до начала обработки.

Добавление контекста к диалогу или проверка требований к подсказке.

Notification

Когда Claude отправляет оповещения (например, запрашивает ввод или разрешение).

Обработка системных оповещений и запросов внимания пользователя.

PermissionRequest

Когда отображается диалог разрешений.

Автоматическое одобрение или отклонение запросов от имени пользователя.

Stop

Когда Claude завершает свой общий ответ.

Финальные проверки или составление отчётов по основному ответу.

SubagentStop

Когда порождённый инструментом помощник («субагент») завершает работу.

Финальные проверки именно для активности субагента.

PreCompact

Непосредственно перед сокращением истории диалога.

Управление очисткой диалога и сохранением контекста.

SessionStart

В начале новой сессии.

Инициализация и настройка значений по умолчанию.

SessionEnd

При закрытии сессии.

Финальная очистка или отчёт по окончании сессии.

Понимание матчеров

Матчеры — это фильтры, решающие, какие действия Claude Code запускают хук. Технически это строки, интерпретируемые как регулярные выражения, поэтому можно использовать точные совпадения или более гибкие шаблоны. 

Наиболее полезны простые матчеры вроде Write (срабатывает при записи файла) или Edit (при редактировании содержимого), а также комбинации, например Edit|Write, чтобы охватить несколько действий. 

Можно использовать и префиксные шаблоны, например Notebook.*, чтобы сопоставлять все инструменты, начинающиеся с «Notebook». Если вы хотите, чтобы хук срабатывал на каждое действие, используйте универсальный регэксп .*, пустую строку ("") или оставьте matcher пустым.

Поскольку матчеры чувствительны к регистру и действуют только на имена действий, лучше делать их максимально конкретными. Когда нужен более тонкий контроль (например, ограничить хук определёнными типами файлов), читайте JSON-полезную нагрузку, которую Claude передаёт в хук, и применяйте свои регэкспы или условия там.

Создание первого хука в Claude Code

Claude Code предлагает два способа настройки хуков: через интерактивную команду /hooks или путём прямого редактирования конфигурационных файлов. Начнём с интерактивного подхода — он проще для новичков.

Использование команды /hooks:

  1. Откройте Claude Code и введите /hooks в интерфейсе чата

  2. Выберите событие-триггер (для примера выберите PostToolUse)

  3. Выберите «Add new hook» в меню

  4. Задайте шаблон матчера (введите Write, чтобы нацелиться на запись файлов)

  5. Введите вашу команду:

    • Mac: say "Task complete"

    • Windows: powershell -c [console]::beep()

    • Linux: spd-say "Task complete"

  6. Сохраните конфигурацию и вернитесь к Claude Code, нажав Esc три раза

Команда /hooks автоматически обновит файл настроек и перезагрузит конфигурацию. Её также можно использовать в любой момент, чтобы просмотреть существующие хуки или внести изменения.

Если вам удобнее редактировать конфигурации напрямую, хуки находятся в ~/.claude/settings.json для глобальных настроек, в .claude/settings.json внутри каталога проекта (зафиксируйте в репозитории для общекомандных хуков) или в .claude/settings.local.json для личных хуков, которые по умолчанию добавлены в .gitignore. Для нашего примера выше это будет выглядеть так:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "say 'Task complete'"
          }
        ]
      }
    ]
  }
}

После ручного редактирования файла перезапустите Claude Code или используйте команду /hooks для перезагрузки конфигурации. Теперь каждый раз, когда Claude записывает файл, вы услышите звуковое уведомление.

Тестирование вашего хука

Прежде чем идти дальше, убедитесь, что ваш хук действительно работает:

  1. Попросите Claude написать любой Python-файл (например: «Создай файл hello.py, который печатает hello world»)

  2. Вы должны услышать звуковое уведомление, когда Claude завершит операцию записи

  3. Если ничего не слышно, откройте транскрипт Claude Code, нажав Ctrl-O, чтобы посмотреть сообщения об ошибках

  4. Распространённые проблемы: команда хука не найдена, неверные права на файл или ошибки синтаксиса в конфигурации

Успешный базовый тест сэкономит вам время на отладку при создании более сложных хуков. Если вы только что вручную отредактировали файл настроек, изменили матчер или событие, либо установили новые инструменты, которые хотите использовать в команде хука, полезно заново открыть /hooks или перезапустить Claude для перезагрузки конфигурации.

Эта базовая схема (событие, матчер, команда) — основа любой автоматизации хуков. Её можно расширять, добавляя несколько команд для одновременного запуска при одном и том же событии. Например, вы можете и воспроизводить звук, и делать резервную копию при записи файла Claude. 

Можно также создавать отдельные матчеры для разных инструментов в рамках одного события, чтобы запись файлов вызывала одни действия, а редактирование кода — другие. Все хуки, совпадающие по одному шаблону инструмента, выполняются параллельно. Если вы настроите несколько матчеров для одного события, каждый хук запустится, когда сработает его матчер.

Работа с входными данными хука

Когда Claude Code запускает хук, он передаёт информацию о том, что произошло, через стандартный ввод (stdin) — поток данных, который поступает напрямую в вашу команду при её выполнении. Именно эти данные делают хуки мощными, а не просто случайными скриптами, запускающимися в произвольные моменты. 

Claude Code упаковывает эту информацию в JSON и передаёт её любой настроенной вами команде — будь то простая команда терминала или пользовательский скрипт.

Анатомия входных данных хука

Каждый хук получает JSON-объект с базовыми полями о текущей сессии:

{
  "session_id": "abc123",
  "transcript_path": "/Users/you/.claude/projects/my-project/conversation.jsonl", 
  "cwd": "/Users/you/my-project",
  "hook_event_name": "PostToolUse"
}

Разберём каждый компонент:

  • session_id: идентификатор текущего диалога

  • transcript_path: путь к истории диалога

  • cwd: рабочий каталог

  • hook_event_name: указывает, какое событие сработало

Имея этот контекст, ваши хуки могут принимать разумные решения: отслеживать, какой диалог инициировал действие, при необходимости обращаться к полной истории чата или запускать команды в корректном каталоге.

Вариации ввода по событиям

События инструментов, такие как PreToolUse и PostToolUse, включают дополнительные детали о действии — здесь хуки становятся действительно полезными для автоматизации. В PreToolUse указан tool_input, а в PostToolUse дополнительно — tool_response:

{
  "session_id": "abc123",
  "hook_event_name": "PostToolUse",
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/path/to/file.py",
    "content": "print('Hello world')"
  },
  "tool_response": {
    "filePath": "/path/to/file.py", 
    "success": true
  }
}

Во входных данных хука file_path показывает путь файла, который записывается или редактируется, а content содержит точный текст, который инструмент собирается записать. После выполнения ответ инструмента повторяет конечный filePath (обратите внимание на camelCase), подтверждая, какой файл был затронут, а также флаг success, указывающий, успешно ли завершилась операция. 

Эта подробная информация позволяет хукам реагировать по-разному в зависимости от фактического события. Вы можете форматировать только Python-файлы, делать резервные копии только важных каталогов или отправлять уведомления лишь при изменении определённых типов файлов.

События вроде UserPromptSubmit проще, так как не вовлекают инструменты:

{
  "session_id": "abc123",
  "hook_event_name": "UserPromptSubmit", 
  "prompt": "Write a function to calculate factorial"
}

Учтите, что хуки UserPromptSubmit не используют матчеры в конфигурации. Они срабатывают на все подсказки, а не на операции инструментов. Это делает их идеальными для логирования диалогов, автоматического добавления контекста проекта или проверки подсказок до их обработки Claude.

Практическое чтение входных данных хука

Давайте создадим хук, который логирует каждую пользовательскую подсказку. Это решает проблему потери хода мыслей о том, что вы просили сделать Claude, особенно во время длительных сессий. Сначала — конфигурация хука:

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/log_prompts.py"
          }
        ]
      }
    ]
  }
}

Затем создайте Python-скрипт по пути ~/.claude/log_prompts.py со следующим содержимым:

#!/usr/bin/env python3
import json
import sys
from datetime import datetime

# Read JSON data from stdin
input_data = json.load(sys.stdin)

# Extract information
session_id = input_data.get("session_id", "unknown")
prompt = input_data.get("prompt", "")
timestamp = datetime.now().isoformat()

# Log the prompt
log_entry = f"{timestamp} | Session: {session_id[:8]} | {prompt}\n"
with open("prompt_history.txt", "a") as f:
    f.write(log_entry)

Скрипт читает JSON-данные, которые отправляет Claude Code, и логирует подсказку с контекстом сессии. Это создаёт удобную для поиска историю взаимодействий, которая оказывается бесценной, когда нужно вспомнить, как вы решали задачу несколько недель назад.

Работа с выходными данными хука

После выполнения команды хук должен сообщить Claude Code, что произошло и можно ли продолжать работу в обычном режиме. Этот механизм управления превращает хуки из простых инструментов логирования в мощную автоматизацию рабочего процесса, способную направлять поведение Claude. Это достигается через три канала: стандартный вывод (stdout), стандартный поток ошибок (stderr) и коды выхода.

Каналы вывода и коды выхода

Стандартный вывод (stdout) — это обычный вывод. Например, если вы что-то печатаете, это попадает в stdout. Для большинства хуков он отображается в транскрипте Claude Code при нажатии Ctrl-O, давая запись о том, что сделала ваша автоматизация, не загромождая основной диалог.

Стандартный поток ошибок (stderr) — это сообщения об ошибках. Писать в stderr можно 

  • В Python: print("message", file=sys.stderr) или

  • В командной строке: echo "message" >&2

Ключевое отличие в том, что stderr можно отправить напрямую Claude для автоматической обработки, позволяя ему реагировать на проблемы, выявленные вашими хуками.

Коды выхода подсказывают Claude Code, что делать дальше:

  • Код выхода 0: Успех (показывает stdout пользователю)

  • Код выхода 2: Блокирующая ошибка (отправляет stderr Claude)

  • Другие коды: Неблокирующая ошибка (показывает stderr пользователю, но продолжает работу)

Эта система даёт вам тонкий контроль над тем, когда Claude должен остановиться, продолжить или получить обратную связь о находках вашей автоматизации. Рассмотрим примеры для двух наиболее важных кодов выхода.

Код выхода 0: нормальная работа

Большинство хуков используют код выхода 0, чтобы указать, что всё прошло хорошо. Вот полный хук, который логирует операции с файлами и уведомляет пользователя:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "python3 -c \"import datetime; open('activity.log','a').write('File written: ' + datetime.datetime.now().isoformat() + '\\n'); print('Logged file operation')\""
          }
        ]
      }
    ]
  }
}

Этот хук выполняет две задачи: пишет лог в файл, затем печатает сообщение в транскрипт. Способов сделать это много, но такой подход кроссплатформенный и не зависит от особенностей командной строки.

Поскольку явный код выхода не задан, по умолчанию он равен 0. Напечатанное сообщение появляется в транскрипте Claude Code, подтверждая, что логирование сработало. Этот паттерн идеально подходит для ведения аудита или отслеживания изменений, которые со временем вносит Claude в ваш проект.

Код выхода 2: блокировка с обратной связью

Код выхода 2 отправляет ваше сообщение об ошибке напрямую Claude, позволяя ему автоматически реагировать. Здесь хуки становятся механизмом безопасности, а не просто автоматизацией. Вот хук, блокирующий опасные операции с файлами:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/security_check.py"
          }
        ]
      }
    ]
  }
}

Необходимо создать скрипт проверки безопасности по пути ~/.claude/security_check.py:

#!/usr/bin/env python3
import json
import sys

# Read hook input
input_data = json.load(sys.stdin)
tool_input = input_data.get("tool_input", {})
file_path = tool_input.get("file_path", "")

# Check for dangerous patterns
dangerous_paths = ["/etc/", "/usr/", "production.conf"]
is_dangerous = any(pattern in file_path for pattern in dangerous_paths)

if is_dangerous:
    # Block the operation and tell Claude why
    print(f"Blocked modification of {file_path} - this appears to be a system or production file", file=sys.stderr)
    sys.exit(2)  # Sends stderr message to Claude
else:
    # Allow the operation
    print(f"Approved modification of {file_path}")
    sys.exit(0)  # Shows stdout in transcript

Когда этот хук обнаруживает опасный путь, он завершается с кодом 2. Claude Code отправляет сообщение из stderr Claude, который затем может объяснить вам, почему операция была заблокирована, и предложить альтернативы. Это предотвращает случайный ущерб системным файлам и одновременно информирует Claude о ваших политиках безопасности.

Создание умного хука уведомлений для Claude Code

Давайте создадим улучшенный хук уведомлений, который сочетает обработку входных данных с умным управлением выводом. Он решает проблему шума из нашего исходного хука, который оповещал о каждом изменении файла:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/smart_notify.py"
          }
        ]
      }
    ]
  }
}

Создайте скрипт уведомлений по пути ~/.claude/smart_notify.py:

#!/usr/bin/env python3
import json
import sys
import os
import subprocess

# Read the hook input
input_data = json.load(sys.stdin)
tool_input = input_data.get("tool_input", {})
file_path = tool_input.get("file_path", "")

# Categorize file importance
important_extensions = [".py", ".js", ".ts", ".java", ".cpp"]
config_files = ["Dockerfile", "requirements.txt", "package.json"]

is_code = any(file_path.endswith(ext) for ext in important_extensions)
is_config = any(filename in file_path for filename in config_files)

if is_code:
    # Important: notify and log
    print(f"Code file modified: {os.path.basename(file_path)}")
    subprocess.run(["say", "Code updated"], check=False)  # Mac
    sys.exit(0)  # Show message in transcript
elif is_config:
    # Very important: louder notification
    print(f"Configuration file changed: {os.path.basename(file_path)}")
    subprocess.run(["say", "Configuration updated - review changes"], check=False)
    sys.exit(0)
else:
    # Not important: silent success
    sys.exit(0)

Этот хук читает входные данные, чтобы понять, какой файл был изменён, принимает решения о важности уведомления по типу файла, использует stdout для логирования важных изменений в транскрипт, вызывает разные звуковые оповещения в зависимости от типа файла и всегда завершает работу с кодом 0, так как это информационные, а не блокирующие действия.

Сочетание анализа входа и управления выводом создаёт хук, который ведёт себя разумно по контексту и даёт нужный уровень обратной связи и вам, и Claude Code. Вместо надоедливых оповещений для каждого временного файла вы слышите только о действительно важных изменениях в проекте.

Обратите внимание, что в примере используется команда say, доступная в macOS. В Linux можно использовать notify-send, а в Windows — команду PowerShell для аналогичных уведомлений.

Типичные подводные камни при работе с хуками Claude Code

Несколько вещей, которые чаще всего сбивают с толку в первую неделю работы с хуками:

Вывод из профиля shell ломает хуки. Хуки запускаются в неинтерактивных шеллах, которые читают ваши ~/.zshrc или ~/.bashrc. Если в профиле есть безусловные echo, они добавляют текст к stdout хука и ломают парсинг JSON. Оберните их проверкой на интерактивную сессию:

if [[ $- == *i* ]]; then
  echo "Welcome back"
fi

Хуки Stop могут зациклиться. Хук Stop с кодом выхода 2 заставляет Claude продолжать работу. Если ваш скрипт не проверяет stop_hook_active во входном JSON и не завершает работу, когда он true, вы будете крутиться до таймаута. Всегда добавляйте раннюю проверку.

Матчеры чувствительны к регистру. bash не совпадает с Bash. Используйте точное имя инструмента, как в Claude Code.

Вывод ограничен 10 000 символами. Если хук генерирует больше, лишнее обрежется до внедрения в контекст Claude. Держите stdout кратким и выводите только то, что нужно модели для действий.

Путаница между командными и личными хуками. Хуки в .claude/settings.json общие для команды (фиксируйте их в репозитории). Для личных хуков, которые не нужно делиться, используйте .claude/settings.local.json, он по умолчанию в .gitignore.

Хуки vs. skills: когда что использовать

Хуки и Claude Skills решают разные задачи и лучше всего работают вместе. Skill — это markdown-файл, который обучает Claude чему-то (процедуры, соглашения, шаблоны). Хук — это shell-команда, которая детерминированно применяет правило, независимо от решения Claude.

Различие важно: skill — это рекомендация, которую модель под нагрузкой может проигнорировать; хук срабатывает всегда. Напишите skill, чтобы задокументировать процедуру миграции команды. Напишите хук PostToolUse, чтобы запускать линтер миграций на каждом .sql-файле, который пишет Claude. Skill делает Claude компетентным; хук делает Claude ответственным.

Потребность

Используйте skill

Используйте хук

Процедурные знания, которые Claude подгружает по мере необходимости

Да

Нет

Жёсткое принуждение, которое нельзя пропустить

Нет

Да

Детерминированный запуск каждый раз

Нет

Да

Устойчивость к ошибкам модели

Нет

Да

Продвинутые паттерны для хуков Claude Code

Помимо базовых уведомлений и логирования, хуки помогают решать реальные проблемы рабочих процессов разработки, с которыми команды сталкиваются ежедневно. Вот несколько идей, которые можно адаптировать под свои проекты.

Хорошая новость: вам не обязательно вручную писать эти хуки. Достаточно дать Claude Code одну из идей подсказок ниже вместе со справочником по хукам, и он сгенерирует соответствующий код и JSON для конфигурации.

Каждый из этих паттернов можно настроить под ваши инструменты и процессы. Начните с тех, которые решают самые частые ежедневные боли, а затем расширяйте автоматизацию по мере роста уверенности в разработке хуков.

Продвинутые хуки для безопасности и соответствия

Хуки отлично подходят для обеспечения правил безопасности и стандартов соответствия. Вот четыре варианта использования.

Сканер API-ключей

  • Проблема: Случайная фиксация секретов в систему контроля версий

  • Триггеры: Перед записью любого файла

  • Решение: Сканирование содержимого файлов на наличие API-ключей, токенов и паролей с помощью регулярных выражений

«Создайте Python-скрипт, который читает входной JSON хука, извлекает содержимое файла и с помощью регэкспов обнаруживает распространённые форматы секретов, такие как api_key=, token: или password=.  Для любых подозрительных совпадений выполняйте локальную проверку и никогда не отправляйте «сырые» секреты наружу. 

Отправляйте во внешние API только маскированные фрагменты (например, оставляя по 4 символа префикса/суффикса) или хэши в Anthropic API, чтобы проанализировать подозрительные строки и определить, являются ли они реальными секретами или именами переменных. Завершайте с кодом 2 и передавайте Claude сведения о найденных секретах и безопасных альтернативах».

Контроль заголовков лицензии

  • Проблема: В open-source проектах отсутствуют обязательные лицензионные заголовки в новых файлах

  • Триггеры: Перед записью исходных файлов

  • Решение: Проверка, что новые файлы .py, .js, .java содержат корректный лицензионный текст

«Разберите вход хука, чтобы получить содержимое файла, и проверьте, содержат ли первые 10 строк лицензионный текст, с помощью поиска по строкам. Для более сложной проверки отправьте заголовок файла в Anthropic API, чтобы убедиться, что он содержит корректные уведомления об авторских правах и информацию о лицензии. Блокируйте создание файлов кодом выхода 2 при отсутствии заголовков и предоставьте Claude корректный шаблон лицензии для добавления».

Защита продакшен-файлов

  • Проблема: Случайное изменение критически важных системных конфигураций

  • Триггеры: Перед редактированием файлов в чувствительных директориях

  • Решение: Блокировка изменений /etc/, nginx.conf, database.yml и других важных конфигов

«Извлеките путь к файлу из входного JSON хука и проверьте, соответствует ли он шаблонам вроде /etc/, production.yml или другим критическим именам. Используйте API Claude для анализа пути и определения, является ли это конфигом, который может повлиять на продакшен. Завершайте с кодом 2 и давайте конкретные рекомендации по более безопасным практикам разработки при обнаружении опасных путей».

Оптимизатор изображений

  • Проблема: Большие изображения замедляют приложения и раздувают репозитории

  • Триггеры: После добавления новых изображений

  • Решение: Сжатие PNG/JPEG с сохранением визуального качества

«Разберите вход хука, получите путь к файлу и проверьте по расширению, что это изображение. Запустите инструменты сжатия, такие как imageoptim, или вызовите TinyPNG API для сжатия без потери качества. Запишите результаты сжатия в stdout, чтобы видеть экономию места в транскрипте Claude».

Продвинутые хуки для автоматизации работы с контролем версий

Git-процессы и документация — области, где хуки тоже очень полезны. Рассмотрим несколько идей.

Валидатор веток Git

  • Проблема: Участники команды по ошибке пушат изменения в защищённые ветки

  • Триггеры: Перед любой записью или редактированием файла

  • Решение: Проверка текущей ветки Git и блокировка операций в main/master/production

«Используйте простую bash-команду git branch --show-current, чтобы получить имя текущей ветки, и сравните его со списком защищённых. Если вы на защищённой ветке, завершайте с кодом 2 и отправляйте Claude сообщение об ошибке с объяснением политики защиты веток. Для сложных правил именования веток используйте API Claude, чтобы проанализировать имена и определить соответствие шаблонам защиты».

Умный автокоммит

  • Проблема: Забывают коммитить изменения или пишут слабые сообщения коммитов

  • Триггеры: После любого изменения файла

  • Решение: Автоматическая подготовка и коммит изменений с описательными сообщениями, сгенерированными ИИ

«Прочтите пути изменённых файлов из входа хука, выполните git diff для получения изменений и отправьте дифф в API Claude с просьбой сгенерировать лаконичное сообщение коммита. Используйте сгенерированное сообщение с командами git add и git commit для автоматического коммита изменений. Включайте имена файлов и типы изменений в подсказку к API, чтобы сообщения соответствовали стандартам conventional commits».

Генератор документации

  • Проблема: API-документация рассинхронизируется с изменениями кода

  • Триггеры: После модификации интерфейсных файлов (контроллеры, модели, API)

  • Решение: Автоматический запуск инструментов документации — JSDoc, Sphinx или генераторов OpenAPI

«Проверьте путь изменённого файла, чтобы определить, является ли он API-эндпоинтом, моделью или интерфейсным файлом, с помощью сопоставления шаблонов. Отправьте содержимое файла в API Claude, попросив извлечь изменения API и сгенерировать обновления документации. Запустите соответствующий инструмент (jsdoc, sphinx-build и т. п.) и автоматически закоммитьте обновлённую документацию.

Продвинутые хуки для коллаборации и интеграции процессов

Наконец, хуки помогают держать всю команду в курсе.

Интеграция со Slack

  • Проблема: Команда не узнаёт вовремя о важных изменениях в общем коде

  • Триггеры: Когда отправляются уведомления о значимых операциях

  • Решение: Публикация форматированных сообщений в командных каналах с именами файлов и краткими сводками изменений

«Извлеките информацию о файлах из входа хука и отфильтруйте важные типы, например исходники или конфиги. Используйте API Claude для генерации понятной сводки изменений на основе имён и типов файлов. Отправьте форматированное сообщение в Slack через вебхуки с упоминаниями участников для критичных изменений».

Диспетчер вебхуков

  • Проблема: Ручной запуск CI/CD-пайплайнов задерживает деплой

  • Триггеры: При наступлении конкретных событий (изменения конфигов, модификация файлов деплоя)

  • Решение: Вызов внешних API для запуска сборок, деплоев и прочих процессов

«Сопоставляйте путь изменённого файла с шаблонами вроде Dockerfile, package.json или конфигов деплоя, чтобы определить, нужно ли триггерить CI/CD. Используйте библиотеку requests в Python для вызова вебхуков с заголовками аутентификации и полезной нагрузкой об изменениях. Включайте пути файлов и метаданные изменений в тело вебхука, чтобы внешние системы могли принимать разумные решения о сборке или деплое».

Апдейтер страницы статуса

  • Проблема: Клиенты не знают о технических работах или деплоях

  • Триггеры: При изменении файлов деплоя или инфраструктуры

  • Решение: Обновление страниц статуса сервисов уведомлениями о работах

«Разберите вход хука на предмет изменений инфраструктурных файлов — манифестов Kubernetes или конфигов Terraform — по шаблонам путей. Сгенерируйте сообщения о работах через API Claude на основе типа обнаруженных изменений. Отправьте статусы в сервисы вроде StatusPage.io или PagerDuty через их REST API с нужными типами инцидентов и оценкой длительности».

Уведомитель статуса команды

  • Проблема: Конфликты, когда несколько разработчиков неосознанно работают над одними и теми же фичами

  • Триггеры: При запуске новой сессии Claude Code

  • Решение: Оповещение командных каналов о начале работы над конкретным проектом или компонентом

«Считайте каталог проекта из входа хука и используйте API Claude, чтобы проанализировать недавние файлы или историю git и понять, какая работа ведётся. Отправьте отформатированное сообщение в командные каналы связи с вашим именем, названием проекта и зоной фокуса. Укажите предполагаемую длительность работы и предложите коллегам скоординироваться, если они занимаются связанными фичами».

Заключение

Хуки Claude Code превращают непредсказуемого AI-помощника в автоматизированные процессы, которые запускаются именно тогда, когда это нужно. В этом руководстве вы узнали, как настраивать хуки с помощью интерактивной команды /hooks и ручной конфигурации, как понимать входные JSON-данные для умной автоматизации и управлять поведением Claude через коды выхода и структурированный вывод. 

Мы рассмотрели практические паттерны, включая валидаторы безопасности, блокирующие опасные операции, и умные уведомления, снижающие шум. Эти примеры показывают, как хуки решают реальные задачи разработки, давая вам полный контроль над AI-помощником. Поняв основы, вы сможете строить автоматизацию под конкретные нужды рабочего процесса вашей команды. 

Чтобы узнать больше о работе с AI-инструментами, посмотрите курсы DataCamp Understanding Prompt Engineering, где рассматриваются стратегии промптинга, напрямую связанные с разработкой хуков. Для расширения AI-навыков в программировании попробуйте наш Intermediate ChatGPT, чтобы развить умения, делающие AI-помощников более надёжными партнёрами в вашем процессе разработки.

Частые вопросы по хукам Claude Code

Что такое хуки Claude Code?

Хуки Claude Code — это автоматические триггеры, которые выполняют shell-команды при наступлении определённых событий во время вашей сессии в Claude Code. Они решают проблему, когда Claude пишет хороший код, но забывает важные шаги — форматирование, запуск тестов, проверку безопасности. Вместо того чтобы каждый раз напоминать вручную, хуки автоматизируют эти напоминания, автоматически выполняя команды: например, форматирование Python-кода после того, как Claude его написал, запуск тестов после изменений или блокировку опасных правок чувствительных файлов. Хуки отслеживают вашу сессию, обнаруживают соответствующие события и запускают настроенные команды с доступом к детальному контексту о том, что только что сделал Claude.

Как использовать хуки в Claude Code?

Настроить хуки можно двумя способами. Самый простой — использовать интерактивную команду /hooks в Claude Code, которая проведёт вас через выбор события (например, PostToolUse), шаблона матчера (например, Write для записи файлов) и вашей команды (например, python -m black .). Альтернативно можно вручную отредактировать конфигурацию по пути ~/.claude/settings.json (глобально) или .claude/settings.json (для проекта), определив хуки в JSON. После настройки хуки автоматически подгружаются и активны. Вы можете просматривать, изменять или перезагружать хуки в любой момент, запустив /hooks снова или перезапустив Claude Code.

В чём разница между хуками PreToolUse и PostToolUse?

PreToolUse запускается до выполнения действия Claude (например, записи или редактирования файла), что делает его идеальным для валидации и блокировки опасных операций. Вы можете проверить, что собирается сделать Claude, и при необходимости остановить это, завершив скрипт с кодом 2. Хуки PostToolUse запускаются после завершения действия Claude, что идеально для задач очистки — форматирования кода, запуска тестов или логирования произошедшего. Используйте PreToolUse, когда вам нужен превентивный контроль, и PostToolUse — когда нужна реактивная автоматизация.

Как передать в мой скрипт хука информацию о действиях Claude?

Claude Code отправляет подробную информацию через стандартный ввод (stdin) в формате JSON, содержащую контекст, такой как путь к файлу, записываемое содержимое, ID сессии и т. д. Ваш скрипт хука считывает этот JSON с помощью json.load(sys.stdin) в Python или аналогичных методов в других языках. Этот JSON-пакет позволяет вашему хуку принимать умные решения — например, форматировать только Python-файлы, проверяя расширение, или блокировать изменения в определённых директориях, анализируя путь к файлу.

Что делает код выхода 2 и когда его использовать?

Код выхода 2 сообщает Claude Code, что операцию нужно заблокировать, и отправляет ваше сообщение об ошибке (записанное в stderr) напрямую Claude. Затем Claude может объяснить вам проблему и предложить альтернативы. Используйте код 2 для проверок безопасности (блокировка опасных изменений файлов), валидации соответствия (отсутствие обязательных заголовков) или защитных барьеров (предотвращение коммитов в защищённые ветки). Для информационных хуков, которые никогда не должны блокировать операции, используйте код 0 или другие коды.

Могут ли хуки Claude Code вызывать бесконечные циклы?

Да, хуки Stop могут зациклиться, если обращаться с ними неосторожно. Хук Stop, завершающийся с кодом 2, заставляет Claude продолжать работу. Если ваш скрипт не проверяет stop_hook_active во входном JSON и не завершает работу, когда он true, Claude ответит, снова вызовет хук Stop, снова будет заблокирован — и так по кругу, пока не истечёт таймаут. Всегда добавляйте в начало скриптов Stop проверку этого поля и немедленно возвращайте код 0, когда оно уже активно.

Какие типы хуков поддерживает Claude Code, кроме shell-команд?

Claude Code поддерживает пять типов хуков: command (shell-команды, самый распространённый), http (POST-запрос на URL для интеграций через вебхуки), mcp_tool (вызов инструмента на подключённом MCP-сервере), prompt (отправка подсказки модели Claude для одношаговой оценки) и agent (запуск субагента, который может использовать инструменты для проверки условий). Для большинства случаев хватает хуков типа command. Подробнее — в официальной справке по хукам.

Темы

Изучайте кодирование с ИИ при поддержке DataCamp!

Course

Разработка с помощью ИИ: курс для разработчиков

1 ч 30 мин
8K
Ускорьте кодинг с ИИ — научите своего помощника писать, тестировать и документировать код эффективно.
ПодробнееRight Arrow
Начать Курс
Смотрите большеRight Arrow