@williamthorsen/release-kit 11.0.0 → 13.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.
- package/.meta/changelog.json +274 -2
- package/.readyup/kits/default.js +18 -33
- package/.readyup/kits/npm-auto-publish.js +24 -23
- package/.readyup/manifest.json +16 -11
- package/CHANGELOG.md +98 -0
- package/README.md +57 -69
- package/bin/release-kit.js +1 -1
- package/dist/esm/assertCleanWorkingTree.d.ts +1 -5
- package/dist/esm/assertTaggedBaseline.d.ts +29 -0
- package/dist/esm/assertTaggedBaseline.js +41 -0
- package/dist/esm/attachChangelogDiagnostics.d.ts +4 -0
- package/dist/esm/attachChangelogDiagnostics.js +14 -0
- package/dist/esm/bin/release-kit.js +88 -24
- package/dist/esm/buildChangelogEntries.d.ts +69 -17
- package/dist/esm/buildChangelogEntries.js +222 -120
- package/dist/esm/buildDependencyGraph.d.ts +6 -6
- package/dist/esm/buildEmptyReleaseEntry.d.ts +1 -8
- package/dist/esm/buildReleaseSummary.d.ts +2 -8
- package/dist/esm/buildReleaseSummary.js +2 -2
- package/dist/esm/buildSyntheticChangelogEntry.d.ts +3 -5
- package/dist/esm/buildSyntheticChangelogEntry.js +2 -2
- package/dist/esm/bumpVersion.d.ts +1 -8
- package/dist/esm/changelogJsonFile.d.ts +5 -7
- package/dist/esm/changelogJsonFile.js +2 -17
- package/dist/esm/changelogJsonUtils.d.ts +7 -10
- package/dist/esm/changelogOverrides.d.ts +79 -100
- package/dist/esm/changelogOverrides.js +138 -58
- package/dist/esm/classifyChangelogCommit.d.ts +36 -0
- package/dist/esm/classifyChangelogCommit.js +34 -0
- package/dist/esm/commitCommand.d.ts +2 -4
- package/dist/esm/compareVersions.d.ts +10 -4
- package/dist/esm/compareVersions.js +16 -0
- package/dist/esm/configFlagSchema.d.ts +1 -1
- package/dist/esm/createGithubRelease.d.ts +7 -19
- package/dist/esm/createGithubReleaseCommand.d.ts +5 -5
- package/dist/esm/createGithubReleaseCommand.js +9 -9
- package/dist/esm/createTags.d.ts +2 -3
- package/dist/esm/decideRelease.d.ts +11 -41
- package/dist/esm/decideRelease.js +5 -27
- package/dist/esm/defaults.d.ts +5 -24
- package/dist/esm/defaults.js +7 -5
- package/dist/esm/defineConfig.d.ts +1 -1
- package/dist/esm/deleteFileIfExists.d.ts +1 -1
- package/dist/esm/deriveReleaseNotesConfig.d.ts +20 -0
- package/dist/esm/deriveReleaseNotesConfig.js +21 -0
- package/dist/esm/deriveWorkspaceConfig.d.ts +3 -5
- package/dist/esm/detectPackageManager.d.ts +2 -4
- package/dist/esm/detectUndeclaredTagPrefixes.d.ts +4 -6
- package/dist/esm/detectUndeclaredTagPrefixes.js +1 -1
- package/dist/esm/determineBumpType.d.ts +11 -11
- package/dist/esm/determineBumpType.js +6 -7
- package/dist/esm/discoverWorkspaces.d.ts +14 -15
- package/dist/esm/discoverWorkspaces.js +12 -12
- package/dist/esm/enterRepoRoot.d.ts +12 -0
- package/dist/esm/enterRepoRoot.js +16 -0
- package/dist/esm/enumerateReleaseWindows.d.ts +50 -0
- package/dist/esm/enumerateReleaseWindows.js +124 -0
- package/dist/esm/extractMigration.d.ts +6 -8
- package/dist/esm/findUnroutedEntryScopes.d.ts +16 -0
- package/dist/esm/findUnroutedEntryScopes.js +57 -0
- package/dist/esm/formatExcludedSkip.d.ts +3 -0
- package/dist/esm/formatExcludedSkip.js +3 -0
- package/dist/esm/formatPrivateSkip.d.ts +1 -6
- package/dist/esm/generateChangelogs.d.ts +13 -26
- package/dist/esm/generateChangelogs.js +0 -14
- package/dist/esm/glyphs.d.ts +2 -2
- package/dist/esm/help/prepareHelp.d.ts +3 -4
- package/dist/esm/help/prepareHelp.js +7 -8
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/init/checks.d.ts +3 -3
- package/dist/esm/init/checks.js +4 -1
- package/dist/esm/init/detectRepoType.d.ts +2 -3
- package/dist/esm/init/hasProvenance.d.ts +2 -0
- package/dist/esm/init/hasProvenance.js +3 -0
- package/dist/esm/init/initCommand.d.ts +3 -6
- package/dist/esm/init/initCommand.js +11 -11
- package/dist/esm/init/parseJsonRecord.d.ts +1 -4
- package/dist/esm/init/scaffold.d.ts +1 -3
- package/dist/esm/init/scaffold.js +2 -30
- package/dist/esm/init/templates.d.ts +9 -11
- package/dist/esm/init/templates.js +12 -11
- package/dist/esm/init/updateTemplatesCommand.d.ts +13 -0
- package/dist/esm/init/updateTemplatesCommand.js +64 -0
- package/dist/esm/injectReleaseNotesIntoReadme.d.ts +12 -17
- package/dist/esm/injectSection.d.ts +3 -3
- package/dist/esm/loadConfig.d.ts +16 -14
- package/dist/esm/loadConfig.js +2 -5
- package/dist/esm/loadValidatedConfig.d.ts +16 -19
- package/dist/esm/loadValidatedConfig.js +6 -1
- package/dist/esm/packsPath.d.ts +9 -9
- package/dist/esm/parseChangeRecordBlock.d.ts +37 -0
- package/dist/esm/parseChangeRecordBlock.js +134 -0
- package/dist/esm/parseCommitMessage.d.ts +42 -32
- package/dist/esm/parseCommitMessage.js +33 -41
- package/dist/esm/parseRequestedTags.d.ts +3 -3
- package/dist/esm/planReleaseNotesPreviews.d.ts +6 -6
- package/dist/esm/planVersionBump.d.ts +5 -3
- package/dist/esm/planVersionBump.js +3 -0
- package/dist/esm/prepareCommand.d.ts +4 -7
- package/dist/esm/prepareCommand.js +17 -18
- package/dist/esm/previewTagPrefixes.d.ts +8 -10
- package/dist/esm/propagateBumps.d.ts +6 -7
- package/dist/esm/publish.d.ts +1 -1
- package/dist/esm/publishCommand.d.ts +4 -3
- package/dist/esm/publishCommand.js +8 -8
- package/dist/esm/pushCommand.d.ts +4 -3
- package/dist/esm/pushCommand.js +8 -2
- package/dist/esm/pushRelease.d.ts +2 -2
- package/dist/esm/readChangelogSections.d.ts +33 -0
- package/dist/esm/readChangelogSections.js +80 -0
- package/dist/esm/releaseFiles.d.ts +5 -7
- package/dist/esm/releasePlan.d.ts +11 -13
- package/dist/esm/releasePrepare.d.ts +25 -25
- package/dist/esm/releasePrepare.js +80 -80
- package/dist/esm/releasePrepareMono.d.ts +9 -7
- package/dist/esm/releasePrepareMono.js +114 -99
- package/dist/esm/releasePrepareProject.d.ts +19 -29
- package/dist/esm/releasePrepareProject.js +46 -45
- package/dist/esm/renderChangelogMarkdown.d.ts +10 -4
- package/dist/esm/renderChangelogMarkdown.js +27 -2
- package/dist/esm/renderReleaseNotes.d.ts +3 -11
- package/dist/esm/renderReleaseNotes.js +2 -6
- package/dist/esm/reportPrepare.d.ts +4 -5
- package/dist/esm/reportPrepare.js +67 -42
- package/dist/esm/resolveCommandTags.d.ts +15 -11
- package/dist/esm/resolveCommandTags.js +35 -5
- package/dist/esm/resolveConfigFlag.d.ts +7 -0
- package/dist/esm/resolveConfigFlag.js +4 -0
- package/dist/esm/resolveReleaseTags.d.ts +6 -8
- package/dist/esm/resolveReleaseTags.js +1 -1
- package/dist/esm/resolveStylesOrExit.d.ts +2 -2
- package/dist/esm/showTagPrefixesCommand.d.ts +7 -10
- package/dist/esm/showTagPrefixesCommand.js +4 -4
- package/dist/esm/stripEmojiPrefix.d.ts +1 -0
- package/dist/esm/stripScope.d.ts +2 -2
- package/dist/esm/stripScope.js +3 -3
- package/dist/esm/sync-labels/generateCommand.d.ts +11 -10
- package/dist/esm/sync-labels/generateCommand.js +11 -8
- package/dist/esm/sync-labels/initCommand.d.ts +6 -7
- package/dist/esm/sync-labels/initCommand.js +2 -2
- package/dist/esm/sync-labels/presets.d.ts +5 -4
- package/dist/esm/sync-labels/presets.js +9 -9
- package/dist/esm/sync-labels/resolveLabels.d.ts +7 -7
- package/dist/esm/sync-labels/resolveLabels.js +1 -1
- package/dist/esm/sync-labels/retiredConfig.d.ts +4 -5
- package/dist/esm/sync-labels/syncCommand.d.ts +1 -4
- package/dist/esm/sync-labels/templates.d.ts +3 -3
- package/dist/esm/sync-labels/templates.js +3 -3
- package/dist/esm/sync-labels/typeLabels.d.ts +14 -0
- package/dist/esm/sync-labels/typeLabels.js +38 -0
- package/dist/esm/sync-labels/types.d.ts +1 -1
- package/dist/esm/tagCommand.d.ts +1 -1
- package/dist/esm/typeGuards.d.ts +2 -2
- package/dist/esm/types.d.ts +185 -116
- package/dist/esm/types.js +2 -2
- package/dist/esm/validateConfig.d.ts +2 -11
- package/dist/esm/validateConfig.js +5 -1
- package/dist/esm/validateOnlyExcludesStrandedDependents.d.ts +14 -12
- package/dist/esm/validateOverridesCommand.d.ts +19 -21
- package/dist/esm/validateOverridesCommand.js +16 -23
- package/docs/api.md +6 -6
- package/docs/changelogs.md +90 -28
- package/docs/configuration.md +30 -29
- package/docs/editorial-overrides.md +90 -31
- package/docs/labels.md +21 -19
- package/docs/project-releases.md +14 -14
- package/docs/publishing.md +5 -5
- package/docs/readiness-checks.md +3 -3
- package/docs/releasing.md +54 -24
- package/docs/work-types.md +46 -58
- package/package.json +7 -7
- package/presets/labels/common.yaml +1 -41
- package/schemas/changelog-overrides.json +39 -0
- package/cliff.toml.template +0 -65
- package/dist/esm/collectPolicyViolations.d.ts +0 -15
- package/dist/esm/collectPolicyViolations.js +0 -12
- package/dist/esm/determineBumpFromCommits.d.ts +0 -17
- package/dist/esm/determineBumpFromCommits.js +0 -28
- package/dist/esm/getCommitsSinceTarget.d.ts +0 -21
- package/dist/esm/getCommitsSinceTarget.js +0 -66
- package/dist/esm/resolveCliffConfigPath.d.ts +0 -11
- package/dist/esm/resolveCliffConfigPath.js +0 -20
- package/dist/esm/resolveReleaseNotesConfig.d.ts +0 -26
- package/dist/esm/resolveReleaseNotesConfig.js +0 -29
- package/dist/esm/runGitCliff.d.ts +0 -38
- package/dist/esm/runGitCliff.js +0 -25
- package/dist/esm/workTypesData.d.ts +0 -50
- package/dist/esm/workTypesData.js +0 -145
- package/schemas/label-map.json +0 -24
package/.meta/changelog.json
CHANGED
|
@@ -1,4 +1,276 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "13.0.0",
|
|
4
|
+
"date": "2026-10-01",
|
|
5
|
+
"sections": [
|
|
6
|
+
{
|
|
7
|
+
"title": "🎉 Features",
|
|
8
|
+
"audience": "all",
|
|
9
|
+
"items": [
|
|
10
|
+
{
|
|
11
|
+
"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)",
|
|
12
|
+
"hash": "6aea08cf0154f2d1cc253a44cd9b09c283ad3248",
|
|
13
|
+
"entry": 2
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"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)",
|
|
17
|
+
"hash": "066c6bde1ad4fda6705066f538283e9c80a92a1e",
|
|
18
|
+
"entry": 1
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"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)",
|
|
22
|
+
"hash": "066c6bde1ad4fda6705066f538283e9c80a92a1e",
|
|
23
|
+
"entry": 2
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"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)",
|
|
27
|
+
"hash": "066c6bde1ad4fda6705066f538283e9c80a92a1e",
|
|
28
|
+
"entry": 3
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"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)",
|
|
32
|
+
"hash": "9fac96675e9fb4dd70407cbfb0e3e0ffa7e83ba4",
|
|
33
|
+
"entry": 1
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"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)",
|
|
37
|
+
"hash": "9fac96675e9fb4dd70407cbfb0e3e0ffa7e83ba4",
|
|
38
|
+
"entry": 3
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"title": "🪦 Removed",
|
|
44
|
+
"audience": "all",
|
|
45
|
+
"items": [
|
|
46
|
+
{
|
|
47
|
+
"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)",
|
|
48
|
+
"breaking": true,
|
|
49
|
+
"migration": "Remove each `'required'` value from `breakingPolicies` in `release-kit.config.ts`, or replace it with `'optional'`.",
|
|
50
|
+
"hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
|
|
51
|
+
"entry": 1
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"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)",
|
|
55
|
+
"migration": "Rewrite a combined subject such as `web|feat(other): ...` as `web|feat: ...`, and follow the colon with a space and a title.",
|
|
56
|
+
"hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
|
|
57
|
+
"entry": 2
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"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)",
|
|
61
|
+
"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.",
|
|
62
|
+
"hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
|
|
63
|
+
"entry": 3
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"title": "🐛 Bug fixes",
|
|
69
|
+
"audience": "all",
|
|
70
|
+
"items": [
|
|
71
|
+
{
|
|
72
|
+
"description": "Record a changelog entry for a forced release whose commits yield no item (#887)",
|
|
73
|
+
"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.",
|
|
74
|
+
"hash": "e806c32a4f412abde5d7ab22f150506e946b3a87"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"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)",
|
|
78
|
+
"hash": "d60ac32b7452b850c98571017e5f7f373479fc10",
|
|
79
|
+
"entry": 1
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"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)",
|
|
83
|
+
"hash": "d60ac32b7452b850c98571017e5f7f373479fc10",
|
|
84
|
+
"entry": 2
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"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)",
|
|
88
|
+
"hash": "97af8314da5dfe135c680310eb79f8309bc9918e",
|
|
89
|
+
"entry": 1
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"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)",
|
|
93
|
+
"hash": "97af8314da5dfe135c680310eb79f8309bc9918e",
|
|
94
|
+
"entry": 2
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"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)",
|
|
98
|
+
"hash": "6aea08cf0154f2d1cc253a44cd9b09c283ad3248",
|
|
99
|
+
"entry": 1
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"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)",
|
|
103
|
+
"hash": "9316ba5903b330895e258786d0fc7de005554cae",
|
|
104
|
+
"entry": 1
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"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)",
|
|
108
|
+
"hash": "9316ba5903b330895e258786d0fc7de005554cae",
|
|
109
|
+
"entry": 2
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"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)",
|
|
113
|
+
"hash": "ccdb3aa585d6fb36b2994cceb59df54caea12a79",
|
|
114
|
+
"entry": 1
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"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)",
|
|
118
|
+
"hash": "9c0ef936a0d5b91fe64c5a1ea1be258f1678ea62",
|
|
119
|
+
"entry": 1
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"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)",
|
|
123
|
+
"hash": "22ae182082e683ef94bf59db3bd23ca2c5b72c1f",
|
|
124
|
+
"entry": 1
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"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)",
|
|
128
|
+
"hash": "dc1c4bd4b05425ed1c2a7d031105c402c3d01f20",
|
|
129
|
+
"entry": 1
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"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)",
|
|
133
|
+
"hash": "5a4771a1cb1e1b324a9ce3cb64fc3527199946a7",
|
|
134
|
+
"entry": 1
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"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)",
|
|
138
|
+
"hash": "9fac96675e9fb4dd70407cbfb0e3e0ffa7e83ba4",
|
|
139
|
+
"entry": 4
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"title": "♻️ Refactoring",
|
|
145
|
+
"audience": "dev",
|
|
146
|
+
"items": [
|
|
147
|
+
{
|
|
148
|
+
"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)",
|
|
149
|
+
"hash": "e2b4e44f37a3f8254a42d98f67bc2f15d9e6c2c5",
|
|
150
|
+
"entry": 1
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"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)",
|
|
154
|
+
"hash": "3ccdc8960988b71c2b9ce065f2889cf741c44721",
|
|
155
|
+
"entry": 4
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"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)",
|
|
159
|
+
"hash": "4680fb4e865ffce0bd135fac20d49b766b156992",
|
|
160
|
+
"entry": 1
|
|
161
|
+
}
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"title": "🧪 Tests",
|
|
166
|
+
"audience": "dev",
|
|
167
|
+
"items": [
|
|
168
|
+
{
|
|
169
|
+
"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)",
|
|
170
|
+
"hash": "eaf3782e606b98ba360cde9eab08770e27155d2b",
|
|
171
|
+
"entry": 1
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"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)",
|
|
175
|
+
"hash": "c1d511c5ae570e75358cd642b90b4979723fe375",
|
|
176
|
+
"entry": 1
|
|
177
|
+
}
|
|
178
|
+
]
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"title": "📦 Dependencies",
|
|
182
|
+
"audience": "dev",
|
|
183
|
+
"items": [
|
|
184
|
+
{
|
|
185
|
+
"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)",
|
|
186
|
+
"hash": "6dffd5df5bc4209dc225d08390ef2b67fe381f1b",
|
|
187
|
+
"entry": 1
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"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)",
|
|
191
|
+
"hash": "6dffd5df5bc4209dc225d08390ef2b67fe381f1b",
|
|
192
|
+
"entry": 2
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"title": "📚 Documentation",
|
|
198
|
+
"audience": "dev",
|
|
199
|
+
"items": [
|
|
200
|
+
{
|
|
201
|
+
"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)",
|
|
202
|
+
"hash": "176d09caec47686fa0023a31c5f77d4e2362d9bb",
|
|
203
|
+
"entry": 1
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"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)",
|
|
207
|
+
"hash": "22ae182082e683ef94bf59db3bd23ca2c5b72c1f",
|
|
208
|
+
"entry": 2
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"version": "12.0.0",
|
|
216
|
+
"date": "2026-09-23",
|
|
217
|
+
"sections": [
|
|
218
|
+
{
|
|
219
|
+
"title": "🎉 Features",
|
|
220
|
+
"audience": "all",
|
|
221
|
+
"items": [
|
|
222
|
+
{
|
|
223
|
+
"description": "Assign changelog sections from the work-type taxonomy (#877)",
|
|
224
|
+
"body": "- Adds `excludedFromChangelog` to a `workTypes` entry, which keeps commits of that type out of every changelog while they still count toward the version bump.\n- Fixes the silent omission of a ticketed commit written as `type(scope):` or with a capitalized type such as `FEAT:`, which counted toward the version bump but reached no changelog.\n- Documents that a scaffolded `.config/git-cliff.toml` may vary its enumeration keys alone: a `commit_parsers` entry that skips or narrows drops the commit before classification, with no error.",
|
|
225
|
+
"hash": "52d4ea928d35b99101947e0509da6699f06f821a"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"description": "Build changelog items from a merge commit's change-record block (#882)",
|
|
229
|
+
"body": "Builds `release-kit` changelog items from a commit's `change-record` block, the fenced YAML block at the end of a squash-merge commit that lists the change's outcomes, so that a merge with several outcomes of different types yields one item per outcome, each under its own type's section. Makes `release-kit prepare` warn about a block that cannot be read, an entry whose type is undeclared, and an entry that violates its type's breaking policy. Keeps reading a commit with no usable block from its title, as before.",
|
|
230
|
+
"hash": "094aac7048a54b6f07d1c97cd37fff570630b936"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"description": "Derive the version bump from the changelog items (#885)",
|
|
234
|
+
"body": "Derives the version bump in every `release-kit prepare` path (single-package, project, and monorepo) from the changelog items of the unreleased commits, so that the bump and the changelog describe the same release. A commit that yields no changelog item no longer bumps, and a `BREAKING CHANGE:` footer no longer raises a major bump. Single-package mode now follows the monorepo rules for `--bump` and `--force`, and the `prepare` report shows the diagnostics of a skipped target.\n\nMigration: Mark a breaking change with a `!` on the commit subject or with `breaking: true` on its change-record entry, because a `BREAKING CHANGE:` footer alone now gets the bump of the commit's type. Give each commit that should bump a ticket-ID prefix and a type that the changelog does not exclude. In single-package mode, add `--force` to a release that used `--bump=X` alone, or that relied on the patch floor, when no commit yields a changelog item; without it, `prepare` skips the release.",
|
|
235
|
+
"breaking": true,
|
|
236
|
+
"migration": "Mark a breaking change with a `!` on the commit subject or with `breaking: true` on its change-record entry, because a `BREAKING CHANGE:` footer alone now gets the bump of the commit's type. Give each commit that should bump a ticket-ID prefix and a type that the changelog does not exclude. In single-package mode, add `--force` to a release that used `--bump=X` alone, or that relied on the patch floor, when no commit yields a changelog item; without it, `prepare` skips the release.",
|
|
237
|
+
"hash": "f3d0d8f01d6cd5b5638012a4798e64ab3a3def6d"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"description": "Key an editorial override to one of several items on a commit (#886)",
|
|
241
|
+
"body": "Adds the `<hash>:<n>` key to `.meta/changelog-overrides.json`. It targets one of the several changelog items that a commit's change-record block yields, while a bare `<hash>` key still targets all of them. Also makes `release-kit prepare` and `release-kit overrides validate` fail when override keys conflict on an item, and publishes a JSON Schema for the override file.\n\nMigration: Replace a bare key that sets `description` or `body` on a commit with several items with one `<hash>:<n>` key per item, as listed by the error message. Where two keys match the same item, such as `abc1234` beside `abc1234:2`, remove one of them. This includes a root-file key that overlaps a workspace-file key, which now fails even though the two files are separate. In each scope passed to `validateAllChangelogOverrides`, rename `hashes` to `items` and pass `OverrideTargetItem` objects (`{ hash, entry? }`) instead of hash strings.",
|
|
242
|
+
"breaking": true,
|
|
243
|
+
"migration": "Replace a bare key that sets `description` or `body` on a commit with several items with one `<hash>:<n>` key per item, as listed by the error message. Where two keys match the same item, such as `abc1234` beside `abc1234:2`, remove one of them. This includes a root-file key that overlaps a workspace-file key, which now fails even though the two files are separate. In each scope passed to `validateAllChangelogOverrides`, rename `hashes` to `items` and pass `OverrideTargetItem` objects (`{ hash, entry? }`) instead of hash strings.",
|
|
244
|
+
"hash": "f90db5596196e501fef1734bcd978d23f9a0540a"
|
|
245
|
+
}
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"title": "🪦 Removed",
|
|
250
|
+
"audience": "all",
|
|
251
|
+
"items": [
|
|
252
|
+
{
|
|
253
|
+
"description": "Build changelogs from release-kit's own enumeration and remove git-cliff (#880)",
|
|
254
|
+
"body": "Removes git-cliff from `@williamthorsen/release-kit`: `prepare` now builds every changelog from the same commit history that decides each version bump, and no longer fetches a git-cliff binary through `npx`. A config that still sets `cliffConfigPath` now fails validation. Two ways in which the changelog and the bump read different commits are gone, affecting single-package repositories with a tag prefix other than `v` and `paths` entries that name a bare directory.\n\nMigration: Remove `cliffConfigPath` from `.config/release-kit.config.ts`, and delete `.config/git-cliff.toml` or `cliff.toml` if the repository has one. Any customization in that file, such as `tag_pattern` or its tag-skipping keys, no longer has an effect: `release-kit` now splits the changelog on the configured tag prefixes alone.",
|
|
255
|
+
"breaking": true,
|
|
256
|
+
"migration": "Remove `cliffConfigPath` from `.config/release-kit.config.ts`, and delete `.config/git-cliff.toml` or `cliff.toml` if the repository has one. Any customization in that file, such as `tag_pattern` or its tag-skipping keys, no longer has an effect: `release-kit` now splits the changelog on the configured tag prefixes alone.",
|
|
257
|
+
"hash": "3dc091ff6067f1c2cbe1576a55114c481294ce22"
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"title": "🏗️ Internal features",
|
|
263
|
+
"audience": "dev",
|
|
264
|
+
"items": [
|
|
265
|
+
{
|
|
266
|
+
"description": "Enumerate release windows and read them on the bump path (#879)",
|
|
267
|
+
"body": "Adds `enumerateReleaseWindows`, which splits the history reachable from HEAD into release windows from tag prefixes and a path list, and rebuilds `getCommitsSinceTarget` on the newest of those windows in place of its `git describe` baseline lookup. Leaves the changelog on git-cliff's enumeration.",
|
|
268
|
+
"hash": "30586d1e045ed69dbf81a1c35773c97b89e0c8dc"
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
]
|
|
273
|
+
},
|
|
2
274
|
{
|
|
3
275
|
"version": "11.0.0",
|
|
4
276
|
"date": "2026-09-22",
|
|
@@ -408,7 +680,7 @@
|
|
|
408
680
|
},
|
|
409
681
|
{
|
|
410
682
|
"description": "Adopt `isError` and consolidate errno narrowing on a shared helper (#697)",
|
|
411
|
-
"body": "Replaces every hand-rolled `instanceof Error` narrowing with `hasErrnoCode`, a new predicate exported from `@williamthorsen/nmr-core`, or with `isError` from `@williamthorsen/toolbelt.errors`. Previously the errno question was answered by inline copies alongside two private helpers of differing shape; both helpers are removed.\
|
|
683
|
+
"body": "Replaces every hand-rolled `instanceof Error` narrowing with `hasErrnoCode`, a new predicate exported from `@williamthorsen/nmr-core`, or with `isError` from `@williamthorsen/toolbelt.errors`. Previously the errno question was answered by inline copies alongside two private helpers of differing shape; both helpers are removed.\n\nSeparately, `eslint.config.ts` now bans `instanceof Error` in every position rather than in a ternary alone.",
|
|
412
684
|
"hash": "c5e8e8a5e006b451e8c5aeea75d35772926d503c"
|
|
413
685
|
}
|
|
414
686
|
]
|
|
@@ -529,7 +801,7 @@
|
|
|
529
801
|
},
|
|
530
802
|
{
|
|
531
803
|
"description": "Make prepare all-or-nothing and report the tags file by path (#601)",
|
|
532
|
-
"body": "Fixes an issue where a failed `prepare` could leave the release flow in a broken intermediate state. A release now lands completely or not at all, and a formatting failure no longer discards one that already landed. When a write fails partway, the error names every file that reached disk, every file that did not, and the commands that undo them.\
|
|
804
|
+
"body": "Fixes an issue where a failed `prepare` could leave the release flow in a broken intermediate state. A release now lands completely or not at all, and a formatting failure no longer discards one that already landed. When a write fails partway, the error names every file that reached disk, every file that did not, and the commands that undo them.\n\n`commit` and `tag` now report the full path of the tags file they looked for, and distinguish a missing file from one that could not be read, so that running from the wrong directory or worktree is no longer reported as a release that never happened.\n\nRuns with `--with-release-notes` now list the preview files they write, and `--dry-run` names the ones a real run would write.",
|
|
533
805
|
"hash": "83ac6e45cf9d4b5371650cda42d7830ed4988660"
|
|
534
806
|
}
|
|
535
807
|
]
|
package/.readyup/kits/default.js
CHANGED
|
@@ -98,7 +98,7 @@ function translateGlob(pattern) {
|
|
|
98
98
|
|
|
99
99
|
// .readyup/kits/default.ts
|
|
100
100
|
function getMinVersion() {
|
|
101
|
-
const picked = { "version": "
|
|
101
|
+
const picked = { "version": "13.0.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,11 +114,10 @@ var CONFIG_EXPORT_PATTERNS = [
|
|
|
114
114
|
/export\s*\{[^}]*\b(?:config|default)\b[^}]*\}/,
|
|
115
115
|
/export\s*\*/
|
|
116
116
|
];
|
|
117
|
-
var
|
|
118
|
-
var
|
|
119
|
-
var
|
|
120
|
-
var
|
|
121
|
-
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";
|
|
122
121
|
var PUBLISH_WORKFLOW_HASH_MONOREPO = "0afa9ffe914f3dc8f043e68252ebc604c8cc1a953422fcea37a909a4def370ee";
|
|
123
122
|
var PUBLISH_WORKFLOW_HASH_SINGLE = "6f31183e0a1e66be791a19266c3b028dadbd9fe010f7fc4452f3f8970c937b43";
|
|
124
123
|
var CREATE_GITHUB_RELEASE_WORKFLOW_HASH_MONOREPO = "c455d88c93d855737c96079945ff729a9d094f846519c24afbefe83a425c1d7f";
|
|
@@ -161,14 +160,14 @@ var default_default = defineRdyKit({
|
|
|
161
160
|
const hash = detectRepoType() === "monorepo" ? RELEASE_WORKFLOW_HASH_MONOREPO : RELEASE_WORKFLOW_HASH_SINGLE;
|
|
162
161
|
return fileMatchesHash(".github/workflows/release.yaml", hash);
|
|
163
162
|
},
|
|
164
|
-
fix: "Run `release-kit
|
|
163
|
+
fix: "Run `release-kit update-templates` to regenerate release.yaml from the current template"
|
|
165
164
|
},
|
|
166
165
|
{
|
|
167
166
|
name: "release.yaml does not reference deprecated tag ref",
|
|
168
167
|
severity: "error",
|
|
169
168
|
quiet: true,
|
|
170
169
|
check: () => fileDoesNotContain(".github/workflows/release.yaml", /@(release|publish)-workflow-v[0-9]/),
|
|
171
|
-
fix: "Update release.yaml to use @workflow/release-v1 (run `release-kit
|
|
170
|
+
fix: "Update release.yaml to use @workflow/release-v1 (run `release-kit update-templates` to regenerate, or replace the ref manually)"
|
|
172
171
|
}
|
|
173
172
|
]
|
|
174
173
|
},
|
|
@@ -186,14 +185,14 @@ var default_default = defineRdyKit({
|
|
|
186
185
|
const hash = detectRepoType() === "monorepo" ? PUBLISH_WORKFLOW_HASH_MONOREPO : PUBLISH_WORKFLOW_HASH_SINGLE;
|
|
187
186
|
return fileMatchesHash(".github/workflows/publish.yaml", hash);
|
|
188
187
|
},
|
|
189
|
-
fix: "Run `release-kit
|
|
188
|
+
fix: "Run `release-kit update-templates` to regenerate publish.yaml from the current template"
|
|
190
189
|
},
|
|
191
190
|
{
|
|
192
191
|
name: "publish.yaml does not reference deprecated tag ref",
|
|
193
192
|
severity: "error",
|
|
194
193
|
quiet: true,
|
|
195
194
|
check: () => fileDoesNotContain(".github/workflows/publish.yaml", /@(release|publish)-workflow-v[0-9]/),
|
|
196
|
-
fix: "Update publish.yaml to use @workflow/publish-v1 (run `release-kit
|
|
195
|
+
fix: "Update publish.yaml to use @workflow/publish-v1 (run `release-kit update-templates` to regenerate, or replace the ref manually)"
|
|
197
196
|
}
|
|
198
197
|
]
|
|
199
198
|
},
|
|
@@ -205,14 +204,14 @@ var default_default = defineRdyKit({
|
|
|
205
204
|
const hash = detectRepoType() === "monorepo" ? CREATE_GITHUB_RELEASE_WORKFLOW_HASH_MONOREPO : CREATE_GITHUB_RELEASE_WORKFLOW_HASH_SINGLE;
|
|
206
205
|
return fileMatchesHash(".github/workflows/create-github-release.yaml", hash);
|
|
207
206
|
},
|
|
208
|
-
fix: "Run `release-kit
|
|
207
|
+
fix: "Run `release-kit update-templates` to regenerate create-github-release.yaml from the current template"
|
|
209
208
|
},
|
|
210
209
|
{
|
|
211
210
|
name: ".config/release-kit.config.ts exports a config",
|
|
212
211
|
severity: "error",
|
|
213
212
|
skip: () => !fileExists(".config/release-kit.config.ts") ? "no release-kit config file" : false,
|
|
214
213
|
check: () => configFileExportsConfig(),
|
|
215
|
-
fix: "Export the config from .config/release-kit.config.ts as a default export or as a named `config` export; release-kit
|
|
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",
|
|
216
215
|
checks: [
|
|
217
216
|
{
|
|
218
217
|
name: "releaseNotes config is consistent with changelogJson",
|
|
@@ -224,7 +223,7 @@ var default_default = defineRdyKit({
|
|
|
224
223
|
name: ".config/release-kit.config.ts uses defineConfig",
|
|
225
224
|
severity: "recommend",
|
|
226
225
|
check: () => fileContains(".config/release-kit.config.ts", /defineConfig/),
|
|
227
|
-
fix: "Wrap
|
|
226
|
+
fix: "Wrap the config export with defineConfig() from @williamthorsen/release-kit/config for type safety"
|
|
228
227
|
},
|
|
229
228
|
{
|
|
230
229
|
name: "releaseNotes.shouldInjectIntoReadme is true",
|
|
@@ -263,8 +262,9 @@ var default_default = defineRdyKit({
|
|
|
263
262
|
}
|
|
264
263
|
]
|
|
265
264
|
},
|
|
266
|
-
//
|
|
267
|
-
//
|
|
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.
|
|
268
268
|
{
|
|
269
269
|
name: "published packages ship CHANGELOG.md",
|
|
270
270
|
severity: "warn",
|
|
@@ -277,7 +277,7 @@ var default_default = defineRdyKit({
|
|
|
277
277
|
severity: "recommend",
|
|
278
278
|
skip: () => !hasPublishablePackages() ? "no publishable packages" : false,
|
|
279
279
|
check: () => changelogJsonIsEnabled(),
|
|
280
|
-
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",
|
|
281
281
|
checks: [
|
|
282
282
|
{
|
|
283
283
|
name: "published packages ship the changelog JSON",
|
|
@@ -296,13 +296,6 @@ var default_default = defineRdyKit({
|
|
|
296
296
|
check: () => fileDoesNotContain(".config/release-kit.config.ts", /shouldCreateGithubRelease/),
|
|
297
297
|
fix: "Remove 'shouldCreateGithubRelease' from .config/release-kit.config.ts. Adoption of GitHub Releases is now signaled by installing the create-github-release workflow, which `release-kit init` scaffolds."
|
|
298
298
|
},
|
|
299
|
-
{
|
|
300
|
-
name: "git-cliff not in devDependencies",
|
|
301
|
-
severity: "recommend",
|
|
302
|
-
quiet: true,
|
|
303
|
-
check: () => !hasDevDependency("git-cliff"),
|
|
304
|
-
fix: "pnpm remove git-cliff \u2014 release-kit handles changelog generation directly"
|
|
305
|
-
},
|
|
306
299
|
{
|
|
307
300
|
name: "@changesets/cli not in devDependencies",
|
|
308
301
|
severity: "recommend",
|
|
@@ -310,13 +303,6 @@ var default_default = defineRdyKit({
|
|
|
310
303
|
check: () => !hasDevDependency("@changesets/cli"),
|
|
311
304
|
fix: "pnpm remove @changesets/cli, then delete .changeset/ and any changeset:* scripts; release-kit supersedes changesets"
|
|
312
305
|
},
|
|
313
|
-
{
|
|
314
|
-
name: ".config/git-cliff.toml matches current template",
|
|
315
|
-
severity: "warn",
|
|
316
|
-
skip: () => !fileExists(".config/git-cliff.toml") ? "no local cliff config (using fallback)" : false,
|
|
317
|
-
check: () => fileMatchesHash(".config/git-cliff.toml", CLIFF_TEMPLATE_HASH),
|
|
318
|
-
fix: "Update .config/git-cliff.toml to match the current cliff.toml.template from release-kit, or delete it to use the bundled fallback"
|
|
319
|
-
},
|
|
320
306
|
{
|
|
321
307
|
name: "sync-labels.yaml workflow exists",
|
|
322
308
|
severity: "warn",
|
|
@@ -327,7 +313,7 @@ var default_default = defineRdyKit({
|
|
|
327
313
|
name: "sync-labels.yaml matches template",
|
|
328
314
|
severity: "warn",
|
|
329
315
|
check: () => fileMatchesHash(".github/workflows/sync-labels.yaml", SYNC_LABELS_WORKFLOW_HASH),
|
|
330
|
-
fix: "Run `release-kit
|
|
316
|
+
fix: "Run `release-kit update-templates` to regenerate the workflow from the current template"
|
|
331
317
|
}
|
|
332
318
|
]
|
|
333
319
|
},
|
|
@@ -336,7 +322,7 @@ var default_default = defineRdyKit({
|
|
|
336
322
|
severity: "error",
|
|
337
323
|
quiet: true,
|
|
338
324
|
check: () => fileDoesNotContain(".github/workflows/sync-labels.yaml", /@sync-labels-workflow-v[0-9]/),
|
|
339
|
-
fix: "Update sync-labels.yaml to use @workflow/sync-labels-v1 (run `release-kit
|
|
325
|
+
fix: "Update sync-labels.yaml to use @workflow/sync-labels-v1 (run `release-kit update-templates` to regenerate, or replace the ref manually)"
|
|
340
326
|
},
|
|
341
327
|
{
|
|
342
328
|
name: "retired .config/sync-labels.config.ts is absent",
|
|
@@ -425,7 +411,6 @@ function resolveChangelogJsonOutputPath() {
|
|
|
425
411
|
return match?.[1] ?? DEFAULT_CHANGELOG_JSON_PATH;
|
|
426
412
|
}
|
|
427
413
|
export {
|
|
428
|
-
CLIFF_TEMPLATE_HASH,
|
|
429
414
|
COMMON_PRESET_HASH,
|
|
430
415
|
CREATE_GITHUB_RELEASE_WORKFLOW_HASH_MONOREPO,
|
|
431
416
|
CREATE_GITHUB_RELEASE_WORKFLOW_HASH_SINGLE,
|
|
@@ -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
|
|
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
|
|
73
|
-
// root package.json
|
|
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
|
|
82
|
-
// suppresses the trusted-publisher rows
|
|
83
|
-
//
|
|
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.
|
|
98
|
-
// runner drops that `fix` silently,
|
|
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
|
-
|
|
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:
|
|
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: "
|
|
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
|
|
232
|
-
if (visibility === "public" && !
|
|
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
|
|
240
|
+
fix: "Set provenance: true in .github/workflows/publish.yaml; public repos should generate provenance attestations"
|
|
237
241
|
};
|
|
238
242
|
}
|
|
239
|
-
if (visibility === "private" &&
|
|
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
|
|
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);
|