Tick in-body checkboxes from a domain script #11

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

Summary

Скрипт в /tea:issue, который перечисляет чекбоксы - [ ] в теле issue и
переключает их по номеру или по подстроке, плюс разбор чекбоксов в
skills/issue/scripts/issue.py и колонка прогресса в INDEX.md.

Spec

skills/issue/references/format.md

Motivation

Чекбокс — единственная часть тела, которая является состоянием, а не
прозой. Всё остальное пишут один раз; галочки меняются по ходу работы, и менять
их сейчас может только человек руками или агент, переписывающий тело целиком.
Второе хуже первого: модель перегенерирует блок, съезжают переносы строк и
формулировки, и diff issue распухает там, где по смыслу изменился один символ.

Прогресс при этом не виден нигде. issue_index.py:29 собирает INDEX.md из
метаданных и о содержимом тела не знает, так что «сделано 3 из 7» нельзя
получить иначе, чем открыв файл.

Чекбоксы стоят не только в ## Acceptance criteria. Шаблон type/feature
держит список дочерних issues как чекбоксы в ## Issues
(skills/issue/references/format.md:275-277), а format.md:163-164 описывает
- [ ] как разметку пункта, а не как свойство одной секции. Привязка парсера к
заголовку молча потеряла бы половину галочек, поэтому строки ищутся по всему
телу.

Место — доменный слой: чекбокс это синтаксис тела issue, то есть часть ответа
на вопрос «что такое issue». Разбор кладём в issue.py, чтобы им мог
пользоваться и слой sync, не переопределяя формат у себя.

Acceptance criteria

  • в skills/issue/scripts/issue.py есть функция разбора чекбоксов тела:
    возвращает пункты с номером строки, состоянием и текстом
  • чекбоксы ищутся по всему телу, в любой секции; строка-продолжение
    многострочного пункта отдельным пунктом не считается
  • есть skills/issue/scripts/issue_ac.py, печатающий пронумерованный
    список пунктов issue с их состоянием
  • --check и --uncheck принимают номер или подстроку; неоднозначная
    подстрока — ошибка со списком подошедших пунктов, а не выбор наугад
  • переключение меняет ровно один символ: остальное тело сохраняется
    байт-в-байт, что проверяется diff'ом до и после
  • issue_index.py показывает в INDEX.md прогресс вида 3/7 для issue с
    чекбоксами и ничего для issue без них; значение считается на лету и
    нигде не хранится
  • issue_check.py не считает незакрытый чекбокс ошибкой или
    предупреждением
  • команда описана в skills/issue/SKILL.md
  • grep -rh '^import \|^from ' skills/issue/scripts/ по-прежнему даёт
    только stdlib и не содержит subprocess

Constraints

  • Не входит в объём: доставка изменённого тела в трекер — это push.py --update в /tea:sync.
  • Не входит в объём: новое поле метаданных под прогресс. Состояние галочек
    живёт в теле и только там; вынос его в depends:-подобное поле сломается на
    первой же правке списка.
  • Формат не меняется: references/format.md правим только если разбор
    вскроет неоднозначность в самой разметке.
## Summary Скрипт в `/tea:issue`, который перечисляет чекбоксы `- [ ]` в теле issue и переключает их по номеру или по подстроке, плюс разбор чекбоксов в `skills/issue/scripts/issue.py` и колонка прогресса в `INDEX.md`. ## Spec `skills/issue/references/format.md` ## Motivation Чекбокс — единственная часть тела, которая является **состоянием**, а не прозой. Всё остальное пишут один раз; галочки меняются по ходу работы, и менять их сейчас может только человек руками или агент, переписывающий тело целиком. Второе хуже первого: модель перегенерирует блок, съезжают переносы строк и формулировки, и diff issue распухает там, где по смыслу изменился один символ. Прогресс при этом не виден нигде. `issue_index.py:29` собирает `INDEX.md` из метаданных и о содержимом тела не знает, так что «сделано 3 из 7» нельзя получить иначе, чем открыв файл. Чекбоксы стоят **не только** в `## Acceptance criteria`. Шаблон `type/feature` держит список дочерних issues как чекбоксы в `## Issues` (`skills/issue/references/format.md:275-277`), а `format.md:163-164` описывает `- [ ]` как разметку пункта, а не как свойство одной секции. Привязка парсера к заголовку молча потеряла бы половину галочек, поэтому строки ищутся по всему телу. Место — доменный слой: чекбокс это синтаксис тела issue, то есть часть ответа на вопрос «что такое issue». Разбор кладём в `issue.py`, чтобы им мог пользоваться и слой sync, не переопределяя формат у себя. ## Acceptance criteria - [x] в `skills/issue/scripts/issue.py` есть функция разбора чекбоксов тела: возвращает пункты с номером строки, состоянием и текстом - [x] чекбоксы ищутся по всему телу, в любой секции; строка-продолжение многострочного пункта отдельным пунктом не считается - [x] есть `skills/issue/scripts/issue_ac.py`, печатающий пронумерованный список пунктов issue с их состоянием - [x] `--check` и `--uncheck` принимают номер или подстроку; неоднозначная подстрока — ошибка со списком подошедших пунктов, а не выбор наугад - [x] переключение меняет ровно один символ: остальное тело сохраняется байт-в-байт, что проверяется diff'ом до и после - [x] `issue_index.py` показывает в `INDEX.md` прогресс вида `3/7` для issue с чекбоксами и ничего для issue без них; значение считается на лету и нигде не хранится - [x] `issue_check.py` не считает незакрытый чекбокс ошибкой или предупреждением - [x] команда описана в `skills/issue/SKILL.md` - [x] `grep -rh '^import \|^from ' skills/issue/scripts/` по-прежнему даёт только stdlib и не содержит `subprocess` ## Constraints - Не входит в объём: доставка изменённого тела в трекер — это `push.py --update` в `/tea:sync`. - Не входит в объём: новое поле метаданных под прогресс. Состояние галочек живёт в теле и только там; вынос его в `depends:`-подобное поле сломается на первой же правке списка. - Формат не меняется: `references/format.md` правим только если разбор вскроет неоднозначность в самой разметке.
claude added this to the Issue's in-body ticks milestone 2026-08-09 19:48:12 +00:00
claude added the
type
task
comp/issue
labels 2026-08-09 19:48:12 +00:00
claude changed reference from feat/issue-cache-scripts to feat/issue-cache-scripts 2026-08-10 10:58:17 +00:00
Sign in to join this conversation.