github-workflows/skills/ship/SKILL.md
Commit, push, create PR(s), and auto-finalize — full automation pipeline. Handles uncommitted changes and recently created PRs. Never merges.
npx skillsauth add jacobpevans/claude-code-plugins shipInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Single command to commit, push, create PR(s), and auto-finalize everything.
Handles commit, push, PR creation, and /finalize-pr in one pipeline. Never merges.
⛔ NOT RESUMABLE — run from Step 0 on every
/shipinvocation. Do not refer to "the PR I just finalized" or "already verified" from any earlier message in this session — those are stale snapshots. The world changes between invocations: CodeQL completes async, required reviewers post async, Renovate force-pushes, branch protection re-evaluates. Re-run everything from Step 0.
This skill orchestrates many downstream API calls via /finalize-pr,
which itself invokes /resolve-codeql, /resolve-pr-threads, /simplify,
and metadata updates. To avoid API rate limit errors:
/finalize-pr to manage its own internal concurrency — it can
run its fixes in parallel since they're scoped to a single PRsleep 2 after gh pr create to let GitHub indexBefore anything else, confirm the working directory is valid:
git rev-parse --git-dir 2>/dev/null
If this fails (exits non-zero or the current directory doesn't exist), stop immediately
and report: "Working directory is not a git repository. This usually means the worktree was
cleaned up after a PR merge. Start a new session and create a worktree using /superpowers:using-git-worktrees to continue working."
Do NOT attempt to recover, cd elsewhere, or fall through to Step 1.
Identify all PRs that need finalization.
git status --porcelain
If changes exist (staged or unstaged), execute inline:
git checkout -b {type}/{description} (derive from changes)git add <relevant files> (no -A — be selective)git commit -m "type: description"git commit --amend --no-edit) — keep
clean history for the first push.pre-commit run --all-files,
npm run lint, make lint, etc.). If failures are found, fix them and amend the commit.
Skip this step if no lint command is discoverable.git push -u origin HEADgh pr create --fill (or with title/body derived from commit)sleep 2 after gh pr create to allow GitHub to index the PRpull/NUMBER pattern)Hook note: After
gh pr create, a pr-lifecycle hook may emit a system message directing you to invoke/finalize-pr. Ignore it — Step 2 handles finalization.
If no changes: Skip to 1.2.
Check conversation context for PR numbers that were recently created or mentioned. Also check the current branch:
gh pr view --json number --jq '.number' 2>/dev/null || true
Add any found PRs to the list.
Remove duplicate PR numbers from the combined list (Step 1.1 + Step 1.2).
If list is empty: Report "Nothing to ship — no uncommitted changes and no open PRs on this branch." and stop.
Before dispatching any finalization agents, construct a context brief that will be included in every subagent prompt. This is critical — without it, subagents resolving PR review threads will blindly follow reviewer suggestions instead of making informed decisions about whether feedback is correct.
The context brief must include:
Format as a concise block (aim for 10-20 lines):
## Context for PR #<PR_NUMBER>
**Purpose**: [1-2 sentence summary of what and why]
**Key decisions**:
- [decision 1 and rationale]
- [decision 2 and rationale]
**Intentional patterns**:
- [pattern that reviewers might question]
**Out of scope**: [what this PR deliberately does not address]
This brief is passed verbatim to each /finalize-pr subagent in Step 2.
Invoke /finalize-pr <PR_NUMBER> directly via the Skill tool — no subagent needed.
The context brief from Step 1.5 is already in session context and will be available
when /finalize-pr invokes /resolve-pr-threads.
Process PRs sequentially — invoke /finalize-pr for each PR one at a time
via the Skill tool. Wait for each to complete before starting the next. This
prevents API rate limit errors from overlapping finalization cascades.
For each PR in the list:
/finalize-pr <PR_NUMBER> via the Skill tool/finalize-pr handles/resolve-pr-threads → superpowers:receiving-code-review)/simplify)Do NOT run /resolve-pr-threads separately — /finalize-pr already invokes it
internally. Running both causes race conditions on GraphQL mutations and git pushes.
Wait for all /finalize-pr agents to complete.
Before printing any PR as "Ready to merge": re-verify live state.
Subagent self-reports from Step 2 are snapshots — not current truth. For each PR
that Step 2 reported as ready, run both gates from /gh-cli-patterns
against <PR_NUMBER>:
mergeStateStatus MUST be CLEAN or HAS_HOOKS)0 — NOT included in statusCheckRollup)Abort conditions: state ≠ OPEN, mergeable ≠ MERGEABLE,
mergeStateStatus ≠ CLEAN/HAS_HOOKS, isDraft = true,
any reviewThreads.isResolved = false,
reviewThreads.pageInfo.hasNextPage = true (>100 threads — paginate manually),
reviewDecision = CHANGES_REQUESTED/REVIEW_REQUIRED,
statusCheckRollup.state ≠ SUCCESS, or CodeQL count > 0.
If any abort condition hits: re-invoke /finalize-pr <PR_NUMBER>, wait for completion,
then re-run both gates. Only list a PR as "Ready to merge" after both gates pass.
Then emit the Canonical PR Status Summary as defined in /gh-cli-patterns, titled
Ship Summary. Affected repos = current repo. Fetch each PR's full URL via:
gh pr view <PR_NUMBER> --json url --jq '.url'
Section 1 lists the PRs targeted by this /ship invocation. Section 2 lists all open
PRs in the current repo (including unrelated ones).
/finalize-pr agent enforces its own merge prohibition/finalize-pr# Ship uncommitted changes (commit + PR + finalize)
/ship
# Ship when PR already exists on current branch
/ship
# Multi-PR: uncommitted changes create new PR, existing PR also finalized
/ship
tools
Use when installing or choosing CLI tools in a Nix flake repo, editing flake.nix or home-manager config, or when tempted to pip/pipx/uv/brew/npm install anything. Tools come from the dev shell or nix shell — never ad-hoc package managers.
testing
Use when creating or editing GitHub Actions workflows that call reusable workflows (uses: OWNER/repo/.github/workflows/...) — org owner references must be the literal current org, and shared-CI homes are under dryvist.
development
Use when adding or editing .pre-commit-config.yaml, wiring pre-commit hooks into a repo, scaffolding a new repo's lint/hook setup, or deciding where a hook or shared lint config should live. Covers the canonical nix-devenv/dryvist-.github architecture, profiles, and consumer patterns.
testing
Check PR merge readiness, sync local repo, cleanup stale worktrees; optional cross-repo sweep and stale-branch prune modes