Resources
2Install
npx skillscat add brandonocasey/dotfiles/ship Install via the SkillsCat registry.
Ship the current branch: push it, open or update the MR/PR, and report. When
the argument names a local branch, run every step from that branch's worktree.
Create one with the worktree skill if none exists. Other argument text is a
task to finish first.
Parse --approve and --merge as options, not branch or task names.
With several branch names or all, ship each branch in turn, a parent before
its dependent children. For all, list the branches that have a .worktrees/
worktree with a clean tree and commits ahead of TARGET, excluding worktrees
another task uses. Show each with its ahead count and ask once before the first
push. For branches that depend on each other, follow Chains of dependent
MRs/PRs in dependent-branches.md.
Ordinary shipping ends after the push, MR/PR update, and any triggered review with its fix push.
When a rebase of more than about 5 commits conflicts on a lockfile, read
lockfile-rebase.md.
With --approve or --merge, read merge.md before
mutations to check platform support and scope. Approval and merge run after the
review's fix loop (step 4).
When a session-resume record exists for the task, read it before the context
check and apply session-resume's reuse rules.
Start only with push authorization under git-policy.md. Without it,
ask one question and stop. With it, run every step yourself. Never tell the
user to type /ship.
0. Detect context (always run first)
Always read first, in one parallel batch: context.md,shared/git-flow.md, shared/default-branch.md, and shared/git-policy.md.
1. Commit gate
Run the Commit gate from shared/git-flow.md. It owns task scope, the
clean-tree check, and the commit report against COMMIT_BASE. With a changed
submodule, run the Commit gate in shared/submodules.md first; it gates the
submodule and the gitlink bump before the superproject.
2. Push
Immediately before any push, refresh BRANCH and resolve the liveREMOTE_DEFAULT again. Stop if BRANCH equals it or TARGET.
Pause auto-merge on EXISTING and any submodule MR/PR per
auto-merge-pause.md. If EXISTING is queued,
follow its Queued MR/PR rule, then rerun step 0 on the new branch.
If auto-merge cannot be disabled and the user agrees to push, review before the push; that is the hand-off review, so skip the after-push review.
- First push, or new commits on an already-pushed branch:
git push -u origin <BRANCH>. - Branch exists on the remote but histories diverged (rebase/amend since last push):
git push --force-with-lease --force-if-includes origin <BRANCH>.
If rejected, reconcile remote changes and rerun affected checks; never drop either safeguard.
Never plain--force; never any force onTARGETorREMOTE_DEFAULT; never push either from this skill. - With a changed owned submodule, follow Ship in
submodules.md first; it owns the submodule push and
the superproject's--recurse-submodules=checkpush. - Check that the push landed (
git status -sbshows no ahead-count) and say so. - Record
HEAD_SHAfromgit ls-remote origin refs/heads/<BRANCH>. Record it
again after each later push. Step 6 andmerge.mduse it.
3. Open or update the MR/PR
- Refresh
EXISTINGbefore creation. Update it instead of creating a duplicate.
If its base changed during this run, reread it before deciding the target. - Title: the repo's commit/MR convention — read the repo's AGENTS.md / CLAUDE.md /
CONTRIBUTING for it. For conventional titles, choose the type with thecommitskill's
Choosing the type procedure; a squash merge makes the title the commit. IncludeTICKETwhen set. If the repo requires a ticket and there is
none, never invent a key:- The user asked for a ticket: run mr-ticket and use its key.
- The user said no ticket: ship without one.
- Otherwise run mr-ticket to find or create one; it picks the project.
Skip the ticket for dx, docs, or test-only changes. Ask once only when two candidate tickets match.
- Description: follow the repository template when present. Otherwise:
- Use 1–4 sentences on what changed and why, then 1–10 bullets, as few as
possible, for behavior changes, risks, and validation. - Attach UI evidence for UI changes unless text or the diff suffices.
- No checklists, file-by-file walkthroughs, or Summary/Changes/Testing headings.
- Lead with the concrete problem and resulting behavior. Describe the final
change for someone who has not read the conversation. - Reread before posting; drop sentences repeating another sentence, the title, or the diff.
- Use 1–4 sentences on what changed and why, then 1–10 bullets, as few as
- Use the recorded
TARGET. Leave draft state alone unless asked. - When
TICKETis set, move it to the open-MR/PR status per mr-ticket step 6.
4. Finish the requested scope
Before finishing the requested shipping scope: finish-scope.md.
5. Clean up
Follow task-resources.md,
except keep a running CI watch from step 4. Keep a worktree and its branch while
the MR/PR is open, unless the user requests cleanup; after merge or closure, use
the worktree skill's Remove section. If IN_WORKTREE is false, leave the
main checkout and its branch in place. Report retained paths and reasons.
6. Report
Before reporting shipping results: report.md.
Hard rules
- Never merge, approve, close, or mark ready unless the user asks.
- Create or transition tickets only through
mr-ticket, per step 3. Reuse keys you find.
Transitions moveTICKETforward only. - Everything in Shared rules of
shared/git-flow.md.