Имя `.pm.json` пережило плагин `av-dev-pm` на два месяца и указывало в пустоту. Правило, которое из этого вынуто: имя служебного файла — имя плагина, который его завёл, и по нему же владельца узнают. - `docs/.pm.json` → `docs/.docs.json`, запись 13 журнала. Прежнее имя docs.py не читает намеренно: по этому числу upgrade решает, какие записи применять, и два дома разъехались бы молча ровно там, где это дороже всего. Вместо совместимости — узнавание: check видит старый файл и печатает готовую git mv - у каталога задач появилась своя версия формата — ключ `tasks` в `.tasks.json`, свой журнал версий и своё повышение. До сих пор её не было вовсе, хотя docs.py в комментарии уверенно на неё ссылался: описание опережало механику ровно так, как сказано в решении 195 - число своё, а не копия канонического: плагин ставится в одиночку, и у проекта без docs/ версии канона нет — сверять было бы не с чем - конфиг задач стал обязательным (init и adopt apply пишут его всегда), check сверяет число, `check --fix` его не приписывает: приписанное объявляло бы каталог приведённым к формату, шагов которого никто не делал - переезды 11 и 12 в новый журнал задним числом не переписаны — версия 1 велит догнать формат по журналу канона, называя признаки отставания поимённо (каталог в docs/tasks/, живой SPRINT.md) - запись 60 в DECISIONS со следствиями 200–203; отдельно разведено с решением F, где `.docs.json` отвергался как указатель путей: отвергнут был указатель, а не имя
60 lines
4.8 KiB
Markdown
60 lines
4.8 KiB
Markdown
# Граница между плагинами
|
||
|
||
**Это дом.** Правило обращения к соседнему плагину нужно всем, кто зовёт чужой
|
||
скилл, — а таких скиллов больше половины всех, и ни один плагин правилом не
|
||
владеет. (Числа здесь нет намеренно: оно уже дважды протухало за один день.) Поэтому дом стоит снаружи, а плагины везут **копии**, помеченные
|
||
разметкой `copies.py`.
|
||
|
||
Правится **здесь**. Копия, поправленная у себя, — расхождение, а не правка.
|
||
|
||
Дом заведён по замеру, а не на всякий случай. К моменту раскола правило стояло в
|
||
пяти местах в пяти редакциях:
|
||
|
||
| Где стояло | Довод | Ветка «не разрешился» |
|
||
| --- | --- | --- |
|
||
| `task-pipeline` | устаревшая проектная копия | нет |
|
||
| `task-batch` | то же | нет |
|
||
| `review-pipeline` | вшито в пункт про удаление проектных копий | нет |
|
||
| `openspec` | путём в чужое дерево — никогда | есть |
|
||
| `canon` | — | есть |
|
||
|
||
Имена с тех пор изменились — `task-pipeline` стал `resolve`, `review-pipeline` —
|
||
`review`, `task-batch` удалён, — но замер относится к местам, а не к названиям.
|
||
|
||
Два разных довода, и ни в одном месте не было обоих. Три места из пяти молчали о
|
||
том, что делать, когда вызов не разрешился, — то есть о единственном, ради чего
|
||
правило и написано.
|
||
|
||
**Что в дом не идёт: чем оборачивается отсутствие конкретного соседа.** «Нет
|
||
`av-dev-tasks` — учёт остаётся владельцу» знает только конвейер; «нет конвейера —
|
||
`docs.py` о каталоге `openspec/` молчит» знает только канон. Правило общее,
|
||
последствие местное, и держать последствия здесь значило бы завести дом, который
|
||
знает про всех своих потребителей.
|
||
|
||
<!-- дом: граница-плагинов -->
|
||
|
||
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
|
||
месте.
|
||
|
||
**Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, `av-dev-tasks:tasks`,
|
||
`av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
|
||
из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
|
||
|
||
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
|
||
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
|
||
откроет чужую установку. Нужен чужой справочник — зови владеющий им скилл, он
|
||
прочитает его сам.
|
||
|
||
**Вызов не разрешился — плагина в проекте нет.** Это исход, а не поломка: назови
|
||
строкой доклада, чего теперь не делает никто, и продолжай работу. Молчать нельзя,
|
||
пропуск неотличим от сделанного; выдумывать обходной путь нельзя тоже.
|
||
|
||
**Присутствие узнаётся вызовом или следом в проекте, но не объявлением.** Перечня
|
||
установленных плагинов проект не ведёт — он разошёлся бы с действительностью
|
||
молча. Что сосед здесь работал, видно по заведённому им файлу: `docs/.docs.json` —
|
||
канон, `<каталог задач>/.tasks.json` — задачи, `openspec/config.yaml` — конвейер.
|
||
Имя файла — имя плагина, который его завёл, и держит он в том числе версию своего
|
||
формата: у канона документов и у каталога задач они свои и двигаются порознь.
|
||
|
||
<!-- /дом: граница-плагинов -->
|