--- name: ship-it description: > Push the current branch to GitHub and create a pull request. Use this skill when the user says "ship it", "ship this", "push to github", "create a pr", "open a pull request", "send for review", "get this reviewed", or wants to push their work and open a PR. Also use when the user says "/ship-it". This skill handles prerequisites, branching, pushing, and PR creation — it does not commit or run quality checks (use checkpoint for that first). --- # Ship It Push your work to GitHub and open a pull request — handling prerequisites, branch creation, pushing, and PR generation automatically. This skill complements `checkpoint`. Use `checkpoint` to commit locally (with quality gates), then `ship-it` to get the code to GitHub for review. ## Instructions ### Step 0: Prerequisites Verify tooling before doing anything else. 1. **GitHub CLI installed?** ```bash gh --version ``` If the command fails (not found): - Detect the platform and attempt to install: - **Windows:** `winget install --id GitHub.cli` - **macOS:** `brew install gh` - **Linux (Debian/Ubuntu):** follow the official apt instructions - If auto-install fails, tell the user what to install and stop. 2. **GitHub CLI authenticated?** ```bash gh auth status ``` If not authenticated, tell the user: ``` GitHub CLI is not logged in. Please run this in the prompt: ! gh auth login Then re-run /ship-it. ``` Stop here — do not proceed until auth is confirmed. 3. **Git remote exists?** ```bash git remote -v ``` If no remote named `origin` exists, stop and tell the user: ``` No git remote found. Add one with: git remote add origin https://github.com/{user}/{repo}.git ``` ### Step 1: Detect the Environment Run these commands to understand the current state: 1. `git branch --show-current` — get the current branch name 2. Detect the default branch: ```bash gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name' ``` 3. `git status --porcelain` — check for uncommitted changes If there are uncommitted changes, stop and tell the user: ``` You have uncommitted changes. Run /checkpoint first to commit them, then /ship-it to push. ``` Store the default branch name for use throughout the remaining steps. ### Step 2: Check for Unpushed Commits Determine if there are commits that haven't been pushed yet. **If on a feature branch with a remote tracking branch:** ```bash git log @{upstream}..HEAD --oneline ``` **If on a feature branch with no remote tracking branch, or on the default branch:** ```bash git log origin/{default_branch}..HEAD --oneline ``` If there are **no unpushed commits**, stop and tell the user: ``` Nothing to ship — all commits are already pushed. ``` Save the list of unpushed commit messages for use in later steps. ### Step 3: Handle Branching **If already on a feature branch** (not the default branch): - Stay on it. No branching needed. - Skip to Step 4. **If on the default branch:** - Generate a branch name from the unpushed commit messages: - Read the commit subjects - Derive a kebab-case branch name with a conventional prefix: `feat/`, `fix/`, `refactor/`, `chore/`, `docs/` based on the commit content - Keep it short (3-5 words max after the prefix), e.g., `feat/add-user-auth`, `fix/login-redirect-loop` - Strip special characters, lowercase everything - Create and switch to the new branch: ```bash git checkout -b {branch_name} ``` - Tell the user: `Created branch {branch_name}` ### Step 4: Push to Origin ```bash git push -u origin {branch_name} ``` If the branch already has a remote tracking branch, a regular `git push` is fine. ### Step 5: Check for Existing PR Before creating a new PR, check if one already exists for this branch: ```bash gh pr view --json number,url,title,state 2>/dev/null ``` If a PR already exists and is **open**: - Do NOT create a new one - Skip to Step 7 and report the existing PR with a note that new commits were pushed. If no PR exists (or it is closed/merged), proceed to Step 6. ### Step 6: Create the Pull Request Generate the PR title and body from the unpushed commits: - **Title**: concise summary under 70 chars. If single commit, use its subject. If multiple, synthesize a short summary. Imperative mood. - **Body**: TL;DR of the changes in 2-4 bullet points max. ```bash gh pr create --base {default_branch} --head {branch_name} --title "{title}" --body "$(cat <<'EOF' ## Summary {2-4 bullet points} --- 🤖 Generated with [Claude Code](https://claude.com/claude-code) EOF )" ``` ### Step 7: Report Display the result clearly: ``` Shipped to GitHub: Branch: {branch_name} PR: #{number} — {title} URL: {url} ``` ## Important - Do NOT run lint, type-check, or build — that is checkpoint's job - Do NOT commit anything — only push existing commits and create a PR - If the user has uncommitted changes, tell them to run /checkpoint first - Keep the PR body short — a TL;DR, not an essay - Always check for an existing open PR before creating a new one to avoid duplicates - Detect the default branch dynamically — do not hardcode `main` or `master` - When creating a branch from the default branch, use conventional prefixes (`feat/`, `fix/`, etc.) with kebab-case names - Never run destructive git operations (no `--force`, no `reset --hard`) - If `gh` is not installed or authenticated, help the user get set up before proceeding