@williamthorsen/release-kit 12.0.0 → 13.1.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 (168) hide show
  1. package/.meta/changelog.json +229 -0
  2. package/.readyup/kits/default.js +18 -17
  3. package/.readyup/kits/npm-auto-publish.js +24 -23
  4. package/.readyup/manifest.json +16 -11
  5. package/CHANGELOG.md +64 -0
  6. package/README.md +27 -51
  7. package/bin/release-kit.js +1 -1
  8. package/dist/esm/assertCleanWorkingTree.d.ts +1 -5
  9. package/dist/esm/assertTaggedBaseline.d.ts +29 -0
  10. package/dist/esm/assertTaggedBaseline.js +41 -0
  11. package/dist/esm/attachChangelogDiagnostics.d.ts +1 -1
  12. package/dist/esm/attachChangelogDiagnostics.js +3 -0
  13. package/dist/esm/bin/release-kit.js +85 -22
  14. package/dist/esm/buildChangelogEntries.d.ts +23 -13
  15. package/dist/esm/buildChangelogEntries.js +36 -17
  16. package/dist/esm/buildDependencyGraph.d.ts +6 -6
  17. package/dist/esm/buildEmptyReleaseEntry.d.ts +1 -8
  18. package/dist/esm/buildReleaseSummary.d.ts +2 -8
  19. package/dist/esm/buildSyntheticChangelogEntry.d.ts +3 -5
  20. package/dist/esm/buildSyntheticChangelogEntry.js +2 -2
  21. package/dist/esm/bumpVersion.d.ts +1 -8
  22. package/dist/esm/changelogJsonFile.d.ts +5 -7
  23. package/dist/esm/changelogJsonFile.js +2 -17
  24. package/dist/esm/changelogJsonUtils.d.ts +7 -10
  25. package/dist/esm/changelogOverrides.d.ts +59 -98
  26. package/dist/esm/classifyChangelogCommit.d.ts +7 -9
  27. package/dist/esm/classifyChangelogCommit.js +3 -2
  28. package/dist/esm/commitCommand.d.ts +2 -4
  29. package/dist/esm/compareVersions.d.ts +10 -4
  30. package/dist/esm/compareVersions.js +16 -0
  31. package/dist/esm/configFlagSchema.d.ts +1 -1
  32. package/dist/esm/createGithubRelease.d.ts +7 -19
  33. package/dist/esm/createGithubReleaseCommand.d.ts +5 -5
  34. package/dist/esm/createGithubReleaseCommand.js +9 -9
  35. package/dist/esm/createTags.d.ts +2 -3
  36. package/dist/esm/decideRelease.d.ts +2 -6
  37. package/dist/esm/defaults.d.ts +5 -24
  38. package/dist/esm/defaults.js +4 -5
  39. package/dist/esm/defineConfig.d.ts +1 -1
  40. package/dist/esm/deleteFileIfExists.d.ts +1 -1
  41. package/dist/esm/deriveReleaseNotesConfig.d.ts +20 -0
  42. package/dist/esm/deriveReleaseNotesConfig.js +21 -0
  43. package/dist/esm/deriveWorkspaceConfig.d.ts +3 -5
  44. package/dist/esm/detectPackageManager.d.ts +2 -4
  45. package/dist/esm/detectUndeclaredTagPrefixes.d.ts +4 -6
  46. package/dist/esm/detectUndeclaredTagPrefixes.js +1 -1
  47. package/dist/esm/determineBumpType.d.ts +1 -1
  48. package/dist/esm/discoverWorkspaces.d.ts +14 -15
  49. package/dist/esm/discoverWorkspaces.js +12 -12
  50. package/dist/esm/enterRepoRoot.d.ts +12 -0
  51. package/dist/esm/enterRepoRoot.js +16 -0
  52. package/dist/esm/enumerateReleaseWindows.d.ts +8 -8
  53. package/dist/esm/extractMigration.d.ts +6 -8
  54. package/dist/esm/findUnroutedEntryScopes.d.ts +16 -0
  55. package/dist/esm/findUnroutedEntryScopes.js +57 -0
  56. package/dist/esm/formatExcludedSkip.d.ts +3 -0
  57. package/dist/esm/formatExcludedSkip.js +3 -0
  58. package/dist/esm/formatPrivateSkip.d.ts +1 -6
  59. package/dist/esm/generateChangelogs.d.ts +10 -5
  60. package/dist/esm/glyphs.d.ts +1 -1
  61. package/dist/esm/help/prepareHelp.d.ts +3 -4
  62. package/dist/esm/help/prepareHelp.js +4 -3
  63. package/dist/esm/init/checks.d.ts +3 -3
  64. package/dist/esm/init/checks.js +4 -1
  65. package/dist/esm/init/detectRepoType.d.ts +2 -3
  66. package/dist/esm/init/hasProvenance.d.ts +2 -0
  67. package/dist/esm/init/hasProvenance.js +3 -0
  68. package/dist/esm/init/initCommand.d.ts +3 -6
  69. package/dist/esm/init/initCommand.js +10 -10
  70. package/dist/esm/init/parseJsonRecord.d.ts +1 -4
  71. package/dist/esm/init/scaffold.d.ts +1 -1
  72. package/dist/esm/init/templates.d.ts +9 -11
  73. package/dist/esm/init/templates.js +12 -11
  74. package/dist/esm/init/updateTemplatesCommand.d.ts +13 -0
  75. package/dist/esm/init/updateTemplatesCommand.js +64 -0
  76. package/dist/esm/injectReleaseNotesIntoReadme.d.ts +12 -17
  77. package/dist/esm/injectSection.d.ts +3 -3
  78. package/dist/esm/loadConfig.d.ts +16 -14
  79. package/dist/esm/loadConfig.js +2 -2
  80. package/dist/esm/loadValidatedConfig.d.ts +16 -19
  81. package/dist/esm/loadValidatedConfig.js +6 -1
  82. package/dist/esm/packsPath.d.ts +9 -9
  83. package/dist/esm/parseChangeRecordBlock.d.ts +2 -2
  84. package/dist/esm/parseCommitMessage.d.ts +17 -32
  85. package/dist/esm/parseCommitMessage.js +28 -37
  86. package/dist/esm/parseRequestedTags.d.ts +3 -3
  87. package/dist/esm/planReleaseNotesPreviews.d.ts +6 -6
  88. package/dist/esm/planVersionBump.d.ts +5 -3
  89. package/dist/esm/planVersionBump.js +3 -0
  90. package/dist/esm/prepareCommand.d.ts +4 -7
  91. package/dist/esm/prepareCommand.js +13 -6
  92. package/dist/esm/previewTagPrefixes.d.ts +8 -10
  93. package/dist/esm/propagateBumps.d.ts +6 -7
  94. package/dist/esm/publish.d.ts +1 -1
  95. package/dist/esm/publishCommand.d.ts +4 -3
  96. package/dist/esm/publishCommand.js +8 -8
  97. package/dist/esm/pushCommand.d.ts +4 -3
  98. package/dist/esm/pushCommand.js +8 -2
  99. package/dist/esm/pushRelease.d.ts +2 -2
  100. package/dist/esm/readChangelogSections.d.ts +33 -0
  101. package/dist/esm/readChangelogSections.js +80 -0
  102. package/dist/esm/releaseFiles.d.ts +5 -7
  103. package/dist/esm/releasePlan.d.ts +11 -13
  104. package/dist/esm/releasePrepare.d.ts +23 -22
  105. package/dist/esm/releasePrepare.js +31 -11
  106. package/dist/esm/releasePrepareMono.d.ts +9 -7
  107. package/dist/esm/releasePrepareMono.js +85 -33
  108. package/dist/esm/releasePrepareProject.d.ts +19 -29
  109. package/dist/esm/releasePrepareProject.js +31 -12
  110. package/dist/esm/renderChangelogMarkdown.d.ts +10 -4
  111. package/dist/esm/renderChangelogMarkdown.js +27 -2
  112. package/dist/esm/renderReleaseNotes.d.ts +3 -11
  113. package/dist/esm/renderReleaseNotes.js +2 -6
  114. package/dist/esm/reportPrepare.d.ts +4 -5
  115. package/dist/esm/reportPrepare.js +33 -19
  116. package/dist/esm/resolveCommandTags.d.ts +15 -11
  117. package/dist/esm/resolveCommandTags.js +35 -5
  118. package/dist/esm/resolveConfigFlag.d.ts +7 -0
  119. package/dist/esm/resolveConfigFlag.js +4 -0
  120. package/dist/esm/resolveReleaseTags.d.ts +6 -8
  121. package/dist/esm/resolveReleaseTags.js +1 -1
  122. package/dist/esm/resolveStylesOrExit.d.ts +2 -2
  123. package/dist/esm/showTagPrefixesCommand.d.ts +7 -10
  124. package/dist/esm/showTagPrefixesCommand.js +4 -4
  125. package/dist/esm/stripEmojiPrefix.d.ts +1 -0
  126. package/dist/esm/stripScope.d.ts +2 -2
  127. package/dist/esm/stripScope.js +3 -3
  128. package/dist/esm/sync-labels/generateCommand.d.ts +11 -10
  129. package/dist/esm/sync-labels/generateCommand.js +17 -9
  130. package/dist/esm/sync-labels/initCommand.d.ts +6 -7
  131. package/dist/esm/sync-labels/initCommand.js +2 -2
  132. package/dist/esm/sync-labels/presets.d.ts +5 -4
  133. package/dist/esm/sync-labels/presets.js +9 -9
  134. package/dist/esm/sync-labels/resolveLabels.d.ts +7 -7
  135. package/dist/esm/sync-labels/resolveLabels.js +2 -1
  136. package/dist/esm/sync-labels/retiredConfig.d.ts +4 -5
  137. package/dist/esm/sync-labels/syncCommand.d.ts +1 -4
  138. package/dist/esm/sync-labels/templates.d.ts +3 -3
  139. package/dist/esm/sync-labels/templates.js +3 -3
  140. package/dist/esm/sync-labels/typeLabels.d.ts +14 -0
  141. package/dist/esm/sync-labels/typeLabels.js +38 -0
  142. package/dist/esm/sync-labels/types.d.ts +4 -2
  143. package/dist/esm/tagCommand.d.ts +1 -1
  144. package/dist/esm/typeGuards.d.ts +2 -2
  145. package/dist/esm/types.d.ts +122 -93
  146. package/dist/esm/types.js +2 -1
  147. package/dist/esm/validateConfig.d.ts +2 -11
  148. package/dist/esm/validateConfig.js +2 -2
  149. package/dist/esm/validateOnlyExcludesStrandedDependents.d.ts +14 -12
  150. package/dist/esm/validateOverridesCommand.d.ts +17 -20
  151. package/dist/esm/validateOverridesCommand.js +1 -1
  152. package/docs/api.md +6 -6
  153. package/docs/changelogs.md +63 -40
  154. package/docs/configuration.md +29 -27
  155. package/docs/editorial-overrides.md +23 -23
  156. package/docs/labels.md +37 -19
  157. package/docs/project-releases.md +13 -13
  158. package/docs/publishing.md +5 -5
  159. package/docs/readiness-checks.md +3 -3
  160. package/docs/releasing.md +50 -25
  161. package/docs/work-types.md +41 -57
  162. package/package.json +7 -6
  163. package/presets/labels/common.yaml +1 -41
  164. package/dist/esm/resolveReleaseNotesConfig.d.ts +0 -26
  165. package/dist/esm/resolveReleaseNotesConfig.js +0 -29
  166. package/dist/esm/workTypesData.d.ts +0 -50
  167. package/dist/esm/workTypesData.js +0 -145
  168. package/schemas/label-map.json +0 -24
@@ -1,4 +1,233 @@
1
1
  [
2
+ {
3
+ "version": "13.1.0",
4
+ "date": "2026-10-02",
5
+ "sections": [
6
+ {
7
+ "title": "🎉 Features",
8
+ "audience": "all",
9
+ "items": [
10
+ {
11
+ "description": "Adds an `archived: true` mark to `repoLabels.labels` entries, which `sync-labels generate` writes to `.github/labels.yaml` without changing the output for unmarked labels. (#955)",
12
+ "hash": "23c0e0eeaf3e59cd921632850c7771ccdd6effe1",
13
+ "entry": 1
14
+ }
15
+ ]
16
+ }
17
+ ]
18
+ },
19
+ {
20
+ "version": "13.0.0",
21
+ "date": "2026-10-01",
22
+ "sections": [
23
+ {
24
+ "title": "🎉 Features",
25
+ "audience": "all",
26
+ "items": [
27
+ {
28
+ "description": "Adds the `--config <path>` flag to `release-kit push`, which now reads the config as `publish` and `create-github-release` do and fails when the file exists but is invalid. (#895)",
29
+ "hash": "6aea08cf0154f2d1cc253a44cd9b09c283ad3248",
30
+ "entry": 2
31
+ },
32
+ {
33
+ "description": "Makes `release-kit` add an item derived from a change-record entry to a workspace's changelog and version bump only when the entry's `scopes`, after `scopeAliases` resolution, name the workspace's `dir`, are empty, or contain `*`, and extends that rule to the sections of earlier releases that `release-kit prepare` rebuilds. (#896)",
34
+ "hash": "066c6bde1ad4fda6705066f538283e9c80a92a1e",
35
+ "entry": 1
36
+ },
37
+ {
38
+ "description": "Adds a warning to the `release-kit prepare` report that lists each change-record entry scope matching no workspace in its commit's window, such as a misspelled scope or the old name of a renamed directory that has no `scopeAliases` entry. (#896)",
39
+ "hash": "066c6bde1ad4fda6705066f538283e9c80a92a1e",
40
+ "entry": 2
41
+ },
42
+ {
43
+ "description": "Makes `release-kit overrides validate` check a workspace's overrides against only the entries routed to that workspace, so that an override keyed to an entry routed elsewhere is reported as stale. (#896)",
44
+ "hash": "066c6bde1ad4fda6705066f538283e9c80a92a1e",
45
+ "entry": 3
46
+ },
47
+ {
48
+ "description": "Adds `release-kit update-templates`, which writes each scaffolded workflow that is missing or differs from the installed template, prints a diff of each updated file, refreshes `sync-labels.yaml` only when it exists, keeps `publish.yaml`'s provenance setting, and never reads or writes the config files. (#952)",
49
+ "hash": "9fac96675e9fb4dd70407cbfb0e3e0ffa7e83ba4",
50
+ "entry": 1
51
+ },
52
+ {
53
+ "description": "Changes the readyup kits' fix messages for a workflow that differs from its template, or that references a deprecated tag, to recommend `update-templates` rather than `init --force`. (#952)",
54
+ "hash": "9fac96675e9fb4dd70407cbfb0e3e0ffa7e83ba4",
55
+ "entry": 3
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "title": "🪦 Removed",
61
+ "audience": "all",
62
+ "items": [
63
+ {
64
+ "description": "Removes `required` as a `breakingPolicies` value, making `drop` default to `optional` so that an unmarked `drop:` commit no longer reports a policy violation. (#905)",
65
+ "breaking": true,
66
+ "migration": "Remove each `'required'` value from `breakingPolicies` in `release-kit.config.ts`, or replace it with `'optional'`.",
67
+ "hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
68
+ "entry": 1
69
+ },
70
+ {
71
+ "description": "Stops `release-kit` from parsing a commit subject that combines a pipe scope with a parenthesized scope, such as `web|feat(other): ...`, or that lacks a space and a title after the colon, because subjects are now read through `@williamthorsen/change-grammar`. (#905)",
72
+ "migration": "Rewrite a combined subject such as `web|feat(other): ...` as `web|feat: ...`, and follow the colon with a space and a title.",
73
+ "hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
74
+ "entry": 2
75
+ },
76
+ {
77
+ "description": "Stops publishing `schemas/label-map.json` from `release-kit`, whose identical schema `@williamthorsen/change-grammar` now publishes; URLs under existing `release-kit-v*` tags keep resolving. (#905)",
78
+ "migration": "Point the `$schema` of `.meta/label-map.json` at `https://github.com/williamthorsen/node-monorepo-tools/raw/change-grammar-v<version>/packages/change-grammar/schemas/label-map.json`, and keep an existing `release-kit-v*` URL until a `change-grammar-v*` tag exists, since that URL does not resolve before then.",
79
+ "hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
80
+ "entry": 3
81
+ }
82
+ ]
83
+ },
84
+ {
85
+ "title": "🐛 Bug fixes",
86
+ "audience": "all",
87
+ "items": [
88
+ {
89
+ "description": "Record a changelog entry for a forced release whose commits yield no item (#887)",
90
+ "body": "Makes `release-kit prepare` record the \"Forced version bump.\" changelog entry for any release forced by `--force` or `--set-version` whose commits yield no changelog item, instead of only for a release with no commits at all. It also stops a monorepo's project release from dropping the forced-release entries that earlier releases recorded.",
91
+ "hash": "e806c32a4f412abde5d7ab22f150506e946b3a87"
92
+ },
93
+ {
94
+ "description": "Stops `release-kit prepare` from reporting `commitCount` 0 and dropping the unparseable commits and change-record and policy diagnostics of a workspace released only because a dependency was bumped, and makes `prepare` list that workspace's commits in the release commit summary under its tag. (#888)",
95
+ "hash": "d60ac32b7452b850c98571017e5f7f373479fc10",
96
+ "entry": 1
97
+ },
98
+ {
99
+ "description": "Stops `release-kit prepare` from labeling a direct release that has no commits as bumped via a dependency, by marking a propagation-only release with the new `propagatedOnly` result field, whose report line now reads `Bumped via dependency: …` in place of `0 commits (bumped via dependency: …)`. (#888)",
100
+ "hash": "d60ac32b7452b850c98571017e5f7f373479fc10",
101
+ "entry": 2
102
+ },
103
+ {
104
+ "description": "Stops a `release-kit` command run from inside a package from releasing that package as a single-package repo with its own tag and changelog, by running every command from the repo root: the nearest directory that contains `pnpm-workspace.yaml`, or else the working directory when it contains a `package.json`. (#893)",
105
+ "hash": "97af8314da5dfe135c680310eb79f8309bc9918e",
106
+ "entry": 1
107
+ },
108
+ {
109
+ "description": "Stops `sync-labels generate` from writing the `--config` path into the `.github/labels.yaml` header as typed, which made the header and the result of `generate --check` depend on the directory from which the command ran; the header now names the config by its path relative to the repo root. (#893)",
110
+ "hash": "97af8314da5dfe135c680310eb79f8309bc9918e",
111
+ "entry": 2
112
+ },
113
+ {
114
+ "description": "Stops `push`, `publish`, and `create-github-release` from pushing, publishing, or creating a GitHub Release for a tag on HEAD whose workspace the config excludes with `shouldExclude: true`, which each command now skips with a warning, including when `--tags` names the tag or when every tag on HEAD is excluded. (#895)",
115
+ "hash": "6aea08cf0154f2d1cc253a44cd9b09c283ad3248",
116
+ "entry": 1
117
+ },
118
+ {
119
+ "description": "Stops `release-kit prepare` from silently deleting a `CHANGELOG.md` section whose version is absent from both the release windows and `changelog.json`, such as history written by hand before release-kit was adopted; `prepare` now keeps that section verbatim in version order, lists the kept versions in its report, and warns about each `##` section that names no version and is dropped. (#897)",
120
+ "hash": "9316ba5903b330895e258786d0fc7de005554cae",
121
+ "entry": 1
122
+ },
123
+ {
124
+ "description": "Stops `release-kit prepare` from folding every earlier commit into the new version, and deriving the bump from all of them, when the current version was released and recorded in the changelog but never tagged; `prepare` now fails before any write, under `--force` and `--set-version` too, and names each target and the tag to create. (#897)",
125
+ "hash": "9316ba5903b330895e258786d0fc7de005554cae",
126
+ "entry": 2
127
+ },
128
+ {
129
+ "description": "Adds the missing `removal` and `formatting` labels to the `common` preset by defining a label for every work type in change-grammar's taxonomy, and keeps the names, colors, and descriptions of the existing type labels. (#906)",
130
+ "hash": "ccdb3aa585d6fb36b2994cceb59df54caea12a79",
131
+ "entry": 1
132
+ },
133
+ {
134
+ "description": "Fixes the `release.yaml` generated by `release-kit init`, which `actionlint` rejected because its `bump` choice input listed an empty string as the auto-detect option, by offering `auto` as the default option and passing it to the reusable release workflow as an empty `bump`. (#936)",
135
+ "hash": "9c0ef936a0d5b91fe64c5a1ea1be258f1678ea62",
136
+ "entry": 1
137
+ },
138
+ {
139
+ "description": "Rewords the error messages, `prepare` report lines, command help, and readyup kit fix strings of `release-kit` that addressed the reader as \"your\", separated a detail from its subject with an em-dash, or stated an absence with \"no\", such as \"No workspaces had release-worthy changes.\" (#937)",
140
+ "hash": "22ae182082e683ef94bf59db3bd23ca2c5b72c1f",
141
+ "entry": 1
142
+ },
143
+ {
144
+ "description": "Fixes the issue that the `release.yaml` and `sync-labels.yaml` workflows generated by `release-kit init` and `release-kit sync-labels init` contained unclear wording in two comments and in the `force` input description, which the change rewrites without altering any job, trigger, or input; the release-kit kit check reports a copy generated before this change as stale until `release-kit init --force` or `release-kit sync-labels init --force` regenerates it. (#946)",
145
+ "hash": "dc1c4bd4b05425ed1c2a7d031105c402c3d01f20",
146
+ "entry": 1
147
+ },
148
+ {
149
+ "description": "Fixes the issue that `release-kit` titled a propagation-only bump's changelog section `Dependency updates` rather than with the resolved `deps` work type's header, `📦 Dependencies` by default or a consumer's `workTypes.deps.header` override, which broke the heading convention and left the section outside the section order. (#950)",
150
+ "hash": "5a4771a1cb1e1b324a9ce3cb64fc3527199946a7",
151
+ "entry": 1
152
+ },
153
+ {
154
+ "description": "Fixes the issue that `release-kit init`'s next steps told a public repo to set `provenance: true` in `publish.yaml`, which the template already sets, and now tells a private repo to remove it instead. (#952)",
155
+ "hash": "9fac96675e9fb4dd70407cbfb0e3e0ffa7e83ba4",
156
+ "entry": 4
157
+ }
158
+ ]
159
+ },
160
+ {
161
+ "title": "♻️ Refactoring",
162
+ "audience": "dev",
163
+ "items": [
164
+ {
165
+ "description": "Narrows the config accepted by `releasePrepare`, `releasePrepareMono`, `releasePrepareProject`, and the helpers that they pass it to, to the new `PrepareConfig` and `MonorepoPrepareConfig` aliases, which omit `releaseNotes` so that typecheck rejects any read of release-notes configuration on the prepare path. (#890)",
166
+ "hash": "e2b4e44f37a3f8254a42d98f67bc2f15d9e6c2c5",
167
+ "entry": 1
168
+ },
169
+ {
170
+ "description": "Derives `DEFAULT_WORK_TYPES`, `DEFAULT_BREAKING_POLICIES`, the default `devOnlySections`, and the release-notes breaking marker from change-grammar's `CANONICAL_TAXONOMY`, removing release-kit's taxonomy copy and its `work-types:check` and `work-types:sync` scripts. (#905)",
171
+ "hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
172
+ "entry": 4
173
+ },
174
+ {
175
+ "description": "Replaces every `.sort()` call that suppressed `unicorn/no-array-sort` with `toSorted()` and drops the spread copy wherever the source was already an array. (#925)",
176
+ "hash": "4680fb4e865ffce0bd135fac20d49b766b156992",
177
+ "entry": 1
178
+ }
179
+ ]
180
+ },
181
+ {
182
+ "title": "🧪 Tests",
183
+ "audience": "dev",
184
+ "items": [
185
+ {
186
+ "description": "Extends the `changelogJson.enabled` tests of `releasePrepareMono` to configure a format command and assert that `formatCommand.files` includes the workspace's `changelog.json` when the feature is enabled and excludes it when the feature is disabled, where the disabled case also requires a format command to exist so that the exclusion cannot pass vacuously. (#889)",
187
+ "hash": "eaf3782e606b98ba360cde9eab08770e27155d2b",
188
+ "entry": 1
189
+ },
190
+ {
191
+ "description": "Replaces the inline copies of the fixture in which `app` depends on `core` in `releasePrepareMono.unit.test.ts` with `stubPropagationWorkspaces`, a helper that stubs both manifests at their exact paths and returns the two-workspace config. (#951)",
192
+ "hash": "c1d511c5ae570e75358cd642b90b4979723fe375",
193
+ "entry": 1
194
+ }
195
+ ]
196
+ },
197
+ {
198
+ "title": "📦 Dependencies",
199
+ "audience": "dev",
200
+ "items": [
201
+ {
202
+ "description": "Upgrades all dependencies to the latest versions allowed by the ceilings in `taze.config.ts` and the release quarantine, including pnpm to 12.6.0. (#944)",
203
+ "hash": "6dffd5df5bc4209dc225d08390ef2b67fe381f1b",
204
+ "entry": 1
205
+ },
206
+ {
207
+ "description": "Adds `esbuild` 0.28.2 to the pnpm catalog and declares it as a devDependency of `nmr`, `release-kit`, and `v11y-check`, because `readyup` declares it only as an optional peer and `rdy compile` failed in those packages once a regenerated lockfile stopped installing it. (#944)",
208
+ "hash": "6dffd5df5bc4209dc225d08390ef2b67fe381f1b",
209
+ "entry": 2
210
+ }
211
+ ]
212
+ },
213
+ {
214
+ "title": "📚 Documentation",
215
+ "audience": "dev",
216
+ "items": [
217
+ {
218
+ "description": "Revises the comments in `packages/release-kit/src` and the `default` and `npm-auto-publish` readyup kits against the comment-discipline rules, correcting comments that misstated the code, such as the `releasePrepareProject` description that said it returns `undefined` where it throws and the `renderChangelogMarkdown` note that said no logic reads the footer. (#922)",
219
+ "hash": "176d09caec47686fa0023a31c5f77d4e2362d9bb",
220
+ "entry": 1
221
+ },
222
+ {
223
+ "description": "Rewrites the prose of the `release-kit` README, the pages under `docs/`, and the package's source comments and test names in plain, literal wording. (#937)",
224
+ "hash": "22ae182082e683ef94bf59db3bd23ca2c5b72c1f",
225
+ "entry": 2
226
+ }
227
+ ]
228
+ }
229
+ ]
230
+ },
2
231
  {
3
232
  "version": "12.0.0",
4
233
  "date": "2026-09-23",
@@ -98,7 +98,7 @@ function translateGlob(pattern) {
98
98
 
99
99
  // .readyup/kits/default.ts
100
100
  function getMinVersion() {
101
- const picked = { "version": "12.0.0" };
101
+ const picked = { "version": "13.1.0" };
102
102
  if (typeof picked["version"] !== "string") {
103
103
  throw new TypeError("release-kit/package.json: 'version' must be a string");
104
104
  }
@@ -114,10 +114,10 @@ var CONFIG_EXPORT_PATTERNS = [
114
114
  /export\s*\{[^}]*\b(?:config|default)\b[^}]*\}/,
115
115
  /export\s*\*/
116
116
  ];
117
- var COMMON_PRESET_HASH = "8c52654d4eee216c22377dd1e65b89f6bbb0a3478d74379bd28b04a877f0b02a";
118
- var SYNC_LABELS_WORKFLOW_HASH = "d6e2403fb551d2d415f679125989c92760444eec887644565b2e05c9bf8f4c1e";
119
- var RELEASE_WORKFLOW_HASH_MONOREPO = "0a9724b7b3c5e24087fd3a8f36fed8e990d699267fcf36028ce048ab40dc2946";
120
- var RELEASE_WORKFLOW_HASH_SINGLE = "a3d19bbc1ba8bb30622e53c590137b97e3179e80988c0967737b021cdaeab73f";
117
+ var COMMON_PRESET_HASH = "618bb5cbcbdd4f4f0c2a777add7e14d992d48483350dd9651bf8cf4c1fa9d418";
118
+ var SYNC_LABELS_WORKFLOW_HASH = "6b50015e2919ffa4b16d0b4a1f340e585ff3e5b779a2256010d3c62fa07ff8f2";
119
+ var RELEASE_WORKFLOW_HASH_MONOREPO = "f35503bcfc5c131a8309305fed27f8127cb901f422cb8b62978a34b86dda7f7a";
120
+ var RELEASE_WORKFLOW_HASH_SINGLE = "d26dd4ca186632b388ea46bd885721124c03d19918e511baa40821d2d760da69";
121
121
  var PUBLISH_WORKFLOW_HASH_MONOREPO = "0afa9ffe914f3dc8f043e68252ebc604c8cc1a953422fcea37a909a4def370ee";
122
122
  var PUBLISH_WORKFLOW_HASH_SINGLE = "6f31183e0a1e66be791a19266c3b028dadbd9fe010f7fc4452f3f8970c937b43";
123
123
  var CREATE_GITHUB_RELEASE_WORKFLOW_HASH_MONOREPO = "c455d88c93d855737c96079945ff729a9d094f846519c24afbefe83a425c1d7f";
@@ -160,14 +160,14 @@ var default_default = defineRdyKit({
160
160
  const hash = detectRepoType() === "monorepo" ? RELEASE_WORKFLOW_HASH_MONOREPO : RELEASE_WORKFLOW_HASH_SINGLE;
161
161
  return fileMatchesHash(".github/workflows/release.yaml", hash);
162
162
  },
163
- fix: "Run `release-kit init --force` to regenerate release.yaml from the current template"
163
+ fix: "Run `release-kit update-templates` to regenerate release.yaml from the current template"
164
164
  },
165
165
  {
166
166
  name: "release.yaml does not reference deprecated tag ref",
167
167
  severity: "error",
168
168
  quiet: true,
169
169
  check: () => fileDoesNotContain(".github/workflows/release.yaml", /@(release|publish)-workflow-v[0-9]/),
170
- fix: "Update release.yaml to use @workflow/release-v1 (run `release-kit init --force` to regenerate, or replace the ref manually)"
170
+ fix: "Update release.yaml to use @workflow/release-v1 (run `release-kit update-templates` to regenerate, or replace the ref manually)"
171
171
  }
172
172
  ]
173
173
  },
@@ -185,14 +185,14 @@ var default_default = defineRdyKit({
185
185
  const hash = detectRepoType() === "monorepo" ? PUBLISH_WORKFLOW_HASH_MONOREPO : PUBLISH_WORKFLOW_HASH_SINGLE;
186
186
  return fileMatchesHash(".github/workflows/publish.yaml", hash);
187
187
  },
188
- fix: "Run `release-kit init --force` to regenerate publish.yaml from the current template"
188
+ fix: "Run `release-kit update-templates` to regenerate publish.yaml from the current template"
189
189
  },
190
190
  {
191
191
  name: "publish.yaml does not reference deprecated tag ref",
192
192
  severity: "error",
193
193
  quiet: true,
194
194
  check: () => fileDoesNotContain(".github/workflows/publish.yaml", /@(release|publish)-workflow-v[0-9]/),
195
- fix: "Update publish.yaml to use @workflow/publish-v1 (run `release-kit init --force` to regenerate, or replace the ref manually)"
195
+ fix: "Update publish.yaml to use @workflow/publish-v1 (run `release-kit update-templates` to regenerate, or replace the ref manually)"
196
196
  }
197
197
  ]
198
198
  },
@@ -204,14 +204,14 @@ var default_default = defineRdyKit({
204
204
  const hash = detectRepoType() === "monorepo" ? CREATE_GITHUB_RELEASE_WORKFLOW_HASH_MONOREPO : CREATE_GITHUB_RELEASE_WORKFLOW_HASH_SINGLE;
205
205
  return fileMatchesHash(".github/workflows/create-github-release.yaml", hash);
206
206
  },
207
- fix: "Run `release-kit init --force` to regenerate create-github-release.yaml from the current template"
207
+ fix: "Run `release-kit update-templates` to regenerate create-github-release.yaml from the current template"
208
208
  },
209
209
  {
210
210
  name: ".config/release-kit.config.ts exports a config",
211
211
  severity: "error",
212
212
  skip: () => !fileExists(".config/release-kit.config.ts") ? "no release-kit config file" : false,
213
213
  check: () => configFileExportsConfig(),
214
- fix: "Export the config from .config/release-kit.config.ts as a default export or as a named `config` export; release-kit resolves no other export",
214
+ fix: "Export the config from .config/release-kit.config.ts as a default export or as a named `config` export; release-kit does not resolve any other export",
215
215
  checks: [
216
216
  {
217
217
  name: "releaseNotes config is consistent with changelogJson",
@@ -223,7 +223,7 @@ var default_default = defineRdyKit({
223
223
  name: ".config/release-kit.config.ts uses defineConfig",
224
224
  severity: "recommend",
225
225
  check: () => fileContains(".config/release-kit.config.ts", /defineConfig/),
226
- fix: "Wrap your config export with defineConfig() from @williamthorsen/release-kit/config for type safety"
226
+ fix: "Wrap the config export with defineConfig() from @williamthorsen/release-kit/config for type safety"
227
227
  },
228
228
  {
229
229
  name: "releaseNotes.shouldInjectIntoReadme is true",
@@ -262,8 +262,9 @@ var default_default = defineRdyKit({
262
262
  }
263
263
  ]
264
264
  },
265
- // Deliberately outside the config gate above: that check skips where the config file is absent, and a repo
266
- // with no config file still defaults `changelogJson.enabled` to true and still publishes tarballs.
265
+ // Keep these checks outside the config gate above, which skips when the config file is absent: For a repo
266
+ // without a config file, release-kit still defaults `changelogJson.enabled` to true, and the repo still
267
+ // publishes tarballs.
267
268
  {
268
269
  name: "published packages ship CHANGELOG.md",
269
270
  severity: "warn",
@@ -276,7 +277,7 @@ var default_default = defineRdyKit({
276
277
  severity: "recommend",
277
278
  skip: () => !hasPublishablePackages() ? "no publishable packages" : false,
278
279
  check: () => changelogJsonIsEnabled(),
279
- fix: "Remove changelogJson.enabled: false from .config/release-kit.config.ts so release-kit writes the machine-readable changelog that upgrade tooling reads before CHANGELOG.md",
280
+ fix: "Remove changelogJson.enabled: false from .config/release-kit.config.ts so that release-kit writes the machine-readable changelog that upgrade tooling reads before CHANGELOG.md",
280
281
  checks: [
281
282
  {
282
283
  name: "published packages ship the changelog JSON",
@@ -312,7 +313,7 @@ var default_default = defineRdyKit({
312
313
  name: "sync-labels.yaml matches template",
313
314
  severity: "warn",
314
315
  check: () => fileMatchesHash(".github/workflows/sync-labels.yaml", SYNC_LABELS_WORKFLOW_HASH),
315
- fix: "Run `release-kit sync-labels init --force` to regenerate the workflow from the current template"
316
+ fix: "Run `release-kit update-templates` to regenerate the workflow from the current template"
316
317
  }
317
318
  ]
318
319
  },
@@ -321,7 +322,7 @@ var default_default = defineRdyKit({
321
322
  severity: "error",
322
323
  quiet: true,
323
324
  check: () => fileDoesNotContain(".github/workflows/sync-labels.yaml", /@sync-labels-workflow-v[0-9]/),
324
- fix: "Update sync-labels.yaml to use @workflow/sync-labels-v1 (run `release-kit sync-labels init --force` to regenerate, or replace the ref manually)"
325
+ fix: "Update sync-labels.yaml to use @workflow/sync-labels-v1 (run `release-kit update-templates` to regenerate, or replace the ref manually)"
325
326
  },
326
327
  {
327
328
  name: "retired .config/sync-labels.config.ts is absent",
@@ -17,6 +17,13 @@ import {
17
17
  readFile,
18
18
  readJsonFile
19
19
  } from "readyup/check-utils";
20
+
21
+ // src/init/hasProvenance.ts
22
+ function hasProvenance(workflowContent) {
23
+ return /^[^#]*provenance:\s*['"]?true['"]?/im.test(workflowContent);
24
+ }
25
+
26
+ // .readyup/kits/npm-auto-publish.ts
20
27
  var AUTH_ERROR_CODES = /* @__PURE__ */ new Set(["E401", "ENEEDAUTH"]);
21
28
  var OTP_ERROR_CODE = "EOTP";
22
29
  var PUBLISH_WORKFLOW_FILE = "publish.yaml";
@@ -41,7 +48,7 @@ var repoChecklist = defineRdyChecklist({
41
48
  {
42
49
  name: "id-token: write permission declared",
43
50
  check: () => fileContains(".github/workflows/publish.yaml", /id-token:\s*write/),
44
- fix: 'Add "permissions: { id-token: write, contents: read }" to .github/workflows/publish.yaml \u2014 required for OIDC-based npm authentication'
51
+ fix: 'Add "permissions: { id-token: write, contents: read }" to .github/workflows/publish.yaml; OIDC-based npm authentication requires it'
45
52
  },
46
53
  {
47
54
  name: "No legacy token references in workflow files",
@@ -69,18 +76,17 @@ var packagesChecklist = defineRdyChecklist({
69
76
  },
70
77
  fix: 'Set "packageManager": "pnpm@..." in root package.json'
71
78
  },
72
- // Unfalsifiable on readyup 0.33 and later, where discovery reports the repo root and throws on an unreadable
73
- // root package.json rather than returning an empty list. It stays for a consumer below that, whose monorepo
74
- // mode returns the matched directories alone and so returns nothing when the globs match nothing.
79
+ // Unfalsifiable on every readyup version that `minReadyupVersion` admits: Discovery reports the repo root, and it
80
+ // throws on an unreadable root package.json instead of returning an empty list.
75
81
  {
76
82
  name: "At least one workspace discovered",
77
83
  check: () => discoverWorkspaces().length > 0,
78
84
  fix: "Ensure pnpm-workspace.yaml lists package globs, or that a root package.json exists"
79
85
  }
80
86
  ],
81
- // The gate stands beside the workspace rows rather than above them, so a session that cannot answer trust queries
82
- // suppresses the trusted-publisher rows alone and leaves the package.json checks reporting. The rows no longer
83
- // hang beneath the gate's skip, so a repo that publishes nothing has to be held to its one line here.
87
+ // The session gate is a sibling of the workspace rows, not their parent, so a session that cannot answer trust
88
+ // queries suppresses only the trusted-publisher rows and leaves the package.json checks reporting. The gate's skip
89
+ // therefore does not cover the rows, and this getter omits them for a repo that publishes nothing.
84
90
  get checks() {
85
91
  const sessionCheck = buildSessionCheck();
86
92
  if (skipIfNothingPublishable() !== false) {
@@ -94,8 +100,8 @@ var packagesChecklist = defineRdyChecklist({
94
100
  });
95
101
  var npm_auto_publish_default = defineRdyKit({
96
102
  fixLocation: "inline",
97
- // The release that introduced `CheckOutcome.fix`, on which the provenance check's remediation depends. An older
98
- // runner drops that `fix` silently, so failing to load the kit is the lesser harm.
103
+ // The release that introduced `CheckOutcome.fix`, on which the provenance check's remediation depends. Because an
104
+ // older runner drops that `fix` silently, failing to load the kit is the lesser harm.
99
105
  minReadyupVersion: "0.37.0",
100
106
  checklists: [repoChecklist, packagesChecklist]
101
107
  });
@@ -110,9 +116,7 @@ function buildSessionCheck() {
110
116
  const capability = getCachedTrustCapability();
111
117
  return capability.ok ? { ok: true } : { ok: false, detail: capability.detail };
112
118
  },
113
- // A plain string rather than a getter, because the remediation is the same however the session fails; only
114
- // the `detail` above varies.
115
- fix: 'Restore a usable npm session: log in with "npm login", supplying the one-time password when prompted, or restore access to the registry, which the trusted-publisher check queries directly'
119
+ fix: 'Restore a usable npm session: Log in with "npm login", supplying the one-time password when prompted, or restore access to the registry, which the trusted-publisher check queries directly'
116
120
  };
117
121
  }
118
122
  function buildWorkspaceCheck(workspace) {
@@ -139,7 +143,7 @@ function buildWorkspaceCheck(workspace) {
139
143
  {
140
144
  name: "published to npm",
141
145
  // `npm view` reads the registry without a session, so a missing login or a missing one-time password leaves
142
- // this answerable. An unreachable registry does not: the lookup fails for every package, and reporting that
146
+ // this answerable. An unreachable registry does not: The lookup fails for every package, and reporting that
143
147
  // as unpublished would advise publishing a package that is already there.
144
148
  skip: () => {
145
149
  const auth = getCachedNpmAuthStatus();
@@ -192,7 +196,7 @@ function checkTrustedPublisher(packageName) {
192
196
  case "configured":
193
197
  return { ok: true };
194
198
  case "not-configured":
195
- return { ok: false, detail: "No trusted publisher is configured for this package" };
199
+ return { ok: false, detail: "The npm registry does not list any trusted publisher for this package" };
196
200
  default:
197
201
  return { ok: false, detail: result.detail };
198
202
  }
@@ -228,19 +232,19 @@ function classifyProvenanceSetting(workflowContent, visibility) {
228
232
  fix: "Install and authenticate the GitHub CLI: gh auth login"
229
233
  };
230
234
  }
231
- const hasProvenance = parseProvenanceSetting(workflowContent);
232
- if (visibility === "public" && !hasProvenance) {
235
+ const provenance = hasProvenance(workflowContent);
236
+ if (visibility === "public" && !provenance) {
233
237
  return {
234
238
  ok: false,
235
239
  detail: "The repo is public and publish.yaml does not set provenance: true",
236
- fix: "Set provenance: true in .github/workflows/publish.yaml \u2014 public repos should generate provenance attestations"
240
+ fix: "Set provenance: true in .github/workflows/publish.yaml; public repos should generate provenance attestations"
237
241
  };
238
242
  }
239
- if (visibility === "private" && hasProvenance) {
243
+ if (visibility === "private" && provenance) {
240
244
  return {
241
245
  ok: false,
242
246
  detail: "The repo is private and publish.yaml sets provenance: true",
243
- fix: "Make the GitHub repo public \u2014 OIDC publishing with provenance requires a public repo"
247
+ fix: "Make the GitHub repo public; OIDC publishing with provenance requires a public repo"
244
248
  };
245
249
  }
246
250
  return { ok: true };
@@ -273,7 +277,7 @@ function classifyTrustQuery(result, expectedRepo, expectedFile) {
273
277
  }
274
278
  const relationships = readTrustRelationships(result.stdout);
275
279
  if (relationships === void 0) {
276
- return { status: "error", detail: "The npm trust query returned a payload this check cannot read" };
280
+ return { status: "error", detail: "The npm trust query returned a payload that this check cannot read" };
277
281
  }
278
282
  if (relationships.length === 0) {
279
283
  return { status: "not-configured" };
@@ -366,9 +370,6 @@ function isRepoPrivate() {
366
370
  }).trim();
367
371
  return result === "true";
368
372
  }
369
- function parseProvenanceSetting(workflowContent) {
370
- return /^[^#]*provenance:\s*['"]?true['"]?/im.test(workflowContent);
371
- }
372
373
  function probeTrustQuery() {
373
374
  const probeName = selectProbeName();
374
375
  return probeName === void 0 ? void 0 : getTrustQueryResult(probeName);
@@ -8,12 +8,12 @@
8
8
  "esbuildVersion": "0.28.2",
9
9
  "inputs": [
10
10
  {
11
- "hash": "07f5fe58",
11
+ "hash": "91bc3638",
12
12
  "kind": "module",
13
13
  "path": "kits/default.ts"
14
14
  },
15
15
  {
16
- "hash": "54c6b74c",
16
+ "hash": "fd27a632",
17
17
  "kind": "inline",
18
18
  "path": "../package.json",
19
19
  "paths": [
@@ -21,22 +21,22 @@
21
21
  ]
22
22
  },
23
23
  {
24
- "hash": "850b703f",
24
+ "hash": "43bb0452",
25
25
  "kind": "module",
26
26
  "path": "../src/init/detectRepoType.ts"
27
27
  },
28
28
  {
29
- "hash": "b6873aba",
29
+ "hash": "68354f97",
30
30
  "kind": "module",
31
31
  "path": "../src/init/parseJsonRecord.ts"
32
32
  },
33
33
  {
34
- "hash": "b798d024",
34
+ "hash": "1c9cbce9",
35
35
  "kind": "module",
36
36
  "path": "../src/packsPath.ts"
37
37
  },
38
38
  {
39
- "hash": "646fe51b",
39
+ "hash": "1424b343",
40
40
  "kind": "module",
41
41
  "path": "../src/typeGuards.ts"
42
42
  }
@@ -45,8 +45,8 @@
45
45
  "path": "kits/default.js",
46
46
  "readyupVersion": "0.38.0",
47
47
  "source": "kits/default.ts",
48
- "sourceHash": "07f5fe58",
49
- "targetHash": "cece8501"
48
+ "sourceHash": "91bc3638",
49
+ "targetHash": "a3266cf2"
50
50
  },
51
51
  {
52
52
  "checklists": [
@@ -56,17 +56,22 @@
56
56
  "esbuildVersion": "0.28.2",
57
57
  "inputs": [
58
58
  {
59
- "hash": "c2d2d375",
59
+ "hash": "d9910d60",
60
60
  "kind": "module",
61
61
  "path": "kits/npm-auto-publish.ts"
62
+ },
63
+ {
64
+ "hash": "d360febf",
65
+ "kind": "module",
66
+ "path": "../src/init/hasProvenance.ts"
62
67
  }
63
68
  ],
64
69
  "name": "npm-auto-publish",
65
70
  "path": "kits/npm-auto-publish.js",
66
71
  "readyupVersion": "0.38.0",
67
72
  "source": "kits/npm-auto-publish.ts",
68
- "sourceHash": "c2d2d375",
69
- "targetHash": "9d2d224b"
73
+ "sourceHash": "d9910d60",
74
+ "targetHash": "8bdbefef"
70
75
  }
71
76
  ]
72
77
  }