@williamthorsen/release-kit 15.0.3 → 16.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 +66 -0
- package/.readyup/kits/default.js +13 -13
- package/.readyup/kits/npm-auto-publish.js +4 -4
- package/.readyup/manifest.json +12 -12
- package/CHANGELOG.md +19 -0
- package/README.md +7 -1
- package/dist/esm/applyChangelogOverrides.js +6 -6
- package/dist/esm/assertReleasesOnNpm.js +11 -11
- package/dist/esm/assertTaggedBaseline.js +5 -5
- package/dist/esm/bin/release-kit.js +16 -16
- package/dist/esm/buildChangelogEntries.d.ts +19 -19
- package/dist/esm/buildChangelogEntries.js +40 -36
- package/dist/esm/buildChangelogItem.js +24 -24
- package/dist/esm/buildDependencyGraph.js +23 -23
- package/dist/esm/buildReleasedResult.js +21 -19
- package/dist/esm/buildSyntheticChangelogEntry.js +2 -2
- package/dist/esm/bumpVersion.js +8 -8
- package/dist/esm/changelogArchive.d.ts +1 -1
- package/dist/esm/changelogArchive.js +2 -2
- package/dist/esm/changelogJsonFile.js +5 -5
- package/dist/esm/changelogJsonUtils.js +3 -3
- package/dist/esm/changelogOverrides.d.ts +5 -5
- package/dist/esm/changelogOverrides.js +23 -23
- package/dist/esm/classifyChangelogCommit.js +4 -4
- package/dist/esm/commitCommand.js +3 -3
- package/dist/esm/compareVersions.js +13 -13
- package/dist/esm/configSchema.d.ts +2 -2
- package/dist/esm/configSchema.js +1 -1
- package/dist/esm/createGithubRelease.d.ts +4 -4
- package/dist/esm/createGithubRelease.js +10 -10
- package/dist/esm/createGithubReleaseCommand.js +9 -9
- package/dist/esm/createTags.d.ts +2 -2
- package/dist/esm/createTags.js +8 -8
- package/dist/esm/decideDirectReleases.d.ts +5 -5
- package/dist/esm/decideDirectReleases.js +25 -25
- package/dist/esm/decideRelease.d.ts +1 -1
- package/dist/esm/decideRelease.js +2 -2
- package/dist/esm/deriveDirectoryConfig.d.ts +1 -1
- package/dist/esm/deriveDirectoryConfig.js +18 -18
- package/dist/esm/deriveWorkspaceConfig.js +4 -4
- package/dist/esm/detectPackageManager.js +5 -5
- package/dist/esm/detectUndeclaredTagPrefixes.js +6 -6
- package/dist/esm/enumerateReleaseWindows.d.ts +1 -1
- package/dist/esm/enumerateReleaseWindows.js +7 -7
- package/dist/esm/findTransitiveDependents.js +5 -5
- package/dist/esm/findUnroutedEntryScopes.js +11 -11
- package/dist/esm/format.d.ts +1 -1
- package/dist/esm/format.js +1 -1
- package/dist/esm/formatPrepareFiles.d.ts +3 -3
- package/dist/esm/formatPrepareFiles.js +10 -10
- package/dist/esm/formatPrepareWarnings.js +6 -6
- package/dist/esm/hasPrettierConfig.js +2 -2
- package/dist/esm/init/checks.js +5 -3
- package/dist/esm/init/detectRepoType.js +3 -3
- package/dist/esm/init/initCommand.d.ts +4 -4
- package/dist/esm/init/initCommand.js +7 -7
- package/dist/esm/init/parseJsonRecord.d.ts +1 -1
- package/dist/esm/init/parseJsonRecord.js +4 -4
- package/dist/esm/init/scaffold.d.ts +4 -4
- package/dist/esm/init/scaffold.js +15 -15
- package/dist/esm/init/templates.d.ts +10 -10
- package/dist/esm/init/templates.js +5 -5
- package/dist/esm/init/updateTemplatesCommand.d.ts +2 -2
- package/dist/esm/init/updateTemplatesCommand.js +14 -12
- package/dist/esm/injectReleaseNotesIntoReadme.d.ts +1 -1
- package/dist/esm/injectReleaseNotesIntoReadme.js +6 -6
- package/dist/esm/injectSection.js +8 -8
- package/dist/esm/loadChangelogOverrides.d.ts +1 -1
- package/dist/esm/loadChangelogOverrides.js +9 -9
- package/dist/esm/loadConfig.d.ts +3 -3
- package/dist/esm/loadConfig.js +10 -10
- package/dist/esm/loadValidatedConfig.js +4 -4
- package/dist/esm/mergeConfig.d.ts +1 -1
- package/dist/esm/mergeConfig.js +27 -27
- package/dist/esm/monorepoConfigAssertions.js +15 -15
- package/dist/esm/npmRegistry.js +4 -4
- package/dist/esm/packsPath.js +3 -3
- package/dist/esm/parseChangeRecordBlock.js +33 -33
- package/dist/esm/parseCommitMessage.js +5 -5
- package/dist/esm/planChangelogFiles.js +8 -8
- package/dist/esm/planReleaseNotesPreviews.js +10 -10
- package/dist/esm/planVersionBump.js +24 -16
- package/dist/esm/prepareArgs.d.ts +9 -9
- package/dist/esm/prepareArgs.js +11 -11
- package/dist/esm/prepareCommand.js +23 -23
- package/dist/esm/prepareComposite.d.ts +4 -4
- package/dist/esm/prepareComposite.js +16 -16
- package/dist/esm/{releasePrepareTargets.d.ts → prepareReleaseTargets.d.ts} +9 -9
- package/dist/esm/{releasePrepareTargets.js → prepareReleaseTargets.js} +40 -40
- package/dist/esm/prepareRunContext.d.ts +1 -1
- package/dist/esm/prepareRunContext.js +5 -5
- package/dist/esm/prepareTarget.d.ts +3 -3
- package/dist/esm/prepareTarget.js +41 -39
- package/dist/esm/previewTagPrefixes.js +19 -19
- package/dist/esm/propagateBumps.js +8 -8
- package/dist/esm/publish.d.ts +2 -2
- package/dist/esm/publish.js +5 -5
- package/dist/esm/publishCommand.js +20 -20
- package/dist/esm/pushCommand.js +8 -8
- package/dist/esm/pushRelease.d.ts +1 -1
- package/dist/esm/pushRelease.js +2 -2
- package/dist/esm/readChangelogSections.d.ts +1 -1
- package/dist/esm/readChangelogSections.js +16 -16
- package/dist/esm/releasePlan.js +25 -25
- package/dist/esm/renderChangelogMarkdown.d.ts +4 -4
- package/dist/esm/renderChangelogMarkdown.js +18 -15
- package/dist/esm/renderReleaseNotes.d.ts +1 -1
- package/dist/esm/renderReleaseNotes.js +16 -16
- package/dist/esm/reportPrepare.js +34 -34
- package/dist/esm/resolveCommandTags.js +9 -9
- package/dist/esm/resolveReleaseDeclaration.d.ts +2 -2
- package/dist/esm/resolveReleaseDeclaration.js +22 -22
- package/dist/esm/resolveReleaseTags.js +17 -15
- package/dist/esm/resolveReleaseTargets.js +2 -2
- package/dist/esm/showTagPrefixesCommand.js +4 -4
- package/dist/esm/sync-labels/generateCommand.d.ts +3 -3
- package/dist/esm/sync-labels/generateCommand.js +10 -10
- package/dist/esm/sync-labels/initCommand.d.ts +3 -3
- package/dist/esm/sync-labels/initCommand.js +15 -15
- package/dist/esm/sync-labels/presets.js +3 -3
- package/dist/esm/sync-labels/resolveLabels.js +13 -13
- package/dist/esm/sync-labels/templates.d.ts +2 -2
- package/dist/esm/sync-labels/templates.js +1 -1
- package/dist/esm/tagCommand.js +4 -4
- package/dist/esm/topologicalSort.d.ts +2 -2
- package/dist/esm/topologicalSort.js +7 -7
- package/dist/esm/types.d.ts +3 -3
- package/dist/esm/validateAllChangelogOverrides.js +9 -9
- package/dist/esm/validateConfig.d.ts +1 -1
- package/dist/esm/validateConfig.js +60 -50
- package/dist/esm/validateOverridesCommand.js +2 -2
- package/docs/changelogs.md +5 -5
- package/docs/configuration.md +1 -1
- package/docs/work-types.md +1 -1
- package/package.json +1 -1
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { releaseKitConfigSchema } from "./configSchema.js";
|
|
2
2
|
import { isRecord } from "./typeGuards.js";
|
|
3
|
-
export function validateConfig(
|
|
4
|
-
if (!isRecord(
|
|
3
|
+
export function validateConfig(rawConfig) {
|
|
4
|
+
if (!isRecord(rawConfig)) {
|
|
5
5
|
return { config: {}, errors: ['Config must be an object'], warnings: [] };
|
|
6
6
|
}
|
|
7
|
-
const {
|
|
8
|
-
const parseResult = releaseKitConfigSchema.safeParse(
|
|
7
|
+
const { cleanedInput, deprecationErrors } = preprocessDeprecatedKeys(rawConfig);
|
|
8
|
+
const parseResult = releaseKitConfigSchema.safeParse(cleanedInput);
|
|
9
9
|
if (!parseResult.success) {
|
|
10
10
|
return {
|
|
11
11
|
config: {},
|
|
12
|
-
errors: [
|
|
12
|
+
errors: [
|
|
13
|
+
...deprecationErrors,
|
|
14
|
+
...parseResult.error.issues.flatMap((issue) => formatZodIssue(issue, cleanedInput)),
|
|
15
|
+
],
|
|
13
16
|
warnings: [],
|
|
14
17
|
};
|
|
15
18
|
}
|
|
@@ -26,40 +29,47 @@ export function validateConfig(raw) {
|
|
|
26
29
|
}
|
|
27
30
|
return { config, errors, warnings };
|
|
28
31
|
}
|
|
29
|
-
function preprocessDeprecatedKeys(
|
|
30
|
-
if (!isRecord(
|
|
31
|
-
return {
|
|
32
|
+
function preprocessDeprecatedKeys(rawConfig) {
|
|
33
|
+
if (!isRecord(rawConfig))
|
|
34
|
+
return { cleanedInput: rawConfig, deprecationErrors: [] };
|
|
32
35
|
const errors = [];
|
|
33
|
-
const
|
|
34
|
-
if (Object.hasOwn(
|
|
36
|
+
const cleanedInput = { ...rawConfig };
|
|
37
|
+
if (Object.hasOwn(cleanedInput, 'cliffConfigPath')) {
|
|
35
38
|
errors.push('cliffConfigPath is no longer supported. release-kit reads changelog history from git directly and does not use any external config file. Remove this field from the config, and delete the file that it names.');
|
|
36
|
-
delete
|
|
39
|
+
delete cleanedInput['cliffConfigPath'];
|
|
37
40
|
}
|
|
38
|
-
if (isRecord(
|
|
41
|
+
if (isRecord(cleanedInput['releaseNotes']) &&
|
|
42
|
+
Object.hasOwn(cleanedInput['releaseNotes'], 'shouldCreateGithubRelease')) {
|
|
39
43
|
errors.push('releaseNotes.shouldCreateGithubRelease is no longer supported. Adoption is now signaled by installing the create-github-release workflow, which `release-kit init` scaffolds. Remove this field from the config.');
|
|
40
|
-
const releaseNotesCopy = { ...
|
|
44
|
+
const releaseNotesCopy = { ...cleanedInput['releaseNotes'] };
|
|
41
45
|
delete releaseNotesCopy['shouldCreateGithubRelease'];
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
cleanedInput['releaseNotes'] = releaseNotesCopy;
|
|
47
|
+
}
|
|
48
|
+
if (isRecord(cleanedInput['changelogMarkdown']) && Object.hasOwn(cleanedInput['changelogMarkdown'], 'keepVersions')) {
|
|
49
|
+
errors.push('changelogMarkdown.keepVersions has been renamed. Rename it to changelogMarkdown.keptVersionCount in the config.');
|
|
50
|
+
const changelogMarkdownCopy = { ...cleanedInput['changelogMarkdown'] };
|
|
51
|
+
delete changelogMarkdownCopy['keepVersions'];
|
|
52
|
+
cleanedInput['changelogMarkdown'] = changelogMarkdownCopy;
|
|
53
|
+
}
|
|
54
|
+
if (Array.isArray(cleanedInput['workspaces'])) {
|
|
55
|
+
cleanedInput['workspaces'] = cleanedInput['workspaces'].map((workspace, index) => {
|
|
56
|
+
if (!isRecord(workspace))
|
|
57
|
+
return workspace;
|
|
58
|
+
const workspaceCopy = { ...workspace };
|
|
59
|
+
if (Object.hasOwn(workspaceCopy, 'tagPrefix')) {
|
|
60
|
+
const dir = typeof workspaceCopy['dir'] === 'string' && workspaceCopy['dir'] !== '' ? workspaceCopy['dir'] : '<dir>';
|
|
61
|
+
errors.push(`workspaces[${index}]: 'tagPrefix' is no longer supported; remove it to use the default '${dir}-v'`);
|
|
62
|
+
delete workspaceCopy['tagPrefix'];
|
|
53
63
|
}
|
|
54
|
-
if (Object.hasOwn(
|
|
55
|
-
errors.push(`workspaces[${
|
|
56
|
-
delete
|
|
64
|
+
if (Object.hasOwn(workspaceCopy, 'legacyTagPrefixes')) {
|
|
65
|
+
errors.push(`workspaces[${index}]: 'legacyTagPrefixes' is no longer supported; use 'legacyIdentities: [{ name, tagPrefix }, ...]' instead`);
|
|
66
|
+
delete workspaceCopy['legacyTagPrefixes'];
|
|
57
67
|
}
|
|
58
|
-
return
|
|
68
|
+
return workspaceCopy;
|
|
59
69
|
});
|
|
60
70
|
}
|
|
61
|
-
if (isRecord(
|
|
62
|
-
const releasesCopy = { ...
|
|
71
|
+
if (isRecord(cleanedInput['releases'])) {
|
|
72
|
+
const releasesCopy = { ...cleanedInput['releases'] };
|
|
63
73
|
for (const [name, entry] of Object.entries(releasesCopy)) {
|
|
64
74
|
if (!isRecord(entry) || !Object.hasOwn(entry, 'paths'))
|
|
65
75
|
continue;
|
|
@@ -68,9 +78,9 @@ function preprocessDeprecatedKeys(raw) {
|
|
|
68
78
|
delete entryCopy['paths'];
|
|
69
79
|
releasesCopy[name] = entryCopy;
|
|
70
80
|
}
|
|
71
|
-
|
|
81
|
+
cleanedInput['releases'] = releasesCopy;
|
|
72
82
|
}
|
|
73
|
-
return {
|
|
83
|
+
return { cleanedInput, deprecationErrors: errors };
|
|
74
84
|
}
|
|
75
85
|
function formatZodIssue(issue, input) {
|
|
76
86
|
if (issue.code === 'invalid_union' && issue.path.length === 2 && issue.path[0] === 'releases') {
|
|
@@ -92,42 +102,42 @@ function customizeMessage(issue) {
|
|
|
92
102
|
}
|
|
93
103
|
const RELEASE_ENTRY_SHAPES = 'must be false, { path, tagPrefix?, legacyIdentities? }, or { includes, tagPrefix? }';
|
|
94
104
|
function renderPath(path) {
|
|
95
|
-
let
|
|
105
|
+
let renderedPath = '';
|
|
96
106
|
for (const segment of path) {
|
|
97
107
|
if (typeof segment === 'number') {
|
|
98
|
-
|
|
108
|
+
renderedPath += `[${segment}]`;
|
|
99
109
|
}
|
|
100
|
-
else if (
|
|
101
|
-
|
|
110
|
+
else if (renderedPath === '') {
|
|
111
|
+
renderedPath += String(segment);
|
|
102
112
|
}
|
|
103
113
|
else {
|
|
104
|
-
|
|
114
|
+
renderedPath += `.${String(segment)}`;
|
|
105
115
|
}
|
|
106
116
|
}
|
|
107
|
-
return
|
|
117
|
+
return renderedPath;
|
|
108
118
|
}
|
|
109
119
|
function detectLegacyIdentityDuplicates(config, errors) {
|
|
110
120
|
for (const { label, legacyIdentities } of listLegacyIdentityDeclarations(config)) {
|
|
111
|
-
const
|
|
121
|
+
const seenKeys = new Set();
|
|
112
122
|
for (const [entryIndex, identity] of legacyIdentities.entries()) {
|
|
113
123
|
const key = `${identity.name}\0${identity.tagPrefix}`;
|
|
114
|
-
if (
|
|
124
|
+
if (seenKeys.has(key)) {
|
|
115
125
|
errors.push(`${label}.legacyIdentities[${entryIndex}]: duplicate identity (name='${identity.name}', tagPrefix='${identity.tagPrefix}')`);
|
|
116
126
|
}
|
|
117
|
-
|
|
127
|
+
seenKeys.add(key);
|
|
118
128
|
}
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
function detectRetiredPackageDuplicates(config, errors) {
|
|
122
132
|
if (config.retiredPackages === undefined)
|
|
123
133
|
return;
|
|
124
|
-
const
|
|
125
|
-
for (const [index,
|
|
126
|
-
const key = `${
|
|
127
|
-
if (
|
|
128
|
-
errors.push(`retiredPackages[${index}]: duplicate package (name='${
|
|
134
|
+
const seenKeys = new Set();
|
|
135
|
+
for (const [index, retiredPackage] of config.retiredPackages.entries()) {
|
|
136
|
+
const key = `${retiredPackage.name}\0${retiredPackage.tagPrefix}`;
|
|
137
|
+
if (seenKeys.has(key)) {
|
|
138
|
+
errors.push(`retiredPackages[${index}]: duplicate package (name='${retiredPackage.name}', tagPrefix='${retiredPackage.tagPrefix}')`);
|
|
129
139
|
}
|
|
130
|
-
|
|
140
|
+
seenKeys.add(key);
|
|
131
141
|
}
|
|
132
142
|
}
|
|
133
143
|
function detectRetiredVsLegacyCollisions(config, errors) {
|
|
@@ -141,10 +151,10 @@ function detectRetiredVsLegacyCollisions(config, errors) {
|
|
|
141
151
|
}
|
|
142
152
|
}
|
|
143
153
|
}
|
|
144
|
-
for (const [index,
|
|
145
|
-
const collidingOwner = legacyPrefixToOwner.get(
|
|
154
|
+
for (const [index, retiredPackage] of config.retiredPackages.entries()) {
|
|
155
|
+
const collidingOwner = legacyPrefixToOwner.get(retiredPackage.tagPrefix);
|
|
146
156
|
if (collidingOwner !== undefined) {
|
|
147
|
-
errors.push(`retiredPackages[${index}]: tagPrefix '${
|
|
157
|
+
errors.push(`retiredPackages[${index}]: tagPrefix '${retiredPackage.tagPrefix}' collides with a declared legacyIdentities[].tagPrefix on ${collidingOwner}`);
|
|
148
158
|
}
|
|
149
159
|
}
|
|
150
160
|
}
|
|
@@ -11,7 +11,7 @@ const SYNTHETIC_VALIDATE_TAG = 'validate-only';
|
|
|
11
11
|
export async function validateOverridesCommand(styles, configPath, dependencies = {}) {
|
|
12
12
|
const discover = dependencies.discoverWorkspaces ?? discoverWorkspaces;
|
|
13
13
|
const load = dependencies.loadValidatedConfig ?? (() => loadValidatedConfig(configPath));
|
|
14
|
-
const buildEntries = dependencies.buildEntries ??
|
|
14
|
+
const buildEntries = dependencies.buildEntries ?? buildEntriesByDefault;
|
|
15
15
|
const validate = dependencies.validate ?? validateAllChangelogOverrides;
|
|
16
16
|
const configResult = await load();
|
|
17
17
|
if (configResult.status === 'invalid') {
|
|
@@ -66,7 +66,7 @@ function formatSummaryLine(errorCount, warningCount) {
|
|
|
66
66
|
function pluralize(count, noun) {
|
|
67
67
|
return count === 1 ? `${count} ${noun}` : `${count} ${noun}s`;
|
|
68
68
|
}
|
|
69
|
-
function
|
|
69
|
+
function buildEntriesByDefault(config, options) {
|
|
70
70
|
return buildChangelogEntries(config, SYNTHETIC_VALIDATE_TAG, options).entries;
|
|
71
71
|
}
|
|
72
72
|
function flattenEntriesToItems(entries) {
|
package/docs/changelogs.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
What a published tarball includes, what each `.meta/changelog.json` item contains, how `CHANGELOG.md` archives older versions, which commits appear in a changelog, how a merge commit's change-record block becomes items, and how release notes are written into a README.
|
|
4
4
|
|
|
5
|
-
npm doesn't include either `CHANGELOG.md` or `.meta/changelog.json` in a published tarball on its own. npm stopped including `CHANGELOG` automatically in npm 7, so a package that declares a `files` field publishes a changelog only when that field names `CHANGELOG.md` and `.meta/changelog.json`. release-kit's readyup kit reports a publishable workspace whose `files` field omits either, and, when [`changelogMarkdown.
|
|
5
|
+
npm doesn't include either `CHANGELOG.md` or `.meta/changelog.json` in a published tarball on its own. npm stopped including `CHANGELOG` automatically in npm 7, so a package that declares a `files` field publishes a changelog only when that field names `CHANGELOG.md` and `.meta/changelog.json`. release-kit's readyup kit reports a publishable workspace whose `files` field omits either, and, when [`changelogMarkdown.keptVersionCount`](#archived-versions) is set, one whose `files` field omits `changelogs/`.
|
|
6
6
|
|
|
7
7
|
## `changelog.json` item schema
|
|
8
8
|
|
|
@@ -43,19 +43,19 @@ The label match is exact: `migration:` and `**Migration:**` are not recognized.
|
|
|
43
43
|
|
|
44
44
|
## Archived versions
|
|
45
45
|
|
|
46
|
-
`changelogMarkdown.
|
|
46
|
+
`changelogMarkdown.keptVersionCount` bounds `CHANGELOG.md`, which otherwise grows by one section per release. `.meta/changelog.json` is not affected: It contains every version whatever the option says.
|
|
47
47
|
|
|
48
48
|
```typescript
|
|
49
49
|
export default defineConfig({
|
|
50
|
-
changelogMarkdown: {
|
|
50
|
+
changelogMarkdown: { keptVersionCount: 20 },
|
|
51
51
|
});
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
With the option set, `prepare` writes each changelog as follows:
|
|
55
55
|
|
|
56
|
-
- **`CHANGELOG.md`** contains the newest `
|
|
56
|
+
- **`CHANGELOG.md`** contains as many of the newest sections as `keptVersionCount` names, counting [hand-written sections](#existing-changelogmd-sections), and a paragraph below its header that links to each archive file.
|
|
57
57
|
- **`changelogs/CHANGELOG-v{major}.md`**, beside `CHANGELOG.md`, contains every older section of that major version, newest first, under the same header and footer. `0.x` versions share `CHANGELOG-v0.md`, and a prerelease belongs to its major.
|
|
58
|
-
- **An archive file that the render no longer produces**, after `
|
|
58
|
+
- **An archive file that the render no longer produces**, after `keptVersionCount` is raised or the option is removed: `prepare` deletes it and renders its sections in `CHANGELOG.md` again. Every section is therefore in exactly one file.
|
|
59
59
|
|
|
60
60
|
`prepare` regenerates the archive files on every release of the target, so an override applies to an archived version as it does to any other. A target that does not release keeps its unbounded `CHANGELOG.md` until its next release. The prepare report lists each archive file that it writes and each that it removes.
|
|
61
61
|
|
package/docs/configuration.md
CHANGED
|
@@ -29,7 +29,7 @@ The two paths differ in what an absent file means. An absent default path means
|
|
|
29
29
|
| `project` | `ProjectConfig` | Opt-in project-level release block. Declaring `project: {}` (even empty) enables a project-release stage in `prepare` |
|
|
30
30
|
| `repoLabels` | `RepoLabelsConfig` | Declares the repository's label registry for `sync-labels`; see [Label configuration](labels.md#label-configuration) |
|
|
31
31
|
| `changelogJson` | `ChangelogJsonConfig` | Controls `.meta/changelog.json`: `enabled` (default `true`), `outputPath` (default `'.meta/changelog.json'`), and `devOnlySections`; see [Custom work types](work-types.md#custom-work-types) |
|
|
32
|
-
| `changelogMarkdown` | `ChangelogMarkdownConfig` | `
|
|
32
|
+
| `changelogMarkdown` | `ChangelogMarkdownConfig` | `keptVersionCount` (an integer, at least 1) bounds `CHANGELOG.md` to that many of the newest versions and moves the rest into per-major archive files; omitted, `CHANGELOG.md` renders every version. See [Archived versions](changelogs.md#archived-versions) |
|
|
33
33
|
| `releaseNotes` | `ReleaseNotesConfig` | `shouldInjectIntoReadme` (default `false`) injects release notes into each package's README while it publishes; see [Release-notes injection](changelogs.md#release-notes-injection) |
|
|
34
34
|
|
|
35
35
|
All fields are optional.
|
package/docs/work-types.md
CHANGED
|
@@ -51,7 +51,7 @@ Each work-type has a `breakingPolicy` value:
|
|
|
51
51
|
|
|
52
52
|
A `BREAKING CHANGE:` body footer on a `forbidden`-policy type triggers the same warning path as the prefix `!` does: A type that cannot be breaking is parsed as non-breaking whichever surface has the signal. The warning is all that a footer triggers; it doesn't raise a bump (see [`🚨 **Breaking:**` bullet marker](#-breaking-bullet-marker)).
|
|
53
53
|
|
|
54
|
-
The release-prepare orchestrator (`
|
|
54
|
+
The release-prepare orchestrator (`prepareReleaseTargets`) applies `DEFAULT_BREAKING_POLICIES` automatically. Violations in the titles and change-record entries of each workspace's or project's unreleased window are collected onto the corresponding result's `policyViolations` field, on a skipped result as on a released one, and rendered under the section in the prepare report:
|
|
55
55
|
|
|
56
56
|
```
|
|
57
57
|
arrays
|