@williamthorsen/release-kit 13.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.
- package/.meta/changelog.json +17 -0
- package/.readyup/kits/default.js +1 -1
- package/.readyup/manifest.json +2 -2
- package/CHANGELOG.md +6 -0
- package/README.md +2 -33
- package/dist/esm/sync-labels/generateCommand.js +6 -1
- package/dist/esm/sync-labels/resolveLabels.js +1 -0
- package/dist/esm/sync-labels/types.d.ts +3 -1
- package/dist/esm/types.d.ts +7 -3
- package/dist/esm/types.js +1 -0
- package/docs/labels.md +16 -0
- package/package.json +1 -1
package/.meta/changelog.json
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
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
|
+
},
|
|
2
19
|
{
|
|
3
20
|
"version": "13.0.0",
|
|
4
21
|
"date": "2026-10-01",
|
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": "13.
|
|
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
|
}
|
package/.readyup/manifest.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"path": "kits/default.ts"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
|
-
"hash": "
|
|
16
|
+
"hash": "fd27a632",
|
|
17
17
|
"kind": "inline",
|
|
18
18
|
"path": "../package.json",
|
|
19
19
|
"paths": [
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"readyupVersion": "0.38.0",
|
|
47
47
|
"source": "kits/default.ts",
|
|
48
48
|
"sourceHash": "91bc3638",
|
|
49
|
-
"targetHash": "
|
|
49
|
+
"targetHash": "a3266cf2"
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
"checklists": [
|
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
|
+
## 13.1.0 â 2026-10-02
|
|
6
|
+
|
|
7
|
+
### ð Features
|
|
8
|
+
|
|
9
|
+
- 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)
|
|
10
|
+
|
|
5
11
|
## 13.0.0 â 2026-10-01
|
|
6
12
|
|
|
7
13
|
### ð Features
|
package/README.md
CHANGED
|
@@ -7,42 +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 â v13.
|
|
10
|
+
## Release notes â v13.1.0 (2026-10-02)
|
|
11
11
|
|
|
12
12
|
### ð Features
|
|
13
13
|
|
|
14
|
-
- Adds
|
|
15
|
-
- 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)
|
|
16
|
-
- 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)
|
|
17
|
-
- 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)
|
|
18
|
-
- 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)
|
|
19
|
-
- 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)
|
|
20
|
-
|
|
21
|
-
### ðŠĶ Removed
|
|
22
|
-
|
|
23
|
-
- ðĻ **Breaking:** Removes `required` as a `breakingPolicies` value, making `drop` default to `optional` so that an unmarked `drop:` commit no longer reports a policy violation. (#905)
|
|
24
|
-
- 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)
|
|
25
|
-
- 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)
|
|
26
|
-
|
|
27
|
-
### ð Bug fixes
|
|
28
|
-
|
|
29
|
-
- Record a changelog entry for a forced release whose commits yield no item (#887)
|
|
30
|
-
|
|
31
|
-
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.
|
|
32
|
-
|
|
33
|
-
- 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)
|
|
34
|
-
- 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)
|
|
35
|
-
- 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)
|
|
36
|
-
- 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)
|
|
37
|
-
- 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)
|
|
38
|
-
- 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)
|
|
39
|
-
- 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)
|
|
40
|
-
- 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)
|
|
41
|
-
- 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)
|
|
42
|
-
- 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)
|
|
43
|
-
- 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)
|
|
44
|
-
- 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)
|
|
45
|
-
- 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)
|
|
14
|
+
- 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)
|
|
46
15
|
<!-- /section:release-notes -->
|
|
47
16
|
|
|
48
17
|
## Installation
|
|
@@ -15,7 +15,12 @@ export function formatLabelsYaml(labels, presetHashes, configFilePath = CONFIG_F
|
|
|
15
15
|
for (const [name, hash] of sortedPresetHashes) {
|
|
16
16
|
headerLines.push(`# ${name} preset hash: ${hash}`);
|
|
17
17
|
}
|
|
18
|
-
const declared = labels.map((
|
|
18
|
+
const declared = labels.map(({ archived, color, description, name }) => ({
|
|
19
|
+
name,
|
|
20
|
+
color,
|
|
21
|
+
description: description ?? '',
|
|
22
|
+
...(archived !== undefined && { archived }),
|
|
23
|
+
}));
|
|
19
24
|
const yamlBody = stringify(declared, { singleQuote: true, lineWidth: 0 });
|
|
20
25
|
return headerLines.join('\n') + '\n' + yamlBody;
|
|
21
26
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** A single GitHub label definition
|
|
1
|
+
/** A single GitHub label definition, as `sync-labels generate` writes it to `.github/labels.yaml`. */
|
|
2
2
|
export interface LabelDefinition {
|
|
3
3
|
/** Display name of the label. */
|
|
4
4
|
name: string;
|
|
@@ -6,4 +6,6 @@ export interface LabelDefinition {
|
|
|
6
6
|
color: string;
|
|
7
7
|
/** Short description shown in the GitHub UI. Absent when the label has none. */
|
|
8
8
|
description?: string;
|
|
9
|
+
/** Marks the label for the sync to archive rather than keep active. Absent for an active label. */
|
|
10
|
+
archived?: true;
|
|
9
11
|
}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -446,11 +446,13 @@ export declare const breakingPolicyValueSchema: z.ZodEnum<{
|
|
|
446
446
|
export declare const labelSpecSchema: z.ZodObject<{
|
|
447
447
|
color: z.ZodString;
|
|
448
448
|
description: z.ZodOptional<z.ZodString>;
|
|
449
|
+
archived: z.ZodOptional<z.ZodLiteral<true>>;
|
|
449
450
|
}, z.core.$strict>;
|
|
450
451
|
/**
|
|
451
|
-
* A label's color and optional
|
|
452
|
-
* An omitted description resolves to empty, which the generated labels file declares explicitly
|
|
453
|
-
* clears whatever description the label has on the repo.
|
|
452
|
+
* A label's color, optional description, and optional archived mark; the name is the record key in
|
|
453
|
+
* `repoLabels.labels`. An omitted description resolves to empty, which the generated labels file declares explicitly
|
|
454
|
+
* so that a sync clears whatever description the label has on the repo. `archived: true` retires the label: The sync
|
|
455
|
+
* archives it, keeping it on the issues and pull requests that have it.
|
|
454
456
|
*/
|
|
455
457
|
export type LabelSpec = z.infer<typeof labelSpecSchema>;
|
|
456
458
|
/**
|
|
@@ -468,6 +470,7 @@ export declare const repoLabelsSchema: z.ZodObject<{
|
|
|
468
470
|
labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNullable<z.ZodObject<{
|
|
469
471
|
color: z.ZodString;
|
|
470
472
|
description: z.ZodOptional<z.ZodString>;
|
|
473
|
+
archived: z.ZodOptional<z.ZodLiteral<true>>;
|
|
471
474
|
}, z.core.$strict>>>>;
|
|
472
475
|
}, z.core.$strict>;
|
|
473
476
|
/** Consumer-facing `repoLabels` block: bundled presets to extend plus per-name adjustments. */
|
|
@@ -496,6 +499,7 @@ export declare const releaseKitConfigSchema: z.ZodObject<{
|
|
|
496
499
|
labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNullable<z.ZodObject<{
|
|
497
500
|
color: z.ZodString;
|
|
498
501
|
description: z.ZodOptional<z.ZodString>;
|
|
502
|
+
archived: z.ZodOptional<z.ZodLiteral<true>>;
|
|
499
503
|
}, z.core.$strict>>>>;
|
|
500
504
|
}, z.core.$strict>>;
|
|
501
505
|
retiredPackages: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
package/dist/esm/types.js
CHANGED
package/docs/labels.md
CHANGED
|
@@ -42,6 +42,20 @@ Names match case-insensitively, as GitHub matches them: `Bug` in the `labels` re
|
|
|
42
42
|
|
|
43
43
|
Overlaps between layers are never errors; order resolves them, and the committed `.github/labels.yaml` diff shows any unexpected change at review. Two misstatements are config errors, because neither is visible in the output diff: a dangling `null`, which removes a name not defined by any preset, and `labels` keys that differ only in case, all but one of which the fold would discard.
|
|
44
44
|
|
|
45
|
+
### Retiring a label
|
|
46
|
+
|
|
47
|
+
Mark a label `archived: true` to retire it without losing its history:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
labels: {
|
|
51
|
+
'scope:basic': { color: '00ff96', archived: true }, // retire the scope of a removed package
|
|
52
|
+
},
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The sync workflow archives a marked label rather than deleting it. An archived label stays on the issues and pull requests that have it, but it cannot be added to new ones and does not appear in the label picker. Removing the mark unarchives the label on the next sync. Removing the entry instead deletes the label, as the sync deletes every label that `.github/labels.yaml` does not declare, and the label disappears from every issue and pull request that had it.
|
|
56
|
+
|
|
57
|
+
The mark is set only in the `labels` record, not in a preset. To retire a preset's label, replace it with an entry that restates its color and adds the mark.
|
|
58
|
+
|
|
45
59
|
### When labels are applied
|
|
46
60
|
|
|
47
61
|
The scaffolded workflow declares three triggers:
|
|
@@ -56,6 +70,8 @@ Applying on merge closes the window in which a regenerated `.github/labels.yaml`
|
|
|
56
70
|
|
|
57
71
|
The `check` job runs the same sync in dry-run. Its **Label diff** log group lists every create, edit, rename, and deletion that the sync would perform, including deletions of labels that the file does not declare: the destructive edits that a diff of `.github/labels.yaml` alone cannot show, because a label created by hand or by another workflow is absent from the file both before and after. Read that log; the check reports success whether or not the diff is destructive, so a green check is not evidence that nothing will be deleted.
|
|
58
72
|
|
|
73
|
+
Its **Archive state** log group lists each label that the sync would archive or unarchive. Archiving runs after the rest of the sync, so a label that the file both adds and marks is created and then archived.
|
|
74
|
+
|
|
59
75
|
The two jobs are split because a job's permissions are fixed when the run is created and cannot vary by trigger. The split keeps a write-scoped token out of pull-request runs.
|
|
60
76
|
|
|
61
77
|
The push trigger filters on the path alone; the `sync` job compares `github.ref_name` against the repository's default branch. The workflow therefore doesn't need a per-repo edit, whatever that branch is named, and a push touching `.github/labels.yaml` on any other branch produces a run whose jobs all skip.
|