
Finishing A Development Branch
- 79 installs
- 4 repo stars
- Updated July 27, 2026
- izyanrajwani/agent-skills-library
Close out a finished feature branch after tests pass by detecting the correct base branch and choosing merge, PR, or cleanup without skipping verification.
About
finishing-a-development-branch is a procedural Git workflow skill for solo builders who finish features on branches and want the agent to enforce tests before any merge or PR action. It maps common repo roots to the right test runner, blocks the flow with a explicit BLOCKED:TESTS signal when failures exist, then infers which trunk branch the feature diverged from using merge-base logic across main, master, and develop. When detection is unclear, it prompts you to pick the target instead of guessing. After verification it surfaces a fixed four-option menu so you consciously choose merge locally, open a pull request, or clean up—reducing the classic indie mistake of merging broken or mis-targeted branches. Install it in Claude Code, Cursor, or Codex when you routinely ship from feature branches and want repeatable ship-phase hygiene without re-explaining your Git ritual each session.
- Step 1 runs the project-appropriate test command and stops with ⊘ BLOCKED:TESTS if anything fails
- Step 2 detects base branch via merge-base against main, master, or develop and asks when ambiguous
- Step 3 presents exactly four integration options after verification
- Supports npm/yarn, Cargo, pytest, go test, and Makefile test targets from repo layout
Finishing A Development Branch by the numbers
- 79 all-time installs (skills.sh)
- +2 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #251 of 733 Git & Pull Requests skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/izyanrajwani/agent-skills-library --skill finishing-a-development-branchAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 79 |
|---|---|
| repo stars | ★ 4 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 27, 2026 |
| Repository | izyanrajwani/agent-skills-library ↗ |
What it does
Close out a finished feature branch after tests pass by detecting the correct base branch and choosing merge, PR, or cleanup without skipping verification.
Files
Finishing a Development Branch
The Process
Step 1: Verify Tests
Determine test runner from project structure:
package.json→npm testoryarn testCargo.toml→cargo testpyproject.toml/setup.py→pytestgo.mod→go test ./...Makefilewithtesttarget →make test
Run tests. If any fail, report ⊘ BLOCKED:TESTS with failure count and stop. Do not proceed to Step 2.
Step 2: Determine Base Branch
Find the branch this feature diverged from:
# Check which branch has the closest merge-base
for candidate in main master develop; do
if git rev-parse --verify "$candidate" >/dev/null 2>&1; then
MERGE_BASE=$(git merge-base HEAD "$candidate" 2>/dev/null)
if [ -n "$MERGE_BASE" ]; then
echo "Candidate: $candidate (merge-base: $MERGE_BASE)"
fi
fi
doneSelect the candidate with the most recent merge-base (closest ancestor). If multiple branches share the same merge-base or detection is ambiguous, ask: "This branch could target main or develop. Which should it merge into?"
Store the result - subsequent steps reference <base-branch> meaning this determined value.
Step 3: Present Options
Present exactly these 4 options:
Implementation complete. What would you like to do?
1. Merge back to <base-branch> locally
2. Push and create a Pull Request
3. Keep the branch as-is (I'll handle it later)
4. Discard this work
Which option?Step 4: Execute Choice
Option 1: Merge Locally
git checkout <base-branch>
git pull
git merge <feature-branch>If merge conflicts:
⊘ BLOCKED:CONFLICTS
Merge conflicts in:
- <conflicted files>
Cannot auto-resolve. User must:
1. Resolve conflicts manually
2. Run tests
3. Re-run this workflowStop. Do not proceed.
If merge succeeds:
# Verify tests on merged result
<test command>
# If tests pass, delete feature branch
git branch -d <feature-branch>Then: Cleanup worktree (Step 5). Report ✓ MERGED.
Option 2: Push and Create PR
Verify `gh` CLI is available:
if ! command -v gh &>/dev/null; then
echo "gh CLI not installed. Install from https://cli.github.com/ or push manually and create PR via web."
exit 1
fi
gh auth status || echo "gh not authenticated. Run: gh auth login"Extract title from first commit on branch (original intent):
MERGE_BASE=$(git merge-base HEAD <base-branch>)
TITLE=$(git log --reverse --format=%s "$MERGE_BASE"..HEAD | head -1)
git push -u origin <feature-branch>
gh pr create --title "$TITLE" --body "$(cat <<'EOF'
## Summary
<2-3 bullets of what changed>
## Test Plan
- [ ] <verification steps>
EOF
)"Report ✓ PR_CREATED with PR URL. Keep worktree intact for continued work during review.
Option 3: Keep As-Is
Report ✓ PRESERVED with branch name and worktree path.
Do not cleanup worktree.
Option 4: Discard
Confirm first:
This will permanently delete:
- Branch <name>
- All commits: <commit-list>
- Worktree at <path>
Type 'discard' to confirm.Wait for exact confirmation. If not received, abort.
If confirmed:
git checkout <base-branch>
git branch -D <feature-branch>Then: Cleanup worktree (Step 5). Report ✓ DISCARDED.
Step 5: Cleanup Worktree
For Options 1 and 4 only:
# Check if currently in a worktree (not main repo)
if [ "$(git rev-parse --git-common-dir)" != "$(git rev-parse --git-dir)" ]; then
# Get worktree root (handles invocation from subdirectory)
WORKTREE_ROOT=$(git rev-parse --show-toplevel)
cd "$(git rev-parse --git-common-dir)/.."
git worktree remove "$WORKTREE_ROOT"
fiFor Options 2 and 3: Keep worktree intact.
Quick Reference
| Option | Merge | Push | Keep Worktree | Cleanup Branch |
|---|---|---|---|---|
| 1. Merge locally | ✓ | - | - | ✓ |
| 2. Create PR | - | ✓ | ✓ | - |
| 3. Keep as-is | - | - | ✓ | - |
| 4. Discard | - | - | - | ✓ (force) |
Terminal States
On completion, report exactly one:
| State | Output | Meaning |
|---|---|---|
✓ MERGED | Branch merged to <base>, worktree cleaned | Option 1 success |
✓ PR_CREATED | PR #N at URL | Option 2 success |
✓ PRESERVED | Branch kept at path | Option 3 success |
✓ DISCARDED | Branch deleted, worktree cleaned | Option 4 success |
⊘ BLOCKED:TESTS | N test failures | Cannot proceed |
⊘ BLOCKED:CONFLICTS | Merge conflict in files | Cannot proceed |
Guardrails
Blocking conditions (stop immediately):
- Tests failing →
⊘ BLOCKED:TESTS - Merge conflicts →
⊘ BLOCKED:CONFLICTS
Mandatory confirmations:
- Option 4 (Discard): Require typed "discard" confirmation
Cleanup rules:
- Options 1, 4: Clean up worktree and branch
- Options 2, 3: Preserve worktree
Never:
- Proceed with failing tests
- Merge without verifying tests on result
- Delete work without typed confirmation
- Force-push without explicit request
Integration
Called by:
- subagent-driven-development (Step 7) - After all tasks complete
- executing-plans (Step 5) - After all batches complete
Pairs with:
- using-git-worktrees - Cleans up worktree created by that skill
Related skills
FAQ
Is Finishing A Development Branch safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.