Используйте hooks для событий, а не для рассуждения
Hook запускается в определённой точке agent loop и подходит для format, audit, policy check или context injection. Он не должен превращаться во второй непрозрачный агент и не заменяет CI или server-side authorization.
Какое событие для какого действия годится - и где предел, - удобно видеть в таблице.
Событие · Практическое действие · Ограничение
- Перед shell/tool - Проверить command, path, domain или риск side effect; Parser должен разбирать структурированный input, а не искать опасное слово наивным regex
- После edit - Запустить formatter или записать audit event; Не запускайте полный suite после каждого символа
- Перед остановкой - Проверить focused test или наличие отчета; Нужен предел повторов, иначе возможен loop
- Начало session - Добавить краткий runtime context; Не выгружайте в context секреты и огромные логи
Различия продуктов здесь имеют значение, и переносить конфиг между ними нельзя. Claude Code настраивает hooks в settings JSON и документирует lifecycle events, включая PreToolUse, PostToolUse и Stop. Cursor хранит project hooks в .cursor/hooks.json, передаёт JSON по stdio и документирует события вроде beforeShellExecution и afterFileEdit. У Codex собственная hook system и trust model - синтаксис берут из текущей документации Codex.
Особое внимание - поведению при отказе.
Проверяйте fail behavior. В текущей документации Cursor command hook с exit code 2 блокирует действие, а прочие ненулевые коды считаются ошибкой hook, и действие по умолчанию продолжается. Если ваша политика должна fail closed, реализуйте и протестируйте именно этот контракт, а не предполагайте его.
И граница безопасности, потому что hook - это исполняемый код.
Hook запускает код. Project hook - исполняемая поверхность репозитория. Нужны trust controls, review изменений конфигурации, минимальные permissions и безопасный parser. Не запускайте hook из недоверенного репозитория вслепую.
События под контролем. Но даже идеальные hooks бесполезны, если среда невоспроизводима - к ней и переходим.