К содержимому
Claude Code с 0:полный курс
Уровень 2 · Настраиваем под себя 7 мин Проверено автором · 12 окт. 2026 г. Сверено с Claude Code v2.1.287 · 12 окт. 2026 г.

Хуки: правило, которое нельзя забыть

Правило в CLAUDE.md — совет, который Claude может упустить. Хук — твоя команда, которую Claude Code запускает в заданный момент всегда. Хук PreToolUse с кодом выхода 2 блокирует действие ещё до проверки разрешений.

Уровень 2 · 0 / 4 уроков0%

Ты пишешь в CLAUDE.md: «никогда не правь package-lock.json». Claude следует этому почти всегда. Но «почти» — это и есть проблема: правило в памяти — совет, который модель может упустить в длинной сессии.

работает иначе. Это твоя команда, которую Claude Code запускает в заданный момент сессии всегда — что бы Claude ни решил.

События хуков

Хук привязывается к событию. Главные из них:

СобытиеКогда срабатывает
SessionStartпри старте сессии
UserPromptSubmitкогда ты отправил запрос
PreToolUseперед каждым вызовом инструмента
PostToolUseпосле успешного вызова инструмента
Stopкогда Claude закончил отвечать
Notificationкогда Claude Code нужно твоё внимание

Сегодня нас интересует PreToolUse — хук, который может остановить действие.

Как PreToolUse блокирует

Перед вызовом инструмента Claude Code запускает твой скрипт и передаёт ему на вход JSON с описанием события — например, какой файл собираются править. Дальше решает код выхода:

  • 0 — всё в порядке, действие идёт дальше;
  • 2 — вызов заблокирован, а то, что скрипт напечатал в stderr, уходит Claude как причина.

Claude видит объяснение — например, «Blocked: package-lock.json защищён» — и меняет план.

Важная деталь: PreToolUse срабатывает до проверки режима разрешений. Поэтому блок держится в любом режиме, даже в Auto.

Регистрация хука

Хуки описываются в файле настроек, рядом с правилами из прошлого уровня:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/protect-files.sh", "args": [] }
        ]
      }
    ]
  }
}
  • matcher выбирает инструменты: Edit|Write — только правки и запись файлов;
  • ${CLAUDE_PROJECT_DIR} подставляет путь к проекту, чтобы хук находился откуда угодно;
  • с "args": [] скрипт запускается напрямую, без оболочки, и путь не нужно брать в кавычки.

Внутри сессии /hooks покажет, какие хуки подхватились.

Скрипт можно проверить без Claude: передай ему JSON, который прислал бы Claude Code, и посмотри код выхода.

echo "{\"tool_input\":{\"file_path\":\"$PWD/package-lock.json\"}}" | .claude/hooks/protect-files.sh; echo "exit $?"

Ожидаешь exit 2 — значит, хук сработает и в сессии.

Мини-проверка

Хук на Edit|Write защищает .env. Claude выполнил команду echo X >> .env. Остановит ли его хук?

Осторожно

Хуки выполняются с правами твоего пользователя: в интерактивной сессии — после того как ты доверил папку, а в claude -p — без всякого вопроса. Прежде чем доверять чужому репозиторию или запускать в нём Claude из скрипта, прочитай его хуки.

Практика в терминале

Создай папку .claude/hooks и скрипт protect-files.sh, затем зарегистрируй его в .claude/settings.json на событие PreToolUse с matcher Edit|Write. В тренажёре это запись настроек — в настоящем проекте сам скрипт решает, блокировать ли правку.

Проверь себя

Отвечено 0/3
Режим:

Чем хук отличается от правила в CLAUDE.md?

Как хук PreToolUse блокирует действие?

Блокирует ли PreToolUse-хук действие в режиме Auto?

Выполни задание в терминале и ответь на вопросы, чтобы завершить урок.

📝 Мои заметки

Сохраняется автоматически в этом браузере · видно на странице «Заметки».

ЗаданиеПодсказки придут сами, если застрянешь

Защити файлы от правок: зарегистрируй хук PreToolUse, который срабатывает на инструменты Edit и Write и запускает скрипт .claude/hooks/protect-files.sh.

Tab дополнить · ↑ прошлые · Ctrl+L очистить · help команды

  • Не выполнено: Скрипт хука лежит в .claude/hooks
  • Не выполнено: Хук зарегистрирован на событие PreToolUse
  • Не выполнено: Хук следит за Edit и Write

Вопросы и ответы по уроку

Чем хук отличается от правила в CLAUDE.md?

Хук срабатывает детерминированно, на событии, без участия модели. Это правило, которое невозможно «забыть».

Как хук PreToolUse блокирует действие?

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

Блокирует ли PreToolUse-хук действие в режиме Auto?

Хук PreToolUse выполняется раньше проверки режима. Поэтому он надёжнее настроек режима: его не обойти переключением Shift+Tab.

Хук на Edit|Write защищает .env. Claude выполнил команду echo X >> .env. Остановит ли его хук?

Matcher Edit|Write ловит только инструменты редактирования. Для команд нужен отдельный хук с matcher Bash или хук на Stop, который проверяет рабочее дерево.

Листай уроки клавишами ← → · поиск по ⌘K