@williamthorsen/release-kit 4.8.0 → 5.0.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 (82) hide show
  1. package/CHANGELOG.md +74 -4
  2. package/README.md +310 -40
  3. package/cliff.toml.template +2 -1
  4. package/dist/esm/.cache +1 -1
  5. package/dist/esm/bin/release-kit.js +44 -13
  6. package/dist/esm/buildDependencyGraph.d.ts +3 -3
  7. package/dist/esm/buildDependencyGraph.js +10 -10
  8. package/dist/esm/buildReleaseSummary.js +4 -4
  9. package/dist/esm/bumpAllVersions.d.ts +1 -0
  10. package/dist/esm/bumpAllVersions.js +16 -2
  11. package/dist/esm/bumpVersion.js +3 -0
  12. package/dist/esm/commitCommand.js +1 -1
  13. package/dist/esm/compareVersions.d.ts +1 -0
  14. package/dist/esm/compareVersions.js +27 -0
  15. package/dist/esm/createGithubRelease.d.ts +6 -2
  16. package/dist/esm/createGithubRelease.js +17 -17
  17. package/dist/esm/createGithubReleaseCommand.d.ts +1 -0
  18. package/dist/esm/createGithubReleaseCommand.js +41 -0
  19. package/dist/esm/defaults.js +5 -3
  20. package/dist/esm/deriveWorkspaceConfig.d.ts +2 -0
  21. package/dist/esm/deriveWorkspaceConfig.js +37 -0
  22. package/dist/esm/detectUndeclaredTagPrefixes.d.ts +7 -0
  23. package/dist/esm/detectUndeclaredTagPrefixes.js +46 -0
  24. package/dist/esm/generateChangelogJson.js +37 -1
  25. package/dist/esm/generateChangelogs.d.ts +1 -1
  26. package/dist/esm/generateChangelogs.js +14 -3
  27. package/dist/esm/getCommitsSinceTarget.d.ts +1 -1
  28. package/dist/esm/getCommitsSinceTarget.js +8 -4
  29. package/dist/esm/index.d.ts +7 -3
  30. package/dist/esm/index.js +10 -3
  31. package/dist/esm/init/initCommand.js +1 -1
  32. package/dist/esm/init/scaffold.d.ts +1 -1
  33. package/dist/esm/init/scaffold.js +8 -5
  34. package/dist/esm/init/templates.d.ts +1 -0
  35. package/dist/esm/init/templates.js +33 -3
  36. package/dist/esm/injectReleaseNotesIntoReadme.d.ts +6 -1
  37. package/dist/esm/injectReleaseNotesIntoReadme.js +20 -7
  38. package/dist/esm/loadConfig.d.ts +2 -1
  39. package/dist/esm/loadConfig.js +65 -12
  40. package/dist/esm/parseRequestedTags.d.ts +1 -0
  41. package/dist/esm/parseRequestedTags.js +10 -0
  42. package/dist/esm/prepareCommand.d.ts +3 -1
  43. package/dist/esm/prepareCommand.js +74 -26
  44. package/dist/esm/previewTagPrefixes.d.ts +30 -0
  45. package/dist/esm/previewTagPrefixes.js +120 -0
  46. package/dist/esm/propagateBumps.d.ts +1 -0
  47. package/dist/esm/propagateBumps.js +1 -1
  48. package/dist/esm/publishCommand.js +8 -13
  49. package/dist/esm/pushCommand.js +5 -4
  50. package/dist/esm/readCurrentVersion.d.ts +1 -0
  51. package/dist/esm/readCurrentVersion.js +21 -0
  52. package/dist/esm/releasePrepare.d.ts +2 -0
  53. package/dist/esm/releasePrepare.js +72 -30
  54. package/dist/esm/releasePrepareMono.js +235 -112
  55. package/dist/esm/renderReleaseNotes.d.ts +1 -0
  56. package/dist/esm/renderReleaseNotes.js +29 -2
  57. package/dist/esm/reportPrepare.js +100 -73
  58. package/dist/esm/resolveCliffConfigPath.js +1 -1
  59. package/dist/esm/resolveCommandTags.d.ts +1 -1
  60. package/dist/esm/resolveCommandTags.js +17 -13
  61. package/dist/esm/resolveReleaseNotesConfig.d.ts +8 -1
  62. package/dist/esm/resolveReleaseNotesConfig.js +17 -7
  63. package/dist/esm/resolveReleaseTags.d.ts +2 -1
  64. package/dist/esm/resolveReleaseTags.js +19 -14
  65. package/dist/esm/showTagPrefixesCommand.d.ts +1 -0
  66. package/dist/esm/showTagPrefixesCommand.js +84 -0
  67. package/dist/esm/sync-labels/initCommand.js +1 -1
  68. package/dist/esm/sync-labels/presets.js +1 -1
  69. package/dist/esm/tagCommand.js +1 -1
  70. package/dist/esm/types.d.ts +22 -7
  71. package/dist/esm/validateConfig.js +179 -36
  72. package/dist/esm/version.d.ts +1 -1
  73. package/dist/esm/version.js +1 -1
  74. package/dist/esm/writeReleaseNotesPreviews.d.ts +18 -0
  75. package/dist/esm/writeReleaseNotesPreviews.js +65 -0
  76. package/package.json +2 -2
  77. package/dist/esm/component.d.ts +0 -2
  78. package/dist/esm/component.js +0 -14
  79. package/dist/esm/findPackageRoot.d.ts +0 -1
  80. package/dist/esm/findPackageRoot.js +0 -17
  81. package/dist/esm/githubReleaseCommand.d.ts +0 -1
  82. package/dist/esm/githubReleaseCommand.js +0 -35
package/CHANGELOG.md CHANGED
@@ -2,6 +2,72 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [release-kit-v5.0.0] - 2026-04-23
6
+
7
+ ### Bug fixes
8
+
9
+ - Derive monorepo tag prefix from unscoped `package.json` name (#278)
10
+
11
+ Fixes a long-standing mismatch between a monorepo workspace's directory basename and its publishable package identity.
12
+
13
+ ### Features
14
+
15
+ - Improve release-notes rendering quality (#261)
16
+
17
+ 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.
18
+
19
+ - Scaffold release-notes injection and check markers (#267)
20
+
21
+ 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.
22
+
23
+ - Split GitHub Release creation into its own workflow (#272)
24
+
25
+ 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.
26
+
27
+ - Replace --only with --tags on release-kit publish and push (#273)
28
+
29
+ `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`.
30
+
31
+ - Apply pre-1.0 bump rule and add --set-version CLI escape hatch (#274)
32
+
33
+ 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.
34
+
35
+ - Scaffold audit.yaml workflow from audit-deps init (#277)
36
+
37
+ 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.
38
+
39
+ - Add migrate-tag-prefixes.sh migration tool (#282)
40
+
41
+ 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.
42
+
43
+ - Add legacyTagPrefixes config field (#289)
44
+
45
+ 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.
46
+
47
+ 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.
48
+
49
+ - Replace `legacyTagPrefixes` with `legacyIdentities` (#297)
50
+
51
+ 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.
52
+
53
+ - Add `retiredPackages` repo-level config field (#299)
54
+
55
+ 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.
56
+
57
+ - Add release-notes preview generator to `release-kit prepare` (#302)
58
+
59
+ 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.
60
+
61
+ ### Refactoring
62
+
63
+ - Rename `component` to `workspace` in config API and internals (#296)
64
+
65
+ 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.
66
+
67
+ - Rename `node-monorepo-core` to `nmr-core` (#304)
68
+
69
+ 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.
70
+
5
71
  ## [release-kit-v4.8.0] - 2026-04-17
6
72
 
7
73
  ### Bug fixes
@@ -241,10 +307,6 @@ All notable changes to this project will be documented in this file.
241
307
 
242
308
  ### Features
243
309
 
244
- - Migrate release-kit from toolbelt (#18)
245
-
246
- 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.
247
-
248
310
  - Slim down release workflow by removing unnecessary pnpm install (#21)
249
311
 
250
312
  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.
@@ -267,4 +329,12 @@ All notable changes to this project will be documented in this file.
267
329
 
268
330
  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.
269
331
 
332
+ ## [release-kit-v1.0.1] - 2026-03-14
333
+
334
+ ### Features
335
+
336
+ - Migrate release-kit from toolbelt (#18)
337
+
338
+ 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.
339
+
270
340
  <!-- generated by git-cliff -->
package/README.md CHANGED
@@ -4,6 +4,64 @@ Version-bumping and changelog-generation toolkit for release workflows.
4
4
 
5
5
  Provides a self-contained CLI that auto-discovers workspaces from `pnpm-workspace.yaml`, parses conventional commits, determines version bumps, updates `package.json` files, and generates changelogs with `git-cliff`.
6
6
 
7
+ <!-- section:release-notes -->
8
+ ## Release notes — v5.0.0 (2026-04-23)
9
+
10
+ ### Bug fixes
11
+
12
+ - Derive monorepo tag prefix from unscoped `package.json` name (#278)
13
+
14
+ Fixes a long-standing mismatch between a monorepo workspace's directory basename and its publishable package identity.
15
+
16
+ ### Features
17
+
18
+ - Improve release-notes rendering quality (#261)
19
+
20
+ 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.
21
+
22
+ - Scaffold release-notes injection and check markers (#267)
23
+
24
+ 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.
25
+
26
+ - Split GitHub Release creation into its own workflow (#272)
27
+
28
+ 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.
29
+
30
+ - Replace --only with --tags on release-kit publish and push (#273)
31
+
32
+ `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`.
33
+
34
+ - Apply pre-1.0 bump rule and add --set-version CLI escape hatch (#274)
35
+
36
+ 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.
37
+
38
+ - Scaffold audit.yaml workflow from audit-deps init (#277)
39
+
40
+ 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.
41
+
42
+ - Add migrate-tag-prefixes.sh migration tool (#282)
43
+
44
+ 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.
45
+
46
+ - Add legacyTagPrefixes config field (#289)
47
+
48
+ 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.
49
+
50
+ 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.
51
+
52
+ - Replace `legacyTagPrefixes` with `legacyIdentities` (#297)
53
+
54
+ 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.
55
+
56
+ - Add `retiredPackages` repo-level config field (#299)
57
+
58
+ 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.
59
+
60
+ - Add release-notes preview generator to `release-kit prepare` (#302)
61
+
62
+ 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.
63
+ <!-- /section:release-notes -->
64
+
7
65
  ## Installation
8
66
 
9
67
  ```bash
@@ -54,9 +112,9 @@ That's it for most repos. The CLI auto-discovers workspaces and applies sensible
54
112
 
55
113
  ## How it works
56
114
 
57
- 1. **Workspace discovery**: reads `pnpm-workspace.yaml` and resolves its `packages` globs to find workspace directories. Each directory containing a `package.json` becomes a component. If no workspace file is found, the repo is treated as a single-package project.
115
+ 1. **Workspace discovery**: reads `pnpm-workspace.yaml` and resolves its `packages` globs to find workspace directories. Each directory containing a `package.json` becomes a workspace. If no workspace file is found, the repo is treated as a single-package project.
58
116
  2. **Config loading**: loads `.config/release-kit.config.ts` (if present) via [jiti](https://github.com/unjs/jiti) and merges it with discovered defaults.
59
- 3. **Commit analysis**: for each component, finds commits since the last version tag, parses them for type and scope, and determines the appropriate version bump.
117
+ 3. **Commit analysis**: for each workspace, finds commits since the last version tag, parses them for type and scope, and determines the appropriate version bump.
60
118
  4. **Version bump + changelog**: bumps `package.json` versions and generates changelogs via `git-cliff`.
61
119
  5. **Release tags file**: writes computed tags to `tmp/.release-tags` for the release workflow to read when tagging and pushing.
62
120
 
@@ -73,7 +131,7 @@ scope|type!: description # scoped breaking change
73
131
  type(scope)!: description # conventional scoped breaking change
74
132
  ```
75
133
 
76
- The `scope|type:` format scopes a commit to a specific component in a monorepo. Use `scopeAliases` in your config to map shorthand names to canonical scope names.
134
+ The `scope|type:` format scopes a commit to a specific workspace in a monorepo. Use `scopeAliases` in your config to map shorthand names to canonical scope names.
77
135
 
78
136
  ## Configuration
79
137
 
@@ -85,8 +143,8 @@ Configuration is optional. The CLI works out of the box by auto-discovering work
85
143
  import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
86
144
 
87
145
  const config: ReleaseKitConfig = {
88
- // Exclude a component from release processing
89
- components: [{ dir: 'internal-tools', shouldExclude: true }],
146
+ // Exclude a workspace from release processing
147
+ workspaces: [{ dir: 'internal-tools', shouldExclude: true }],
90
148
 
91
149
  // Run a formatter after changelog generation (modified file paths are appended as arguments)
92
150
  formatCommand: 'npx prettier --write',
@@ -108,23 +166,66 @@ The config file supports both `export default config` and `export const config =
108
166
  | Field | Type | Description |
109
167
  | ----------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
110
168
  | `cliffConfigPath` | `string` | Explicit path to cliff config. If omitted, resolved automatically: `.config/git-cliff.toml` → `cliff.toml` → bundled template |
111
- | `components` | `ComponentOverride[]` | Override or exclude discovered components (matched by `dir`) |
169
+ | `workspaces` | `WorkspaceOverride[]` | Override or exclude discovered workspaces (matched by `dir`) |
112
170
  | `formatCommand` | `string` | Shell command to run after changelog generation; modified file paths are appended as arguments |
113
171
  | `versionPatterns` | `VersionPatterns` | Rules for which commit types trigger major/minor bumps |
114
172
  | `scopeAliases` | `Record<string, string>` | Maps shorthand scope names to canonical names in commits |
115
173
  | `workTypes` | `Record<string, WorkTypeConfig>` | Work type definitions, merged with defaults by key |
174
+ | `retiredPackages` | `RetiredPackage[]` | Packages that once lived in this repo but have been extracted or removed; suppresses undeclared-tag-prefix warnings |
116
175
 
117
176
  All fields are optional.
118
177
 
119
- ### `ComponentOverride`
178
+ ### `WorkspaceOverride`
120
179
 
121
180
  ```typescript
122
- interface ComponentOverride {
181
+ interface WorkspaceOverride {
123
182
  dir: string; // Package directory name (e.g., 'arrays')
124
183
  shouldExclude?: boolean; // If true, exclude from release processing
184
+ legacyIdentities?: LegacyIdentity[]; // Prior `(name, tagPrefix)` identities for this workspace
185
+ }
186
+
187
+ interface LegacyIdentity {
188
+ name: string; // Full scoped npm name at the time (e.g., '@scope/pkg')
189
+ tagPrefix: string; // Tag prefix under which historical tags were published (e.g., 'core-v')
125
190
  }
126
191
  ```
127
192
 
193
+ `legacyIdentities` captures prior identities of a workspace as complete `(name, tagPrefix)` snapshots. The union of the current `tagPrefix` and each identity's `tagPrefix` is consulted when release-kit searches for the most recent baseline tag and when generating changelogs. Use it when a workspace's historical tags were published under a different npm name, a different tag prefix, or both — typically across a package rename. Both fields are required per identity: each entry must be a complete historical snapshot that stays valid regardless of subsequent renames. Run `release-kit show-tag-prefixes` to detect undeclared candidates and produce a paste-ready config snippet. Listing the current identity (full `(name, tagPrefix)` match) is rejected as a no-op duplicate; an identity whose `tagPrefix` matches the current but whose `name` differs is valid and documents a prior rename that reused the same tag shape. If the workspace no longer exists in this repo at all (the package was extracted or removed), use [`retiredPackages`](#retiredpackage) instead.
194
+
195
+ ### `RetiredPackage`
196
+
197
+ ```typescript
198
+ interface RetiredPackage {
199
+ name: string; // Final scoped npm name while the package lived in this repo
200
+ tagPrefix: string; // Tag prefix under which the package's historical tags were published
201
+ successor?: string; // Optional successor package name (e.g., 'readyup')
202
+ }
203
+ ```
204
+
205
+ `retiredPackages` is the repo-level complement to `legacyIdentities`. Use `legacyIdentities` when the workspace still exists in this repo under a new identity; use `retiredPackages` when no workspace for this package exists in this repo anymore — the package was extracted to another repo or removed outright. Retired entries are inert: release-kit never consults them for baseline lookup or changelog attribution. Their declared `tagPrefix` values are recognized as historical, so `show-tag-prefixes` stops flagging them under "Undeclared tag prefixes."
206
+
207
+ Worked example — `preflight` was extracted from this monorepo and continues as the standalone `readyup` project. Its tags stay in this repo as historical anchors:
208
+
209
+ ```typescript
210
+ import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
211
+
212
+ const config: ReleaseKitConfig = {
213
+ retiredPackages: [{ name: '@scope/preflight', tagPrefix: 'preflight-v', successor: 'readyup' }],
214
+ };
215
+
216
+ export default config;
217
+ ```
218
+
219
+ Validation rules:
220
+
221
+ - `name` and `tagPrefix` are required per entry and must be non-empty strings.
222
+ - `successor` is optional; if present, it must be a non-empty string.
223
+ - Full-tuple `(name, tagPrefix)` duplicates within `retiredPackages` are rejected.
224
+ - Two entries sharing the same `tagPrefix` but different `name`s are accepted — this documents a package renamed within the repo before being retired.
225
+ - A `tagPrefix` that collides with an active workspace's derived prefix or any declared `workspaces[].legacyIdentities[].tagPrefix` is rejected. A retired prefix cannot also be current or legacy.
226
+
227
+ `show-tag-prefixes` currently does not render a dedicated "Retired packages" section (deferred). Declaring a retired entry is verifiable by confirming that its `tagPrefix` stops appearing under "Undeclared tag prefixes" in the `show-tag-prefixes` output.
228
+
128
229
  ### `VersionPatterns`
129
230
 
130
231
  Defines which commit types trigger major or minor bumps. Any recognized type not listed defaults to a patch bump.
@@ -140,21 +241,29 @@ Default: `{ major: ['!'], minor: ['feat'] }`
140
241
 
141
242
  ### Default work types
142
243
 
143
- | Key | Header | Aliases |
144
- | ---------- | ------------- | --------- |
145
- | `fix` | Bug fixes | `bugfix` |
146
- | `feat` | Features | `feature` |
147
- | `internal` | Internal | |
148
- | `refactor` | Refactoring | |
149
- | `tests` | Tests | `test` |
150
- | `tooling` | Tooling | |
151
- | `ci` | CI | |
152
- | `deps` | Dependencies | `dep` |
153
- | `docs` | Documentation | `doc` |
154
- | `fmt` | Formatting | |
244
+ | Key | Header | Aliases |
245
+ | ----------- | --------------- | ------------- |
246
+ | `fix` | Bug fixes | `bugfix` |
247
+ | `deprecate` | Deprecated | |
248
+ | `feat` | Features | `feature` |
249
+ | `internal` | Internal | |
250
+ | `perf` | Performance | `performance` |
251
+ | `refactor` | Refactoring | |
252
+ | `sec` | Security | `security` |
253
+ | `tests` | Tests | `test` |
254
+ | `tooling` | Tooling | |
255
+ | `ci` | CI | |
256
+ | `deps` | Dependencies | `dep` |
257
+ | `docs` | Documentation | `doc` |
258
+ | `ai` | Agentic support | |
259
+ | `fmt` | (skipped) | |
155
260
 
156
261
  Work types from your config are merged with these defaults by key — your entries override or extend, they don't replace the full set.
157
262
 
263
+ `fmt:` commits are recognized for version-bump determination (they contribute to a patch bump) but are skipped by the bundled `cliff.toml.template`, so they do not appear in `CHANGELOG.md` or release notes.
264
+
265
+ Release-notes sections are rendered in the declaration order of the merged work-types record, with any unknown titles trailing the known ones. The default `devOnlySections` (excluded from public release notes but still written to `CHANGELOG.md`) are: `Agentic support`, `CI`, `Dependencies`, `Internal`, `Refactoring`, `Tests`, `Tooling`. Override via `changelogJson.devOnlySections` in your config.
266
+
158
267
  ## CLI reference
159
268
 
160
269
  ### Global options
@@ -168,15 +277,82 @@ Work types from your config are merged with these defaults by key — your entri
168
277
 
169
278
  Run release preparation with automatic workspace discovery.
170
279
 
171
- | Flag | Description |
172
- | ---------------------------- | ---------------------------------------------------------------- |
173
- | `--dry-run` | Preview changes without writing files |
174
- | `--bump=major\|minor\|patch` | Override the bump type for all components |
175
- | `--force` | Bypass the "no commits since last tag" check (requires `--bump`) |
176
- | `--only=name1,name2` | Only process the named components (monorepo only) |
177
- | `--help`, `-h` | Show help |
280
+ | Flag | Description |
281
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------ |
282
+ | `--dry-run` | Preview changes without writing files |
283
+ | `--bump=major\|minor\|patch` | Override the bump type for all workspaces |
284
+ | `--set-version=X.Y.Z` | Set an explicit canonical semver version; bypasses commit-derived bumps. Requires `--only` in monorepo mode. |
285
+ | `--force` | Bypass the "no commits since last tag" check (requires `--bump`) |
286
+ | `--only=name1,name2` | Only process the named workspaces (monorepo only) |
287
+ | `--with-release-notes` | Write per-workspace release-notes previews under `{workspacePath}/docs/` |
288
+ | `--help`, `-h` | Show help |
289
+
290
+ Workspace names for `--only` match the package directory name (e.g., `arrays`, `release-kit`).
291
+
292
+ #### Previewing release notes with `--with-release-notes`
293
+
294
+ `--with-release-notes` writes two versioned files per workspace after each workspace's `changelog.json` is produced:
295
+
296
+ - `{workspacePath}/docs/README.v{version}.md` — the workspace `README.md` with release notes injected at the `<!-- section:release-notes -->` marker.
297
+ - `{workspacePath}/docs/RELEASE_NOTES.v{version}.md` — the standalone release notes for this version.
298
+
299
+ The publish-time inject-and-revert lifecycle is unchanged; previews are additive, deterministic, and safe to regenerate. When `changelogJson.enabled` is `false`, the flag logs a warning and skips preview generation. In dry-run mode, planned writes are logged and no files are created.
300
+
301
+ Because preview filenames are versioned, committing them will accumulate files over time. The recommended `.gitignore` entry for monorepos is:
302
+
303
+ ```gitignore
304
+ packages/*/docs/*.v*.md
305
+ ```
178
306
 
179
- Component names for `--only` match the package directory name (e.g., `arrays`, `release-kit`).
307
+ For single-package repos:
308
+
309
+ ```gitignore
310
+ docs/*.v*.md
311
+ ```
312
+
313
+ #### Setting an explicit version with `--set-version`
314
+
315
+ The `--set-version` flag is a first-class escape hatch for the cases where commit-derived bump logic produces the wrong version — most notably, promoting a pre-1.0 package to 1.0.0. Pre-1.0 packages collapse a `feat!` breaking change to a minor bump (matching semantic-release's `initialMajor: false` and release-please's `bump-minor-pre-major`), so a deliberate promotion to 1.0.0 must be requested explicitly.
316
+
317
+ The flag validates that:
318
+
319
+ - The value is canonical `N.N.N` semver (pre-release suffixes are rejected).
320
+ - The target is strictly greater than the current version (numeric comparison on each component).
321
+ - In monorepo mode, `--only` is set and resolves to exactly one workspace.
322
+
323
+ `--set-version` is mutually exclusive with `--bump` and `--force`. The rest of the pipeline (changelog generation, tag creation, commit summary, propagation to dependents) runs unchanged, so dependents receive a propagated patch bump triggered by the overridden version.
324
+
325
+ Promoting a pre-1.0 package to 1.0.0 in a monorepo:
326
+
327
+ ```sh
328
+ release-kit prepare --only arrays --set-version 1.0.0
329
+ ```
330
+
331
+ An empty changelog section is expected for a bare promotion, because the changelog is generated from commits since the last tag. To include a narrative entry, land a descriptive release commit (e.g., a `feat!` describing the stable API) before running `prepare`.
332
+
333
+ ### `release-kit create-github-release`
334
+
335
+ Create GitHub Releases from `changelog.json` for tags on HEAD. Independent of `npm publish`: invoking this command creates Releases regardless of whether the matching package was published.
336
+
337
+ | Flag | Description |
338
+ | ---------------------- | ------------------------------------------------------------------------- |
339
+ | `--dry-run` | Preview without creating releases |
340
+ | `--tags=tag1,tag2,...` | Only create releases for the named tags (comma-separated, full tag names) |
341
+ | `--help`, `-h` | Show help |
342
+
343
+ When `--tags` is omitted, every release tag pointing at HEAD is processed. The CLI requires the `gh` CLI on `PATH` and `contents: write` permission. The bundled `create-github-release.reusable.yaml` GitHub Actions workflow runs this command in CI.
344
+
345
+ ### `release-kit show-tag-prefixes`
346
+
347
+ Print a per-workspace table of derived tag prefixes, tag counts, and declared legacy prefixes. Also surfaces any release-shaped tag prefix in the repo that is neither a derived prefix nor declared via `legacyIdentities`, along with a copy-pasteable `workspaces: [...]` config snippet. The snippet uses a `TODO-fill-in-legacy-npm-name` placeholder for each identity's `name`; replace it with the package's prior npm name before pasting.
348
+
349
+ | Flag | Description |
350
+ | -------------- | ----------- |
351
+ | `--help`, `-h` | Show help |
352
+
353
+ Exits `0` when every workspace derives a prefix and there are no cross-workspace collisions; exits `1` on any derivation failure or collision. Undeclared candidates do not affect the exit code — they surface as a warning via the `legacy tag prefixes are declared` readyup check.
354
+
355
+ In single-package mode, prints a single row with `workspacePath = .` and `derivedPrefix = v`; legacy entries and undeclared-candidate scanning are not applicable.
180
356
 
181
357
  ### `release-kit init`
182
358
 
@@ -191,6 +367,8 @@ Initialize release-kit in the current repository. By default, scaffolds only the
191
367
 
192
368
  Scaffolded files:
193
369
 
370
+ - `.github/workflows/create-github-release.yaml` — workflow that creates a GitHub Release on tag push, independent of npm publish
371
+ - `.github/workflows/publish.yaml` — workflow that delegates to a reusable publish workflow
194
372
  - `.github/workflows/release.yaml` — workflow that delegates to a reusable release workflow
195
373
  - `.config/release-kit.config.ts` — starter config with commented-out customization examples (with `--with-config`)
196
374
  - `.config/git-cliff.toml` — copied from the bundled template (with `--with-config`)
@@ -213,7 +391,7 @@ The `init` command scaffolds a release workflow at `.github/workflows/release.ya
213
391
 
214
392
  | Input | Type | Description |
215
393
  | ------ | ------ | ------------------------------------------------------------------- |
216
- | `only` | string | Components to release (comma-separated, leave empty for all) |
394
+ | `only` | string | Workspaces to release (comma-separated, leave empty for all) |
217
395
  | `bump` | choice | Override bump type: `patch`, `minor`, `major` (empty = auto-detect) |
218
396
 
219
397
  For repos that need a self-contained workflow instead of the reusable one, the scaffolded file can be expanded. The key steps are: checkout with full history (`fetch-depth: 0`), run `release-kit prepare` with optional `--only` and `--bump` flags, check for changes, read tags from `tmp/.release-tags`, then commit, tag, and push.
@@ -221,10 +399,10 @@ For repos that need a self-contained workflow instead of the reusable one, the s
221
399
  ### Triggering a release
222
400
 
223
401
  ```sh
224
- # All components
402
+ # All workspaces
225
403
  gh workflow run release.yaml
226
404
 
227
- # Specific component(s)
405
+ # Specific workspace(s)
228
406
  gh workflow run release.yaml -f only=arrays
229
407
  gh workflow run release.yaml -f only=arrays,strings -f bump=minor
230
408
  ```
@@ -257,25 +435,57 @@ This package shells out to two external tools:
257
435
  - **`git`** — must be available on `PATH`. Used to find tags and retrieve commit history.
258
436
  - **`git-cliff`** — automatically downloaded and cached via `npx` on first invocation. No need to install it as a dev dependency.
259
437
 
260
- ## Using `component()` for manual configuration
438
+ ## Upgrading from v4 to v5
261
439
 
262
- If you need to build a `MonorepoReleaseConfig` manually (e.g., for the legacy script-based approach), the exported `component()` helper creates a `ComponentConfig` from a workspace-relative path:
440
+ Release-kit v5 derives each workspace's tag prefix from its unscoped `package.json` `name`, so a package at `packages/core` with `"name": "@scope/nmr-core"` uses tags like `nmr-core-v1.3.0`. Repos that previously tagged under the directory basename (e.g., `core-v1.3.0`) do not need to rewrite history — declare the prior identity in `legacyIdentities` so release-kit recognizes historical tags under both the new and old prefixes.
441
+
442
+ Minimal worked example for a repo whose pre-v5 tags were `core-v0.2.7` and whose npm name has not changed:
263
443
 
264
444
  ```typescript
265
- import { component } from '@williamthorsen/release-kit';
445
+ // .config/release-kit.config.ts
446
+ import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
447
+
448
+ const config: ReleaseKitConfig = {
449
+ workspaces: [
450
+ {
451
+ dir: 'core',
452
+ legacyIdentities: [{ name: '@scope/nmr-core', tagPrefix: 'core-v' }],
453
+ },
454
+ ],
455
+ };
456
+
457
+ export default config;
458
+ ```
459
+
460
+ Each `legacyIdentity` is a complete `(name, tagPrefix)` snapshot of the workspace at an earlier point. In the common case — the tag-derivation rule changed but the npm name did not — the identity's `name` equals the current `name`. If an earlier publish used a different npm name, use that prior name here.
266
461
 
267
- // Accepts the full workspace-relative path
268
- component('packages/arrays');
462
+ Verify with `release-kit show-tag-prefixes` — it prints the derived prefix per workspace, tag counts under each declared legacy prefix, and any undeclared release-shaped prefixes it finds in the repo (with a copy-pasteable config snippet that includes a `TODO-fill-in-legacy-npm-name` placeholder to replace with the prior npm name). After declaring, `release-kit prepare` consults the union of the current and legacy tag prefixes when searching for the most recent baseline tag, and changelog generation matches tags under either prefix.
463
+
464
+ See the `legacyIdentities` entry in the [`WorkspaceOverride`](#workspaceoverride) section for the config shape.
465
+
466
+ ## Using `deriveWorkspaceConfig()` for manual configuration
467
+
468
+ If you need to build a `MonorepoReleaseConfig` manually (e.g., for the legacy script-based approach), the exported `deriveWorkspaceConfig()` helper creates a `WorkspaceConfig` from a workspace-relative path. It reads the workspace's `package.json` to derive the tag prefix from the package name:
469
+
470
+ ```typescript
471
+ import { deriveWorkspaceConfig } from '@williamthorsen/release-kit';
472
+
473
+ // packages/arrays/package.json contains `"name": "@scope/arrays"`
474
+ deriveWorkspaceConfig('packages/arrays');
269
475
  // => {
270
476
  // dir: 'arrays',
477
+ // name: '@scope/arrays',
271
478
  // tagPrefix: 'arrays-v',
479
+ // workspacePath: 'packages/arrays',
272
480
  // packageFiles: ['packages/arrays/package.json'],
273
481
  // changelogPaths: ['packages/arrays'],
274
482
  // paths: ['packages/arrays/**'],
275
483
  // }
276
484
  ```
277
485
 
278
- The `dir` field is derived from `path.basename()`, so `packages/arrays` and `libs/arrays` both produce `dir: 'arrays'`. The `tagPrefix` is always `${dir}-v` it cannot be customized.
486
+ `dir` is the basename of the workspace path and is the stable internal identifier used by `--only`, `WorkspaceOverride.dir`, and the dependency graph. `tagPrefix` is derived from the unscoped `package.json` `name` any leading `@scope/` is stripped — so tags reflect the package identity rather than the directory layout. For example, a workspace at `packages/core` with `"name": "@williamthorsen/nmr-core"` produces `tagPrefix: 'nmr-core-v'`, yielding tags like `nmr-core-v1.3.0`.
487
+
488
+ The workspace's `package.json` must declare a non-empty `name` field; `deriveWorkspaceConfig()` throws otherwise. If two workspaces produce the same `tagPrefix` (because their unscoped names collide), `mergeMonorepoConfig()` throws and names the colliding workspaces so you can rename one.
279
489
 
280
490
  ## Legacy script-based approach
281
491
 
@@ -284,10 +494,10 @@ The CLI-driven approach is recommended for new setups. The script-based approach
284
494
  ```typescript
285
495
  // .github/scripts/release.config.ts
286
496
  import type { MonorepoReleaseConfig } from '@williamthorsen/release-kit';
287
- import { component } from '@williamthorsen/release-kit';
497
+ import { deriveWorkspaceConfig } from '@williamthorsen/release-kit';
288
498
 
289
499
  export const config: MonorepoReleaseConfig = {
290
- components: [component('packages/arrays'), component('packages/strings')],
500
+ workspaces: [deriveWorkspaceConfig('packages/arrays'), deriveWorkspaceConfig('packages/strings')],
291
501
  formatCommand: 'npx prettier --write',
292
502
  };
293
503
  ```
@@ -300,10 +510,70 @@ import { config } from './release.config.ts';
300
510
  runReleasePrepare(config);
301
511
  ```
302
512
 
303
- The key difference: the script-based approach requires manually listing every component, while the CLI auto-discovers them from `pnpm-workspace.yaml`.
513
+ The key difference: the script-based approach requires manually listing every workspace, while the CLI auto-discovers them from `pnpm-workspace.yaml`.
304
514
 
305
515
  ## Breaking changes
306
516
 
517
+ ### `resolveReleaseTags` takes workspaces; `WorkspaceConfig` requires `workspacePath`
518
+
519
+ Tag resolution is now driven by workspace records rather than a caller-supplied directory map, so `resolveReleaseTags` can report both the workspace `dir` and its `workspacePath` for every resolved tag.
520
+
521
+ - `resolveReleaseTags` signature changed from `(workspaceMap?: Map<string, string>)` to `(workspaces?: readonly WorkspaceConfig[])`.
522
+ - `WorkspaceConfig` gained a required `workspacePath: string` field.
523
+
524
+ Replace direct `Map`-based calls with `deriveWorkspaceConfig()`, which now populates `workspacePath` for you:
525
+
526
+ ```diff
527
+ -import { resolveReleaseTags } from '@williamthorsen/release-kit';
528
+ -
529
+ -const workspaceMap = new Map([['core', 'packages/core']]);
530
+ -resolveReleaseTags(workspaceMap);
531
+ +import { deriveWorkspaceConfig, resolveReleaseTags } from '@williamthorsen/release-kit';
532
+ +
533
+ +resolveReleaseTags([deriveWorkspaceConfig('packages/core')]);
534
+ ```
535
+
536
+ If you construct `WorkspaceConfig` objects directly, add `workspacePath` alongside the other required fields.
537
+
538
+ ### `release-kit publish` and `release-kit push` replace `--only` with `--tags`
539
+
540
+ The `--only=<dir>` flag on `release-kit publish` and `release-kit push` has been removed. Both commands now filter by full tag name via `--tags=<tag1>[,<tag2>...]`, matching `release-kit create-github-release`. Passing `--only=...` after upgrading produces an `Unknown option: --only` error.
541
+
542
+ Local usage mapping:
543
+
544
+ ```diff
545
+ -release-kit publish --only=core
546
+ +release-kit publish --tags=core-v1.3.0
547
+
548
+ -release-kit push --only=core,cli
549
+ +release-kit push --tags=core-v1.3.0,cli-v0.5.0
550
+ ```
551
+
552
+ Omitting `--tags` preserves the previous behavior of operating on every release tag at HEAD. The reusable workflow `publish.reusable.yaml` also accepts an optional `tags:` input, and the scaffolded `publish.yaml` now passes `tags: ${{ github.ref_name }}` so the publish scope is explicit rather than relying on `actions/checkout@v6`'s fetch default. Existing callers that do not set `tags:` continue to work unchanged.
553
+
554
+ ### GitHub Release creation moved to its own command and workflow
555
+
556
+ `release-kit publish` no longer creates GitHub Releases as a side effect, and the `releaseNotes.shouldCreateGithubRelease` config field has been removed. Adoption is now signaled by installing the dedicated `create-github-release.reusable.yaml` workflow.
557
+
558
+ If you previously set the field, remove it from `.config/release-kit.config.ts`. The new caller template (scaffolded by `release-kit init`) looks like this:
559
+
560
+ ```yaml
561
+ name: Create GitHub Release
562
+ on:
563
+ push:
564
+ tags:
565
+ - '*-v[0-9]*.[0-9]*.[0-9]*'
566
+ permissions:
567
+ contents: write
568
+ jobs:
569
+ create-github-release:
570
+ uses: williamthorsen/node-monorepo-tools/.github/workflows/create-github-release.reusable.yaml@workflow/create-github-release-v1
571
+ with:
572
+ tag: ${{ github.ref_name }}
573
+ ```
574
+
575
+ The CLI command was renamed from `release-kit github-release` to `release-kit create-github-release`, and its filter flag changed from `--only=<package-name>` to `--tags=<full-tag-name>[,...]`.
576
+
307
577
  ### v1.1.0: `formatCommand` receives file paths as trailing arguments
308
578
 
309
579
  Previously, `formatCommand` was executed as-is (e.g., `pnpm run fmt` would run without arguments). Now, the paths of all modified files (package.json files and changelogs) are appended as trailing arguments.
@@ -61,6 +61,7 @@ commit_preprocessors = []
61
61
  commit_parsers = [
62
62
  { message = "^release:", skip = true },
63
63
  { message = "^Merge", skip = true },
64
+ { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?ai(!)?:", group = "Agentic support" },
64
65
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?bugfix(!)?:", group = "Bug fixes" },
65
66
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?ci(!)?:", group = "CI" },
66
67
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?deprecate(!)?:", group = "Deprecated" },
@@ -69,7 +70,7 @@ commit_parsers = [
69
70
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?feat(!)?:", group = "Features" },
70
71
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?feature(!)?:", group = "Features" },
71
72
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?fix(!)?:", group = "Bug fixes" },
72
- { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?fmt(!)?:", group = "Formatting" },
73
+ { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?fmt(!)?:", skip = true },
73
74
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?internal(!)?:", group = "Internal" },
74
75
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?perf(!)?:", group = "Performance" },
75
76
  { message = "^(\\#\\d+([.\\-]\\d+)?|\\#\\#|[A-Z]+-\\d+)\\s+([\\w-]+\\|)?performance(!)?:", group = "Performance" },
package/dist/esm/.cache CHANGED
@@ -1 +1 @@
1
- d6a6d71f34f00ba31c3dca3b32657832693ff9c12de118fafa96fc3554835ecc
1
+ 4493cd8b695da653fc9ae7a81c0916cc0cb92c9acf3d560433b18cdd74f945a4