Перейти к содержимому

Hooks

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

Хуки могут поступать из трёх источников, которые загружаются одновременно:

ИсточникРасположение файла
Проект.kodik/hooks/hooks.json (или .kodik/hooks/hooks.toml) в корне рабочей директории
Пользователь~/Documents/Kodik/Hooks/hooks.json (или hooks.toml)
Плагинhooks/hooks.json внутри директории установленного плагина

Проектные хуки применяются только к доверенным рабочим директориям. При первом обнаружении файла хуков Kodik предложит подтвердить доверие к проекту.

Быстро создать хук можно с помощью команды /create-hook.

СобытиеКогда срабатываетМатчер
PreToolUseПеред выполнением любого инструментаRegex по имени инструмента
PostToolUseПосле выполнения инструментаRegex по имени инструмента
PermissionRequestПри запросе разрешения на использование инструментаRegex по имени инструмента
SubagentStartПри запуске субагентаRegex по типу агента
SubagentStopПри остановке субагентаRegex по типу агента
SessionStartПри старте или возобновлении сессииRegex по источнику (startup или resume)
PreCompactПеред компактированием контекстаRegex по триггеру (manual или auto)
PostCompactПосле компактирования контекстаRegex по триггеру (manual или auto)
UserPromptSubmitПри отправке пользователем сообщенияМатчер не применяется
StopПри остановке агентаМатчер не применяется

Поле matcher — это строка регулярного выражения, которая проверяется против дискриминатора события:

  • События с инструментами (PreToolUse, PostToolUse, PermissionRequest): проверяется имя инструмента.
  • События субагентов (SubagentStart, SubagentStop): проверяется тип агента.
  • SessionStart: проверяется источник — startup или resume.
  • PreCompact / PostCompact: проверяется триггер — manual или auto.
  • UserPromptSubmit, Stop: матчер игнорируется, хук срабатывает всегда.

Матчер привязывается к началу и концу значения — например, Bash соответствует только инструменту с именем Bash. Чтобы сопоставить несколько инструментов, используйте синтаксис Edit|Write или .*.

{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 audit_tool.py",
"timeout": 10
}
]
}
],
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "echo session started >> ~/kodik-sessions.log"
}
]
}
]
}
}

Каждая запись в массиве события содержит:

  • matcher — необязательная regex-строка (отсутствие означает «всегда совпадает»).
  • hooks — массив обработчиков. Сейчас поддерживается только тип command.
    • command — shell-команда, которую нужно выполнить.
    • timeout — таймаут в секундах (по умолчанию 30, диапазон 1–300).

Хук получает на stdin JSON-объект с информацией о событии:

{
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": { "command": "ls -la" },
"context": { ... }
}

Хук сигнализирует об исходе через код возврата и/или stdout:

Код возвратаЗначение
0Продолжить выполнение
2Заблокировать действие; содержимое stderr становится причиной блокировки

Кроме того, хук может вернуть структурированный JSON в последней непустой строке stdout. Поддерживаемые поля:

ПолеТипОписание
decision"block" | "approve"Явно заблокировать или разрешить действие
reasonstringПричина решения, показывается пользователю
modified_inputobjectИзменённые входные данные инструмента (только для PreToolUse)
modified_promptstringИзменённый текст промпта (только для UserPromptSubmit)
additional_contextstringДополнительный контекст, передаваемый агенту

Пример блокировки с причиной:

{
"decision": "block",
"reason": "Изменения в продакшн-ветке запрещены без код-ревью."
}

Kodik передаёт в хук переменные окружения в зависимости от источника хука:

  • Проектный хук: KODIK_PROJECT_ROOT — путь к корню проекта.
  • Пользовательский хук: KODIK_HOOKS_ROOT — путь к директории пользовательских хуков.
  • Хук плагина: KODIK_PLUGIN_ROOT и KODIK_PLUGIN_ID.

Напечатайте /create-hook в чате и опишите, что должен делать хук. Kodik сгенерирует и сохранит файл хуков в .kodik/hooks/hooks.json вашего проекта (или в глобальную директорию, если вы явно укажете). После создания хука перезагрузите окно IDE или начните новую задачу, чтобы изменения вступили в силу.