Hook — автоматическое действие на событие жизненного цикла
Расширенный разбор hook: события, argv, детерминированность, побочные эффекты и откат.
- component
- hook

`hook`

hook — действие, привязанное к событию жизненного цикла харнесса: до запуска tool, после записи, перед отправкой prompt или в другой момент, который харнесс действительно документирует.
Hook отвечает на вопрос: что должно выполниться автоматически, когда происходит это событие?
Он не отвечает «какой именованный shortcut набрать?» (), «как агент должен делать этот класс задач?» () и «какое постоянное правило агент должен помнить?» ().
Hook — самый чувствительный из восьми видов: он может менять состояние, пока пользователь смотрит на что-то другое.
Соседи
| Вид | Главное отличие |
|---|---|
command | command стартует, когда его вызывает человек или агент; hook стартует на событии |
skill | skill ждёт, пока его выберут для задачи; hook не ждёт |
instruction | instruction — текст; hook — действие |
plugin | plugin может содержать каталог hooks; сам hook остаётся видом hook |
mcp | MCP — интерфейс tool; hook — не сервер протокола |
agent | agent — роль; hook — не subagent |
setting | setting хранит параметры; hook хранит событие и handler |
Выбирайте hook, когда проверка на этом событии должна быть неизбежной. Выбирайте command, когда работу должен начать человек. Выбирайте instruction, когда достаточно напоминания прозой.
Рекомендуемая структура пакета
Handler hook должен быть непосредственно запускаемым после установки. --language — python, typescript, javascript или dart-flutter. Rust и Go отклоняются: provider не делает скрытую сборку исходников.
Переносимый нативный layout — манифест hooks.json плюс handler. Авторский каталог также держит source/hook.json (событие, порядок, блокирующий failure, handler). discover / adopt переносят source/ для portable и projections/<harness>/ для конкретного харнесса, а не всё дерево.
pre-tool-check/ # component-scaffold/3
├── .ai-stp-template.json
├── .gitignore
├── README.md
├── component-passport.json
├── eval-profile.json
└── source/
├── hook.json
└── hooks/
└── handler.pyai-stp component scaffold plan \
--type hook \
--language python \
--harness portable \
--name pre-tool-check \
--output ./pre-tool-check \
--json
ai-stp component scaffold apply \
--type hook \
--language python \
--harness portable \
--name pre-tool-check \
--output ./pre-tool-check \
--expected-plan-digest <digest> \
--json--language rust и --language go для этого вида отклоняются закрыто.
Adopt принимает путь, который discovery уже назвал. У каталога должен быть манифест из закрытого набора. hooks.json входит в этот набор. Каталог hook внутри plugin — один компонент: он включает манифест и соседние scripts в детерминированный артефакт. Scripts во время discovery не запускаются.
Команды ai-stp component hook validate нет. Структурная готовность — component passport validate. Kind-specific проверка по спецификации есть только у .
Стандарты и фреймворки
Независимой спецификации hook, сравнимой с Agent Skills Specification или с MCP, нет. Каждый харнесс документирует свои события.
Ссылайтесь на layout_source из ai-stp component discover --json, когда классификация неясна. Не угадывайте путь соседа и не считайте обычный src/hooks/useFoo.ts или бизнес-webhook hook'ом харнесса — unsupported в матрице не становится эвристикой по имени файла.
NVIDIA SkillSpector и Cisco Skill Scanner — сканеры skill. Они не проверяют hooks.
Нативные layout по харнессам
Discovery сообщает только объявленные layout. Точные пути на машине даёт ai-stp component discover --json. У каждой находки есть layout_source. Если классификация неясна, покажите это поле; не угадывайте путь соседа.
Из матрицы discovery:
| Харнесс | Global | Project | Что есть в контракте discovery |
|---|---|---|---|
| Claude Code | нет top-level ячейки | нет top-level ячейки | манифест-backed: hooks/hooks.json внутри plugin, доказанного .claude-plugin/plugin.json |
| Codex | нет | да | только .codex/hooks.json или hooks/hooks.json внутри plugin, доказанного .codex-plugin/plugin.json |
| Pi | нет | нет | hook layout не объявлен |
| OpenCode | нет | нет | hook layout не объявлен |
| Grok Build | да | да | ограниченный нативный каталог hook |
| Cursor | не выдумывается из соседнего каталога | не выдумывается из соседнего каталога | официальная схема plugin называет hooks; walker не изобретает их из соседнего каталога |
| Antigravity | да | да | |
undefined | переносимые соглашения | переносимые соглашения | это не харнесс; автоматическая установка не считается безопасной |
Project plugin pack Claude Code доказывается только точным .claude-plugin/plugin.json. Внутри этого pack discovery читает hooks/hooks.json как один hook-компонент.
Cursor pack доказывается .cursor-plugin/plugin.json. Walker не создаёт находку hook из соседнего каталога hooks/, который дерево не несёт.
ai-stp component discover --root . --json
ai-stp toolchain harness-capabilities --jsonВерсии — `X.Y`, не SemVer
Опубликованная версия hook неизменяема и имеет вид X.Y. Патч-номера нет. Изменение события, matcher или handler — новая версия. Обновление hook внутри сетапа — новая версия сетапа.
ai-stp component version list --id <stable_id> --json
ai-stp component version release --id <stable_id> --json--major открывает следующую мажорную линию. Мажорная линия — отдельная граница доступа.
Что проверяет `ai_stp`
Процент карточки каталога и разделение обязательных и необязательных проверок объяснены на странице Проверки безопасности. Для hook ожидайте как минимум:
- структуру, digest, лицензию, tags, исходный репозиторий;
- ограниченную распаковку и path denylist;
- сканирование секретов (
secrets_heuristicи Gitleaks, если включён); - правила prompt-injection и скрытого содержимого;
hook_schema_staticиhook_command_argv(схема, argv);- языковой SAST и SCA, когда есть scripts и lockfiles.
Пройденное сканирование снижает известный риск. Это не гарантия, что handler безвреден. Обязательные проверки, которые провалились или не смогли запуститься, блокируют публикацию.
Перед установкой также смотрите:
| Проверка | Почему важно |
|---|---|
| Событие | человек должен суметь назвать, когда оно срабатывает |
| Действие | одна фраза; если сказать нельзя — не включайте |
| Отключение / rollback | hook, который нельзя выключить, не MVP-безопасен |
| Кто автор | verified-автор не делает handler автоматически безопасным |
Какой X.Y закреплён | обновление hook создаёт новую версию сетапа |
| Линия доверия | experimental требует явного согласия |
author_verified и component_verified независимы. Ни одно не является гарантией безопасности.
Связанные команды CLI
Только команды, которые существуют. Флаги всегда со страниц CLI и всегда --json. Исполняемый файл — ai-stp (пакет ai-stp-cli). Команд component inspect и setup show нет. Единственный kind-specific validate — ai-stp component skill validate.
Именно этот вид: команды component hook validate нет. Используйте проверку паспорта.
ai-stp component passport validate --id <stable_id> --jsonАвтор, adopt, публикация:
ai-stp component discover --root . --json
ai-stp component adopt --path <source_path> --json
ai-stp component passport validate --id <stable_id> --json
ai-stp component version release --id <stable_id> --json
ai-stp publication plan --id <stable_id> --version 1.0 --json
ai-stp publication confirm --plan-id <id> --plan-hash <hash> --confirm --jsonНайти, выбрать, установить:
ai-stp registry search --kind component --query <name> --json
ai-stp select eligibility --harness <id> --json
ai-stp install plan --jsonHook может быть embedded-членом compose-манифеста. См. Сетапы.
Как hook проходит через `ai_stp`
=== "Автор" Автор публикует hook из публичного GitHub-источника или импортирует его локально. Версия закрепляет точный commit и подпуть. Discovery никогда не исполняет handler.
=== "Каталог" Каталог показывает событие, поддерживаемые харнессы, ограничения, trusted status автора и независимый status самого компонента.
=== "Сборщик" Сборщик проверяет, что харнесс поддерживает это событие жизненного цикла и что handler можно спроецировать для provider.
=== "Provider" Provider пишет нативную конфигурацию hook только после плана, digest и подтверждения. Затем status должен показать hook, его источник и как его отключить.
Красные флаги
- Обычный React-каталог
src/hooks/, классифицированный как hook харнесса. - Каталог
hooks/рядом с Cursor plugin, выданный за hook, хотя walker этот layout не изобретает. - Codex hooks где угодно, кроме
.codex/hooks.jsonилиhooks/hooks.jsonвнутри доказанного пакета.codex-plugin/plugin.json. - Scaffold с
--language rustили--language go. - Handler'ы, которые скачивают и pipe'ят в shell.
- Живые токены, закрытые ключи или тела
.envв пакете. - Нет документированного способа отключить или откатить hook.
- Линия доверия
experimentalбезconsent allow. - Харнесс не в списке совместимости компонента.
- «Latest» или имя ветки вместо точных
X.Yи commit. - Обращение с
author_verifiedкак сcomponent_verified. - Копирование
hooks.jsonв target в обход плана provider.
??? question "Можно ли hook использовать без публикации" Да. Собственный, импортированный или точно закреплённый hook можно использовать после локальных проверок. Он от этого не становится platform-verified и должен быть показан именно как локальный или закреплённый объект (local_owner_or_pinned). Preview, backup и способ выключить его по-прежнему обязательны.
Чеклист автора
- Сделайте scaffold с
--type hookи непосредственно запускаемым--language(python,typescript,javascriptилиdart-flutter). - Держите
hooks.jsonи handler подsource/. Заполнитеsource/hook.json: событие, порядок, блокирующий failure и handler. - Объявите в паспорте, что делает handler, что он читает и как его отключить. Секретов нет.
- Запустите
ai-stp component discover --root . --jsonи прочитайтеlayout_sourceу находки. component adopt --path <точный source_path>.- Закрепите точный публичный GitHub commit и подпуть.
component passport validate→component version release, чтобы выпустить неизменяемыйX.Y.- Публикуйте через путь публикации.
- В сетапе закрепите этот
X.Y. Позднее обновление — новая версия сетапа.
Связанное: Авторство, Компоненты, , .