ワンクリックで
ship
Commit, push, create PR(s), and auto-finalize — full automation pipeline. Handles uncommitted changes and recently created PRs.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Commit, push, create PR(s), and auto-finalize — full automation pipeline. Handles uncommitted changes and recently created PRs.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when creating PRs, linking issues, managing PR comments, or creating GitHub issues
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.
Emit a paste-ready two-part handoff for a fresh session: a `## Goal statement` hard-capped under 4000 characters (measured with wc -c, never estimated) that pastes straight into Claude Code's /goal Stop hook, plus an unbounded `## Full prompt` carrying cwd, ordered reading list, hard rules, pitfalls, and deliverables. Use when forking work to a new session, spinning up an orchestrator, or when wrap-up needs a next-session prompt with a real goal and not just a task list.
Analyzes current session state and repository status without any cleanup. Full mode (default): resolves the active plan file, reads plan checklist + TaskList, gathers unfinished work/issues from conversation history, checks git status, and emits a /handoff-built next-session prompt. Mid-session mode (`/session-status mid`): a fast plain-language 'done vs remaining' snapshot for mid-flight orientation, skipping the history scan, triage, and handoff.
End-of-session handler that first checks whether the current session's plan is actually complete. If complete: refresh repo, run quick retrospective, clean gone branches, and emit a forward-looking follow-up prompt. If incomplete: skip cleanup and emit one or more `cd`-into-worktree blocks paired with ready-to-paste resume prompts so the unfinished work can be picked up cold in a new session.
Automatically finalize pull requests for merge by resolving CodeQL violations, review threads, merge conflicts, and CI failures. Handles single PR (current branch or by number), all open PRs in the repo, or all open PRs across the org. Includes bot-authored PRs in all modes.
| name | ship |
| description | Commit, push, create PR(s), and auto-finalize — full automation pipeline. Handles uncommitted changes and recently created PRs. |
| allowed-tools | Bash(git *), Bash(gh *), Bash(pre-commit *), Bash(npm run lint*), Bash(make lint*), Agent, Read, Grep, Glob, Skill |
Single command to commit, push, create PR(s), and auto-finalize everything.
Handles commit, push, PR creation, and /finalize-pr in one pipeline.
⛔ 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:
Claim check (session-coordination rule): before creating a new PR, search for a competing claim — an open PR (draft or ready) from another session covering the same issue or files:
gh pr list --state open --json number,title,isDraft,headRefName,body
If one exists, do NOT create a duplicate: stop, report the competing PR, and offer consolidation (comment with your session id; earliest claim wins). Otherwise continue.
Create branch if on the default branch (see /gh-cli-patterns Canonical
Default-Branch Detection): git checkout -b {type}/{sid8}-{description}
(derive from changes; {sid8} = session id per session-coordination)
Stage changes: git add <relevant files> (no -A — be selective)
Commit with conventional commit message: git commit -m "type: description"
Simplify: Invoke /simplify on all changes in the commit. If /simplify produces
changes, stage them and amend the commit (git commit --amend --no-edit) — keep
clean history for the first push.
Validate locally: Run project linters/tests if available (check for 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.
Push: git push -u origin HEAD
Create PR: gh pr create --fill (or with title/body derived from commit).
Include the session id (<runtime>-<host>-<8hex>) in the PR body.
Pacing: Run sleep 2 after gh pr create to allow GitHub to index the PR
Capture PR number from output (look for pull/NUMBER pattern)
Add it to the PR list
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.
[!IMPORTANT] If the repo uses Git Flow (default branch is
develop), once the feature PR is merged intodevelopand validated, you must promotedeveloptomainusing/promote-release. Add a reminder to the active session checklist to perform this merge before completing the session.
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.
Requesting a human — main-targeted PRs only. When a PR targeting main needs
a human before merge — you are not confident enough, or merging would cut a release
you are not authorized to trigger — apply the label and report it instead of
merging. This is the sanctioned way to ask for a human:
gh pr edit <PR_NUMBER> --add-label "human:review"
Never apply it to a develop-targeted PR: merges into develop are always
AI-initiated, so there is nothing to request there.
Never merging a labelled PR — unconditional. /ship never merges a PR carrying
human:review, whatever its base branch, without an explicit same-session user
instruction to merge THAT PR. The scoping above governs where you may apply the
label, not whether to honor one already present: a label on a develop PR means a
human put it there deliberately, and this gate fails closed. See pr-standards
(git-standards) → Human-Review Gate.
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.
After both gates pass for a PR, record the evidence so a later session can trust the change without re-verifying (refs dryvist/ai-assistant-instructions#749):
head_sha=$(gh pr view <PR_NUMBER> --json headRefOid --jq '.headRefOid')
gh api "repos/{owner}/{repo}/statuses/$head_sha" \
-f state=success -f context=agent-validated \
-f description="<one line: what was verified (gates, CI, tests run)>" \
-f target_url="$(gh pr view <PR_NUMBER> --json url --jq '.url')"
gh label create "validated:pass" --color 0e8a16 \
--description "agent-validated status is success on head SHA" 2>/dev/null || true
gh pr edit <PR_NUMBER> --remove-label "validated:pending" \
--remove-label "validated:fail" --add-label "validated:pass" 2>/dev/null || true
If a PR ends blocked or failing instead, post state=failure with a
description of what failed and set validated:fail the same way.
The commit status is the machine truth — it is bound to the exact head
SHA. The validated:* label is only a human-visible mirror and goes stale
the moment new commits land; never trust the label over the status.
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).
# 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
human:review and the absolute no-merge-without-instruction rule