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