You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit bf3d857
Browse filesBrowse the repository at this point in the historyBrowse files
ci: write stable release notes by hand on the promotion PR
Assembling a stable release's notes from per-PR notes asked each PR to judge
whether it would matter against the last stable release, and still split a
feature built over several PRs into several lines. Prerelease testers, on the
other hand, want exactly that per-PR detail.
So the two now differ:
- Alpha and beta releases are generated: one line per feat, fix and perf PR
since the last prerelease, from the PR's note or else its title. Notes are
optional on PRs into alpha and beta; "None" leaves a PR out.
- A promotion into main publishes the promotion PR's "## Release notes" as
written, against the last stable release. The PR check blocks promoting
until they're there, and the preview comment shows them as published,
with every change since the last stable release listed to write from and a
warning when the release is a major.
- A fix straight into main is still generated from its own note, which PRs
into main still need, as do breaking changes anywhere.
AGENTS.md (imported by CLAUDE.md) tells agents how to write titles, notes and
promotion notes, and how to tell whether something shipped in the last
stable release.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
PRs are squash-merged, so the title becomes the commit subject and the description becomes its body. Both feed the release.
6
+
7
+
### Title
8
+
9
+
[Conventional Commits](https://www.conventionalcommits.org), checked in CI: `type(scope): description`, with `feat`, `fix`, `perf`, `docs`, `chore`, `test`, `ci`, `style` or `revert` (`refactor` and `build` are rejected). The type sets the next version: `feat` is a minor release, `fix` and `perf` a patch, and `!` after the type a major. Mark a change `!` only if it breaks something in the last stable release.
10
+
11
+
A `feat`, `fix` or `perf` title is also the PR's line in the alpha and beta release notes when it has no release note, so write it to read well there.
12
+
13
+
### Description
14
+
15
+
Keep it short: what changed and why, then a test plan. Detail for reviewers goes here, not in the release notes.
16
+
17
+
Don't start a line with `BREAKING CHANGE:` unless the PR is one. The description is the squashed commit's body, and that line alone makes the next release a major.
18
+
19
+
## Release notes
20
+
21
+
Both kinds are read from PR descriptions when the release is made (`release/notes.mjs`), so they can still be fixed after merging.
22
+
23
+
### Alpha and beta releases: generated, one line per PR
24
+
25
+
Each `feat`, `fix` and `perf` PR since the previous alpha or beta gets a line, breaking changes first. The line is the first paragraph of the PR's `## Release note`, or its title without one. Write the note for someone trying the prerelease: what changed and what to use, in one or two sentences (at most 300 characters, no list).
26
+
27
+
-**Into alpha or beta:** a note is optional. Write one when the title alone wouldn't tell a tester what changed. `None` leaves the PR out, for changes nobody using the package would notice, like the demos and site.
28
+
-**Into main** (released straight away): `feat`, `fix` and `perf` PRs need a note; `None` will do.
29
+
-**Breaking changes**, into any branch: a real note, saying what changed and what to do about it.
30
+
31
+
### Stable releases: written by hand on the promotion PR
32
+
33
+
A promotion into main (from alpha or beta) carries the stable release's notes under `## Release notes`, published as written. Promoting is blocked until they're there.
34
+
35
+
**Write them against the last stable release, not the last alpha or beta.** Someone upgrading from it never saw the prereleases in between.
- Cover what's new or different since that release: one entry per change a user would notice, however many PRs it took.
43
+
- Leave out what only mattered while building it: fixes to bugs no stable release had, and renames or tweaks to options that never shipped. Leave out changes to the demos and site too. To tell whether something shipped, look at the tag: `git grep <name> <tag>`, `git show <tag>:<path>`.
44
+
- Open with a sentence or two on what the release is about, then `### Breaking changes` (with what to do), `### Features` and `### Fixes` as needed, as short bullets. Name the utility, option or export to use; leave how it works to the docs.
45
+
- The section ends at the next `##` heading or a `---` line, so put anything else, like a footer, after one.
46
+
- The PR's "Release notes preview" comment shows the version, warns when it's a major, lists every change since the last stable release to write from, and shows the notes exactly as they'll be published.
47
+
48
+
```md
49
+
## Release notes
50
+
51
+
Pills now animate between sizes, and work in Panda as well as Tailwind.
52
+
53
+
### Fixes
54
+
55
+
- Borders no longer clip on pills under 24px tall.
56
+
57
+
---
58
+
```
59
+
60
+
## Branches and merging
61
+
62
+
- Branch names need a folder (`claude/…`, `fix/…`); the repo rejects branches without one.
63
+
- Feature work goes into `alpha` and is squash-merged.
64
+
- Promotions (alpha → beta → main) and syncs back down are merged by adding the `promote` label, never the merge button (a required check keeps it shut). After each release, the release workflow merges main into beta and alpha by itself.
0 commit comments