Add a close script to the sync layer #17
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Закрытие issue не покрыто ни одним скриптом. Единственный способ сменить
state— сыройtea api -X PATCHв обход слоя sync.Spec
AGENTS.mdMotivation
AGENTS.mdобъявляет правилом: «Route all Gitea interaction through theteaCLI via scripts». Закрытие — регулярная операция, и оно единственное из
регулярных, которого нет в
skills/sync/scripts/. Там естьpull.py,push.py,comment.py,remote.py,labels.py— и ничего для сменысостояния.
Наблюдалось при закрытии
claude-skills/tea#11–#15: пришлось пять разпозвать
Ломается сразу три вещи.
Правило слоёв. Сырой вызов знает и владельца, и репозиторий, и форму тела
запроса — всё то, что
_gitea.pyсуществует, чтобы прятать.tea-runner. У субагента жёсткий запрет «Do not close, delete, or retitle
anything» (
agents/tea-runner.md, правило 4). Он стоит там не потому, чтозакрытие опасно по сути, а потому, что закрытие не покрыто скриптом: агенту
нечего вызвать, а сырой
teaему запрещён правилом 1. Появитсяclose.py—запрет сузится до нормального «закрывай только то, что назвал вызывающий».
Разрешения. Чтобы пропустить сырой PATCH, оператор разрешает
Bash(tea api *)— то есть весь API, включая-X DELETEпо репозиторию. Узкий скрипт даётузкое разрешение.
Acceptance criteria
skills/sync/scripts/close.py, принимающий один или несколько idstate:в локальномфайле в соответствие
--reopenвыполняет обратную операциюorigin: localзакрыть нельзя: ошибка говорит, что issue не втрекере, и называет id
--dry-runпечатает, что будет закрыто, и не делает ни одного пишущегозапроса
skills/sync/SKILL.mdописывает командуagents/tea-runner.md: правило 4 переписано — закрывать разрешено, нотолько те id, которые назвал вызывающий
ошибкой → локальный файл не тронут»
Constraints
--milestone,--label).Скрипт принимает явные id — закрытие набора issue это решение, а не пакетная
операция.
процесса.
comment.py, вызывается отдельно.