mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-17 00:05:17 +03:00
refactor(hooks): предметная диагностика гарда по причине + README для читателя
- support-guard: вместо общего списка всех вариантов — текст под конкретную причину отказа (decideSupport.code: capability-off | locked | not-removed), с подставленным реальным путём и точными командами support-edit. Понятно модели вне контекста: что за состояние и что именно сделать. - support-state: decideSupport возвращает code (дискриминатор причины). - README: переписан для читателя — убраны отсылки к внутренней реализации (§-нумерация, декодер, разбор common/); назначение, установка, настройка (.v8-project.json), что делать при отказе, проверка. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+47
-42
@@ -1,52 +1,35 @@
|
||||
# Hooks: guardrail поддержки + суфлёр навыков
|
||||
# Хуки: защита конфигураций на поддержке + подсказка навыков
|
||||
|
||||
Харнес-хуки Claude Code, **усиливающие** защиту типовых конфигураций 1С на поддержке. Это **бонус-слой
|
||||
поверх пола безопасности** (гард §1B внутри навыков-мутаторов + видимость состояния в info-навыках), который
|
||||
едет всеми каналами установки. Хуки ловят то, что навыки не видят — правки **мимо навыков**.
|
||||
Два хука Claude Code, которые помогают безопасно дорабатывать типовые конфигурации 1С:
|
||||
|
||||
> Хуки — фича только Claude Code. На других платформах (Cursor/Codex/…) их нет; там работает переносимый
|
||||
> пол §1B. Поэтому хуки — усиление, а не замена.
|
||||
- **Защита от правки «на замке».** Если модель пытается напрямую (инструментами `Edit`/`Write`)
|
||||
изменить объект типовой конфигурации, который стоит на поддержке поставщика, правка **блокируется** —
|
||||
иначе она молча сломает будущие обновления вендора. В отказе сразу даётся, что делать дальше под
|
||||
конкретный случай (доработать в расширении или явно разрешить правку).
|
||||
- **Подсказка навыков.** Когда модель работает с исходниками 1С «вручную» (читает сырой XML, ищет по
|
||||
метаданным), хук ненавязчиво напоминает, что для этой задачи есть профильный навык (`meta-info`,
|
||||
`form-edit`, `mxl-*`, `skd-*` и т.п.). Не блокирует, подсказывает не чаще одного раза за сессию на группу.
|
||||
|
||||
## Что внутри
|
||||
Это дополнительный слой поверх проверок, которые уже встроены в сами навыки: навыки-мутаторы и так не дадут
|
||||
испортить объект на поддержке. Хуки добавляют защиту для случаев, когда правят файлы **в обход навыков**.
|
||||
|
||||
| Файл | Событие | Назначение |
|
||||
|------|---------|------------|
|
||||
| `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` + синтетике. |
|
||||
> Хуки — возможность только Claude Code. На других платформах их нет; там работают встроенные в навыки проверки.
|
||||
|
||||
Рантайм — **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`.
|
||||
**Node.js 18+** (тот же, что нужен для `/web-test`). Команда `node` должна быть доступна в PATH.
|
||||
|
||||
## Установка
|
||||
|
||||
### Плагин (рекомендуется) — автоматически
|
||||
`.claude-plugin/plugin.json` декларирует `"hooks": "./hooks/hooks.json"`. При включении плагина хуки
|
||||
подключаются сами, пути резолвятся через `${CLAUDE_PLUGIN_ROOT}`. Ничего настраивать не нужно.
|
||||
### Через плагин — автоматически
|
||||
Если навыки установлены как плагин (`/plugin install 1c-skills@cc-1c-skills`), хуки подключаются сами —
|
||||
настраивать ничего не нужно.
|
||||
|
||||
### Вручную (при установке копированием папки навыков)
|
||||
Копирование `.claude/skills/` хуки не переносит. Чтобы включить их:
|
||||
|
||||
### Копия папки / `switch.py` — вручную (опт-ин)
|
||||
Эти каналы не несут хуки автоматически (копируется только `.claude/skills/`, а `settings.json` не переносится).
|
||||
Чтобы включить:
|
||||
1. Скопируйте каталог `hooks/` в проект, например в `<проект>/.claude/hooks/`.
|
||||
2. Добавьте в `<проект>/.claude/settings.json` (проектный, **не** `settings.local.json`):
|
||||
2. Добавьте в `<проект>/.claude/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -65,12 +48,34 @@
|
||||
}
|
||||
```
|
||||
|
||||
## Тесты
|
||||
## Настройка (`.v8-project.json`)
|
||||
|
||||
Поведение настраивается в файле проекта `.v8-project.json` — глобально и/или по конкретной базе
|
||||
(`databases[].…`, переопределяет глобальное):
|
||||
|
||||
| Поле | Значения | По умолчанию | Что делает |
|
||||
|------|----------|--------------|------------|
|
||||
| `editingAllowedCheck` | `deny` / `warn` / `off` | `deny` | Реакция защиты: блокировать правку объекта на замке / только предупреждать / выключить проверку. |
|
||||
| `skillSuggester` | `on` / `off` | `on` | Включает/выключает подсказки навыков. |
|
||||
|
||||
Источник истины по состоянию поддержки — сама выгрузка конфигурации; `.v8-project.json` лишь настраивает
|
||||
реакцию.
|
||||
|
||||
## Что делать при отказе защиты
|
||||
|
||||
Текст отказа сам подсказывает варианты под конкретную ситуацию. Кратко:
|
||||
|
||||
- **Безопаснее всего** — вести доработку в расширении (навыки `cfe-borrow` / `cfe-patch-method`):
|
||||
состояние поддержки менять не нужно, обновления вендора сохраняются.
|
||||
- **Либо** осознанно разрешить правку через навык `support-edit` (включить редактирование объекта,
|
||||
снять его с поддержки или включить возможность изменения всей конфигурации). Готовую команду под ваш
|
||||
случай печатает сам отказ.
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
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/скд.
|
||||
Прогоняет защиту и подсказку на реальных выгрузках и на временных тестовых данных (в `test-tmp/`, не
|
||||
попадает в git; рабочие выгрузки не затрагиваются).
|
||||
|
||||
Reference in New Issue
Block a user