@williamthorsen/release-kit 5.2.0 → 5.3.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.
Files changed (47) hide show
  1. package/CHANGELOG.md +69 -25
  2. package/README.md +238 -44
  3. package/cliff.toml.template +4 -39
  4. package/dist/esm/.cache +1 -1
  5. package/dist/esm/bin/release-kit.js +59 -0
  6. package/dist/esm/buildChangelogEntries.js +6 -0
  7. package/dist/esm/buildEmptyReleaseEntry.d.ts +2 -0
  8. package/dist/esm/buildEmptyReleaseEntry.js +16 -0
  9. package/dist/esm/changelogJsonFile.d.ts +2 -0
  10. package/dist/esm/changelogJsonFile.js +11 -1
  11. package/dist/esm/changelogJsonUtils.d.ts +2 -1
  12. package/dist/esm/changelogJsonUtils.js +9 -0
  13. package/dist/esm/changelogOverrides.d.ts +53 -0
  14. package/dist/esm/changelogOverrides.js +424 -0
  15. package/dist/esm/checkWorkTypesDrift.js +3 -2
  16. package/dist/esm/createGithubReleaseCommand.js +0 -9
  17. package/dist/esm/defaults.js +1 -1
  18. package/dist/esm/generateChangelogs.d.ts +0 -3
  19. package/dist/esm/generateChangelogs.js +1 -35
  20. package/dist/esm/index.d.ts +2 -0
  21. package/dist/esm/index.js +8 -0
  22. package/dist/esm/loadConfig.d.ts +1 -1
  23. package/dist/esm/releasePrepare.js +68 -11
  24. package/dist/esm/releasePrepareMono.js +103 -56
  25. package/dist/esm/releasePrepareProject.d.ts +4 -1
  26. package/dist/esm/releasePrepareProject.js +74 -18
  27. package/dist/esm/renderChangelogMarkdown.d.ts +12 -0
  28. package/dist/esm/renderChangelogMarkdown.js +32 -0
  29. package/dist/esm/renderReleaseNotes.js +6 -1
  30. package/dist/esm/resolveReleaseNotesConfig.js +3 -1
  31. package/dist/esm/runGitCliff.d.ts +1 -0
  32. package/dist/esm/runGitCliff.js +7 -0
  33. package/dist/esm/syncWorkTypes.js +3 -2
  34. package/dist/esm/types.d.ts +98 -31
  35. package/dist/esm/types.js +60 -0
  36. package/dist/esm/validateConfig.js +84 -345
  37. package/dist/esm/validateOverridesCommand.d.ts +13 -0
  38. package/dist/esm/validateOverridesCommand.js +119 -0
  39. package/dist/esm/work-types.json +23 -17
  40. package/dist/esm/work-types.schema.json +28 -1
  41. package/dist/esm/workTypesData.d.ts +8 -0
  42. package/dist/esm/workTypesData.js +20 -17
  43. package/dist/esm/workTypesUtils.d.ts +1 -0
  44. package/dist/esm/workTypesUtils.js +8 -0
  45. package/package.json +4 -3
  46. package/dist/esm/writeSyntheticChangelog.d.ts +0 -9
  47. package/dist/esm/writeSyntheticChangelog.js +0 -27
package/CHANGELOG.md CHANGED
@@ -2,7 +2,51 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [release-kit-v5.2.0] - 2026-05-04
5
+ ## 5.3.0 2026-05-10
6
+
7
+ ### 🎉 Features
8
+
9
+ - Enable editorial overrides for changelog entries (#387)
10
+
11
+ Allows `release-kit` consumers to skip or correct historical changelog entries by means of an overrides file.
12
+
13
+ - Decentralize changelog overrides to per-scope .meta/ files (#391)
14
+
15
+ 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.
16
+
17
+ - Add section markers and authenticated upstream fetch (#393)
18
+
19
+ A new `markers` block in `work-types.json` describes the breaking-changes emoji and label, making them available for use by consumers.
20
+
21
+ `work-types check` and `work-types sync` now authenticate when `GITHUB_TOKEN` is set, so they can reach private upstream repositories.
22
+
23
+ - Validate changelog overrides from the command line (#395)
24
+
25
+ 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.
26
+
27
+ ### 🐛 Bug fixes
28
+
29
+ - Suppress git-cliff stale-version warnings on prepare (#373)
30
+
31
+ 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.
32
+
33
+ - Use synthetic changelogs for forced empty-range releases (#376)
34
+
35
+ 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.
36
+
37
+ - Accept `breakingPolicies` field in config files (#394)
38
+
39
+ 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.
40
+
41
+ ## 5.2.1 — 2026-05-05
42
+
43
+ ### 🐛 Bug fixes
44
+
45
+ - Soft-skip tags with no changelog entry under --tags (#366)
46
+
47
+ 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.
48
+
49
+ ## 5.2.0 — 2026-05-04
6
50
 
7
51
  ### 🎉 Features
8
52
 
@@ -42,7 +86,7 @@ All notable changes to this project will be documented in this file.
42
86
 
43
87
  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.
44
88
 
45
- ## [release-kit-v5.1.0] - 2026-04-30
89
+ ## 5.1.0 2026-04-30
46
90
 
47
91
  ### 🎉 Features
48
92
 
@@ -102,7 +146,7 @@ All notable changes to this project will be documented in this file.
102
146
 
103
147
  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.
104
148
 
105
- ## [release-kit-v5.0.0] - 2026-04-23
149
+ ## 5.0.0 2026-04-23
106
150
 
107
151
  ### 🎉 Features
108
152
 
@@ -114,11 +158,11 @@ All notable changes to this project will be documented in this file.
114
158
 
115
159
  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.
116
160
 
117
- - Split GitHub Release creation into its own workflow (#272)
161
+ - 🚨 **Breaking:** Split GitHub Release creation into its own workflow (#272)
118
162
 
119
163
  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.
120
164
 
121
- - Replace --only with --tags on release-kit publish and push (#273)
165
+ - 🚨 **Breaking:** Replace --only with --tags on release-kit publish and push (#273)
122
166
 
123
167
  `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`.
124
168
 
@@ -134,13 +178,13 @@ All notable changes to this project will be documented in this file.
134
178
 
135
179
  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.
136
180
 
137
- - Add legacyTagPrefixes config field (#289)
181
+ - 🚨 **Breaking:** Add legacyTagPrefixes config field (#289)
138
182
 
139
183
  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.
140
184
 
141
185
  Adds 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.
142
186
 
143
- - Replace `legacyTagPrefixes` with `legacyIdentities` (#297)
187
+ - 🚨 **Breaking:** Replace `legacyTagPrefixes` with `legacyIdentities` (#297)
144
188
 
145
189
  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.
146
190
 
@@ -160,15 +204,15 @@ All notable changes to this project will be documented in this file.
160
204
 
161
205
  ### ♻️ Refactoring
162
206
 
163
- - Rename `component` to `workspace` in config API and internals (#296)
207
+ - 🚨 **Breaking:** Rename `component` to `workspace` in config API and internals (#296)
164
208
 
165
209
  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.
166
210
 
167
- - Rename `node-monorepo-core` to `nmr-core` (#304)
211
+ - 🚨 **Breaking:** Rename `node-monorepo-core` to `nmr-core` (#304)
168
212
 
169
213
  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.
170
214
 
171
- ## [release-kit-v4.8.0] - 2026-04-17
215
+ ## 4.8.0 2026-04-17
172
216
 
173
217
  ### 🎉 Features
174
218
 
@@ -182,7 +226,7 @@ All notable changes to this project will be documented in this file.
182
226
 
183
227
  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.
184
228
 
185
- ## [release-kit-v4.7.0] - 2026-04-16
229
+ ## 4.7.0 2026-04-16
186
230
 
187
231
  ### 🎉 Features
188
232
 
@@ -190,7 +234,7 @@ All notable changes to this project will be documented in this file.
190
234
 
191
235
  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.
192
236
 
193
- ## [release-kit-v4.6.0] - 2026-04-15
237
+ ## 4.6.0 2026-04-15
194
238
 
195
239
  ### 🎉 Features
196
240
 
@@ -224,7 +268,7 @@ All notable changes to this project will be documented in this file.
224
268
 
225
269
  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.
226
270
 
227
- ## [release-kit-v4.5.1] - 2026-04-10
271
+ ## 4.5.1 2026-04-10
228
272
 
229
273
  ### 🐛 Bug fixes
230
274
 
@@ -232,7 +276,7 @@ All notable changes to this project will be documented in this file.
232
276
 
233
277
  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.
234
278
 
235
- ## [release-kit-v4.4.0] - 2026-04-04
279
+ ## 4.4.0 2026-04-04
236
280
 
237
281
  ### 🎉 Features
238
282
 
@@ -260,7 +304,7 @@ All notable changes to this project will be documented in this file.
260
304
 
261
305
  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.
262
306
 
263
- ## [release-kit-v4.0.0] - 2026-04-02
307
+ ## 4.0.0 2026-04-02
264
308
 
265
309
  ### 🎉 Features
266
310
 
@@ -268,11 +312,11 @@ All notable changes to this project will be documented in this file.
268
312
 
269
313
  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.
270
314
 
271
- ## [release-kit-v3.0.0] - 2026-03-29
315
+ ## 3.0.0 2026-03-29
272
316
 
273
317
  ### 🎉 Features
274
318
 
275
- - Support conventional-commit format in commit parsing (#85)
319
+ - 🚨 **Breaking:** Support conventional-commit format in commit parsing (#85)
276
320
 
277
321
  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.
278
322
 
@@ -302,7 +346,7 @@ All notable changes to this project will be documented in this file.
302
346
 
303
347
  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.
304
348
 
305
- ## [release-kit-v2.3.2] - 2026-03-28
349
+ ## 2.3.2 2026-03-28
306
350
 
307
351
  ### 🐛 Bug fixes
308
352
 
@@ -310,7 +354,7 @@ All notable changes to this project will be documented in this file.
310
354
 
311
355
  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`.
312
356
 
313
- ## [release-kit-v2.3.0] - 2026-03-28
357
+ ## 2.3.0 2026-03-28
314
358
 
315
359
  ### 🎉 Features
316
360
 
@@ -338,7 +382,7 @@ All notable changes to this project will be documented in this file.
338
382
 
339
383
  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.
340
384
 
341
- ## [release-kit-v2.2.0] - 2026-03-27
385
+ ## 2.2.0 2026-03-27
342
386
 
343
387
  ### 🎉 Features
344
388
 
@@ -403,11 +447,11 @@ All notable changes to this project will be documented in this file.
403
447
 
404
448
  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.
405
449
 
406
- ## [release-kit-v2.1.0] - 2026-03-17
450
+ ## 2.1.0 2026-03-17
407
451
 
408
452
  ### 🎉 Features
409
453
 
410
- - Slim down release workflow by removing unnecessary pnpm install (#21)
454
+ - 🚨 **Breaking:** Slim down release workflow by removing unnecessary pnpm install (#21)
411
455
 
412
456
  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.
413
457
 
@@ -415,7 +459,7 @@ All notable changes to this project will be documented in this file.
415
459
 
416
460
  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.
417
461
 
418
- - Move reusable release workflow into repo (#26)
462
+ - 🚨 **Breaking:** Move reusable release workflow into repo (#26)
419
463
 
420
464
  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`.
421
465
 
@@ -429,7 +473,7 @@ All notable changes to this project will be documented in this file.
429
473
 
430
474
  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.
431
475
 
432
- ## [release-kit-v1.0.1] - 2026-03-14
476
+ ## 1.0.1 2026-03-14
433
477
 
434
478
  ### 🎉 Features
435
479
 
@@ -437,4 +481,4 @@ All notable changes to this project will be documented in this file.
437
481
 
438
482
  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.
439
483
 
440
- <!-- generated by git-cliff -->
484
+ <!-- Generated by release-kit. Do not edit this file. Use .meta/changelog-overrides.json to override entries. -->