Makes Claude run your pre-ship check skills before it pushes, publishes or deploys. A Claude Code mod that holds the command until the checks have run since your last edit.
/plugin install ship-sentinel --marketplace arm-pz/ship-sentinel
Run it inside Claude Code 2.1.287 or later, the release that added mods. Version 0.1.0, free under MIT. Fails open, and touches no files, network or processes.
Type a command Claude might run. This box tests it against the same patterns the mod ships in hooks/register.js.
Held until your checks have run.
Matched git push. In ask mode you choose “Run checks first” or “Ship anyway”.
You wrote the checks as skills: a security pass, a performance audit, a preflight. Claude loads a skill when it decides to, and the moment you most want it to is the moment it is least likely to, with a push or a deploy a few seconds away.
Ship Sentinel holds git push, PR, publish and deploy commands until your check skills have run since your last edit. It contains no checks of its own; it makes sure yours ran.
Install the mod from its own marketplace, in Claude Code.
/plugin install ship-sentinel --marketplace arm-pz/ship-sentinel
Name your checks, for example pre-ship-security-red-team,pre-ship-performance-audit. All of them must have run since the last edit. Any skill name works; the default is release-gate.
/plugin configure ship-sentinel@ship-sentinel
claude plugin install ship-sentinel --marketplace arm-pz/ship-sentinelclaude --plugin-dir ./ship-sentinel, then /plugin lists it as active.| Moment | What happens |
|---|---|
A ship command runs with a required skill not yet run: git push, gh pr create or merge, gh release create, npm, pnpm, yarn or bun publish, wrangler deploy, vercel --prod, netlify deploy --prod, docker push, dotnet nuget push, cdk or sam deploy, terraform apply | Held, refused or flagged, depending on the mode. After two holds it lets the command through, so it can never trap a session. |
| A required skill is expanded | It counts as run. |
| A file is edited after the checks ran | The checks go stale. |
| You write “ship it”, “go live” or “deploy to prod” | One line of context names the outstanding checks. |
/ship-sentinel, /ship-sentinel off, /ship-sentinel on | Shows state, snoozes, resumes. |
ship-sentinel held this command: release-gate has not run since the last edit. Run that skill on the current changes, fix what they find, then retry. If a skill is not available, tell the user instead of retrying.
Copied from the source, hooks/register.js. Below, what claude plugin validate reports the mod can do, run on 2026-10-21 against version 0.1.0.
hooks: ./register.js session.start, skill.prompt, tool.call{tool=Edit|Write|MultiEdit|NotebookEdit}, tool.call{tool=Bash}, prompt.submit, command.run{command=ship-sentinel}
calls: ./register.js $.command.register, $.ui.ask, $.ui.status, $.ui.toast
No. It holds the command and tells Claude, or asks you, which skills to run first. In ask mode you decide; in block mode Claude is told to run them and retry.
Yes, and so can a rewritten command. It reads the text of a Bash command, so it is a reminder, not a security control, and echo "git push" also matches. For enforcement use permission rules or managed settings.
Four calls: $.command.register, $.ui.ask, $.ui.status and $.ui.toast. No files, processes, network, environment variables or model calls. Mods are not sandboxed, so read that list, and the one short file, hooks/register.js, before installing any mod.
No. It means the skill was loaded since your last edit. A skill that was loaded and then ignored counts as run. Checking a receipt the skill writes is a planned improvement, described in DESIGN.md.
claude -p or the VS Code panel?Hooks run, but a question or toast may not draw, so use block mode there. Under an organisation that allows only managed mods, user mods do not load.
Not tested with subagents. It watches Bash commands only, so a ship done through an MCP tool is not seen.
Read it before you install it: the whole mod is one short file, hooks/register.js, in arm-pz/ship-sentinel.