--- name: gsd-ship description: "Create PR, run review, and prepare for merge after verification passes" argument-hint: "[phase number or milestone, e.g., '4' or 'v1.0']" allowed-tools: - Read - Bash - Grep - Glob - Write - AskUserQuestion --- Bridge local completion → merged PR. After /gsd-verify-work passes, ship the work: push branch, create PR with auto-generated body, optionally trigger review, and track the merge. Closes the plan → execute → verify → ship loop. Create a pull request from completed phase/milestone work, generate a rich PR body from planning artifacts, optionally run code review, and prepare for merge. Closes the plan → execute → verify → ship loop. Read the skill content below before starting. Parse arguments and load project state: ```bash INIT=$(node "$GSD_TOOLS" init phase-op "${PHASE_ARG}") if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi ``` Parse from init JSON: `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `padded_phase`, `commit_docs`. Also load config for branching strategy: ```bash CONFIG=$(node "$GSD_TOOLS" state load) ``` Extract: `branching_strategy`, `branch_name`. Detect base branch for PRs and merges: ```bash BASE_BRANCH=$(node "$GSD_TOOLS" config-get git.base_branch 2>/dev/null || echo "") if [ -z "$BASE_BRANCH" ] || [ "$BASE_BRANCH" = "null" ]; then BASE_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|^refs/remotes/origin/||') BASE_BRANCH="${BASE_BRANCH:-main}" fi ``` Verify the work is ready to ship: 1. **Verification passed?** ```bash VERIFICATION=$(cat ${PHASE_DIR}/*-VERIFICATION.md 2>/dev/null) ``` Check for `status: passed` or `status: human_needed` (with human approval). If no VERIFICATION.md or status is `gaps_found`: warn and ask user to confirm. 2. **Clean working tree?** ```bash git status --short ``` If uncommitted changes exist: ask user to commit or stash first. 3. **On correct branch?** ```bash CURRENT_BRANCH=$(git branch --show-current) ``` If on `${BASE_BRANCH}`: warn — should be on a feature branch. If branching_strategy is `none`: offer to create a branch now. 4. **Remote configured?** ```bash git remote -v | head -2 ``` Detect `origin` remote. If no remote: error — can't create PR. 5. **`gh` CLI available?** ```bash which gh && gh auth status 2>&1 ``` If `gh` not found or not authenticated: provide setup instructions and exit. Push the current branch to remote: ```bash git push origin ${CURRENT_BRANCH} 2>&1 ``` If push fails (e.g., no upstream): set upstream: ```bash git push --set-upstream origin ${CURRENT_BRANCH} 2>&1 ``` Report: "Pushed `{branch}` to origin ({commit_count} commits ahead of ${BASE_BRANCH})" Auto-generate a rich PR body from planning artifacts: **1. Title:** ``` Phase {phase_number}: {phase_name} ``` Or for milestone: `Milestone {version}: {name}` **2. Summary section:** Read ROADMAP.md for phase goal. Read VERIFICATION.md for verification status. ```markdown ## Summary **Phase {N}: {Name}** **Goal:** {goal from ROADMAP.md} **Status:** Verified ✓ {One paragraph synthesized from SUMMARY.md files — what was built} ``` **3. Changes section:** For each SUMMARY.md in the phase directory: ```markdown ## Changes ### Plan {plan_id}: {plan_name} {one_liner from SUMMARY.md frontmatter} **Key files:** {key-files.created and key-files.modified from SUMMARY.md frontmatter} ``` **4. Requirements section:** ```markdown ## Requirements Addressed {REQ-IDs from plan frontmatter, linked to REQUIREMENTS.md descriptions} ``` **5. Testing section:** ```markdown ## Verification - [x] Automated verification: {pass/fail from VERIFICATION.md} - {human verification items from VERIFICATION.md, if any} ``` **6. Decisions section:** ```markdown ## Key Decisions {Decisions from STATE.md accumulated context relevant to this phase} ``` Create the PR using the generated body: ```bash gh pr create \ --title "Phase ${PHASE_NUMBER}: ${PHASE_NAME}" \ --body "${PR_BODY}" \ --base ${BASE_BRANCH} ``` If `--draft` flag was passed: add `--draft`. Report: "PR #{number} created: {url}" Ask if user wants to trigger a code review: ``` AskUserQuestion: question: "PR created. Run a code review before merge?" options: - label: "Skip review" description: "PR is ready — merge when CI passes" - label: "Self-review" description: "I'll review the diff in the PR myself" - label: "Request review" description: "Request review from a teammate" ``` **If "Request review":** ```bash gh pr edit ${PR_NUMBER} --add-reviewer "${REVIEWER}" ``` **If "Self-review":** Report the PR URL and suggest: "Review the diff at {url}/files" Update STATE.md to reflect the shipping action: ```bash node "$GSD_TOOLS" state update "Last Activity" "$(date +%Y-%m-%d)" node "$GSD_TOOLS" state update "Status" "Phase ${PHASE_NUMBER} shipped — PR #${PR_NUMBER}" ``` If `commit_docs` is true: ```bash node "$GSD_TOOLS" commit "docs(${padded_phase}): ship phase ${PHASE_NUMBER} — PR #${PR_NUMBER}" --files .planning/STATE.md ``` ``` ─────────────────────────────────────────────────────────────── ## ✓ Phase {X}: {Name} — Shipped PR: #{number} ({url}) Branch: {branch} → ${BASE_BRANCH} Commits: {count} Verification: ✓ Passed Requirements: {N} REQ-IDs addressed Next steps: - Review/approve PR - Merge when CI passes - /gsd-complete-milestone (if last phase in milestone) - /gsd-progress (to see what's next) ─────────────────────────────────────────────────────────────── ``` After shipping: - /gsd-complete-milestone — if all phases in milestone are done - /gsd-progress — see overall project state - /gsd-execute-phase {next} — continue to next phase - [ ] Preflight checks passed (verification, clean tree, branch, remote, gh) - [ ] Branch pushed to remote - [ ] PR created with rich auto-generated body - [ ] STATE.md updated with shipping status - [ ] User knows PR number and next steps