feat(merge-pr): delete local PR branch after merge + wrong-repo guard #30
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/merge-pr/local-branch-cleanup"
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?
Что сделано
.opencode/tools/_shared.ts: экспортированresolveForgejoRepo, добавлены хелперыgetPull(GET /repos/{full}/pulls/{n}) иgetRepo(GET /repos/{full}) для pre-flight..opencode/tools/merge-pr.ts: pre-flight перед POST merge — проверка существования PR (404 → wrong-repo диагностика «ты не в том проекте», мерж НЕ выполняется) и получениеdefault_branch. После мержа — локальная очистка: удаление только ветки смерженного PR (head.ref); если текущая ветка == head.ref → checkout default + pull + branch -D; если != → только branch -D; если ветки нет → пропуск. Если репо PR != worktree → мерж без локальной очистки с явным сообщением. Если pull упал → «мерж прошёл, но pull не выполнен», ветка всё равно удаляется. Обновлён description тула..opencode/skills/run-pipeline/SKILL.mdTemplate F: при ошибке «PR not found / 404» → STOP + проверка проекта (worktree ≠ репо PR), НЕ retry с repo аргументом.tests/test_merge_pr_tool.py+tests/_ts_loader.mjs: новые стабы (git branch --list/-D, checkout, pull, rev-parse) и 7 новых тестов (404 pre-flight, cleanup с checkout+pull, без переключения, repo mismatch, отсутствие ветки, pull failure). Старые тесты адаптированы под pre-flight.Почему
После мержа PR через merge_pr tool локальная ветка PR оставалась в worktree (Forgejo удаляет только remote-ветку), засоряя
git branchи ломая следующийgit checkout main && git pull. Вторая проблема — wrong-repo: из чужого worktree POST merge уходил в неверный репо → 404 без объяснения.Watch out
default_branch), не хардкодится.resolveForgejoRepoтеперь вызывается до 3 раз (pre-flight, merge, сравнение worktree) — тесты учитывают это.Pending
—
Closes #28
Code Review Summary
Качественный PR: pre-flight wrong-repo guard (404 → диагностика «не в том проекте», merge НЕ выполняется) + локальная очистка ветки смерженного PR (checkout default + pull + branch -D, только при совпадении worktree и репо PR). 7 новых тестов покрывают все ветки cleanup, стабы в _ts_loader.mjs аккуратно изолированы через env-переменные. Cross-file связи проверены: pipeline-status.py:check_merge читает state PR (не сообщение тула) — не сломан; run-pipeline/SKILL.md Template F обновлён парно в этом же PR; reviewer/memory-syncer не зависят от merge-pr сообщений.
Positives
Warnings (should fix, не блокируют)
"PR #42 merged successfully (squash, branch deleted).", а тул теперь возвращает"PR #42 merged (squash, remote branch deleted). Local ... deleted, switched to ...". Файл не запускается в CI (нет bun, только документация), но при будущемbun testупадёт. Обнови ожидания или удали файл.Fix: привести 4 теста к новому формату сообщений (как в test_merge_pr_tool.py).
currentBranch === headRefпри pull failure сообщение утверждаетLocal ${headRef} deleted, даже еслиgit branch -Dтоже упал (del выполняется до проверки pull, его статус теряется). Двойной failure — редкий edge case, но сообщение вводит в заблуждение.Fix: проверять
del.statusперед утверждением об удалении, например:if (pull.status !== 0) return ... Мерж прошёл, но pull не выполнен: ... ${del.status === 0 ? \Local ${headRef} deleted` : `Local ${headRef} НЕ удалена: ${del.stderr}`}. Switched to ${defaultBranch}.`Suggestions (info, not blocking)
resolveForgejoRepoвызывается до 3 раз (pre-flight, runGh dispatch, worktree сравнение) — 3 spawnSync git. Можно закешировать результат в переменную.git branch --list <headRef>интерпретирует headRef как glob-pattern: если head.ref PR содержит*/?,--listвернёт несколько веток, иbranch -Dудалит все матчащиеся. head.ref контролируется автором PR (внутренний инструмент, риск минимален), но можно использоватьgit branch --list --format='%(refname:short)' <headRef>+ точное сравнение.Verdict: APPROVE