@williamthorsen/release-kit 10.5.0 โ 10.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.meta/changelog.json +1570 -0
- package/.readyup/kits/default.js +127 -4
- package/.readyup/kits/npm-auto-publish.js +87 -23
- package/.readyup/manifest.json +14 -9
- package/CHANGELOG.md +83 -0
- package/README.md +68 -963
- package/dist/esm/bin/release-kit.js +4 -3
- package/dist/esm/buildChangelogEntries.js +5 -0
- package/dist/esm/buildDependencyGraph.d.ts +6 -5
- package/dist/esm/buildDependencyGraph.js +5 -1
- package/dist/esm/changelogJsonUtils.d.ts +5 -7
- package/dist/esm/changelogJsonUtils.js +0 -13
- package/dist/esm/changelogOverrides.js +8 -0
- package/dist/esm/extractMigration.d.ts +14 -0
- package/dist/esm/extractMigration.js +18 -0
- package/dist/esm/init/scaffold.js +14 -6
- package/dist/esm/packsPath.d.ts +15 -0
- package/dist/esm/packsPath.js +47 -0
- package/dist/esm/planVersionBump.d.ts +2 -1
- package/dist/esm/planVersionBump.js +4 -0
- package/dist/esm/propagateBumps.d.ts +1 -3
- package/dist/esm/propagateBumps.js +2 -2
- package/dist/esm/releasePrepare.js +0 -16
- package/dist/esm/releasePrepareMono.js +3 -24
- package/dist/esm/reportPrepare.js +4 -2
- package/dist/esm/runGitCliff.d.ts +16 -23
- package/dist/esm/runGitCliff.js +4 -10
- package/dist/esm/sync-labels/resolveLabels.d.ts +5 -3
- package/dist/esm/sync-labels/resolveLabels.js +21 -6
- package/dist/esm/types.d.ts +13 -2
- package/dist/esm/validateConfig.js +1 -1
- package/docs/api.md +73 -0
- package/docs/changelogs.md +70 -0
- package/docs/configuration.md +105 -0
- package/docs/editorial-overrides.md +144 -0
- package/docs/labels.md +83 -0
- package/docs/project-releases.md +74 -0
- package/docs/publishing.md +30 -0
- package/docs/readiness-checks.md +18 -0
- package/docs/releasing.md +108 -0
- package/docs/work-types.md +121 -0
- package/package.json +16 -12
- package/dist/esm/readCurrentVersion.d.ts +0 -2
- package/dist/esm/readCurrentVersion.js +0 -18
|
@@ -0,0 +1,1570 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"version": "10.7.0",
|
|
4
|
+
"date": "2026-09-15",
|
|
5
|
+
"sections": [
|
|
6
|
+
{
|
|
7
|
+
"title": "๐ Features",
|
|
8
|
+
"audience": "all",
|
|
9
|
+
"items": [
|
|
10
|
+
{
|
|
11
|
+
"description": "Fix scaffold error handling and cover every scaffolded workflow (#806)",
|
|
12
|
+
"body": "- Adds a `create-github-release.yaml matches template` check to release-kit's ReadyUp kit, which warns when `.github/workflows/create-github-release.yaml` differs from the template for the detected repo type and skips in a repo that has not installed that workflow.\n- Stops `v11y init --force` from replacing an existing `.config/v11y-check.config.json` with the defaults, which discarded the repo's thresholds and the allowlist maintained by `v11y sync`.\n\nMigration: To reset `.config/v11y-check.config.json` to its defaults, delete the file and run `v11y init`, because `v11y init --force` now overwrites only `.github/workflows/audit.yaml`.",
|
|
13
|
+
"migration": "To reset `.config/v11y-check.config.json` to its defaults, delete the file and run `v11y init`, because `v11y init --force` now overwrites only `.github/workflows/audit.yaml`.",
|
|
14
|
+
"hash": "1e197577c6c60678b5d6522f58b3211f3b10c752"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"title": "๐ Bug fixes",
|
|
20
|
+
"audience": "all",
|
|
21
|
+
"items": [
|
|
22
|
+
{
|
|
23
|
+
"description": "Gate the trusted-publisher checks on trust-query capability (#786)",
|
|
24
|
+
"body": "- Fixes the issue that the `npm-auto-publish` kit advised `npm trust github โฆ` for every package when the npm session lacked the two-factor authentication that trust queries need.",
|
|
25
|
+
"hash": "255ac707f8eabbde2b14ce8ce5fb9819262f1b6e"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"description": "Treat label names that differ only in case as one label (#808)",
|
|
29
|
+
"body": "- Fixes the issue that `sync-labels generate` wrote a preset's `bug` and a local `Bug` to `.github/labels.yaml` as two labels, which made the first sync fail to create the second and every later sync rename the existing label back and forth.\n- Lets a `labels` entry change a preset label's casing: `Bug` replaces a preset's `bug` and appears in the output as `Bug`, and `Bug: null` removes it.\n- Makes `labels` keys that differ only in case a config error that names each group, such as `'bug' and 'Bug'`, since folding them would discard all but one without any sign in the output.\n\nMigration: Keep one of any keys in the `labels` record that differ only in case, and delete the others.",
|
|
30
|
+
"migration": "Keep one of any keys in the `labels` record that differ only in case, and delete the others.",
|
|
31
|
+
"hash": "e045010109b26aae95a63ad51d60c3eb688f5b6c"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"title": "โป๏ธ Refactoring",
|
|
37
|
+
"audience": "dev",
|
|
38
|
+
"items": [
|
|
39
|
+
{
|
|
40
|
+
"description": "Remove the redundant, soft-failing version read from release prepare (#811)",
|
|
41
|
+
"body": "- Deletes `readCurrentVersion` from `release-kit`, moving into `planVersionSet` the check that a `--set-version` target exceeds the current version and recording each workspace's version in the `DependencyGraph` passed to `propagateBumps`.\n- Stops prepare from printing a warning before it fails on an unreadable `package.json`, and replaces `failed to read current version` for a missing `version` under `--set-version` with an error from `planVersionSet` that reports the missing `version` field.",
|
|
42
|
+
"hash": "668123e01e71b013fa33dc391f9b0f685508a25b"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"title": "โ๏ธ Tooling",
|
|
48
|
+
"audience": "dev",
|
|
49
|
+
"items": [
|
|
50
|
+
{
|
|
51
|
+
"description": "Upgrade eslint-config-typescript to v17 and adopt its ignore lists (#797)",
|
|
52
|
+
"body": "- Declares `vitest` as `catalog:` in every workspace that imports it, with the pnpm catalog pinning 4.1.11, because v17 no longer exempts `vitest` from `n/no-extraneous-import`.\n- Builds the global ignores in `eslint.config.ts` from the published `commonIgnores` and `toolIgnores`, which also exclude `pnpm-lock.yaml` and each `.readyup/manifest.json`, so the `eslint --fix` in `nmr lint` can no longer rewrite a kit manifest and make the next build's `rdy verify` fail.",
|
|
53
|
+
"hash": "b201669444763ad5bef85730b114098ef352e09b"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"title": "๐ Documentation",
|
|
59
|
+
"audience": "dev",
|
|
60
|
+
"items": [
|
|
61
|
+
{
|
|
62
|
+
"description": "Trim the release-kit README and move reference detail into shipped docs (#802)",
|
|
63
|
+
"body": "- Adds `docs` to the published `files` of `@williamthorsen/release-kit` and a `!docs/*.v*.md` exclusion to both it and `@williamthorsen/nmr`, because `pnpm pack` would otherwise include the release-notes previews that a local checkout holds.\n- Adds `--version` to the options that `release-kit --help` lists, and points the hints for the removed `releaseNotes.shouldCreateGithubRelease` field at `release-kit init` instead of the README.",
|
|
64
|
+
"hash": "bce2e74071cffd44e64e8bf9e6d2e6a2adaaf363"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"version": "10.6.0",
|
|
72
|
+
"date": "2026-09-08",
|
|
73
|
+
"sections": [
|
|
74
|
+
{
|
|
75
|
+
"title": "๐ Features",
|
|
76
|
+
"audience": "all",
|
|
77
|
+
"items": [
|
|
78
|
+
{
|
|
79
|
+
"description": "Report a package whose tarball would omit its changelog (#768)",
|
|
80
|
+
"body": "Adds ReadyUp checks to verify that every published package bundles its changelog files: the human-readable `CHANGELOG.md` and the machine-readable `changelog.json`.",
|
|
81
|
+
"hash": "25dd5c01b5e5b0ac26b266613fe71f47428e6c5c"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"description": "Add a migration field to changelog.json items (#770)",
|
|
85
|
+
"body": "Adds an optional `migration` field to entries in the `.meta/changelog.json` that `release-kit` generates. If a commit body contains a labeled migration step, that content is copied to the `migration` field.",
|
|
86
|
+
"hash": "a01f93f04e799a6e498b28e35a414349596c9d21"
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"title": "๐ Bug fixes",
|
|
92
|
+
"audience": "all",
|
|
93
|
+
"items": [
|
|
94
|
+
{
|
|
95
|
+
"description": "Pin git-cliff and remove the per-run npx cache refresh (#776)",
|
|
96
|
+
"body": "Fixes an issue where git-cliff's version was unpinned, resulting in a per-run cache refresh. An exact version is now pinned.\n\nRemoves the per-run cache refresh, which re-ran `npx` without `--prefer-offline` once per prepare and forced a registry round trip. An exact version leaves npm nothing to revalidate, so a prepare run no longer waits on registry latency.\n\nAlso silences git-cliff's INFO output, in particular the crates.io update notice.",
|
|
97
|
+
"hash": "82acfde5405ee4c81ac8d8d4eca468722bad5ca4"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"title": "โป๏ธ Refactoring",
|
|
103
|
+
"audience": "dev",
|
|
104
|
+
"items": [
|
|
105
|
+
{
|
|
106
|
+
"description": "Remove the unwired isChangelogItem type guard (#771)",
|
|
107
|
+
"body": "Removes the unused `isChangelogItem` from `release-kit`'s `changelogJsonUtils.ts`, together with its tests.\n\nDocumentation is updated to record the boundary on `isChangelogEntry`: Entries parsed from `.meta/changelog.json` are shape-checked at the top level only, and strict validation applies only to the human-authored `.meta/changelog-overrides.json`.",
|
|
108
|
+
"hash": "f76ad8e6ebc852dc790e2dcdf874c1bb8aeb0245"
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"title": "๐งช Tests",
|
|
114
|
+
"audience": "dev",
|
|
115
|
+
"items": [
|
|
116
|
+
{
|
|
117
|
+
"description": "Read console spy output with listConsoleLines rather than by hand (#781)",
|
|
118
|
+
"body": "- Replaces the hand-rolled reads of a console spy's `mock.calls` in the `nmr`, `release-kit`, and `v11y-check` test suites with `listConsoleLines` from `@williamthorsen/toolbelt.vitest/candidate`.\n- Clears the `toolbelt.vitest/no-console-calls-read` recommendation that `rdy run --packages` reported.",
|
|
119
|
+
"hash": "9a5fbc2f01e8468821be89c345c59ade913074f4"
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"version": "10.5.0",
|
|
127
|
+
"date": "2026-09-01",
|
|
128
|
+
"sections": [
|
|
129
|
+
{
|
|
130
|
+
"title": "๐ Features",
|
|
131
|
+
"audience": "all",
|
|
132
|
+
"items": [
|
|
133
|
+
{
|
|
134
|
+
"description": "Report a consuming repo that still declares @changesets/cli (#764)",
|
|
135
|
+
"body": "Adds a check to the default ReadyUp kit in `@williamthorsen/release-kit` that reports a repo still declaring `@changesets/cli`, the release tool superseded by release-kit. The check reports at `recommend` severity; its fix directs the consumer to remove the dependency together with the `.changeset/` directory and any `changeset:*` scripts.",
|
|
136
|
+
"hash": "62f8a9ed0dc005ed84e066bf5d144ada9f3f69ae"
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"title": "โป๏ธ Refactoring",
|
|
142
|
+
"audience": "dev",
|
|
143
|
+
"items": [
|
|
144
|
+
{
|
|
145
|
+
"description": "Upgrade to readyup v0.34 and exclude a private repo root from kit checks (#759)",
|
|
146
|
+
"body": "Upgrades `readyup` to v0.34, whose `discoverWorkspaces` now reports the repo root. `release-kit`'s `npm-auto-publish` kit filters that root out unless it is publishable, so a private root is no longer listed in the kit's report.\n\nTest suites for release-kit's ReadyUp kits have been refactored to use the patterns documented in v0.34.",
|
|
147
|
+
"hash": "2c0cf04c9a282e10e03c3fd1a44d4330b8a25a94"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"description": "Upgrade eslint-config-typescript and mark the discards it now reports (#761)",
|
|
151
|
+
"body": "Upgrades `@williamthorsen/eslint-config-typescript` to v12 and fixes violations surfaced by the newly added rule warning against a disposable that is discarded or that is bound to a declaration that never releases it.",
|
|
152
|
+
"hash": "61f59fe51681c590278f7c969bb3889309396dcc"
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"version": "10.4.4",
|
|
160
|
+
"date": "2026-08-24",
|
|
161
|
+
"sections": [
|
|
162
|
+
{
|
|
163
|
+
"title": "โป๏ธ Refactoring",
|
|
164
|
+
"audience": "dev",
|
|
165
|
+
"items": [
|
|
166
|
+
{
|
|
167
|
+
"description": "Upgrade ReadyUp and the toolbelt packages, adopting their new APIs (#748)",
|
|
168
|
+
"body": "Upgrades `readyup` and the `@williamthorsen/toolbelt.*` packages to their latest versions.\n\nThe `readFile` utility from `readyup` replaces hand-rolled code in `nmr`.",
|
|
169
|
+
"hash": "9e54b0670c67b6b1da5d7afca7fe071ecbed2797"
|
|
170
|
+
}
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"title": "๐งช Tests",
|
|
175
|
+
"audience": "dev",
|
|
176
|
+
"items": [
|
|
177
|
+
{
|
|
178
|
+
"description": "Scaffold the temporary trees through the tree's own write API (#736)",
|
|
179
|
+
"body": "Scaffolds every `release-kit` test suite that holds a temporary tree through the tree's own write API rather than bare `node:fs`.\n\nAlso deletes `syncWorkTypes.unit.test.ts`'s wrapper `Disposable`, which restored a read-only tree's write permission before disposal; the pinned `@williamthorsen/toolbelt.filesystem` disposes such a tree on its own.",
|
|
180
|
+
"hash": "30d8125d1ce2c0660b4b03a1350b4f10deb31d0f"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"version": "10.4.3",
|
|
188
|
+
"date": "2026-08-20",
|
|
189
|
+
"sections": [
|
|
190
|
+
{
|
|
191
|
+
"title": "๐งช Tests",
|
|
192
|
+
"audience": "dev",
|
|
193
|
+
"items": [
|
|
194
|
+
{
|
|
195
|
+
"description": "Register the working directory for disposal alongside the tree it points into (#724)",
|
|
196
|
+
"body": "Converts the `release-kit` and `v11y-check` suites that run from inside a temporary directory to `createTempTree` and `pointCwdAt`, registered through `disposeOnTestFinished` or scoped with `using`. Reverse-order disposal now restores the working directory before removing the tree it pointed into, which each suite previously had to sequence by hand.",
|
|
197
|
+
"hash": "6d3a42a33913ae9900b8a2d106329dcf690941e6"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"description": "Route the remaining hand-built temporary directories through createTempTree (#725)",
|
|
201
|
+
"body": "Replaces the hand-built temporary directories in the `release-kit` and `v11y-check` test suites with a `createTempTree` fixture, dropping the `beforeEach`/`afterEach` pairs that created and removed them.",
|
|
202
|
+
"hash": "92e76397f6f5ef3068b7f4805599fd090f930f7d"
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"version": "10.4.2",
|
|
210
|
+
"date": "2026-08-19",
|
|
211
|
+
"sections": [
|
|
212
|
+
{
|
|
213
|
+
"title": "๐งช Tests",
|
|
214
|
+
"audience": "dev",
|
|
215
|
+
"items": [
|
|
216
|
+
{
|
|
217
|
+
"description": "Register fixture-repo cleanup against the test that asks for it (#715)",
|
|
218
|
+
"body": "Routes nmr's `buildRepo` fixture helper through `createTempTree`, registering each fixture directory's removal against the test that requested it. The module-level accumulator and the exported `removeFixtureDirs` have been removed.",
|
|
219
|
+
"hash": "4186900691928b41e56b6f1855ca74b9700c1968"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"description": "Convert the per-test temporary directories to test-scoped fixtures (#719)",
|
|
223
|
+
"body": "Converts the suites that create a temporary directory in `nmr`, `nmr-core`, and `release-kit` to take it as a Vitest fixture built on `createTempTree`, or as a `using` declaration where the directory lives and dies inside one test body. Each suite loses the mutable binding and the `beforeEach`/`afterEach` pair that carried the directory's lifetime, and a directory is created only for the tests that name one.\n\nSeparately, `nmr lint:strict` now fails on a stale `eslint-disable` directive.",
|
|
224
|
+
"hash": "ab09827339799f3849b8968e7e25a9cd80083c30"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"description": "Register temporary-directory disposal where a helper holds the binding (#721)",
|
|
228
|
+
"body": "Routes the temporary directory through `createTempTree` in the `nmr` and `release-kit` test suites whose describe-local helpers hold its binding, and registers its removal with `disposeOnTestFinished`. The hand-written `afterEach` teardown goes; the binding stays, so no suite helper changes signature.",
|
|
229
|
+
"hash": "92f7a08621b7973595cb6401f98dd4f700770266"
|
|
230
|
+
}
|
|
231
|
+
]
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"version": "10.4.1",
|
|
237
|
+
"date": "2026-08-18",
|
|
238
|
+
"sections": [
|
|
239
|
+
{
|
|
240
|
+
"title": "๐ Bug fixes",
|
|
241
|
+
"audience": "all",
|
|
242
|
+
"items": [
|
|
243
|
+
{
|
|
244
|
+
"description": "Accept `--only` under a project block, skipping the project release (#702)",
|
|
245
|
+
"body": "Fixes an issue where `release-kit prepare --only` exited with an error in any repo whose config declares a `project` block, which left the `only` dispatch input that `release-kit init` scaffolds into `release.yaml` unusable. A narrowed run now releases the named workspaces and skips the project release, reporting the skip and the selection that caused it as a warning.",
|
|
246
|
+
"hash": "d695171f77538a66373027a26ccb75e7e11cca87"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"description": "Route release-notes preview warnings through the prepare plan (#705)",
|
|
250
|
+
"body": "Fixes an issue where `release-kit prepare --with-release-notes` printed its diagnostics to stderr ahead of the release report, and described a skipped release-notes preview as a skipped README injection. The messages now render as `โ ๏ธ` lines inside the report and are worded for release-notes previews; a skip belonging to one workspace names that workspace.",
|
|
251
|
+
"hash": "47b0e025992e64bbb5b6a8ce951c5bb14b3d0315"
|
|
252
|
+
}
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"version": "10.4.0",
|
|
259
|
+
"date": "2026-08-17",
|
|
260
|
+
"sections": [
|
|
261
|
+
{
|
|
262
|
+
"title": "๐ Features",
|
|
263
|
+
"audience": "all",
|
|
264
|
+
"items": [
|
|
265
|
+
{
|
|
266
|
+
"description": "Let a project release cover repo-root paths (#685)",
|
|
267
|
+
"body": "Extends `release-kit`'s project release to a repo whose content lives at the root. Such a repo declares `project: { paths: ['**'] }` and gets the root `CHANGELOG.md`, the root `.meta/changelog.json`, the `--with-release-notes` previews under root `docs/`, the root `package.json` bump, and the project tag that the stage produces.\n\n`paths` scopes any project release's window, not only the whole-tree case, and the project tier of `release-kit validate-overrides` with it. A declared value replaces the workspace union rather than extending it; omitting `paths` resolves to that union, so existing consumers see no change.",
|
|
268
|
+
"hash": "75250fe6e61b596a265fff74ffadf1ffcf430579"
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"title": "โป๏ธ Refactoring",
|
|
274
|
+
"audience": "dev",
|
|
275
|
+
"items": [
|
|
276
|
+
{
|
|
277
|
+
"description": "Adopt silenceConsole across the test suites (#677)",
|
|
278
|
+
"body": "Adopts `silenceConsole` from `@williamthorsen/toolbelt.vitest` to replace all hand-rolled `vi.spyOn(console, โฆ)` spies and reduce boilerplate across the repo's test suites. The function returns a disposable, allowing the caller to use `using` to enable restoration of the console method at the end of the test scope.",
|
|
279
|
+
"hash": "412fd27cfe1324612aa123d1f8166fb6b37a07ff"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"description": "Adopt `isError` and consolidate errno narrowing on a shared helper (#697)",
|
|
283
|
+
"body": "Replaces every hand-rolled `instanceof Error` narrowing with `hasErrnoCode`, a new predicate exported from `@williamthorsen/nmr-core`, or with `isError` from `@williamthorsen/toolbelt.errors`. Previously the errno question was answered by inline copies alongside two private helpers of differing shape; both helpers are removed.\r\n\r\nSeparately, `eslint.config.ts` now bans `instanceof Error` in every position rather than in a ternary alone.",
|
|
284
|
+
"hash": "c5e8e8a5e006b451e8c5aeea75d35772926d503c"
|
|
285
|
+
}
|
|
286
|
+
]
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"title": "๐งช Tests",
|
|
290
|
+
"audience": "dev",
|
|
291
|
+
"items": [
|
|
292
|
+
{
|
|
293
|
+
"description": "Replace the stdio spies with captureStdio (#678)",
|
|
294
|
+
"body": "Replaces every `process.stdout` and `process.stderr` spy in the test suites with `captureStdio` from `@williamthorsen/toolbelt.testing` and deletes the obviated local capture helpers. `captureStdio` buffers writes rather than recording calls, so assertions that previously used `toHaveBeenCalledWith` instead check `stderr`/`stdout` strings and their chunk arrays.\n\nSeparately, `unicorn/no-nonstandard-builtin-properties` is off for test files. Its hand-maintained symbol table omits `Symbol.dispose`, which a suite-scoped capture calls to restore the streams, and `schema: []` offers no way to extend the table.",
|
|
295
|
+
"hash": "b59304680cd26864d282ec3b36eac31bc2e0386d"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"description": "Adopt throwOnProcessExit and captureError across the test suites (#690)",
|
|
299
|
+
"body": "Adopts `throwOnProcessExit` from `@williamthorsen/toolbelt.vitest`, replacing every hand-rolled `process.exit` mock in the `release-kit` and `nmr-core` test suites, and `captureError` from `@williamthorsen/toolbelt.testing`, replacing inline try/catch/`instanceof` blocks.\n\nSeparately, `@williamthorsen/toolbelt.vitest` is now listed in the ReadyUp config, so that its kit is run by `rdy run --packages`.",
|
|
300
|
+
"hash": "41a14bbee515d27ccb92058816eec46812a88478"
|
|
301
|
+
}
|
|
302
|
+
]
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"version": "10.3.2",
|
|
308
|
+
"date": "2026-08-13",
|
|
309
|
+
"sections": [
|
|
310
|
+
{
|
|
311
|
+
"title": "โป๏ธ Refactoring",
|
|
312
|
+
"audience": "dev",
|
|
313
|
+
"items": [
|
|
314
|
+
{
|
|
315
|
+
"description": "Adopt toolbelt.errors for error-message extraction and cause-chaining (#652)",
|
|
316
|
+
"body": "Improves error reporting by adopting standardized ways of capturing and describing errors across the codebase.",
|
|
317
|
+
"hash": "30e6dac440ca7c61b8f44fb2998ff9e933425008"
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"title": "โ๏ธ Tooling",
|
|
323
|
+
"audience": "dev",
|
|
324
|
+
"items": [
|
|
325
|
+
{
|
|
326
|
+
"description": "Upgrade the lint config and clear its violations (#671)",
|
|
327
|
+
"body": "Upgrades `@williamthorsen/eslint-config-typescript`, along with other config packages, and clears lint violations surfaced by the newly activated rules.",
|
|
328
|
+
"hash": "17124c0ccd1a101d9fc46743b8e6b05d1e639e19"
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
}
|
|
332
|
+
]
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"version": "10.3.0",
|
|
336
|
+
"date": "2026-08-08",
|
|
337
|
+
"sections": [
|
|
338
|
+
{
|
|
339
|
+
"title": "๐ Features",
|
|
340
|
+
"audience": "all",
|
|
341
|
+
"items": [
|
|
342
|
+
{
|
|
343
|
+
"description": "Stop reporting absence checks that pass (#610)",
|
|
344
|
+
"body": "A ReadyUp check that checks for a problem (such as an unwanted file or a stale config reference) now stays silent unless it finds one. The `nmr`, `release-kit`, and `v11y-check` ReadyUp kits previously printed a line for every such check on every run.",
|
|
345
|
+
"hash": "aa4cbae89dfe4f6268ca4de318213fc3f610aba0"
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"description": "Stop reporting non-issues in the readyup kits (#613)",
|
|
349
|
+
"body": "Modifies the `release-kit` and `nmr` ReadyUp kits to avoid verbose reporting when an initial check determines that further checks aren't applicable. In particular, a repo with no `release-kit` config file gets a single line in the `release-kit` report, and a repo that publishes nothing now bypasses the `npm-auto-publish` kit instead of failing it.",
|
|
350
|
+
"hash": "6ad37a6a9e8ae91403bfb92e74c1ab05c60d6e32"
|
|
351
|
+
}
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"title": "๐ Bug fixes",
|
|
356
|
+
"audience": "all",
|
|
357
|
+
"items": [
|
|
358
|
+
{
|
|
359
|
+
"description": "Publish build output atomically so a failed build cannot destroy it (#631)",
|
|
360
|
+
"body": "Fixes an issue where a failed or still-running `nmr build` could leave a package with no build output at all, breaking the tooling that a subsequent build depends on. Separately, the error reported when a package's build output is missing now names the correct recovery command.",
|
|
361
|
+
"hash": "79ea249c38dfa265c4be6da57f8a340e54e578b8"
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
"title": "โป๏ธ Refactoring",
|
|
367
|
+
"audience": "dev",
|
|
368
|
+
"items": [
|
|
369
|
+
{
|
|
370
|
+
"description": "Retire the deferred-lint-rule list and enforce its rules (#628)",
|
|
371
|
+
"body": "Errors that `release-kit` rethrows now carry the original error as their cause, previously available only as message text. Help text and documentation for `--with-release-notes` now use the same placeholder notation for its output paths.\n\nAll violations of lint rules in the `release-kit` project are now cleared, and the list of deferred lint rules is retired, restoring associated rules to a max severity of \"error\" during strict linting.",
|
|
372
|
+
"hash": "dbafb8086d27b0ec5019a2a35b56fab7ce4ceae8"
|
|
373
|
+
}
|
|
374
|
+
]
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"title": "โ๏ธ Tooling",
|
|
378
|
+
"audience": "dev",
|
|
379
|
+
"items": [
|
|
380
|
+
{
|
|
381
|
+
"description": "Migrate to the shared tsconfig baseline (#626)",
|
|
382
|
+
"body": "Adopts `@williamthorsen/tsconfig` as the standard TypeScript configuration for this repo, replacing the previous hand-maintained copy. Reading a property through an index signature now requires bracket notation or a type that declares the property. The `nmr` build now fails on a base TypeScript config it cannot resolve, rather than building without it, and it now resolves a base config named by package name alone.",
|
|
383
|
+
"hash": "890a67c84b99d7efa663f8e64cf0beb89168581b"
|
|
384
|
+
}
|
|
385
|
+
]
|
|
386
|
+
}
|
|
387
|
+
]
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"version": "10.2.2",
|
|
391
|
+
"date": "2026-08-05",
|
|
392
|
+
"sections": [
|
|
393
|
+
{
|
|
394
|
+
"title": "๐ Bug fixes",
|
|
395
|
+
"audience": "all",
|
|
396
|
+
"items": [
|
|
397
|
+
{
|
|
398
|
+
"description": "Report the missing npm login once, not per package (#598)",
|
|
399
|
+
"body": "Fixes an issue where running release-kit's publish-readiness checks without an npm login reported a trusted-publisher failure for every published package. The missing login is now reported once, with `npm login` as the fix. An unreachable registry now has its own check. The trusted publisher check produces more informative failure messages.",
|
|
400
|
+
"hash": "47e8dd774b617ebc6095c7fc0c9b5e8e0a0de883"
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"description": "Make prepare all-or-nothing and report the tags file by path (#601)",
|
|
404
|
+
"body": "Fixes an issue where a failed `prepare` could leave the release flow in a broken intermediate state. A release now lands completely or not at all, and a formatting failure no longer discards one that already landed. When a write fails partway, the error names every file that reached disk, every file that did not, and the commands that undo them.\r\n\r\n`commit` and `tag` now report the full path of the tags file they looked for, and distinguish a missing file from one that could not be read, so that running from the wrong directory or worktree is no longer reported as a release that never happened.\r\n\r\nRuns with `--with-release-notes` now list the preview files they write, and `--dry-run` names the ones a real run would write.",
|
|
405
|
+
"hash": "83ac6e45cf9d4b5371650cda42d7830ed4988660"
|
|
406
|
+
}
|
|
407
|
+
]
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"title": "๐งช Tests",
|
|
411
|
+
"audience": "dev",
|
|
412
|
+
"items": [
|
|
413
|
+
{
|
|
414
|
+
"description": "Clear the deferred vitest test rules and enforce them (#602)",
|
|
415
|
+
"body": "Fixes a subset of previously deferred lint violations and restores the severity of Vitest lint rules to \"error\" for purposes strict linting.",
|
|
416
|
+
"hash": "4b43d29580fe9736fb2b4fa4ae6c2348cca53754"
|
|
417
|
+
}
|
|
418
|
+
]
|
|
419
|
+
}
|
|
420
|
+
]
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"version": "10.2.1",
|
|
424
|
+
"date": "2026-08-04",
|
|
425
|
+
"sections": [
|
|
426
|
+
{
|
|
427
|
+
"title": "๐ Bug fixes",
|
|
428
|
+
"audience": "all",
|
|
429
|
+
"items": [
|
|
430
|
+
{
|
|
431
|
+
"description": "Remove the 1 MiB ceiling on captured git output (#596)",
|
|
432
|
+
"body": "Fixes an issue where `release-kit prepare` began aborting once a repository's release history grew long enough, leaving that repository unable to cut another release. The fix covers, in addition to `prepare`, every other release-kit command that reads from git.",
|
|
433
|
+
"hash": "07bf786d00c493f7bc4c0fda6932ea9659ca6f95"
|
|
434
|
+
}
|
|
435
|
+
]
|
|
436
|
+
}
|
|
437
|
+
]
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"version": "10.2.0",
|
|
441
|
+
"date": "2026-08-04",
|
|
442
|
+
"sections": [
|
|
443
|
+
{
|
|
444
|
+
"title": "๐ Features",
|
|
445
|
+
"audience": "all",
|
|
446
|
+
"items": [
|
|
447
|
+
{
|
|
448
|
+
"description": "Add status labels and clear grouped-label descriptions (#585)",
|
|
449
|
+
"body": "Adds two status labels (`status:blocked` and `status:on-hold`) to the common preset and removes descriptions from other scoped labels (`priority:` and `value:`) to keep scoped groups compact in the GitHub UI.",
|
|
450
|
+
"hash": "98210d58895462431a8b08dbda30768b58d97633"
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"description": "Publish each package's readyup kit from the package that owns it (#590)",
|
|
454
|
+
"body": "ReadyUp checks for `@williamthorsen/nmr`, `@williamthorsen/release-kit`, and `v11y-check` are now run directly against these packages, guaranteeing a version-appropriate check, instead of against their host repo. The package must be installed as a direct dependency in the calling repo.\n\nThe syntax is `rdy run --from npm:<package>`. `rdy run --packages` runs the kits contained in any packages listed in `.config/readyup.config.ts`. Requires `readyup` 0.23 or later.",
|
|
455
|
+
"hash": "f0fa3b416564ed4490c48007453fcb20c04807b3"
|
|
456
|
+
}
|
|
457
|
+
]
|
|
458
|
+
}
|
|
459
|
+
]
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
"version": "10.1.0",
|
|
463
|
+
"date": "2026-08-03",
|
|
464
|
+
"sections": [
|
|
465
|
+
{
|
|
466
|
+
"title": "๐ Features",
|
|
467
|
+
"audience": "all",
|
|
468
|
+
"items": [
|
|
469
|
+
{
|
|
470
|
+
"description": "Publish nmr's readyup kit with a test-tier conformance check (#580)",
|
|
471
|
+
"body": "`@williamthorsen/nmr` is now bundled with ReadyUp kits that check a repo's alignment with `nmr` requirements and recommendations.\n\n`rdy run --from npm:@williamthorsen/nmr` checks the repo against the kits without prior configuration. Once the package is added to the ReadyUp config, `rdy run --packages` will run the `nmr` kits along with those of any other registered package. Requires `readyup` v0.23 or greater.",
|
|
472
|
+
"hash": "94bd46acfecf87d6ec0f981ee561c0ebf22d9c09"
|
|
473
|
+
}
|
|
474
|
+
]
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"title": "โป๏ธ Refactoring",
|
|
478
|
+
"audience": "dev",
|
|
479
|
+
"items": [
|
|
480
|
+
{
|
|
481
|
+
"description": "Load the config with Node's TypeScript support instead of jiti (#573)",
|
|
482
|
+
"body": "`release-kit` now uses native Node with type-stripping to read its configs. `jiti` is no longer needed as a dependency. As a result, relative imports inside `.config/release-kit.config.ts` now require an explicit file extension.",
|
|
483
|
+
"hash": "b4837030475b6a65023001b31eeb746b6439eac3"
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
}
|
|
487
|
+
]
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"version": "10.0.0",
|
|
491
|
+
"date": "2026-08-03",
|
|
492
|
+
"sections": [
|
|
493
|
+
{
|
|
494
|
+
"title": "๐ Features",
|
|
495
|
+
"audience": "all",
|
|
496
|
+
"items": [
|
|
497
|
+
{
|
|
498
|
+
"description": "Retire integration label in favor of an isolation-tier test ladder (#552)",
|
|
499
|
+
"body": "Test groups are now named for what a test reaches rather than for how much of the codebase it covers: `integration` and `app` are replaced by `unit`, `tool`, `localhost`, and `remote`.\n\n`nmr test` now runs the `tool` group alongside `unit`, so the first run after upgrading may fail on tests that nothing was running before. Upgrading means renaming `*.int.test.ts` files onto the new groups and replacing `nmr test:integration` with `nmr test:tool`.",
|
|
500
|
+
"breaking": true,
|
|
501
|
+
"hash": "81f16694dc295c754d35e692eedd75f47be35f4d"
|
|
502
|
+
}
|
|
503
|
+
]
|
|
504
|
+
},
|
|
505
|
+
{
|
|
506
|
+
"title": "โป๏ธ Refactoring",
|
|
507
|
+
"audience": "dev",
|
|
508
|
+
"items": [
|
|
509
|
+
{
|
|
510
|
+
"description": "Move defineConfig to a dedicated config subpath (#566)",
|
|
511
|
+
"body": "`defineConfig` now comes from the `@williamthorsen/release-kit/config` subpath rather than from the package root. The subpath also carries the config types.",
|
|
512
|
+
"breaking": true,
|
|
513
|
+
"hash": "e0769815f41c23d64302be26c8369209fad72e22"
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
"description": "Share nmr-core's cache primitives with nmr-compile (#570)",
|
|
517
|
+
"body": "A package's writes to the build cache are now hidden from other packages until the write is complete. A failing build now reports its error in the same form as every other `nmr` command. `tsx` is no longer required to build a package.",
|
|
518
|
+
"hash": "2a67cf1e6181cb8713de485859c3731e16edacf6"
|
|
519
|
+
}
|
|
520
|
+
]
|
|
521
|
+
}
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"version": "9.1.0",
|
|
526
|
+
"date": "2026-07-31",
|
|
527
|
+
"sections": [
|
|
528
|
+
{
|
|
529
|
+
"title": "๐ Features",
|
|
530
|
+
"audience": "all",
|
|
531
|
+
"items": [
|
|
532
|
+
{
|
|
533
|
+
"description": "Make label descriptions optional and generate none for scope labels (#539)",
|
|
534
|
+
"body": "`release-kit` now supports labels without a description, and `release-kit sync-labels init` generates scope labels without one. Applying a label without a description clears any existing description the repository carries for that label.",
|
|
535
|
+
"hash": "275108cfbc5694647a945de5aa75ac0ac6d07152"
|
|
536
|
+
}
|
|
537
|
+
]
|
|
538
|
+
}
|
|
539
|
+
]
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
"version": "9.0.1",
|
|
543
|
+
"date": "2026-07-30",
|
|
544
|
+
"sections": [
|
|
545
|
+
{
|
|
546
|
+
"title": "โ๏ธ Tooling",
|
|
547
|
+
"audience": "dev",
|
|
548
|
+
"items": [
|
|
549
|
+
{
|
|
550
|
+
"description": "Adopt Vitest projects in this repo (#530)",
|
|
551
|
+
"body": "Simplifies test configurations so that every package exposes the same test commands, which select suites by test category: `nmr test` runs everything except integration tests, `nmr test:integration` runs only those, and `nmr test:all` runs both. `nmr test:integration` now succeeds in a package that has no integration tests instead of failing. release-kit's drift checks can now be run on their own, apart from unit and integration tests. A fresh clone now has to run `pnpm run bootstrap` before any test run, not just before `nmr` commands.",
|
|
552
|
+
"hash": "a2fdd9c03c419f8fb70941ff5a3c580a6badcde6"
|
|
553
|
+
}
|
|
554
|
+
]
|
|
555
|
+
}
|
|
556
|
+
]
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"version": "9.0.0",
|
|
560
|
+
"date": "2026-07-28",
|
|
561
|
+
"sections": [
|
|
562
|
+
{
|
|
563
|
+
"title": "๐ Features",
|
|
564
|
+
"audience": "all",
|
|
565
|
+
"items": [
|
|
566
|
+
{
|
|
567
|
+
"description": "Unify label configuration in release-kit.config.ts (#505)",
|
|
568
|
+
"body": "Repositories now declare their label set alongside the rest of their release-kit configuration in `.config/release-kit.config.ts`, and the declaration is validated and completed in the editor as it is written. A label supplied by a bundled preset can now be recolored, reworded, or dropped. `sync-labels generate --check` now reports when the committed label file has fallen behind the declaration, writing nothing. The standalone `.config/sync-labels.config.ts` is no longer read; while it remains in place, every `sync-labels` command refuses to run, naming what to move and where.",
|
|
569
|
+
"breaking": true,
|
|
570
|
+
"hash": "d774ce4efc98e5a6f0c30f46c765c30fbfeed539"
|
|
571
|
+
}
|
|
572
|
+
]
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"title": "๐ Bug fixes",
|
|
576
|
+
"audience": "all",
|
|
577
|
+
"items": [
|
|
578
|
+
{
|
|
579
|
+
"description": "Include commits scoped to `*` in the changelog (#496)",
|
|
580
|
+
"body": "Fixes an issue where commits scoped to `*` raised the version but were silently dropped from the generated changelog.",
|
|
581
|
+
"hash": "a449b394dc08a9d04e498afad6a058177a8af881"
|
|
582
|
+
}
|
|
583
|
+
]
|
|
584
|
+
}
|
|
585
|
+
]
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"version": "8.1.0",
|
|
589
|
+
"date": "2026-07-22",
|
|
590
|
+
"sections": [
|
|
591
|
+
{
|
|
592
|
+
"title": "๐ Features",
|
|
593
|
+
"audience": "all",
|
|
594
|
+
"items": [
|
|
595
|
+
{
|
|
596
|
+
"description": "Make label deletions reviewable and apply labels on merge (#493)",
|
|
597
|
+
"body": "Pull requests that touch a repository's label file now get a check listing every label change the sync would make, including deletions of labels the file never mentions, which a diff of the file cannot show. Merging the pull request now applies those labels. The sync's deletion and rename handling now changes only through a reviewed upgrade to a verified release. Repositories that already scaffolded this workflow adopt the new triggers by re-running `release-kit sync-labels init --force`.",
|
|
598
|
+
"hash": "05e9acec4c503b35e96906913f8a97c6875e9106"
|
|
599
|
+
}
|
|
600
|
+
]
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
"title": "๐ฆ Dependencies",
|
|
604
|
+
"audience": "dev",
|
|
605
|
+
"items": [
|
|
606
|
+
{
|
|
607
|
+
"description": "Upgrade dependencies and align the Node support policy (#483)",
|
|
608
|
+
"body": "All four published packages (`nmr`, `nmr-core`, `release-kit`, and `v11y-check`) now require Node.js 24 or later, up from Node 18.17. Separately, `nmr-compile` now rebuilds when the TypeScript version changes.",
|
|
609
|
+
"hash": "3090aa1ec68224f88e0b537ae09282e8e636f711"
|
|
610
|
+
}
|
|
611
|
+
]
|
|
612
|
+
}
|
|
613
|
+
]
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
"version": "8.0.1",
|
|
617
|
+
"date": "2026-07-18",
|
|
618
|
+
"sections": [
|
|
619
|
+
{
|
|
620
|
+
"title": "๐ Bug fixes",
|
|
621
|
+
"audience": "all",
|
|
622
|
+
"items": [
|
|
623
|
+
{
|
|
624
|
+
"description": "Skip private packages cleanly in publish and create-github-release (#477)",
|
|
625
|
+
"body": "Fixes an issue where a workspace marked private in its `package.json` could break a release: `release-kit publish` failed on it, and `release-kit create-github-release` created an unwanted public GitHub Release for it. Both commands now skip private workspaces cleanly: publish reports the skip and continues instead of failing the run, and create-github-release produces no Release for a private package. Any publishable packages released alongside it still publish and still get their Releases. Marking a workspace private is now all it takes to exclude it from both publishing and GitHub Releases.",
|
|
626
|
+
"hash": "d1a647c648a64f81d884c31e9c6e63b91b029687"
|
|
627
|
+
}
|
|
628
|
+
]
|
|
629
|
+
}
|
|
630
|
+
]
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
"version": "8.0.0",
|
|
634
|
+
"date": "2026-07-13",
|
|
635
|
+
"sections": [
|
|
636
|
+
{
|
|
637
|
+
"title": "๐ Features",
|
|
638
|
+
"audience": "all",
|
|
639
|
+
"items": [
|
|
640
|
+
{
|
|
641
|
+
"description": "Fail a package that declares types but ships none (#467)",
|
|
642
|
+
"body": "`nmr attw` now fails a package that claims to ship type declarations but ships none. Such a package used to pass, leaving every TypeScript consumer of it silently typed as `any`.\n\n A package that ships working declarations found only by sitting beside its JavaScript entry point escapes the check, since it declares nothing. Add a `types` entry to bring it under the check.",
|
|
643
|
+
"breaking": true,
|
|
644
|
+
"hash": "8ccea9d93cd63a7963a7a7516e20f8d54069bd7b"
|
|
645
|
+
}
|
|
646
|
+
]
|
|
647
|
+
}
|
|
648
|
+
]
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
"version": "7.0.0",
|
|
652
|
+
"date": "2026-07-01",
|
|
653
|
+
"sections": [
|
|
654
|
+
{
|
|
655
|
+
"title": "๐ Features",
|
|
656
|
+
"audience": "all",
|
|
657
|
+
"items": [
|
|
658
|
+
{
|
|
659
|
+
"description": "Rebuild nmr-compile on a unified tsc emit (#455)",
|
|
660
|
+
"body": "`nmr` now compiles a package's JavaScript and type declarations in one step, rewriting every import form โ static, re-export, dynamic `import()`, bare side-effect, and tsconfig `paths` aliases โ to runnable `.js` in both outputs. It now requires TypeScript 5.7 or newer as a peer dependency.",
|
|
661
|
+
"breaking": true,
|
|
662
|
+
"hash": "0e55822c88cad341f90b052b15fb9af41e7ae414"
|
|
663
|
+
}
|
|
664
|
+
]
|
|
665
|
+
}
|
|
666
|
+
]
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"version": "6.0.0",
|
|
670
|
+
"date": "2026-06-30",
|
|
671
|
+
"sections": [
|
|
672
|
+
{
|
|
673
|
+
"title": "๐ Features",
|
|
674
|
+
"audience": "all",
|
|
675
|
+
"items": [
|
|
676
|
+
{
|
|
677
|
+
"description": "Rewrite parseArgs on node:util with typed error and exit API (#428)",
|
|
678
|
+
"body": "`@williamthorsen/nmr-core` gains a typed error API for CLI parsing: `parseArgsOrExit` (parse, or print a usage error and exit) and `ParseError` replace the per-command boilerplate, so every bundled CLI reports a flag mistake the same way. Breaking: the `translateParseError` export is removed and `parseArgs` now throws `ParseError`.",
|
|
679
|
+
"breaking": true,
|
|
680
|
+
"hash": "5629bef8f645485b401a04f06ff9153ef5472282"
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"description": "Auto-activate integration test variant from config presence (#448)",
|
|
684
|
+
"body": "A package can now separate its integration tests from its standalone suite simply by including a `vitest.integration.config.ts` (alongside a `vitest.standalone.config.ts`). The `--int-test` flag that previously enabled this is removed โ that config-file pairing is now the only way to activate the separation. In such a package, `test` and `test:coverage` run only the standalone suite and skip integration tests, while a new `test:all` runs both suites together. The separation now holds even when tests run across every package at once, so a full-workspace `test` run still keeps integration tests out of the default suite. Packages that previously hand-copied these test scripts no longer need to.",
|
|
685
|
+
"breaking": true,
|
|
686
|
+
"hash": "ee320b913ef1d7255c78eef6fc9ab3b9e94dfd39"
|
|
687
|
+
}
|
|
688
|
+
]
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
"title": "โป๏ธ Refactoring",
|
|
692
|
+
"audience": "dev",
|
|
693
|
+
"items": [
|
|
694
|
+
{
|
|
695
|
+
"description": "Route all CLI error reporting through a single stderr helper (#437)",
|
|
696
|
+
"body": "Consolidates error reporting across the CLIs so every command reports errors the same way, and guards against the previous inconsistency returning. The error messages and exit codes users see are unchanged.",
|
|
697
|
+
"hash": "63e36b3f80bd8858e940362ea2914cb9a19fd821"
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
"description": "Normalize CLI error wording to the canonical Error: format (#439)",
|
|
701
|
+
"body": "Single-line error messages from the `nmr` and `release-kit` commands now print in one uniform shape, so the same class of failure reads the same way no matter which command produced it. Previously the wording varied, which made error output harder to scan and harder for scripts to match against. Richer output, such as multi-line validation reports and the stack trace from an unexpected crash, is unchanged.",
|
|
702
|
+
"hash": "2cbb46523fc7c3f0d8387405cafbd2cc90274b19"
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
"description": "Consolidate prepare parsing onto parseArgsOrExit (#441)",
|
|
706
|
+
"body": "Makes `release-kit`'s `prepare` command report invalid arguments the same way its other commands already do. The error message and exit code a user sees for a bad argument are unchanged.",
|
|
707
|
+
"hash": "f314f9c0fb8eacbe4f44a56951075a61604aaa0c"
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"description": "Unify prepare help text into a testable module (#443)",
|
|
711
|
+
"body": "Running `release-kit prepare --help` now lists the complete set of options. The `--force` flag and the restriction that `--set-version` and `--only` cannot be used when a project block is configured were previously missing from the help and are now shown there; the same `--set-version` restriction was added to the package README's `prepare` reference.",
|
|
712
|
+
"hash": "0da311a5516e92cfa18dc9dbd642efb5645847c8"
|
|
713
|
+
}
|
|
714
|
+
]
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
"title": "๐ Documentation",
|
|
718
|
+
"audience": "dev",
|
|
719
|
+
"items": [
|
|
720
|
+
{
|
|
721
|
+
"description": "Document single-package --force rejection in release-kit prepare (#450)",
|
|
722
|
+
"body": "The `release-kit prepare` `--force` documentation now correctly describes per-mode behavior: a bare `--force` is rejected in a single-package repo, where an explicit `--bump` level must be passed, while the \"defaults to patch\" shortcut applies only in monorepo and project mode.",
|
|
723
|
+
"hash": "8924e37b31f21be5cf0c19e393be2269ea2281f4"
|
|
724
|
+
}
|
|
725
|
+
]
|
|
726
|
+
}
|
|
727
|
+
]
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"version": "5.4.0",
|
|
731
|
+
"date": "2026-06-27",
|
|
732
|
+
"sections": [
|
|
733
|
+
{
|
|
734
|
+
"title": "๐ Features",
|
|
735
|
+
"audience": "all",
|
|
736
|
+
"items": [
|
|
737
|
+
{
|
|
738
|
+
"description": "Centralize the per-package build as an nmr-compile bin (#419)",
|
|
739
|
+
"body": "Introduces `nmr-compile`, a single command shipped with `@williamthorsen/nmr` that compiles each workspace package and now backs the default build. Consuming repos can delete their own per-package build script and pick up future build fixes just by upgrading nmr. Repeated builds with unchanged source now reliably skip recompiling instead of occasionally rebuilding for no reason, and import aliases now resolve correctly in symlinked checkouts.",
|
|
740
|
+
"hash": "cc20e3130087689c2fe8bf0e6de4b1349646296e"
|
|
741
|
+
}
|
|
742
|
+
]
|
|
743
|
+
}
|
|
744
|
+
]
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"version": "5.3.2",
|
|
748
|
+
"date": "2026-06-16",
|
|
749
|
+
"sections": [
|
|
750
|
+
{
|
|
751
|
+
"title": "โป๏ธ Refactoring",
|
|
752
|
+
"audience": "dev",
|
|
753
|
+
"items": [
|
|
754
|
+
{
|
|
755
|
+
"description": "Migrate from js-yaml to yaml (#410)",
|
|
756
|
+
"body": "Replaces the `js-yaml` dependency with the `yaml` package for all YAML reading and writing, with no change to behavior or generated output. The swap trims the dependency footprint by dropping a direct dependency and its companion type-definitions package, since `yaml` ships its own types.",
|
|
757
|
+
"hash": "fec315ab67e6d5c4b7eac3cb908c7c83a323f17c"
|
|
758
|
+
}
|
|
759
|
+
]
|
|
760
|
+
}
|
|
761
|
+
]
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
"version": "5.3.1",
|
|
765
|
+
"date": "2026-05-19",
|
|
766
|
+
"sections": [
|
|
767
|
+
{
|
|
768
|
+
"title": "๐ Bug fixes",
|
|
769
|
+
"audience": "all",
|
|
770
|
+
"items": [
|
|
771
|
+
{
|
|
772
|
+
"description": "Validate overrides against the full release history (#401)",
|
|
773
|
+
"body": "Fixes an issue where `release-kit overrides validate` reported overrides as stale when they targeted commits in past releases, even though `release-kit prepare` correctly matched them. The two commands now agree on which overrides are stale.",
|
|
774
|
+
"hash": "eee4dd1a7fd2d8268ec10183372398dd46fb58d1"
|
|
775
|
+
}
|
|
776
|
+
]
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"title": "โป๏ธ Refactoring",
|
|
780
|
+
"audience": "dev",
|
|
781
|
+
"items": [
|
|
782
|
+
{
|
|
783
|
+
"description": "Restructure tests and align core package directory with package name (#405)",
|
|
784
|
+
"body": "Tests in every package are now typechecked alongside the code they cover, so type breakage in tests fails the build instead of slipping through. The `core` package's workspace directory is renamed to match its package name, so `nmr -F nmr-core ...` and `pnpm --filter nmr-core ...` now resolve where they previously failed.",
|
|
785
|
+
"hash": "91006ec4281be902d66dfdef3917f603ee56b5c3"
|
|
786
|
+
}
|
|
787
|
+
]
|
|
788
|
+
}
|
|
789
|
+
]
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
"version": "5.3.0",
|
|
793
|
+
"date": "2026-05-10",
|
|
794
|
+
"sections": [
|
|
795
|
+
{
|
|
796
|
+
"title": "๐ Features",
|
|
797
|
+
"audience": "all",
|
|
798
|
+
"items": [
|
|
799
|
+
{
|
|
800
|
+
"description": "Enable editorial overrides for changelog entries (#387)",
|
|
801
|
+
"body": "Allows `release-kit` consumers to skip or correct historical changelog entries by means of an overrides file.",
|
|
802
|
+
"hash": "e9eb4392e69550985e1ec2beb0529a5a2b837165"
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
"description": "Decentralize changelog overrides to per-scope .meta/ files (#391)",
|
|
806
|
+
"body": "Adds support for workspace-scoped editorial-override files for `release-kit`-generated changelogs. A repo-root file applies overrides to every workspace's changelog; a workspace-tier file applies only to that workspace.",
|
|
807
|
+
"hash": "016df352eb8fee40665a958db136f5e5deeb6a42"
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
"description": "Add section markers and authenticated upstream fetch (#393)",
|
|
811
|
+
"body": "A new `markers` block in `work-types.json` describes the breaking-changes emoji and label, making them available for use by consumers.\n\n`work-types check` and `work-types sync` now authenticate when `GITHUB_TOKEN` is set, so they can reach private upstream repositories.",
|
|
812
|
+
"hash": "402e559e81902ac41b4206f866717524951b1cd1"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"description": "Validate changelog overrides from the command line (#395)",
|
|
816
|
+
"body": "Adds a `release-kit overrides validate` subcommand that audits every `.meta/changelog-overrides.json` file across the project root and per-workspace scopes in one pass. The command reports schema errors, ambiguous-prefix collisions, and stale-key warnings with tiered exit codes so CI can choose its own failure threshold. The same validation is also available via a library function exported by the package.",
|
|
817
|
+
"hash": "d9bdd62a3ef47fe06a07723269e9dabdd058d574"
|
|
818
|
+
}
|
|
819
|
+
]
|
|
820
|
+
},
|
|
821
|
+
{
|
|
822
|
+
"title": "๐ Bug fixes",
|
|
823
|
+
"audience": "all",
|
|
824
|
+
"items": [
|
|
825
|
+
{
|
|
826
|
+
"description": "Suppress git-cliff stale-version warnings on prepare (#373)",
|
|
827
|
+
"body": "Fixes an issue where `release-kit prepare` repeatedly printed git-cliff's \"A new version of git-cliff is available\" notice โ twice per release unit, so 2 ร N times for an N-package monorepo run โ while never updating the locally cached git-cliff binary. Each `prepare` run now revalidates the npm cache once before any cliff work, so the binary stays current with upstream releases and the notice no longer surfaces on every per-workspace invocation.",
|
|
828
|
+
"hash": "8660d3917a11c40f4d57bf64dca740b947b7fc69"
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
"description": "Use synthetic changelogs for forced empty-range releases (#376)",
|
|
832
|
+
"body": "Fixes an issue where `release-kit prepare` with `--force`, `--bump=X`, or `--set-version` would invoke git-cliff against units that had no commits since their last tag, surfacing confusing `WARN git_cliff > There is already a tag (...)` lines (twice per affected unit) and silently leaving `CHANGELOG.md` and `.meta/changelog.json` stale. Empty-range bumps now write a synthetic `Notes / Forced version bump.` entry to both files instead of invoking git-cliff. Applies to all three release stages: single-package, per-workspace, and project. Prior changelog history is preserved on every path.",
|
|
833
|
+
"hash": "cb118b2f06d52ceb375192352fa158d976dcbe4f"
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
"description": "Accept `breakingPolicies` field in config files (#394)",
|
|
837
|
+
"body": "Fixes an issue where setting `breakingPolicies` in `release-kit.config.ts` was rejected as an unknown field, leaving per-work-type breaking-policy configuration unreachable from the config file. Each entry accepts `'forbidden'`, `'optional'`, or `'required'`; an empty object opts out of enforcement.",
|
|
838
|
+
"hash": "4c663f8dec7800810f4c0350ef4b661978505acb"
|
|
839
|
+
}
|
|
840
|
+
]
|
|
841
|
+
}
|
|
842
|
+
]
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"version": "5.2.1",
|
|
846
|
+
"date": "2026-05-05",
|
|
847
|
+
"sections": [
|
|
848
|
+
{
|
|
849
|
+
"title": "๐ Bug fixes",
|
|
850
|
+
"audience": "all",
|
|
851
|
+
"items": [
|
|
852
|
+
{
|
|
853
|
+
"description": "Soft-skip tags with no changelog entry under --tags (#366)",
|
|
854
|
+
"body": "Fixes an issue where `release-kit create-github-release --tags <tag>` exited 1 โ failing the calling CI workflow โ when the requested tag had no changelog entry. Tooling-only releases (those whose changelog generator legitimately omits an entry) are now soft-skipped with an info-level summary, the same as releases skipped because their entry has no audience-relevant content. Typo protection is preserved: passing an unknown tag to `--tags` still exits 1.",
|
|
855
|
+
"hash": "a79c5b402215376e36aa006c12d8585452db3aa8"
|
|
856
|
+
}
|
|
857
|
+
]
|
|
858
|
+
}
|
|
859
|
+
]
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"version": "5.2.0",
|
|
863
|
+
"date": "2026-05-04",
|
|
864
|
+
"sections": [
|
|
865
|
+
{
|
|
866
|
+
"title": "๐ Features",
|
|
867
|
+
"audience": "all",
|
|
868
|
+
"items": [
|
|
869
|
+
{
|
|
870
|
+
"description": "Add emojis to changelog and release-note headings (#352)",
|
|
871
|
+
"body": "Adds emoji prefixes to the section headings rendered in `CHANGELOG.md` and release notes generated by `@williamthorsen/release-kit`. Each of the 13 default work types gets a single decorative emoji so its section is easier to spot when skimming a release: ๐ Bug fixes, ๐ Features, ๐ Documentation, โป๏ธ Refactoring, โก Performance, ๐ Security, ๐งช Tests, โ๏ธ Tooling, ๐ท CI, ๐ฆ Dependencies, ๐๏ธ Internal, ๐๏ธ Deprecated, and ๐ค Agentic support. Matching of `changelogJson.devOnlySections` is emoji-tolerant: existing consumer overrides written as bare names continue to work without modification.",
|
|
872
|
+
"hash": "07115bb4324bb605d5b527baf9dcf0b8a1dd9f4d"
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
"description": "Surface bang violations in release prepare reports (#359)",
|
|
876
|
+
"body": "Release-prepare flows now surface `!`-policy violations as warnings in the prepare report. Each workspace's and project's commit window is parsed against the default policy table โ `internal!` is rejected as contradictory, bare `drop:` is rejected for missing the required `!`, and so on โ and any violations appear under the workspace's section in the report alongside short hash, truncated subject, type, and surface (prefix or body). A new `breakingPolicies` config field lets consumers override individual entries or pass `{}` to disable enforcement entirely. Release-time enforcement remains tolerant: violations are warnings, never failures, so a single legacy commit cannot block a release.",
|
|
877
|
+
"hash": "6a6ed5558ac91c1e1e0bee5a9b5bb3d01111a8b0"
|
|
878
|
+
}
|
|
879
|
+
]
|
|
880
|
+
},
|
|
881
|
+
{
|
|
882
|
+
"title": "๐ Bug fixes",
|
|
883
|
+
"audience": "all",
|
|
884
|
+
"items": [
|
|
885
|
+
{
|
|
886
|
+
"description": "Restrict publish to publishable workspaces (#345)",
|
|
887
|
+
"body": "Fixes an issue where `release-kit publish` failed for workspaces marked `package.json#private: true`. The command now operates only on publishable workspaces โ those where `private` is absent or `false` โ and the rest of the release pipeline (`tag`, `create-github-release`, `prepare`, changelog) continues to handle private workspaces unchanged. This preserves the \"versioned but not published\" workflow: a private workspace can still be versioned, tagged, and published as a GitHub Release; only the registry-publish step is skipped. Without `--tags`, unpublishable tags are silently filtered (an empty result prints `Nothing to publish.` and exits 0). With `--tags` naming an unpublishable workspace, `release-kit publish` exits 1 with one error per offending tag, citing `package.json#private` and the workspace path.",
|
|
888
|
+
"hash": "aee2c1aa1822dedc7349b03506f3a63bb95d4175"
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
"description": "Skip tooling-only releases instead of failing (#347)",
|
|
892
|
+
"body": "Fixes an issue where `release-kit create-github-release --tags <tag>` exited 1 whenever the tag's changelog had no all-audience content. The reusable `create-github-release.reusable.yaml` workflow forwards `github.ref_name` into `--tags`, so tooling-only releases consistently produced failed workflow runs even though no failure occurred. The command now exits 1 only when a requested tag has no changelog entry; intentional skip reasons (`no-audience-content`, `empty-body`) are informational. A typoed tag still surfaces an error even when batched alongside successful tags, and the info summary reports the per-tag skip reason for diagnostic visibility.",
|
|
893
|
+
"hash": "5e674139fe8f884b7b03dff3f798c56ae089b03d"
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"description": "Establish canonical work-types SSOT and restore changelog section ordering (#358)",
|
|
897
|
+
"body": "Restores canonical section ordering in changelogs and release notes โ sections were appearing in unpredictable order after the previous release added emoji prefixes to section headers. Sections now follow a stable priority: public-facing types (Features, Fixes, Security, โฆ) first, then internal types, then process types. Release-note bullets for breaking changes carry a `๐จ **Breaking:**` prefix so they stand out at a glance. Documentation entries move out of public release notes โ they continue to appear in dev changelogs.\n\nCloses #355.",
|
|
898
|
+
"hash": "7f2c569a4840300e2cce8fe5aa7ab65fa2f9b5a1"
|
|
899
|
+
}
|
|
900
|
+
]
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"title": "โก Performance",
|
|
904
|
+
"audience": "all",
|
|
905
|
+
"items": [
|
|
906
|
+
{
|
|
907
|
+
"description": "Skip npx registry revalidation when running git-cliff (#361)",
|
|
908
|
+
"body": "Speeds up `release-kit prepare` by skipping the npm registry cache-revalidation HTTP request that ran on every `git-cliff` invocation. Per-invocation overhead drops from ~4.6 s to ~2.0 s; in a four-workspace monorepo this saves about 10 seconds per run. Also suppresses a transient stderr spinner that briefly appeared during package resolution and looked like a half-complete log message. Network fallback is preserved โ runs on machines with an empty npx cache still resolve `git-cliff` over the network.",
|
|
909
|
+
"hash": "74d2a70b2ef70311f356d104966997a4890d5d11"
|
|
910
|
+
}
|
|
911
|
+
]
|
|
912
|
+
},
|
|
913
|
+
{
|
|
914
|
+
"title": "โป๏ธ Refactoring",
|
|
915
|
+
"audience": "dev",
|
|
916
|
+
"items": [
|
|
917
|
+
{
|
|
918
|
+
"description": "Read package version at runtime via shared helper (#338)",
|
|
919
|
+
"body": "Fixes an issue where running `audit-deps`, `nmr`, or `release-kit` from the locally built `dist/esm/` after a `git pull` could report a stale version. Each CLI now reads its version directly from its `package.json` at startup, so version reads stay in sync with the installed source without requiring a fresh `pnpm install` or rebuild.",
|
|
920
|
+
"hash": "0fc98bb70d458d8eb5727d9567e3e20a8f2ded00"
|
|
921
|
+
}
|
|
922
|
+
]
|
|
923
|
+
}
|
|
924
|
+
]
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
"version": "5.1.0",
|
|
928
|
+
"date": "2026-04-30",
|
|
929
|
+
"sections": [
|
|
930
|
+
{
|
|
931
|
+
"title": "๐ Features",
|
|
932
|
+
"audience": "all",
|
|
933
|
+
"items": [
|
|
934
|
+
{
|
|
935
|
+
"description": "Add `project` block for project-level release stage (#317)",
|
|
936
|
+
"body": "Adds support for monorepos that ship a single combined deliverable to version, changelog, and release-note the project itself rather than only its constituent workspaces.",
|
|
937
|
+
"hash": "f647df54e78b9c78673874c7a5e197b87c562361"
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
"description": "Publish JSON Schema for `.meta/label-map.json` (#325)",
|
|
941
|
+
"body": "Adds a JSON Schema for `.meta/label-map.json` to release-kit, packaged at `packages/release-kit/schemas/label-map.json` and shipped to npm. Consumers reference it via the stable raw URL pattern `https://github.com/williamthorsen/node-monorepo-tools/raw/release-kit-v<version>/packages/release-kit/schemas/label-map.json` โ the same shape audit-deps already uses.",
|
|
942
|
+
"hash": "1c0fb5036cc222d15aaa547fb5a8b2bd74d8d34f"
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
"description": "Label prepare errors with the failing stage (#326)",
|
|
946
|
+
"body": "Adds stage attribution to errors thrown during `release-kit prepare`. Errors from per-workspace bumps and changelog generation, the project release stage, and the post-release format command now begin with a stage label that identifies the failing stage and (where relevant) the affected workspace.",
|
|
947
|
+
"hash": "feb1c81c912d40b4f1fd4b8037277636eee09e39"
|
|
948
|
+
},
|
|
949
|
+
{
|
|
950
|
+
"description": "Make `--force` and `--bump` orthogonal (#328)",
|
|
951
|
+
"body": "Decouples `--force` and `--bump` so each flag has a single responsibility, and unifies skip semantics across the per-workspace and project pipelines.",
|
|
952
|
+
"hash": "6927677759e464dcfcab778fdade4bf875a98fb4"
|
|
953
|
+
}
|
|
954
|
+
]
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"title": "๐ Bug fixes",
|
|
958
|
+
"audience": "all",
|
|
959
|
+
"items": [
|
|
960
|
+
{
|
|
961
|
+
"description": "Make publish's clean-tree safety gate reachable (#311)",
|
|
962
|
+
"body": "Fixes an issue where `release-kit publish` failed with pnpm's \"working tree is dirty\" error on a clean tree whenever `releaseNotes.shouldInjectIntoReadme: true` was configured. release-kit injects the release notes into the package README before invoking `pnpm publish`, so pnpm's own working-tree check fired on a tree release-kit had just dirtied โ even though the user's tree was clean at command start.",
|
|
963
|
+
"hash": "cbad5104a6f6af5fd664ae5bca526f1d00b9eaa9"
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
"description": "Make `--set-version` + `project` rejection explicit (#319)",
|
|
967
|
+
"body": "Improves the error users see when invoking `release-kit prepare --set-version` with a `project` block configured. The combination is still rejected โ as before โ but now produces a single, project-aware message (\"--set-version cannot be combined with a project releaseโฆ\") rather than the previous two-step chain (`--set-version requires --only`, then `--only cannot be combined with a project release` after the user added `--only`).",
|
|
968
|
+
"hash": "d6500855a6a7fce87b881bbeabc5493a41af8cc9"
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
"description": "Reject `--only` that would strand excluded dependents (#321)",
|
|
972
|
+
"body": "Fixes a silent footgun in `release-kit prepare --only=...`: an excluded internal dependent with its own changes would be left unreleased with no runtime signal, even though the targeted workspace it depends on was being released. The command now rejects such invocations up front, naming every excluded dependent whose changes would be stranded.",
|
|
973
|
+
"hash": "64118ef22097aa2fd4aa05980d15c432698498a3"
|
|
974
|
+
},
|
|
975
|
+
{
|
|
976
|
+
"description": "Order prerelease versions correctly in changelog sort (#334)",
|
|
977
|
+
"body": "Fixes a latent issue in `@williamthorsen/release-kit` where prerelease version tags (e.g., `1.2.3-alpha`, `1.2.3-rc.1`) were sorted as if their prerelease component were absent, causing them to appear in the wrong position relative to releases sharing the same base version. Changelog entries are now ordered per SemVer ยง11: prerelease versions precede the corresponding release (`1.2.3-alpha < 1.2.3`), build metadata is ignored for ordering, and entries that fail SemVer validation sort deterministically to the bottom of the list rather than collapsing into mid-list positions.",
|
|
978
|
+
"hash": "5c0df1d9ecdfcf6cf7154758310239c3f856f0e5"
|
|
979
|
+
}
|
|
980
|
+
]
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
"title": "โป๏ธ Refactoring",
|
|
984
|
+
"audience": "dev",
|
|
985
|
+
"items": [
|
|
986
|
+
{
|
|
987
|
+
"description": "Convert prepare results to discriminated unions (#330)",
|
|
988
|
+
"body": "Tightens `ProjectPrepareResult` and `WorkspacePrepareResult` from flat-with-optionals types into status-discriminated unions, so consumers that have already narrowed on `status === 'released'` no longer need to re-guard each release-only field with `!== undefined`. The four new sub-types (`ReleasedProjectResult`, `ReleasedWorkspaceResult`, `SkippedProjectResult`, `SkippedWorkspaceResult`) are exported from the package so callers can name the variants directly. Renderer output is byte-identical to before.",
|
|
989
|
+
"hash": "0b41e3ad9809ce8659f766cb7578287a5918336c"
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
"description": "Split changelog.json generation into layered helpers (#333)",
|
|
993
|
+
"body": "Reorganises `changelog.json` generation in `@williamthorsen/release-kit` so that producing entries (running git-cliff and shaping the output) is fully separated from persisting them (reading, merging, and writing the file). Removes the silent-discard parse-failure path at the project release stage by no longer reading the root `changelog.json` before overwriting it. Sharpens dry-run mode: `git-cliff` now runs even on dry-run so configuration mistakes surface in preview rather than only on a real release. Trims the public `index.ts` barrel from ~50 re-exports to the two type names actually consumed by external configs.",
|
|
994
|
+
"hash": "ce99578aeafbcb333d6e750ed7028e190f8f06bf"
|
|
995
|
+
}
|
|
996
|
+
]
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"title": "๐งช Tests",
|
|
1000
|
+
"audience": "dev",
|
|
1001
|
+
"items": [
|
|
1002
|
+
{
|
|
1003
|
+
"description": "Cover untested project-release and config branches (#329)",
|
|
1004
|
+
"body": "Closes four mechanical test-coverage gaps in the project-level release surfaces flagged in the test review of #308. New cases exercise the `(no previous release found)` rendering for released projects, the unparseable-commit warning block on the released-project rendering path, the `readFileSync` I/O failure path in `readRootPackageVersion`, and the contributing-paths invariant in `releasePrepareProject`. No production code changes โ these are pure-render and pure-derivation branches that previously had no test exercising them.",
|
|
1005
|
+
"hash": "d4473292bee1e0f33bc6d9c4698c84df21209f6d"
|
|
1006
|
+
}
|
|
1007
|
+
]
|
|
1008
|
+
},
|
|
1009
|
+
{
|
|
1010
|
+
"title": "๐ Documentation",
|
|
1011
|
+
"audience": "dev",
|
|
1012
|
+
"items": [
|
|
1013
|
+
{
|
|
1014
|
+
"description": "Document tag prefix collisions as general rule (#320)",
|
|
1015
|
+
"body": "Documents the strict-prefix tag-prefix collision rule as a general validation rule that applies to every release-kit consumer declaring more than one tag prefix: across active workspaces, declared legacy identities, retired packages, and the optional `project` block. Previously, the rule appeared only inside the `Project releases` validation list.",
|
|
1016
|
+
"hash": "01b7c6524a55e237b96463312d04a5193c05a494"
|
|
1017
|
+
}
|
|
1018
|
+
]
|
|
1019
|
+
}
|
|
1020
|
+
]
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
"version": "5.0.0",
|
|
1024
|
+
"date": "2026-04-23",
|
|
1025
|
+
"sections": [
|
|
1026
|
+
{
|
|
1027
|
+
"title": "๐ Features",
|
|
1028
|
+
"audience": "all",
|
|
1029
|
+
"items": [
|
|
1030
|
+
{
|
|
1031
|
+
"description": "Improve release-notes rendering quality (#261)",
|
|
1032
|
+
"body": "Improves the quality of release notes and CHANGELOG entries generated by release-kit. Release notes sections are now ordered by work-type priority (bug fixes first, then features, then internal), and each bullet now includes the commit body text for context that a one-line title cannot provide. Refactoring commits are now excluded from the release notes.",
|
|
1033
|
+
"hash": "f42b1bc44e48f600131c56d9e86a7a721807788f"
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"description": "Scaffold release-notes injection and check markers (#267)",
|
|
1037
|
+
"body": "Adds release-notes injection to the configs scaffolded by `release-kit init`, so newly-onboarded consumers get the feature without having to discover or toggle the flag. The release-kit readyup kit gains a check that warns when a consumer's README is missing the marker pair where injected notes should land โ without those markers, injection silently prepends to the top of the file, pushing the README's title below the notes.",
|
|
1038
|
+
"hash": "7e87590c9cb73d3feb48701af8df0e368b55a7d3"
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"description": "Split GitHub Release creation into its own workflow (#272)",
|
|
1042
|
+
"body": "Splits GitHub Release creation out of release-kit publish into a dedicated release-kit create-github-release CLI command and a matching reusable GitHub Actions workflow. Consumers that do not publish to npm can now create Releases independently, and the contents: write permission required to create a Release no longer leaks into the publish path.",
|
|
1043
|
+
"breaking": true,
|
|
1044
|
+
"hash": "20ff00c2308098a9dcd5dfefc99d56b7c7a7f752"
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
"description": "Replace --only with --tags on release-kit publish and push (#273)",
|
|
1048
|
+
"body": "`release-kit publish` and `release-kit push` now filter by full tag name via `--tags=<tag1,tag2>` instead of workspace directory name via `--only=<dir>`, matching the shape already used by `create-github-release`. Callers pass the tag they care about (e.g., `core-v1.3.0`) directly, with no translation step back to the publishing workspace's directory name. The reusable workflow gains an optional `tags:` input, and the internal `publish.yaml` caller now passes `tags: ${{ github.ref_name }}`, making the publish scope explicit rather than relying on the single-tag fetch default of `actions/checkout@v6`.",
|
|
1049
|
+
"breaking": true,
|
|
1050
|
+
"hash": "eb66c865fcaacb343e236fb1bee67fe25550e0ae"
|
|
1051
|
+
},
|
|
1052
|
+
{
|
|
1053
|
+
"description": "Apply pre-1.0 bump rule and add --set-version CLI escape hatch (#274)",
|
|
1054
|
+
"body": "Fixes an issue where a `feat!` commit on a pre-1.0 package would accidentally promote it to `1.0.0`. At pre-1.0 (`0.y.z`), a `'major'` release type now collapses to a minor bump. Adds a validated `--set-version <semver>` CLI flag on `release-kit prepare` that bypasses commit-derived bump logic and writes a specific version.",
|
|
1055
|
+
"hash": "121dabc7ca690372fea8a6c33a298d760cfe40f4"
|
|
1056
|
+
},
|
|
1057
|
+
{
|
|
1058
|
+
"description": "Scaffold audit.yaml workflow from audit-deps init (#277)",
|
|
1059
|
+
"body": "Adds GitHub Actions workflow scaffolding to `audit-deps init`. Running the command now writes both `.config/audit-deps.config.json` and `.github/workflows/audit.yaml` in the target repo, so that consumers no longer have to copy the canonical caller workflow by hand from this repo. The workflow content is shipped as a bundled template that ships to npm, and the repo's own workflow is kept byte-identical to that template via a consistency test โ the canonical workflow cannot silently drift from what is published.",
|
|
1060
|
+
"hash": "2b45c1047284e251fc48730104f971dcb88919d7"
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
"description": "Add migrate-tag-prefixes.sh migration tool (#282)",
|
|
1064
|
+
"body": "Adds a one-shot migration tool, `migrate-tag-prefixes.sh`, shipped inside the release-kit package. The tool creates additive annotated-tag aliases under release-kit's new unscoped-package-name prefix that point at the same commits as the previous directory-basename tags, bridging the gap so post-migration `getCommitsSinceTarget` calls can resolve prior releases.",
|
|
1065
|
+
"hash": "bd8f81f488db4e92aad16f59cb0ecc734bc22e8c"
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
"description": "Add legacyTagPrefixes config field (#289)",
|
|
1069
|
+
"body": "Replaces the v4 โ v5 tag-prefix migration mechanism (tag aliasing via `migrate-tag-prefixes.sh`) with a declarative `legacyTagPrefixes` config field. release-kit now searches for both legacy and modern prefixes when generating changelogs.\n\nAdds a companion `release-kit show-tag-prefixes` CLI command that renders a per-workspace table of derived and declared legacy prefixes, flags cross-workspace collisions, and surfaces undeclared candidate prefixes with a copy-pasteable config snippet. `release-kit prepare` gains a one-line hint pointing operators to `show-tag-prefixes` when a workspace has no baseline tag but the repo contains candidate-shaped tags.",
|
|
1070
|
+
"breaking": true,
|
|
1071
|
+
"hash": "c2425c53cfbe382ea91a653463ae41664d9e1c41"
|
|
1072
|
+
},
|
|
1073
|
+
{
|
|
1074
|
+
"description": "Replace `legacyTagPrefixes` with `legacyIdentities` (#297)",
|
|
1075
|
+
"body": "Replaces the per-workspace `legacyTagPrefixes: string[]` field with `legacyIdentities: LegacyIdentity[]`, a structured array of complete `(name, tagPrefix)` historical snapshots. Each legacy identity is now a self-consistent record of what a workspace used to be called and how its tags used to be prefixed, so a workspace that has been renamed (npm name change, tag-prefix change, or both) carries one entry per prior identity.",
|
|
1076
|
+
"breaking": true,
|
|
1077
|
+
"hash": "9b2a5ef01e6340f30f465c3c7bfc9e9c9db9f39e"
|
|
1078
|
+
},
|
|
1079
|
+
{
|
|
1080
|
+
"description": "Add `retiredPackages` repo-level config field (#299)",
|
|
1081
|
+
"body": "Adds support for declaring packages that once lived in this repo but have been extracted or removed, so their historical tag prefixes (e.g., `preflight-v*` from the extracted `readyup` project) no longer surface as \"Undeclared tag prefixes\" in `release-kit show-tag-prefixes`. Declared retired packages are acknowledged as real history but never consulted for baseline lookup or changelog attribution โ they complement `workspaces[].legacyIdentities`, which is used when a workspace still exists under a new identity.",
|
|
1082
|
+
"hash": "649974b1f72aff5a5ccba8204bc2a4cd6d39fcc3"
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
"description": "Add release-notes preview generator to `release-kit prepare` (#302)",
|
|
1086
|
+
"body": "Adds the ability to generate release notes when running `release-kit prepare`. The `--with-release-notes` option enables the generation of per-workspace preview files so authors can verify release-note injection before publishing. Injected release notes are also now prefixed with a `## Release notes โ v{version} ({date})` heading to add missing context to the README.",
|
|
1087
|
+
"hash": "988ab7ccaaad9eca598967342119ad5e4ba25e8e"
|
|
1088
|
+
}
|
|
1089
|
+
]
|
|
1090
|
+
},
|
|
1091
|
+
{
|
|
1092
|
+
"title": "๐ Bug fixes",
|
|
1093
|
+
"audience": "all",
|
|
1094
|
+
"items": [
|
|
1095
|
+
{
|
|
1096
|
+
"description": "Derive monorepo tag prefix from unscoped `package.json` name (#278)",
|
|
1097
|
+
"body": "Fixes a long-standing mismatch between a monorepo workspace's directory basename and its publishable package identity.",
|
|
1098
|
+
"hash": "1f73fbeb7b928f9211d2b34ef6db30e4e696266d"
|
|
1099
|
+
}
|
|
1100
|
+
]
|
|
1101
|
+
},
|
|
1102
|
+
{
|
|
1103
|
+
"title": "โป๏ธ Refactoring",
|
|
1104
|
+
"audience": "dev",
|
|
1105
|
+
"items": [
|
|
1106
|
+
{
|
|
1107
|
+
"description": "Rename `component` to `workspace` in config API and internals (#296)",
|
|
1108
|
+
"body": "Renames release-kit's per-workspace vocabulary from \"component\" to \"workspace\" throughout the public API, internal types, validation messages, CLI help, init templates, and documentation. Behavior is unchanged; only identifiers, error-message strings, scaffolded template text, and prose have been changed.",
|
|
1109
|
+
"breaking": true,
|
|
1110
|
+
"hash": "dfe0a70903997b85a2ebf57a612345be5232a2c6"
|
|
1111
|
+
},
|
|
1112
|
+
{
|
|
1113
|
+
"description": "Rename `node-monorepo-core` to `nmr-core` (#304)",
|
|
1114
|
+
"body": "Renames the shared-utilities package from `@williamthorsen/node-monorepo-core` to `@williamthorsen/nmr-core`, aligning it with the repository's `nmr-*` naming convention. The package's functionality and version are unchanged; only the published name differs.",
|
|
1115
|
+
"breaking": true,
|
|
1116
|
+
"hash": "085d4a57d1828bcd33933652aa47423989c090a9"
|
|
1117
|
+
}
|
|
1118
|
+
]
|
|
1119
|
+
}
|
|
1120
|
+
]
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
"version": "4.8.0",
|
|
1124
|
+
"date": "2026-04-17",
|
|
1125
|
+
"sections": [
|
|
1126
|
+
{
|
|
1127
|
+
"title": "๐ Features",
|
|
1128
|
+
"audience": "all",
|
|
1129
|
+
"items": [
|
|
1130
|
+
{
|
|
1131
|
+
"description": "Add `push` command for safe tag pushing (#243)",
|
|
1132
|
+
"body": "Adds a `release-kit push` command that safely pushes the release commit and each tag individually, ensuring GitHub Actions fires a separate workflow run per tag. The command performs a `1 + N` push sequence: one branch push followed by one `git push --no-follow-tags origin <tag>` per resolved tag. Supports `--dry-run` (preview without pushing), `--only` (filter tags by package name), and `--tags-only` (skip the branch push).",
|
|
1133
|
+
"hash": "5d92193d3a7bb37943cb232c25c6de8318b0be04"
|
|
1134
|
+
}
|
|
1135
|
+
]
|
|
1136
|
+
},
|
|
1137
|
+
{
|
|
1138
|
+
"title": "๐ Bug fixes",
|
|
1139
|
+
"audience": "all",
|
|
1140
|
+
"items": [
|
|
1141
|
+
{
|
|
1142
|
+
"description": "Replace broad catch with `existsSync` guard in `detectRepoType` (#229)",
|
|
1143
|
+
"body": "Fixes silent swallowing of unexpected filesystem errors in `detectRepoType`. Previously, errors like `EACCES` (permission denied) or `EMFILE` (too many open files) when reading `package.json` were caught and discarded, causing the function to silently return `'single-package'` instead of surfacing the problem.",
|
|
1144
|
+
"hash": "36bc346a5a54726c1ebf9abb0bf0b4f3041d0bbb"
|
|
1145
|
+
}
|
|
1146
|
+
]
|
|
1147
|
+
}
|
|
1148
|
+
]
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
"version": "4.7.0",
|
|
1152
|
+
"date": "2026-04-16",
|
|
1153
|
+
"sections": [
|
|
1154
|
+
{
|
|
1155
|
+
"title": "๐ Features",
|
|
1156
|
+
"audience": "all",
|
|
1157
|
+
"items": [
|
|
1158
|
+
{
|
|
1159
|
+
"description": "Support ## as synthetic ticket prefix in changelogs",
|
|
1160
|
+
"body": "Commits prefixed with `##` are now included in changelogs without requiring a ticket ID. This supports ad-hoc changes made during interactive sessions where creating a ticket and PR adds undesired overhead.",
|
|
1161
|
+
"hash": "88f4649a1d2a2d661b7be1273ca19b28893d0090"
|
|
1162
|
+
}
|
|
1163
|
+
]
|
|
1164
|
+
}
|
|
1165
|
+
]
|
|
1166
|
+
},
|
|
1167
|
+
{
|
|
1168
|
+
"version": "4.6.0",
|
|
1169
|
+
"date": "2026-04-15",
|
|
1170
|
+
"sections": [
|
|
1171
|
+
{
|
|
1172
|
+
"title": "๐ Features",
|
|
1173
|
+
"audience": "all",
|
|
1174
|
+
"items": [
|
|
1175
|
+
{
|
|
1176
|
+
"description": "Guard `prepare` against dirty working tree (#188)",
|
|
1177
|
+
"body": "Add a clean-working-tree check at the start of `prepareCommand` that exits with an error when `git status --porcelain` reports uncommitted changes. This prevents the double-bump problem where running `prepare` multiple times bumps the version each time from the already-bumped `package.json`.\n\nThe check can be bypassed with `--no-git-checks` (`-n`) and is automatically skipped during `--dry-run`.",
|
|
1178
|
+
"hash": "7a098258869a05c3e4ee8e63b5bdefe6b2e278ff"
|
|
1179
|
+
},
|
|
1180
|
+
{
|
|
1181
|
+
"description": "Add sync-labels drift detection to release-kit readyup kit (#190)",
|
|
1182
|
+
"body": "Adds readyup kit checks that detect when a consumer's sync-labels workflow or generated labels file has drifted from the current templates and presets. The `generate` command now embeds per-preset content hashes in the `labels.yaml` header, enabling hash-based staleness detection.",
|
|
1183
|
+
"hash": "b7a14d39a6a9a53e29fd14a3b230e8285f1e3d85"
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
"description": "Improve changelog formatting & add cliff config drift detection (#193)",
|
|
1187
|
+
"body": "Improves changelog generation: cleanly indented commit bodies, stripped type prefixes, and no unticketed noise. Adds hash-based drift detection so the rdy kit warns when a consumer's local cliff config falls behind the current template. Fixes a latent bug where git-cliff rejected the bundled `.template` file extension.",
|
|
1188
|
+
"hash": "af78852cb1db6112b6a1be7adb029f7f60f52b15"
|
|
1189
|
+
},
|
|
1190
|
+
{
|
|
1191
|
+
"description": "Generate release notes distinct from changelogs (#199)",
|
|
1192
|
+
"body": "Adds structured changelog generation with audience tagging to the `release-kit` package, enabling GitHub Release creation and npm README injection with user-facing release notes filtered from developer-only sections. The existing CHANGELOG.md pipeline is unchanged; a new `.meta/changelog.json` artifact is generated in parallel during `release-kit prepare`, and consumed during `release-kit publish` to create GitHub Releases and inject release notes into the published package's README.",
|
|
1193
|
+
"hash": "9bbcf4f434123404c2e6b014b858a953c1d62ed1"
|
|
1194
|
+
}
|
|
1195
|
+
]
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
"title": "โป๏ธ Refactoring",
|
|
1199
|
+
"audience": "dev",
|
|
1200
|
+
"items": [
|
|
1201
|
+
{
|
|
1202
|
+
"description": "Decouple GitHub Release creation and README injection from npm publish (#203)",
|
|
1203
|
+
"body": "Makes GitHub Release creation available as a standalone CLI command (`release-kit github-release`) and removes README injection logic from the publish function. Non-published projects (applications, websites, internal tools) can now create GitHub Releases independently after `release-kit prepare`, and the inject/restore lifecycle is managed by the command layer rather than buried inside business logic.",
|
|
1204
|
+
"hash": "5f09250c52a804023e12599f54a54c73628e482f"
|
|
1205
|
+
}
|
|
1206
|
+
]
|
|
1207
|
+
},
|
|
1208
|
+
{
|
|
1209
|
+
"title": "โ๏ธ Tooling",
|
|
1210
|
+
"audience": "dev",
|
|
1211
|
+
"items": [
|
|
1212
|
+
{
|
|
1213
|
+
"description": "Enable automated publication to npm (#187)",
|
|
1214
|
+
"body": "Prepares the repository for reliable tag-triggered npm publishing by adding missing package metadata, standardizing licensing, and introducing a readyup kit that validates publish readiness across all packages.",
|
|
1215
|
+
"hash": "89536cbcb5bb9aa30620bd262dce2c99f84ee0bc"
|
|
1216
|
+
}
|
|
1217
|
+
]
|
|
1218
|
+
}
|
|
1219
|
+
]
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
"version": "4.5.1",
|
|
1223
|
+
"date": "2026-04-10",
|
|
1224
|
+
"sections": [
|
|
1225
|
+
{
|
|
1226
|
+
"title": "๐ Bug fixes",
|
|
1227
|
+
"audience": "all",
|
|
1228
|
+
"items": [
|
|
1229
|
+
{
|
|
1230
|
+
"description": "Fix sync-labels init scaffolding output (#179)",
|
|
1231
|
+
"body": "Fixes three issues in `release-kit sync-labels init` scaffolding output that cause immediate errors for consumers: adds missing workflow permissions, corrects config template indentation from 2 to 4 spaces, and switches YAML quoting from double to single quotes.",
|
|
1232
|
+
"hash": "34526929b61a5dfce4630afaac0c69ede89dffc1"
|
|
1233
|
+
}
|
|
1234
|
+
]
|
|
1235
|
+
}
|
|
1236
|
+
]
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
"version": "4.4.0",
|
|
1240
|
+
"date": "2026-04-04",
|
|
1241
|
+
"sections": [
|
|
1242
|
+
{
|
|
1243
|
+
"title": "๐ Features",
|
|
1244
|
+
"audience": "all",
|
|
1245
|
+
"items": [
|
|
1246
|
+
{
|
|
1247
|
+
"description": "Add --version flag to nmr and release-kit (#143)",
|
|
1248
|
+
"body": "Adds `--version` / `-V` support to the `nmr` and `release-kit` CLIs, matching the existing `preflight` behavior. Moves the build-time version generation script to the shared `config/` directory so all three packages use a single `generateVersion.ts`.",
|
|
1249
|
+
"hash": "7257a8eb37a622e0065f105d09f41541b76c7d8e"
|
|
1250
|
+
},
|
|
1251
|
+
{
|
|
1252
|
+
"description": "Detect and report missing build output in bin wrappers (#152)",
|
|
1253
|
+
"body": "Adds try/catch with `ERR_MODULE_NOT_FOUND` detection to all six bin wrappers across `nmr`, `preflight`, and `release-kit`. Previously, five of the six wrappers used bare `import()` calls that produced cryptic unhandled rejections when `dist/` was missing, and `preflight`'s existing try/catch gave no actionable guidance.",
|
|
1254
|
+
"hash": "1e7bdbe21e66c61762286da695aeab7afa9ec115"
|
|
1255
|
+
}
|
|
1256
|
+
]
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
"title": "โป๏ธ Refactoring",
|
|
1260
|
+
"audience": "dev",
|
|
1261
|
+
"items": [
|
|
1262
|
+
{
|
|
1263
|
+
"description": "Extract deleteFileIfExists helper (#136)",
|
|
1264
|
+
"body": "Replaces the duplicate `deleteTagsFile` and `deleteSummaryFile` functions in `createTags.ts` with a single parameterized `deleteFileIfExists(path)` utility. The new helper lives in its own module and is exported from the package barrel for reuse.",
|
|
1265
|
+
"hash": "4f9e73f9b4ac1e54b898009ee3ea197a57911f18"
|
|
1266
|
+
},
|
|
1267
|
+
{
|
|
1268
|
+
"description": "Extract shared CLI argument-parsing utility into core (#151)",
|
|
1269
|
+
"body": "Add a schema-driven `parseArgs` function to `@williamthorsen/node-monorepo-core` that handles boolean flags, string flags (both `--flag=value` and `--flag value`), short aliases, positional collection, the `--` delimiter, and unknown-flag errors. Migrate all CLI argument-parsing sites in preflight (3 sites) and release-kit (5 sites) to use it. A companion `translateParseError` helper normalizes internal error messages for consistent user-facing output.",
|
|
1270
|
+
"hash": "70d3523db108c7c5ea9d29be57dc14371f52581f"
|
|
1271
|
+
}
|
|
1272
|
+
]
|
|
1273
|
+
},
|
|
1274
|
+
{
|
|
1275
|
+
"title": "๐ Documentation",
|
|
1276
|
+
"audience": "dev",
|
|
1277
|
+
"items": [
|
|
1278
|
+
{
|
|
1279
|
+
"description": "Refine README to match preflight documentation standard (#138)",
|
|
1280
|
+
"body": "Restructures the release-kit README to match the documentation standard established by the preflight README (#114). Reorders sections to follow the cross-package convention, converts CLI flag listings from code blocks to tables, adds representative `prepare --dry-run` output to the quick start, and condenses ~90 lines of inline workflow YAML into a summary with an inputs table and trigger examples. Fixes several accuracy gaps found by verifying documentation against source.",
|
|
1281
|
+
"hash": "41b1765642e322158ed03ae1b44d4378f1979f02"
|
|
1282
|
+
}
|
|
1283
|
+
]
|
|
1284
|
+
}
|
|
1285
|
+
]
|
|
1286
|
+
},
|
|
1287
|
+
{
|
|
1288
|
+
"version": "4.0.0",
|
|
1289
|
+
"date": "2026-04-02",
|
|
1290
|
+
"sections": [
|
|
1291
|
+
{
|
|
1292
|
+
"title": "๐ Features",
|
|
1293
|
+
"audience": "all",
|
|
1294
|
+
"items": [
|
|
1295
|
+
{
|
|
1296
|
+
"description": "Rename reusable workflows to .reusable.yaml convention (#129)",
|
|
1297
|
+
"body": "Renames all three reusable GitHub Actions workflow files from the inconsistent `-workflow.yaml`/bare `.yaml` convention to a uniform `.reusable.yaml` suffix. Updates all references across caller workflows, release-kit templates, tests, preflight collection, and documentation. Scaffolds the sync-labels caller workflow and labels file for this repo. Deletes superseded legacy files.",
|
|
1298
|
+
"hash": "0085c902e052e1d82973d7a25e10375eee51c9d2"
|
|
1299
|
+
}
|
|
1300
|
+
]
|
|
1301
|
+
}
|
|
1302
|
+
]
|
|
1303
|
+
},
|
|
1304
|
+
{
|
|
1305
|
+
"version": "3.0.0",
|
|
1306
|
+
"date": "2026-03-29",
|
|
1307
|
+
"sections": [
|
|
1308
|
+
{
|
|
1309
|
+
"title": "๐ Features",
|
|
1310
|
+
"audience": "all",
|
|
1311
|
+
"items": [
|
|
1312
|
+
{
|
|
1313
|
+
"description": "Support conventional-commit format in commit parsing (#85)",
|
|
1314
|
+
"body": "Adds support for the conventional commits format (`type(scope): description`) alongside the existing pipe-prefixed format (`scope|type: description`) in release-kit's commit parser. Renames `workspace` to `scope` throughout release-kit types, config, validation, and consumers.",
|
|
1315
|
+
"breaking": true,
|
|
1316
|
+
"hash": "a54dfa6a21b7d7ebe69ac83027c39a30916df1c7"
|
|
1317
|
+
},
|
|
1318
|
+
{
|
|
1319
|
+
"description": "Add commit command for local release flow (#89)",
|
|
1320
|
+
"body": "Adds a `release-kit commit` command that centralizes the release commit step between `prepare` and `tag`. The command reads tag names and a per-component commit summary from temporary files written by `prepare`, stages all changes, and creates a formatted commit. Two new utilities โ `stripScope` and `buildReleaseSummary` โ support building the commit body by stripping redundant scope indicators and formatting commits under their component headings. The CI workflow is simplified to use `release-kit commit` and `release-kit tag` instead of inline shell logic.",
|
|
1321
|
+
"hash": "75fe4b968b41dc30c8b5eaa99fee3f34d9f3616a"
|
|
1322
|
+
},
|
|
1323
|
+
{
|
|
1324
|
+
"description": "Add CI publish workflow with OIDC trusted publishing (#90)",
|
|
1325
|
+
"body": "Adds automated npm publication via a tag-push-triggered GitHub Actions workflow using OIDC trusted publishing. Extends `release-kit publish` with a `--provenance` flag and `release-kit init` with publish workflow scaffolding.",
|
|
1326
|
+
"hash": "bfa2b970d53124c49df6ae15648168680defb482"
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
"description": "Make --provenance opt-in to support private repos (#94)",
|
|
1330
|
+
"body": "Adds a `provenance` boolean input (default `false`) to the reusable `publish-workflow.yaml` so private repos using OIDC trusted publishing no longer fail at publish time. The `--provenance` flag is only passed to `release-kit publish` when the caller sets `provenance: true`.\n\nUpdates the scaffolded `publish.yaml` template to include `provenance: false` with an inline comment guiding public repos to opt in. Expand the `release-kit init` next-steps output with hints about the provenance setting and trusted publisher registration. Set `provenance: true` in this repo's own `publish.yaml` since it is public.",
|
|
1331
|
+
"hash": "833b08003e45b16ec16a2f07b28ac9fc5a7aeb7b"
|
|
1332
|
+
}
|
|
1333
|
+
]
|
|
1334
|
+
},
|
|
1335
|
+
{
|
|
1336
|
+
"title": "๐ Bug fixes",
|
|
1337
|
+
"audience": "all",
|
|
1338
|
+
"items": [
|
|
1339
|
+
{
|
|
1340
|
+
"description": "Pass tag pattern to git-cliff based on tagPrefix (#77)",
|
|
1341
|
+
"body": "Fixes the issue that git-cliff was processing the entire commit history on every run instead of only commits since the last release.\n\nConstructs the pattern from `tagPrefix` at invocation time (e.g., `release-kit-v` โ `release-kit-v[0-9].*`) and pass it via `--tag-pattern`, which overrides the config file default.",
|
|
1342
|
+
"hash": "724d1da533aad3cede69bb4eb0fc11682772e775"
|
|
1343
|
+
},
|
|
1344
|
+
{
|
|
1345
|
+
"description": "Propagate version bumps to workspace dependents (#80)",
|
|
1346
|
+
"body": "Restructures `releasePrepareMono` from a single-pass loop into a phased pipeline that automatically patch-bumps workspace dependents when a component is released. A reverse dependency graph is built from `workspace:` references in `dependencies` and `peerDependencies`, then BFS propagation walks upward from bumped components to their dependents. Propagated-only components receive synthetic changelog entries instead of git-cliff invocations.",
|
|
1347
|
+
"hash": "859ff90abfe50dfbd32d8548c38876c3ecf1884e"
|
|
1348
|
+
}
|
|
1349
|
+
]
|
|
1350
|
+
}
|
|
1351
|
+
]
|
|
1352
|
+
},
|
|
1353
|
+
{
|
|
1354
|
+
"version": "2.3.2",
|
|
1355
|
+
"date": "2026-03-28",
|
|
1356
|
+
"sections": [
|
|
1357
|
+
{
|
|
1358
|
+
"title": "๐ Bug fixes",
|
|
1359
|
+
"audience": "all",
|
|
1360
|
+
"items": [
|
|
1361
|
+
{
|
|
1362
|
+
"description": "Prevent unparseable commits from being silently dropped (#76)",
|
|
1363
|
+
"body": "Prevents `releasePrepareMono` and `releasePrepare` from silently skipping components whose commits have unparseable messages. Adds ticket-prefix stripping to `parseCommitMessage` (mirroring cliff.toml's `commit_preprocessors`), a patch-floor safety net when commits exist but none parse, and unparseable-commit reporting in `reportPrepare`.",
|
|
1364
|
+
"hash": "d737d37a2549a6e0e8cf25272ebfdce27521173d"
|
|
1365
|
+
}
|
|
1366
|
+
]
|
|
1367
|
+
}
|
|
1368
|
+
]
|
|
1369
|
+
},
|
|
1370
|
+
{
|
|
1371
|
+
"version": "2.3.0",
|
|
1372
|
+
"date": "2026-03-28",
|
|
1373
|
+
"sections": [
|
|
1374
|
+
{
|
|
1375
|
+
"title": "๐ Features",
|
|
1376
|
+
"audience": "all",
|
|
1377
|
+
"items": [
|
|
1378
|
+
{
|
|
1379
|
+
"description": "Add shared writeFileWithCheck utility and overwrite reporting (#66)",
|
|
1380
|
+
"body": "Extracts three duplicated `writeIfAbsent` implementations and two duplicated terminal helper sets into shared utilities in `@williamthorsen/node-monorepo-core`, then migrates all consumers (`release-kit init`, `preflight init`, `sync-labels`) to use them. All init commands now report which files were created, overwritten, skipped, or failed โ including when `--force` replaces existing files.",
|
|
1381
|
+
"hash": "209f5e581cad267cf8365d8284c4fcf161faf177"
|
|
1382
|
+
},
|
|
1383
|
+
{
|
|
1384
|
+
"description": "Separate tag-write errors from release preparation errors (#67)",
|
|
1385
|
+
"body": "When tag-file writing fails, the error message now reads \"Error writing release tags:\" instead of the misleading \"Error preparing release:\", which only appeared because both operations shared a single try/catch.\n\nRefactors `writeReleaseTags` to use the shared `writeFileWithCheck` utility from `@node-monorepo-tools/core` instead of raw `mkdirSync`/`writeFileSync`. The function now returns a structured `WriteResult` instead of throwing, and contains no `console` calls โ all presentation moves to `runAndReport`.",
|
|
1386
|
+
"hash": "04c835d7d67d7f1fe8643738dbeb76813ec08766"
|
|
1387
|
+
}
|
|
1388
|
+
]
|
|
1389
|
+
},
|
|
1390
|
+
{
|
|
1391
|
+
"title": "๐งช Tests",
|
|
1392
|
+
"audience": "dev",
|
|
1393
|
+
"items": [
|
|
1394
|
+
{
|
|
1395
|
+
"description": "Add eligibility check failure and short-circuit tests (#63)",
|
|
1396
|
+
"body": "Adds 4 unit tests to `initCommand.unit.test.ts` covering the remaining `checkEligibility` orchestration gaps: individual failure exit codes for `hasPackageJson` and `usesPnpm`, and short-circuit verification ensuring downstream checks are skipped when an earlier check fails.",
|
|
1397
|
+
"hash": "9e0257f6965815cd2b3baa9c15b0044ae73a2498"
|
|
1398
|
+
},
|
|
1399
|
+
{
|
|
1400
|
+
"description": "Add cliff.toml.template alignment test (#64)",
|
|
1401
|
+
"body": "Adds a unit test that enforces bidirectional alignment between `DEFAULT_WORK_TYPES` and the bundled `cliff.toml.template` commit parsers. The test parses the TOML template using `smol-toml`, then verifies that every canonical type name and alias is matched by a parser with the correct group heading, and that every parser group maps to a known work type header.",
|
|
1402
|
+
"hash": "e98ac307aa5dbb3a79fb98d84c259295907a0a1f"
|
|
1403
|
+
},
|
|
1404
|
+
{
|
|
1405
|
+
"description": "Add releasePrepare coverage for bumpOverride, tagPrefix, and dry-run tags (#65)",
|
|
1406
|
+
"body": "Adds three unit tests to `releasePrepare.unit.test.ts` covering previously untested code paths: the `bumpOverride` bypass of commit-based bump detection, custom `tagPrefix` propagation into tags, and tag computation in dry-run mode.",
|
|
1407
|
+
"hash": "dd647e60f06581373408577a600d3b8b7aa609d6"
|
|
1408
|
+
}
|
|
1409
|
+
]
|
|
1410
|
+
}
|
|
1411
|
+
]
|
|
1412
|
+
},
|
|
1413
|
+
{
|
|
1414
|
+
"version": "2.2.0",
|
|
1415
|
+
"date": "2026-03-27",
|
|
1416
|
+
"sections": [
|
|
1417
|
+
{
|
|
1418
|
+
"title": "๐ Features",
|
|
1419
|
+
"audience": "all",
|
|
1420
|
+
"items": [
|
|
1421
|
+
{
|
|
1422
|
+
"description": "Add sync-labels command (#33)",
|
|
1423
|
+
"body": "Add a `release-kit sync-labels` command group with three subcommands (`init`, `generate`, `sync`) for declarative GitHub label management in monorepos. Bundle a reusable GitHub Actions workflow and composable label presets with the release-kit package. Introduce a `findPackageRoot` utility to replace fragile hardcoded path resolutions across the codebase.",
|
|
1424
|
+
"hash": "4345a41b1f85570be483d31f5406f689be673241"
|
|
1425
|
+
},
|
|
1426
|
+
{
|
|
1427
|
+
"description": "Report up-to-date status for unchanged init files (#35)",
|
|
1428
|
+
"body": "`release-kit init` now compares existing file content against the default before reporting status. When an existing file is identical to the default (after normalizing trailing whitespace), it reports `โ
(up to date)` instead of the misleading `โ ๏ธ (already exists)`.",
|
|
1429
|
+
"hash": "0402702f055c021dd57819219403c8fbea693a8a"
|
|
1430
|
+
},
|
|
1431
|
+
{
|
|
1432
|
+
"description": "Auto-detect Prettier for CHANGELOG formatting (#36)",
|
|
1433
|
+
"body": "When `formatCommand` is not configured, release-kit now auto-detects whether the repo uses Prettier by checking for config files (`.prettierrc*`, `prettier.config.*`) or a `\"prettier\"` key in root `package.json`. If found, it defaults to `npx prettier --write` on generated files. If not found, formatting is skipped.",
|
|
1434
|
+
"hash": "97432b9d68068cfa2b40c9e9246afc92026c33ec"
|
|
1435
|
+
},
|
|
1436
|
+
{
|
|
1437
|
+
"description": "Add tag-creation command (#40)",
|
|
1438
|
+
"body": "Adds a `release-kit tag` CLI command that reads computed tag names from the `tmp/.release-tags` file produced by `prepare` and creates annotated git tags. The command supports `--dry-run` (preview without creating tags) and `--no-git-checks` (skip dirty working tree validation). The `createTags` function and its options type are exported for programmatic use.",
|
|
1439
|
+
"hash": "a8a7d4f5c9e80d8c7e3eb2b237881882470e2361"
|
|
1440
|
+
},
|
|
1441
|
+
{
|
|
1442
|
+
"description": "Add publish command (#42)",
|
|
1443
|
+
"body": "Adds a `release-kit publish` subcommand that derives packages to publish from git tags on HEAD and delegates to the repo's detected package manager. Also cleans up the `.release-tags` file after tag creation.",
|
|
1444
|
+
"hash": "c452a464d8ebf5eaf90d89a332a62f514e792378"
|
|
1445
|
+
},
|
|
1446
|
+
{
|
|
1447
|
+
"description": "Remove tagPrefix customization from component config (#49)",
|
|
1448
|
+
"body": "Removes the ability to customize `tagPrefix` per component, enforcing the deterministic `{dir}-v` convention universally. The internal `tagPrefix` property on `ComponentConfig` and `ReleaseConfig` is preserved โ only the override/customization entry points are removed. Existing configs that still include `tagPrefix` now receive a clear deprecation error.",
|
|
1449
|
+
"hash": "c19976ab40d412bef2315a9322dbf7606aebc90f"
|
|
1450
|
+
},
|
|
1451
|
+
{
|
|
1452
|
+
"description": "Add styled terminal output to prepare command (#55)",
|
|
1453
|
+
"body": "Adds ANSI formatting and emoji markers to the `release-kit prepare` command output. Progress chatter is dimmed, key results (version bumps, release tags, completion status) are highlighted with bold text and emoji, and monorepo components are separated by box-drawing section headers.",
|
|
1454
|
+
"hash": "fb18fe6f0acd94fe3a9b929c90139c75e5d9205b"
|
|
1455
|
+
},
|
|
1456
|
+
{
|
|
1457
|
+
"description": "Extract nmr CLI from core package (#61)",
|
|
1458
|
+
"body": "Extracts all nmr CLI code from `packages/core` into a new `packages/nmr` package (`@williamthorsen/nmr`). Core is reduced to an empty shared-library shell ready for cross-cutting utilities. All internal references are rewired and the full build/test pipeline passes.\n\nScopes: core, nmr",
|
|
1459
|
+
"hash": "d1abff0286f593a24444c0113d0286b4e70d6973"
|
|
1460
|
+
}
|
|
1461
|
+
]
|
|
1462
|
+
},
|
|
1463
|
+
{
|
|
1464
|
+
"title": "โป๏ธ Refactoring",
|
|
1465
|
+
"audience": "dev",
|
|
1466
|
+
"items": [
|
|
1467
|
+
{
|
|
1468
|
+
"description": "Replace dist bin targets with thin wrapper scripts (#48)",
|
|
1469
|
+
"body": "The `bin` entries in `packages/core` and `packages/release-kit` pointed directly into `dist/esm/`, causing `pnpm install` to emit \"Failed to create bin\" warnings in fresh worktrees where `dist/` does not yet exist. Each bin entry now points to a committed wrapper script in `bin/` that dynamically imports the real entry point. The `files` field in both packages includes `bin` so the wrappers are published.",
|
|
1470
|
+
"hash": "7cbc147a270d860fea7f3166032fb71a36b6522d"
|
|
1471
|
+
},
|
|
1472
|
+
{
|
|
1473
|
+
"description": "Separate presentation from logic in prepare workflow (#57)",
|
|
1474
|
+
"body": "Extracts all `console.info` calls from the prepare workflow's logic functions (`bumpAllVersions`, `generateChangelogs`, `releasePrepare`, `releasePrepareMono`) into a dedicated `reportPrepare` formatter. Logic functions now return structured result types (`BumpResult`, `ComponentPrepareResult`, `PrepareResult`). The legacy `runReleasePrepare` entry point is retired, with its utilities absorbed into `prepareCommand`.",
|
|
1475
|
+
"hash": "c929a7f618f0cae57af2028c27643b49cf931e14"
|
|
1476
|
+
}
|
|
1477
|
+
]
|
|
1478
|
+
},
|
|
1479
|
+
{
|
|
1480
|
+
"title": "๐งช Tests",
|
|
1481
|
+
"audience": "dev",
|
|
1482
|
+
"items": [
|
|
1483
|
+
{
|
|
1484
|
+
"description": "Cover multi-changelogPaths and error paths (#44)",
|
|
1485
|
+
"body": "Add three tests for previously untested code paths:\n\n- `releasePrepareMono`: component with two `changelogPaths` entries, asserting `git-cliff` is invoked once per path with the correct `--output` target.\n- `getCommitsSinceTarget`: `git describe` failure with a non-128 exit status propagates as a wrapped error instead of being swallowed.\n- `getCommitsSinceTarget`: `git log` failure is wrapped and re-thrown with the commit range in the message.\n\nAlso adds a `findAllCliffOutputPaths()` test helper that collects the `--output` arg from every `git-cliff` mock call.",
|
|
1486
|
+
"hash": "f5513c3b17acd8b53a81011ac63a937ef34abb07"
|
|
1487
|
+
}
|
|
1488
|
+
]
|
|
1489
|
+
},
|
|
1490
|
+
{
|
|
1491
|
+
"title": "โ๏ธ Tooling",
|
|
1492
|
+
"audience": "dev",
|
|
1493
|
+
"items": [
|
|
1494
|
+
{
|
|
1495
|
+
"description": "Adopt nmr to run monorepo and workspace scripts (#38)",
|
|
1496
|
+
"body": "Replaces the legacy workspace script runner and ~25 root `package.json` scripts with `nmr`, the monorepo's own context-aware script runner. Root scripts are reduced to 4 (`prepare`, `postinstall`, `ci`, `bootstrap`), packages use direct build commands for bootstrap, and release-kit declares tier-3 test overrides for its integration test configs.",
|
|
1497
|
+
"hash": "4a0b6fbc877c31daaf9472af3b9df948f6d19a12"
|
|
1498
|
+
}
|
|
1499
|
+
]
|
|
1500
|
+
}
|
|
1501
|
+
]
|
|
1502
|
+
},
|
|
1503
|
+
{
|
|
1504
|
+
"version": "2.1.0",
|
|
1505
|
+
"date": "2026-03-17",
|
|
1506
|
+
"sections": [
|
|
1507
|
+
{
|
|
1508
|
+
"title": "๐ Features",
|
|
1509
|
+
"audience": "all",
|
|
1510
|
+
"items": [
|
|
1511
|
+
{
|
|
1512
|
+
"description": "Migrate release-kit from toolbelt (#18)",
|
|
1513
|
+
"body": "Migrates the complete `@williamthorsen/release-kit` package (v1.0.1) from `williamthorsen/toolbelt` into `packages/release-kit/`, adds shebang preservation to the shared esbuild plugin for CLI binaries, and sets up dogfooding infrastructure so this monorepo uses release-kit for its own releases.",
|
|
1514
|
+
"hash": "da3a61fd335fb3e05ce20a0bffcdc1647d7aeb45"
|
|
1515
|
+
},
|
|
1516
|
+
{
|
|
1517
|
+
"description": "Slim down release workflow by removing unnecessary pnpm install (#21)",
|
|
1518
|
+
"body": "Make release-kit self-contained by invoking git-cliff via `npx --yes` instead of requiring it on PATH, and by appending modified file paths to the format command so lightweight formatters like `npx prettier --write` work without a full `pnpm install`. Update init templates, README, and consuming repo config/workflow to reference workflow v3.",
|
|
1519
|
+
"breaking": true,
|
|
1520
|
+
"hash": "996258dc895dd98704da253e51a5f0975ac5cf42"
|
|
1521
|
+
},
|
|
1522
|
+
{
|
|
1523
|
+
"description": "Add --force flag to release-kit prepare (#25)",
|
|
1524
|
+
"body": "Add a `--force` flag to `release-kit prepare` that bypasses the \"no commits since last tag\" check in monorepo mode, allowing version bumping and changelog generation to proceed even when no new commits are found since the last release tag. The flag requires `--bump` since there are no commits to infer bump type from. The local release workflow gains a `force` boolean input for future use.",
|
|
1525
|
+
"hash": "79940296abf5476e077585d7681265ecf01cf8e4"
|
|
1526
|
+
},
|
|
1527
|
+
{
|
|
1528
|
+
"description": "Move reusable release workflow into repo (#26)",
|
|
1529
|
+
"body": "Moves the reusable release workflow from `williamthorsen/.github` into this repo as `release-workflow.yaml`, stripping all pnpm-related steps since release-kit now runs git-cliff and prettier via `npx` internally. Updates this repo's caller workflow to use a relative path and update init templates to reference the new location. Establishes a naming convention (`{name}-workflow.yaml` for reusable, `{name}.yaml` for callers) and independent versioning strategy (`{name}-workflow-v{major}` tags), documented in `.github/workflows/README.md`.",
|
|
1530
|
+
"breaking": true,
|
|
1531
|
+
"hash": "f3416120cfe5bf0e7dbf51389e0c2647ccf41d30"
|
|
1532
|
+
},
|
|
1533
|
+
{
|
|
1534
|
+
"description": "Allow git-cliff to be used without config (#31)",
|
|
1535
|
+
"body": "Adds a `resolveCliffConfigPath()` function that searches for a git-cliff config in a 4-step cascade (explicit path โ `.config/git-cliff.toml` โ `cliff.toml` โ bundled `cliff.toml.template`), eliminating the requirement for consuming repos to maintain a cliff config copy. Restructures the `init` command to scaffold only the workflow file by default, with new `--with-config` and `--force` flags. Moves `.release-tags` from `/tmp/release-kit/` to project-local `tmp/` for predictable behavior in local runs.",
|
|
1536
|
+
"hash": "0cbd2605d6f5f53d1efe3dda8dd0f6e4376b499f"
|
|
1537
|
+
}
|
|
1538
|
+
]
|
|
1539
|
+
},
|
|
1540
|
+
{
|
|
1541
|
+
"title": "โป๏ธ Refactoring",
|
|
1542
|
+
"audience": "dev",
|
|
1543
|
+
"items": [
|
|
1544
|
+
{
|
|
1545
|
+
"description": "Clean up release-kit post-migration issues (#19)",
|
|
1546
|
+
"body": "Addresses five code quality issues and a test coverage gap identified during the release-kit migration (#5). Extracts a duplicated `isRecord` type guard into a shared module, eliminates a double-read in `bumpAllVersions`, improves error handling in `usesPnpm` by replacing a silent catch with a structured error boundary, removes an unreachable `'feature'` pattern from version defaults, and adds an integration test for scaffold template path resolution.",
|
|
1547
|
+
"hash": "aa50ca62ffb8fa0e7f727cf15794d4ba5ed2cf0e"
|
|
1548
|
+
}
|
|
1549
|
+
]
|
|
1550
|
+
}
|
|
1551
|
+
]
|
|
1552
|
+
},
|
|
1553
|
+
{
|
|
1554
|
+
"version": "1.0.1",
|
|
1555
|
+
"date": "2026-03-14",
|
|
1556
|
+
"sections": [
|
|
1557
|
+
{
|
|
1558
|
+
"title": "๐ Features",
|
|
1559
|
+
"audience": "all",
|
|
1560
|
+
"items": [
|
|
1561
|
+
{
|
|
1562
|
+
"description": "Migrate release-kit from toolbelt (#18)",
|
|
1563
|
+
"body": "Migrates the complete `@williamthorsen/release-kit` package (v1.0.1) from `williamthorsen/toolbelt` into `packages/release-kit/`, adds shebang preservation to the shared esbuild plugin for CLI binaries, and sets up dogfooding infrastructure so this monorepo uses release-kit for its own releases.",
|
|
1564
|
+
"hash": "da3a61fd335fb3e05ce20a0bffcdc1647d7aeb45"
|
|
1565
|
+
}
|
|
1566
|
+
]
|
|
1567
|
+
}
|
|
1568
|
+
]
|
|
1569
|
+
}
|
|
1570
|
+
]
|