Харнес-слой поверх пола §1B: ловит правки мимо навыков-мутаторов. - support-guard.mjs (PreToolUse Edit|Write|MultiEdit) — §1A: блокирует сырую правку объекта поставщика «на замке» / read-only конфы; реакция deny|warn|off из .v8-project.json editingAllowedCheck, идентично §1B. - skill-suggester.mjs (PostToolUse Read|Grep|Glob|Edit|Write|MultiEdit) — ненавязчивая подсказка профильного навыка, throttle 1×/сессия/группа, не блокирует; флаг skillSuggester (on|off). - common/: support-state.mjs (порт декодера bin 1:1 из Assert-EditAllowed), project.mjs (реакция из .v8-project.json), object-class.mjs (карта путь→навык с различением cf/cfe и mxl/скд по нюху корня). - test/run.mjs: 38 standalone-тестов на корпусе cfsrc + синтетике. - plugin.json: hooks → ./hooks/hooks.json (авто-загрузка в плагине). §1C (грубый Bash-гейт) отброшен — дублирует §1B, формат bin заморожен. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.0 KiB
Hooks: guardrail поддержки + суфлёр навыков
Харнес-хуки Claude Code, усиливающие защиту типовых конфигураций 1С на поддержке. Это бонус-слой поверх пола безопасности (гард §1B внутри навыков-мутаторов + видимость состояния в info-навыках), который едет всеми каналами установки. Хуки ловят то, что навыки не видят — правки мимо навыков.
Хуки — фича только Claude Code. На других платформах (Cursor/Codex/…) их нет; там работает переносимый пол §1B. Поэтому хуки — усиление, а не замена.
Что внутри
| Файл | Событие | Назначение |
|---|---|---|
support-guard.mjs |
PreToolUse Edit|Write|MultiEdit |
§1A: блокирует сырую правку объекта поставщика «на замке» / read-only конфигурации мимо навыков. |
skill-suggester.mjs |
PostToolUse Read|Grep|Glob|Edit|Write|MultiEdit |
Ненавязчиво подсказывает профильный навык 1С, когда модель работает с исходниками напрямую. Не блокирует. |
common/support-state.mjs |
— | Декодер Ext/ParentConfigurations.bin + правило G/f1 (канон; зеркало гарда §1B). |
common/project.mjs |
— | Чтение реакции из .v8-project.json. |
common/object-class.mjs |
— | Карта путь→навык (с различением cf/cfe и mxl/скд). |
test/run.mjs |
— | Standalone-тесты на корпусе cfsrc + синтетике. |
Рантайм — Node.js 18+ (как и для /web-test). Скрипты рантайм-независимы (не зависят от PS/Python-порта навыков).
Поведение
Гард (§1A). Срабатывает по наличию Ext/ParentConfigurations.bin (walk-up от пути правки). Реакция —
из .v8-project.json, поле editingAllowedCheck:
deny(по умолчанию) — блокирует (permissionDecision: deny) с диагностикой (безопасные пути:cfe-*,support-edit, осознанное снятие с поддержки);warn— пропускает с предупреждением;off— выключено.
Раскладка: глобальный дефолт + переопределение на запись базы (databases[].editingAllowedCheck). Читается
идентично гарду §1B внутри навыков.
Суфлёр. Поле skillSuggester (on по умолчанию | off). Подсказывает не чаще 1×/сессия/группа навыков,
мягкой формулировкой, через additionalContext (видит модель). Молчит на коде модулей (*.bsl), нераспознанных
путях и при off.
Установка
Плагин (рекомендуется) — автоматически
.claude-plugin/plugin.json декларирует "hooks": "./hooks/hooks.json". При включении плагина хуки
подключаются сами, пути резолвятся через ${CLAUDE_PLUGIN_ROOT}. Ничего настраивать не нужно.
Копия папки / switch.py — вручную (опт-ин)
Эти каналы не несут хуки автоматически (копируется только .claude/skills/, а settings.json не переносится).
Чтобы включить:
- Скопируйте каталог
hooks/в проект, например в<проект>/.claude/hooks/. - Добавьте в
<проект>/.claude/settings.json(проектный, неsettings.local.json):
{
"hooks": {
"PreToolUse": [
{ "matcher": "Edit|Write|MultiEdit",
"hooks": [{ "type": "command",
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/support-guard.mjs\"" }] }
],
"PostToolUse": [
{ "matcher": "Read|Grep|Glob|Edit|Write|MultiEdit",
"hooks": [{ "type": "command",
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/skill-suggester.mjs\"" }] }
]
}
}
Тесты
node hooks/test/run.mjs
Прогоняет декодер/гард/суфлёр на корпусе cfsrc (bp G=1 → deny, erp K=0 → allow) и на синтетических
фикстурах (test-tmp/, gitignored; корпус не трогается). Все ветки: per-object f1=0/1/2, warn/off,
throttle, слепые пятна, cf/cfe, mxl/скд.