Хуки для CLI-агентов: как ИИ-кодерам вставили поводок

Вчера Google выкатил хуки для Gemini CLI. Полгода назад хуки появились в Claude Code. Cursor, Copilot CLI, AWS Kiro — все добавляют то же самое.

Когда все крупные игроки одновременно делают одну фичу — это не совпадение. Это индустрия дозрела до проблемы, которую больше нельзя игнорировать.

Суть проблемы. До сих пор единственный способ управлять ИИ-агентом — написать ему инструкцию. CLAUDE.md, .cursorrules, system prompt. Текст на естественном языке, который агент прочитает и, скорее всего, выполнит.

Скорее всего — ключевое слово.

Вы пишете: «всегда запускай линтер после правки файла». Агент читает. Кивает. Делает в 95% случаев. В оставшихся 5% — решает, что эта инструкция необязательна. Как все мы с техникой безопасности.

Для экспериментов — норм. Для реальной работы — нет. Когда агент коммитит код, деплоит сервисы, редактирует продакшн-файлы — вероятностный контроль не работает. Монитор, который в 1% случаев пропускает что не надо — это не защита. Это иллюзия.

Инструкции — это просьбы. Агент может забыть. Контекст переполнится. Одна инструкция конкурирует с десятком других. У GitButler прямо написано: агенты — это black box. Нажал кнопку → magic happens → результат. Между кнопкой и результатом — ноль контроля.

Хуки — это когда контроль появляется.

Что такое хуки (на пальцах)

Shell-скрипт, который выполняется детерминированно в конкретной точке жизненного цикла агента. Не «попроси ИИ», а «заставь через код».

Агент собирается записать файл → сначала запускается ваш скрипт → скрипт проверяет на API-ключи → нашёл → заблокировал. Без дискуссий.

Агент отредактировал код → автоматически запустился Prettier. Не потому что вы попросили. А потому что хук.

Агент попытался сделать git push в main → хук заблокировал и сказал: «используй feature branch». Точка.

Паттерн не новый. Git hooks, Express middleware, Kubernetes admission webhooks, webpack Tapable — везде одно и то же. Ядро системы делает работу. Extension points позволяют вклиниться в процесс. Просто до CLI-агентов этот паттерн не добрался.

Теперь добрался.

Кто первый и кто догоняет

Claude Code запустил хуки в июне 2025. 14 событий жизненного цикла: перед вызовом инструмента, после, при старте сессии, при остановке агента, при запросе разрешения.

Gemini CLI подтянулся 28 января 2026. 11 событий. Причём в GitHub Issues проекта прямо написано: «хотим как в Claude Code». В индустрии это называется industry standard. В школе — списывание.

Начальная реализация Gemini CLI даже содержала алиасы совместимости с Claude Code — permissionDecision, permissionDecisionReason. Потом убрали, чтобы не тащить чужой технический долг.

Cursor добавил улучшения хуков в январе 2026. GitHub Copilot CLI запустил кастомных агентов с контролем доступа. AWS Kiro получил свои «agent hooks» ещё в июле 2025.

Все сходятся к одному паттерну. Вопрос не «будут ли хуки», а «у кого они лучше».

Топ того, что люди реально настраивают

Не теория. Реальные конфиги из сообщества:

1. Автоформат после каждой правки. PostToolUse + Prettier/ESLint/gofmt. Агент написал код — линтер прошёлся автоматически. Самый популярный use case.

2. Блокировка опасных команд. PreToolUse перехватывает rm -rf, sudo, chmod 777, запись в /etc/. Скрипт заблокировал — агент получил объяснение почему и адаптировался.

3. Сканер секретов. Перед записью файла — regex на API-ключи, пароли, AWS credentials. Есть готовый пример прямо в доке Gemini CLI.

4. Защита main-ветки. Хук видит git push origin main — блокирует. «Используй feature branch». Для тех, кто доверил агенту git.

5. Автоапрув безопасных операций. Claude Code показывает диалог разрешения при каждом действии. Хук на PermissionRequest автоматически одобряет npm test, git status, чтение файлов — и блокирует sudo, git push --force.

6. Загрузка контекста при старте. SessionStart хук подгружает git status, последние коммиты, TODO-файлы. Агент начинает сессию уже в курсе дела.

7. Уведомления в Slack. Notification хук шлёт сообщение, когда агент завис на вопросе. Не нужно сидеть и смотреть в терминал.

8. Принудительное TDD. tdd-guard блокирует изменения в коде, если сначала не написаны тесты.

9. Enforced uv вместо pip. Хук перехватывает pip install и говорит: «используй uv add». Для Python-проектов с правильным тулчейном.

10. Ralph Loop — расширение для Gemini CLI, которое перехватывает остановку агента и заставляет его продолжать. Бесконечный цикл итераций, пока задача не решена.

Gemini CLI vs Claude Code: в чём разница

Не «кто лучше», а «кто в чём сильнее».

Gemini CLI пошёл шире. У них есть три события, которых нет у Claude Code:

— BeforeModel — перехват до отправки запроса в LLM. Можно подменить модель, вставить контекст, вообще подсунуть готовый ответ вместо вызова модели.

— AfterModel — перехват после ответа LLM. Можно отредактировать, отфильтровать, залогировать.

— BeforeToolSelection — фильтрация инструментов до того, как модель выберет. Из 100+ инструментов оставить 15 релевантных для текущей задачи.

Это доступ к самому мотору. Claude Code такого не даёт.

Claude Code пошёл глубже. У них есть:

— Prompt-хуки (type: "prompt") — вместо shell-скрипта решение принимает быстрая LLM (Haiku). Для ситуаций, где логику сложно выразить в bash.

— PermissionRequest — отдельное событие на диалог разрешения.

— SubagentStart / SubagentStop — хуки на субагенты. Если у вас 24 параллельных субагента — это критично.

— UserPromptSubmit — перехват пользовательского ввода до обработки.

— Три решения вместо двух: allow, deny, ask (показать пользователю). Gemini CLI — только allow/deny.

Экосистема плагинов и SDK: Python, TypeScript, PHP, Go.

Грубо: Gemini CLI — конструктор с доступом к мотору. Claude Code — к мотору, коробке передач и бортовому компьютеру.

Эволюция: от промптов к поводку

Вот как менялся контроль над CLI-агентами:

2023-2024: System prompts. Просьба. Работает когда работает.

Начало 2025: CLAUDE.md, .cursorrules. Проектные инструкции. Всё ещё просьба, но уже в контексте проекта.

Июнь 2025: Хуки. Детерминированный код вместо вероятностных инструкций. Первая реальная гарантия.

Октябрь 2025: Плагины. Хуки + скиллы + MCP в одном пакете. Можно распространять как npm-пакет.

Январь 2026: Хуки для субагентов, кастомные агенты, оркестрация.

Каждый шаг — ответ на конкретную проблему предыдущего уровня.

Стив Йегге написал в январе 2026: агенты должны перестать быть «любимыми питомцами» и стать «скотом» — стандартизированным, автоматизируемым, оркестрируемым. Он управляет 20-30 агентами параллельно и упирается именно в отсутствие хуков.

Это тот же путь, что прошёл весь DevOps. Git → git hooks. CI/CD → pipeline hooks. IDE → плагины. Каждый инструмент, который становится инфраструктурой, обрастает extension points.

Что делать прямо сейчас

Если вы используете Claude Code — настройте три хука:

1. PostToolUse → автоформат (Prettier, ESLint, gofmt — что используете)

2. PreToolUse → блокировка rm -rf, sudo, git push --force

3. SessionStart → загрузка git-контекста и TODO

Конфиг лежит в .claude/settings.json. Пример:

{ "hooks": { "PostToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "npx prettier --write $CLAUDE_FILE_PATH" }] }] } }

Если Gemini CLI — аналогичный конфиг в .gemini/settings.json.

Результат — агент, который не может нахулиганить, даже если захочет. Если что.

Еще у меня есть телеграм канал — @illia_martyn. Там разборы SOTA 2026 — что реально работает, без воды.

Начать дискуссию