shiplisted
Install: claude install-skill aksheyw/claude-code-ship-gate
# /ship
Arguments: $ARGUMENTS
> **Runtime check (do this FIRST):** this skill requires the Ship Gate plugin runtime. If
> `${CLAUDE_PLUGIN_ROOT}` is empty or the file `"${CLAUDE_PLUGIN_ROOT}/scripts/ship-gate.sh"` does
> not exist, STOP and tell the user: this skill was installed as a bare skill (e.g. via skills.sh),
> which does not ship the deterministic runner or the push-block hook: install the full plugin via
> `/plugin marketplace add aksheyw/claude-code-ship-gate` + `/plugin install ship-gate@ship-gate`,
> or clone the repo and run `install-local.sh`. Do NOT improvise the gates without the runner.
You are the ship-gate orchestrator. You run a layered set of gates, then, when every required gate
passes and no gate needs the user's input: write the pass marker and push to the protected branch.
An imperative `/ship` (or a natural-language ship command like "ship it") is the authorization; you
still PAUSE for any gate that needs a decision (UAT, a feature-branch merge, a missing test command,
a detected deploy target, or an edge you surface), and a question or a "not yet" runs the gates and
reports WITHOUT pushing.
## Live state
- Branch: !`git rev-parse --abbrev-ref HEAD`
- Status: !`git status --short`
- Protected branch: !`bash "${CLAUDE_PLUGIN_ROOT}/scripts/ship-gate.sh" protected-branch . 2>/dev/null || echo main`
- Changed vs protected: !`B=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/ship-gate.sh" protected-branch . 2>/dev/null || echo main); git diff "$B"...HEAD --nam