@williamthorsen/release-kit 14.2.3 → 14.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.meta/changelog.json +38 -0
- package/.readyup/kits/default.js +1 -1
- package/.readyup/manifest.json +3 -3
- package/CHANGELOG.md +19 -0
- package/README.md +2 -2
- package/dist/esm/buildChangelogEntries.d.ts +4 -4
- package/dist/esm/buildChangelogEntries.js +2 -2
- package/dist/esm/buildChangelogItem.d.ts +2 -0
- package/dist/esm/buildChangelogItem.js +3 -0
- package/docs/changelogs.md +6 -4
- package/package.json +3 -3
package/.meta/changelog.json
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "14.2.4",
|
|
4
|
+
"date": "2026-10-21",
|
|
5
|
+
"sections": [
|
|
6
|
+
{
|
|
7
|
+
"title": "🐛 Bug fixes",
|
|
8
|
+
"audience": "all",
|
|
9
|
+
"items": [
|
|
10
|
+
{
|
|
11
|
+
"description": "Fixes the issue that `release-kit` did not release a workspace whose files a commit changed when that commit scoped every change-record entry to other workspaces; for that workspace, the commit's title now sets the bump and the changelog item. (#1086)",
|
|
12
|
+
"hash": "b518414c98f4703f2adca3840577e9f2b66e0924",
|
|
13
|
+
"entry": 1
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
},
|
|
2
19
|
{
|
|
3
20
|
"version": "14.2.3",
|
|
4
21
|
"date": "2026-10-18",
|
|
@@ -183,6 +200,17 @@
|
|
|
183
200
|
}
|
|
184
201
|
]
|
|
185
202
|
},
|
|
203
|
+
{
|
|
204
|
+
"title": "🏗️ Internal features",
|
|
205
|
+
"audience": "dev",
|
|
206
|
+
"items": [
|
|
207
|
+
{
|
|
208
|
+
"description": "Resolve package roots past dual-format marker manifests (#1016)",
|
|
209
|
+
"body": "Replaces nmr-core's hand-written package-root and version lookups with `findPackageRoot` and `resolveSelfVersion` re-exported from `@williamthorsen/toolbelt.packaging`, which pass over the `{\"type\": \"commonjs\"}` marker manifest of a dual-format layout to reach the package that declares a `name`. `nmr`, `release-kit`, and `v11y-check` switch from `readPackageVersion` to `resolveSelfVersion`, and the boundary guard now holds `toolbelt.packaging`, like `toolbelt.terminal`, to a single importer and a single declarer in nmr-core.",
|
|
210
|
+
"hash": "ff6627180d9e86d083656afb2c09a3fb190fc79d"
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
},
|
|
186
214
|
{
|
|
187
215
|
"title": "♻️ Refactoring",
|
|
188
216
|
"audience": "dev",
|
|
@@ -234,6 +262,16 @@
|
|
|
234
262
|
"description": "Makes `release-kit prepare` refuse, before it writes any file and in a dry run too, to release a publishable package that npm does not list or that it cannot look up, and prints `npm publish --access public` as the fix for each unlisted package. (#996)",
|
|
235
263
|
"hash": "7b8b6d67b264af56dff761d0bf987eca8bc2f934",
|
|
236
264
|
"entry": 1
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"description": "Let a calling repo choose the runner of the reusable workflows (#997)",
|
|
268
|
+
"body": "Makes the reusable `audit`, `create-github-release`, `release`, and `sync-labels` workflows run their jobs on the runner named by the calling repository's `CI_RUNS_ON` configuration variable, such as a self-hosted runner, and keeps `ubuntu-latest` as the default when the variable is unset. Leaves the reusable `publish` workflow on `ubuntu-latest`, because npm generates provenance only on GitHub-hosted runners.",
|
|
269
|
+
"hash": "91573eec402f4028b766684be84c33e8739513ce"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"description": "Keep undeclared repo labels and warn about each (#1002)",
|
|
273
|
+
"body": "Changes the reusable sync-labels workflow to keep each repository label that `.github/labels.yaml` does not declare, rather than delete it, and to report each such label as a warning annotation on the run and on the pull request's check. A label created by hand now stays in place across syncs until the file declares it or it is deleted with `gh label delete <name>`.",
|
|
274
|
+
"hash": "f696a4f92064a5f2993e8bcbb6764762f161ec9d"
|
|
237
275
|
}
|
|
238
276
|
]
|
|
239
277
|
},
|
package/.readyup/kits/default.js
CHANGED
|
@@ -234,7 +234,7 @@ var CREATE_GITHUB_RELEASE_WORKFLOW_HASH_SINGLE = "f595831ff28f8b3a01d97e6cb0cfe1
|
|
|
234
234
|
|
|
235
235
|
// .readyup/kits/default.ts
|
|
236
236
|
function getMinVersion() {
|
|
237
|
-
const picked = { "version": "14.2.
|
|
237
|
+
const picked = { "version": "14.2.4" };
|
|
238
238
|
if (typeof picked["version"] !== "string") {
|
|
239
239
|
throw new TypeError("release-kit/package.json: 'version' must be a string");
|
|
240
240
|
}
|
package/.readyup/manifest.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"checklist": "release-kit",
|
|
8
8
|
"checks": [
|
|
9
9
|
"@williamthorsen/release-kit in devDependencies",
|
|
10
|
-
"@williamthorsen/release-kit >= 14.2.
|
|
10
|
+
"@williamthorsen/release-kit >= 14.2.4",
|
|
11
11
|
"release.yaml workflow exists",
|
|
12
12
|
"release.yaml matches template",
|
|
13
13
|
"release.yaml does not reference deprecated tag ref",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"path": "lib/workflow-hashes.ts"
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
"hash": "
|
|
66
|
+
"hash": "d2f6e29b",
|
|
67
67
|
"kind": "inline",
|
|
68
68
|
"path": "../package.json",
|
|
69
69
|
"paths": [
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"readyupVersion": "0.42.0",
|
|
102
102
|
"source": "kits/default.ts",
|
|
103
103
|
"sourceHash": "ad3666b8",
|
|
104
|
-
"targetHash": "
|
|
104
|
+
"targetHash": "da678c1d"
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
"checklistChecks": [
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 14.2.4 — 2026-10-21
|
|
6
|
+
|
|
7
|
+
### 🐛 Bug fixes
|
|
8
|
+
|
|
9
|
+
- Fixes the issue that `release-kit` did not release a workspace whose files a commit changed when that commit scoped every change-record entry to other workspaces; for that workspace, the commit's title now sets the bump and the changelog item. (#1086)
|
|
10
|
+
|
|
5
11
|
## 14.2.3 — 2026-10-18
|
|
6
12
|
|
|
7
13
|
### 🐛 Bug fixes
|
|
@@ -56,6 +62,12 @@ All notable changes to this project will be documented in this file.
|
|
|
56
62
|
- Fixes the issue that `release-kit create-github-release` did not create a GitHub Release for the project tag; a private workspace's tag is still skipped. (#1027)
|
|
57
63
|
- Makes `release-kit publish` skip a project tag named by `--tags` with the warning `Skipping v0.13.0: a project tag is not an npm package.`, since the project does not have an npm package to publish. (#1027)
|
|
58
64
|
|
|
65
|
+
### 🏗️ Internal features
|
|
66
|
+
|
|
67
|
+
- Resolve package roots past dual-format marker manifests (#1016)
|
|
68
|
+
|
|
69
|
+
Replaces nmr-core's hand-written package-root and version lookups with `findPackageRoot` and `resolveSelfVersion` re-exported from `@williamthorsen/toolbelt.packaging`, which pass over the `{"type": "commonjs"}` marker manifest of a dual-format layout to reach the package that declares a `name`. `nmr`, `release-kit`, and `v11y-check` switch from `readPackageVersion` to `resolveSelfVersion`, and the boundary guard now holds `toolbelt.packaging`, like `toolbelt.terminal`, to a single importer and a single declarer in nmr-core.
|
|
70
|
+
|
|
59
71
|
### ♻️ Refactoring
|
|
60
72
|
|
|
61
73
|
- Replaces `releasePrepare`, `releasePrepareMono`, and `releasePrepareProject` with `releasePrepareTargets`, which prepares a release from one list of package and project targets resolved from any config shape. (#1026)
|
|
@@ -72,6 +84,13 @@ All notable changes to this project will be documented in this file.
|
|
|
72
84
|
- Stops `release-kit init` from scaffolding `publish.yaml` and `create-github-release.yaml` when every package is private, even with `--force`, and removes the provenance and trusted-publisher steps from the next steps that it prints. (#995)
|
|
73
85
|
- Stops `release-kit update-templates` from re-creating a deleted `publish.yaml` or `create-github-release.yaml` when every package is private, while it still refreshes either workflow that exists. (#995)
|
|
74
86
|
- Makes `release-kit prepare` refuse, before it writes any file and in a dry run too, to release a publishable package that npm does not list or that it cannot look up, and prints `npm publish --access public` as the fix for each unlisted package. (#996)
|
|
87
|
+
- Let a calling repo choose the runner of the reusable workflows (#997)
|
|
88
|
+
|
|
89
|
+
Makes the reusable `audit`, `create-github-release`, `release`, and `sync-labels` workflows run their jobs on the runner named by the calling repository's `CI_RUNS_ON` configuration variable, such as a self-hosted runner, and keeps `ubuntu-latest` as the default when the variable is unset. Leaves the reusable `publish` workflow on `ubuntu-latest`, because npm generates provenance only on GitHub-hosted runners.
|
|
90
|
+
|
|
91
|
+
- Keep undeclared repo labels and warn about each (#1002)
|
|
92
|
+
|
|
93
|
+
Changes the reusable sync-labels workflow to keep each repository label that `.github/labels.yaml` does not declare, rather than delete it, and to report each such label as a warning annotation on the run and on the pull request's check. A label created by hand now stays in place across syncs until the file declares it or it is deleted with `gh label delete <name>`.
|
|
75
94
|
|
|
76
95
|
### 🐛 Bug fixes
|
|
77
96
|
|
package/README.md
CHANGED
|
@@ -7,11 +7,11 @@ Version-bumping and changelog-generation toolkit for release workflows.
|
|
|
7
7
|
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 from the same commit history that decides each bump (with optional [editorial overrides](docs/editorial-overrides.md)).
|
|
8
8
|
|
|
9
9
|
<!-- section:release-notes -->
|
|
10
|
-
## Release notes — v14.2.
|
|
10
|
+
## Release notes — v14.2.4 (2026-10-21)
|
|
11
11
|
|
|
12
12
|
### 🐛 Bug fixes
|
|
13
13
|
|
|
14
|
-
- Fixes the issue that
|
|
14
|
+
- Fixes the issue that `release-kit` did not release a workspace whose files a commit changed when that commit scoped every change-record entry to other workspaces; for that workspace, the commit's title now sets the bump and the changelog item. (#1086)
|
|
15
15
|
<!-- /section:release-notes -->
|
|
16
16
|
|
|
17
17
|
## Installation
|
|
@@ -15,10 +15,10 @@ export declare function buildChangelogEntries(config: ReleaseHistoryConfig, tag:
|
|
|
15
15
|
* Reads a scope's release windows once and returns the changelog items of every window, with what the unreleased
|
|
16
16
|
* window decides: its commits, its bump, and its diagnostics.
|
|
17
17
|
*
|
|
18
|
-
* A commit whose last `change-record` block records
|
|
19
|
-
*
|
|
20
|
-
* or merge subject yields nothing either way. The read records diagnostics
|
|
21
|
-
* released windows were reported when they were prepared.
|
|
18
|
+
* A commit whose last `change-record` block records at least one entry routed to `options.scope` yields one item per
|
|
19
|
+
* routed entry; any other commit, including one whose entries all route elsewhere, is classified by its title through
|
|
20
|
+
* `classifyChangelogCommit`. A `release:` or merge subject yields nothing either way. The read records diagnostics
|
|
21
|
+
* only for the unreleased window, since the released windows were reported when they were prepared.
|
|
22
22
|
*/
|
|
23
23
|
export declare function readReleaseHistory(config: ReleaseHistoryConfig, options: GenerateChangelogOptions): ReleaseHistory;
|
|
24
24
|
/** One read of a scope's release windows. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { chainError } from '@williamthorsen/toolbelt.errors/candidate';
|
|
2
|
-
import { buildEntryItem, buildTitleItem, } from "./buildChangelogItem.js";
|
|
2
|
+
import { buildEntryItem, buildTitleItem, hasRoutedEntry, } from "./buildChangelogItem.js";
|
|
3
3
|
import { buildEmptyReleaseEntry } from "./buildEmptyReleaseEntry.js";
|
|
4
4
|
import { extractVersion } from "./changelogJsonUtils.js";
|
|
5
5
|
import { classifyChangelogCommit, isNonChangeSubject, isReleaseSubject } from "./classifyChangelogCommit.js";
|
|
@@ -93,7 +93,7 @@ function readCommit(commit, context, diagnostics) {
|
|
|
93
93
|
reason: reading.reason,
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
|
-
if (reading.kind === 'read' && reading.entries.length > 0) {
|
|
96
|
+
if (reading.kind === 'read' && reading.entries.length > 0 && hasRoutedEntry(reading.entries, context.routing)) {
|
|
97
97
|
const items = reading.entries.flatMap((entry, entryIndex) => buildEntryItem(commit, entry, entryIndex + 1, reading.prNumber, context, diagnostics) ?? []);
|
|
98
98
|
return { items, isUnparseable: false };
|
|
99
99
|
}
|
|
@@ -38,6 +38,8 @@ export interface DerivedItem {
|
|
|
38
38
|
item: ChangelogItem;
|
|
39
39
|
signal: BumpSignal;
|
|
40
40
|
}
|
|
41
|
+
/** Reports whether any of `entries` is routed to the workspace of `routing`; always true for a read without routing. */
|
|
42
|
+
export declare function hasRoutedEntry(entries: readonly ChangeRecordEntry[], routing: EntryRouting | undefined): boolean;
|
|
41
43
|
/** What every window's read shares. */
|
|
42
44
|
export interface ReadContext {
|
|
43
45
|
breakingPolicies: NonNullable<ReleaseSettings['breakingPolicies']>;
|
|
@@ -75,6 +75,9 @@ export function buildTitleItem(commit, isParsedBreaking, workTypes) {
|
|
|
75
75
|
item.hash = commit.hash;
|
|
76
76
|
return item;
|
|
77
77
|
}
|
|
78
|
+
export function hasRoutedEntry(entries, routing) {
|
|
79
|
+
return routing === undefined || entries.some((entry) => isRoutedTo(entry.scopes, routing));
|
|
80
|
+
}
|
|
78
81
|
function extractBody(message) {
|
|
79
82
|
const lines = message.split('\n').slice(1);
|
|
80
83
|
let start = 0;
|
package/docs/changelogs.md
CHANGED
|
@@ -93,9 +93,11 @@ A workspace's window contains every commit that touches the workspace's paths. A
|
|
|
93
93
|
|
|
94
94
|
A scope narrows the window and never widens it: A scope that names a workspace whose window does not contain the commit doesn't route the item to any workspace, and `prepare` reports it (see [Reported diagnostics](#reported-diagnostics)). A composite's changelog, such as the project changelog, and a single-package repo take every entry, whatever its scopes.
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
The window decides whether a workspace releases, and the scopes decide only what its changelog says. When none of a commit's entries routes to a workspace whose window contains the commit, release-kit reads the commit for that workspace from its title, as it reads a commit without a block: The title's type counts toward the workspace's bump, and the title's item enters its changelog. A commit with at least one entry routed to the workspace is read from its routed entries alone, even when none of them yields an item.
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
A workspace's bump reads the items routed to it, so a breaking entry scoped to one workspace does not raise a major bump in another workspace that has a routed entry of its own. A workspace read from the title takes the title's breaking marker; the workspace to which an entry is scoped keeps the entry's level.
|
|
99
|
+
|
|
100
|
+
Each `prepare` rebuilds a workspace's released windows with the same routing, the fallback to the title included. When an earlier release recorded an item under a workspace that the item's scopes do not name, the rebuild removes the item from that workspace's past section. A path window does not follow a renamed directory, and legacy identities do not rename scopes: An entry scoped to a workspace's old directory name is routed to the workspace only through a `scopeAliases` entry from the old name to the new one, and until one exists, `prepare` reports the scope for each such commit in the unreleased window.
|
|
99
101
|
|
|
100
102
|
## Change-record blocks
|
|
101
103
|
|
|
@@ -128,7 +130,7 @@ An entry whose type is excluded from the changelog doesn't yield an item. An ove
|
|
|
128
130
|
|
|
129
131
|
### Fallback to the title
|
|
130
132
|
|
|
131
|
-
A commit is read from its title, as [Which commits appear in a changelog](#which-commits-appear-in-a-changelog) describes, when it doesn't have a block, when the block's `entries` is absent or empty, or when the block is malformed. A block is malformed when it never closes, when its payload is not valid YAML or not a mapping, when `entries` is not a list, when an entry is not a mapping, when an entry's `type` or `text` is missing, blank, or not a string, when `breaking` is not a boolean, when `scopes` is not a list of strings, when `migration` or `ticket_ref` is not a string, or when `pr_number` is not a positive integer. One defect makes the whole block malformed.
|
|
133
|
+
A commit is read from its title, as [Which commits appear in a changelog](#which-commits-appear-in-a-changelog) describes, when it doesn't have a block, when the block's `entries` is absent or empty, when none of its entries routes to the workspace being read (see [Routing to workspaces](#routing-to-workspaces)), or when the block is malformed. A block is malformed when it never closes, when its payload is not valid YAML or not a mapping, when `entries` is not a list, when an entry is not a mapping, when an entry's `type` or `text` is missing, blank, or not a string, when `breaking` is not a boolean, when `scopes` is not a list of strings, when `migration` or `ticket_ref` is not a string, or when `pr_number` is not a positive integer. One defect makes the whole block malformed.
|
|
132
134
|
|
|
133
135
|
### Reported diagnostics
|
|
134
136
|
|
|
@@ -139,7 +141,7 @@ A commit is read from its title, as [Which commits appear in a changelog](#which
|
|
|
139
141
|
- **An entry that violates its type's breaking policy**, as a policy violation at the entry's position. Its item is not marked breaking.
|
|
140
142
|
- **An entry scope that doesn't name a workspace in its commit's window**, with the commit's hash, the entry's position, and the scope as the entry declares it. release-kit reports it under every workspace whose window contains the commit. A scope that names nothing, or a workspace whose window does not contain the commit, is reported; `*`, `root`, and a scope that names a workspace in the window are not. Under `--only`, a scope that names a configured workspace left out of the run is not reported either. A workspace excluded with `shouldExclude: true` or a `releases` entry of `false` is not a configured workspace, so a scope that names one is reported.
|
|
141
143
|
|
|
142
|
-
The result that `prepare` returns includes these as `malformedBlocks`, `undeclaredEntryTypes`, `policyViolations` entries whose `surface` is `'entry'`, and `unroutedEntryScopes`, whether the target releases or is skipped. Because a block whose entries are all undeclared or excluded doesn't yield an item, the commit doesn't raise a bump.
|
|
144
|
+
The result that `prepare` returns includes these as `malformedBlocks`, `undeclaredEntryTypes`, `policyViolations` entries whose `surface` is `'entry'`, and `unroutedEntryScopes`, whether the target releases or is skipped. Because a block whose routed entries are all undeclared or excluded doesn't yield an item, the commit doesn't raise a bump.
|
|
143
145
|
|
|
144
146
|
## Release-notes injection
|
|
145
147
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@williamthorsen/release-kit",
|
|
3
|
-
"version": "14.2.
|
|
3
|
+
"version": "14.2.4",
|
|
4
4
|
"description": "Version-bumping and changelog-generation toolkit for release workflows",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"changelog",
|
|
@@ -51,12 +51,12 @@
|
|
|
51
51
|
],
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@williamthorsen/change-grammar": "0.2.1",
|
|
54
|
-
"@williamthorsen/nmr-core": "0.13.
|
|
54
|
+
"@williamthorsen/nmr-core": "0.13.5",
|
|
55
55
|
"@williamthorsen/toolbelt.errors": "0.8.3",
|
|
56
56
|
"json-stringify-pretty-compact": "4.0.0",
|
|
57
57
|
"semver": "7.8.5",
|
|
58
58
|
"yaml": "2.9.1",
|
|
59
|
-
"zod": "4.6.
|
|
59
|
+
"zod": "4.6.7"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/semver": "7.8.0",
|