После реализации фичи: запускает тест-suite и предлагает ровно 4 варианта — merge, PR, держать ветку или удалить. Устраняет "а что теперь?" момент.
npx -y skills add obra/superpowers --skill finishing-a-development-branch --agent claude-codeСопровождает завершение работы, предлагая ясные варианты и выполняя выбранный сценарий.
Главный принцип: проверить тесты → определить окружение → представить варианты → выполнить выбор → убрать за собой.
Объявите в начале: «Я использую скилл finishing-a-development-branch, чтобы завершить эту работу.»
Прежде чем предлагать варианты, убедитесь, что тесты проходят:
# Запустить набор тестов проекта
npm test / cargo test / pytest / go test ./...
Если тесты падают: сообщите о провалах, исправьте до завершения. Нельзя переходить к слиянию/PR, пока тесты не проходят. Стоп — не переходите к Шагу 2.
Если тесты проходят: переходите к Шагу 2.
Определите состояние рабочего пространства до показа вариантов:
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
| Состояние | Меню | Очистка |
|---|---|---|
GIT_DIR == GIT_COMMON (обычный репозиторий) | Стандартные 4 варианта | Нет worktree для очистки |
GIT_DIR != GIT_COMMON, именованная ветка | Стандартные 4 варианта | По происхождению (см. Шаг 6) |
GIT_DIR != GIT_COMMON, detached HEAD | Сокращённые 3 варианта (без слияния) | Без очистки (управляется извне) |
# Попробовать частые базовые ветки
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
Или спросить: «Эта ветка ответвилась от main — верно?»
Обычный репозиторий и worktree с именованной веткой — ровно эти 4 варианта:
Реализация завершена. Что вы хотите сделать?
1. Слить обратно в локально
2. Запушить и создать Pull Request
3. Оставить ветку как есть (разберусь позже)
4. Отбросить эту работу
Какой вариант?
Detached HEAD — ровно эти 3 варианта:
Реализация завершена. Вы на detached HEAD (рабочее пространство управляется извне).
1. Запушить как новую ветку и создать Pull Request
2. Оставить как есть (разберусь позже)
3. Отбросить эту работу
Какой вариант?
Не добавляйте пояснений — держите варианты лаконичными.
MAIN_ROOT=$(git -C "$(git rev-parse --git-common-dir)/.." rev-parse --show-toplevel)
cd "$MAIN_ROOT"
# Сначала слияние — убедитесь в успехе перед удалением чего-либо
git checkout
git pull
git merge
# Проверить тесты на результате слияния
Затем: очистка worktree (Шаг 6), потом удаление ветки: git branch -d <feature-branch>
git push -u origin
НЕ чистите worktree — он нужен пользователю живым, чтобы дорабатывать по отзывам PR.
Сообщите: «Оставляю ветку <name>. Worktree сохранён в <path>.» Не чистите worktree.
Сначала подтверждение:
Это безвозвратно удалит:
- Ветку
- Все коммиты:
- Worktree в
Введите 'discard' для подтверждения.
Дождитесь точного подтверждения. Если подтверждено — очистка worktree (Шаг 6), затем принудительное удаление ветки: git branch -D <feature-branch>
Выполняется только для вариантов 1 и 4. Варианты 2 и 3 всегда сохраняют worktree.
Если GIT_DIR == GIT_COMMON: обычный репозиторий, чистить нечего. Готово.
Если путь worktree под .worktrees/ или worktrees/: этот worktree создал Superpowers — очистка наша.
MAIN_ROOT=$(git -C "$(git rev-parse --git-common-dir)/.." rev-parse --show-toplevel)
cd "$MAIN_ROOT"
git worktree remove "$WORKTREE_PATH"
git worktree prune # Самовосстановление: убрать устаревшие регистрации
Иначе: рабочим пространством владеет хост-окружение (обвязка). НЕ удаляйте его. Если платформа даёт инструмент выхода из пространства — используйте его. Иначе оставьте пространство на месте.
| Вариант | Слияние | Push | Сохранить worktree | Удалить ветку |
|---|---|---|---|---|
| 1. Слить локально | да | — | — | да |
| 2. Создать PR | — | да | да | — |
| 3. Оставить как есть | — | — | да | — |
| 4. Отбросить | — | — | — | да (принуд.) |
Пропуск проверки тестов — слияние сломанного кода, провальный PR. Фикс: всегда проверяйте тесты до предложения вариантов.
Открытые вопросы — «Что делать дальше?» неоднозначно. Фикс: ровно 4 структурированных варианта (или 3 для detached HEAD).
Очистка worktree для варианта 2 — удаляет worktree, нужный для доработки PR. Фикс: чистите только для вариантов 1 и 4.
Удаление ветки до удаления worktree — git branch -d падает, т.к. worktree ещё ссылается на ветку. Фикс: сначала слияние, потом удаление worktree, потом ветки.
Запуск git worktree remove изнутри worktree — команда молча падает, если CWD внутри удаляемого worktree. Фикс: всегда cd в корень основного репозитория перед git worktree remove.
Очистка worktree, принадлежащих обвязке — удаление worktree, созданного обвязкой, порождает фантомное состояние. Фикс: чистите только worktree под .worktrees/ или worktrees/.
Нет подтверждения для отбрасывания — случайно удалите работу. Фикс: требуйте набранного подтверждения «discard».
Никогда: продолжать с падающими тестами; сливать без проверки тестов на результате; удалять работу без подтверждения; делать force-push без явного запроса; удалять worktree до подтверждения успеха слияния; чистить worktree, которые вы не создавали; запускать git worktree remove изнутри worktree.
Всегда: проверять тесты до вариантов; определять окружение до меню; представлять ровно 4 варианта (или 3 для detached HEAD); получать набранное подтверждение для варианта 4; чистить worktree только для вариантов 1 и 4; делать cd в корень репозитория перед удалением worktree; запускать git worktree prune после удаления.