ship-issues
Drives the whole batch: resolve, plan, lanes, checkpoint, the per-unit pipeline, docs, watchers. Trigger: "ship all the todo issues", "knock out FRA-111 through 120".
ship-it drives issue tracker tickets (or local changes) through plan, implement, review, and PR, concurrently across a batch, keeping living docs in step and enforcing rules. Every stage is also a standalone skill you can call on its own.
> ship all the todo issues_
resolve 2 work-units from Linear · FRA-144, FRA-145
plan 2 comprehensive plans (Plan agents), posted as proposals
lanes 2 concurrent · no file overlap
checkpoint review on the tracker, then approve
FRA-144
#224 green
FRA-145
#225 green
one prompt · two issues · two reviewed PRs
Add the marketplace, then enable ship-it. Refresh the marketplace clone first to get the latest version.
claude plugin marketplace add pricklywiggles/fractally-claude-marketplace claude plugin install ship-it@fractally-claude-marketplace
Run init. It detects what it can, asks only the gaps, writes .claude/ship-it/config.json, and self-verifies on disk.
> /ship-it:init detect · interview · write config validate · verify-init OK
Run a batch, or any stage skill standalone. Review at the checkpoint, then approve. Each PR carries a followable QA checklist.
> ship all the todo issues // after merge $ scripts/cleanup-worktrees.sh --all-merged
For development, point Claude at the live repo with --plugin-dir to skip the install dance entirely.
The engine is project-agnostic. A generic orchestrator drives reusable stage skills over a universal currency, the work-unit. Everything project-specific lives in one config file, produced by init. The flow never hard-codes a stack.
A piece is concurrent when it is per-work-unit; serial only when it touches shared state.
All human interaction is front-loaded into init and the Phase 3 checkpoint, so the workers run non-interactively and parallelize.
Six recurring nouns. A run is just these, arranged: work-units fanned into concurrent lanes, each in its own worktree, gated once before anything ships.
One shape every stage speaks, wherever the work came from. It rides through implement, review, and PR unchanged.
{ id, title, desc, branch, base, worktree, url, prNumber, plan }
Two work-units collide only if they touch the same file. Independent ones run as concurrent lanes off main; overlapping ones stack on dependent branches inside one lane. Capped by maxLanes (default 4).
Each lane runs in its own git worktree, made runnable by a project-owned prepare hook. The main checkout is never touched, and each tree is left runnable afterward for your QA.
The one place the run waits for you. Read the plans and lanes, posted to the tracker as proposals, then steer. Nothing is pushed until you approve.
Hard constraints carried verbatim into every worker prompt, so a parallel run cannot drift past them.
Where a run gets its work-units. A tracker for a batch, or local state for the change in front of you.
tracker
local
Before any code, each work-unit gets a comprehensive plan, written by the built-in Plan agent running plan-one-issue concurrently. The plan is the spec the implement stage builds against, and it sharpens the lane grouping.
Context, approach with alternatives, per-file changes and reuse, key decisions, edge cases, verification, risks. Depth scales: light / adaptive / full.
Each plan is posted to its issue as a proposal (idempotent, marker-keyed), updated in place on your feedback, then finalized as approved. Review it in the terminal or on Linear.
No planning or coding from training-data memory. Package and service-shape calls are confirmed against what the project actually has, checking node_modules, ~/.cargo/registry/src, site-packages, and context7. Unconfirmable calls are flagged, not asserted.
Every stage skill is callable on its own. Run just the review, just the CI fix, or push the current diff through the whole flow without a tracker.
Drives the whole batch: resolve, plan, lanes, checkpoint, the per-unit pipeline, docs, watchers. Trigger: "ship all the todo issues", "knock out FRA-111 through 120".
Detect-first, ask-second. Detects the package manager, verify command, CI, tracker, doc tools, and reviewers; asks only the gaps; writes and self-verifies the config. Trigger: "set up ship-it here".
A comprehensive, read-only plan grounded in the real code, with verified APIs. Trigger: "plan this issue", "draft a plan for FRA-123".
Implements the smallest correct change against the plan, verifies, commits. Guards the sync-to-async signature ripple. Trigger: "implement FRA-123 and verify it".
Audits the diff's comments: keeps the non-obvious why, drops narration. Runs only if comments changed. Trigger: "clean up the comments in this change".
Fans out your configured reviewers over the diff in parallel, merges findings, applies the warranted ones. Trigger: "review my diff with main and fix what matters".
Pushes and opens the PR with a two-part QA-ready body: automated checks run, plus a followable checklist with exact commands. Trigger: "open a PR for my branch".
Watches a PR's CI and fixes failures, bounded and cause-only. Trigger: "watch and fix the CI on this PR".
Each configured doc job runs in parallel and is one of three mechanics. Built-ins for OpenSpec, graphify, and impeccable; init generates a job for any other doc.
mechanic 01
Re-derive the doc from merged code, no authoring. Runs post-merge. If the target is gitignored (e.g. graphify-out/) it is just a local refresh, no PR.
built-in: graphify
mechanic 02
Author the artifact on-branch before open-pr so it rides the same PR; archive into canonical docs after merge. The spec ships with the code.
built-in: openspec
mechanic 03
Update a shared prose doc once. One triggering work-unit, it rides that PR; several, one consolidated pass on a docs branch.
built-in: impeccable · DESIGN.md
Produced by init, validated against a schema. validate-config.sh checks shape; verify-init.sh checks the generated files on disk.
// .claude/ship-it/config.json { "source": { "tracker": { "type": "linear", "idPrefix": "FRA-" } }, "planning": { "enabled": true, "postBack": true, "depth": "adaptive" }, "verify": [ "node_modules/.bin/biome check {changedFiles}", "node_modules/.bin/tsc --noEmit" ], "concurrency": { "maxLanes": 4 } }
skip confirmno Phase 3 checkpoint, proceed straight through
no docsturn off the whole documentation phase for this run
skip planfall back to a thin scope pass instead of full plans
At the gate you can reply approve, or give feedback on any plan ("use per-child attributes, not the deep value") and the proposal is revised in place before anything is built.