From lo
Quality pipeline for shipping completed work. Detects mode automatically from project status and branch name — fast mode pushes to main, feature mode opens a PR, release mode generates changelog and finalizes the release. Prunes done items from backlog. Use when user says "ship it", "done", "ready to merge", "push this", or "/lo:ship".
How this skill is triggered — by the user, by Claude, or both
Slash command
/lo:lo-shipThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Ships completed work. Detects what to do from project status and branch name. One command, three modes. Also starts releases.
Ships completed work. Detects what to do from project status and branch name. One command, three modes. Also starts releases.
Fast mode (Explore/Closed) commits directly to main. It NEVER creates pull requests. Only Feature mode and Release mode create PRs./lo:ship — ship current work (mode auto-detected)/lo:ship release <version> — start a new release/lo:ship release bump patch|minor|major — start release with auto-increment/lo:ship tag — post-merge: tag release, delete branchWhen invoked as /lo:ship release <version> or /lo:ship release bump <level>:
.lo/project.yml — verify status is build or openplugin.json, package.json, or similargit checkout -b <version>chore: bump version to <version>git push -u origin <version>Release started: <version>
Branch: <version>
Work on this branch, then run /lo:ship to finalize.
If no version provided, show current version and ask for bump level.
.lo/project.yml → extract statusgit branch --show-current| Status | Branch | Mode |
|---|---|---|
| explore or closed | any | fast |
| build or open | feature/fix branch | feature |
| build or open | semver branch | release |
git merge-base <base-branch> HEADSkip if: Explore, Closed, or Release mode (features already passed EARS individually).
Skip if: no ears-requirements.md exists in the work directory.
REQ-* IDs from the EARS document[x] and changed filesSkip if: Explore or Closed.
git diff $DIFF_BASE...HEADreviewer subagent with the diff and changed file listSkip if: Explore or Closed.
Follow ONLY the section matching your detected mode.
Push directly to main. No PR.
Commit:
Push:
Backlog + cleanup:
[done] YYYY-MM-DD[done] (including previously-done items)last_feature and last_task frontmatter counters intact.lo/park/<id>-*.md if it exists for the shipped item.lo/work/<id>-slug/ if it existsupdated: date in BACKLOG.md frontmatterchore: mark <item> done, prune backlogReport:
Ship complete: <item> "<name>"
Commit: <hash> "<message>"
Pushed: main
Backlog: pruned
Push the feature branch and open a PR.
Commit:
Push and PR:
git push -u origin <feature-branch>
gh pr create --base <release-branch-or-main> --head <feature-branch> \
--title "<message>" --body "<item summary>"
gh pr merge <PR> --auto --merge
Cleanup:
.lo/park/<id>-*.md if it exists (park was consumed by plan)Report:
Ship complete: <item> "<name>"
EARS: [N/N covered | skipped]
Tests: passed (N tests)
Reviewer: clean
Commit: <hash>
PR: #NNN opened, auto-merge enabled
Generate changelog, clean up, push, and open PR to main.
Generate changelog:
.lo/work/*/ plan files, BACKLOG.md features/tasks, and git commitsreferences/changelog-format.mdCHANGELOG.mddocs: changelog for <version>Create stream milestone: Run BEFORE cleanup (work artifacts still available for context):
.lo/STREAM.mddocs: stream milestone for v<version>Backlog + cleanup:
[done] v<version> YYYY-MM-DD.lo/park/ files for all shipped items.lo/work/ directories for all shipped itemsupdated: date in BACKLOG.mdchore: clean up work artifacts for v<version>Push and PR:
git push -u origin <version>
gh pr create --base main --head <version> \
--title "release: v<version>" --body "<changelog summary>"
gh pr merge <PR> --auto --merge
Report:
Release: v<version>
Changelog: generated
Stream: milestone created
Cleanup: N work dirs removed, backlog pruned
PR: #NNN opened, auto-merge enabled
After the PR merges, run: /lo:ship tag
Fast mode and Feature mode:
Worth a milestone? → /lo:stream
Anything reusable? → /lo:solution
("no" to skip)
Release mode: Stream was already captured in the pipeline.
Anything reusable? → /lo:solution
("no" to skip)
/lo:ship tag finishes a release after the PR has merged.
git checkout main
git pull origin main
git tag -a v<version> -m "v<version>"
git push origin --tags
git branch -d <version>
git push origin --delete <version>
Report:
Release shipped: v<version>
Tag: v<version>
Branch <version> deleted
If any gate fails:
Ship stopped at Gate N: <gate-name>
Item: <item> "<name>"
Mode: [fast | feature | release]
Issue: [what failed]
Fix: [suggestion]
After fixing, run /lo:ship again.
Gate 1: fast mode (Explore) Gates 2-5: skipped Gate 6+7: commit → merge to main → push → prune backlog → delete branch
Ship complete: f003 "User Authentication"
User: /lo:ship (project: build, branch: feat/f003-auth)Gate 1: feature mode Gate 2: EARS 22/22 covered Gate 3: 47 tests passed Gate 4: reviewer clean Gate 5: README current Gate 6+7: commit → push branch → PR #15 → auto-merge
Ship complete: f003 "User Authentication"
User: /lo:ship (project: build, branch: 0.6.0)Gate 1: release mode Gates 2-5: tests passed, reviewer clean Gate 6+7: changelog → stream milestone → prune backlog → cleanup work dirs → PR #42
After the PR merges, run: /lo:ship tag
User: /lo:ship release bump minorCurrent: 0.5.0 → Next: 0.6.0 Branch: 0.6.0 Version bumped in: plugin.json
Work on this branch, then /lo:ship to finalize.
npx claudepluginhub looselyorganized/lo-plugin --plugin loEnforces GRFP-style iterative approval, code integrity validation, and human-gated merges when running claudikins-kernel:ship, preparing PRs, writing changelogs, deciding merge strategy, or handling CI failures.
Manages git project releases: creates milestones, generates roadmaps, executes 9-stage pipeline with submodule support, closes releases. Yolo mode enables autonomous runs.