From project-lifecycle
Cut a new release end-to-end. Computes SemVer bump from CHANGELOG [Unreleased], renames the section, bumps both Claude-plugin manifests, validates, commits, tags, pushes, and verifies the GitHub Release landed. One human checkpoint (confirm bump + version).
How this command is triggered — by the user, by Claude, or both
Slash command
/project-lifecycle:releaseThe summary Claude sees in its command listing — used to decide when to auto-load this command
# /release — Automated Release Cut
Self-contained orchestrator for cutting a release under the `project-lifecycle` skill's CHANGELOG / SemVer / PR-label discipline. Designed so the human does NOT touch CHANGELOG, manifests, or git tags by hand — `/release` does it all.
## When to use
- Repo follows the `project-lifecycle` skill's release discipline (Keep a Changelog 1.1.0 `CHANGELOG.md`, two Claude-plugin manifests at `.claude-plugin/{marketplace,plugin}.json`, `.github/workflows/release.yml` that turns a `v*.*.*` tag into a GitHub Release).
- `[Unreleased]` section has accumulated at le...Self-contained orchestrator for cutting a release under the project-lifecycle skill's CHANGELOG / SemVer / PR-label discipline. Designed so the human does NOT touch CHANGELOG, manifests, or git tags by hand — /release does it all.
project-lifecycle skill's release discipline (Keep a Changelog 1.1.0 CHANGELOG.md, two Claude-plugin manifests at .claude-plugin/{marketplace,plugin}.json, .github/workflows/release.yml that turns a v*.*.* tag into a GitHub Release).[Unreleased] section has accumulated at least one user-visible change.main (or the repo's default branch), tree is clean (aside from locally-gitignored paths), and remote is reachable.CHANGELOG.md or no Claude-plugin manifests → this skill's release discipline doesn't apply; use the project's own release process.[Unreleased] is empty or contains only chore-quiet items → nothing user-visible to ship; skip./release # auto bump (default — infer from [Unreleased] contents)
/release auto # same as no-arg
/release patch # force PATCH bump
/release minor # force MINOR bump
/release major # force MAJOR bump
git rev-parse --abbrev-ref HEAD → must be main (or repo default). Abort with explanation if not.git status --porcelain → must be empty of meaningful changes (gitignored paths excepted). Abort if dirty.CHANGELOG.md + .claude-plugin/marketplace.json + .claude-plugin/plugin.json + .github/workflows/release.yml all exist. Abort if any missing — fall back to plain git tag workflow..version from .claude-plugin/plugin.json (python3 -c "import json,sys; print(json.load(open('.claude-plugin/plugin.json'))['version'])").marketplace.json plugins[0].version matches. Abort if they disagree — that's the bug the validator catches; fix first.[Unreleased] section body:
awk '/^## \[Unreleased\]/{f=1; next} f && /^## /{exit} f' CHANGELOG.md
_Nothing yet —_), abort: "Nothing to release. Add entries to CHANGELOG [Unreleased] first."[Unreleased] body contains a ### Removed section with content OR any bullet with BREAKING / breaking → MAJOR.### Added with content OR ### Changed with content (the common case for new references / commands / convention changes) → MINOR.### Fixed / ### Security / ### Deprecated) → PATCH.0.2.0 + minor → 0.3.00.2.0 + patch → 0.2.10.2.0 + major → 1.0.0If cancelled, exit gracefully without touching files.
date -u +%Y-%m-%d.CHANGELOG.md:
## [Unreleased] heading with ## [X.Y.Z] — YYYY-MM-DD (preserving the body).## [Unreleased]\n\n_Nothing yet — git log vX.Y.Z..HEAD for the in-flight set._\n\n---\n\n block above it.[Unreleased]: ...compare/v<PREV>...HEAD with [Unreleased]: ...compare/vX.Y.Z...HEAD.[X.Y.Z]: ...compare/v<PREV>...vX.Y.Z above the previous version's link..version in .claude-plugin/plugin.json to X.Y.Z.plugins[0].version in .claude-plugin/marketplace.json to X.Y.Z.python3 scripts/validate.py. Abort + revert (git checkout -- .claude-plugin/ CHANGELOG.md) on any error — surface the validator output.git add CHANGELOG.md .claude-plugin/marketplace.json .claude-plugin/plugin.json.git commit -m "chore(release): vX.Y.Z
<paste the new [X.Y.Z] CHANGELOG section verbatim into the body
so the commit itself carries the release notes>"
git push.git tag vX.Y.Z -m "vX.Y.Z — <one-line summary derived from the [X.Y.Z] section's intro paragraph>".git push origin vX.Y.Z.gh run list --workflow=release.yml --limit 1 then gh run watch <id>.gh release view vX.Y.Z.gh release edit vX.Y.Z --latest.[Unreleased] entries that shippedclaude plugin marketplace update <marketplace-name> && claude plugin update <plugin-name>git checkout -- .claude-plugin/ CHANGELOG.md, surface error, stop.gh run view <id>. Common causes: outdated release.yml (no --latest flag, missing CHANGELOG-section extraction). Fix workflow in a follow-up PR; manually create release via gh release create vX.Y.Z --notes-file <extracted-section> in the meantime.git checkout -- .claude-plugin/ CHANGELOG.md to undo the file edits before retrying./release → consistency drifts; next /release may misparse. The discipline is exactly that the human doesn't touch these./release when [Unreleased] is empty or only chore-quiet entries → no user-visible delta; release notes will be empty; users see a "version bump" with no value. Skip the release.major for a non-breaking change because "the feature feels big" → SemVer breakage signals migration; misuse erodes trust. MINOR exists exactly for "big but additive". Reserve MAJOR for actual breaks.~/.claude/skills/project-lifecycle/references/release-process.md — full process spec including SemVer bump table, exempt-PR rules, retroactive-tag flow for cleanup.~/.claude/skills/project-lifecycle/references/changelog.md — CHANGELOG + per-PR discipline this command depends on.~/.claude/skills/project-lifecycle/references/self-update-flow.md — how this skill itself versions + ships updates to its repo./ship — orchestrator for a single vertical-slice feature (upstream of /release; many /ship runs accumulate into [Unreleased], then one /release ships them).npx claudepluginhub victoriakaey/project-life-cycle --plugin project-lifecycle/releasePrepares a new release by updating CHANGELOG.md with changes since last version, incrementing version based on change scope, and checking README.md.
/releasePrepares a new release by updating CHANGELOG.md with changes since last version, incrementing version based on change scope, and checking README.md.
/releaseCreates a semantic version tag with auto-generated release notes from recent commits, bumps version in package files, commits changes, and pushes tag/release to GitHub.
/releaseCreates full release: verifies CI/CD, generates changelog, creates GitHub release with v<semver> tag, publishes packages, updates docs, notifies stakeholders.
/releasePrepares and publishes a GitHub release with optional version argument. Performs secrets scan, artifact check, LICENSE/README validation; creates tag and publishes via gh CLI.
/releaseGenerates changelog from commits since last tag, determines version bump, updates package.json, commits/tags/pushes, creates GitHub release, publishes to npm.