name: release description: Manage the full release lifecycle for aim-engine. Use when the user asks to prepare a release, generate release notes, update the changelog, tag a release, or push a release. Covers release prep, changelog generation, and final tagging.
Release Workflow
This skill covers the full release lifecycle. Detect the current stage and proceed accordingly.
Stage detection
Check these conditions in order to determine where the user is:
- No release branch exists → Stage 1 (Prep)
- On a
release/*branch,.tmp/release-context/exists,CHANGELOG.mdhas only[Unreleased]→ Stage 2 (Generate notes) - On a
release/*branch,CHANGELOG.mdhas the version section → Stage 3 (Review and PR) - On
main,CHANGELOG.mdhas the version section, no tag exists → Stage 4 (Tag and push) - Tag already exists → Done
To check:
- Current branch: run
git branch --show-current - Release context exists: check for
.tmp/release-context/release-context.md - CHANGELOG has version: look for
## [X.Y.Z]inCHANGELOG.md - Tag exists: run
git tag -l vX.Y.Z
Stage 1: Prep
Prerequisites: on main, clean working directory.
If not met, tell the user what to fix.
If the user hasn't specified a version, ask them.
Run:
make release-prep VERSION=vX.Y.Z
This creates branch release/vX.Y.Z and generates .tmp/release-context/.
Proceed to Stage 2.
Stage 2: Generate release notes
Read .tmp/release-context/release-context.md. Note the version, commit log, and diffstat.
Read detail diffs selectively based on the diffstat. The summary table shows which files have content and whether they contain a full diff or a diffstat summary:
- If
api/v1alpha1/files appear → readapi-types.diff(full diff) - If
internal/files appear → readinternal.diff(full diff of controller/domain logic) - If
config/crd/files appear → readcrds.diff(full diff -- often large, skim for field changes) - If
config/helm/files appear → readhelm.diff(full diff) docs.diffandtests.diffcontain only a diffstat (file list with line counts), not full diffs. Use them to note scope of doc/test changes.- Skip files marked as empty in the summary table.
Categorize changes into:
- Added -- new features, new CRDs, new API fields, new controllers
- Changed -- behavior changes, renames, refactors, dependency updates
- Fixed -- bug fixes, test fixes, stability improvements
- Removed -- deleted features, removed fields, dropped support
- Breaking -- CRD schema changes requiring migration, removed/renamed API fields, changed defaults
Pay special attention to API type and internal diffs -- API changes affect users upgrading, and internal changes reveal behavioral fixes and feature logic.
Update CHANGELOG.md: replace the ## [Unreleased] section with the new version:
## [Unreleased]
<!-- Populate this section during release-prep, then rename to the release version -->
## [X.Y.Z] - YYYY-MM-DD
### Added
- Item (with brief context)
### Changed
- Item
### Fixed
- Item
Use today's date. Keep entries concise -- one line per change, written for end users of the operator (cluster admins and platform engineers), not internal developers. Reference PR numbers where available (e.g. (#33)). Omit categories with no entries.
Tell the user to review CHANGELOG.md before proceeding.
Stage 3: Review and PR
The user should review the changelog, then commit and push the release branch.
If asked, help with:
git add CHANGELOG.md
git commit -m "Release notes for vX.Y.Z"
git push -u origin release/vX.Y.Z
Then open a PR to main. After the PR is merged:
git checkout main
git pull
Stage 4: Tag and push
Prerequisites: on main, clean working directory, CHANGELOG.md has the version section, tag doesn't exist yet.
If not met, tell the user what to fix.
Run:
make release VERSION=vX.Y.Z
The script validates everything, shows a summary, asks for confirmation (pass --yes to skip for non-interactive/agent use), creates the tag, and pushes. Tag-triggered CI then runs tests, builds artifacts, and creates the GitHub Release from CHANGELOG.md.