Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ A release has an explicit **start** and **finish**:
**During development** — add user-visible changes to `CHANGELOG.md` (see rules below).

**Finishing a release** (only this, nothing else):
- Update `CHANGELOG.md` heading to `# MAJOR.MINOR` (matching current `pom.xml`) → CI sees this as the release signal, creates release tag `MAJOR.MINOR.N`, and publishes a GitHub Release
- Update `CHANGELOG.md` heading to `# MAJOR.MINOR` or `# MAJOR.MINOR (YYYY-MM-DD)` (matching current `pom.xml`) → CI sees this as the release signal, creates release tag `MAJOR.MINOR.N`, and publishes a GitHub Release. If the date is omitted, CI inserts today's date automatically.

**After a published release** — CI auto-edits `CHANGELOG.md`: the release heading `# MAJOR.MINOR (date)` is replaced with `# MAJOR.MINOR.N (date)`. Development can continue immediately; patch versions increment from the last released N.

Expand All @@ -54,18 +54,18 @@ git push origin release/0.17
Version numbers continue from the last released patch: if `0.17.3` was the last release, the next builds are `0.17.4`, `0.17.5`, etc.

**Releasing a patch:**
- Add `# 0.17 (YYYY-MM-DD)` at the top of `CHANGELOG.md` (together with the fix's bullet)
- Add `# 0.17` or `# 0.17 (YYYY-MM-DD)` at the top of `CHANGELOG.md` (together with the fix's bullet). If the date is omitted, CI inserts today's date automatically.
- Push → CI creates tag `0.17.N`, publishes GitHub Release, and auto-edits `CHANGELOG.md` to `# 0.17.N (YYYY-MM-DD)`

**Next patch:** add `# 0.17 (YYYY-MM-DD)` again and repeat.
**Next patch:** add `# 0.17` or `# 0.17 (YYYY-MM-DD)` again and repeat.

`main` is fully unaffected throughout.

### CHANGELOG.md rules

The heading `# MAJOR.MINOR (YYYY-MM-DD)` is the CI release signal — **only add it when finishing a release**. Always include the release date in parentheses (e.g. `# 0.18 (2026-04-04)`).
The heading `# MAJOR.MINOR` or `# MAJOR.MINOR (YYYY-MM-DD)` is the CI release signal — **only add it when finishing a release**. The date is optional; if omitted, CI inserts today's date automatically (e.g. `# 0.18` or `# 0.18 (2026-04-04)`).

During development, add bullet lines at the **very top** of `CHANGELOG.md` (above any existing heading), with no section heading. When finishing a release, add the `# MAJOR.MINOR (YYYY-MM-DD)` heading above those bullets.
During development, add bullet lines at the **very top** of `CHANGELOG.md` (above any existing heading), with no section heading. When finishing a release, add the `# MAJOR.MINOR` or `# MAJOR.MINOR (YYYY-MM-DD)` heading above those bullets.

The changelog within a release is **cumulative**: if a feature was added and later refined or fixed within the same release cycle, **update the existing bullet** rather than adding a new one. Do not add separate "Fixed" entries for bugs in functionality that was introduced in the current (unreleased) version — only the final user-visible state matters.

Expand Down
7 changes: 5 additions & 2 deletions build-scripts/autotag.sh
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,16 @@ FIRST_LINE=$(head -n 1 "$CHANGELOG" 2>/dev/null || echo "")
if [[ "$(echo "$FIRST_LINE" | cut -d' ' -f1)" == "#" ]]; then
CHANGELOG_MM=$(echo "$FIRST_LINE" | cut -d' ' -f2)
fi
# Extract date from heading (e.g. "# 0.21 (2026-04-16)"), or default to today
HEADING_DATE=$(echo "$FIRST_LINE" | sed -n 's/^# [^ ]* (\(.*\))$/\1/p')
RELEASE_DATE="${HEADING_DATE:-$(date +%Y-%m-%d)}"

if [[ "$CHANGELOG_MM" == "$MM" ]]; then
if [[ -n "$RELEASE_TAG" ]] && ! grep -qE "^# ${MM_ESCAPED}\.[0-9]+" "$CHANGELOG"; then
# Stale release signal: published release exists but CHANGELOG was never auto-edited
# (e.g. branch created from old release commit). Rename heading, don't create new release.
echo "Stale release signal: renaming to $RELEASE_TAG"
sed -i "s|^# ${MM_ESCAPED} |# ${RELEASE_TAG} |" "$CHANGELOG"
sed -i "1s|^.*$|# ${RELEASE_TAG} (${RELEASE_DATE})|" "$CHANGELOG"
git add "$CHANGELOG"
git commit -m "Released ${RELEASE_TAG}"
git push origin HEAD
Expand All @@ -84,7 +87,7 @@ if [[ "$CHANGELOG_MM" == "$MM" ]]; then
sed '0,/^#/d;/^#/Q' "$CHANGELOG" > "$RELEASE_NOTES" || echo "Release $FULL_VER" > "$RELEASE_NOTES"

# Auto-edit CHANGELOG: replace "# MM (date)" with "# FULL_VER (date)" to clear the release signal
sed -i "s|^# ${MM_ESCAPED} |# ${FULL_VER} |" "$CHANGELOG"
sed -i "1s|^.*$|# ${FULL_VER} (${RELEASE_DATE})|" "$CHANGELOG"
git add "$CHANGELOG"
git commit -m "Released ${FULL_VER}"
# Tag the CHANGELOG commit so "git tag --points-at HEAD" finds it in Calculate version
Expand Down
Loading