Bootstrap the canonical label set in a repository #7

Closed
opened 2026-08-09 19:08:38 +00:00 by claude · 0 comments
Collaborator

Summary

Скрипт в /tea:sync, который заводит в репозитории полный канонический набор
labels — все type/* и все severity/* — за один прогон, предварительно сверив
то, что в репозитории уже есть.

Spec

skills/issue/references/format.md

Motivation

Сейчас labels появляются побочным эффектом первого push: ensure_labels
(skills/sync/scripts/_gitea.py:233) создаёт ровно те имена, которые
встретились в отправляемых issues. Пока не запушен ни один type/bug, лейбла
type/bug в репозитории нет — отфильтровать по нему в веб-интерфейсе нельзя, и
человек заводит руками свой bug с чужим цветом и без exclusive. Набор
доезжает до репозитория по кускам, месяцами.

Набор конечен и уже описан в доменной таксономии: issue.TYPES (6) и
issue.SEVERITIES (5) — 11 labels, цвета и exclusive для них лежат в
map.LABEL_COLORS / map.label_specs. Значит, это не решение, а прогон:
завести всё сразу при первой работе с трекером репозитория.

Проверка «нет ли уже подобных» нужна не ради идемпотентности имён — по точному
имени ensure_labels и так не дублирует. Нужна ради похожих: bug,
Bug, type: bug, kind/bug. Их нельзя ни трогать, ни считать своими — про
них надо сказать человеку и остановиться, решение о переименовании чужого
лейбла не автоматизируется.

Acceptance criteria

  • есть skills/sync/scripts/labels.py, создающий все type/* и
    severity/* из доменной таксономии за один прогон
  • имена и exclusive берутся из issue.TYPES / issue.SEVERITIES /
    issue.EXCLUSIVE_NS, цвета — из map.label_specs; ни один список имён
    не дублируется в новом скрипте
  • перед записью читается текущий список labels репозитория; лейбл с точно
    таким именем не создаётся повторно и не патчится
  • найденные похожие имена (совпадение с точностью до регистра,
    разделителя и хвоста после /) печатаются как предупреждение с указанием
    имени и id, и не изменяются
  • --dry-run печатает план — что будет создано, что уже есть, что похоже —
    и не делает ни одного пишущего запроса
  • повторный прогон на подготовленном репозитории ничего не создаёт и
    выходит с кодом 0
  • расхождение цвета или exclusive у уже существующего лейбла показано в
    выводе; исправление — только по явному флагу, не по умолчанию
  • скрипт описан в таблице скриптов skills/sync/SKILL.md
  • skills/issue/ не изменён

Constraints

  • Не входит в объём: tech/* и comp/* — они open-ended по формату и
    создаются push'ем по факту использования.
  • Не входит в объём: удаление или переименование чужих labels.
  • Логин — только операторский пин, как у остальных скриптов слоя; --login
    скрипт не принимает.
## Summary Скрипт в `/tea:sync`, который заводит в репозитории полный канонический набор labels — все `type/*` и все `severity/*` — за один прогон, предварительно сверив то, что в репозитории уже есть. ## Spec `skills/issue/references/format.md` ## Motivation Сейчас labels появляются побочным эффектом первого push: `ensure_labels` (`skills/sync/scripts/_gitea.py:233`) создаёт ровно те имена, которые встретились в отправляемых issues. Пока не запушен ни один `type/bug`, лейбла `type/bug` в репозитории нет — отфильтровать по нему в веб-интерфейсе нельзя, и человек заводит руками свой `bug` с чужим цветом и без `exclusive`. Набор доезжает до репозитория по кускам, месяцами. Набор конечен и уже описан в доменной таксономии: `issue.TYPES` (6) и `issue.SEVERITIES` (5) — 11 labels, цвета и `exclusive` для них лежат в `map.LABEL_COLORS` / `map.label_specs`. Значит, это не решение, а прогон: завести всё сразу при первой работе с трекером репозитория. Проверка «нет ли уже подобных» нужна не ради идемпотентности имён — по точному имени `ensure_labels` и так не дублирует. Нужна ради **похожих**: `bug`, `Bug`, `type: bug`, `kind/bug`. Их нельзя ни трогать, ни считать своими — про них надо сказать человеку и остановиться, решение о переименовании чужого лейбла не автоматизируется. ## Acceptance criteria - [x] есть `skills/sync/scripts/labels.py`, создающий все `type/*` и `severity/*` из доменной таксономии за один прогон - [x] имена и `exclusive` берутся из `issue.TYPES` / `issue.SEVERITIES` / `issue.EXCLUSIVE_NS`, цвета — из `map.label_specs`; ни один список имён не дублируется в новом скрипте - [x] перед записью читается текущий список labels репозитория; лейбл с точно таким именем не создаётся повторно и не патчится - [x] найденные похожие имена (совпадение с точностью до регистра, разделителя и хвоста после `/`) печатаются как предупреждение с указанием имени и id, и не изменяются - [x] `--dry-run` печатает план — что будет создано, что уже есть, что похоже — и не делает ни одного пишущего запроса - [x] повторный прогон на подготовленном репозитории ничего не создаёт и выходит с кодом 0 - [x] расхождение цвета или `exclusive` у уже существующего лейбла показано в выводе; исправление — только по явному флагу, не по умолчанию - [x] скрипт описан в таблице скриптов `skills/sync/SKILL.md` - [x] `skills/issue/` не изменён ## Constraints - Не входит в объём: `tech/*` и `comp/*` — они open-ended по формату и создаются push'ем по факту использования. - Не входит в объём: удаление или переименование чужих labels. - Логин — только операторский пин, как у остальных скриптов слоя; `--login` скрипт не принимает.
claude added the comp/sync
type
task
labels 2026-08-09 19:08:38 +00:00
claude added reference feat/issue-cache-scripts 2026-08-10 10:18:29 +00:00
Sign in to join this conversation.