словарь, манифесты, README: одно слово — одна вещь, одно описание — один дом
- «готовность» значила и «запись можно брать», и «что считается сделанным»; второй смысл стал «определением сделанного» — своё же правило про занятое слово запрещало это прямо - «пайплайн» жил в 24 местах вне журналов при том, что DECISIONS фиксирует его уход «целиком»; рабочее имя — конвейер - «чекпоинт» в review значил стадию и проход, в resolve — остановку человеку; слово оставлено за остановкой - у описания плагина было два дома, и три из четырёх уже разошлись. Сведены, и класс закрыт машиной: frontmatter.py сверяет plugin.json с marketplace, гейт разбужен на *.json - README врал про односторонние зависимости и терял healthcheck на диаграмме - перечень агентов в REMAINING отстал на два поколения Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -20,7 +20,9 @@
|
||||
ли документы между собой и с кодом. Зовёт двух агентов на весь канон разом —
|
||||
`doc-consistency` (документы между собой и с openspec) и `doc-code-drift`
|
||||
(факты против кода) — и разбирает урожай порциями. Дорого, поэтому не на
|
||||
каждой задаче; язык документов вычитывает отдельный агент `doc-wording`;
|
||||
каждой задаче. Язык документов вычитывает отдельный агент `doc-wording`, и
|
||||
зовут его не отсюда, а те, кто только что писал текст: `docs`, `init` и
|
||||
`canon`;
|
||||
- `docs` — содержимое канона по ходу разработки: ADR из архивного
|
||||
`design.md`, промоут конвенций, запись в разведку и журнал ревью, чистка
|
||||
архитектуры.
|
||||
@@ -61,7 +63,9 @@
|
||||
Соглашение об именах: имя **плагина** длинное с префиксом `av-dev-`, имена
|
||||
**скилов** внутри — короткие. Вызов выходит вида `/av-dev-<плагин>:<скилл>`.
|
||||
|
||||
Кто кого зовёт (стрелка — вызов через пространство имён, не импорт):
|
||||
Кто кого зовёт. Сплошная стрелка — вызов скилла через пространство имён, не
|
||||
импорт; пунктир — совет позвать, а не вызов. Агенты-проходы в графе не показаны:
|
||||
их зовут скиллы, названные выше.
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
@@ -75,6 +79,7 @@ flowchart TB
|
||||
init["init"]
|
||||
canon["canon"]
|
||||
docs["docs"]
|
||||
hc["healthcheck"]
|
||||
end
|
||||
subgraph tasksp["av-dev-tasks — учёт работ"]
|
||||
direction LR
|
||||
@@ -84,6 +89,11 @@ flowchart TB
|
||||
init --> osp
|
||||
canon --> tasks
|
||||
canon --> osp
|
||||
canon --> hc
|
||||
hc --> tasks
|
||||
docs --> rp
|
||||
rp --> tasks
|
||||
groom -.-> hc
|
||||
opsx["opsx:* — внешний плагин:<br/>explore, propose, apply, archive"]
|
||||
git["av-dev-git: commit"]
|
||||
|
||||
@@ -93,9 +103,14 @@ flowchart TB
|
||||
tp --> tasks
|
||||
```
|
||||
|
||||
Зависимости **односторонние: `av-dev-code` знает про `av-dev-docs` и
|
||||
`av-dev-tasks`, обратно — нет.** Между собой эти двое тоже не связаны жёстко:
|
||||
каждый работает без другого. Как именно зовут соседа и что делают, когда вызов не
|
||||
Зависимости **взаимные, но каждая мягкая**. `av-dev-code` зовёт обоих соседей;
|
||||
обратные вызовы тоже есть — `av-dev-docs:init` и `av-dev-docs:canon` заводят
|
||||
OpenSpec скиллом `av-dev-code:openspec`, `av-dev-docs:docs` берёт у
|
||||
`av-dev-code:review` форму записи журнала дефектов и процедуру промоута,
|
||||
`av-dev-docs:canon` и `av-dev-docs:healthcheck` зовут `av-dev-tasks:tasks`.
|
||||
**Мягкая** значит, что у любого вызова есть ветка «не разрешился»: соседа в
|
||||
проекте нет — вызывающий называет строкой, чего теперь не делает никто, и работу
|
||||
не останавливает. Как именно зовут соседа и что делают, когда вызов не
|
||||
разрешился, — `shared/plugin-boundary.md`: правило нужно большинству скиллов, и
|
||||
ни один плагин им не владеет. То, что нужно нескольким дословно — граница
|
||||
плагинов, язык проектных текстов, словарь сопровождения, — живёт домом в
|
||||
@@ -292,17 +307,17 @@ uv run pyrefly check # типы
|
||||
линтеров, и любой сторонний импорт у него не разрешается. Список запретов —
|
||||
не перечень мира, настоящий страж второй.
|
||||
|
||||
## Проверка фронтматтеров
|
||||
## Проверка фронтматтеров и описаний плагинов
|
||||
|
||||
Фронтматтер читает не человек, а загрузчик: по `name` он разрешает вызов, по
|
||||
`description` решает, звать ли скилл вообще. **Ошибка здесь не выглядит
|
||||
ошибкой** — тем же способом, что и в диаграммах.
|
||||
|
||||
```
|
||||
uv run python scripts/frontmatter.py # 0 в порядке, 1 расхождение, 3 не тот каталог
|
||||
python3 scripts/frontmatter.py # 0 в порядке, 1 расхождение, 3 не тот каталог
|
||||
```
|
||||
|
||||
Ловится три класса:
|
||||
Ловится четыре класса:
|
||||
|
||||
- **двоеточие с пробелом в описании без кавычек.** Для YAML `: ` внутри
|
||||
простого скаляра начинает вложенное отображение, так что «конвейер ревью: гейт,
|
||||
@@ -317,7 +332,13 @@ uv run python scripts/frontmatter.py # 0 в порядке, 1 расхожд
|
||||
[review/SKILL.md](av-dev-code/skills/review/SKILL.md),
|
||||
разделе «Модель по проходу», здесь только её механизация. Держаться вниманием
|
||||
правило не может: цвет ставится один раз при заведении charter'а, а модель
|
||||
потом меняется калибровкой.
|
||||
потом меняется калибровкой;
|
||||
- **описание плагина, разошедшееся между манифестами.** У описания два дома:
|
||||
`<плагин>/.claude-plugin/plugin.json` показывает его установленному плагину,
|
||||
корневой `.claude-plugin/marketplace.json` — тому, кто выбирает, ставить ли.
|
||||
Правят обычно один, и разойтись они успели уже трижды из четырёх. `copies.py`
|
||||
этот класс не берёт: он смотрит markdown, а манифест — json. Отсюда и `*.json`
|
||||
в глобе задачи гейта.
|
||||
|
||||
## Проверка копий правил
|
||||
|
||||
@@ -326,7 +347,7 @@ uv run python scripts/frontmatter.py # 0 в порядке, 1 расхожд
|
||||
говорить. Значит копия допустима, но **дословная и помеченная**:
|
||||
|
||||
```
|
||||
uv run python scripts/copies.py # 0 сошлось, 1 расхождение, 2 разметка, 3 не тот каталог
|
||||
python3 scripts/copies.py # 0 сошлось, 1 расхождение, 2 разметка, 3 не тот каталог
|
||||
```
|
||||
|
||||
Разметка — HTML-комментарии, невидимые в отрендеренном markdown:
|
||||
@@ -429,8 +450,8 @@ python3 scripts/addresses.py # весь репозиторий
|
||||
правдоподобно, диff показывает разумную строку, а рендер падает.
|
||||
|
||||
```
|
||||
uv run python scripts/diagrams.py # весь репозиторий
|
||||
uv run python scripts/diagrams.py A.md B.md # только названные файлы
|
||||
python3 scripts/diagrams.py # весь репозиторий
|
||||
python3 scripts/diagrams.py A.md B.md # только названные файлы
|
||||
# 0 рендерятся, 1 нет, 3 нет mermaid-cli
|
||||
```
|
||||
|
||||
@@ -461,7 +482,7 @@ lefthook run pre-commit # прогнать руками, не коммитя
|
||||
|
||||
| Проверка | Когда идёт | Что смотрит | Сколько |
|
||||
| --- | --- | --- | --- |
|
||||
| фронтматтеры | правка `*.md` | весь репозиторий | миллисекунды |
|
||||
| фронтматтеры | правка `*.md` или `*.json` | весь репозиторий | миллисекунды |
|
||||
| копии правил | правка `*.md` | весь репозиторий | миллисекунды |
|
||||
| адреса документов | **каждый коммит** | весь репозиторий | ~0.07 с |
|
||||
| диаграммы | правка `*.md` | staged-файлы | ~1 с на файл |
|
||||
@@ -472,8 +493,8 @@ Glob разводит две половины: коммит, трогающий
|
||||
диаграмм, а коммит в документы не гоняет линтеры.
|
||||
|
||||
**Судятся staged-файлы, а не рабочее дерево** — гейт обязан проверять то, что
|
||||
уедет в историю, а не то, что случайно лежит рядом на диске. Исключений два, и
|
||||
три, и все про существо, а не про удобство: `copies.py` сверяет копию с домом, а
|
||||
уедет в историю, а не то, что случайно лежит рядом на диске. Исключений три, и
|
||||
все про существо, а не про удобство: `copies.py` сверяет копию с домом, а
|
||||
дом лежит в другом файле, которого в индексе может не быть (список staged дал бы
|
||||
«копии дословны» ровно там, где правка дома их и разошлась); `frontmatter.py`
|
||||
обходит весь репозиторий за сотые доли секунды — экономить тут нечего;
|
||||
|
||||
Reference in New Issue
Block a user