скиллы: doc-canon стал canon, версия раскладки поднята до 2

- каталог скилла и все вызовы переименованы: префикс `doc-` называл материал,
  а скилл занят формой — раскладкой всех частей проекта и общим повышением
  версии, включая каталог задач;
- README перестроен: `canon` вынесен из семейства документов отдельным блоком
  и отдельным узлом графа, правило префиксов переформулировано, у документов
  уточнено владение — содержимым, а не раскладкой;
- заведена запись 2 журнала версий: в проекте ничего не переехало, но путь к
  `docs.py` и имя вызова живут в гейте и в `CLAUDE.md` проекта и сломаются
  молча;
- прежние адреса в записи 1 и в журнале решений оставлены как есть: журнал
  описывает состояния, которые были, и задним числом не переписывается.
This commit is contained in:
av
2026-08-13 12:53:12 +03:00
parent 3529cd8425
commit dff05ad097
34 changed files with 149 additions and 102 deletions
+5 -5
View File
@@ -1,6 +1,6 @@
---
name: task-track
description: Ведение задач и целей как каталога markdown-файлов (одна запись = один файл в items/ + строка в одном из индексов). У каждой записи есть тип (goal, feature, fix, chore, research), и тип решает, каких разделов она требует и что с ней можно делать. Заведение записи из диалога, разбор находок аудита/ревью, декомпозиция на независимо полезные части, штурм сырья, гигиена полей и проверка согласованности индексов. Использовать, когда просят добавить задачу/идею/цель, превратить находки ревью в задачи, разбить задачу, проработать идею, поправить формат или проверить беклог. Каталог отстал от версии раскладки — это скажет tasks.py check, а повышает проект скилл av-dev:doc-canon по общему журналу версий. Расстановка приоритетов и разбор накопившегося — скилл av-dev:task-groom. Не реализует задачи — этим занимается скилл решения задачи.
description: Ведение задач и целей как каталога markdown-файлов (одна запись = один файл в items/ + строка в одном из индексов). У каждой записи есть тип (goal, feature, fix, chore, research), и тип решает, каких разделов она требует и что с ней можно делать. Заведение записи из диалога, разбор находок аудита/ревью, декомпозиция на независимо полезные части, штурм сырья, гигиена полей и проверка согласованности индексов. Использовать, когда просят добавить задачу/идею/цель, превратить находки ревью в задачи, разбить задачу, проработать идею, поправить формат или проверить беклог. Каталог отстал от версии раскладки — это скажет tasks.py check, а повышает проект скилл av-dev:canon по общему журналу версий. Расстановка приоритетов и разбор накопившегося — скилл av-dev:task-groom. Не реализует задачи — этим занимается скилл решения задачи.
---
# Задачи
@@ -511,7 +511,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
Формат каталога задач меняется, и проект должен знать, к какой версии он
приведён. Число живёт ключом `version` в `.av-dev.toml` в корне репозитория,
журнал версий — [журнал скилла `doc-canon`](../doc-canon/references/changelog.md),
журнал версий — [журнал скилла `canon`](../canon/references/changelog.md),
сверяет их `tasks.py check`: отстало — строка расхождения, ушло вперёд — устарел
плагин. Обратной совместимости нет: есть «приведён» и «не приведён».
@@ -521,7 +521,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
половины проектов нет. Плагин один — довод ушёл, а два числа оставляли бы
вопрос, по какому журналу повышать.
**Повышает проект скилл `av-dev:doc-canon`, операция `upgrade`** — он идёт по
**Повышает проект скилл `av-dev:canon`, операция `upgrade`** — он идёт по
журналу, двигает число и зовёт этот скилл там, где запись касается задач. Здесь
повышения нет намеренно: две операции, двигающие одно число, разъезжаются на
первом же проекте, где прошла только одна из них.
@@ -580,7 +580,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
**одним проходом вместе с починкой перекрёстных ссылок**, а не по одному слагу.
Если переводить надо не только задачи, а весь `docs/` — это скилл
`av-dev:doc-canon`, и он зовёт этот сценарий сам на своём шаге.
`av-dev:canon`, и он зовёт этот сценарий сам на своём шаге.
### Декомпозиция и штурм сырья
@@ -685,7 +685,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
- **Каталог задач — `tasks/` в корне, жёстко**, и `--dir` передаётся явно всегда:
раскладка канона одинакова во всех проектах, и искать больше нечего. Каталога
нет — код 3 и вопрос человеку; `init` заводит его **только** когда проект
действительно новый, а перевод чужой раскладки делает `av-dev:doc-canon`.
действительно новый, а перевод чужой раскладки делает `av-dev:canon`.
У скрипта поиск вверх по дереву ещё жив — он для непереведённых проектов, и
полагаться на него скилл не должен: молча найденный чужой каталог это дрейф.
- **Версия и настройки живут в `.av-dev.toml` в корне репозитория** — версия
+2 -2
View File
@@ -5,8 +5,8 @@
после неё проект живёт скиллами `task-track` и `task-groom`.
**Это часть приведения проекта к канону.** Раскладку `docs/` целиком ведёт скилл
`av-dev:doc-canon`; он же зовёт этот сценарий на шаге «каталог задач», потому что
форматом задач владеет `task-track`, а не `doc-canon`. Отдельно сценарий вызывается,
`av-dev:canon`; он же зовёт этот сценарий на шаге «каталог задач», потому что
форматом задач владеет `task-track`, а не `canon`. Отдельно сценарий вызывается,
когда переводить надо **только** задачи.
Вход какой угодно: старая раскладка `av-dev-backlog` (индекс `README.md`,
+5 -5
View File
@@ -11,7 +11,7 @@
называется ключом `[tasks] dir`. Каталог принадлежит этому скиллу, а не канону
документов: учёт работ ведут и в проекте, который к канону не приведён. Имена
частей и **версия раскладки** живут в `.av-dev.toml` в корне; журнал версий —
references/changelog.md скилла doc-canon.
references/changelog.md скилла canon.
tasks/
items/ задачи и цели файлами, <slug>.md
@@ -503,7 +503,7 @@ def _validate_config(data: dict, path: Path) -> dict:
if "plan" in unknown:
raise Env(f"{path}: ключ «plan» переименован в «roadmap»,"
f" а PLAN.md — в ROADMAP.md. Повысь проект скиллом"
f" av-dev:doc-canon (upgrade), а не правь ключ в одиночку:"
f" av-dev:canon (upgrade), а не правь ключ в одиночку:"
f" файл и ссылки на него переезжают вместе с ним")
if unknown:
known = sorted({*DEFAULTS, DIR_KEY})
@@ -582,10 +582,10 @@ def version_problems(lay: Layout) -> list[str]:
if legacy:
return [f"нет {path}, а прежняя раскладка на месте"
f" ({', '.join(legacy)}): перенеси настройки и удали старые"
f" файлы операцией upgrade скилла av-dev:doc-canon"]
f" файлы операцией upgrade скилла av-dev:canon"]
return [f"нет {path} — версия раскладки не объявлена."
f" Заведи файл с «{VERSION_KEY} = {LAYOUT_VERSION}» (журнал"
f" версий — references/changelog.md скилла av-dev:doc-canon)"]
f" версий — references/changelog.md скилла av-dev:canon)"]
# Что число целое, уже проверил общий читатель — иначе сюда не дошли бы
# вовсе (код 3). Здесь `isinstance` значит ровно «ключ есть».
got = conf.version(lay.full)
@@ -595,7 +595,7 @@ def version_problems(lay: Layout) -> list[str]:
elif got < LAYOUT_VERSION:
out.append(f"проект приведён к раскладке версии {got}, текущая —"
f" {LAYOUT_VERSION}: нужно повышение по журналу"
f" (скилл av-dev:doc-canon, операция upgrade)")
f" (скилл av-dev:canon, операция upgrade)")
elif got > LAYOUT_VERSION:
out.append(f"проект приведён к раскладке версии {got}, а скрипт знает"
f" {LAYOUT_VERSION}: устарел плагин, обнови маркетплейс")