1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# git-cliff config — Q-11 / #348
#
# rvt-rs CHANGELOG.md is hand-curated with rich narrative per release
# (see entries for [0.1.0], [0.1.1], [0.1.2] — each has multi-paragraph
# "Added / Changed / Fixed" sections with context the bare commit
# subject can't carry). Wholesale regeneration from `git log` would
# lose that content. The workflow (see .github/workflows/changelog.yml)
# therefore uses this config to write ONLY unreleased commits to a
# separate file (`CHANGELOG-UNRELEASED.md`) that release managers
# copy-paste into CHANGELOG.md when curating a version. On tag push
# git-cliff emits `RELEASE_NOTES.md` as a workflow artifact for the
# GitHub Release body.
#
# Conventional-commit prefixes observed in rvt-rs history (via
# `git log --oneline`): feat, fix, docs, test, perf, refactor, ci,
# chore (including `chore(release): vX.Y.Z`). Scopes are optional
# and the parsers below match both scoped (`feat(ifc):`) and
# unscoped (`feat:`) forms.
[]
# Header mirrors the existing CHANGELOG.md preamble so auto-generated
# output is drop-in compatible when a maintainer chooses to overwrite.
= """
# Changelog
All notable changes will be documented here. This project follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
[semver](https://semver.org/spec/v2.0.0.html).
"""
# Body renders each version as `## [X.Y.Z] — YYYY-MM-DD` (em-dash
# separator) to match the existing manual entries. Groups map to
# Keep a Changelog's canonical "Added / Changed / Fixed" subheadings.
= """
{% 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 | upper_first }}
{% for commit in commits %}
- {{ commit.message | split(pat="\n") | first | upper_first }}\
{% endfor %}
{% endfor %}\n
"""
= "<!-- generated by git-cliff -->"
= true
[]
= true
# Drop non-conventional commits from the output entirely — keeps the
# auto-section focused on release-relevant changes.
= true
# Match both scoped (`feat(ifc):`) and unscoped (`feat:`) prefixes.
# Order matters: `^chore\\(release\\)` must be tested before the
# generic `^chore` skip rule, or tag-bump commits get dropped.
= [
{ = "^chore\\(release\\)", = true },
{ = "^chore\\(changelog\\)", = true },
{ = "^chore\\(deps\\)", = "Dependencies" },
{ = "^feat", = "Added" },
{ = "^fix", = "Fixed" },
{ = "^perf", = "Performance" },
{ = "^refactor", = "Changed" },
{ = "^docs", = "Documentation" },
{ = "^test", = "Testing" },
{ = "^ci", = true },
{ = "^chore", = true },
]
= true
# Matches v0.1.0, v0.1.2, v1.0.0-rc1 etc. Release tag format is
# documented in RELEASE.md.
= "v[0-9]*"
= "oldest"