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 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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;AASA,wBA8MG"}
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.2",
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
- api.registerExporter("changelog", async (ctx) => {
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
@@ -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"]}
@@ -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;