Gate OpenSpec changes onto a worktree #42
Notifications
Due Date
No due date set.
Blocks
Depends on
#44 Test the spec guard and the linkage linter
claude-skills/marketplace
#45 Adopt OpenSpec as the change workflow
claude-skills/marketplace
#39 Commit the OpenSpec scaffold
claude-skills/marketplace
Reference: claude-skills/marketplace#42
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
PreToolUse-хук
hooks/spec-guard.sh: не даёт запуститьopenspec new changeнаmain, заводит worktree
../tea-worktrees/<slug>с веткойfeat/<slug>ивозвращает модели инструкцию войти в него.
Spec
AGENTS.mdDepends on
openspec/в git свежий worktree бесполезенMotivation
Change — это спека, тест-кейсы, задачи и код. Всё это одна единица работы и
должно ревьюиться одним PR, а значит жить на одной ветке с первого артефакта, а
не с первой строки кода.
Принудить это можно только хуком. Схема openspec — строгие данные, shell в
ней нет. Сгенерированные
.claude/commands/opsx/*.mdперезаписываютсяopenspec update(они рендерятся изdist/core/templates/workflows/propose.js),так что правка там держится до первого апгрейда.
Хук не может вызвать
EnterWorktree. Хук — внешний процесс, его контракт:passthrough,
updatedInput,additionalContextили exit 2 + stderr. Тулы он невызывает. Поэтому форма ровно как у
hooks/tea-guard.sh:33— блок с точнойинструкцией, а действие делает модель, прочитав stderr как фидбек.
Грязное дерево блокируем. Технически
git worktree addна грязном деревеработает. Ломается не git, а человек: незакоммиченные правки остаются в
main-чекауте, сессия уезжает в worktree, работа осиротела — и это ровно тот
случай, когда правки как раз про этот change. Блокируем tracked-изменения;
untracked не блокируем, иначе шум и обход правила.
Строка в AGENTS.md входит в объём.
EnterWorktreeпо своему контрактузапускается только когда worktree разрешён пользователем напрямую или
инструкциями проекта. Без разрешения в
AGENTS.mdхук блокирует, модельотказывается разблокировать, и propose встаёт намертво. Хук и строка — один
результат, порознь они ломают процесс.
Матрица поведения:
openspecне в PATH или в корне нетopenspec/openspec new changeи неopenspec archivenew change <slug>git worktree add ../tea-worktrees/<slug> -b feat/<slug> HEAD, затем exit 2 сEnterWorktree(path: …)и «re-run this exact command»git worktree addвернул ненулевой кодarchivearchiveAcceptance criteria
hooks/spec-guard.shсуществует и зарегистрирован вhooks/hooks.jsonкак PreToolUse с matcher
Bashopenspecне в PATH или в корне репозитория неткаталога
openspec/— плагин молчит у тех, кто openspec не ставилopenspec new changeиopenspec archivegit status --porcelain --untracked-files=no—exit 2, и текст называет оба выхода: закоммитить или
git stash→ повтор →git stash popвнутри worktreeopenspec new change <slug>создаёт../tea-worktrees/<slug>с веткойfeat/<slug>отHEAD, затем exit 2 синструкцией
EnterWorktree(path: …)и требованием повторить ту же командуgit worktree add(ветка занята, путь занят) — exit 2 соstderr git'а, и ничего не создано наполовину
openspec archiveне на main — exit 2AGENTS.mdразрешает worktree явно и описываетhooks/spec-guard.shвразделе про
hooks/git stashсамConstraints
test-the-spec-guard-and-the-linkage-linter.feat/;fix/переименовываетсяруками, автоматически тип из слага не выводится — существующие ветки репы
(
feat/close-script,fix/no-store-for-label-payloads) слаг с типом несвязывают.
ExitWorktree.worktree.baseRefиз настроек Claude Code — worktreeсоздаёт хук, стартовая точка задаётся явно.