forked from noonghunna/club-3090
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcliff.toml
More file actions
205 lines (166 loc) · 9.23 KB
/
Copy pathcliff.toml
File metadata and controls
205 lines (166 loc) · 9.23 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# git-cliff config for club-3090 — generates GitHub Release notes from
# commits since the last tag. Categorizes by conventional-commit prefix
# OR by content keywords (cliff/regression/pin-bump). Both direct-to-master
# commits and squash-merged PRs flow through the same parsers.
#
# Workflow: tag with CalVer (`git tag v2026.MM.DD && git push origin v...`)
# → .github/workflows/release.yml runs → git-cliff generates the body
# → release published.
[changelog]
# Header rendered once at top of CHANGELOG.md (preserved across full regens).
# Use `--strip header` on `--latest` for GitHub Release bodies so they don't
# duplicate this intro on every release page.
header = """
# Changelog
Auto-generated from commit subjects by [git-cliff](https://git-cliff.org/) on tag
push. Click any commit SHA below to see the full message body (why / how /
validation data) — those live in `git log`, not here. Don't hand-edit; the file
is regenerated on every tag.
**Versioning:** SemVer in `0.x` — treat any minor bump as potentially breaking
until `1.0`. Past CalVer tags (`v2026.05.09`, `v2026.05.10`) are preserved for
history; SemVer takes over from `v0.3.0` onward.
| CalVer tag | SemVer equivalent | Date |
|---|---|---|
| `v2026.05.09` | (≈ v0.1.0) | 2026-05-09 — first tagged release |
| `v2026.05.10` | (≈ v0.2.0) | 2026-05-10 — stack reorg + Gemma 4 INT8 PTH unblock |
---
"""
# Body template — rendered per release. For `--latest` (GitHub Release) only
# the most recent block renders; for full regen of CHANGELOG.md, every tagged
# block renders in reverse-chronological order.
#
# **Subject-line only** — the commit's first line, with a link to the full
# commit. Full body (why/how/validation data) lives in `git log` and is one
# click away via the SHA link. Keeps CHANGELOG.md skim-readable.
body = """
{% if version %}\
## {{ version }}{% if timestamp %} — {{ timestamp | date(format="%Y-%m-%d") }}{% endif %}
{% else %}\
## Unreleased
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group }}
{% for commit in commits %}\
- {{ commit.message | split(pat="\\n") | first | trim }}{% if commit.github.pr_number %} ([#{{ commit.github.pr_number }}](https://github.com/noonghunna/club-3090/pull/{{ commit.github.pr_number }}) by @{{ commit.github.username }}){% else %} ([{{ commit.id | truncate(length=7, end="") }}](https://github.com/noonghunna/club-3090/commit/{{ commit.id }})){% endif %}
{% endfor %}
{% endfor %}
{% if version %}[Pin: `git checkout {{ version }}`]{% if previous.version %} · [Full diff](https://github.com/noonghunna/club-3090/compare/{{ previous.version }}...{{ version }}){% endif %}
{% endif %}
"""
footer = ""
# Strip leading/trailing whitespace from rendered body.
trim = true
# Don't include a postprocessor — keep the markdown raw.
postprocessors = []
[git]
# Treat the message as conventional-commit format where possible, but don't
# discard non-conforming messages (filter_unconventional = false).
conventional_commits = false
filter_unconventional = false
# Don't split commits on newline — keep multi-line bodies intact.
split_commits = false
# Parse commits in order they appear in `git log`.
topo_order = false
# Sort commits within each group by date descending.
sort_commits = "newest"
# Skip merge commits — squash-merged PRs show as regular commits, --no-ff
# merges create noise. (PR titles still come through via the squashed commit.)
filter_commits = false
# Patterns for matching commit messages → groups. First match wins, so order
# matters: PREFIX-BASED parsers run first (deterministic, low false-positive),
# keyword-based parsers act as fallback for unprefixed messages (catches
# `Document Cliff 1 closure` or `Add Gemma 4` style un-prefixed commits).
#
# Patterns match against the full commit message (subject + body), so we must
# anchor with `^` to scope to subject when we want a prefix match.
commit_parsers = [
# --- Skip merge-commit headers ---
# Squashed-merge PR commits already carry the proper title; --no-ff merges
# add noise.
{ message = "^Merge pull request", skip = true },
{ message = "^Merge branch", skip = true },
{ message = "^Merge remote-tracking", skip = true },
# --- Skip release-machinery noise ---
# The release.yml workflow auto-commits a CHANGELOG.md regen with this
# subject after every tag push. Hide it from release notes — it's pure
# machine traffic, not a user-visible change.
{ message = "^chore\\(changelog\\): regenerate for v", skip = true },
# --- Prefix-based (deterministic, anchored to subject line) ---
# New models / new compose paths
{ message = "^models[(:]", group = "🎯 New models + serving paths" },
{ message = "^composes?[(:]", group = "🎯 New models + serving paths" },
# Benchmarks
{ message = "^bench[(:]", group = "📊 Benchmarks + cross-rig data" },
# Scripts / tooling / CI
{ message = "^scripts?[(:]", group = "🛠️ Scripts + tooling" },
{ message = "^tools?[(:]", group = "🛠️ Scripts + tooling" },
{ message = "^ci[(:]", group = "🛠️ Scripts + tooling" },
{ message = "^build[(:]", group = "🛠️ Scripts + tooling" },
# Bug fixes
{ message = "^fix[(:]", group = "🐛 Bug fixes" },
{ message = "^bugfix[(:]", group = "🐛 Bug fixes" },
{ message = "^hotfix[(:]", group = "🐛 Bug fixes" },
# Features
{ message = "^feat[(:]", group = "✨ Features" },
{ message = "^feature[(:]", group = "✨ Features" },
# Documentation
{ message = "^docs?[(:]", group = "📝 Documentation" },
{ message = "^README", group = "📝 Documentation" },
# Maintenance
{ message = "^chore[(:]", group = "🧹 Maintenance" },
{ message = "^refactor[(:]", group = "🧹 Maintenance" },
{ message = "^style[(:]", group = "🧹 Maintenance" },
{ message = "^test[(:]", group = "🧹 Maintenance" },
# --- Keyword-based fallback (only fires if no prefix matched) ---
# Pin bumps — keyword-based since they sometimes use no prefix.
{ message = "(?i)^.*\\b(pin bump|bump (genesis|vllm|sglang|llama|llamacpp)|genesis v[0-9])", group = "🔧 Pin bumps + upstream" },
# Un-prefixed model/compose additions (e.g. `Add Gemma 4 + DFlash compose`)
{ message = "(?i)^(add|introduce)\\s+(gemma|qwen|llama|mixtral|deepseek|kimi|qwopus|new model|.*compose)", group = "🎯 New models + serving paths" },
{ message = "(?i)^add[/]?vllm-", group = "🎯 New models + serving paths" },
# Documentation written without `docs:` prefix (e.g. `AGENTS.md: codify...`,
# `Add docs/CLIFFS.md`, `Document Cliff 1 closure`).
{ message = "^[A-Z][A-Z_]+\\.md[:\\s]", group = "📝 Documentation" },
{ message = "^Add docs[/]", group = "📝 Documentation" },
{ message = "^Document\\s+", group = "📝 Documentation" },
{ message = "^README", group = "📝 Documentation" },
# Cliffs / regressions in subject line (anchored with ^.* to require it
# appear in the subject, not just the body)
{ message = "(?i)^.*\\b(cliff|regression|gotcha)\\b", group = "⚠️ Cliffs, gotchas, regressions" },
# Tool/script names used as prefix (e.g. `power-cap-sweep:`, `setup.sh:`,
# `verify-full.sh:`) — these are de-facto scripts/tooling commits.
{ message = "^[a-z][a-z0-9_-]*\\.(sh|py|toml|yml)[:\\s]", group = "🛠️ Scripts + tooling" },
{ message = "^power-cap-sweep[:\\s]", group = "🛠️ Scripts + tooling" },
{ message = "^verify-[a-z]+[:\\s]", group = "🛠️ Scripts + tooling" },
{ message = "^launch\\.sh", group = "🛠️ Scripts + tooling" },
{ message = "^preflight[:\\s]", group = "🛠️ Scripts + tooling" },
{ message = "^Add scripts[/]", group = "🛠️ Scripts + tooling" },
{ message = "^Split verify-", group = "🛠️ Scripts + tooling" },
# Charts / changelog / results — documentation-adjacent
{ message = "^charts?[:\\s]", group = "📝 Documentation" },
{ message = "^changelog[:\\s]", group = "📝 Documentation" },
{ message = "^results?[:\\s]", group = "📊 Benchmarks + cross-rig data" },
{ message = "^docs\\s*[+]", group = "📝 Documentation" },
# Substantive verbs without prefix — common in this repo's history
{ message = "(?i)^restructure", group = "🧹 Maintenance" },
{ message = "(?i)^audit\\b", group = "🧹 Maintenance" },
{ message = "(?i)^remove\\b", group = "🧹 Maintenance" },
{ message = "(?i)^drop\\b", group = "🧹 Maintenance" },
{ message = "(?i)^migrate", group = "🧹 Maintenance" },
{ message = "(?i)^reconcile", group = "🧹 Maintenance" },
{ message = "(?i)^(ship|push|land)\\s+", group = "✨ Features" },
{ message = "(?i)^verify\\s+", group = "✨ Features" },
{ message = "(?i)\\bclosure\\b", group = "✨ Features" },
{ message = "(?i)\\bship verified\\b", group = "✨ Features" },
# --- Catch-all ---
# Everything that didn't match — keeps unconventional messages visible
# rather than silently dropped.
{ message = ".*", group = "🧹 Other" },
]
# Tag pattern for CalVer (year.month.day)
tag_pattern = "v[0-9]+\\.[0-9]+\\.[0-9]+"
# When generating, ignore tags that don't match the pattern.
ignore_tags = ""
# GitHub remote — used by --github-repo or for PR/contributor enrichment.
[remote.github]
owner = "noonghunna"
repo = "club-3090"