Ship issues
Skill pricklywiggles/fractally-claude-marketplace/plugins/ship-it/skills/ship-issues
Ship a batch of work-units (tracker issues, or the current local changes) end to end and concurrently: implement, comment-cleanup, review and address, then push and open a PR for each, keeping the project's living docs current. Use for "ship all the todo issues", "knock out issues 111 through 120", "batch-fix these tickets and open PRs", "clear the todo column", "run the multi-issue workflow". Resolves the work-unit set from config.source, groups into concurrent lanes, and chains the ship-it stage skills per work-unit. Checkpoints on a plan first. Not for a single existing PR (use the stage skills directly) or just listing issues.From its SKILL.md
npx -y skills add pricklywiggles/fractally-claude-marketplace --skill ship-issuesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 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
12.4 KB, ~2.9k tokens by cl100k_base, as published. Nobody here has run it
ship-issues: batch orchestrator
Drive a set of work-units to open PRs concurrently, chaining the ship-it stage skills per work-unit, then keep the project's living docs current. Generic: every project specific lives in ship-it.config; the flow does not. Load the resolved config once up front with ${CLAUDE_PLUGIN_ROOT}/scripts/load-config.sh (defaults applied, @FILE refs like houseRules: @AGENTS.md inlined) and read keys with jq. Read references/workflow.md before Phase 5 (the lane algorithm and the Workflow template to adapt).
Phase 1: Resolve the work-units
If the trigger names no issue selection, ask first (do not default to a status like "all todo"): use AskUserQuestion to ask what to ship, a status, a range, specific ids, or the current changes, then resolve. When a selection is given, read config.source and expand it into concrete work-units:
tracker: list/get issues via the tracker adapter (config.source.tracker: type + project/team/idPrefix, or a custom resolver skill). A status ("all todo"), a range ("111-120"), or an explicit list. Each work-unit carriesid,title,desc,branch(the tracker's branch name, which carries the auto-close link),url.working-tree/branch/pr/describe: build a single work-unit from local state or a description.
Read each item's full intent. If any is ambiguous in a way that changes the implementation, batch the open questions into one AskUserQuestion now. All interactivity is front-loaded here and at the Phase 3 checkpoint. See references/sources.md for the source dispatch, the built-in tracker adapters (github-issues, linear), the local sources (working-tree / branch / pr / describe), and the custom-tracker extension point.
Trigger tokens. Three optional switches, anywhere in the trigger: a skip-confirmation token (skip confirm, no confirm, no checkpoint, without asking, just do it, yolo, -y, --yes) turns off the Phase 3 checkpoint; a skip-docs token (no docs, skip docs, code only, no specs) turns off the whole documentation phase (Phase 6) for this run, regardless of config.docs.enabled; a skip-planning token (no plan, skip plan, skip planning) turns off the Phase 2 plan pass (it falls back to a thin scope pass), regardless of config.planning.enabled.
Phase 2: Plan and group into lanes
- Plan pass (parallel, read-only): unless
config.planning.enabledis false (default true) or a skip-planning token is in the trigger, produce one comprehensive plan per work-unit, concurrently. Spawn each as aPlanagent (the built-in architect subagent:subagent_type: 'Plan', read-only, high reasoning effort) invokingship-it:plan-one-issue, so each plan rivals an interactive plan-mode plan (it reads the real code, weighs alternatives, names reuse, and lays out decisions, edge cases, verification, and risks) at the depth set byconfig.planning.depth. Each returns{ plan, predictedFiles, docNeed, complexity, openQuestions }. If planning is off, fall back to a thin scope pass: oneExploresubagent per work-unit for predicted files, a one-line approach, and the doc classification. Either way, read to plan, do not implement. - Post each plan as a proposal (if
config.planning.postBack): post each work-unit's plan back to its source as a proposed plan now, so it is reviewable on the tracker and not only in the terminal (idempotent, marker-keyed; seereferences/sources.md). Local sources have no tracker, so the plan stays on screen. - Group into lanes by the overlap-graph algorithm in
references/workflow.md(connected components of "edit the same file"), using each work-unit'spredictedFiles. Lanes run concurrently; within a lane, work-units run sequentially on stacked branches. - Branch + base per work-unit: lane head off
config.repo.mainBranch; a stacked child off its parent branch.
Fold any openQuestions the plan pass surfaced into the Phase 3 checkpoint, or resolve blocking ones with one AskUserQuestion before it.
Phase 3: Checkpoint on the plan
Unless a skip-confirmation token is in the trigger, show the plan and wait: the resolved work-units, each work-unit's plan (already posted to its tracker issue as a proposal in Phase 2, so you can review it there or in the terminal), the lanes (concurrent vs stacked), the predicted files, the predicted doc jobs, and a note that verification is config.verify and any config.safety rails apply.
Handle the response:
- Feedback: revise the affected work-unit's
plan, update its proposal comment in place viapostPlan(same marker, so no duplicate), and re-show the change. Iterate until approved. - Approval: finalize each plan's comment (
postPlanwith statusapproved) and proceed. - Skip-confirmation token: the plans are already posted as proposals; finalize them and proceed without pausing.
postPlan is idempotent and non-blocking: the proposal, every revision, and the final approval all update the same comment; a failed post is reported but never blocks the run. Local sources (working-tree / branch / pr / describe) have no tracker, so the plan stays on screen.
Phase 4: Pre-create lane-head worktrees
If config.worktree.enabled, create each lane head's worktree under config.worktree.root, sequentially (concurrent git worktree add races the index lock), and make each runnable with config.worktree.prepare. Stacked children are created lazily by their own fix-one-issue step off the parent branch, after the parent commits. Use ${CLAUDE_PLUGIN_ROOT}/scripts/setup-worktrees.sh --root <config.worktree.root> --prepare "<config.worktree.prepare>", feeding one <id>|<branch>|<base> line per lane head on stdin.
Phase 5: Run the batch
Adapt the Workflow template in references/workflow.md (fill in the resolved lanes, the path to ship-it.config, config.concurrency.maxLanes as the lane-concurrency cap, and the author-reconcile entries of config.docs.jobs so their artifacts are authored on-branch and ride the PR), then launch it with the Workflow tool. Per work-unit the pipeline chains the stage skills (it never reimplements them):
ship-it:fix-one-issue(creating the worktree first if a stacked child), implementing against the work-unit'splanwhen present (a stacked child first reconciles its plan with the parent's changes already on its base), then commit. ReturnsaddedCommentsanddocNeed.ship-it:comment-cleanupin apply mode, scoped to the work-unit's commit range, only ifaddedComments. Code-modifying, so sequential within a lane; concurrent across lanes.ship-it:review-and-addressover the work-unit's diff (fans outconfig.review.reviewers, merges findings, applies warranted perconfig.review.applyWarranted).- Author-reconcile docs, only when a
config.docs.jobsentry with mechanicauthor-reconcilematches the work-unit'sdocNeed: author the artifact on-branch by invoking the job'sref(e.g.openspec-propose) and commit it, so it rides the PR rather than being bolted on later. Seereferences/doc-jobs.md. ship-it:open-pr: push the branch and open a PR perconfig.prTemplate(basemainfor a lane head, the parent branch for a stacked child; GitHub auto-retargets a stacked PR to main when its parent merges).
Each result carries docNeed (the doc jobs it triggers) for Phase 6.
Phase 6: Documentation (doc-job fan-out)
Skip this entire phase if a skip-docs token was in the trigger, or if config.docs.enabled is false. Otherwise read references/doc-jobs.md for the mechanics and built-in jobs. After the Workflow returns, run the doc phase: for each job in config.docs.jobs, run the ones whose trigger (appliesWhen) matched a shipped work-unit, in parallel (each owns a different file). By mechanic:
- regenerate: deferred to Phase 7 (post-merge), because the doc is re-derived from the merged code, not the pre-merge base. Do not run it here.
- author-reconcile: the per-work-unit artifact was already authored on its branch in Phase 5 (it rides the PR); only the reconcile into canonical docs is deferred to post-merge (Phase 7).
- curate-serial: update the shared prose doc once, serially (e.g.
impeccablefor DESIGN.md). If exactly one work-unit triggered it, commit it onto that work-unit's open PR (rides the PR, atomic doc + code); if several, one consolidated pass on a separate docs branch.
Skip jobs with no matching change. Do not over-document.
Phase 7: Post-PR watchers (in-session, optional)
If config.ci.watch, spawn one ship-it:ci-fix background watcher per PR. If the post-merge doc work produces a tracked change (an author-reconcile archive that edits committed specs, or a regenerate whose target is tracked), launch the merge watcher ${CLAUDE_PLUGIN_ROOT}/scripts/watch-merges.sh --prs <csv> --reconcile "<cmd>", where <cmd> composes the post-merge work joined with &&: any author-reconcile reconcile (e.g. ${CLAUDE_PLUGIN_ROOT}/scripts/openspec-archive.sh <change-ids>) and any regenerate command (e.g. graphify update .). It polls until the PRs are merged (timeout), then runs that command against the merged code (archiving specs, regenerating derived docs) and opens the batched docs PR. On timeout, it prints the manual command. If the only post-merge job is a regenerate to a gitignored target (e.g. graphify-out/), there is nothing to PR, so skip the watcher and just note the manual graphify update . follow-up. See references/doc-jobs.md.
Phase 8: Summarize
Print a table: work-unit, PR link, lane, what changed, review items applied/skipped, doc outcome, blockers. If config.worktree.enabled, note that each worktree is left runnable for visual/runtime QA and surface any config.worktree.qaNotes (run caveats). Point the user at the post-merge follow-ups, both merged-gated: the doc reconcile (Phase 7) and worktree cleanup via ${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-worktrees.sh --all-merged.
Guardrails
- Edit only inside each work-unit's worktree; never the main checkout.
- Honor
config.houseRules+config.safetyeverywhere (commits, PR text, edits). - Verification is
config.verify. - Create worktrees sequentially, then fan out.
- Front-load all interactivity to Phase 1 and Phase 3; the Workflow workers run non-interactively.
- Invoke the stage skills by their namespaced names (
ship-it:fix-one-issue,ship-it:comment-cleanup,ship-it:review-and-address,ship-it:open-pr); never reimplement their logic inline.
Bundled files
references/sources.md- how Phase 1 resolves the trigger into work-units (source dispatch, the built-in tracker adapters, the custom-tracker extension point) and the tracker adapter'spostPlanused in Phase 3. Read before Phase 1.references/workflow.md- the lane-grouping algorithm and the Workflow script template to adapt. Read before Phase 5.references/doc-jobs.md- the three doc-job mechanics, the built-in jobs, and the post-merge reconcile flow. Read before Phase 6.${CLAUDE_PLUGIN_ROOT}/scripts/openspec-archive.sh- the openspec author-reconcile reconcile (merged-gatedopenspec archive, batched docs PR).${CLAUDE_PLUGIN_ROOT}/scripts/watch-merges.sh- the in-session merge watcher that runs a--reconcilecommand once the PRs merge.${CLAUDE_PLUGIN_ROOT}/scripts/setup-worktrees.sh- pre-create lane-head worktrees (stdin<id>|<branch>|<base>), running the project prepare per worktree. Read before Phase 4.${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-worktrees.sh- merged-gated worktree + branch teardown. Phase 8 / post-merge.${CLAUDE_PLUGIN_ROOT}/scripts/load-config.sh- locate + resolveship-it.config(defaults +@FILEinlining) to JSON. Load once up front.
What ships with it: 5 files
21.8 KB alongside SKILL.md
evals/
- evals.json1.3 KB
- trigger-evals.json2.2 KB
references/
- doc-jobs.md4.8 KB
- sources.md4.7 KB
- workflow.md8.8 KB
Gives 0 of the 12 instructions most ship operate skills give in ~2.9k tokens
Counted across 779 of the 1,178 authors here whose files we hold, read 2026-08-07
- Document a rollback plan before deploymentin 41 of 779, across 22 files
- Update the changelogin 21 of 779, across 19 files
- Run the test suitein 20 of 779
- Create an annotated git tagin 20 of 779
- Clean up feature flags after full rolloutin 18 of 779, across 10 files
- Verify deployment health after launchin 18 of 779, across 10 files
- Test both feature flag statesin 17 of 779, across 9 files
- Verify the working tree is cleanin 17 of 779
- Make database migrations backward-compatiblein 16 of 779, across 8 files
- Set up error monitoring before launchin 15 of 779, across 7 files
- Monitor metrics at each rollout stagein 14 of 779, across 5 files
- Create a GitHub releasein 14 of 779
Said here and by no other author read
- load configuration once up front
- ask what to ship if no selection is given
- front-load all interactivity to phases one and three
- group work-units into concurrent lanes
- create worktrees sequentially
- chain stage skills per work-unit
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.