@williamthorsen/release-kit 5.2.1 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +76 -26
  2. package/README.md +223 -31
  3. package/cliff.toml.template +4 -39
  4. package/dist/esm/.cache +1 -1
  5. package/dist/esm/bin/release-kit.js +59 -0
  6. package/dist/esm/buildChangelogEntries.js +6 -0
  7. package/dist/esm/buildEmptyReleaseEntry.d.ts +2 -0
  8. package/dist/esm/buildEmptyReleaseEntry.js +16 -0
  9. package/dist/esm/changelogJsonFile.d.ts +2 -0
  10. package/dist/esm/changelogJsonFile.js +11 -1
  11. package/dist/esm/changelogJsonUtils.d.ts +2 -1
  12. package/dist/esm/changelogJsonUtils.js +9 -0
  13. package/dist/esm/changelogOverrides.d.ts +53 -0
  14. package/dist/esm/changelogOverrides.js +424 -0
  15. package/dist/esm/checkWorkTypesDrift.js +3 -2
  16. package/dist/esm/defaults.js +1 -1
  17. package/dist/esm/generateChangelogs.d.ts +2 -3
  18. package/dist/esm/generateChangelogs.js +4 -34
  19. package/dist/esm/index.d.ts +2 -0
  20. package/dist/esm/index.js +8 -0
  21. package/dist/esm/loadConfig.d.ts +1 -1
  22. package/dist/esm/releasePrepare.js +68 -11
  23. package/dist/esm/releasePrepareMono.js +103 -59
  24. package/dist/esm/releasePrepareProject.d.ts +4 -1
  25. package/dist/esm/releasePrepareProject.js +74 -18
  26. package/dist/esm/renderChangelogMarkdown.d.ts +12 -0
  27. package/dist/esm/renderChangelogMarkdown.js +32 -0
  28. package/dist/esm/renderReleaseNotes.js +6 -1
  29. package/dist/esm/resolveReleaseNotesConfig.js +3 -1
  30. package/dist/esm/runGitCliff.d.ts +1 -0
  31. package/dist/esm/runGitCliff.js +7 -0
  32. package/dist/esm/syncWorkTypes.js +3 -2
  33. package/dist/esm/types.d.ts +98 -31
  34. package/dist/esm/types.js +60 -0
  35. package/dist/esm/validateConfig.js +84 -345
  36. package/dist/esm/validateOverridesCommand.d.ts +14 -0
  37. package/dist/esm/validateOverridesCommand.js +136 -0
  38. package/dist/esm/work-types.json +23 -17
  39. package/dist/esm/work-types.schema.json +28 -1
  40. package/dist/esm/workTypesData.d.ts +8 -0
  41. package/dist/esm/workTypesData.js +20 -17
  42. package/dist/esm/workTypesUtils.d.ts +1 -0
  43. package/dist/esm/workTypesUtils.js +8 -0
  44. package/package.json +5 -4
  45. package/dist/esm/writeSyntheticChangelog.d.ts +0 -9
  46. package/dist/esm/writeSyntheticChangelog.js +0 -27
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$schema": "./work-types.schema.json",
3
- "tiers": ["Public", "Internal", "Process"],
3
+ "tiers": ["public", "internal", "process"],
4
4
  "types": [
5
5
  {
6
- "tier": "Public",
6
+ "tier": "public",
7
7
  "key": "feat",
8
8
  "aliases": ["feature"],
9
9
  "emoji": "🎉",
@@ -11,7 +11,7 @@
11
11
  "breakingPolicy": "optional"
12
12
  },
13
13
  {
14
- "tier": "Public",
14
+ "tier": "public",
15
15
  "key": "drop",
16
16
  "aliases": [],
17
17
  "emoji": "ðŸŠĶ",
@@ -19,7 +19,7 @@
19
19
  "breakingPolicy": "required"
20
20
  },
21
21
  {
22
- "tier": "Public",
22
+ "tier": "public",
23
23
  "key": "deprecate",
24
24
  "aliases": [],
25
25
  "emoji": "🗑ïļ",
@@ -27,7 +27,7 @@
27
27
  "breakingPolicy": "forbidden"
28
28
  },
29
29
  {
30
- "tier": "Public",
30
+ "tier": "public",
31
31
  "key": "fix",
32
32
  "aliases": ["bugfix"],
33
33
  "emoji": "🐛",
@@ -35,7 +35,7 @@
35
35
  "breakingPolicy": "forbidden"
36
36
  },
37
37
  {
38
- "tier": "Public",
38
+ "tier": "public",
39
39
  "key": "sec",
40
40
  "aliases": ["security"],
41
41
  "emoji": "🔒",
@@ -43,7 +43,7 @@
43
43
  "breakingPolicy": "optional"
44
44
  },
45
45
  {
46
- "tier": "Public",
46
+ "tier": "public",
47
47
  "key": "perf",
48
48
  "aliases": ["performance"],
49
49
  "emoji": "⚡",
@@ -51,7 +51,7 @@
51
51
  "breakingPolicy": "forbidden"
52
52
  },
53
53
  {
54
- "tier": "Internal",
54
+ "tier": "internal",
55
55
  "key": "internal",
56
56
  "aliases": ["utility"],
57
57
  "emoji": "🏗ïļ",
@@ -59,7 +59,7 @@
59
59
  "breakingPolicy": "forbidden"
60
60
  },
61
61
  {
62
- "tier": "Internal",
62
+ "tier": "internal",
63
63
  "key": "refactor",
64
64
  "aliases": [],
65
65
  "emoji": "â™ŧïļ",
@@ -67,7 +67,7 @@
67
67
  "breakingPolicy": "forbidden"
68
68
  },
69
69
  {
70
- "tier": "Internal",
70
+ "tier": "internal",
71
71
  "key": "tests",
72
72
  "aliases": ["test"],
73
73
  "emoji": "🧊",
@@ -75,7 +75,7 @@
75
75
  "breakingPolicy": "forbidden"
76
76
  },
77
77
  {
78
- "tier": "Process",
78
+ "tier": "process",
79
79
  "key": "tooling",
80
80
  "aliases": [],
81
81
  "emoji": "⚙ïļ",
@@ -83,7 +83,7 @@
83
83
  "breakingPolicy": "forbidden"
84
84
  },
85
85
  {
86
- "tier": "Process",
86
+ "tier": "process",
87
87
  "key": "ci",
88
88
  "aliases": [],
89
89
  "emoji": "👷",
@@ -91,7 +91,7 @@
91
91
  "breakingPolicy": "forbidden"
92
92
  },
93
93
  {
94
- "tier": "Process",
94
+ "tier": "process",
95
95
  "key": "deps",
96
96
  "aliases": ["dep"],
97
97
  "emoji": "ðŸ“Ķ",
@@ -99,7 +99,7 @@
99
99
  "breakingPolicy": "forbidden"
100
100
  },
101
101
  {
102
- "tier": "Process",
102
+ "tier": "process",
103
103
  "key": "ai",
104
104
  "aliases": [],
105
105
  "emoji": "ðŸĪ–",
@@ -107,7 +107,7 @@
107
107
  "breakingPolicy": "forbidden"
108
108
  },
109
109
  {
110
- "tier": "Process",
110
+ "tier": "process",
111
111
  "key": "docs",
112
112
  "aliases": ["doc"],
113
113
  "emoji": "📚",
@@ -115,7 +115,7 @@
115
115
  "breakingPolicy": "forbidden"
116
116
  },
117
117
  {
118
- "tier": "Process",
118
+ "tier": "process",
119
119
  "key": "fmt",
120
120
  "aliases": [],
121
121
  "emoji": "ðŸŽĻ",
@@ -123,5 +123,11 @@
123
123
  "breakingPolicy": "forbidden",
124
124
  "excludedFromChangelog": true
125
125
  }
126
- ]
126
+ ],
127
+ "markers": {
128
+ "breaking": {
129
+ "emoji": "ðŸšĻ",
130
+ "label": "Breaking"
131
+ }
132
+ }
127
133
  }
@@ -4,7 +4,7 @@
4
4
  "title": "Work types",
5
5
  "description": "Canonical taxonomy of commit work types used by release-kit. Drives section ordering, audience classification, and the `!` (breaking) policy. The structured single-source-of-truth for everything that previously lived in `DEFAULT_WORK_TYPES` and `cliff.toml.template` group definitions.",
6
6
  "type": "object",
7
- "required": ["tiers", "types"],
7
+ "required": ["tiers", "types", "markers"],
8
8
  "additionalProperties": false,
9
9
  "properties": {
10
10
  "$schema": {
@@ -23,9 +23,36 @@
23
23
  "description": "Work-type entries in canonical render order (tier order, then row order within tier).",
24
24
  "items": { "$ref": "#/definitions/workType" },
25
25
  "minItems": 1
26
+ },
27
+ "markers": {
28
+ "type": "object",
29
+ "description": "Orthogonal section markers used by downstream renderers (PR descriptions, changelogs, release notes). Keyed by marker name; values describe the rendering inputs (emoji + label). Markers are cross-cutting — they are not tied to a specific work type.",
30
+ "required": ["breaking"],
31
+ "properties": {
32
+ "breaking": { "$ref": "#/definitions/marker" }
33
+ },
34
+ "additionalProperties": { "$ref": "#/definitions/marker" }
26
35
  }
27
36
  },
28
37
  "definitions": {
38
+ "marker": {
39
+ "type": "object",
40
+ "description": "Rendering inputs for a single marker. Stored as plain text; consumers apply their own formatting (e.g., bolding, prefix punctuation) at construction time.",
41
+ "required": ["emoji", "label"],
42
+ "additionalProperties": false,
43
+ "properties": {
44
+ "emoji": {
45
+ "type": "string",
46
+ "description": "Decorative emoji rendered as the prefix of the marker.",
47
+ "minLength": 1
48
+ },
49
+ "label": {
50
+ "type": "string",
51
+ "description": "Human-readable marker label. Plain text; consumers add their own emphasis (e.g., bold) when constructing the rendered form.",
52
+ "minLength": 1
53
+ }
54
+ }
55
+ },
29
56
  "workType": {
30
57
  "type": "object",
31
58
  "required": ["tier", "key", "aliases", "emoji", "label", "breakingPolicy"],
@@ -7,8 +7,16 @@ export interface WorkTypeEntry {
7
7
  breakingPolicy: 'forbidden' | 'optional' | 'required';
8
8
  excludedFromChangelog?: boolean;
9
9
  }
10
+ export interface MarkerEntry {
11
+ emoji: string;
12
+ label: string;
13
+ }
10
14
  export interface WorkTypesData {
11
15
  tiers: string[];
12
16
  types: WorkTypeEntry[];
17
+ markers: {
18
+ breaking: MarkerEntry;
19
+ [key: string]: MarkerEntry;
20
+ };
13
21
  }
14
22
  export declare const WORK_TYPES_DATA: WorkTypesData;
@@ -1,13 +1,13 @@
1
1
  const WORK_TYPES_DATA = {
2
- tiers: ["Public", "Internal", "Process"],
2
+ tiers: ["public", "internal", "process"],
3
3
  types: [
4
- { tier: "Public", key: "feat", aliases: ["feature"], emoji: "\u{1F389}", label: "Features", breakingPolicy: "optional" },
5
- { tier: "Public", key: "drop", aliases: [], emoji: "\u{1FAA6}", label: "Removed", breakingPolicy: "required" },
6
- { tier: "Public", key: "deprecate", aliases: [], emoji: "\u{1F5D1}\uFE0F", label: "Deprecated", breakingPolicy: "forbidden" },
7
- { tier: "Public", key: "fix", aliases: ["bugfix"], emoji: "\u{1F41B}", label: "Bug fixes", breakingPolicy: "forbidden" },
8
- { tier: "Public", key: "sec", aliases: ["security"], emoji: "\u{1F512}", label: "Security", breakingPolicy: "optional" },
4
+ { tier: "public", key: "feat", aliases: ["feature"], emoji: "\u{1F389}", label: "Features", breakingPolicy: "optional" },
5
+ { tier: "public", key: "drop", aliases: [], emoji: "\u{1FAA6}", label: "Removed", breakingPolicy: "required" },
6
+ { tier: "public", key: "deprecate", aliases: [], emoji: "\u{1F5D1}\uFE0F", label: "Deprecated", breakingPolicy: "forbidden" },
7
+ { tier: "public", key: "fix", aliases: ["bugfix"], emoji: "\u{1F41B}", label: "Bug fixes", breakingPolicy: "forbidden" },
8
+ { tier: "public", key: "sec", aliases: ["security"], emoji: "\u{1F512}", label: "Security", breakingPolicy: "optional" },
9
9
  {
10
- tier: "Public",
10
+ tier: "public",
11
11
  key: "perf",
12
12
  aliases: ["performance"],
13
13
  emoji: "\u26A1",
@@ -15,7 +15,7 @@ const WORK_TYPES_DATA = {
15
15
  breakingPolicy: "forbidden"
16
16
  },
17
17
  {
18
- tier: "Internal",
18
+ tier: "internal",
19
19
  key: "internal",
20
20
  aliases: ["utility"],
21
21
  emoji: "\u{1F3D7}\uFE0F",
@@ -23,20 +23,20 @@ const WORK_TYPES_DATA = {
23
23
  breakingPolicy: "forbidden"
24
24
  },
25
25
  {
26
- tier: "Internal",
26
+ tier: "internal",
27
27
  key: "refactor",
28
28
  aliases: [],
29
29
  emoji: "\u267B\uFE0F",
30
30
  label: "Refactoring",
31
31
  breakingPolicy: "forbidden"
32
32
  },
33
- { tier: "Internal", key: "tests", aliases: ["test"], emoji: "\u{1F9EA}", label: "Tests", breakingPolicy: "forbidden" },
34
- { tier: "Process", key: "tooling", aliases: [], emoji: "\u2699\uFE0F", label: "Tooling", breakingPolicy: "forbidden" },
35
- { tier: "Process", key: "ci", aliases: [], emoji: "\u{1F477}", label: "CI", breakingPolicy: "forbidden" },
36
- { tier: "Process", key: "deps", aliases: ["dep"], emoji: "\u{1F4E6}", label: "Dependencies", breakingPolicy: "forbidden" },
37
- { tier: "Process", key: "ai", aliases: [], emoji: "\u{1F916}", label: "Agentic support", breakingPolicy: "forbidden" },
33
+ { tier: "internal", key: "tests", aliases: ["test"], emoji: "\u{1F9EA}", label: "Tests", breakingPolicy: "forbidden" },
34
+ { tier: "process", key: "tooling", aliases: [], emoji: "\u2699\uFE0F", label: "Tooling", breakingPolicy: "forbidden" },
35
+ { tier: "process", key: "ci", aliases: [], emoji: "\u{1F477}", label: "CI", breakingPolicy: "forbidden" },
36
+ { tier: "process", key: "deps", aliases: ["dep"], emoji: "\u{1F4E6}", label: "Dependencies", breakingPolicy: "forbidden" },
37
+ { tier: "process", key: "ai", aliases: [], emoji: "\u{1F916}", label: "Agentic support", breakingPolicy: "forbidden" },
38
38
  {
39
- tier: "Process",
39
+ tier: "process",
40
40
  key: "docs",
41
41
  aliases: ["doc"],
42
42
  emoji: "\u{1F4DA}",
@@ -44,7 +44,7 @@ const WORK_TYPES_DATA = {
44
44
  breakingPolicy: "forbidden"
45
45
  },
46
46
  {
47
- tier: "Process",
47
+ tier: "process",
48
48
  key: "fmt",
49
49
  aliases: [],
50
50
  emoji: "\u{1F3A8}",
@@ -52,7 +52,10 @@ const WORK_TYPES_DATA = {
52
52
  breakingPolicy: "forbidden",
53
53
  excludedFromChangelog: true
54
54
  }
55
- ]
55
+ ],
56
+ markers: {
57
+ breaking: { emoji: "\u{1F6A8}", label: "Breaking" }
58
+ }
56
59
  };
57
60
  export {
58
61
  WORK_TYPES_DATA
@@ -3,3 +3,4 @@ export declare function hasExpectedTopLevelShape(value: unknown): value is {
3
3
  types: unknown[];
4
4
  };
5
5
  export declare function errorMessage(error: unknown): string;
6
+ export declare function buildFetchInit(): RequestInit | undefined;
@@ -10,7 +10,15 @@ function hasExpectedTopLevelShape(value) {
10
10
  function errorMessage(error) {
11
11
  return error instanceof Error ? error.message : String(error);
12
12
  }
13
+ function buildFetchInit() {
14
+ const token = process.env.GITHUB_TOKEN;
15
+ if (token === void 0 || token === "") {
16
+ return void 0;
17
+ }
18
+ return { headers: { Authorization: `Bearer ${token}` } };
19
+ }
13
20
  export {
21
+ buildFetchInit,
14
22
  errorMessage,
15
23
  hasExpectedTopLevelShape
16
24
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@williamthorsen/release-kit",
3
- "version": "5.2.1",
3
+ "version": "5.3.1",
4
4
  "description": "Version-bumping and changelog-generation toolkit for release workflows",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/williamthorsen/node-monorepo-tools/tree/main/packages/release-kit#readme",
@@ -33,11 +33,12 @@
33
33
  ],
34
34
  "dependencies": {
35
35
  "glob": "13.0.6",
36
- "jiti": "2.6.1",
36
+ "jiti": "2.7.0",
37
37
  "js-yaml": "4.1.1",
38
38
  "json-stringify-pretty-compact": "4.0.0",
39
- "semver": "7.7.4",
40
- "@williamthorsen/nmr-core": "0.3.1"
39
+ "semver": "7.8.0",
40
+ "zod": "4.4.3",
41
+ "@williamthorsen/nmr-core": "0.3.2"
41
42
  },
42
43
  "devDependencies": {
43
44
  "@types/js-yaml": "4.0.9",
@@ -1,9 +0,0 @@
1
- import type { PropagationSource } from './types.ts';
2
- export interface WriteSyntheticChangelogParams {
3
- changelogPath: string;
4
- newVersion: string;
5
- date: string;
6
- propagatedFrom: PropagationSource[];
7
- dryRun?: boolean;
8
- }
9
- export declare function writeSyntheticChangelog(params: WriteSyntheticChangelogParams): string;
@@ -1,27 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- function writeSyntheticChangelog(params) {
3
- const { changelogPath, newVersion, date, propagatedFrom, dryRun } = params;
4
- const filePath = `${changelogPath}/CHANGELOG.md`;
5
- const bullets = propagatedFrom.map((dep) => `- Bumped \`${dep.packageName}\` to ${dep.newVersion}`).join("\n");
6
- const section = `## ${newVersion} \u2014 ${date}
7
-
8
- ### Dependency updates
9
-
10
- ${bullets}
11
- `;
12
- if (dryRun) {
13
- return filePath;
14
- }
15
- let existingContent = "";
16
- if (existsSync(filePath)) {
17
- existingContent = readFileSync(filePath, "utf8");
18
- }
19
- const newContent = existingContent.length > 0 ? `${section}
20
- ${existingContent}` : `${section}
21
- `;
22
- writeFileSync(filePath, newContent, "utf8");
23
- return filePath;
24
- }
25
- export {
26
- writeSyntheticChangelog
27
- };