@williamthorsen/release-kit 5.1.0 β†’ 5.2.1

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 (50) hide show
  1. package/CHANGELOG.md +113 -65
  2. package/README.md +147 -70
  3. package/cliff.toml.template +26 -17
  4. package/dist/esm/.cache +1 -1
  5. package/dist/esm/bin/release-kit.js +96 -3
  6. package/dist/esm/buildChangelogEntries.d.ts +1 -0
  7. package/dist/esm/buildChangelogEntries.js +39 -25
  8. package/dist/esm/checkWorkTypesDrift.d.ts +11 -0
  9. package/dist/esm/checkWorkTypesDrift.js +110 -0
  10. package/dist/esm/collectPolicyViolations.d.ts +6 -0
  11. package/dist/esm/collectPolicyViolations.js +15 -0
  12. package/dist/esm/createGithubRelease.d.ts +12 -2
  13. package/dist/esm/createGithubRelease.js +12 -8
  14. package/dist/esm/createGithubReleaseCommand.js +2 -7
  15. package/dist/esm/decideRelease.d.ts +3 -0
  16. package/dist/esm/decideRelease.js +19 -3
  17. package/dist/esm/defaults.d.ts +7 -0
  18. package/dist/esm/defaults.js +41 -20
  19. package/dist/esm/deriveWorkspaceConfig.js +3 -0
  20. package/dist/esm/determineBumpFromCommits.d.ts +6 -1
  21. package/dist/esm/determineBumpFromCommits.js +9 -3
  22. package/dist/esm/generateChangelogs.js +14 -29
  23. package/dist/esm/loadConfig.js +14 -22
  24. package/dist/esm/parseCommitMessage.d.ts +8 -2
  25. package/dist/esm/parseCommitMessage.js +32 -3
  26. package/dist/esm/publishCommand.js +21 -2
  27. package/dist/esm/releasePrepare.js +39 -15
  28. package/dist/esm/releasePrepareMono.js +26 -3
  29. package/dist/esm/releasePrepareProject.js +13 -1
  30. package/dist/esm/renderReleaseNotes.js +2 -1
  31. package/dist/esm/reportPrepare.js +18 -0
  32. package/dist/esm/resolveCommandTags.js +16 -6
  33. package/dist/esm/resolveReleaseTags.d.ts +8 -1
  34. package/dist/esm/resolveReleaseTags.js +11 -7
  35. package/dist/esm/runGitCliff.d.ts +2 -0
  36. package/dist/esm/runGitCliff.js +27 -0
  37. package/dist/esm/stripEmojiPrefix.d.ts +1 -0
  38. package/dist/esm/stripEmojiPrefix.js +7 -0
  39. package/dist/esm/syncWorkTypes.d.ts +10 -0
  40. package/dist/esm/syncWorkTypes.js +90 -0
  41. package/dist/esm/types.d.ts +15 -0
  42. package/dist/esm/work-types.json +127 -0
  43. package/dist/esm/work-types.schema.json +73 -0
  44. package/dist/esm/workTypesData.d.ts +14 -0
  45. package/dist/esm/workTypesData.js +59 -0
  46. package/dist/esm/workTypesUtils.d.ts +5 -0
  47. package/dist/esm/workTypesUtils.js +16 -0
  48. package/package.json +6 -3
  49. package/dist/esm/version.d.ts +0 -1
  50. package/dist/esm/version.js +0 -4
package/CHANGELOG.md CHANGED
@@ -2,33 +2,57 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [release-kit-v5.1.0] - 2026-04-30
5
+ ## [release-kit-v5.2.1] - 2026-05-05
6
6
 
7
- ### Bug fixes
7
+ ### πŸ› Bug fixes
8
8
 
9
- - Make publish's clean-tree safety gate reachable (#311)
9
+ - Soft-skip tags with no changelog entry under --tags (#366)
10
10
 
11
- 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.
11
+ 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.
12
12
 
13
- - Make `--set-version` + `project` rejection explicit (#319)
13
+ ## [release-kit-v5.2.0] - 2026-05-04
14
14
 
15
- 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`).
15
+ ### πŸŽ‰ Features
16
16
 
17
- - Reject `--only` that would strand excluded dependents (#321)
17
+ - Add emojis to changelog and release-note headings (#352)
18
18
 
19
- 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.
19
+ 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.
20
20
 
21
- - Order prerelease versions correctly in changelog sort (#334)
21
+ - Surface bang violations in release prepare reports (#359)
22
22
 
23
- 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.
23
+ 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.
24
24
 
25
- ### Documentation
25
+ ### πŸ› Bug fixes
26
26
 
27
- - Document tag prefix collisions as general rule (#320)
27
+ - Restrict publish to publishable workspaces (#345)
28
28
 
29
- 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.
29
+ 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.
30
+
31
+ - Skip tooling-only releases instead of failing (#347)
32
+
33
+ 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.
34
+
35
+ - Establish canonical work-types SSOT and restore changelog section ordering (#358)
36
+
37
+ 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.
38
+
39
+ Closes #355.
40
+
41
+ ### ⚑ Performance
42
+
43
+ - Skip npx registry revalidation when running git-cliff (#361)
44
+
45
+ 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.
46
+
47
+ ### ♻️ Refactoring
48
+
49
+ - Read package version at runtime via shared helper (#338)
50
+
51
+ 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.
52
+
53
+ ## [release-kit-v5.1.0] - 2026-04-30
30
54
 
31
- ### Features
55
+ ### πŸŽ‰ Features
32
56
 
33
57
  - Add `project` block for project-level release stage (#317)
34
58
 
@@ -46,7 +70,25 @@ All notable changes to this project will be documented in this file.
46
70
 
47
71
  Decouples `--force` and `--bump` so each flag has a single responsibility, and unifies skip semantics across the per-workspace and project pipelines.
48
72
 
49
- ### Refactoring
73
+ ### πŸ› Bug fixes
74
+
75
+ - Make publish's clean-tree safety gate reachable (#311)
76
+
77
+ 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.
78
+
79
+ - Make `--set-version` + `project` rejection explicit (#319)
80
+
81
+ 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`).
82
+
83
+ - Reject `--only` that would strand excluded dependents (#321)
84
+
85
+ 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.
86
+
87
+ - Order prerelease versions correctly in changelog sort (#334)
88
+
89
+ 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.
90
+
91
+ ### ♻️ Refactoring
50
92
 
51
93
  - Convert prepare results to discriminated unions (#330)
52
94
 
@@ -56,21 +98,21 @@ All notable changes to this project will be documented in this file.
56
98
 
57
99
  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.
58
100
 
59
- ### Tests
101
+ ### πŸ§ͺ Tests
60
102
 
61
103
  - Cover untested project-release and config branches (#329)
62
104
 
63
105
  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.
64
106
 
65
- ## [release-kit-v5.0.0] - 2026-04-23
107
+ ### πŸ“š Documentation
66
108
 
67
- ### Bug fixes
109
+ - Document tag prefix collisions as general rule (#320)
68
110
 
69
- - Derive monorepo tag prefix from unscoped `package.json` name (#278)
111
+ 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.
70
112
 
71
- Fixes a long-standing mismatch between a monorepo workspace's directory basename and its publishable package identity.
113
+ ## [release-kit-v5.0.0] - 2026-04-23
72
114
 
73
- ### Features
115
+ ### πŸŽ‰ Features
74
116
 
75
117
  - Improve release-notes rendering quality (#261)
76
118
 
@@ -118,7 +160,13 @@ All notable changes to this project will be documented in this file.
118
160
 
119
161
  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.
120
162
 
121
- ### Refactoring
163
+ ### πŸ› Bug fixes
164
+
165
+ - Derive monorepo tag prefix from unscoped `package.json` name (#278)
166
+
167
+ Fixes a long-standing mismatch between a monorepo workspace's directory basename and its publishable package identity.
168
+
169
+ ### ♻️ Refactoring
122
170
 
123
171
  - Rename `component` to `workspace` in config API and internals (#296)
124
172
 
@@ -130,21 +178,21 @@ All notable changes to this project will be documented in this file.
130
178
 
131
179
  ## [release-kit-v4.8.0] - 2026-04-17
132
180
 
133
- ### Bug fixes
181
+ ### πŸŽ‰ Features
134
182
 
135
- - Replace broad catch with `existsSync` guard in `detectRepoType` (#229)
183
+ - Add `push` command for safe tag pushing (#243)
136
184
 
137
- 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.
185
+ 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).
138
186
 
139
- ### Features
187
+ ### πŸ› Bug fixes
140
188
 
141
- - Add `push` command for safe tag pushing (#243)
189
+ - Replace broad catch with `existsSync` guard in `detectRepoType` (#229)
142
190
 
143
- 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).
191
+ 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.
144
192
 
145
193
  ## [release-kit-v4.7.0] - 2026-04-16
146
194
 
147
- ### Features
195
+ ### πŸŽ‰ Features
148
196
 
149
197
  - Support ## as synthetic ticket prefix in changelogs
150
198
 
@@ -152,7 +200,7 @@ All notable changes to this project will be documented in this file.
152
200
 
153
201
  ## [release-kit-v4.6.0] - 2026-04-15
154
202
 
155
- ### Features
203
+ ### πŸŽ‰ Features
156
204
 
157
205
  - Guard `prepare` against dirty working tree (#188)
158
206
 
@@ -172,13 +220,13 @@ All notable changes to this project will be documented in this file.
172
220
 
173
221
  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.
174
222
 
175
- ### Refactoring
223
+ ### ♻️ Refactoring
176
224
 
177
225
  - Decouple GitHub Release creation and README injection from npm publish (#203)
178
226
 
179
227
  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.
180
228
 
181
- ### Tooling
229
+ ### βš™οΈ Tooling
182
230
 
183
231
  - Enable automated publication to npm (#187)
184
232
 
@@ -186,7 +234,7 @@ All notable changes to this project will be documented in this file.
186
234
 
187
235
  ## [release-kit-v4.5.1] - 2026-04-10
188
236
 
189
- ### Bug fixes
237
+ ### πŸ› Bug fixes
190
238
 
191
239
  - Fix sync-labels init scaffolding output (#179)
192
240
 
@@ -194,13 +242,7 @@ All notable changes to this project will be documented in this file.
194
242
 
195
243
  ## [release-kit-v4.4.0] - 2026-04-04
196
244
 
197
- ### Documentation
198
-
199
- - Refine README to match preflight documentation standard (#138)
200
-
201
- 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.
202
-
203
- ### Features
245
+ ### πŸŽ‰ Features
204
246
 
205
247
  - Add --version flag to nmr and release-kit (#143)
206
248
 
@@ -210,7 +252,7 @@ All notable changes to this project will be documented in this file.
210
252
 
211
253
  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.
212
254
 
213
- ### Refactoring
255
+ ### ♻️ Refactoring
214
256
 
215
257
  - Extract deleteFileIfExists helper (#136)
216
258
 
@@ -220,9 +262,15 @@ All notable changes to this project will be documented in this file.
220
262
 
221
263
  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.
222
264
 
265
+ ### πŸ“š Documentation
266
+
267
+ - Refine README to match preflight documentation standard (#138)
268
+
269
+ 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.
270
+
223
271
  ## [release-kit-v4.0.0] - 2026-04-02
224
272
 
225
- ### Features
273
+ ### πŸŽ‰ Features
226
274
 
227
275
  - Rename reusable workflows to .reusable.yaml convention (#129)
228
276
 
@@ -230,19 +278,7 @@ All notable changes to this project will be documented in this file.
230
278
 
231
279
  ## [release-kit-v3.0.0] - 2026-03-29
232
280
 
233
- ### Bug fixes
234
-
235
- - Pass tag pattern to git-cliff based on tagPrefix (#77)
236
-
237
- Fixes the issue that git-cliff was processing the entire commit history on every run instead of only commits since the last release.
238
-
239
- Constructs 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.
240
-
241
- - Propagate version bumps to workspace dependents (#80)
242
-
243
- 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.
244
-
245
- ### Features
281
+ ### πŸŽ‰ Features
246
282
 
247
283
  - Support conventional-commit format in commit parsing (#85)
248
284
 
@@ -262,9 +298,21 @@ All notable changes to this project will be documented in this file.
262
298
 
263
299
  Updates 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.
264
300
 
301
+ ### πŸ› Bug fixes
302
+
303
+ - Pass tag pattern to git-cliff based on tagPrefix (#77)
304
+
305
+ Fixes the issue that git-cliff was processing the entire commit history on every run instead of only commits since the last release.
306
+
307
+ Constructs 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.
308
+
309
+ - Propagate version bumps to workspace dependents (#80)
310
+
311
+ 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.
312
+
265
313
  ## [release-kit-v2.3.2] - 2026-03-28
266
314
 
267
- ### Bug fixes
315
+ ### πŸ› Bug fixes
268
316
 
269
317
  - Prevent unparseable commits from being silently dropped (#76)
270
318
 
@@ -272,7 +320,7 @@ All notable changes to this project will be documented in this file.
272
320
 
273
321
  ## [release-kit-v2.3.0] - 2026-03-28
274
322
 
275
- ### Features
323
+ ### πŸŽ‰ Features
276
324
 
277
325
  - Add shared writeFileWithCheck utility and overwrite reporting (#66)
278
326
 
@@ -284,7 +332,7 @@ All notable changes to this project will be documented in this file.
284
332
 
285
333
  Refactors `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`.
286
334
 
287
- ### Tests
335
+ ### πŸ§ͺ Tests
288
336
 
289
337
  - Add eligibility check failure and short-circuit tests (#63)
290
338
 
@@ -300,7 +348,7 @@ All notable changes to this project will be documented in this file.
300
348
 
301
349
  ## [release-kit-v2.2.0] - 2026-03-27
302
350
 
303
- ### Features
351
+ ### πŸŽ‰ Features
304
352
 
305
353
  - Add sync-labels command (#33)
306
354
 
@@ -336,7 +384,7 @@ All notable changes to this project will be documented in this file.
336
384
 
337
385
  Scopes: core, nmr
338
386
 
339
- ### Refactoring
387
+ ### ♻️ Refactoring
340
388
 
341
389
  - Replace dist bin targets with thin wrapper scripts (#48)
342
390
 
@@ -346,7 +394,7 @@ All notable changes to this project will be documented in this file.
346
394
 
347
395
  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`.
348
396
 
349
- ### Tests
397
+ ### πŸ§ͺ Tests
350
398
 
351
399
  - Cover multi-changelogPaths and error paths (#44)
352
400
 
@@ -357,7 +405,7 @@ All notable changes to this project will be documented in this file.
357
405
 
358
406
  Also adds a `findAllCliffOutputPaths()` test helper that collects the `--output` arg from every `git-cliff` mock call.
359
407
 
360
- ### Tooling
408
+ ### βš™οΈ Tooling
361
409
 
362
410
  - Adopt nmr to run monorepo and workspace scripts (#38)
363
411
 
@@ -365,7 +413,7 @@ All notable changes to this project will be documented in this file.
365
413
 
366
414
  ## [release-kit-v2.1.0] - 2026-03-17
367
415
 
368
- ### Features
416
+ ### πŸŽ‰ Features
369
417
 
370
418
  - Slim down release workflow by removing unnecessary pnpm install (#21)
371
419
 
@@ -383,7 +431,7 @@ All notable changes to this project will be documented in this file.
383
431
 
384
432
  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.
385
433
 
386
- ### Refactoring
434
+ ### ♻️ Refactoring
387
435
 
388
436
  - Clean up release-kit post-migration issues (#19)
389
437
 
@@ -391,7 +439,7 @@ All notable changes to this project will be documented in this file.
391
439
 
392
440
  ## [release-kit-v1.0.1] - 2026-03-14
393
441
 
394
- ### Features
442
+ ### πŸŽ‰ Features
395
443
 
396
444
  - Migrate release-kit from toolbelt (#18)
397
445