--- name: release allowed-tools: Bash(git tag:*), Bash(git log:*), Bash(git fetch:*), Bash(git diff:*), Bash(git status:*), Bash(git rev-parse:*), Bash(git symbolic-ref:*), Bash(gh release:*) description: Create a versioned release with changelog generation, git tag, and GitHub release. Use for creating releases, tagging versions, or publishing changelogs. disable-model-invocation: true --- # Release Create a versioned release: bump version, generate changelog, create git tag, and publish a GitHub release. ## Arguments - `$ARGUMENTS` - Required: version bump type (`major`, `minor`, `patch`) or an explicit version (e.g., `v2.1.0`). Optional: `--dry-run` to preview without creating anything. ## Context - Current branch: !`git branch --show-current` - Git status: !`git status --short` - Latest tag: !`git describe --tags --abbrev=0 2>/dev/null | head -1` - Commits since last tag: !`git log --oneline 2>/dev/null | head -30` - Remotes: !`git remote -v 2>/dev/null | head -10` - Base ref: !`git branch -r 2>/dev/null | grep -oE 'origin/(main|master)' | head -1` ## Instructions ### Step 0: Validate state - IF `git status --short` shows uncommitted changes, stop: "Uncommitted changes detected. Commit or stash before releasing." - Determine the default branch using `git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null`. Fallback to checking for `origin/main`, then `origin/master`. - IF the current branch is not the default branch and does not match `release/*`, warn: "You are on , not the default branch. Releases are typically made from . Proceed anyway?" Wait for confirmation. ### Step 1: Determine version Parse `$ARGUMENTS` for the version: - IF an explicit version is given (e.g., `v2.1.0`), use it directly. - IF a bump type is given (`major`, `minor`, `patch`): - Parse the latest tag from context. IF no tags exist, start from `v0.0.0`. - Apply the bump. Examples: `v1.2.3` + patch = `v1.2.4`, + minor = `v1.3.0`, + major = `v2.0.0`. - Preserve the tag prefix (if existing tags use `v`, keep `v`; if bare numbers, use bare numbers). Report: "Version: -> " ### Step 2: Generate changelog Fetch commits since the last tag (or all commits if no prior tag): ``` git log ..HEAD --format="%H%n%s%n%b%n---END---" ``` Categorize using the same approach as `/changelog`: - **Added** — new features, commands, capabilities - **Changed** — modifications to existing behavior - **Fixed** — bug fixes - **Removed** — deleted features, deprecated code - **Infrastructure** — CI/CD, build, dependencies - **Documentation** — docs, README Write concise, meaningful entries. Deduplicate related commits. Skip trivial changes. Only include categories that have entries. ### Step 3: Preview Present the release preview: ```markdown ## Release Preview: ### Changelog ### Tag `` on commit `` ### GitHub Release Title: Body: ``` IF `--dry-run` is in `$ARGUMENTS`, stop here: "Dry run complete. No changes made." Otherwise, ask for confirmation: "Create this release?" ### Step 4: Create tag ``` git tag -a -m " " ``` Push the tag: ``` git push origin ``` ### Step 5: Create GitHub release ``` gh release create --title "" --notes "" ``` ### Step 6: Report ```markdown ## Release Complete **Version:** **Tag:** on **GitHub Release:** **Changelog:** entries across categories ```