From 2e80d75e608979d598448faf49f68ffeb25992e6 Mon Sep 17 00:00:00 2001 From: mguschin Date: Mon, 23 Mar 2026 14:47:00 +0300 Subject: [PATCH] Add changelog service and release-new skill - cliff.toml: git-cliff config with semantic-style grouping (no conventional commits required) - CHANGELOG.md: initial changelog generated from full git history - .claude/commands/release-new.md: /release-new [major|minor|patch] skill that bumps version, updates changelog, commits, tags, and pushes Co-Authored-By: Claude Sonnet 4.6 --- .claude/commands/release-new.md | 41 +++++++++++++++++ CHANGELOG.md | 78 +++++++++++++++++++++++++++++++++ cliff.toml | 45 +++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 .claude/commands/release-new.md create mode 100644 CHANGELOG.md create mode 100644 cliff.toml diff --git a/.claude/commands/release-new.md b/.claude/commands/release-new.md new file mode 100644 index 0000000..2bbdefb --- /dev/null +++ b/.claude/commands/release-new.md @@ -0,0 +1,41 @@ +--- +allowed-tools: Bash(git tag:*), Bash(git add:*), Bash(git commit:*), Bash(git push:*), Bash(git log:*), Bash(git describe:*), Bash(git-cliff:*), Bash(git cliff:*) +description: Create a new semver release. Usage: /release-new [major|minor|patch] +--- + +## Context + +- Current latest tag: !`git describe --tags --abbrev=0 2>/dev/null || echo "none"` +- Current branch: !`git branch --show-current` +- Unreleased commits: !`git log $(git describe --tags --abbrev=0 2>/dev/null || echo "")..HEAD --oneline 2>/dev/null || git log --oneline` + +## Your task + +Arguments: $ARGUMENTS (should be "major", "minor", or "patch") + +1. **Determine next version**: + - Get current latest tag (from context above). If none, start at v0.1.0. + - Parse the version as vMAJOR.MINOR.PATCH. + - Bump the appropriate component based on arguments (default: patch if none given). + - New version = vX.Y.Z (with "v" prefix). + +2. **Update CHANGELOG.md** using git-cliff: + ``` + git-cliff --config cliff.toml --tag NEW_VERSION -o CHANGELOG.md + ``` + +3. **Commit the changelog**: + - Stage: `git add CHANGELOG.md` + - Commit: `git commit -m "chore: release NEW_VERSION"` + +4. **Create annotated tag**: + ``` + git tag -a NEW_VERSION -m "Release NEW_VERSION" + ``` + +5. **Push commit and tag**: + ``` + git push && git push --tags + ``` + +Do not ask for confirmation. Execute all steps in sequence. Report what version was released when done. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4249dce --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,78 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Bug Fixes + +- Fix certs path. +- Fix self signed certs. +- Fix su prosody. +- Fix su prosody (2). +- Fix su prosody (3). +- Fix su prosody (4). +- Fix symlinks. +- Fixed tls config.. +- Fix TLS cert domain mismatch: VirtualHost now matches cert domain + +VirtualHost changed from "guschin.info" to "xmpp.guschin.info" to match +the Let's Encrypt certificate. Moved certificates directive before +VirtualHost block. Removed misplaced default_realm and global ssl block. + +Co-Authored-By: Claude Opus 4.6 + +### Changes + +- Initial commit +- Init. +- MySQL running on host. +- Network. +- Extra hosts. +- Change ip. +- Nginx. +- Certs in docker compose. +- Certs volume. +- Certs path. +- Nginx ssl. +- Lua-unbound. +- Certs volume. +- Delete self signed certs. +- Delete user prosody from entrypoing.. +- Using existing certs.. +- Remove obsolete version attribute from docker-compose.yml + +Co-Authored-By: Claude Opus 4.6 +- Mount only xmpp cert dirs to fix letsencrypt permission errors + +Mount specific live/ and archive/ subdirectories instead of all of +/etc/letsencrypt to avoid Prosody scanning root-only directories +(accounts/, archive/ for other domains). Also remove allow_registration. + +Co-Authored-By: Claude Opus 4.6 + +### Features + +- Enable s2s_require_encryption to match s2s_secure_auth + +Co-Authored-By: Claude Opus 4.6 +- Add ca-certificates to fix s2s TLS verification + +Without CA certs, Prosody cannot verify remote servers' certificates, +causing all server-to-server connections to fail with "not trusted". + +Co-Authored-By: Claude Opus 4.6 +- Enable mod_mam for persistent direct message archiving + +Messages are stored indefinitely in MySQL. + +Co-Authored-By: Claude Opus 4.6 +- Add guschin.info VirtualHost alongside xmpp.guschin.info + +Users can now register as name@guschin.info or name@xmpp.guschin.info. +Added Let's Encrypt cert mounting and install for guschin.info domain. +Refactored entrypoint cert install into reusable function. + +Co-Authored-By: Claude Opus 4.6 + + diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..a7b2a96 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,45 @@ +[changelog] +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +""" +body = """ +{% if version %}\ +## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ +## [Unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} +### {{ group | striptags | trim | upper_first }} +{% for commit in commits %} +- {{ commit.message | upper_first }}\ +{% endfor %} +{% endfor %}\n +""" +trim = true +footer = "" + +[git] +conventional_commits = false +filter_unconventional = false +split_commits = false +commit_parsers = [ + { message = "^[Ff]eat", group = "Features" }, + { message = "^[Ff]ix", group = "Bug Fixes" }, + { message = "^[Dd]oc", group = "Documentation" }, + { message = "^[Pp]erf", group = "Performance" }, + { message = "^[Rr]efactor", group = "Refactor" }, + { message = "^[Ss]tyle", group = "Styling" }, + { message = "^[Tt]est", group = "Testing" }, + { message = "^[Cc]hore", group = "Miscellaneous Tasks" }, + { message = "^[Aa]dd", group = "Features" }, + { message = "^[Ee]nable", group = "Features" }, + { message = "^[Rr]emove", group = "Changes" }, + { message = ".*", group = "Changes" }, +] +filter_commits = false +tag_pattern = "v[0-9]*" +skip_tags = "" +ignore_tags = "" +topo_order = false +sort_commits = "oldest"