release-prep
Full release pipeline from feature branch to TestFlight. Pushes branch, creates PR, squash merges to main, then runs archive + TestFlight distribution. TRIGGER when the user says "release this", "ship
SKILL.md.claude/skills/release-prep/SKILL.md
GitHubRelease Prep — Branch to TestFlight
Full pipeline: push branch → create PR → squash merge → archive → TestFlight.
CRITICAL: Permission-safe execution. Run each operation as a SEPARATE Bash tool call. Never chain commands with &&, ||, or pipes.
Current State
- Branch: !
git branch --show-current - Remote tracking: !
git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null || echo "no upstream (will push with -u)" - Uncommitted changes: !
git status --short - Commits since main: !
git log main..HEAD --oneline 2>&1
Pre-Flight Checks
Before starting, verify:
- NOT on
main(must be on a feature/bugfix branch) - All changes committed (clean working tree, excluding pre-existing unstaged changes)
- At least one commit ahead of main
-
docs/development-journal.mdhas current session entry -
docs/insights-log.mdhas any unlogged insights
If on main already, skip to Step 4 (archive). If there are uncommitted changes, warn the user.
Step 1: Push Branch
git push -u origin <branch-name>
If already pushed and up to date, skip.
Step 2: Create Pull Request
Invoke /pr to create the PR. This delegates to the canonical skill so PR format stays consistent. Wait for the PR URL before proceeding to Step 3.
Step 3: Squash Merge to Main
gh pr merge <PR-NUMBER> --squash --delete-branch
Then update local:
git checkout main
git pull origin main
Verify merge succeeded:
git log --oneline -3
Step 4: Archive & Distribute
Invoke the archive skill to handle the rest:
/archive
This handles: build number bump → archive → upload → TestFlight distribution.
Step 5: Final Report
Release Pipeline Complete
Git:
Branch: <branch-name> → main (squash merged)
PR: #<number> (<url>)
Build:
Version: <marketing-version> (build <number>)
Status: [from archive output]
Arguments
- No arguments: full pipeline (push → PR → merge → archive → TestFlight)
--no-archive: push → PR → merge only, skip archive/TestFlight--pr-only: push and create PR only, don't merge or archive
Error Handling
- Merge conflicts: Stop and ask user to resolve
- PR checks failing: Warn user, ask whether to merge anyway
- Archive failure: Report error, suggest checking Xcode signing
- Already on main: Skip steps 1-3, go directly to archive
Notes
- This skill orchestrates existing workflows. The archive step uses
/archivewhich handles all Xcode/App Store Connect mechanics. - Pre-existing unstaged changes (like unrelated modified files) are fine — they won't be included in the PR.
- The PR body is auto-generated from commit history, following project conventions.