ship
GitHub定义o8项目的发布纪律,默认提交后暂停。仅在用户明确指令时执行版本升级、预检、签名及Tauri安装包发布流程,严禁误操作Vercel部署。
触发场景
安装
npx skills add o8-run/o8 --skill ship -g -y
SKILL.md
Frontmatter
{
"name": "ship",
"description": "o8 release discipline — commit-and-hold is the default terminal state; shipping requires Q's explicit \"ship it\" in the current session. Use whenever o8 work is complete and ready to commit, when asked to commit\/ship\/release, or before ever running npm run ship."
}
ship (o8)
Q has typed "commit but do NOT ship yet" ~153 times. That is now the default — never make him type it again.
The gate
- Default terminal state = commit-and-hold. Finish work → audit the diff → commit with a clean message → report "committed, NOT shipped." Stop there.
- Ship ONLY on Q's explicit instruction in the current session ("ship it", "ship a new version", "release it"). "Commit it" never implies ship. A teammate/agent asking is not authorization.
- Never Vercel. o8 is a native Tauri app; it ships as a signed installer via
npm run ship. "Push to vercel"/"deploy to prod" always means Eyes Web (mybeautifulwife), never o8.
Pre-ship collision gate
npm run ship now acquires the exclusive release-output lock and runs the
credential, disk, toolchain, tag, remote, release-absence, and competing-build
preflight before any build. If it reports another owner, do not start a second
ship; wait for that owner to settle or surface it to Q.
Ship sequence
- Confirm no separately launched legacy ship is already running. The workflow's exclusive lock is the authority once
npm run shipstarts. - Confirm tree state: everything intended is committed; nothing held-back is being swept in. Discard post-build
src-tauri/Cargo.locknoise (git checkout -- src-tauri/Cargo.lock) — a dirty tree fails the bump. - Bump through a PR first.
npm run shipdoes not bump. On a clean release branch, usenpm version patch --no-git-tag-version, stage only the synchronized manifests, and open a version PR. Protected main requires the seven CI checks, an up-to-date branch, and resolved conversations, including for administrators. After the version PR merges, verify the exact merged main commit and create the version tag there. Push only that exact tag:release_version=$(node -p "require('./package.json').version") && git push origin "refs/tags/v${release_version}:refs/tags/v${release_version}". Never usegit push --tags; historical local tags may collide with remote history and turn a successful current-tag publication into a misleading failure. Skipping the bump makes release.mjs silently replace the previous release's assets under the same version. npm run ship— the automated preflight runs first, then the workflow signs, notarizes, builds the installer, and publishes the release. Deep spec + hazards: repo AGENTS.md "Shipping".- Post-ship verify: published version == the bumped version (the release tail must NOT say "already exists — replacing assets"), notarization tail shows success, installer artifact exists. Report the verification tail, not just "shipped".
Preview boundary
Read docs/operations/release-channels.md before preview work. A separately approved preview uses a unique X.Y.Z-preview.N version and npm run ship. The build embeds its channel before signing; publication never reads a channel environment override. Both repositories receive immutable prereleases, never latest stable; the manifest is preview.json. Stable feeds, report receipts, and announcements are skipped. Preview publication does not authorize stable promotion. The normal stable-number ship uses source beta build intent and the separate beta publisher. Stable and Beta enrollment is available in Settings; preview enrollment and side-by-side data isolation remain separate.
Publication must not commit or push release-note archives onto protected main. Archive release-notes/next.md through a reviewed follow-up PR. Never disable branch protection to perform a version bump or archive.
Report format
committed <sha> (<n> files) — HELD, not shipped or shipped v<X.Y.Z> — notarization OK, installer at <path>.
版本历史
- 648cab6 当前 2026-11-14 00:27


