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 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
- // OPT-OUT (`--no-check-diff` suppresses): when `--check` fails, show WHAT
653
- // drifted, not just THAT it drifted. The failure line alone forces the reader
654
- // — usually a CI agent that cannot rerun the generator interactively — to
655
- // clone the repo and diff generator output by hand; the common cause (a PR
656
- // branch behind `main`, so the merge ref sees a release commit the branch
657
- // lacks) is obvious from the diff in seconds. Check mode never writes, so the
658
- // file on disk is still the committed changelog. Stderr only: stdout stays
659
- // byte-identical for callers that capture it.
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":";AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AA4DvF,+EAA+E;AAC/E,+CAA+C;AAC/C,MAAM,cAAc,GAAqC;IACvD,mBAAmB,EAAE,WAAW;CACjC,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS;IACpC,IAAI;IACJ,IAAI;IACJ,gBAAgB;IAChB,QAAQ;IACR,eAAe;IACf,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,kBAAkB;IAClB,iBAAiB;IACjB,SAAS;IACT,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,uBAAuB;IACvB,mBAAmB;IACnB,cAAc;IACd,SAAS;IACT,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG;IACpB,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,oBAAoB;IACpB,gBAAgB;IAChB,oBAAoB;IACpB,kBAAkB;IAClB,SAAS;IACT,gBAAgB;IAChB,gBAAgB;IAChB,QAAQ;IACR,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,WAAW;IACX,UAAU;IACV,iBAAiB;IACjB,uBAAuB;IACvB,YAAY;IACZ,QAAQ;IACR,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;IACpB,SAAS;IACT,kBAAkB;IAClB,iBAAiB;IACjB,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,iBAAiB;IACjB,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,uBAAuB;IACvB,mBAAmB;IACnB,gCAAgC;IAChC,wBAAwB;IACxB,cAAc;IACd,cAAc;IACd,SAAS;IACT,sBAAsB;IACtB,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,UAAU;IACV,WAAW;IACX,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,WAAW;CACH,CAAC;AAEX;4DAC4D;AAC5D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnG,yEAAyE;IACzE,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACtG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,iFAAiF;IACjF,uBAAuB;IACvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG;gBACd,OAAO;gBACP,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,eAAe;gBAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,wEAAwE;IACxE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,eAAe;YAC7B,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE;YACpD,CAAC,CAAC,QAAQ,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,wEAAwE;IACxE,4EAA4E;IAC5E,kCAAkC;IAClC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,eAAe;YAC7B,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE;YACtD,CAAC,CAAC,UAAU,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,GAAG,iBAAiB;YACpB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAE3E,IAAI,OAAO,CAAC,YAAY;YAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,OAAO,CAAC,iBAAiB;YAAE,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;QACvH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;YACrC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,SAAS;gBAAE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5E,0EAA0E;YAC1E,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,CAAC;QACnE,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS;QACvC,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEjF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE;gBACpC,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;aACnD,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,YAAY;gBAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,iBAAiB;gBAAE,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,CAAC,iBAAiB;YAAE,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;AAEH,CAAC;AAED;;gEAEgE;AAChE,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAe;QAC1B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,KAAK;QACpB,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,KAAK;QACnB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,KAAK;QACnB,iBAAiB,EAAE,KAAK;QACxB,kBAAkB,EAAE,KAAK;QACzB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,KAAK;QACrB,iBAAiB,EAAE,IAAI;QACvB,kBAAkB,EAAE,KAAK;QACzB,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACvC,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;gBAC1B,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,iBAAiB,CAAC;YACvB,KAAK,cAAc;gBACjB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,uBAAuB;gBAC1B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBACjC,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,IAAI;gBACP,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAClE,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC5D,MAAM;YACR,KAAK,gCAAgC;gBACnC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAClC,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,sBAAsB;gBACzB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAChC,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,qBAAqB;gBACxB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC/B,MAAM;YACR,KAAK,oBAAoB;gBACvB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC9B,MAAM;YACR,KAAK,uBAAuB;gBAC1B,OAAO,CAAC,iBAAiB,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACtE,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY;gBACf,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;qBACzD,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;qBAC9B,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC1E,MAAM;YACR,KAAK,cAAc;gBACjB,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC9E,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxE,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,oBAAoB;gBACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC/B,MAAM;YACR,KAAK,kBAAkB;gBACrB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAClF,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,MAAM;YACR,KAAK,oBAAoB;gBACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC/B,MAAM;YACR,KAAK,kBAAkB;gBACrB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtE,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACjE,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACpE,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC7B,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,WAAW,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAChE,MAAM;YACR,KAAK,kBAAkB;gBACrB,OAAO,CAAC,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACpF,MAAM;YACR,KAAK,wBAAwB;gBAC3B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAClC,MAAM;YACR,kEAAkE;YAClE,wDAAwD;YACxD,KAAK,eAAe,CAAC;YACrB,KAAK,gBAAgB;gBACnB,OAAO,CAAC,WAAW,CAAC,IAAI,CACtB,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;qBACzC,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;qBACxB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;gBACF,MAAM;YACR;gBACE,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;mBACmB;AACnB,SAAS,aAAa,CAAC,IAAc;IACnC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,IAAI,KAAK,CAAC,mBAAmB,GAAG,IAAI,IAAI,wBAAwB,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3D,CAAC;AAED;;6CAE6C;AAC7C,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,IAAsD,CAAC;IAC3D,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9C,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,QAAQ,GAAG,SAAS;YAAE,SAAS;QACnC,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;YACvC,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxE,IAAI,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,MAAM,CAAC;AACtB,CAAC;AAED;kBACkB;AAClB,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa;IAC/C,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACrB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EACpB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EACpB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CACxC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;gFAEgF;AAChF,SAAS,mBAAmB,CAAC,OAAmB;IAC9C,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACnE,IAAI,OAAO,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC;gBACpC,GAAG;gBACH,kBAAkB,EAAE,IAAI;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,cAAc,GAAG,wBAAwB,CAAC;YAChD,GAAG;YACH,UAAU,EAAE,OAAO,CAAC,iBAAiB;YACrC,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,OAAO,CAAC,OAAO;YAC/B,gBAAgB,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI;SAChD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,eAAe;QAAE,OAAO;IACrH,MAAM,OAAO,GAAG,qBAAqB,CAAC;QACpC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC,CAAC;IACH,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC5C,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAChC,CAAC;AAED;;sDAEsD;AACtD,KAAK,UAAU,SAAS,CAAC,OAAmB;IAC1C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,gBAAgB,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,WAAW,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QACvD,yEAAyE;QACzE,yCAAyC;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC;KAC1E,CAAC,CAAC;AACL,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC5C,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACtG,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACnF,CAAC;AAED;oDACoD;AACpD,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxG,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACnF,CAAC;AAED,0EAA0E;AAC1E,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAClE,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACzC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACrD,CAAC;AAED;;+DAE+D;AAC/D,SAAS,sBAAsB,CAAC,OAAmB,EAAE,KAAe;IAClE,OAAO;QACL,KAAK;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,QAAQ;QACjC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAC9E,CAAC;AACJ,CAAC;AAED;;+CAE+C;AAC/C,SAAS,YAAY,CACnB,OAAmB,EACnB,MAOC,EACD,MAAM,GAAG,MAAM,CAAC,MAAM,EACtB,eAA0C;IAE1C,MAAM,OAAO,GAA4B;QACvC,MAAM;QACN,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACvD,CAAC;IACF,IAAI,eAAe;QAAE,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAChE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,cAAc,CAAC,OAAmB,EAAE,UAAkB,EAAE,SAAiB;IAChF,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,yEAAyE;IACzE,yEAAyE;IACzE,iDAAiD;IACjD,MAAM,QAAQ,GAAG,aAAa,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE;QACnD,QAAQ;QACR,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,IAAI,CAAC,YAAY,0BAA0B,sBAAsB,aAAa;cACnG,+FAA+F,CAClG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;qEAEqE;AACrE,SAAS,oBAAoB,CAAC,MAAgC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;IACxC,OAAO,CAAC,KAAK,CACX,mBAAmB;UACjB,UAAU,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;UACrC,YAAY,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;UAC/C,mBAAmB,QAAQ,CAAC,aAAa,QAAQ,QAAQ,CAAC,YAAY,WAAW,QAAQ,CAAC,MAAM,SAAS,QAAQ,CAAC,WAAW,iBAAiB,QAAQ,CAAC,YAAY,mBAAmB,QAAQ,CAAC,cAAc,eAAe,QAAQ,CAAC,oBAAoB,GAAG,CAC/P,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,sBAAsB,CAAC;IACjD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CACX,yCAAyC,UAAU,CAAC,aAAa,aAAa,UAAU,CAAC,QAAQ,EAAE;cACjG,mBAAmB,UAAU,CAAC,cAAc,uBAAuB,OAAO,GAAG,CAChF,CAAC;QACF,IAAI,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,gCAAgC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;6DAC6D;AAC7D,SAAS,iBAAiB,CAAC,OAAgC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;QACxC,QAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;QACpC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;QACxC,WAAW,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;QAC1C,cAAc,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;QAC/C,SAAS,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;KACvC,CAAC;IACF,cAAc,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED;oEACoE;AACpE,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC1D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IAED,cAAc,CAAC,iBAAiB,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;gFACgF;AAChF,SAAS,YAAY,CAAC,IAAc,EAAE,KAAa,EAAE,IAAY;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;iCACiC;AACjC,SAAS,eAAe,CAAC,IAAc,EAAE,KAAa,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yDAAyD;AACzD,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEtB,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","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). */
@@ -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()) {