Ship pr
Ship a single change through a worktree -> branch -> PR -> squash-merge -> cleanup workflow - pick the right branch type (feat/fix/chore/docs/hotfix), implement, verify with this repo's real build/typecheck/test commands, open the PR, check CI, merge, and clean up. Use for any single PR-sized change in any git repo with a GitHub remote - a bug fix, a small feature, a doc edit, a dependency bump. For 3+ independently shippable PRs from one analysis pass, see parallel-ship. For sequential phases where each PR builds on the last, see epic-ship.From its SKILL.md
npx -y skills add davidtheproduct/claude-ship-skills --skill ship-prAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.7 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Ship PR
A repo-agnostic worktree -> branch -> PR -> squash-merge -> cleanup workflow. Works in any git repo with an origin remote and gh configured; the scripts detect the package manager and default branch rather than assuming pnpm/Turborepo/main.
This is the atomic unit of the ship stack: parallel-ship and epic-ship both call this skill internally (per fanned-out agent and per phase respectively). Invoke it directly for anything that is one PR-sized change.
Naming note: if a repo you work in defines its own project-level
ship-prskill (tuned to that repo's quirks), rename this personal-level copy (e.g.ship-pr-global) - in Claude Code's skill resolution, a personal-level skill overrides a project-level one of the same name, so an identical name would silently shadow the tuned version.
Step 1: Pick the branch type
| Change scope | Prefix |
|---|---|
Docs only (markdown, docs/**) | docs/ |
| New behavior | feat/ |
| Bug correction (behavior existed, broke) | fix/ |
| Tooling/refactor, no behavior change | chore/ |
| Production is broken right now | hotfix/ |
If unsure between feat/ and fix/: did this behavior exist and work correctly before? Correcting it is fix/. Adding something new is feat/.
Step 2: Worktree -> implement -> verify -> ship -> merge -> cleanup
-
Worktree:
bash ${CLAUDE_SKILL_DIR}/scripts/worktree-new.sh <prefix>/<slug>. Run from anywhere inside the target repo. It fetches the remote default branch (detected locally viarefs/remotes/origin/HEAD, falling back to agit remote show originnetwork call only if that's unset, then tomain), creates.worktrees/<slug>/at the repo root (added to.gitignoreautomatically if missing), installs dependencies with whatever package manager the repo's lockfile indicates, and copies untracked.env*files from the repo root if present. -
Implement: do the actual work. Implement directly rather than just writing a plan, unless the user asked for a plan. For large files (200+ lines), make incremental targeted edits rather than rewriting the whole file in one shot.
-
Verify - do not skip, do not just document it: check
package.json(or the repo's equivalent -Makefile,Cargo.toml, etc.) for what's actually available and run it:- A build script (
build,compile) if present. - A typecheck script (
typecheck,tsc, ortsc --noEmitdirectly) if the repo is TypeScript. - The test suite (
test). - Lint (
lint) if configured. - UI/visual change: run the app, take a screenshot, and actually look at it (use a screenshot-verification skill if you have one).
- Deps added/updated: install with
--frozen-lockfile/ci(not a plain install) to catch a drifted lockfile the way CI would. - Markdown touched: the skill-scoped hook on this skill greps added lines in every touched
.mdfile for em-dashes beforegit push/gh pr createand blocks if it finds any. Note this checks the diff, not the whole file - if this repo's CI whole-file-scans touched markdown (verify by checking the CI config), pre-existing em-dashes you didn't write can still fail CI even though this hook passed. - If the repo has branch protection requiring CI to pass, wait for it. If it doesn't (check repo settings or just try merging), CI is a second-opinion signal - don't sit and wait on a slow/queued run when the manual checks above already cover it.
Recommended CI job naming, if this repo is setting up checks from scratch:
docs-checkfor doc-only PRs (link/em-dash checks),code-qualityfor lint,unit-testsfor the test suite - scoped by changed-path so doc-only PRs skip the code checks. - A build script (
-
Ship: commit, push,
gh pr create --fill. -
Merge: note that on private repos under GitHub's free plan there is no branch protection at all - nothing platform-side stands between a green PR and the default branch, so this skill's rules are the actual merge gate. The policy:
Change Merge behavior Why Docs-only Self-merge immediately Trivial verification, nothing platform-side to wait for feat / fix / chore Self-merge after verification Same default; step 3 just has more to clear first Payments, auth, data-integrity Leave PR open for human review The one exception - never self-merge, even on green CI Glance at
gh pr checks <PR#>. Still running/queued and not required to merge -> proceed, don't block on it. Red for something step 3 already predicted and fixed -> proceed. Red for something unpredicted -> stop and investigate before merging, don't merge blind. Otherwise:gh pr merge --squash --delete-branch, thenbash ${CLAUDE_SKILL_DIR}/scripts/worktree-close.sh <slug>immediately, not "later" - don't batch cleanup.
Hard rules
- Never push directly to the default branch. Every change is its own PR.
- Fork fresh from the remote default branch (
worktree-new.shdoes this automatically) - never build on top of another unmerged branch. - Close the worktree immediately after merge.
- One PR-sized change per invocation. If what you're doing is several independently shippable PRs from one analysis pass, use
parallel-shipinstead. If it's sequential dependent phases (PR N+1 builds on PR N), useepic-ship- it calls this skill once per phase in order. - High-risk changes (payments, auth, data-integrity, anything a human should eyeball before it goes live) should not self-merge on green CI - leave the PR open for human review instead of completing step 5 automatically.
Enforcement
The skill-scoped hook (scripts/check-em-dashes.sh) fires on every git push/gh pr create while this skill is active and blocks on em-dashes added to touched markdown. It cannot catch everything CI might check (lockfile drift, lint, types, whole-file em-dash scans) - the manual verify step above still matters.
What ships with it: 3 files
8.1 KB alongside SKILL.md, 3 of them executable
scripts/
- check-em-dashes.shruns1.5 KB
- worktree-close.shruns3.2 KB
- worktree-new.shruns3.3 KB