Writing Skills
writing-skills
效率与协作技能,来自 obra/superpowers,查看原文获取完整用途和操作说明。
ship【部署与运维】Release-gate sequence: validate → review → push → tag. Wraps kernel:git mechanics with the pre-ship safety chain. Triggers: ship, release, push to main, ready to merge, deploy.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Preflight
git status --porcelain — clean? If not: ask user to commit, stash, or abandon.git branch --show-current — matches intent? Wrong branch → stop.git log --oneline {main}..HEAD — commit range matches what you think you're shipping?Validate
/kernel:validate (spawns validator agent, full 9-gate safety chain).Review
/kernel:review (spawns reviewer agent, >80% confidence threshold).Push
feat/*, fix/*, chore/*, etc.): git push (or git push -u origin {branch} if upstream not set).main / master: STOP. AskUserQuestion required. (NEXUS I0.8)Version + Tag (on a release)
scripts/bump-version.sh X.Y.Z
updates .claude-plugin/plugin.json, .claude-plugin/marketplace.json,
governance/kernel.md.tmpl, regenerates AGENTS.md and CLAUDE.md, and
updates skills/help/SKILL.md. NEVER hand-edit one location — drift fails
test_version_sync_all.description highlight + a CHANGELOG.md entry (## [X.Y.Z] - DATE + Added/Changed/Fixed).bash tests/run-tests.sh green — test_version_sync_all confirms no stale version anywhere.)git tag -l to avoid clobber → git tag -a v{X.Y.Z} -m "{summary}" → git push origin v{X.Y.Z}.pgrep -fl codex. The upgrade
deletes the old cache directory under a live session's feet and every hook in that
session exits 127 until it restarts. Name the live sessions in the handoff and say
they need a restart; never report "upgraded" as if it covered them
(docs/upgrading.md, 2026-08-27).scripts/install-release.sh X.Y.Z. The script updates
only Claude's marketplace/cache, atomically advances Claude's current selector, and
fails unless both the installed manifest and the fresh process report X.Y.Z. Codex
installation remains a separate operation.Human pass (any user-facing release: app build, deploy, anything a person will touch)
skills/human-pass/SKILL.md and write the guide for THIS build: literal
controls, paste-ready inputs, expected outcome per step, worst case first,
bundled to one sitting with the time cost stated.Checkpoint
agentdb learn pattern "ship: {branch} {commit_range} {sha_pushed}" "validate=pass review=pass push=ok"For anything a person will use, the completion states are ordered: validated, merged, deployed, accepted. CI proves the first three. Only a human who used the build proves the fourth, and only that one predicts whether the release was any good: a 15-minute guided pass found five defects that 500+ green tests had not, because some properties only exist on the far side of a real screen with real data. Report the state you actually reached, by name.
| Point | Condition | Question |
|---|---|---|
| Preflight | Branch or commit range is ambiguous | "Shipping {N} commits on {branch}. Confirm?" |
| Review | COMMENT verdict | "Review returned {N} comments. Address now, ship anyway, or hold?" |
| Push | Target is main/master | "About to push to main. NEXUS I0.8 requires explicit say-so. Confirm?" |
validate FAIL → block; report which gate; do not loop silentlyreview REQUEST_CHANGES → block; address comments; restart from step 2push rejected (non-fast-forward) → ask user; never auto-rebase or force-pushtag conflict → check git tag -l first; suggest next version; never overwrite existing tagship_without_validate — every step depends on the previous; skipping validate skips type/test/securitysilent_skip_review — review FAIL with no surfacing to user = trust violationauto_push_to_main — NEXUS I0.8; main requires explicit user confirmationforce_push_on_rejection — rejection means remote has work you don't; investigate before overwritingtag_without_release_intent — tags are durable; casual pushes get no tagskip_checkpoint — shipped-but-unrecorded work breaks retrospective and learning loops<on_complete> agentdb write-end '{"skill":"ship","branch":"X","commits":N,"validate":"pass","review":"approve|comment|skip","pushed":true,"tagged":"X.Y.Z|none"}' </on_complete>