Agent skill

Ship PR

by openbootdotdev in openbootdotdev/openboot

A skill your agent uses when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it"…

MITAuto-check: warningsDevelopment

Install Ship PR

The automated check flagged lines worth reading first. See the safety section below.

skills CLI
$ npx skills add openbootdotdev/openboot --skill ship-pr -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install openbootdotdev/openboot ship-pr --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ship-pr .claude/skills/ship-pr && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ship-pr
GitHub stars
275
Token cost
~3.6k tokens
SKILL.md length
1,855 words
Files
2
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it"…

  • Works in 8 steps: Confirm the branch is shippable → Push → Open the PR → …
  • The user is done editing and wants to ship the current branch via a pull request — phrases like open a PR
  • SKILL.md covers When NOT to use, The flow and What NOT to do
  • Calls gh and git

What it does

Ship PR is an agent skill from openbootdotdev/openboot. Use when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it", "merge it", "land this", "提 PR", "提个 PR", "提个 MR". Trigger whenever the user signals a change is finished and should head to the default branch, even if they don't say the word "PR". Walks the whole branch-to-merge flow for any GitHub repo with a mandatory review gate — the steps and their rules live in the body. Do NOT trigger for gh pr…

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).

It sits in Development, covering Pull requests and Human-in-the-loop approvals. It works with GitHub, Homebrew and macOS. The repository describes itself as: Set up your Mac dev environment in one command — CLI + Web Dashboard + Team sharing. The licence is MIT.

When your agent uses it

  • The user is done editing and wants to ship the current branch via a pull request — phrases like open a PR
  • Ever the user signals a change is finished and should head to the default branch
  • Even if they dont say the word PR
  • Gh pr view / status checks on an existing PR

Example prompts

  • “open a PR”
  • “ship it”
  • “ship this”
  • “/ship-pr”

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Confirm the branch is shippable
  2. Push
  3. Open the PR
  4. Wait for CI
  5. Get a review
  6. Triage the findings
  7. Merge
  8. Local cleanup

What it can do on your machine

Read from SKILL.md and the folder at commit 259b119. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gh
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Ship PR loads about 3.6k tokens when it runs. Until then it costs about 163 tokens; SKILL.md has 1,855 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~163
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: warnings

The automated check found patterns that need a careful read before installing.

  • WarningTells the agent its actions are pre-authorized / not to stop for confirmationSKILL.md:298
    synced"). On a clean review, don't ask for confirmation *before* merging.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from openbootdotdev/openboot at commit 259b119, republished under its MIT licence (© openbootdotdev). 1,855 words, ~3,618 tokens.

Download SKILL.mdSave it as .claude/skills/ship-pr/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
ship-pr
description
Use when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it", "merge it", "land this", "提 PR", "提个 PR", "提个 MR". Trigger whenever the user signals a change is finished and should head to the default branch, even if they don't say the word "PR". Walks the whole branch-to-merge flow for any GitHub repo with a mandatory review gate — the steps and their rules live in the body. Do NOT trigger for `gh pr view` / status checks on an existing PR, for draft / WIP PRs the user wants opened but not merged, or for cutting a release tag.
license
MIT
metadata.category
git
metadata.language
en

Ship a PR

The canonical way to move a finished change from a feature branch to the repo's default branch through a pull request — for any GitHub repo, without hardcoding one project's build commands or check names.

There are two gates between your branch and the default branch:

  • Mechanical — the repo's required CI checks. GitHub already enforces these via branch protection; let them run.
  • Inferential — a human-judgment review of the diff. CI catches what it knows how to check; this catches behaviour, design, test coverage, risk, and rollback. This gate is the reason the skill exists.

Auto-merge is intentionally not used. gh pr merge --auto merges the moment CI passes, which skips the review gate entirely — that defeats the purpose. The merge command is run from this session, after the diff has been reviewed.

When NOT to use

  • Draft / WIP PRs the user wants opened but not merged → not this flow; if it's already been invoked, just gh pr create --draft and stop.
  • Changes to .github/workflows/, branch protection, or repo settings → these usually need a human in the GitHub UI too; flag it.
  • Cutting a release (tags like v1.2.3) → releases follow the repo's own release process, not this flow.

The flow

Step 1 — Confirm the branch is shippable
bash
git status -sb                                # clean except the expected diff?
git rev-parse --abbrev-ref HEAD               # the current branch
git fetch origin --quiet                      # refresh the remote base ref
git remote set-head origin --auto >/dev/null  # fetch never creates origin/HEAD; this does
BASE=$(git symbolic-ref --quiet --short refs/remotes/origin/HEAD 2>/dev/null | sed 's@^origin/@@')
BASE=${BASE:-main}                            # the repo's default branch
git log --oneline "origin/$BASE..HEAD"        # commits actually exist

$BASE is the repo's default branch — usually main, sometimes master or develop. Don't assume main; use what was detected. Comparisons run against the remote ref origin/$BASE (hence the git fetch), so they match what GitHub will diff the PR against even when the local base branch is missing or stale — common in worktrees and feature-only checkouts.

  • The remote isn't GitHub (git remote get-url origin) → stop; this flow is gh-only, tell the user (a GitLab "MR" needs a different flow).
  • On the base branch → stop, make a feature branch first.
  • No commits ahead of origin/$BASE → stop, nothing to ship.
  • A PR may already exist for this branch (gh pr view succeeds) → still push (Step 2) so the PR has the latest commits, then skip Step 3 and continue at Step 4.
Step 2 — Push
bash
git push -u origin "$(git rev-parse --abbrev-ref HEAD)"

If the repo installs a pre-push hook (Husky, core.hooksPath, etc.) it runs here automatically — don't re-run the same lint/test suite by hand. If no hook is installed, that's the user's setup; CI is still the gate.

Step 3 — Open the PR

Check for a PR template first — using it keeps the PR consistent with the repo's conventions instead of inventing a different shape:

bash
ls .github/pull_request_template.md .github/PULL_REQUEST_TEMPLATE.md \
   PULL_REQUEST_TEMPLATE.md pull_request_template.md \
   docs/PULL_REQUEST_TEMPLATE.md docs/pull_request_template.md \
   .github/PULL_REQUEST_TEMPLATE/ 2>/dev/null

If a template exists, fill in its sections honestly — including any cross-repo / checklist items (e.g. "needs a docs update?"). Do not discard it by passing a wholly custom --body. gh pr create without --body tries to open an interactive editor, so fill the template offline and pass it back:

bash
gh pr create --title "<conventional commit subject>" --body-file <filled-template-file>

If there's no template, fall back to a sensible default:

bash
gh pr create --title "<conventional commit subject>" --body "$(cat <<'EOF'
## Summary

- <what changed and why>

## Test plan

- [ ] <how you verified>
EOF
)"

Title rules:

  • Conventional Commits prefix: feat: / fix: / docs: / refactor: / test: / chore: / ci: / perf: / style: / build: / revert:.
  • Optional scope: fix(api):, feat(editor):.
  • Keep under ~70 chars. Detail goes in the body.
  • Several commits on the branch → write a fresh subject that sums up the whole PR (squash merge makes it the final commit subject).
Step 4 — Wait for CI
bash
gh pr checks --watch

This blocks until every check finishes. (Run straight after gh pr create it can error with "no checks reported" before the first check registers — wait a few seconds and re-run; exit code 8 just means checks are still pending.) If a required check fails:

  • Stop. Do not proceed to review or merge.
  • Read the failure (gh run view --log-failed), explain it to the user, and ask whether to fix it now.
  • Checks that aren't required (drift sensors, optional coverage, advisory scans) are informational — flag them, but they don't block the merge.

If you can't tell which checks are required, the ones branch protection enforces are; gh pr checks marks the rest, and the merge in Step 7 will refuse anyway if a required one is red.

Step 5 — Get a review

Once CI is green, the diff needs an inferential review — behaviour, design, test coverage, risk, rollback. Prefer to have the @claude GitHub bot do this first pass on the PR itself, so the review lives next to the code where the whole team can see it. Fall back to a local review only when the bot isn't available.

5a — Is the Claude bot wired up for this repo?

The bot is the Claude GitHub App driven by anthropics/claude-code-action. The reliable, permission-free signal is a workflow that uses it:

bash
grep -rilE 'anthropics/claude-code-action|@claude' .github/workflows 2>/dev/null

(With repo-admin scope you could also confirm via gh api "repos/{owner}/{repo}/installations" --jq '.[].app.slug', but that 403s without admin — don't depend on it.)

  • Match found → the bot can review; go to 5b.
  • No match → the app isn't set up here; skip to 5d (local fallback).

5b — Request the review (or pick up an automated one)

bash
PR=$(gh pr view --json number -q .number)

Some repos run claude-code-action automatically on every push (on: pull_request), so a claude[bot] review for the current commit may already be on its way — check before posting, to avoid asking twice:

bash
gh pr view "$PR" --json comments \
  -q '.comments[] | select(.author.login|test("claude|github-actions")) | "\(.author.login)\t\(.createdAt)"'

(Comment objects carry createdAt, not updatedAt — and the sticky comment is edited in place, so an old timestamp can still be a live review. When in doubt, just mention the bot again.)

If there's no current bot comment, summon it with a mention. A focused prompt gets a more useful review than a bare "review this":

bash
gh pr comment "$PR" --body "@claude please review this PR — focus on correctness, design, test coverage for the branches it adds, risk, and how it rolls back."

(@claude is the default trigger; a repo can rename it via trigger_phrase in its workflow. If the mention gets no response at all, check the workflow for a custom phrase.)

5c — Wait for the bot, then read its review

The bot answers in a single sticky comment it edits in place — it shows progress first (checkboxes like "Analyzing…") and fills in the real review when done. Wait for it to finish; don't act on a half-written comment. It usually lands in under a minute, occasionally a few minutes under load.

bash
for i in $(seq 1 30); do
  body=$(gh pr view "$PR" --json comments \
    -q '[.comments[] | select(.author.login|test("claude|github-actions"))] | last | .body')
  if [ -n "$body" ] && ! printf '%s' "$body" | grep -qiE 'analyzing|in progress|- \[ \]'; then
    printf '%s\n' "$body" && break
  fi
  sleep 10
done

Re-fetch until the body reads as a completed review (no lingering "Analyzing…/in progress" markers). The author is normally claude[bot]; a repo using a custom github_token surfaces it as github-actions[bot] instead — either way it's obviously a Claude review by its content. A workflow configured to submit a formal PR review rather than a comment shows up under gh pr view --json reviews — glance there before declaring the bot unavailable. If nothing substantive shows up after a few minutes, treat the bot as unavailable and fall back. (If the loop times out but a bot comment is visible — e.g. a finished review whose body happens to contain unchecked checkboxes — read it manually instead of discarding it.) Carry whatever it found into Step 6.

5d — Local fallback

When the bot isn't wired up, or never returns a finished review, review the full PR diff yourself so the gate still closes:

bash
git diff "origin/$BASE"...HEAD
  • If a /code-review command or a repo-specific review skill is available, run it on the full diff — it's purpose-built for this.
  • Otherwise review inline: behaviour, design, test coverage for the branches this PR adds, risk, and how it rolls back.

Either way, the findings feed into Step 6.

Show full SKILL.md (690 more words)Show less
Step 6 — Triage the findings

Every finding lands in exactly one bucket. Getting this right is what keeps the gate from failing open.

Self-fixable → fix now, then loop back to Step 4. Mechanical corrections clearly inside the PR's stated scope: typos, formatting, doc wording, dead code this PR introduced, missing imports, missing tests for branches this PR adds, bug fixes that don't change observable behaviour, or following through on a rule the user already stated this session. Fix it, push to the same branch, wait for CI again, then re-request the review: capture the current sticky-comment body first, mention @claude again, and poll (as in 5c) until the body changes from what you captured and reads as complete — the sticky comment is edited in place, so the pre-fix review stays visible (and satisfies 5c's break condition) until the new one lands. Then re-triage. Don't prompt the user — the point is to spend their attention only on real decisions.

Needs user judgment → surface and stop. Anything with a genuine choice: design / API shape / behaviour changes, anything touching a deliberate prior decision or an existing convention, anything that would expand the PR beyond its stated scope — anything you'd ask a teammate about before pushing. State the file/line, the option, and the question; stop the flow.

Clean → merge directly. If CI is green AND nothing is self-fixable AND nothing needs judgment, go straight to Step 7. Don't ask "want me to merge?" — asking when there's nothing to decide just burns attention. The loop is supposed to close itself.

Rule of thumb: would a thoughtful engineer file this as a question, push a follow-up commit, or just merge it? Escalate / fix / merge accordingly.

Step 7 — Merge

Reached on a clean review, or after the user approved a merge following an escalation.

bash
gh pr merge --squash --delete-branch
  • No --auto — it skips the review gate (Step 5).
  • No --admin — it bypasses branch protection.
  • --squash keeps the default branch at one commit per PR; if the repo only allows merge commits or rebase, use --merge / --rebase instead (gh errors and tells you if the method isn't enabled).
  • Branch protection still applies — if something flipped red since Step 4, GitHub refuses and you loop back to Step 4.
  • Refused for missing approvals / unresolved conversations → that's an org-policy gate, not CI; looping back to Step 4 can never clear it. Surface it to the user instead.

Report the result as a one-liner ("PR #N merged, branch deleted, local synced"). On a clean review, don't ask for confirmation before merging.

Step 8 — Local cleanup

--delete-branch deleted the local and remote branch, and gh already switched the checkout back to the base branch — so don't git branch -d afterwards; the branch is gone and the command just errors. The one thing gh doesn't do is pull:

bash
git pull --ff-only

If the merge ran from somewhere unusual (a worktree, detached HEAD) and the local branch survived, delete it manually with git branch -d. This step is part of the loop, not optional: because the merge is synchronous (no --auto), there's no reason to leave the checkout behind the base.

What NOT to do

  • No --auto by default — it skips the review gate, the whole reason for this skill. If the user explicitly asks for it: don't arm it silently — say what it skips, and offer to close the gate now (review the diff first, then arm auto-merge; at that point --auto only skips the CI wait). If they still want it after being told, do it: their repo, their call. Caveat: auto-merge stays armed across later pushes, so disarm or re-review before pushing anything else.
  • No --admin — bypasses branch protection.
  • Don't merge before CI finishes — even a trivial-looking diff; drift checks sometimes catch surprising things.
  • Don't amend / force-push after gh pr create unless the user asks — it invalidates in-flight reviews and re-runs CI from scratch.
  • Don't push directly to the default branch — branch protection rejects it, and it skips both gates.
  • Don't auto-fix findings that need judgment — behaviour changes, scope expansion, or anything touching a prior deliberate choice gets surfaced in Step 6, not silently committed. What counts as self-fixable is exactly Step 6's first bucket — when in doubt, escalate.

© openbootdotdev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .agents/skills/ship-pr of openbootdotdev/openboot.

  • SKILL.md
  • agents/openai.yaml

Open the folder on GitHubat commit 259b119

Compare with similar skills

Ship PR next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Ship PR compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Ship PR this skillopenbootdotdev/openboot275—~3.6kAutomated safety check: WarnMIT
Mole CLI Release Flowtw93/Mole70k—~2.5kAutomated safety check: PassGPL-3.0
Releaseeugene1g/agent-safehouse2.1k—~3.5kAutomated safety check: PassApache-2.0
Review This Branchno-human-ai/no_human330—~1.4kAutomated safety check: PassMIT
Plannotator Referencebacknotprop/plannotator9.2k—~6.3kAutomated safety check: WarnApache-2.0
Debug Os Failure On GitHubstrands-agents/box110—~1.3kAutomated safety check: NotesApache-2.0

Similar skills

  • Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.

    70k GitHub stars~2.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Release

    eugene1g/agent-safehouse

    Run the local Agent Safehouse release flow: inspect commits since the last published release, propose the next SemVer version and changelog, present a dry-run for confirmation, then update…

    2.1k GitHub stars~3.5k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Review This Branch

    no-human-ai/no_human

    Run the nohuman review gate (fresh-session adversarial reviewer + tamper guard) over the current branch or a GitHub pull request, with no server, no database, and no onboarding, and relay the…

    330 GitHub stars~1.4k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Plannotator Reference

    backnotprop/plannotator

    Reference for picking the right Plannotator tool or command for plan review, code review, annotating files and URLs, archived plan decisions and Guided Reviews.

    9.2k GitHub stars~6.3k tokensUpdated today
    DevelopmentAuto-check: warnings
  • Debug Os Failure On GitHub

    strands-agents/box

    Debug a CI failure on an OS you are not on (you are on Linux, it fails on macos-latest, or the reverse) without opening a pull request per attempt.

    110 GitHub stars~1.3k tokensUpdated today
    DevelopmentAuto-check: notes
  • PR Workflow

    kmworks/kmreader

    Create and merge KMReader GitHub pull requests. An agent skill from kmworks/kmreader.

    111 GitHub stars~899 tokensUpdated today
    DevelopmentAuto-check passed

More from openbootdotdev/openboot

  • Bootstrap Feature

    openbootdotdev/openboot

    A skill your agent uses when adding a new CLI subcommand or feature to openboot.

    275 GitHub stars~1.1k tokensUpdated 15 days ago
    Auto-check passed

Categories

Questions about Ship PR

What does Ship PR do?

A skill your agent uses when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it"…. Ship PR is an agent skill from openbootdotdev/openboot. Use when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it", "merge it", "land this", "提 PR", "提个 PR", "提个 MR".

When should I use Ship PR?

Ship PR fits situations like: the user is done editing and wants to ship the current branch via a pull request — phrases like open a PR; ever the user signals a change is finished and should head to the default branch; even if they dont say the word PR; gh pr view / status checks on an existing PR.

How do I install Ship PR in Claude Code?

Run `npx skills add openbootdotdev/openboot --skill ship-pr -a claude-code`. Or copy the skill folder (.agents/skills/ship-pr in openbootdotdev/openboot) into .claude/skills/ship-pr in your project. Claude Code loads it when a task matches its description.

How do I install Ship PR in Codex?

Run `npx skills add openbootdotdev/openboot --skill ship-pr -a codex`. Or copy the skill folder (.agents/skills/ship-pr in openbootdotdev/openboot) into .agents/skills/ship-pr in your project. Codex loads it when a task matches its description.

Can I use Ship PR in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openbootdotdev/openboot --skill ship-pr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ship-pr, .gemini/skills/ship-pr, .github/skills/ship-pr and .opencode/skills/ship-pr in your project.

What does Ship PR need to run?

Going by SKILL.md and its folder, Ship PR needs the command-line tools its instructions call (gh and git).

Does Ship PR access the network?

SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Ship PR safe to install?

Our automated static check of SKILL.md flagged 1 warning(s): tells the agent its actions are pre-authorized / not to stop for confirmation. Read the flagged lines before installing; the check is not a guarantee either way.

What licence does Ship PR use?

Ship PR is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Ship PR use?

About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Ship PR?

Skills that share tags, products or a category with Ship PR: Mole CLI Release Flow (tw93/Mole, 70k stars), Release (eugene1g/agent-safehouse, 2.1k stars), Review This Branch (no-human-ai/no_human, 330 stars) and Plannotator Reference (backnotprop/plannotator, 9.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Ship PR?

openbootdotdev (a GitHub organization) maintains it in openbootdotdev/openboot, which has 275 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 23, 2026.

Source: openbootdotdev/openboot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.