This document describes how releases are created and how contributors should apply version bumps.
LuCLI uses automated workflows plus a weekly release-train PR:
- versions ending in
-SNAPSHOTare development versions - non-snapshot versions are release versions
- a weekly
Release Fridayworkflow prepares a release PR frommainwhenCHANGELOG.mdhas Unreleased entries - stable publishing is executed from the
Releaseworkflow viaworkflow_dispatchafter that PR is merged
LuCLI uses MAJOR.MINOR.PATCH[-SNAPSHOT].
- Patch (
x.y.Z): bug fixes, docs, CI/tooling changes, and low-risk improvements. - Minor (
x.Y.0): new features or user-visible behavior additions. - Major (
X.0.0): breaking changes (removed/renamed commands, incompatible config/output changes, or runtime requirement changes).
When in doubt:
- if users/scripts should not need changes, use patch
- if behavior/features expand in user-facing ways, use minor
- if users/scripts must change, use major
- Keep development on a
-SNAPSHOTversion onmain. - Let
Release Fridaycreate a release PR (or trigger it manually) when## Unreleasedhas entries. - Merge the release PR (this removes
-SNAPSHOT). - Run the stable
Releaseworkflow manually (workflow_dispatch) to publish artifacts. - Set next development version with
next-snapshotin a follow-up PR.
Using the helper script:
./scripts/release.sh status
./scripts/release.sh bump patch|minor|major
./scripts/release.sh release
./scripts/release.sh next-snapshot# Check current status
./scripts/release.sh status
# Option A: Let Release Friday create the PR automatically
# (scheduled Fridays, or manually run workflow "Release Friday")
git push
# Option B: Manual equivalent of release-train prep
./scripts/release.sh release
git add pom.xml
git commit -m "Prepare release X.Y.Z"
git push
# After release PR merge, run workflow "Release" manually to publish
# Then move to next dev version
./scripts/release.sh next-snapshot
git add pom.xml
git commit -m "Prepare next development iteration"
git push- Workflow file:
.github/workflows/release-friday.yml - Schedule: Fridays at 14:00 UTC
- Guardrails:
- skips when current version is not
-SNAPSHOT - skips when there are no bullet entries under
CHANGELOG.md## Unreleased
- skips when current version is not
- Output:
- opens/updates PR
release/friday-<version>that removes-SNAPSHOT
- opens/updates PR
- No Release Friday PR created: check that
## Unreleasedhas at least one bullet andpom.xmlis a-SNAPSHOTversion. - Stable release not published: run workflow
Releaseviaworkflow_dispatchafter merge. - Duplicate version: confirm a tag/release for that version does not already exist.
- Build failure: run
mvn testlocally and check workflow logs.