pm-changelog 2026.8.2 → 2026.8.4
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/dist/cli.js +53 -8
- package/dist/cli.js.map +1 -1
- package/dist/diff.d.ts +1 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +23 -0
- package/dist/diff.js.map +1 -1
- package/dist/extension.js +17 -1
- package/dist/extension.js.map +1 -1
- package/dist/generator.d.ts +34 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +148 -28
- package/dist/generator.js.map +1 -1
- package/dist/release-context.d.ts +35 -0
- package/dist/release-context.d.ts.map +1 -1
- package/dist/release-context.js +68 -10
- package/dist/release-context.js.map +1 -1
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/manifest.json +2 -2
- package/package.json +8 -6
- package/dist/sync-version.d.ts +0 -3
- package/dist/sync-version.d.ts.map +0 -1
- package/dist/sync-version.js +0 -36
- package/dist/sync-version.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.8.4 - 2026-08-04
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Handle SDK CompletionTimestampResolution unresolved arm and upgrade pm-cli pin to 2026.8.3 ([pmc-5hho](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-5hho.toon))
|
|
8
|
+
|
|
9
|
+
## 2026.8.3 - 2026-08-03
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Docstring coverage gate: a parser-backed, self-scanning mandatory check ([pmc-kdm1](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/features/pmc-kdm1.toon))
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- sync-version could silently restamp the wrong version literal during a release ([pmc-vbft](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-vbft.toon))
|
|
18
|
+
|
|
3
19
|
## 2026.8.2 - 2026-08-02
|
|
4
20
|
|
|
5
21
|
### Fixed
|
package/dist/cli.js
CHANGED
|
@@ -97,6 +97,8 @@ const KNOWN_OPTIONS = [
|
|
|
97
97
|
"--until-release-tag",
|
|
98
98
|
"--version",
|
|
99
99
|
];
|
|
100
|
+
/** Run one CLI invocation end to end: parse flags, resolve the release context
|
|
101
|
+
* from git, load items, generate, then write or compare. */
|
|
100
102
|
async function main() {
|
|
101
103
|
const options = parseArgs(process.argv.slice(2));
|
|
102
104
|
applyReleaseContext(options);
|
|
@@ -227,6 +229,9 @@ async function main() {
|
|
|
227
229
|
return;
|
|
228
230
|
}
|
|
229
231
|
}
|
|
232
|
+
/** Turn argv into validated options, rejecting an unknown flag with a
|
|
233
|
+
* near-miss suggestion rather than ignoring it - a silently dropped flag would
|
|
234
|
+
* generate a subtly different changelog and still exit zero. */
|
|
230
235
|
function parseArgs(args) {
|
|
231
236
|
const normalizedArgs = normalizeArgs(args);
|
|
232
237
|
const options = {
|
|
@@ -430,6 +435,8 @@ function parseArgs(args) {
|
|
|
430
435
|
}
|
|
431
436
|
return options;
|
|
432
437
|
}
|
|
438
|
+
/** Split `--flag=value` into separate tokens so both spellings reach one
|
|
439
|
+
* parsing path. */
|
|
433
440
|
function normalizeArgs(args) {
|
|
434
441
|
const normalized = [];
|
|
435
442
|
for (const arg of args) {
|
|
@@ -462,6 +469,9 @@ function optionToken(arg) {
|
|
|
462
469
|
const equalsIndex = arg.indexOf("=");
|
|
463
470
|
return equalsIndex > 0 ? arg.slice(0, equalsIndex) : arg;
|
|
464
471
|
}
|
|
472
|
+
/** Find the closest known flag to a mistyped one, or `undefined` when nothing
|
|
473
|
+
* is close enough to be worth suggesting. Ties break toward the shorter name so
|
|
474
|
+
* the suggestion is the more common flag. */
|
|
465
475
|
function suggestOption(arg) {
|
|
466
476
|
let best;
|
|
467
477
|
for (const candidate of KNOWN_OPTIONS) {
|
|
@@ -480,6 +490,8 @@ function suggestOption(arg) {
|
|
|
480
490
|
}
|
|
481
491
|
return best?.option;
|
|
482
492
|
}
|
|
493
|
+
/** Levenshtein distance between two strings, used only to rank flag
|
|
494
|
+
* suggestions. */
|
|
483
495
|
function editDistance(left, right) {
|
|
484
496
|
if (left === right)
|
|
485
497
|
return 0;
|
|
@@ -498,6 +510,9 @@ function editDistance(left, right) {
|
|
|
498
510
|
}
|
|
499
511
|
return matrix[rows - 1][cols - 1];
|
|
500
512
|
}
|
|
513
|
+
/** Fill version, date, and time bounds from the checkout, mutating `options` in
|
|
514
|
+
* place. The version may come from the nearest package.json; the dates and
|
|
515
|
+
* bounds come from git tags. Explicit flags are preserved; only gaps filled. */
|
|
501
516
|
function applyReleaseContext(options) {
|
|
502
517
|
if (options.allReleaseTags) {
|
|
503
518
|
const cwd = options.pmCwd ? resolve(options.pmCwd) : process.cwd();
|
|
@@ -533,6 +548,9 @@ function applyReleaseContext(options) {
|
|
|
533
548
|
options.since = context.since;
|
|
534
549
|
options.until = context.until;
|
|
535
550
|
}
|
|
551
|
+
/** Load pm items from stdin, a JSON file, or the real pm CLI, in that order of
|
|
552
|
+
* precedence. Bodies are requested only when a preview will render them, since
|
|
553
|
+
* they make the list payload substantially larger. */
|
|
536
554
|
async function loadItems(options) {
|
|
537
555
|
if (options.stdin) {
|
|
538
556
|
return parsePmItemsJson(await readStdin());
|
|
@@ -550,6 +568,7 @@ async function loadItems(options) {
|
|
|
550
568
|
includeBody: options.bodyPreview !== undefined && options.bodyPreview > 0,
|
|
551
569
|
});
|
|
552
570
|
}
|
|
571
|
+
/** Read stdin to completion as UTF-8, for `--stdin` item input. */
|
|
553
572
|
function readStdin() {
|
|
554
573
|
return new Promise((resolvePromise, reject) => {
|
|
555
574
|
let data = "";
|
|
@@ -571,6 +590,8 @@ function parseSectionBy(value) {
|
|
|
571
590
|
return value;
|
|
572
591
|
throw new Error("--section-by must be 'category', 'type', 'status', or 'label'");
|
|
573
592
|
}
|
|
593
|
+
/** Validate `--item-ref-style`, rejecting unknown spellings so a typo cannot
|
|
594
|
+
* quietly change how every entry cites its item. */
|
|
574
595
|
function parseItemRefStyle(value) {
|
|
575
596
|
const normalized = value.trim().toLowerCase();
|
|
576
597
|
if (normalized === "auto" || normalized === "label" || normalized === "toon" || normalized === "github") {
|
|
@@ -578,6 +599,7 @@ function parseItemRefStyle(value) {
|
|
|
578
599
|
}
|
|
579
600
|
throw new Error("--item-ref-style must be 'auto', 'label', 'toon', or 'github'");
|
|
580
601
|
}
|
|
602
|
+
/** Validate `--limit` as a positive integer count of release sections. */
|
|
581
603
|
function parseLimit(value) {
|
|
582
604
|
const parsed = Number.parseInt(value, 10);
|
|
583
605
|
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
@@ -585,6 +607,7 @@ function parseLimit(value) {
|
|
|
585
607
|
}
|
|
586
608
|
return parsed;
|
|
587
609
|
}
|
|
610
|
+
/** Validate `--body-preview` as a positive character width. */
|
|
588
611
|
function parseBodyPreview(value) {
|
|
589
612
|
const parsed = Number.parseInt(value, 10);
|
|
590
613
|
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
@@ -605,6 +628,9 @@ function parseFormat(value) {
|
|
|
605
628
|
return "json";
|
|
606
629
|
throw new Error("--format must be 'md' or 'json'");
|
|
607
630
|
}
|
|
631
|
+
/** Project parsed CLI options plus the loaded items onto the generator's option
|
|
632
|
+
* shape. An empty `--exclude-tag` list is passed as `undefined` so the filter
|
|
633
|
+
* stays entirely inert rather than running against nothing. */
|
|
608
634
|
function buildGenerationOptions(options, items) {
|
|
609
635
|
return {
|
|
610
636
|
items,
|
|
@@ -634,6 +660,9 @@ function buildGenerationOptions(options, items) {
|
|
|
634
660
|
excludeTags: options.excludeTags.length > 0 ? options.excludeTags : undefined,
|
|
635
661
|
};
|
|
636
662
|
}
|
|
663
|
+
/** Assemble the machine-readable run summary emitted by `--json` and written as
|
|
664
|
+
* GitHub step outputs. The job-summary panel receives generated markdown
|
|
665
|
+
* instead, so it is not a consumer of this. */
|
|
637
666
|
function buildSummary(options, result, output = result.output, selectionReport) {
|
|
638
667
|
const summary = {
|
|
639
668
|
output,
|
|
@@ -649,14 +678,18 @@ function buildSummary(options, result, output = result.output, selectionReport)
|
|
|
649
678
|
summary.selection_report = selectionReport;
|
|
650
679
|
return summary;
|
|
651
680
|
}
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
681
|
+
/**
|
|
682
|
+
* OPT-OUT (`--no-check-diff` suppresses): when `--check` fails, show WHAT
|
|
683
|
+
* drifted, not just THAT it drifted.
|
|
684
|
+
*
|
|
685
|
+
* The failure line alone forces the reader - usually a CI agent that cannot
|
|
686
|
+
* rerun the generator interactively - to clone the repo and diff generator
|
|
687
|
+
* output by hand; the common cause (a PR branch behind `main`, so the merge ref
|
|
688
|
+
* sees a release commit the branch lacks) is obvious from the diff in seconds.
|
|
689
|
+
* Check mode never writes, so the file on disk is still the committed
|
|
690
|
+
* changelog. Stderr only: stdout stays byte-identical for callers that capture
|
|
691
|
+
* it.
|
|
692
|
+
*/
|
|
660
693
|
function writeCheckDiff(options, outputPath, generated) {
|
|
661
694
|
const committed = existsSync(outputPath) ? readFileSync(outputPath, "utf-8") : "";
|
|
662
695
|
// Label with the output's basename (e.g. `CHANGELOG.md`) rather than the
|
|
@@ -673,6 +706,9 @@ function writeCheckDiff(options, outputPath, generated) {
|
|
|
673
706
|
+ " Regenerate locally (rerun without --check, e.g. --mode replace) to see the full changelog.\n");
|
|
674
707
|
}
|
|
675
708
|
}
|
|
709
|
+
/** Print `--explain` diagnostics to stderr: how many items each filter stage
|
|
710
|
+
* dropped, and how the survivors' release placement was dated. Stderr keeps
|
|
711
|
+
* stdout byte-identical for callers capturing generated markdown. */
|
|
676
712
|
function writeSelectionReport(report) {
|
|
677
713
|
const excluded = report.excluded_counts;
|
|
678
714
|
console.error("Selection report:"
|
|
@@ -692,6 +728,8 @@ function writeSelectionReport(report) {
|
|
|
692
728
|
console.error(`Hint: ${hint}`);
|
|
693
729
|
}
|
|
694
730
|
}
|
|
731
|
+
/** Append the run summary as `key=value` step outputs for a workflow to branch
|
|
732
|
+
* on, failing loudly when invoked outside GitHub Actions. */
|
|
695
733
|
function writeGitHubOutput(summary) {
|
|
696
734
|
const githubOutput = process.env.GITHUB_OUTPUT;
|
|
697
735
|
if (!githubOutput) {
|
|
@@ -707,6 +745,8 @@ function writeGitHubOutput(summary) {
|
|
|
707
745
|
];
|
|
708
746
|
appendFileSync(githubOutput, `${lines.join("\n")}\n`, "utf-8");
|
|
709
747
|
}
|
|
748
|
+
/** Append generated markdown to the workflow's job summary panel, so release
|
|
749
|
+
* notes are readable in the run without downloading an artifact. */
|
|
710
750
|
function writeGitHubStepSummary(markdown) {
|
|
711
751
|
const githubStepSummary = process.env.GITHUB_STEP_SUMMARY;
|
|
712
752
|
if (!githubStepSummary) {
|
|
@@ -714,6 +754,8 @@ function writeGitHubStepSummary(markdown) {
|
|
|
714
754
|
}
|
|
715
755
|
appendFileSync(githubStepSummary, `${markdown.trimEnd()}\n`, "utf-8");
|
|
716
756
|
}
|
|
757
|
+
/** Read a flag's value, rejecting a missing one and a following `--flag`. The
|
|
758
|
+
* latter catches an omitted value being silently swallowed by the next flag. */
|
|
717
759
|
function requireValue(args, index, flag) {
|
|
718
760
|
const value = args[index];
|
|
719
761
|
if (!value || value.startsWith("--")) {
|
|
@@ -721,6 +763,8 @@ function requireValue(args, index, flag) {
|
|
|
721
763
|
}
|
|
722
764
|
return value;
|
|
723
765
|
}
|
|
766
|
+
/** Read a flag's value allowing a leading `--`, for flags whose argument may
|
|
767
|
+
* legitimately look like one. */
|
|
724
768
|
function requireAnyValue(args, index, flag) {
|
|
725
769
|
const value = args[index];
|
|
726
770
|
if (!value) {
|
|
@@ -728,6 +772,7 @@ function requireAnyValue(args, index, flag) {
|
|
|
728
772
|
}
|
|
729
773
|
return value;
|
|
730
774
|
}
|
|
775
|
+
/** Write the usage text listing every supported flag. */
|
|
731
776
|
function printHelp() {
|
|
732
777
|
process.stdout.write(`pm-changelog
|
|
733
778
|
|
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 { basename, resolve } from \"node:path\";\nimport { stdin } from \"node:process\";\n\nimport { createUnifiedDiff, DEFAULT_MAX_DIFF_LINES } from \"./diff.ts\";\nimport {\n buildChangelogDocument,\n createChangelog,\n createChangelogSummary,\n explainChangelogSelection,\n formatInferredSources,\n formatSummaryLine,\n mergeChangelog,\n parsePmItemsJson,\n readPmItems,\n suggestSemver,\n writeChangelog,\n} from \"./generator.ts\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.ts\";\nimport type {\n ChangelogGroupBy,\n ChangelogItemRefStyle,\n ChangelogReleaseWindow,\n ChangelogSelectionReport,\n ChangelogSectionBy,\n PmItem,\n} from \"./types.ts\";\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 summary: boolean;\n format: \"md\" | \"json\";\n conventional: boolean;\n contributors: boolean;\n limit?: number;\n sinceVersion?: string;\n breakingChanges: boolean;\n suggestSemver: boolean;\n bodyPreview?: number;\n emojiPrefix: boolean;\n includeMetadata: boolean;\n changelogJson: boolean;\n releaseWindows?: ChangelogReleaseWindow[];\n includeEmpty: boolean;\n includeLinks: boolean;\n itemUrlBase?: string;\n itemRefStyle?: ChangelogItemRefStyle;\n respectItemRelease: boolean;\n excludeTags: string[];\n mode: \"replace\" | \"prepend\";\n check: boolean;\n checkDiff: boolean;\n explain: boolean;\n githubOutput: boolean;\n githubStepSummary: boolean;\n}\n\n// Compatibility aliases for value-taking options. Kept intentionally small and\n// explicit so default behavior remains stable.\nconst OPTION_ALIASES: Readonly<Record<string, string>> = {\n \"--release-version\": \"--version\",\n};\n\nconst VALUE_OPTIONS = new Set<string>([\n \"-i\",\n \"-o\",\n \"--body-preview\",\n \"--date\",\n \"--exclude-tag\",\n \"--exclude-tags\",\n \"--format\",\n \"--group-by\",\n \"--input\",\n \"--item-ref-style\",\n \"--item-url-base\",\n \"--limit\",\n \"--mode\",\n \"--output\",\n \"--pm-arg\",\n \"--pm-bin\",\n \"--pm-cwd\",\n \"--pm-root\",\n \"--release-tag-pattern\",\n \"--release-version\",\n \"--section-by\",\n \"--since\",\n \"--since-version\",\n \"--status\",\n \"--statuses\",\n \"--title\",\n \"--until\",\n \"--version\",\n]);\n\nconst KNOWN_OPTIONS = [\n \"-h\",\n \"-i\",\n \"-o\",\n \"--all-release-tags\",\n \"--body-preview\",\n \"--breaking-changes\",\n \"--changelog-json\",\n \"--check\",\n \"--conventional\",\n \"--contributors\",\n \"--date\",\n \"--emoji-prefix\",\n \"--exclude-tag\",\n \"--exclude-tags\",\n \"--explain\",\n \"--format\",\n \"--github-output\",\n \"--github-step-summary\",\n \"--group-by\",\n \"--help\",\n \"--include-empty\",\n \"--include-links\",\n \"--include-metadata\",\n \"--input\",\n \"--item-ref-style\",\n \"--item-url-base\",\n \"--json\",\n \"--limit\",\n \"--mode\",\n \"--no-check-diff\",\n \"--no-links\",\n \"--output\",\n \"--pm-arg\",\n \"--pm-bin\",\n \"--pm-cwd\",\n \"--pm-root\",\n \"--release-tag-pattern\",\n \"--release-version\",\n \"--release-version-from-package\",\n \"--respect-item-release\",\n \"--section-by\",\n \"--set-output\",\n \"--since\",\n \"--since-previous-tag\",\n \"--since-version\",\n \"--status\",\n \"--statuses\",\n \"--stdin\",\n \"--stdout\",\n \"--summary\",\n \"--suggest-semver\",\n \"--title\",\n \"--until\",\n \"--until-release-tag\",\n \"--version\",\n] as const;\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 const generationOptions = buildGenerationOptions(options, items);\n const selectionReport = options.explain ? explainChangelogSelection(generationOptions) : undefined;\n\n // OPT-IN (`--format json` without `--summary`): alias for the structured\n // `--changelog-json` document, giving agents a single standard `--format`\n // flag for machine-readable output. `--summary --format json` is handled\n // separately below, and `--suggest-semver` keeps its dedicated JSON shape\n // (the semver analysis) instead of being aliased to the full document.\n if (options.format === \"json\" && !options.summary && !options.changelogJson && !options.suggestSemver) {\n options.changelogJson = true;\n }\n\n // OPT-IN (`--summary`): compact one-line-per-change output for quick agent\n // scanning. Emits flat entries (release heading + category + item) instead\n // of full markdown. `--format json` switches to a JSON array; the default\n // `--format md` renders bracketed text lines (`[version] category: title (id)`).\n // Never writes a file.\n if (options.summary) {\n const entries = createChangelogSummary(generationOptions);\n if (options.format === \"json\") {\n const payload = {\n entries,\n format: \"json\",\n item_count: entries.length,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n } else {\n for (const entry of entries) {\n process.stdout.write(formatSummaryLine(entry) + \"\\n\");\n }\n if (selectionReport) writeSelectionReport(selectionReport);\n }\n return;\n }\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(generationOptions);\n const payload = selectionReport\n ? { ...document, selection_report: selectionReport }\n : document;\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n return;\n }\n\n // OPT-IN (`--suggest-semver`) without `--changelog-json`: emit only the\n // semver analysis as JSON to stdout and exit. Never writes CHANGELOG.md and\n // never touches default markdown.\n if (options.suggestSemver) {\n const suggestion = suggestSemver(generationOptions);\n const payload = selectionReport\n ? { ...suggestion, selection_report: selectionReport }\n : suggestion;\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n return;\n }\n\n if (!options.stdout) {\n const result = writeChangelog({\n ...generationOptions,\n output: outputPath,\n mode: options.mode,\n check: options.check,\n });\n const summary = buildSummary(options, result, outputPath, selectionReport);\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 if (!options.json && selectionReport) {\n writeSelectionReport(selectionReport);\n }\n\n if (options.check && result.changed) {\n if (options.checkDiff) writeCheckDiff(options, outputPath, result.markdown);\n // Set the status and return rather than `process.exit(1)`: Node may still\n // have the diff queued when stderr is a pipe (exactly the CI case this\n // diff exists for), and `process.exit` abandons pending stdio writes. The\n // failure message would then be truncated precisely where it is needed.\n process.exitCode = 1;\n return;\n }\n return;\n }\n\n const generated = createChangelog(generationOptions);\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 }, outputPath, selectionReport);\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 (selectionReport) {\n writeSelectionReport(selectionReport);\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 normalizedArgs = normalizeArgs(args);\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 summary: false,\n format: \"md\",\n conventional: false,\n contributors: false,\n breakingChanges: false,\n suggestSemver: false,\n emojiPrefix: false,\n includeMetadata: false,\n changelogJson: false,\n includeEmpty: false,\n includeLinks: false,\n mode: \"replace\",\n check: false,\n checkDiff: true,\n explain: false,\n githubOutput: false,\n githubStepSummary: false,\n versionFromPackage: false,\n sincePreviousTag: false,\n untilReleaseTag: false,\n allReleaseTags: false,\n releaseTagPattern: \"v*\",\n respectItemRelease: false,\n excludeTags: [],\n };\n\n for (let i = 0; i < normalizedArgs.length; i++) {\n const rawArg = normalizedArgs[i];\n const arg = resolveOptionAlias(rawArg);\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(normalizedArgs, ++i, rawArg);\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 \"--no-check-diff\":\n options.checkDiff = false;\n break;\n case \"--explain\":\n options.explain = 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(normalizedArgs, ++i, rawArg);\n break;\n case \"--stdin\":\n options.stdin = true;\n break;\n case \"--pm-root\":\n options.pmRoot = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--pm-bin\":\n options.pmBin = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--pm-arg\":\n options.pmArgs.push(requireAnyValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--pm-cwd\":\n options.pmCwd = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--title\":\n options.title = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--version\":\n options.version = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--release-version-from-package\":\n options.versionFromPackage = true;\n break;\n case \"--date\":\n options.date = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--since\":\n options.since = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--since-previous-tag\":\n options.sincePreviousTag = true;\n break;\n case \"--until\":\n options.until = requireValue(normalizedArgs, ++i, rawArg);\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(normalizedArgs, ++i, rawArg);\n break;\n case \"--status\":\n case \"--statuses\":\n options.statuses = requireValue(normalizedArgs, ++i, rawArg)\n .split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n break;\n case \"--group-by\":\n options.groupBy = parseGroupBy(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--section-by\":\n options.sectionBy = parseSectionBy(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--summary\":\n options.summary = true;\n break;\n case \"--format\":\n options.format = parseFormat(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--conventional\":\n options.conventional = true;\n break;\n case \"--contributors\":\n options.contributors = true;\n break;\n case \"--breaking-changes\":\n options.breakingChanges = true;\n break;\n case \"--suggest-semver\":\n options.suggestSemver = true;\n break;\n case \"--body-preview\":\n options.bodyPreview = parseBodyPreview(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--emoji-prefix\":\n options.emojiPrefix = true;\n break;\n case \"--include-metadata\":\n options.includeMetadata = true;\n break;\n case \"--changelog-json\":\n options.changelogJson = true;\n break;\n case \"--limit\":\n options.limit = parseLimit(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--since-version\":\n options.sinceVersion = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--mode\":\n options.mode = parseMode(requireValue(normalizedArgs, ++i, rawArg));\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(normalizedArgs, ++i, rawArg);\n break;\n case \"--item-ref-style\":\n options.itemRefStyle = parseItemRefStyle(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--respect-item-release\":\n options.respectItemRelease = true;\n break;\n // Repeatable and comma-separated forms both accumulate, mirroring\n // --status/--statuses, so agents can pass either shape.\n case \"--exclude-tag\":\n case \"--exclude-tags\":\n options.excludeTags.push(\n ...requireValue(normalizedArgs, ++i, rawArg)\n .split(\",\")\n .map((tag) => tag.trim())\n .filter(Boolean)\n );\n break;\n default:\n throw unknownOptionError(rawArg);\n }\n }\n\n return options;\n}\n\nfunction normalizeArgs(args: string[]): string[] {\n const normalized: string[] = [];\n for (const arg of args) {\n const equalsIndex = arg.indexOf(\"=\");\n if (equalsIndex <= 0) {\n normalized.push(arg);\n continue;\n }\n const flag = arg.slice(0, equalsIndex);\n if (!VALUE_OPTIONS.has(flag)) {\n normalized.push(arg);\n continue;\n }\n normalized.push(flag, arg.slice(equalsIndex + 1));\n }\n return normalized;\n}\n\nfunction resolveOptionAlias(arg: string): string {\n return OPTION_ALIASES[arg] ?? arg;\n}\n\nfunction unknownOptionError(arg: string): Error {\n const token = optionToken(arg);\n const suggestion = suggestOption(token);\n const hint = suggestion ? ` Did you mean '${suggestion}'?` : \"\";\n return new Error(`Unknown option: ${arg}.${hint} Run --help for usage.`);\n}\n\nfunction optionToken(arg: string): string {\n if (!arg.startsWith(\"-\")) return arg;\n const equalsIndex = arg.indexOf(\"=\");\n return equalsIndex > 0 ? arg.slice(0, equalsIndex) : arg;\n}\n\nfunction suggestOption(arg: string): string | undefined {\n let best: { option: string; distance: number } | undefined;\n for (const candidate of KNOWN_OPTIONS) {\n const distance = editDistance(arg, candidate);\n // Keep suggestions conservative: close edits only.\n const threshold = Math.max(2, Math.floor(candidate.length * 0.34));\n if (distance > threshold) continue;\n if (!best || distance < best.distance) {\n best = { option: candidate, distance };\n continue;\n }\n if (distance === best.distance && candidate.length < best.option.length) {\n best = { option: candidate, distance };\n }\n }\n return best?.option;\n}\n\nfunction editDistance(left: string, right: string): number {\n if (left === right) return 0;\n const rows = left.length + 1;\n const cols = right.length + 1;\n const matrix = Array.from({ length: rows }, () => new Array<number>(cols).fill(0));\n for (let i = 0; i < rows; i++) matrix[i][0] = i;\n for (let j = 0; j < cols; j++) matrix[0][j] = j;\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n const substitutionCost = left[i - 1] === right[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j - 1] + substitutionCost\n );\n }\n }\n return matrix[rows - 1][cols - 1];\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 includeOrphaned: true,\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 // Only request bodies when --body-preview needs them; otherwise keep the\n // lighter default list payload (GH #27).\n includeBody: options.bodyPreview !== undefined && options.bodyPreview > 0,\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 parseItemRefStyle(value: string): ChangelogItemRefStyle {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"auto\" || normalized === \"label\" || normalized === \"toon\" || normalized === \"github\") {\n return normalized;\n }\n throw new Error(\"--item-ref-style must be 'auto', 'label', 'toon', or 'github'\");\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 parseBodyPreview(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new Error(\"--body-preview 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 parseFormat(value: string): \"md\" | \"json\" {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"md\" || normalized === \"markdown\") return \"md\";\n if (normalized === \"json\") return \"json\";\n throw new Error(\"--format must be 'md' or 'json'\");\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 breakingChanges: options.breakingChanges,\n bodyPreview: options.bodyPreview,\n emojiPrefix: options.emojiPrefix,\n includeMetadata: options.includeMetadata,\n suggestSemver: options.suggestSemver,\n includeEmpty: options.includeEmpty,\n includeLinks: options.includeLinks,\n itemUrlBase: options.itemUrlBase,\n itemRefStyle: options.itemRefStyle,\n respectItemRelease: options.respectItemRelease,\n excludeTags: options.excludeTags.length > 0 ? options.excludeTags : undefined,\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 selectionReport?: ChangelogSelectionReport\n): Record<string, unknown> {\n const summary: Record<string, unknown> = {\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 if (selectionReport) summary.selection_report = selectionReport;\n return summary;\n}\n\n// OPT-OUT (`--no-check-diff` suppresses): when `--check` fails, show WHAT\n// drifted, not just THAT it drifted. The failure line alone forces the reader\n// — usually a CI agent that cannot rerun the generator interactively — to\n// clone the repo and diff generator output by hand; the common cause (a PR\n// branch behind `main`, so the merge ref sees a release commit the branch\n// lacks) is obvious from the diff in seconds. Check mode never writes, so the\n// file on disk is still the committed changelog. Stderr only: stdout stays\n// byte-identical for callers that capture it.\nfunction writeCheckDiff(options: CliOptions, outputPath: string, generated: string): void {\n const committed = existsSync(outputPath) ? readFileSync(outputPath, \"utf-8\") : \"\";\n // Label with the output's basename (e.g. `CHANGELOG.md`) rather than the\n // resolved absolute path, so the side label stays short and recognizable\n // regardless of how the caller invoked --output.\n const oldLabel = `committed ${basename(options.output)}`;\n const diff = createUnifiedDiff(committed, generated, {\n oldLabel,\n newLabel: \"generated\",\n });\n process.stderr.write(diff.text);\n if (diff.truncated) {\n process.stderr.write(\n `... diff truncated: ${diff.omittedLines} more lines not shown (${DEFAULT_MAX_DIFF_LINES}-line cap).`\n + \" Regenerate locally (rerun without --check, e.g. --mode replace) to see the full changelog.\\n\"\n );\n }\n}\n\nfunction writeSelectionReport(report: ChangelogSelectionReport): void {\n const excluded = report.excluded_counts;\n console.error(\n \"Selection report:\"\n + ` input=${report.stage_counts.input}`\n + ` visible=${report.stage_counts.visible_items}`\n + ` excluded(title=${excluded.missing_title},tag=${excluded.excluded_tag},status=${excluded.status},time=${excluded.time_window},item_release=${excluded.item_release},release_window=${excluded.release_window},visibility=${excluded.hidden_by_visibility})`\n );\n const provenance = report.attribution_provenance;\n if (provenance) {\n const sources = formatInferredSources(provenance.inferred_sources);\n console.error(\n `Attribution provenance: authoritative=${provenance.authoritative} inferred=${provenance.inferred}`\n + ` release_pinned=${provenance.release_pinned} (inferred sources: ${sources})`\n );\n if (provenance.inferred_sample.length > 0) {\n console.error(`Inferred-attribution sample: ${provenance.inferred_sample.join(\", \")}`);\n }\n }\n for (const hint of report.hints) {\n console.error(`Hint: ${hint}`);\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 --format <md|json> Output format: md (default) or json for machine-readable output\n --summary Print a compact one-line-per-change summary (bracketed text or JSON with --format json)\n --check Do not write; exit 1 when output would change.\n On drift, also print a unified diff\n (--- committed vs +++ generated) to stderr\n --no-check-diff With --check, suppress the drift diff; exit code unchanged\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 --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 <version>\n Alias for --version (matches pm extension syntax)\n --release-version-from-package\n Read version heading from nearest package.json\n --date <date> Release heading date text (recommended: YYYY-MM-DD;\n default: resolved tag date when available, otherwise current UTC date)\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 --exclude-tag <list> Omit items carrying any of these tags (repeatable, comma-separated)\n --respect-item-release\n Treat an item's release field as the authority for which single\n version window it belongs to: keep it when it matches --version\n regardless of timestamps, drop it otherwise (already shipped\n elsewhere). --all-release-tags always honors the field.\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 --breaking-changes Emit a Breaking Changes section listing items detected as breaking\n --suggest-semver Print a suggested semver bump (major/minor/patch) as JSON; never writes the changelog\n --body-preview <n> Append the first N chars of each item body to its entry\n --emoji-prefix Prefix section headings with conventional emoji (Added 🎉, Fixed 🐛, ...)\n --include-metadata Append compact item metadata to each entry\n --changelog-json Print the full structured changelog document (releases->sections->items) to stdout\n --explain Print item-selection diagnostics (counts, exclusions, actionable hints)\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 --item-ref-style <s> How item IDs render: auto (default), label (neutral, public-safe),\n toon (force blob link), github (public issue/PR link from the\n gh:owner/repo#N provenance tag; falls back to a label)\n\nValue flags accept both \"--flag value\" and \"--flag=value\" forms.\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 { basename, resolve } from \"node:path\";\nimport { stdin } from \"node:process\";\n\nimport { createUnifiedDiff, DEFAULT_MAX_DIFF_LINES } from \"./diff.ts\";\nimport {\n buildChangelogDocument,\n createChangelog,\n createChangelogSummary,\n explainChangelogSelection,\n formatInferredSources,\n formatSummaryLine,\n mergeChangelog,\n parsePmItemsJson,\n readPmItems,\n suggestSemver,\n writeChangelog,\n} from \"./generator.ts\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.ts\";\nimport type {\n ChangelogGroupBy,\n ChangelogItemRefStyle,\n ChangelogReleaseWindow,\n ChangelogSelectionReport,\n ChangelogSectionBy,\n PmItem,\n} from \"./types.ts\";\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 summary: boolean;\n format: \"md\" | \"json\";\n conventional: boolean;\n contributors: boolean;\n limit?: number;\n sinceVersion?: string;\n breakingChanges: boolean;\n suggestSemver: boolean;\n bodyPreview?: number;\n emojiPrefix: boolean;\n includeMetadata: boolean;\n changelogJson: boolean;\n releaseWindows?: ChangelogReleaseWindow[];\n includeEmpty: boolean;\n includeLinks: boolean;\n itemUrlBase?: string;\n itemRefStyle?: ChangelogItemRefStyle;\n respectItemRelease: boolean;\n excludeTags: string[];\n mode: \"replace\" | \"prepend\";\n check: boolean;\n checkDiff: boolean;\n explain: boolean;\n githubOutput: boolean;\n githubStepSummary: boolean;\n}\n\n// Compatibility aliases for value-taking options. Kept intentionally small and\n// explicit so default behavior remains stable.\nconst OPTION_ALIASES: Readonly<Record<string, string>> = {\n \"--release-version\": \"--version\",\n};\n\nconst VALUE_OPTIONS = new Set<string>([\n \"-i\",\n \"-o\",\n \"--body-preview\",\n \"--date\",\n \"--exclude-tag\",\n \"--exclude-tags\",\n \"--format\",\n \"--group-by\",\n \"--input\",\n \"--item-ref-style\",\n \"--item-url-base\",\n \"--limit\",\n \"--mode\",\n \"--output\",\n \"--pm-arg\",\n \"--pm-bin\",\n \"--pm-cwd\",\n \"--pm-root\",\n \"--release-tag-pattern\",\n \"--release-version\",\n \"--section-by\",\n \"--since\",\n \"--since-version\",\n \"--status\",\n \"--statuses\",\n \"--title\",\n \"--until\",\n \"--version\",\n]);\n\nconst KNOWN_OPTIONS = [\n \"-h\",\n \"-i\",\n \"-o\",\n \"--all-release-tags\",\n \"--body-preview\",\n \"--breaking-changes\",\n \"--changelog-json\",\n \"--check\",\n \"--conventional\",\n \"--contributors\",\n \"--date\",\n \"--emoji-prefix\",\n \"--exclude-tag\",\n \"--exclude-tags\",\n \"--explain\",\n \"--format\",\n \"--github-output\",\n \"--github-step-summary\",\n \"--group-by\",\n \"--help\",\n \"--include-empty\",\n \"--include-links\",\n \"--include-metadata\",\n \"--input\",\n \"--item-ref-style\",\n \"--item-url-base\",\n \"--json\",\n \"--limit\",\n \"--mode\",\n \"--no-check-diff\",\n \"--no-links\",\n \"--output\",\n \"--pm-arg\",\n \"--pm-bin\",\n \"--pm-cwd\",\n \"--pm-root\",\n \"--release-tag-pattern\",\n \"--release-version\",\n \"--release-version-from-package\",\n \"--respect-item-release\",\n \"--section-by\",\n \"--set-output\",\n \"--since\",\n \"--since-previous-tag\",\n \"--since-version\",\n \"--status\",\n \"--statuses\",\n \"--stdin\",\n \"--stdout\",\n \"--summary\",\n \"--suggest-semver\",\n \"--title\",\n \"--until\",\n \"--until-release-tag\",\n \"--version\",\n] as const;\n\n/** Run one CLI invocation end to end: parse flags, resolve the release context\n * from git, load items, generate, then write or compare. */\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 const generationOptions = buildGenerationOptions(options, items);\n const selectionReport = options.explain ? explainChangelogSelection(generationOptions) : undefined;\n\n // OPT-IN (`--format json` without `--summary`): alias for the structured\n // `--changelog-json` document, giving agents a single standard `--format`\n // flag for machine-readable output. `--summary --format json` is handled\n // separately below, and `--suggest-semver` keeps its dedicated JSON shape\n // (the semver analysis) instead of being aliased to the full document.\n if (options.format === \"json\" && !options.summary && !options.changelogJson && !options.suggestSemver) {\n options.changelogJson = true;\n }\n\n // OPT-IN (`--summary`): compact one-line-per-change output for quick agent\n // scanning. Emits flat entries (release heading + category + item) instead\n // of full markdown. `--format json` switches to a JSON array; the default\n // `--format md` renders bracketed text lines (`[version] category: title (id)`).\n // Never writes a file.\n if (options.summary) {\n const entries = createChangelogSummary(generationOptions);\n if (options.format === \"json\") {\n const payload = {\n entries,\n format: \"json\",\n item_count: entries.length,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n } else {\n for (const entry of entries) {\n process.stdout.write(formatSummaryLine(entry) + \"\\n\");\n }\n if (selectionReport) writeSelectionReport(selectionReport);\n }\n return;\n }\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(generationOptions);\n const payload = selectionReport\n ? { ...document, selection_report: selectionReport }\n : document;\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n return;\n }\n\n // OPT-IN (`--suggest-semver`) without `--changelog-json`: emit only the\n // semver analysis as JSON to stdout and exit. Never writes CHANGELOG.md and\n // never touches default markdown.\n if (options.suggestSemver) {\n const suggestion = suggestSemver(generationOptions);\n const payload = selectionReport\n ? { ...suggestion, selection_report: selectionReport }\n : suggestion;\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n return;\n }\n\n if (!options.stdout) {\n const result = writeChangelog({\n ...generationOptions,\n output: outputPath,\n mode: options.mode,\n check: options.check,\n });\n const summary = buildSummary(options, result, outputPath, selectionReport);\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 if (!options.json && selectionReport) {\n writeSelectionReport(selectionReport);\n }\n\n if (options.check && result.changed) {\n if (options.checkDiff) writeCheckDiff(options, outputPath, result.markdown);\n // Set the status and return rather than `process.exit(1)`: Node may still\n // have the diff queued when stderr is a pipe (exactly the CI case this\n // diff exists for), and `process.exit` abandons pending stdio writes. The\n // failure message would then be truncated precisely where it is needed.\n process.exitCode = 1;\n return;\n }\n return;\n }\n\n const generated = createChangelog(generationOptions);\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 }, outputPath, selectionReport);\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 (selectionReport) {\n writeSelectionReport(selectionReport);\n }\n if (options.githubStepSummary) writeGitHubStepSummary(merged.markdown);\n process.stdout.write(merged.markdown);\n return;\n }\n\n}\n\n/** Turn argv into validated options, rejecting an unknown flag with a\n * near-miss suggestion rather than ignoring it - a silently dropped flag would\n * generate a subtly different changelog and still exit zero. */\nfunction parseArgs(args: string[]): CliOptions {\n const normalizedArgs = normalizeArgs(args);\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 summary: false,\n format: \"md\",\n conventional: false,\n contributors: false,\n breakingChanges: false,\n suggestSemver: false,\n emojiPrefix: false,\n includeMetadata: false,\n changelogJson: false,\n includeEmpty: false,\n includeLinks: false,\n mode: \"replace\",\n check: false,\n checkDiff: true,\n explain: false,\n githubOutput: false,\n githubStepSummary: false,\n versionFromPackage: false,\n sincePreviousTag: false,\n untilReleaseTag: false,\n allReleaseTags: false,\n releaseTagPattern: \"v*\",\n respectItemRelease: false,\n excludeTags: [],\n };\n\n for (let i = 0; i < normalizedArgs.length; i++) {\n const rawArg = normalizedArgs[i];\n const arg = resolveOptionAlias(rawArg);\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(normalizedArgs, ++i, rawArg);\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 \"--no-check-diff\":\n options.checkDiff = false;\n break;\n case \"--explain\":\n options.explain = 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(normalizedArgs, ++i, rawArg);\n break;\n case \"--stdin\":\n options.stdin = true;\n break;\n case \"--pm-root\":\n options.pmRoot = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--pm-bin\":\n options.pmBin = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--pm-arg\":\n options.pmArgs.push(requireAnyValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--pm-cwd\":\n options.pmCwd = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--title\":\n options.title = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--version\":\n options.version = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--release-version-from-package\":\n options.versionFromPackage = true;\n break;\n case \"--date\":\n options.date = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--since\":\n options.since = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--since-previous-tag\":\n options.sincePreviousTag = true;\n break;\n case \"--until\":\n options.until = requireValue(normalizedArgs, ++i, rawArg);\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(normalizedArgs, ++i, rawArg);\n break;\n case \"--status\":\n case \"--statuses\":\n options.statuses = requireValue(normalizedArgs, ++i, rawArg)\n .split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n break;\n case \"--group-by\":\n options.groupBy = parseGroupBy(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--section-by\":\n options.sectionBy = parseSectionBy(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--summary\":\n options.summary = true;\n break;\n case \"--format\":\n options.format = parseFormat(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--conventional\":\n options.conventional = true;\n break;\n case \"--contributors\":\n options.contributors = true;\n break;\n case \"--breaking-changes\":\n options.breakingChanges = true;\n break;\n case \"--suggest-semver\":\n options.suggestSemver = true;\n break;\n case \"--body-preview\":\n options.bodyPreview = parseBodyPreview(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--emoji-prefix\":\n options.emojiPrefix = true;\n break;\n case \"--include-metadata\":\n options.includeMetadata = true;\n break;\n case \"--changelog-json\":\n options.changelogJson = true;\n break;\n case \"--limit\":\n options.limit = parseLimit(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--since-version\":\n options.sinceVersion = requireValue(normalizedArgs, ++i, rawArg);\n break;\n case \"--mode\":\n options.mode = parseMode(requireValue(normalizedArgs, ++i, rawArg));\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(normalizedArgs, ++i, rawArg);\n break;\n case \"--item-ref-style\":\n options.itemRefStyle = parseItemRefStyle(requireValue(normalizedArgs, ++i, rawArg));\n break;\n case \"--respect-item-release\":\n options.respectItemRelease = true;\n break;\n // Repeatable and comma-separated forms both accumulate, mirroring\n // --status/--statuses, so agents can pass either shape.\n case \"--exclude-tag\":\n case \"--exclude-tags\":\n options.excludeTags.push(\n ...requireValue(normalizedArgs, ++i, rawArg)\n .split(\",\")\n .map((tag) => tag.trim())\n .filter(Boolean)\n );\n break;\n default:\n throw unknownOptionError(rawArg);\n }\n }\n\n return options;\n}\n\n/** Split `--flag=value` into separate tokens so both spellings reach one\n * parsing path. */\nfunction normalizeArgs(args: string[]): string[] {\n const normalized: string[] = [];\n for (const arg of args) {\n const equalsIndex = arg.indexOf(\"=\");\n if (equalsIndex <= 0) {\n normalized.push(arg);\n continue;\n }\n const flag = arg.slice(0, equalsIndex);\n if (!VALUE_OPTIONS.has(flag)) {\n normalized.push(arg);\n continue;\n }\n normalized.push(flag, arg.slice(equalsIndex + 1));\n }\n return normalized;\n}\n\nfunction resolveOptionAlias(arg: string): string {\n return OPTION_ALIASES[arg] ?? arg;\n}\n\nfunction unknownOptionError(arg: string): Error {\n const token = optionToken(arg);\n const suggestion = suggestOption(token);\n const hint = suggestion ? ` Did you mean '${suggestion}'?` : \"\";\n return new Error(`Unknown option: ${arg}.${hint} Run --help for usage.`);\n}\n\nfunction optionToken(arg: string): string {\n if (!arg.startsWith(\"-\")) return arg;\n const equalsIndex = arg.indexOf(\"=\");\n return equalsIndex > 0 ? arg.slice(0, equalsIndex) : arg;\n}\n\n/** Find the closest known flag to a mistyped one, or `undefined` when nothing\n * is close enough to be worth suggesting. Ties break toward the shorter name so\n * the suggestion is the more common flag. */\nfunction suggestOption(arg: string): string | undefined {\n let best: { option: string; distance: number } | undefined;\n for (const candidate of KNOWN_OPTIONS) {\n const distance = editDistance(arg, candidate);\n // Keep suggestions conservative: close edits only.\n const threshold = Math.max(2, Math.floor(candidate.length * 0.34));\n if (distance > threshold) continue;\n if (!best || distance < best.distance) {\n best = { option: candidate, distance };\n continue;\n }\n if (distance === best.distance && candidate.length < best.option.length) {\n best = { option: candidate, distance };\n }\n }\n return best?.option;\n}\n\n/** Levenshtein distance between two strings, used only to rank flag\n * suggestions. */\nfunction editDistance(left: string, right: string): number {\n if (left === right) return 0;\n const rows = left.length + 1;\n const cols = right.length + 1;\n const matrix = Array.from({ length: rows }, () => new Array<number>(cols).fill(0));\n for (let i = 0; i < rows; i++) matrix[i][0] = i;\n for (let j = 0; j < cols; j++) matrix[0][j] = j;\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n const substitutionCost = left[i - 1] === right[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j - 1] + substitutionCost\n );\n }\n }\n return matrix[rows - 1][cols - 1];\n}\n\n/** Fill version, date, and time bounds from the checkout, mutating `options` in\n * place. The version may come from the nearest package.json; the dates and\n * bounds come from git tags. Explicit flags are preserved; only gaps filled. */\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 includeOrphaned: true,\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\n/** Load pm items from stdin, a JSON file, or the real pm CLI, in that order of\n * precedence. Bodies are requested only when a preview will render them, since\n * they make the list payload substantially larger. */\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 // Only request bodies when --body-preview needs them; otherwise keep the\n // lighter default list payload (GH #27).\n includeBody: options.bodyPreview !== undefined && options.bodyPreview > 0,\n });\n}\n\n/** Read stdin to completion as UTF-8, for `--stdin` item input. */\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\n/** Validate `--item-ref-style`, rejecting unknown spellings so a typo cannot\n * quietly change how every entry cites its item. */\nfunction parseItemRefStyle(value: string): ChangelogItemRefStyle {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"auto\" || normalized === \"label\" || normalized === \"toon\" || normalized === \"github\") {\n return normalized;\n }\n throw new Error(\"--item-ref-style must be 'auto', 'label', 'toon', or 'github'\");\n}\n\n/** Validate `--limit` as a positive integer count of release sections. */\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\n/** Validate `--body-preview` as a positive character width. */\nfunction parseBodyPreview(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new Error(\"--body-preview 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 parseFormat(value: string): \"md\" | \"json\" {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"md\" || normalized === \"markdown\") return \"md\";\n if (normalized === \"json\") return \"json\";\n throw new Error(\"--format must be 'md' or 'json'\");\n}\n\n/** Project parsed CLI options plus the loaded items onto the generator's option\n * shape. An empty `--exclude-tag` list is passed as `undefined` so the filter\n * stays entirely inert rather than running against nothing. */\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 breakingChanges: options.breakingChanges,\n bodyPreview: options.bodyPreview,\n emojiPrefix: options.emojiPrefix,\n includeMetadata: options.includeMetadata,\n suggestSemver: options.suggestSemver,\n includeEmpty: options.includeEmpty,\n includeLinks: options.includeLinks,\n itemUrlBase: options.itemUrlBase,\n itemRefStyle: options.itemRefStyle,\n respectItemRelease: options.respectItemRelease,\n excludeTags: options.excludeTags.length > 0 ? options.excludeTags : undefined,\n };\n}\n\n/** Assemble the machine-readable run summary emitted by `--json` and written as\n * GitHub step outputs. The job-summary panel receives generated markdown\n * instead, so it is not a consumer of this. */\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 selectionReport?: ChangelogSelectionReport\n): Record<string, unknown> {\n const summary: Record<string, unknown> = {\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 if (selectionReport) summary.selection_report = selectionReport;\n return summary;\n}\n\n/**\n * OPT-OUT (`--no-check-diff` suppresses): when `--check` fails, show WHAT\n * drifted, not just THAT it drifted.\n *\n * The failure line alone forces the reader - usually a CI agent that cannot\n * rerun the generator interactively - to clone the repo and diff generator\n * output by hand; the common cause (a PR branch behind `main`, so the merge ref\n * sees a release commit the branch lacks) is obvious from the diff in seconds.\n * Check mode never writes, so the file on disk is still the committed\n * changelog. Stderr only: stdout stays byte-identical for callers that capture\n * it.\n */\nfunction writeCheckDiff(options: CliOptions, outputPath: string, generated: string): void {\n const committed = existsSync(outputPath) ? readFileSync(outputPath, \"utf-8\") : \"\";\n // Label with the output's basename (e.g. `CHANGELOG.md`) rather than the\n // resolved absolute path, so the side label stays short and recognizable\n // regardless of how the caller invoked --output.\n const oldLabel = `committed ${basename(options.output)}`;\n const diff = createUnifiedDiff(committed, generated, {\n oldLabel,\n newLabel: \"generated\",\n });\n process.stderr.write(diff.text);\n if (diff.truncated) {\n process.stderr.write(\n `... diff truncated: ${diff.omittedLines} more lines not shown (${DEFAULT_MAX_DIFF_LINES}-line cap).`\n + \" Regenerate locally (rerun without --check, e.g. --mode replace) to see the full changelog.\\n\"\n );\n }\n}\n\n/** Print `--explain` diagnostics to stderr: how many items each filter stage\n * dropped, and how the survivors' release placement was dated. Stderr keeps\n * stdout byte-identical for callers capturing generated markdown. */\nfunction writeSelectionReport(report: ChangelogSelectionReport): void {\n const excluded = report.excluded_counts;\n console.error(\n \"Selection report:\"\n + ` input=${report.stage_counts.input}`\n + ` visible=${report.stage_counts.visible_items}`\n + ` excluded(title=${excluded.missing_title},tag=${excluded.excluded_tag},status=${excluded.status},time=${excluded.time_window},item_release=${excluded.item_release},release_window=${excluded.release_window},visibility=${excluded.hidden_by_visibility})`\n );\n const provenance = report.attribution_provenance;\n if (provenance) {\n const sources = formatInferredSources(provenance.inferred_sources);\n console.error(\n `Attribution provenance: authoritative=${provenance.authoritative} inferred=${provenance.inferred}`\n + ` release_pinned=${provenance.release_pinned} (inferred sources: ${sources})`\n );\n if (provenance.inferred_sample.length > 0) {\n console.error(`Inferred-attribution sample: ${provenance.inferred_sample.join(\", \")}`);\n }\n }\n for (const hint of report.hints) {\n console.error(`Hint: ${hint}`);\n }\n}\n\n/** Append the run summary as `key=value` step outputs for a workflow to branch\n * on, failing loudly when invoked outside GitHub Actions. */\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\n/** Append generated markdown to the workflow's job summary panel, so release\n * notes are readable in the run without downloading an artifact. */\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\n/** Read a flag's value, rejecting a missing one and a following `--flag`. The\n * latter catches an omitted value being silently swallowed by the next flag. */\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\n/** Read a flag's value allowing a leading `--`, for flags whose argument may\n * legitimately look like one. */\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\n/** Write the usage text listing every supported flag. */\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 --format <md|json> Output format: md (default) or json for machine-readable output\n --summary Print a compact one-line-per-change summary (bracketed text or JSON with --format json)\n --check Do not write; exit 1 when output would change.\n On drift, also print a unified diff\n (--- committed vs +++ generated) to stderr\n --no-check-diff With --check, suppress the drift diff; exit code unchanged\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 --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 <version>\n Alias for --version (matches pm extension syntax)\n --release-version-from-package\n Read version heading from nearest package.json\n --date <date> Release heading date text (recommended: YYYY-MM-DD;\n default: resolved tag date when available, otherwise current UTC date)\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 --exclude-tag <list> Omit items carrying any of these tags (repeatable, comma-separated)\n --respect-item-release\n Treat an item's release field as the authority for which single\n version window it belongs to: keep it when it matches --version\n regardless of timestamps, drop it otherwise (already shipped\n elsewhere). --all-release-tags always honors the field.\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 --breaking-changes Emit a Breaking Changes section listing items detected as breaking\n --suggest-semver Print a suggested semver bump (major/minor/patch) as JSON; never writes the changelog\n --body-preview <n> Append the first N chars of each item body to its entry\n --emoji-prefix Prefix section headings with conventional emoji (Added 🎉, Fixed 🐛, ...)\n --include-metadata Append compact item metadata to each entry\n --changelog-json Print the full structured changelog document (releases->sections->items) to stdout\n --explain Print item-selection diagnostics (counts, exclusions, actionable hints)\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 --item-ref-style <s> How item IDs render: auto (default), label (neutral, public-safe),\n toon (force blob link), github (public issue/PR link from the\n gh:owner/repo#N provenance tag; falls back to a label)\n\nValue flags accept both \"--flag value\" and \"--flag=value\" forms.\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/diff.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export interface UnifiedDiffOptions {
|
|
|
33
33
|
* Default {@link DEFAULT_MAX_DIFF_LINES}. */
|
|
34
34
|
maxLines?: number;
|
|
35
35
|
}
|
|
36
|
+
/** Outcome of rendering a unified diff under a hunk-line cap. */
|
|
36
37
|
export interface UnifiedDiffResult {
|
|
37
38
|
/** The rendered unified diff, ending in a newline. Empty when the inputs
|
|
38
39
|
* are identical (mirrors `diff -u`, which prints nothing for equal files). */
|
package/dist/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;2DAE2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC;;4EAEwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;mCAE+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;iDAG6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC;kFAC8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;oBACgB;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB;uDACmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;iFACiF;AACjF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AA4B1C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAwBnB"}
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;2DAE2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC;;4EAEwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;mCAE+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;iDAG6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC;kFAC8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;oBACgB;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB;uDACmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;iFACiF;AACjF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AA4B1C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAwBnB"}
|
package/dist/diff.js
CHANGED
|
@@ -116,6 +116,13 @@ function splitLines(text) {
|
|
|
116
116
|
const normalized = text.endsWith("\n") ? text.slice(0, -1) : text;
|
|
117
117
|
return normalized === "" ? [] : normalized.split("\n");
|
|
118
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Reduce two line arrays to an edit script of context/add/remove operations.
|
|
121
|
+
*
|
|
122
|
+
* Identical leading and trailing lines are stripped before the quadratic
|
|
123
|
+
* {@link diffMiddle} runs, then re-attached as context, which is what keeps a
|
|
124
|
+
* localized changelog edit cheap to diff against a large file.
|
|
125
|
+
*/
|
|
119
126
|
function computeOps(oldLines, newLines) {
|
|
120
127
|
// Changelog drift is overwhelmingly a localized change in an otherwise
|
|
121
128
|
// identical file; trimming the shared edges keeps the LCS table small.
|
|
@@ -138,6 +145,14 @@ function computeOps(oldLines, newLines) {
|
|
|
138
145
|
...oldLines.slice(oldLines.length - suffix).map((line) => ({ op: "context", line })),
|
|
139
146
|
];
|
|
140
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Produce a minimal edit script for the differing middle via an LCS table.
|
|
150
|
+
*
|
|
151
|
+
* Guards on {@link MAX_LCS_CELLS} first: the table is quadratic, so two large
|
|
152
|
+
* unrelated files would otherwise exhaust memory. Past that bound the result
|
|
153
|
+
* degrades deliberately to a single block replacement, which is still correct
|
|
154
|
+
* unified-diff output, just not the shortest one.
|
|
155
|
+
*/
|
|
141
156
|
function diffMiddle(oldLines, newLines) {
|
|
142
157
|
const rows = oldLines.length + 1;
|
|
143
158
|
const cols = newLines.length + 1;
|
|
@@ -186,6 +201,14 @@ function diffMiddle(oldLines, newLines) {
|
|
|
186
201
|
}
|
|
187
202
|
return ops;
|
|
188
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Group an edit script into hunks, each padded with surrounding context.
|
|
206
|
+
*
|
|
207
|
+
* Runs of changes closer together than twice the context width are merged into
|
|
208
|
+
* one hunk so their context does not overlap and print twice. An edit script
|
|
209
|
+
* with no changes yields no hunks, which is how an identical pair renders as
|
|
210
|
+
* empty output.
|
|
211
|
+
*/
|
|
189
212
|
function buildHunks(ops, contextLines) {
|
|
190
213
|
const changeIndices = [];
|
|
191
214
|
for (const [index, entry] of ops.entries()) {
|