mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
* feat(release): changelog.d/ fragments — kill the CHANGELOG-eat merge-storm cascade
Every PR used to edit the same top lines of CHANGELOG.md (its bullet), so in a
merge-storm each merge conflicted every sibling (CHANGELOG-eat / DIRTY cascade),
forcing a re-sync push + full CI re-run per PR per merge — O(N^2) CI runs.
A PR now adds ONE new file under changelog.d/{features|fixes|maintenance}/ with its
bullet; two PRs never touch the same file. scripts/release/aggregate-changelog.mjs
(npm run changelog:aggregate) folds fragments into the living section and deletes
them at release reconciliation. check:changelog-integrity (already wired in the
merge-integrity CI job — zero workflow change) now also validates fragment
well-formedness. This PR dogfoods the convention: its own entry is a fragment.
* chore(changelog): fragment filename matches PR number (#6783)
43 lines
1.7 KiB
Markdown
43 lines
1.7 KiB
Markdown
# changelog.d/ — changelog fragments
|
|
|
|
**A PR never edits `CHANGELOG.md` directly during the cycle.** Instead it adds ONE new
|
|
file here — its changelog entry as a *fragment*. Two PRs never touch the same file, so
|
|
changelog merge conflicts (the "CHANGELOG-eat" cascade that forced a re-sync push + full
|
|
CI re-run after every sibling merge) are structurally impossible.
|
|
|
|
## Convention
|
|
|
|
| Directory | Aggregates under |
|
|
| -------------- | ----------------------- |
|
|
| `features/` | `### ✨ New Features` |
|
|
| `fixes/` | `### 🐛 Bug Fixes` |
|
|
| `maintenance/` | `### 📝 Maintenance` |
|
|
|
|
- **Filename**: `<PR-number>-<short-slug>.md` (e.g. `fixes/6700-dockerfile-better-sqlite3.md`).
|
|
The PR number prefix keeps aggregation order deterministic.
|
|
- **Content**: the exact bullet line(s) that should land in `CHANGELOG.md`, starting with
|
|
`- `. Multi-line (continuation) bullets are fine. Keep the repo's credit format:
|
|
`(#PR — thanks @user)`.
|
|
- One fragment per PR (rarely more, e.g. a PR that both fixes and adds).
|
|
|
|
## Example
|
|
|
|
`changelog.d/fixes/6496-cloudflare-relay-worker-syntax.md`:
|
|
|
|
```markdown
|
|
- **fix(providers):** Cloudflare relay Worker deploys use Service Worker syntax with `body_part` metadata ([#6496](https://github.com/diegosouzapw/OmniRoute/pull/6496)) — thanks @SeaXen
|
|
```
|
|
|
|
## Aggregation
|
|
|
|
The release captain (or `/generate-release`) folds all fragments into `CHANGELOG.md` and
|
|
deletes them:
|
|
|
|
```bash
|
|
node scripts/release/aggregate-changelog.mjs # write + delete fragments
|
|
node scripts/release/aggregate-changelog.mjs --dry-run # preview only
|
|
```
|
|
|
|
Fragment well-formedness is enforced by `npm run check:changelog-integrity` (the same
|
|
gate that guards against CHANGELOG-eat for legacy direct edits).
|