pm-changelog 2026.6.2 → 2026.6.3
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 +16 -0
- package/README.md +15 -0
- package/dist/cli.js +71 -27
- package/dist/cli.js.map +1 -1
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +71 -4
- package/dist/extension.js.map +1 -1
- package/dist/generator.d.ts +10 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +215 -10
- package/dist/generator.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/docs/usage.md +51 -1
- package/manifest.json +1 -1
- package/package.json +3 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.6.3 - 2026-06-03
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Opt-in changelog enhancements ([pmc-emx6](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/features/pmc-emx6.toon))
|
|
8
|
+
- Add --changelog-json structured document output ([pmc-gl6b](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-gl6b.toon))
|
|
9
|
+
- Add --limit and --since-version release windowing ([pmc-xtwa](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-xtwa.toon))
|
|
10
|
+
- Add --contributors per-release contributor list ([pmc-imsu](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-imsu.toon))
|
|
11
|
+
- Add --conventional Conventional-Commits heading mapping ([pmc-91hn](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-91hn.toon))
|
|
12
|
+
- Add --section-by type\|status\|label within-release grouping ([pmc-qro6](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-qro6.toon))
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Zero-regression guarantee for pm-changelog enhancements ([pmc-1w1r](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/decisions/pmc-1w1r.toon))
|
|
17
|
+
- Fix changelog export format validation and metadata ([pmc-55cp](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-55cp.toon))
|
|
18
|
+
|
|
3
19
|
## 2026.6.1 - 2026-06-01
|
|
4
20
|
|
|
5
21
|
### Fixed
|
package/README.md
CHANGED
|
@@ -25,6 +25,21 @@ npm install --save-dev pm-changelog @unbrained/pm-cli
|
|
|
25
25
|
npx pm-changelog --mode prepend --output CHANGELOG.md
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
## Opt-in extras
|
|
29
|
+
|
|
30
|
+
These flags are strictly additive — omitting them keeps output byte-for-byte identical to the default:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx pm-changelog --stdout --section-by type # group by type/status/label instead of categories
|
|
34
|
+
npx pm-changelog --stdout --conventional # Features / Bug Fixes / ... headings
|
|
35
|
+
npx pm-changelog --stdout --contributors # per-release contributor list
|
|
36
|
+
npx pm-changelog --all-release-tags --limit 10 # keep only the newest N releases
|
|
37
|
+
npx pm-changelog --all-release-tags --since-version 2.0.0
|
|
38
|
+
npx pm-changelog --all-release-tags --changelog-json > changelog.json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
See [Usage](docs/usage.md#opt-in-enhancements) for details.
|
|
42
|
+
|
|
28
43
|
## Docs
|
|
29
44
|
|
|
30
45
|
- [Docs index](docs/README.md)
|
package/dist/cli.js
CHANGED
|
@@ -2,28 +2,24 @@
|
|
|
2
2
|
import { appendFileSync, existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { stdin } from "node:process";
|
|
5
|
-
import { createChangelog, mergeChangelog, parsePmItemsJson, readPmItems, writeChangelog, } from "./generator.js";
|
|
5
|
+
import { buildChangelogDocument, createChangelog, mergeChangelog, parsePmItemsJson, readPmItems, writeChangelog, } from "./generator.js";
|
|
6
6
|
import { resolveReleaseContext, resolveReleaseTagWindows } from "./release-context.js";
|
|
7
7
|
async function main() {
|
|
8
8
|
const options = parseArgs(process.argv.slice(2));
|
|
9
9
|
applyReleaseContext(options);
|
|
10
10
|
const items = await loadItems(options);
|
|
11
11
|
const outputPath = resolve(options.output);
|
|
12
|
+
// OPT-IN (`--changelog-json`): emit the full structured changelog document to
|
|
13
|
+
// stdout and exit, leaving every other mode and CHANGELOG.md untouched.
|
|
14
|
+
if (options.changelogJson) {
|
|
15
|
+
const document = buildChangelogDocument(buildGenerationOptions(options, items));
|
|
16
|
+
process.stdout.write(JSON.stringify(document, null, 2) + "\n");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
12
19
|
if (!options.stdout) {
|
|
13
20
|
const result = writeChangelog({
|
|
14
|
-
items,
|
|
21
|
+
...buildGenerationOptions(options, items),
|
|
15
22
|
output: outputPath,
|
|
16
|
-
title: options.title,
|
|
17
|
-
version: options.version,
|
|
18
|
-
date: options.date,
|
|
19
|
-
since: options.since,
|
|
20
|
-
until: options.until,
|
|
21
|
-
releaseWindows: options.releaseWindows,
|
|
22
|
-
includeStatuses: options.statuses,
|
|
23
|
-
groupBy: options.groupBy,
|
|
24
|
-
includeEmpty: options.includeEmpty,
|
|
25
|
-
includeLinks: options.includeLinks,
|
|
26
|
-
itemUrlBase: options.itemUrlBase,
|
|
27
23
|
mode: options.mode,
|
|
28
24
|
check: options.check,
|
|
29
25
|
});
|
|
@@ -45,20 +41,7 @@ async function main() {
|
|
|
45
41
|
process.exit(1);
|
|
46
42
|
return;
|
|
47
43
|
}
|
|
48
|
-
const generated = createChangelog(
|
|
49
|
-
items,
|
|
50
|
-
title: options.title,
|
|
51
|
-
version: options.version,
|
|
52
|
-
date: options.date,
|
|
53
|
-
since: options.since,
|
|
54
|
-
until: options.until,
|
|
55
|
-
releaseWindows: options.releaseWindows,
|
|
56
|
-
includeStatuses: options.statuses,
|
|
57
|
-
groupBy: options.groupBy,
|
|
58
|
-
includeEmpty: options.includeEmpty,
|
|
59
|
-
includeLinks: options.includeLinks,
|
|
60
|
-
itemUrlBase: options.itemUrlBase,
|
|
61
|
-
});
|
|
44
|
+
const generated = createChangelog(buildGenerationOptions(options, items));
|
|
62
45
|
const existing = options.mode === "prepend" && existsSync(outputPath)
|
|
63
46
|
? readFileSync(outputPath, "utf-8")
|
|
64
47
|
: undefined;
|
|
@@ -96,6 +79,10 @@ function parseArgs(args) {
|
|
|
96
79
|
stdin: false,
|
|
97
80
|
pmArgs: [],
|
|
98
81
|
groupBy: "version",
|
|
82
|
+
sectionBy: "category",
|
|
83
|
+
conventional: false,
|
|
84
|
+
contributors: false,
|
|
85
|
+
changelogJson: false,
|
|
99
86
|
includeEmpty: false,
|
|
100
87
|
includeLinks: false,
|
|
101
88
|
mode: "replace",
|
|
@@ -194,6 +181,24 @@ function parseArgs(args) {
|
|
|
194
181
|
case "--group-by":
|
|
195
182
|
options.groupBy = parseGroupBy(requireValue(args, ++i, arg));
|
|
196
183
|
break;
|
|
184
|
+
case "--section-by":
|
|
185
|
+
options.sectionBy = parseSectionBy(requireValue(args, ++i, arg));
|
|
186
|
+
break;
|
|
187
|
+
case "--conventional":
|
|
188
|
+
options.conventional = true;
|
|
189
|
+
break;
|
|
190
|
+
case "--contributors":
|
|
191
|
+
options.contributors = true;
|
|
192
|
+
break;
|
|
193
|
+
case "--changelog-json":
|
|
194
|
+
options.changelogJson = true;
|
|
195
|
+
break;
|
|
196
|
+
case "--limit":
|
|
197
|
+
options.limit = parseLimit(requireValue(args, ++i, arg));
|
|
198
|
+
break;
|
|
199
|
+
case "--since-version":
|
|
200
|
+
options.sinceVersion = requireValue(args, ++i, arg);
|
|
201
|
+
break;
|
|
197
202
|
case "--mode":
|
|
198
203
|
options.mode = parseMode(requireValue(args, ++i, arg));
|
|
199
204
|
break;
|
|
@@ -279,11 +284,44 @@ function parseGroupBy(value) {
|
|
|
279
284
|
return value;
|
|
280
285
|
throw new Error("--group-by must be 'version', 'release', or 'milestone'");
|
|
281
286
|
}
|
|
287
|
+
function parseSectionBy(value) {
|
|
288
|
+
if (value === "category" || value === "type" || value === "status" || value === "label")
|
|
289
|
+
return value;
|
|
290
|
+
throw new Error("--section-by must be 'category', 'type', 'status', or 'label'");
|
|
291
|
+
}
|
|
292
|
+
function parseLimit(value) {
|
|
293
|
+
const parsed = Number.parseInt(value, 10);
|
|
294
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
295
|
+
throw new Error("--limit must be a positive integer");
|
|
296
|
+
}
|
|
297
|
+
return parsed;
|
|
298
|
+
}
|
|
282
299
|
function parseMode(value) {
|
|
283
300
|
if (value === "replace" || value === "prepend")
|
|
284
301
|
return value;
|
|
285
302
|
throw new Error("--mode must be 'replace' or 'prepend'");
|
|
286
303
|
}
|
|
304
|
+
function buildGenerationOptions(options, items) {
|
|
305
|
+
return {
|
|
306
|
+
items,
|
|
307
|
+
title: options.title,
|
|
308
|
+
version: options.version,
|
|
309
|
+
date: options.date,
|
|
310
|
+
since: options.since,
|
|
311
|
+
until: options.until,
|
|
312
|
+
releaseWindows: options.releaseWindows,
|
|
313
|
+
includeStatuses: options.statuses,
|
|
314
|
+
groupBy: options.groupBy,
|
|
315
|
+
sectionBy: options.sectionBy,
|
|
316
|
+
conventional: options.conventional,
|
|
317
|
+
contributors: options.contributors,
|
|
318
|
+
limit: options.limit,
|
|
319
|
+
sinceVersion: options.sinceVersion,
|
|
320
|
+
includeEmpty: options.includeEmpty,
|
|
321
|
+
includeLinks: options.includeLinks,
|
|
322
|
+
itemUrlBase: options.itemUrlBase,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
287
325
|
function buildSummary(options, result, output = result.output) {
|
|
288
326
|
return {
|
|
289
327
|
output,
|
|
@@ -367,6 +405,12 @@ Options:
|
|
|
367
405
|
Git tag glob for --all-release-tags (default: v*)
|
|
368
406
|
--status <list> Comma-separated statuses (default: closed)
|
|
369
407
|
--group-by <mode> version, release, or milestone (default: version)
|
|
408
|
+
--section-by <mode> Within-release grouping: category, type, status, or label (default: category)
|
|
409
|
+
--conventional Use Conventional-Commits headings (Features/Bug Fixes/...) for category grouping
|
|
410
|
+
--contributors Append a Contributors list per release from item assignee/author
|
|
411
|
+
--limit <n> Keep only the most recent N release sections (history modes only)
|
|
412
|
+
--since-version <v> Keep only releases at or newer than version <v> (history modes only)
|
|
413
|
+
--changelog-json Print the full structured changelog document (releases->sections->items) to stdout
|
|
370
414
|
--mode <mode> replace or prepend existing changelog (default: replace)
|
|
371
415
|
--include-empty Emit an empty release section when no items match
|
|
372
416
|
--include-links Include item URLs in generated entries (default: false)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { appendFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { stdin } from \"node:process\";\n\nimport {\n createChangelog,\n mergeChangelog,\n parsePmItemsJson,\n readPmItems,\n writeChangelog,\n} from \"./generator.js\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.js\";\nimport type { ChangelogGroupBy, ChangelogReleaseWindow, PmItem } from \"./types.js\";\n\ninterface CliOptions {\n output: string;\n stdout: boolean;\n json: boolean;\n input?: string;\n stdin: boolean;\n pmRoot?: string;\n pmBin?: string;\n pmArgs: string[];\n pmCwd?: string;\n title?: string;\n version?: string;\n versionFromPackage: boolean;\n date?: string;\n since?: string;\n sincePreviousTag: boolean;\n until?: string;\n untilReleaseTag: boolean;\n allReleaseTags: boolean;\n releaseTagPattern: string;\n statuses?: string[];\n groupBy: ChangelogGroupBy;\n releaseWindows?: ChangelogReleaseWindow[];\n includeEmpty: boolean;\n includeLinks: boolean;\n itemUrlBase?: string;\n mode: \"replace\" | \"prepend\";\n check: boolean;\n githubOutput: boolean;\n githubStepSummary: boolean;\n}\n\nasync function main(): Promise<void> {\n const options = parseArgs(process.argv.slice(2));\n applyReleaseContext(options);\n const items = await loadItems(options);\n const outputPath = resolve(options.output);\n\n if (!options.stdout) {\n const result = writeChangelog({\n items,\n output: outputPath,\n title: options.title,\n version: options.version,\n date: options.date,\n since: options.since,\n until: options.until,\n releaseWindows: options.releaseWindows,\n includeStatuses: options.statuses,\n groupBy: options.groupBy,\n includeEmpty: options.includeEmpty,\n includeLinks: options.includeLinks,\n itemUrlBase: options.itemUrlBase,\n mode: options.mode,\n check: options.check,\n });\n const summary = buildSummary(options, result, outputPath);\n\n if (options.githubOutput) writeGitHubOutput(summary);\n if (options.githubStepSummary) writeGitHubStepSummary(result.markdown);\n if (options.json) {\n process.stdout.write(JSON.stringify(summary) + \"\\n\");\n } else if (options.check) {\n console.error(result.changed ? `Changelog is out of date: ${outputPath}` : `Changelog is up to date: ${outputPath}`);\n } else {\n console.error(`Wrote ${outputPath}`);\n }\n\n if (options.check && result.changed) process.exit(1);\n return;\n }\n\n const generated = createChangelog({\n items,\n title: options.title,\n version: options.version,\n date: options.date,\n since: options.since,\n until: options.until,\n releaseWindows: options.releaseWindows,\n includeStatuses: options.statuses,\n groupBy: options.groupBy,\n includeEmpty: options.includeEmpty,\n includeLinks: options.includeLinks,\n itemUrlBase: options.itemUrlBase,\n });\n const existing = options.mode === \"prepend\" && existsSync(outputPath)\n ? readFileSync(outputPath, \"utf-8\")\n : undefined;\n const merged = options.mode === \"prepend\"\n ? mergeChangelog(existing, generated.markdown, { title: options.title })\n : { markdown: generated.markdown, action: \"replaced\" as const, changed: true };\n\n if (options.stdout) {\n if (options.json) {\n const summary = buildSummary(options, {\n output: outputPath,\n markdown: merged.markdown,\n action: merged.action,\n changed: merged.changed,\n itemCount: generated.itemCount,\n bytes: Buffer.byteLength(merged.markdown, \"utf-8\"),\n });\n if (options.githubOutput) writeGitHubOutput(summary);\n if (options.githubStepSummary) writeGitHubStepSummary(merged.markdown);\n process.stdout.write(JSON.stringify(summary) + \"\\n\");\n return;\n }\n if (options.githubStepSummary) writeGitHubStepSummary(merged.markdown);\n process.stdout.write(merged.markdown);\n return;\n }\n\n}\n\nfunction parseArgs(args: string[]): CliOptions {\n const options: CliOptions = {\n output: \"CHANGELOG.md\",\n stdout: false,\n json: false,\n stdin: false,\n pmArgs: [],\n groupBy: \"version\",\n includeEmpty: false,\n includeLinks: false,\n mode: \"replace\",\n check: false,\n githubOutput: false,\n githubStepSummary: false,\n versionFromPackage: false,\n sincePreviousTag: false,\n untilReleaseTag: false,\n allReleaseTags: false,\n releaseTagPattern: \"v*\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--help\":\n case \"-h\":\n printHelp();\n process.exit(0);\n case \"--output\":\n case \"-o\":\n options.output = requireValue(args, ++i, arg);\n break;\n case \"--stdout\":\n options.stdout = true;\n break;\n case \"--json\":\n options.json = true;\n break;\n case \"--check\":\n options.check = true;\n break;\n case \"--github-output\":\n case \"--set-output\":\n options.githubOutput = true;\n break;\n case \"--github-step-summary\":\n options.githubStepSummary = true;\n break;\n case \"--input\":\n case \"-i\":\n options.input = requireValue(args, ++i, arg);\n break;\n case \"--stdin\":\n options.stdin = true;\n break;\n case \"--pm-root\":\n options.pmRoot = requireValue(args, ++i, arg);\n break;\n case \"--pm-bin\":\n options.pmBin = requireValue(args, ++i, arg);\n break;\n case \"--pm-arg\":\n options.pmArgs.push(requireAnyValue(args, ++i, arg));\n break;\n case \"--pm-cwd\":\n options.pmCwd = requireValue(args, ++i, arg);\n break;\n case \"--title\":\n options.title = requireValue(args, ++i, arg);\n break;\n case \"--version\":\n options.version = requireValue(args, ++i, arg);\n break;\n case \"--release-version-from-package\":\n options.versionFromPackage = true;\n break;\n case \"--date\":\n options.date = requireValue(args, ++i, arg);\n break;\n case \"--since\":\n options.since = requireValue(args, ++i, arg);\n break;\n case \"--since-previous-tag\":\n options.sincePreviousTag = true;\n break;\n case \"--until\":\n options.until = requireValue(args, ++i, arg);\n break;\n case \"--until-release-tag\":\n options.untilReleaseTag = true;\n break;\n case \"--all-release-tags\":\n options.allReleaseTags = true;\n break;\n case \"--release-tag-pattern\":\n options.releaseTagPattern = requireValue(args, ++i, arg);\n break;\n case \"--status\":\n case \"--statuses\":\n options.statuses = requireValue(args, ++i, arg)\n .split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n break;\n case \"--group-by\":\n options.groupBy = parseGroupBy(requireValue(args, ++i, arg));\n break;\n case \"--mode\":\n options.mode = parseMode(requireValue(args, ++i, arg));\n break;\n case \"--include-empty\":\n options.includeEmpty = true;\n break;\n case \"--include-links\":\n options.includeLinks = true;\n break;\n case \"--no-links\":\n options.includeLinks = false;\n break;\n case \"--item-url-base\":\n options.itemUrlBase = requireValue(args, ++i, arg);\n break;\n default:\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return options;\n}\n\nfunction applyReleaseContext(options: CliOptions): void {\n if (options.allReleaseTags) {\n const cwd = options.pmCwd ? resolve(options.pmCwd) : process.cwd();\n if (options.versionFromPackage && !options.version) {\n const context = resolveReleaseContext({\n cwd,\n versionFromPackage: true,\n });\n options.version = context.version;\n }\n options.releaseWindows = resolveReleaseTagWindows({\n cwd,\n tagPattern: options.releaseTagPattern,\n pendingVersion: options.version,\n pendingTimestamp: options.until ?? options.date,\n });\n return;\n }\n\n if (!options.version && !options.versionFromPackage && !options.sincePreviousTag && !options.untilReleaseTag) return;\n const context = resolveReleaseContext({\n cwd: options.pmCwd ? resolve(options.pmCwd) : process.cwd(),\n version: options.version,\n versionFromPackage: options.versionFromPackage,\n since: options.since,\n sincePreviousTag: options.sincePreviousTag,\n until: options.until,\n untilReleaseTag: options.untilReleaseTag,\n });\n options.version = context.version;\n options.date = options.date ?? context.date;\n options.since = context.since;\n options.until = context.until;\n}\n\nasync function loadItems(options: CliOptions): Promise<PmItem[]> {\n if (options.stdin) {\n return parsePmItemsJson(await readStdin());\n }\n\n if (options.input) {\n return parsePmItemsJson(readFileSync(resolve(options.input), \"utf-8\"));\n }\n\n return readPmItems({\n pmRoot: options.pmRoot,\n pmBin: options.pmBin,\n pmArgs: options.pmArgs,\n cwd: options.pmCwd ? resolve(options.pmCwd) : undefined,\n });\n}\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.on(\"data\", (chunk) => {\n data += chunk;\n });\n stdin.on(\"end\", () => resolvePromise(data));\n stdin.on(\"error\", reject);\n });\n}\n\nfunction parseGroupBy(value: string): ChangelogGroupBy {\n if (value === \"version\" || value === \"release\" || value === \"milestone\") return value;\n throw new Error(\"--group-by must be 'version', 'release', or 'milestone'\");\n}\n\nfunction parseMode(value: string): \"replace\" | \"prepend\" {\n if (value === \"replace\" || value === \"prepend\") return value;\n throw new Error(\"--mode must be 'replace' or 'prepend'\");\n}\n\nfunction buildSummary(\n options: CliOptions,\n result: {\n output?: string;\n action: string;\n changed: boolean;\n markdown: string;\n itemCount: number;\n bytes: number;\n },\n output = result.output\n): Record<string, unknown> {\n return {\n output,\n mode: options.mode,\n action: result.action,\n changed: result.changed,\n itemCount: result.itemCount,\n bytes: result.bytes,\n check: options.check,\n markdown: options.stdout ? result.markdown : undefined,\n };\n}\n\nfunction writeGitHubOutput(summary: Record<string, unknown>): void {\n const githubOutput = process.env.GITHUB_OUTPUT;\n if (!githubOutput) {\n throw new Error(\"--github-output requires the GITHUB_OUTPUT environment variable\");\n }\n\n const lines = [\n `output=${String(summary.output ?? \"\")}`,\n `mode=${String(summary.mode ?? \"\")}`,\n `action=${String(summary.action ?? \"\")}`,\n `changed=${String(summary.changed ?? \"\")}`,\n `item_count=${String(summary.itemCount ?? \"\")}`,\n `bytes=${String(summary.bytes ?? \"\")}`,\n ];\n appendFileSync(githubOutput, `${lines.join(\"\\n\")}\\n`, \"utf-8\");\n}\n\nfunction writeGitHubStepSummary(markdown: string): void {\n const githubStepSummary = process.env.GITHUB_STEP_SUMMARY;\n if (!githubStepSummary) {\n throw new Error(\"--github-step-summary requires the GITHUB_STEP_SUMMARY environment variable\");\n }\n\n appendFileSync(githubStepSummary, `${markdown.trimEnd()}\\n`, \"utf-8\");\n}\n\nfunction requireValue(args: string[], index: number, flag: string): string {\n const value = args[index];\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction requireAnyValue(args: string[], index: number, flag: string): string {\n const value = args[index];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction printHelp(): void {\n process.stdout.write(`pm-changelog\n\nGenerate CHANGELOG.md from pm-cli items.\n\nUsage:\n pm-changelog [options]\n\nOptions:\n -o, --output <file> Write changelog to a file (default: CHANGELOG.md)\n --stdout Print markdown instead of writing a file\n --json Print a JSON summary for CI/runners\n --check Do not write; exit 1 when output would change\n --github-output Write summary fields to $GITHUB_OUTPUT\n --github-step-summary Append generated markdown to $GITHUB_STEP_SUMMARY\n -i, --input <file> Read pm JSON from a file instead of running pm\n --stdin Read pm JSON from stdin\n --pm-root <dir> pm project root for \"pm --path <dir> list-all --json\"\n --pm-bin <file> pm executable to run (default: pm)\n --pm-arg <arg> Extra argument passed before \"list-all --json\" (repeatable)\n --pm-cwd <dir> Working directory for running pm\n --title <text> Changelog title (default: Changelog)\n --version <version> Version heading (default: Unreleased)\n --release-version-from-package\n Read version heading from nearest package.json\n --date <date> Release date (default: resolved tag date when available, otherwise today)\n --since <date> Include items changed on or after this date\n --since-previous-tag Derive --since from the previous git tag\n --until <date> Include items changed on or before this date\n --until-release-tag Derive --until from the current release tag when it exists\n --all-release-tags Rebuild full history from git release tag windows\n --release-tag-pattern <glob>\n Git tag glob for --all-release-tags (default: v*)\n --status <list> Comma-separated statuses (default: closed)\n --group-by <mode> version, release, or milestone (default: version)\n --mode <mode> replace or prepend existing changelog (default: replace)\n --include-empty Emit an empty release section when no items match\n --include-links Include item URLs in generated entries (default: false)\n --item-url-base <url> Make item IDs clickable links: [pmc-abc]({url}/pmc-abc.toon)\n`);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { appendFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { stdin } from \"node:process\";\n\nimport {\n buildChangelogDocument,\n createChangelog,\n mergeChangelog,\n parsePmItemsJson,\n readPmItems,\n writeChangelog,\n} from \"./generator.js\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.js\";\nimport type {\n ChangelogGroupBy,\n ChangelogReleaseWindow,\n ChangelogSectionBy,\n PmItem,\n} from \"./types.js\";\n\ninterface CliOptions {\n output: string;\n stdout: boolean;\n json: boolean;\n input?: string;\n stdin: boolean;\n pmRoot?: string;\n pmBin?: string;\n pmArgs: string[];\n pmCwd?: string;\n title?: string;\n version?: string;\n versionFromPackage: boolean;\n date?: string;\n since?: string;\n sincePreviousTag: boolean;\n until?: string;\n untilReleaseTag: boolean;\n allReleaseTags: boolean;\n releaseTagPattern: string;\n statuses?: string[];\n groupBy: ChangelogGroupBy;\n sectionBy: ChangelogSectionBy;\n conventional: boolean;\n contributors: boolean;\n limit?: number;\n sinceVersion?: string;\n changelogJson: boolean;\n releaseWindows?: ChangelogReleaseWindow[];\n includeEmpty: boolean;\n includeLinks: boolean;\n itemUrlBase?: string;\n mode: \"replace\" | \"prepend\";\n check: boolean;\n githubOutput: boolean;\n githubStepSummary: boolean;\n}\n\nasync function main(): Promise<void> {\n const options = parseArgs(process.argv.slice(2));\n applyReleaseContext(options);\n const items = await loadItems(options);\n const outputPath = resolve(options.output);\n\n // OPT-IN (`--changelog-json`): emit the full structured changelog document to\n // stdout and exit, leaving every other mode and CHANGELOG.md untouched.\n if (options.changelogJson) {\n const document = buildChangelogDocument(buildGenerationOptions(options, items));\n process.stdout.write(JSON.stringify(document, null, 2) + \"\\n\");\n return;\n }\n\n if (!options.stdout) {\n const result = writeChangelog({\n ...buildGenerationOptions(options, items),\n output: outputPath,\n mode: options.mode,\n check: options.check,\n });\n const summary = buildSummary(options, result, outputPath);\n\n if (options.githubOutput) writeGitHubOutput(summary);\n if (options.githubStepSummary) writeGitHubStepSummary(result.markdown);\n if (options.json) {\n process.stdout.write(JSON.stringify(summary) + \"\\n\");\n } else if (options.check) {\n console.error(result.changed ? `Changelog is out of date: ${outputPath}` : `Changelog is up to date: ${outputPath}`);\n } else {\n console.error(`Wrote ${outputPath}`);\n }\n\n if (options.check && result.changed) process.exit(1);\n return;\n }\n\n const generated = createChangelog(buildGenerationOptions(options, items));\n const existing = options.mode === \"prepend\" && existsSync(outputPath)\n ? readFileSync(outputPath, \"utf-8\")\n : undefined;\n const merged = options.mode === \"prepend\"\n ? mergeChangelog(existing, generated.markdown, { title: options.title })\n : { markdown: generated.markdown, action: \"replaced\" as const, changed: true };\n\n if (options.stdout) {\n if (options.json) {\n const summary = buildSummary(options, {\n output: outputPath,\n markdown: merged.markdown,\n action: merged.action,\n changed: merged.changed,\n itemCount: generated.itemCount,\n bytes: Buffer.byteLength(merged.markdown, \"utf-8\"),\n });\n if (options.githubOutput) writeGitHubOutput(summary);\n if (options.githubStepSummary) writeGitHubStepSummary(merged.markdown);\n process.stdout.write(JSON.stringify(summary) + \"\\n\");\n return;\n }\n if (options.githubStepSummary) writeGitHubStepSummary(merged.markdown);\n process.stdout.write(merged.markdown);\n return;\n }\n\n}\n\nfunction parseArgs(args: string[]): CliOptions {\n const options: CliOptions = {\n output: \"CHANGELOG.md\",\n stdout: false,\n json: false,\n stdin: false,\n pmArgs: [],\n groupBy: \"version\",\n sectionBy: \"category\",\n conventional: false,\n contributors: false,\n changelogJson: false,\n includeEmpty: false,\n includeLinks: false,\n mode: \"replace\",\n check: false,\n githubOutput: false,\n githubStepSummary: false,\n versionFromPackage: false,\n sincePreviousTag: false,\n untilReleaseTag: false,\n allReleaseTags: false,\n releaseTagPattern: \"v*\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--help\":\n case \"-h\":\n printHelp();\n process.exit(0);\n case \"--output\":\n case \"-o\":\n options.output = requireValue(args, ++i, arg);\n break;\n case \"--stdout\":\n options.stdout = true;\n break;\n case \"--json\":\n options.json = true;\n break;\n case \"--check\":\n options.check = true;\n break;\n case \"--github-output\":\n case \"--set-output\":\n options.githubOutput = true;\n break;\n case \"--github-step-summary\":\n options.githubStepSummary = true;\n break;\n case \"--input\":\n case \"-i\":\n options.input = requireValue(args, ++i, arg);\n break;\n case \"--stdin\":\n options.stdin = true;\n break;\n case \"--pm-root\":\n options.pmRoot = requireValue(args, ++i, arg);\n break;\n case \"--pm-bin\":\n options.pmBin = requireValue(args, ++i, arg);\n break;\n case \"--pm-arg\":\n options.pmArgs.push(requireAnyValue(args, ++i, arg));\n break;\n case \"--pm-cwd\":\n options.pmCwd = requireValue(args, ++i, arg);\n break;\n case \"--title\":\n options.title = requireValue(args, ++i, arg);\n break;\n case \"--version\":\n options.version = requireValue(args, ++i, arg);\n break;\n case \"--release-version-from-package\":\n options.versionFromPackage = true;\n break;\n case \"--date\":\n options.date = requireValue(args, ++i, arg);\n break;\n case \"--since\":\n options.since = requireValue(args, ++i, arg);\n break;\n case \"--since-previous-tag\":\n options.sincePreviousTag = true;\n break;\n case \"--until\":\n options.until = requireValue(args, ++i, arg);\n break;\n case \"--until-release-tag\":\n options.untilReleaseTag = true;\n break;\n case \"--all-release-tags\":\n options.allReleaseTags = true;\n break;\n case \"--release-tag-pattern\":\n options.releaseTagPattern = requireValue(args, ++i, arg);\n break;\n case \"--status\":\n case \"--statuses\":\n options.statuses = requireValue(args, ++i, arg)\n .split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n break;\n case \"--group-by\":\n options.groupBy = parseGroupBy(requireValue(args, ++i, arg));\n break;\n case \"--section-by\":\n options.sectionBy = parseSectionBy(requireValue(args, ++i, arg));\n break;\n case \"--conventional\":\n options.conventional = true;\n break;\n case \"--contributors\":\n options.contributors = true;\n break;\n case \"--changelog-json\":\n options.changelogJson = true;\n break;\n case \"--limit\":\n options.limit = parseLimit(requireValue(args, ++i, arg));\n break;\n case \"--since-version\":\n options.sinceVersion = requireValue(args, ++i, arg);\n break;\n case \"--mode\":\n options.mode = parseMode(requireValue(args, ++i, arg));\n break;\n case \"--include-empty\":\n options.includeEmpty = true;\n break;\n case \"--include-links\":\n options.includeLinks = true;\n break;\n case \"--no-links\":\n options.includeLinks = false;\n break;\n case \"--item-url-base\":\n options.itemUrlBase = requireValue(args, ++i, arg);\n break;\n default:\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return options;\n}\n\nfunction applyReleaseContext(options: CliOptions): void {\n if (options.allReleaseTags) {\n const cwd = options.pmCwd ? resolve(options.pmCwd) : process.cwd();\n if (options.versionFromPackage && !options.version) {\n const context = resolveReleaseContext({\n cwd,\n versionFromPackage: true,\n });\n options.version = context.version;\n }\n options.releaseWindows = resolveReleaseTagWindows({\n cwd,\n tagPattern: options.releaseTagPattern,\n pendingVersion: options.version,\n pendingTimestamp: options.until ?? options.date,\n });\n return;\n }\n\n if (!options.version && !options.versionFromPackage && !options.sincePreviousTag && !options.untilReleaseTag) return;\n const context = resolveReleaseContext({\n cwd: options.pmCwd ? resolve(options.pmCwd) : process.cwd(),\n version: options.version,\n versionFromPackage: options.versionFromPackage,\n since: options.since,\n sincePreviousTag: options.sincePreviousTag,\n until: options.until,\n untilReleaseTag: options.untilReleaseTag,\n });\n options.version = context.version;\n options.date = options.date ?? context.date;\n options.since = context.since;\n options.until = context.until;\n}\n\nasync function loadItems(options: CliOptions): Promise<PmItem[]> {\n if (options.stdin) {\n return parsePmItemsJson(await readStdin());\n }\n\n if (options.input) {\n return parsePmItemsJson(readFileSync(resolve(options.input), \"utf-8\"));\n }\n\n return readPmItems({\n pmRoot: options.pmRoot,\n pmBin: options.pmBin,\n pmArgs: options.pmArgs,\n cwd: options.pmCwd ? resolve(options.pmCwd) : undefined,\n });\n}\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.on(\"data\", (chunk) => {\n data += chunk;\n });\n stdin.on(\"end\", () => resolvePromise(data));\n stdin.on(\"error\", reject);\n });\n}\n\nfunction parseGroupBy(value: string): ChangelogGroupBy {\n if (value === \"version\" || value === \"release\" || value === \"milestone\") return value;\n throw new Error(\"--group-by must be 'version', 'release', or 'milestone'\");\n}\n\nfunction parseSectionBy(value: string): ChangelogSectionBy {\n if (value === \"category\" || value === \"type\" || value === \"status\" || value === \"label\") return value;\n throw new Error(\"--section-by must be 'category', 'type', 'status', or 'label'\");\n}\n\nfunction parseLimit(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new Error(\"--limit must be a positive integer\");\n }\n return parsed;\n}\n\nfunction parseMode(value: string): \"replace\" | \"prepend\" {\n if (value === \"replace\" || value === \"prepend\") return value;\n throw new Error(\"--mode must be 'replace' or 'prepend'\");\n}\n\nfunction buildGenerationOptions(options: CliOptions, items: PmItem[]) {\n return {\n items,\n title: options.title,\n version: options.version,\n date: options.date,\n since: options.since,\n until: options.until,\n releaseWindows: options.releaseWindows,\n includeStatuses: options.statuses,\n groupBy: options.groupBy,\n sectionBy: options.sectionBy,\n conventional: options.conventional,\n contributors: options.contributors,\n limit: options.limit,\n sinceVersion: options.sinceVersion,\n includeEmpty: options.includeEmpty,\n includeLinks: options.includeLinks,\n itemUrlBase: options.itemUrlBase,\n };\n}\n\nfunction buildSummary(\n options: CliOptions,\n result: {\n output?: string;\n action: string;\n changed: boolean;\n markdown: string;\n itemCount: number;\n bytes: number;\n },\n output = result.output\n): Record<string, unknown> {\n return {\n output,\n mode: options.mode,\n action: result.action,\n changed: result.changed,\n itemCount: result.itemCount,\n bytes: result.bytes,\n check: options.check,\n markdown: options.stdout ? result.markdown : undefined,\n };\n}\n\nfunction writeGitHubOutput(summary: Record<string, unknown>): void {\n const githubOutput = process.env.GITHUB_OUTPUT;\n if (!githubOutput) {\n throw new Error(\"--github-output requires the GITHUB_OUTPUT environment variable\");\n }\n\n const lines = [\n `output=${String(summary.output ?? \"\")}`,\n `mode=${String(summary.mode ?? \"\")}`,\n `action=${String(summary.action ?? \"\")}`,\n `changed=${String(summary.changed ?? \"\")}`,\n `item_count=${String(summary.itemCount ?? \"\")}`,\n `bytes=${String(summary.bytes ?? \"\")}`,\n ];\n appendFileSync(githubOutput, `${lines.join(\"\\n\")}\\n`, \"utf-8\");\n}\n\nfunction writeGitHubStepSummary(markdown: string): void {\n const githubStepSummary = process.env.GITHUB_STEP_SUMMARY;\n if (!githubStepSummary) {\n throw new Error(\"--github-step-summary requires the GITHUB_STEP_SUMMARY environment variable\");\n }\n\n appendFileSync(githubStepSummary, `${markdown.trimEnd()}\\n`, \"utf-8\");\n}\n\nfunction requireValue(args: string[], index: number, flag: string): string {\n const value = args[index];\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction requireAnyValue(args: string[], index: number, flag: string): string {\n const value = args[index];\n if (!value) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction printHelp(): void {\n process.stdout.write(`pm-changelog\n\nGenerate CHANGELOG.md from pm-cli items.\n\nUsage:\n pm-changelog [options]\n\nOptions:\n -o, --output <file> Write changelog to a file (default: CHANGELOG.md)\n --stdout Print markdown instead of writing a file\n --json Print a JSON summary for CI/runners\n --check Do not write; exit 1 when output would change\n --github-output Write summary fields to $GITHUB_OUTPUT\n --github-step-summary Append generated markdown to $GITHUB_STEP_SUMMARY\n -i, --input <file> Read pm JSON from a file instead of running pm\n --stdin Read pm JSON from stdin\n --pm-root <dir> pm project root for \"pm --path <dir> list-all --json\"\n --pm-bin <file> pm executable to run (default: pm)\n --pm-arg <arg> Extra argument passed before \"list-all --json\" (repeatable)\n --pm-cwd <dir> Working directory for running pm\n --title <text> Changelog title (default: Changelog)\n --version <version> Version heading (default: Unreleased)\n --release-version-from-package\n Read version heading from nearest package.json\n --date <date> Release date (default: resolved tag date when available, otherwise today)\n --since <date> Include items changed on or after this date\n --since-previous-tag Derive --since from the previous git tag\n --until <date> Include items changed on or before this date\n --until-release-tag Derive --until from the current release tag when it exists\n --all-release-tags Rebuild full history from git release tag windows\n --release-tag-pattern <glob>\n Git tag glob for --all-release-tags (default: v*)\n --status <list> Comma-separated statuses (default: closed)\n --group-by <mode> version, release, or milestone (default: version)\n --section-by <mode> Within-release grouping: category, type, status, or label (default: category)\n --conventional Use Conventional-Commits headings (Features/Bug Fixes/...) for category grouping\n --contributors Append a Contributors list per release from item assignee/author\n --limit <n> Keep only the most recent N release sections (history modes only)\n --since-version <v> Keep only releases at or newer than version <v> (history modes only)\n --changelog-json Print the full structured changelog document (releases->sections->items) to stdout\n --mode <mode> replace or prepend existing changelog (default: replace)\n --include-empty Emit an empty release section when no items match\n --include-links Include item URLs in generated entries (default: false)\n --item-url-base <url> Make item IDs clickable links: [pmc-abc]({url}/pmc-abc.toon)\n`);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exit(1);\n});\n"]}
|
package/dist/extension.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;AASA,
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;AASA,wBA8QG"}
|
package/dist/extension.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { writeFileSync } from "node:fs";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { defineExtension, listAllFrontMatter, EXIT_CODE, PmCliError } from "@unbrained/pm-cli/sdk";
|
|
4
|
-
import { createChangelog, mergeChangelog, writeChangelog } from "./generator.js";
|
|
4
|
+
import { buildChangelogDocument, createChangelog, mergeChangelog, writeChangelog } from "./generator.js";
|
|
5
5
|
import { resolveReleaseContext, resolveReleaseTagWindows } from "./release-context.js";
|
|
6
6
|
export default defineExtension({
|
|
7
7
|
name: "pm-changelog",
|
|
8
|
-
version: "2026.6.
|
|
8
|
+
version: "2026.6.3",
|
|
9
9
|
activate(api) {
|
|
10
10
|
api.registerCommand({
|
|
11
11
|
name: "changelog generate",
|
|
@@ -36,6 +36,12 @@ export default defineExtension({
|
|
|
36
36
|
{ long: "--release-tag-pattern", value_name: "glob", description: "Git tag glob for --all-release-tags (default: v*)" },
|
|
37
37
|
{ long: "--status", value_name: "list", description: "Comma-separated statuses (default: closed)" },
|
|
38
38
|
{ long: "--group-by", value_name: "mode", description: "version, release, or milestone (default: version)" },
|
|
39
|
+
{ long: "--section-by", value_name: "mode", description: "Within-release grouping: category, type, status, or label (default: category)" },
|
|
40
|
+
{ long: "--conventional", description: "Use Conventional-Commits headings (Features/Bug Fixes/...) for category grouping" },
|
|
41
|
+
{ long: "--contributors", description: "Append a Contributors list per release from item assignee/author" },
|
|
42
|
+
{ long: "--limit", value_name: "n", description: "Keep only the most recent N release sections (history modes only)" },
|
|
43
|
+
{ long: "--since-version", value_name: "version", description: "Keep only releases at or newer than this version (history modes only)" },
|
|
44
|
+
{ long: "--changelog-json", description: "Return the full structured changelog document (releases->sections->items)" },
|
|
39
45
|
{ long: "--mode", value_name: "mode", description: "replace or prepend existing changelog (default: replace)" },
|
|
40
46
|
{ long: "--include-empty", description: "Emit an empty release section when no items match" },
|
|
41
47
|
{ long: "--include-links", description: "Include item URLs in generated entries (default: false)" },
|
|
@@ -57,7 +63,13 @@ export default defineExtension({
|
|
|
57
63
|
if (modeOption !== "replace" && modeOption !== "prepend") {
|
|
58
64
|
throw new PmCliError("--mode must be 'replace' or 'prepend'", EXIT_CODE.USAGE);
|
|
59
65
|
}
|
|
66
|
+
const sectionByOption = stringOption(ctx.options, "section-by", "sectionBy") ?? "category";
|
|
67
|
+
if (sectionByOption !== "category" && sectionByOption !== "type" && sectionByOption !== "status" && sectionByOption !== "label") {
|
|
68
|
+
throw new PmCliError("--section-by must be 'category', 'type', 'status', or 'label'", EXIT_CODE.USAGE);
|
|
69
|
+
}
|
|
70
|
+
const limitValue = parseLimitOption(ctx.options);
|
|
60
71
|
const groupBy = groupByOption;
|
|
72
|
+
const sectionBy = sectionByOption;
|
|
61
73
|
const mode = modeOption;
|
|
62
74
|
const statuses = ctx.options["status"]
|
|
63
75
|
?.split(",")
|
|
@@ -99,10 +111,20 @@ export default defineExtension({
|
|
|
99
111
|
releaseWindows,
|
|
100
112
|
includeStatuses: statuses,
|
|
101
113
|
groupBy,
|
|
114
|
+
sectionBy,
|
|
115
|
+
conventional: booleanOption(ctx.options, "conventional", "conventional"),
|
|
116
|
+
contributors: booleanOption(ctx.options, "contributors", "contributors"),
|
|
117
|
+
limit: limitValue,
|
|
118
|
+
sinceVersion: stringOption(ctx.options, "since-version", "sinceVersion"),
|
|
102
119
|
includeEmpty: booleanOption(ctx.options, "include-empty", "includeEmpty"),
|
|
103
120
|
includeLinks: booleanOption(ctx.options, "include-links", "includeLinks"),
|
|
104
121
|
itemUrlBase: stringOption(ctx.options, "item-url-base", "itemUrlBase"),
|
|
105
122
|
};
|
|
123
|
+
// OPT-IN (`--changelog-json`): structured document; never writes a file.
|
|
124
|
+
if (booleanOption(ctx.options, "changelog-json", "changelogJson")) {
|
|
125
|
+
const document = buildChangelogDocument(generationOptions);
|
|
126
|
+
return { document, format: "json", item_count: document.item_count };
|
|
127
|
+
}
|
|
106
128
|
const generated = createChangelog(generationOptions);
|
|
107
129
|
if (stdout) {
|
|
108
130
|
const merged = mode === "prepend"
|
|
@@ -141,8 +163,40 @@ export default defineExtension({
|
|
|
141
163
|
// --release-notes concise mode. Does NOT write CHANGELOG.md unless --output
|
|
142
164
|
// is given, so it is side-effect free by default.
|
|
143
165
|
// -----------------------------------------------------------------------
|
|
144
|
-
|
|
166
|
+
const changelogExportMetadata = {
|
|
167
|
+
description: "Export changelog or release notes through the pm import/export pipeline.",
|
|
168
|
+
intent: "export changelog release notes as markdown or json",
|
|
169
|
+
examples: [
|
|
170
|
+
"pm changelog export",
|
|
171
|
+
"pm changelog export --format json",
|
|
172
|
+
"pm changelog export --release-notes --since-previous-tag --until-release-tag",
|
|
173
|
+
"pm changelog export --output RELEASE_NOTES.md --release-version-from-package",
|
|
174
|
+
],
|
|
175
|
+
flags: [
|
|
176
|
+
{ long: "--format", value_name: "md|json", description: "Export format (default: md)" },
|
|
177
|
+
{ long: "--output", value_name: "file", description: "Write output to a file instead of stdout" },
|
|
178
|
+
{ long: "--release-notes", description: "Use a concise release-notes title and output shape" },
|
|
179
|
+
{ long: "--title", value_name: "text", description: "Output title (default: Changelog or Release Notes)" },
|
|
180
|
+
{ long: "--release-version", value_name: "version", description: "Release/version heading (default: Unreleased)" },
|
|
181
|
+
{ long: "--release-version-from-package", description: "Read release/version heading from nearest package.json" },
|
|
182
|
+
{ long: "--date", value_name: "date", description: "Release date (default: resolved tag date when available, otherwise today)" },
|
|
183
|
+
{ long: "--since", value_name: "date", description: "Include items changed on or after this date" },
|
|
184
|
+
{ long: "--since-previous-tag", description: "Derive --since from the previous git tag" },
|
|
185
|
+
{ long: "--until", value_name: "date", description: "Include items changed on or before this date" },
|
|
186
|
+
{ long: "--until-release-tag", description: "Derive --until from the current release tag when it exists" },
|
|
187
|
+
{ long: "--status", value_name: "list", description: "Comma-separated statuses (default: closed)" },
|
|
188
|
+
{ long: "--group-by", value_name: "mode", description: "version, release, or milestone (default: version)" },
|
|
189
|
+
{ long: "--include-empty", description: "Emit an empty release section when no items match" },
|
|
190
|
+
{ long: "--include-links", description: "Include item URLs in generated entries (default: false)" },
|
|
191
|
+
{ long: "--item-url-base", value_name: "url", description: "Make item IDs clickable links to .toon files under the base URL" },
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
const registerExporterWithMetadata = api.registerExporter;
|
|
195
|
+
registerExporterWithMetadata("changelog", async (ctx) => {
|
|
145
196
|
const format = (stringOption(ctx.options, "format", "format") ?? "md").toLowerCase();
|
|
197
|
+
if (format !== "md" && format !== "json") {
|
|
198
|
+
throw new PmCliError("--format must be 'md' or 'json'", EXIT_CODE.USAGE);
|
|
199
|
+
}
|
|
146
200
|
const groupByOption = stringOption(ctx.options, "group-by", "groupBy") ?? "version";
|
|
147
201
|
if (groupByOption !== "version" && groupByOption !== "release" && groupByOption !== "milestone") {
|
|
148
202
|
throw new PmCliError("--group-by must be 'version', 'release', or 'milestone'", EXIT_CODE.USAGE);
|
|
@@ -195,7 +249,10 @@ export default defineExtension({
|
|
|
195
249
|
return { file: outputPath, format: "markdown", item_count: generated.itemCount };
|
|
196
250
|
}
|
|
197
251
|
return { changelog: generated.markdown, format: "markdown", item_count: generated.itemCount };
|
|
198
|
-
});
|
|
252
|
+
}, changelogExportMetadata);
|
|
253
|
+
if (api.registerExporter.length < 3 && typeof api.registerFlags === "function") {
|
|
254
|
+
api.registerFlags("changelog export", changelogExportMetadata.flags);
|
|
255
|
+
}
|
|
199
256
|
},
|
|
200
257
|
});
|
|
201
258
|
function stringOption(options, kebabKey, camelKey) {
|
|
@@ -205,4 +262,14 @@ function stringOption(options, kebabKey, camelKey) {
|
|
|
205
262
|
function booleanOption(options, kebabKey, camelKey) {
|
|
206
263
|
return Boolean(options[kebabKey] ?? options[camelKey]);
|
|
207
264
|
}
|
|
265
|
+
function parseLimitOption(options) {
|
|
266
|
+
const raw = options["limit"];
|
|
267
|
+
if (raw === undefined || raw === null || raw === "")
|
|
268
|
+
return undefined;
|
|
269
|
+
const parsed = typeof raw === "number" ? raw : Number.parseInt(String(raw), 10);
|
|
270
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
271
|
+
throw new PmCliError("--limit must be a positive integer", EXIT_CODE.USAGE);
|
|
272
|
+
}
|
|
273
|
+
return parsed;
|
|
274
|
+
}
|
|
208
275
|
//# sourceMappingURL=extension.js.map
|
package/dist/extension.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { defineExtension, listAllFrontMatter, EXIT_CODE, PmCliError } from \"@unbrained/pm-cli/sdk\";\n\nimport { createChangelog, mergeChangelog, writeChangelog } from \"./generator.js\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.js\";\nimport type { ChangelogGroupBy } from \"./types.js\";\n\nexport default defineExtension({\n name: \"pm-changelog\",\n version: \"2026.6.2\",\n\n activate(api) {\n api.registerCommand({\n name: \"changelog generate\",\n description: \"Generate a CHANGELOG.md file from pm items.\",\n intent: \"generate changelog release notes from completed pm items\",\n examples: [\n \"pm changelog generate\",\n \"pm changelog generate --release-version 1.2.0\",\n \"pm changelog generate --release-version-from-package --since-previous-tag --until-release-tag\",\n \"pm changelog generate --all-release-tags --mode replace\",\n \"pm changelog generate --output RELEASE_NOTES.md --since 2026-05-01\",\n \"pm changelog generate --stdout --group-by release\",\n \"pm changelog generate --stdout --group-by milestone\",\n \"pm changelog generate --check --mode prepend --release-version 1.2.0\",\n ],\n flags: [\n { long: \"--output\", value_name: \"file\", description: \"Output file path (default: CHANGELOG.md)\" },\n { long: \"--stdout\", description: \"Return markdown instead of writing a file\" },\n { long: \"--title\", value_name: \"text\", description: \"Changelog title (default: Changelog)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--all-release-tags\", description: \"Rebuild full history from git release tag windows\" },\n { long: \"--release-tag-pattern\", value_name: \"glob\", description: \"Git tag glob for --all-release-tags (default: v*)\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--mode\", value_name: \"mode\", description: \"replace or prepend existing changelog (default: replace)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n { long: \"--check\", description: \"Do not write; report whether the changelog would change\" },\n ],\n async run(ctx) {\n const output = (ctx.options[\"output\"] as string | undefined) ?? \"CHANGELOG.md\";\n const stdout = Boolean(ctx.options[\"stdout\"]);\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n const modeOption = (ctx.options[\"mode\"] as string | undefined) ?? \"replace\";\n\n // Throw (with a numeric exitCode) rather than returning { error }: the\n // runtime treats a returned object as a successful run (exit 0), so a\n // returned error silently passed validation failures. A PmCliError\n // carries its exitCode so the handler exits non-zero and runs once.\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n if (modeOption !== \"replace\" && modeOption !== \"prepend\") {\n throw new PmCliError(\"--mode must be 'replace' or 'prepend'\", EXIT_CODE.USAGE);\n }\n const groupBy: ChangelogGroupBy = groupByOption;\n const mode: \"replace\" | \"prepend\" = modeOption;\n\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n\n const allReleaseTags = booleanOption(ctx.options, \"all-release-tags\", \"allReleaseTags\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const titleOption = stringOption(ctx.options, \"title\", \"title\");\n const dateOption = stringOption(ctx.options, \"date\", \"date\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const releaseContext = allReleaseTags\n ? { version: undefined, date: undefined, since: undefined, until: undefined }\n : resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n const releaseWindows = allReleaseTags\n ? resolveReleaseTagWindows({\n cwd: ctx.pm_root,\n tagPattern: stringOption(ctx.options, \"release-tag-pattern\", \"releaseTagPattern\"),\n pendingVersion: releaseVersion,\n pendingTimestamp: untilOption ?? dateOption,\n })\n : undefined;\n\n const items = await listAllFrontMatter(ctx.pm_root);\n const generationOptions = {\n items,\n title: titleOption,\n version: releaseContext.version,\n date: dateOption ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n releaseWindows,\n includeStatuses: statuses,\n groupBy,\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n };\n const generated = createChangelog(generationOptions);\n\n if (stdout) {\n const merged = mode === \"prepend\"\n ? mergeChangelog(undefined, generated.markdown, { title: titleOption })\n : { markdown: generated.markdown, action: \"replaced\" as const, changed: true };\n return {\n changelog: merged.markdown,\n action: merged.action,\n changed: merged.changed,\n item_count: generated.itemCount,\n };\n }\n\n const result = writeChangelog({\n ...generationOptions,\n output,\n mode,\n check: Boolean(ctx.options[\"check\"]),\n });\n if (result.changed && Boolean(ctx.options[\"check\"])) {\n throw new PmCliError(`Changelog is out of date: ${result.output}`, EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n file: result.output,\n action: result.action,\n changed: result.changed,\n item_count: result.itemCount,\n bytes: result.bytes,\n check: Boolean(ctx.options[\"check\"]),\n };\n },\n });\n\n // -----------------------------------------------------------------------\n // Exporter: `pm changelog export` — native export pipeline.\n // Reuses the same generation core as `changelog generate` (whose default\n // output is intentionally left byte-identical). Adds --format md|json and a\n // --release-notes concise mode. Does NOT write CHANGELOG.md unless --output\n // is given, so it is side-effect free by default.\n // -----------------------------------------------------------------------\n api.registerExporter(\"changelog\", async (ctx) => {\n const format = (stringOption(ctx.options, \"format\", \"format\") ?? \"md\").toLowerCase();\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n const releaseNotes = booleanOption(ctx.options, \"release-notes\", \"releaseNotes\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\").map((s) => s.trim()).filter(Boolean);\n\n const releaseContext = resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n\n const items = await listAllFrontMatter(ctx.pm_root);\n const generated = createChangelog({\n items,\n title: stringOption(ctx.options, \"title\", \"title\") ?? (releaseNotes ? \"Release Notes\" : undefined),\n version: releaseContext.version,\n date: stringOption(ctx.options, \"date\", \"date\") ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n includeStatuses: statuses,\n groupBy: groupByOption as ChangelogGroupBy,\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n });\n\n const outputPath = stringOption(ctx.options, \"output\", \"output\");\n if (format === \"json\") {\n const payload = {\n version: releaseContext.version ?? \"Unreleased\",\n item_count: generated.itemCount,\n group_by: groupByOption,\n markdown: generated.markdown,\n };\n if (outputPath) {\n writeFileSync(resolve(outputPath), JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"json\", item_count: generated.itemCount };\n }\n return payload;\n }\n\n if (outputPath) {\n writeFileSync(resolve(outputPath), generated.markdown.endsWith(\"\\n\") ? generated.markdown : generated.markdown + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"markdown\", item_count: generated.itemCount };\n }\n return { changelog: generated.markdown, format: \"markdown\", item_count: generated.itemCount };\n });\n },\n});\n\nfunction stringOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): string | undefined {\n const value = options[kebabKey] ?? options[camelKey];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction booleanOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): boolean {\n return Boolean(options[kebabKey] ?? options[camelKey]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { defineExtension, listAllFrontMatter, EXIT_CODE, PmCliError } from \"@unbrained/pm-cli/sdk\";\n\nimport { buildChangelogDocument, createChangelog, mergeChangelog, writeChangelog } from \"./generator.js\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.js\";\nimport type { ChangelogGroupBy, ChangelogSectionBy } from \"./types.js\";\n\nexport default defineExtension({\n name: \"pm-changelog\",\n version: \"2026.6.3\",\n\n activate(api) {\n api.registerCommand({\n name: \"changelog generate\",\n description: \"Generate a CHANGELOG.md file from pm items.\",\n intent: \"generate changelog release notes from completed pm items\",\n examples: [\n \"pm changelog generate\",\n \"pm changelog generate --release-version 1.2.0\",\n \"pm changelog generate --release-version-from-package --since-previous-tag --until-release-tag\",\n \"pm changelog generate --all-release-tags --mode replace\",\n \"pm changelog generate --output RELEASE_NOTES.md --since 2026-05-01\",\n \"pm changelog generate --stdout --group-by release\",\n \"pm changelog generate --stdout --group-by milestone\",\n \"pm changelog generate --check --mode prepend --release-version 1.2.0\",\n ],\n flags: [\n { long: \"--output\", value_name: \"file\", description: \"Output file path (default: CHANGELOG.md)\" },\n { long: \"--stdout\", description: \"Return markdown instead of writing a file\" },\n { long: \"--title\", value_name: \"text\", description: \"Changelog title (default: Changelog)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--all-release-tags\", description: \"Rebuild full history from git release tag windows\" },\n { long: \"--release-tag-pattern\", value_name: \"glob\", description: \"Git tag glob for --all-release-tags (default: v*)\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--section-by\", value_name: \"mode\", description: \"Within-release grouping: category, type, status, or label (default: category)\" },\n { long: \"--conventional\", description: \"Use Conventional-Commits headings (Features/Bug Fixes/...) for category grouping\" },\n { long: \"--contributors\", description: \"Append a Contributors list per release from item assignee/author\" },\n { long: \"--limit\", value_name: \"n\", description: \"Keep only the most recent N release sections (history modes only)\" },\n { long: \"--since-version\", value_name: \"version\", description: \"Keep only releases at or newer than this version (history modes only)\" },\n { long: \"--changelog-json\", description: \"Return the full structured changelog document (releases->sections->items)\" },\n { long: \"--mode\", value_name: \"mode\", description: \"replace or prepend existing changelog (default: replace)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n { long: \"--check\", description: \"Do not write; report whether the changelog would change\" },\n ],\n async run(ctx) {\n const output = (ctx.options[\"output\"] as string | undefined) ?? \"CHANGELOG.md\";\n const stdout = Boolean(ctx.options[\"stdout\"]);\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n const modeOption = (ctx.options[\"mode\"] as string | undefined) ?? \"replace\";\n\n // Throw (with a numeric exitCode) rather than returning { error }: the\n // runtime treats a returned object as a successful run (exit 0), so a\n // returned error silently passed validation failures. A PmCliError\n // carries its exitCode so the handler exits non-zero and runs once.\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n if (modeOption !== \"replace\" && modeOption !== \"prepend\") {\n throw new PmCliError(\"--mode must be 'replace' or 'prepend'\", EXIT_CODE.USAGE);\n }\n const sectionByOption = stringOption(ctx.options, \"section-by\", \"sectionBy\") ?? \"category\";\n if (sectionByOption !== \"category\" && sectionByOption !== \"type\" && sectionByOption !== \"status\" && sectionByOption !== \"label\") {\n throw new PmCliError(\"--section-by must be 'category', 'type', 'status', or 'label'\", EXIT_CODE.USAGE);\n }\n const limitValue = parseLimitOption(ctx.options);\n const groupBy: ChangelogGroupBy = groupByOption;\n const sectionBy: ChangelogSectionBy = sectionByOption;\n const mode: \"replace\" | \"prepend\" = modeOption;\n\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n\n const allReleaseTags = booleanOption(ctx.options, \"all-release-tags\", \"allReleaseTags\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const titleOption = stringOption(ctx.options, \"title\", \"title\");\n const dateOption = stringOption(ctx.options, \"date\", \"date\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const releaseContext = allReleaseTags\n ? { version: undefined, date: undefined, since: undefined, until: undefined }\n : resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n const releaseWindows = allReleaseTags\n ? resolveReleaseTagWindows({\n cwd: ctx.pm_root,\n tagPattern: stringOption(ctx.options, \"release-tag-pattern\", \"releaseTagPattern\"),\n pendingVersion: releaseVersion,\n pendingTimestamp: untilOption ?? dateOption,\n })\n : undefined;\n\n const items = await listAllFrontMatter(ctx.pm_root);\n const generationOptions = {\n items,\n title: titleOption,\n version: releaseContext.version,\n date: dateOption ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n releaseWindows,\n includeStatuses: statuses,\n groupBy,\n sectionBy,\n conventional: booleanOption(ctx.options, \"conventional\", \"conventional\"),\n contributors: booleanOption(ctx.options, \"contributors\", \"contributors\"),\n limit: limitValue,\n sinceVersion: stringOption(ctx.options, \"since-version\", \"sinceVersion\"),\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n };\n\n // OPT-IN (`--changelog-json`): structured document; never writes a file.\n if (booleanOption(ctx.options, \"changelog-json\", \"changelogJson\")) {\n const document = buildChangelogDocument(generationOptions);\n return { document, format: \"json\", item_count: document.item_count };\n }\n\n const generated = createChangelog(generationOptions);\n\n if (stdout) {\n const merged = mode === \"prepend\"\n ? mergeChangelog(undefined, generated.markdown, { title: titleOption })\n : { markdown: generated.markdown, action: \"replaced\" as const, changed: true };\n return {\n changelog: merged.markdown,\n action: merged.action,\n changed: merged.changed,\n item_count: generated.itemCount,\n };\n }\n\n const result = writeChangelog({\n ...generationOptions,\n output,\n mode,\n check: Boolean(ctx.options[\"check\"]),\n });\n if (result.changed && Boolean(ctx.options[\"check\"])) {\n throw new PmCliError(`Changelog is out of date: ${result.output}`, EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n file: result.output,\n action: result.action,\n changed: result.changed,\n item_count: result.itemCount,\n bytes: result.bytes,\n check: Boolean(ctx.options[\"check\"]),\n };\n },\n });\n\n // -----------------------------------------------------------------------\n // Exporter: `pm changelog export` — native export pipeline.\n // Reuses the same generation core as `changelog generate` (whose default\n // output is intentionally left byte-identical). Adds --format md|json and a\n // --release-notes concise mode. Does NOT write CHANGELOG.md unless --output\n // is given, so it is side-effect free by default.\n // -----------------------------------------------------------------------\n const changelogExportMetadata = {\n description: \"Export changelog or release notes through the pm import/export pipeline.\",\n intent: \"export changelog release notes as markdown or json\",\n examples: [\n \"pm changelog export\",\n \"pm changelog export --format json\",\n \"pm changelog export --release-notes --since-previous-tag --until-release-tag\",\n \"pm changelog export --output RELEASE_NOTES.md --release-version-from-package\",\n ],\n flags: [\n { long: \"--format\", value_name: \"md|json\", description: \"Export format (default: md)\" },\n { long: \"--output\", value_name: \"file\", description: \"Write output to a file instead of stdout\" },\n { long: \"--release-notes\", description: \"Use a concise release-notes title and output shape\" },\n { long: \"--title\", value_name: \"text\", description: \"Output title (default: Changelog or Release Notes)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n ],\n };\n const registerExporterWithMetadata = api.registerExporter as unknown as (\n name: string,\n exporter: Parameters<typeof api.registerExporter>[1],\n options: typeof changelogExportMetadata,\n ) => void;\n\n registerExporterWithMetadata(\"changelog\", async (ctx) => {\n const format = (stringOption(ctx.options, \"format\", \"format\") ?? \"md\").toLowerCase();\n if (format !== \"md\" && format !== \"json\") {\n throw new PmCliError(\"--format must be 'md' or 'json'\", EXIT_CODE.USAGE);\n }\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n const releaseNotes = booleanOption(ctx.options, \"release-notes\", \"releaseNotes\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\").map((s) => s.trim()).filter(Boolean);\n\n const releaseContext = resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n\n const items = await listAllFrontMatter(ctx.pm_root);\n const generated = createChangelog({\n items,\n title: stringOption(ctx.options, \"title\", \"title\") ?? (releaseNotes ? \"Release Notes\" : undefined),\n version: releaseContext.version,\n date: stringOption(ctx.options, \"date\", \"date\") ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n includeStatuses: statuses,\n groupBy: groupByOption as ChangelogGroupBy,\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n });\n\n const outputPath = stringOption(ctx.options, \"output\", \"output\");\n if (format === \"json\") {\n const payload = {\n version: releaseContext.version ?? \"Unreleased\",\n item_count: generated.itemCount,\n group_by: groupByOption,\n markdown: generated.markdown,\n };\n if (outputPath) {\n writeFileSync(resolve(outputPath), JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"json\", item_count: generated.itemCount };\n }\n return payload;\n }\n\n if (outputPath) {\n writeFileSync(resolve(outputPath), generated.markdown.endsWith(\"\\n\") ? generated.markdown : generated.markdown + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"markdown\", item_count: generated.itemCount };\n }\n return { changelog: generated.markdown, format: \"markdown\", item_count: generated.itemCount };\n }, changelogExportMetadata);\n if (api.registerExporter.length < 3 && typeof api.registerFlags === \"function\") {\n api.registerFlags(\"changelog export\", changelogExportMetadata.flags);\n }\n },\n});\n\nfunction stringOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): string | undefined {\n const value = options[kebabKey] ?? options[camelKey];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction booleanOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): boolean {\n return Boolean(options[kebabKey] ?? options[camelKey]);\n}\n\nfunction parseLimitOption(options: Record<string, unknown>): number | undefined {\n const raw = options[\"limit\"];\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number.parseInt(String(raw), 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new PmCliError(\"--limit must be a positive integer\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n"]}
|
package/dist/generator.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import type { GeneratedChangelog, GenerateChangelogOptions, MergeChangelogOptions, MergeChangelogResult, PmItem, ReadPmItemsOptions, WriteChangelogOptions, WriteChangelogResult } from "./types.js";
|
|
1
|
+
import type { ChangelogDocument, GeneratedChangelog, GenerateChangelogOptions, MergeChangelogOptions, MergeChangelogResult, PmItem, ReadPmItemsOptions, WriteChangelogOptions, WriteChangelogResult } from "./types.js";
|
|
2
2
|
export declare function generateChangelog(options: GenerateChangelogOptions): string;
|
|
3
3
|
export declare function createChangelog(options: GenerateChangelogOptions): GeneratedChangelog;
|
|
4
|
+
/**
|
|
5
|
+
* OPT-IN (`--changelog-json`): build a structured representation of the
|
|
6
|
+
* changelog (releases -> sections -> items) for downstream tooling. This is
|
|
7
|
+
* deliberately distinct from the `--json` CLI summary (action/bytes/changed)
|
|
8
|
+
* and from the `changelog export --format json` payload (which wraps markdown).
|
|
9
|
+
* It applies the same filtering, limiting and grouping as the markdown path so
|
|
10
|
+
* the two stay in sync, but emits structured data instead of rendered text.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildChangelogDocument(options: GenerateChangelogOptions): ChangelogDocument;
|
|
4
13
|
export declare function mergeChangelog(existingMarkdown: string | undefined, generatedMarkdown: string, options?: MergeChangelogOptions): MergeChangelogResult;
|
|
5
14
|
export declare function readPmItems(options?: ReadPmItemsOptions): PmItem[];
|
|
6
15
|
export declare function writeChangelog(options: WriteChangelogOptions): WriteChangelogResult;
|