pm-changelog 2026.7.13 → 2026.7.14-2

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,23 +1,36 @@
1
1
  # Changelog
2
2
 
3
- ## 2026.7.13 - 2026-07-13
3
+ ## 2026.7.14-2 - 2026-07-14
4
4
 
5
5
  ### Fixed
6
6
 
7
- - Fix all-release-tags collapsing legacy historical sections after orphaned git tags ([pmc-emom](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-emom.toon))
7
+ - changelog --format json emits TOON on stdout without global --json ([pmc-nagj](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-nagj.toon))
8
8
 
9
- ## 2026.7.11-1 - 2026-07-11
9
+ ## 2026.7.14-1 - 2026-07-14
10
10
 
11
- ### Other
11
+ ### Fixed
12
12
 
13
- - Ecosystem release readiness pass 2026-07-06 ([pmc-5z9i](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-5z9i.toon))
13
+ - Retry transient package-install cleanup ([pmc-70yk](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-70yk.toon))
14
14
 
15
- ## 2026.7.11 - 2026-07-11
15
+ ## 2026.7.14 - 2026-07-14
16
16
 
17
17
  ### Fixed
18
18
 
19
+ - Merge release metadata before npm publication ([pmc-84ow](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-84ow.toon))
19
20
  - Isolate package-install integration tests from the user's pm home ([pmc-09bu](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-09bu.toon))
20
21
 
22
+ ## 2026.7.13 - 2026-07-13
23
+
24
+ ### Fixed
25
+
26
+ - Fix all-release-tags collapsing legacy historical sections after orphaned git tags ([pmc-emom](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/issues/pmc-emom.toon))
27
+
28
+ ## 2026.7.11-1 - 2026-07-11
29
+
30
+ ### Other
31
+
32
+ - Ecosystem release readiness pass 2026-07-06 ([pmc-5z9i](https://github.com/unbraind/pm-changelog/blob/main/.agents/pm/tasks/pmc-5z9i.toon))
33
+
21
34
  ## 2026.7.6 - 2026-07-06
22
35
 
23
36
  ### Fixed
package/dist/extension.js CHANGED
@@ -6,9 +6,19 @@ import { buildChangelogDocument, createChangelog, createChangelogSummary, explai
6
6
  import { resolveReleaseContext, resolveReleaseTagWindows } from "./release-context.js";
7
7
  const sdkExports = pmSdk;
8
8
  const listAllItemMetadata = (sdkExports.listAllItemMetadata ?? sdkExports[["listAll", "Front", "Matter"].join("")]);
9
+ function renderedCommandResult(value) {
10
+ const output = `${JSON.stringify(value, null, 2)}\n`;
11
+ return { pmChangelogRendered: true, output };
12
+ }
13
+ function renderCommandResult(context) {
14
+ const result = context?.result;
15
+ return result?.pmChangelogRendered === true && typeof result.output === "string"
16
+ ? result.output
17
+ : null;
18
+ }
9
19
  export default defineExtension({
10
20
  name: "pm-changelog",
11
- version: "2026.7.13",
21
+ version: "2026.7.14-2",
12
22
  activate(api) {
13
23
  api.registerCommand({
14
24
  name: "changelog generate",
@@ -162,12 +172,12 @@ export default defineExtension({
162
172
  if (summaryOption) {
163
173
  const entries = createChangelogSummary(generationOptions);
164
174
  if (wantsJsonFormat) {
165
- return {
175
+ return renderedCommandResult({
166
176
  entries,
167
177
  format: "json",
168
178
  item_count: entries.length,
169
179
  ...(selectionReport ? { selection_report: selectionReport } : {}),
170
- };
180
+ });
171
181
  }
172
182
  const lines = entries.map((entry) => formatSummaryLine(entry));
173
183
  return {
@@ -183,22 +193,22 @@ export default defineExtension({
183
193
  const suggestSemverOption = booleanOption(ctx.options, "suggest-semver", "suggestSemver");
184
194
  if (booleanOption(ctx.options, "changelog-json", "changelogJson") || (wantsJsonFormat && !suggestSemverOption)) {
185
195
  const document = buildChangelogDocument(generationOptions);
186
- return {
196
+ return renderedCommandResult({
187
197
  document,
188
198
  format: "json",
189
199
  item_count: document.item_count,
190
200
  ...(selectionReport ? { selection_report: selectionReport } : {}),
191
- };
201
+ });
192
202
  }
193
203
  // OPT-IN (`--suggest-semver`) standalone: emit only the semver analysis;
194
204
  // never writes a file and never alters default markdown.
195
205
  if (suggestSemverOption) {
196
206
  const suggestion = suggestSemver(generationOptions);
197
- return {
207
+ return renderedCommandResult({
198
208
  suggested_semver: suggestion,
199
209
  format: "json",
200
210
  ...(selectionReport ? { selection_report: selectionReport } : {}),
201
- };
211
+ });
202
212
  }
203
213
  const generated = createChangelog(generationOptions);
204
214
  if (stdout) {
@@ -321,7 +331,7 @@ export default defineExtension({
321
331
  writeFileSync(resolve(outputPath), JSON.stringify(payload, null, 2) + "\n", "utf-8");
322
332
  return { file: outputPath, format: "json", item_count: generated.itemCount };
323
333
  }
324
- return payload;
334
+ return renderedCommandResult(payload);
325
335
  }
326
336
  if (outputPath) {
327
337
  writeFileSync(resolve(outputPath), generated.markdown.endsWith("\n") ? generated.markdown : generated.markdown + "\n", "utf-8");
@@ -332,6 +342,14 @@ export default defineExtension({
332
342
  if (api.registerExporter.length < 3 && typeof api.registerFlags === "function") {
333
343
  api.registerFlags("changelog export", changelogExportMetadata.flags);
334
344
  }
345
+ // Register renderer overrides so json-mode results print verbatim JSON to
346
+ // stdout under both the default (toon) and global --json renderers. Guarded
347
+ // for older hosts without renderer support.
348
+ const registerRenderer = api.registerRenderer;
349
+ if (typeof registerRenderer === "function") {
350
+ registerRenderer("toon", renderCommandResult);
351
+ registerRenderer("json", renderCommandResult);
352
+ }
335
353
  },
336
354
  });
337
355
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport * as pmSdk from \"@unbrained/pm-cli/sdk\";\nimport {\n defineExtension,\n locateItem,\n readLocatedItem,\n readSettings,\n resolveItemTypeRegistry,\n EXIT_CODE,\n PmCliError,\n} from \"@unbrained/pm-cli/sdk\";\n\nimport { buildChangelogDocument, createChangelog, createChangelogSummary, explainChangelogSelection, formatSummaryLine, mergeChangelog, suggestSemver, writeChangelog } from \"./generator.js\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.js\";\nimport type { ChangelogGroupBy, ChangelogSectionBy, PmItem } from \"./types.js\";\n\ntype ItemMetadataReader = (pmRoot: string) => Promise<PmItem[]>;\n\nconst sdkExports = pmSdk as unknown as Record<string, unknown>;\nconst listAllItemMetadata = (\n sdkExports.listAllItemMetadata ?? sdkExports[[\"listAll\", \"Front\", \"Matter\"].join(\"\")]\n) as ItemMetadataReader;\n\nexport default defineExtension({\n name: \"pm-changelog\",\n version: \"2026.7.13\",\n\n activate(api) {\n api.registerCommand({\n name: \"changelog generate\",\n description: \"Generate a CHANGELOG.md file from pm items.\",\n intent: \"generate changelog release notes from completed pm items\",\n examples: [\n \"pm changelog generate\",\n \"pm changelog generate --release-version 1.2.0\",\n \"pm changelog generate --release-version-from-package --since-previous-tag --until-release-tag\",\n \"pm changelog generate --all-release-tags --mode replace\",\n \"pm changelog generate --output RELEASE_NOTES.md --since 2026-05-01\",\n \"pm changelog generate --stdout --group-by release\",\n \"pm changelog generate --stdout --group-by milestone\",\n \"pm changelog generate --check --mode prepend --release-version 1.2.0\",\n ],\n flags: [\n { long: \"--output\", value_name: \"file\", description: \"Output file path (default: CHANGELOG.md)\" },\n { long: \"--stdout\", description: \"Return markdown instead of writing a file\" },\n { long: \"--title\", value_name: \"text\", description: \"Changelog title (default: Changelog)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--all-release-tags\", description: \"Rebuild full history from git release tag windows\" },\n { long: \"--release-tag-pattern\", value_name: \"glob\", description: \"Git tag glob for --all-release-tags (default: v*)\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--section-by\", value_name: \"mode\", description: \"Within-release grouping: category, type, status, or label (default: category)\" },\n { long: \"--conventional\", description: \"Use Conventional-Commits headings (Features/Bug Fixes/...) for category grouping\" },\n { long: \"--contributors\", description: \"Append a Contributors list per release from item assignee/author\" },\n { long: \"--limit\", value_name: \"n\", description: \"Keep only the most recent N release sections (history modes only)\" },\n { long: \"--since-version\", value_name: \"version\", description: \"Keep only releases at or newer than this version (history modes only)\" },\n { long: \"--breaking-changes\", description: \"Emit a Breaking Changes section listing items detected as breaking\" },\n { long: \"--suggest-semver\", description: \"Return a suggested semver bump (major/minor/patch); never writes the changelog\" },\n { long: \"--body-preview\", value_name: \"n\", description: \"Append the first N chars of each item body to its entry\" },\n { long: \"--emoji-prefix\", description: \"Prefix section headings with conventional emoji (Added 🎉, Fixed 🐛, ...)\" },\n { long: \"--include-metadata\", description: \"Append compact item metadata (type/status/priority/release/milestone) to each entry\" },\n { long: \"--changelog-json\", description: \"Return the full structured changelog document (releases->sections->items)\" },\n { long: \"--explain\", description: \"Return item-selection diagnostics (counts, exclusions, hints)\" },\n { long: \"--summary\", description: \"Return a compact one-line-per-change summary instead of full markdown\" },\n { long: \"--format\", value_name: \"md|json\", description: \"Output format: md (default) or json for machine-readable output\" },\n { long: \"--mode\", value_name: \"mode\", description: \"replace or prepend existing changelog (default: replace)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n { long: \"--check\", description: \"Do not write; report whether the changelog would change\" },\n ],\n async run(ctx) {\n const output = (ctx.options[\"output\"] as string | undefined) ?? \"CHANGELOG.md\";\n const stdout = Boolean(ctx.options[\"stdout\"]);\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n const modeOption = (ctx.options[\"mode\"] as string | undefined) ?? \"replace\";\n\n // Throw (with a numeric exitCode) rather than returning { error }: the\n // runtime treats a returned object as a successful run (exit 0), so a\n // returned error silently passed validation failures. A PmCliError\n // carries its exitCode so the handler exits non-zero and runs once.\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n if (modeOption !== \"replace\" && modeOption !== \"prepend\") {\n throw new PmCliError(\"--mode must be 'replace' or 'prepend'\", EXIT_CODE.USAGE);\n }\n const sectionByOption = stringOption(ctx.options, \"section-by\", \"sectionBy\") ?? \"category\";\n if (sectionByOption !== \"category\" && sectionByOption !== \"type\" && sectionByOption !== \"status\" && sectionByOption !== \"label\") {\n throw new PmCliError(\"--section-by must be 'category', 'type', 'status', or 'label'\", EXIT_CODE.USAGE);\n }\n // Validate --format up front (matching `changelog export`) instead of\n // silently treating unsupported values as the default markdown output.\n const formatOption = stringOption(ctx.options, \"format\", \"format\");\n const normalizedFormat = formatOption?.trim().toLowerCase();\n if (normalizedFormat !== undefined && normalizedFormat !== \"md\" && normalizedFormat !== \"markdown\" && normalizedFormat !== \"json\") {\n throw new PmCliError(\"--format must be 'md' or 'json'\", EXIT_CODE.USAGE);\n }\n const wantsJsonFormat = normalizedFormat === \"json\";\n const limitValue = parseLimitOption(ctx.options);\n const groupBy: ChangelogGroupBy = groupByOption;\n const sectionBy: ChangelogSectionBy = sectionByOption;\n const mode: \"replace\" | \"prepend\" = modeOption;\n\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n\n const allReleaseTags = booleanOption(ctx.options, \"all-release-tags\", \"allReleaseTags\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const titleOption = stringOption(ctx.options, \"title\", \"title\");\n const dateOption = stringOption(ctx.options, \"date\", \"date\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const releaseContext = allReleaseTags\n ? { version: undefined, date: undefined, since: undefined, until: undefined }\n : resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n const releaseWindows = allReleaseTags\n ? resolveReleaseTagWindows({\n cwd: ctx.pm_root,\n tagPattern: stringOption(ctx.options, \"release-tag-pattern\", \"releaseTagPattern\"),\n includeOrphaned: true,\n pendingVersion: releaseVersion,\n pendingTimestamp: untilOption ?? dateOption,\n })\n : undefined;\n\n const items = (await listAllItemMetadata(ctx.pm_root)) as PmItem[];\n const bodyPreview = parseBodyPreviewOption(ctx.options);\n // listAllItemMetadata omits item bodies, so --body-preview would silently\n // render nothing (GH #27). Load bodies on demand only when previewing.\n if (bodyPreview !== undefined && bodyPreview > 0) {\n await enrichItemBodies(ctx.pm_root, items);\n }\n const generationOptions = {\n items,\n title: titleOption,\n version: releaseContext.version,\n date: dateOption ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n releaseWindows,\n includeStatuses: statuses,\n groupBy,\n sectionBy,\n conventional: booleanOption(ctx.options, \"conventional\", \"conventional\"),\n contributors: booleanOption(ctx.options, \"contributors\", \"contributors\"),\n limit: limitValue,\n sinceVersion: stringOption(ctx.options, \"since-version\", \"sinceVersion\"),\n breakingChanges: booleanOption(ctx.options, \"breaking-changes\", \"breakingChanges\"),\n bodyPreview,\n emojiPrefix: booleanOption(ctx.options, \"emoji-prefix\", \"emojiPrefix\"),\n includeMetadata: booleanOption(ctx.options, \"include-metadata\", \"includeMetadata\"),\n suggestSemver: booleanOption(ctx.options, \"suggest-semver\", \"suggestSemver\"),\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n };\n const selectionReport = booleanOption(ctx.options, \"explain\", \"explain\")\n ? explainChangelogSelection(generationOptions)\n : undefined;\n\n // OPT-IN (`--format json` without `--summary`): alias for the structured\n // --changelog-json document so agents have a single --format flag.\n const summaryOption = booleanOption(ctx.options, \"summary\", \"summary\");\n\n // OPT-IN (`--summary`): compact one-line-per-change output for quick\n // agent scanning. Never writes a file.\n if (summaryOption) {\n const entries = createChangelogSummary(generationOptions);\n if (wantsJsonFormat) {\n return {\n entries,\n format: \"json\",\n item_count: entries.length,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n const lines = entries.map((entry) => formatSummaryLine(entry));\n return {\n summary: lines.join(\"\\n\"),\n format: \"text\",\n item_count: entries.length,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n\n // OPT-IN (`--changelog-json` or `--format json`): structured document;\n // never writes a file. `--suggest-semver` keeps its dedicated JSON shape\n // below instead of being aliased to the full document.\n const suggestSemverOption = booleanOption(ctx.options, \"suggest-semver\", \"suggestSemver\");\n if (booleanOption(ctx.options, \"changelog-json\", \"changelogJson\") || (wantsJsonFormat && !suggestSemverOption)) {\n const document = buildChangelogDocument(generationOptions);\n return {\n document,\n format: \"json\",\n item_count: document.item_count,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n\n // OPT-IN (`--suggest-semver`) standalone: emit only the semver analysis;\n // never writes a file and never alters default markdown.\n if (suggestSemverOption) {\n const suggestion = suggestSemver(generationOptions);\n return {\n suggested_semver: suggestion,\n format: \"json\",\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n\n const generated = createChangelog(generationOptions);\n\n if (stdout) {\n const merged = mode === \"prepend\"\n ? mergeChangelog(undefined, generated.markdown, { title: titleOption })\n : { markdown: generated.markdown, action: \"replaced\" as const, changed: true };\n return {\n changelog: merged.markdown,\n action: merged.action,\n changed: merged.changed,\n item_count: generated.itemCount,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n\n const result = writeChangelog({\n ...generationOptions,\n output,\n mode,\n check: Boolean(ctx.options[\"check\"]),\n });\n if (result.changed && Boolean(ctx.options[\"check\"])) {\n throw new PmCliError(`Changelog is out of date: ${result.output}`, EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n file: result.output,\n action: result.action,\n changed: result.changed,\n item_count: result.itemCount,\n bytes: result.bytes,\n check: Boolean(ctx.options[\"check\"]),\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n },\n });\n\n // -----------------------------------------------------------------------\n // Exporter: `pm changelog export` — native export pipeline.\n // Reuses the same generation core as `changelog generate` (whose default\n // output is intentionally left byte-identical). Adds --format md|json and a\n // --release-notes concise mode. Does NOT write CHANGELOG.md unless --output\n // is given, so it is side-effect free by default.\n // -----------------------------------------------------------------------\n const changelogExportMetadata = {\n description: \"Export changelog or release notes through the pm import/export pipeline.\",\n intent: \"export changelog release notes as markdown or json\",\n examples: [\n \"pm changelog export\",\n \"pm changelog export --format json\",\n \"pm changelog export --release-notes --since-previous-tag --until-release-tag\",\n \"pm changelog export --output RELEASE_NOTES.md --release-version-from-package\",\n ],\n flags: [\n { long: \"--format\", value_name: \"md|json\", description: \"Export format (default: md)\" },\n { long: \"--output\", value_name: \"file\", description: \"Write output to a file instead of stdout\" },\n { long: \"--release-notes\", description: \"Use a concise release-notes title and output shape\" },\n { long: \"--title\", value_name: \"text\", description: \"Output title (default: Changelog or Release Notes)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--include-metadata\", description: \"Append compact item metadata (type/status/priority/release/milestone) to each entry\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n ],\n };\n const registerExporterWithMetadata = api.registerExporter as unknown as (\n name: string,\n exporter: Parameters<typeof api.registerExporter>[1],\n options: typeof changelogExportMetadata,\n ) => void;\n\n registerExporterWithMetadata(\"changelog\", async (ctx) => {\n const format = (stringOption(ctx.options, \"format\", \"format\") ?? \"md\").toLowerCase();\n if (format !== \"md\" && format !== \"markdown\" && format !== \"json\") {\n throw new PmCliError(\"--format must be 'md' or 'json'\", EXIT_CODE.USAGE);\n }\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n const releaseNotes = booleanOption(ctx.options, \"release-notes\", \"releaseNotes\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\").map((s) => s.trim()).filter(Boolean);\n\n const releaseContext = resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n\n const items = await listAllItemMetadata(ctx.pm_root);\n const generated = createChangelog({\n items,\n title: stringOption(ctx.options, \"title\", \"title\") ?? (releaseNotes ? \"Release Notes\" : undefined),\n version: releaseContext.version,\n date: stringOption(ctx.options, \"date\", \"date\") ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n includeStatuses: statuses,\n groupBy: groupByOption as ChangelogGroupBy,\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n includeMetadata: booleanOption(ctx.options, \"include-metadata\", \"includeMetadata\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n });\n\n const outputPath = stringOption(ctx.options, \"output\", \"output\");\n if (format === \"json\") {\n const payload = {\n version: releaseContext.version ?? \"Unreleased\",\n item_count: generated.itemCount,\n group_by: groupByOption,\n markdown: generated.markdown,\n };\n if (outputPath) {\n writeFileSync(resolve(outputPath), JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"json\", item_count: generated.itemCount };\n }\n return payload;\n }\n\n if (outputPath) {\n writeFileSync(resolve(outputPath), generated.markdown.endsWith(\"\\n\") ? generated.markdown : generated.markdown + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"markdown\", item_count: generated.itemCount };\n }\n return { changelog: generated.markdown, format: \"markdown\", item_count: generated.itemCount };\n }, changelogExportMetadata);\n if (api.registerExporter.length < 3 && typeof api.registerFlags === \"function\") {\n api.registerFlags(\"changelog export\", changelogExportMetadata.flags);\n }\n },\n});\n\n/**\n * Best-effort enrichment of item metadata with the on-disk body, used so\n * `--body-preview` renders real body content in the extension path (GH #27).\n * `listAllItemMetadata` omits bodies, so each item is re-read via the public SDK\n * locate/read helpers. Items already carrying a body are skipped, and any\n * per-item read failure is swallowed so changelog generation never breaks.\n */\nasync function enrichItemBodies(pmRoot: string, items: PmItem[]): Promise<void> {\n let typeToFolder: Record<string, string>;\n let idPrefix: string;\n let format: Awaited<ReturnType<typeof readSettings>>[\"item_format\"];\n try {\n const settings = await readSettings(pmRoot);\n typeToFolder = resolveItemTypeRegistry(settings).type_to_folder;\n idPrefix = settings.id_prefix;\n format = settings.item_format;\n } catch {\n return; // cannot resolve settings/registry → leave item metadata as-is\n }\n\n const loadBody = async (item: PmItem): Promise<void> => {\n if (!item.id) return;\n if (typeof item.body === \"string\" && item.body.trim() !== \"\") return;\n try {\n const located = await locateItem(pmRoot, item.id, idPrefix, format, typeToFolder);\n if (!located) return;\n const { document } = await readLocatedItem(located);\n if (typeof document.body === \"string\" && document.body.trim() !== \"\") {\n item.body = document.body;\n }\n } catch {\n // best-effort: a single unreadable item must not fail generation\n }\n };\n\n // Bound concurrency so a large workspace can't exhaust file descriptors\n // (EMFILE) by issuing one locate+read per item all at once.\n const CONCURRENCY_LIMIT = 16;\n for (let i = 0; i < items.length; i += CONCURRENCY_LIMIT) {\n await Promise.all(items.slice(i, i + CONCURRENCY_LIMIT).map(loadBody));\n }\n}\n\nfunction stringOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): string | undefined {\n const value = options[kebabKey] ?? options[camelKey];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction booleanOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): boolean {\n return Boolean(options[kebabKey] ?? options[camelKey]);\n}\n\nfunction parseLimitOption(options: Record<string, unknown>): number | undefined {\n const raw = options[\"limit\"];\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number.parseInt(String(raw), 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new PmCliError(\"--limit must be a positive integer\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n\nfunction parseBodyPreviewOption(options: Record<string, unknown>): number | undefined {\n const raw = options[\"body-preview\"] ?? options[\"bodyPreview\"];\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number.parseInt(String(raw), 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new PmCliError(\"--body-preview must be a positive integer\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n"]}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport * as pmSdk from \"@unbrained/pm-cli/sdk\";\nimport {\n defineExtension,\n locateItem,\n readLocatedItem,\n readSettings,\n resolveItemTypeRegistry,\n EXIT_CODE,\n PmCliError,\n} from \"@unbrained/pm-cli/sdk\";\n\nimport { buildChangelogDocument, createChangelog, createChangelogSummary, explainChangelogSelection, formatSummaryLine, mergeChangelog, suggestSemver, writeChangelog } from \"./generator.js\";\nimport { resolveReleaseContext, resolveReleaseTagWindows } from \"./release-context.js\";\nimport type { ChangelogGroupBy, ChangelogSectionBy, PmItem } from \"./types.js\";\n\ntype ItemMetadataReader = (pmRoot: string) => Promise<PmItem[]>;\n\nconst sdkExports = pmSdk as unknown as Record<string, unknown>;\nconst listAllItemMetadata = (\n sdkExports.listAllItemMetadata ?? sdkExports[[\"listAll\", \"Front\", \"Matter\"].join(\"\")]\n) as ItemMetadataReader;\n\n// Renderer-override plumbing (mirrors pm-brief/pm-context): a command handler\n// can return a marker carrying a pre-rendered string, and the registered toon/\n// json renderers print that string verbatim to stdout. This makes `--format\n// json` emit real JSON on stdout without requiring the global `--json` flag,\n// while any non-marker return still falls through to pm's default rendering.\ninterface RenderedCommandResult {\n pmChangelogRendered: true;\n output: string;\n}\nfunction renderedCommandResult(value: unknown): RenderedCommandResult {\n const output = `${JSON.stringify(value, null, 2)}\\n`;\n return { pmChangelogRendered: true, output };\n}\nfunction renderCommandResult(context: { result?: unknown } | undefined): string | null {\n const result = context?.result as RenderedCommandResult | undefined;\n return result?.pmChangelogRendered === true && typeof result.output === \"string\"\n ? result.output\n : null;\n}\n\nexport default defineExtension({\n name: \"pm-changelog\",\n version: \"2026.7.14-2\",\n\n activate(api) {\n api.registerCommand({\n name: \"changelog generate\",\n description: \"Generate a CHANGELOG.md file from pm items.\",\n intent: \"generate changelog release notes from completed pm items\",\n examples: [\n \"pm changelog generate\",\n \"pm changelog generate --release-version 1.2.0\",\n \"pm changelog generate --release-version-from-package --since-previous-tag --until-release-tag\",\n \"pm changelog generate --all-release-tags --mode replace\",\n \"pm changelog generate --output RELEASE_NOTES.md --since 2026-05-01\",\n \"pm changelog generate --stdout --group-by release\",\n \"pm changelog generate --stdout --group-by milestone\",\n \"pm changelog generate --check --mode prepend --release-version 1.2.0\",\n ],\n flags: [\n { long: \"--output\", value_name: \"file\", description: \"Output file path (default: CHANGELOG.md)\" },\n { long: \"--stdout\", description: \"Return markdown instead of writing a file\" },\n { long: \"--title\", value_name: \"text\", description: \"Changelog title (default: Changelog)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--all-release-tags\", description: \"Rebuild full history from git release tag windows\" },\n { long: \"--release-tag-pattern\", value_name: \"glob\", description: \"Git tag glob for --all-release-tags (default: v*)\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--section-by\", value_name: \"mode\", description: \"Within-release grouping: category, type, status, or label (default: category)\" },\n { long: \"--conventional\", description: \"Use Conventional-Commits headings (Features/Bug Fixes/...) for category grouping\" },\n { long: \"--contributors\", description: \"Append a Contributors list per release from item assignee/author\" },\n { long: \"--limit\", value_name: \"n\", description: \"Keep only the most recent N release sections (history modes only)\" },\n { long: \"--since-version\", value_name: \"version\", description: \"Keep only releases at or newer than this version (history modes only)\" },\n { long: \"--breaking-changes\", description: \"Emit a Breaking Changes section listing items detected as breaking\" },\n { long: \"--suggest-semver\", description: \"Return a suggested semver bump (major/minor/patch); never writes the changelog\" },\n { long: \"--body-preview\", value_name: \"n\", description: \"Append the first N chars of each item body to its entry\" },\n { long: \"--emoji-prefix\", description: \"Prefix section headings with conventional emoji (Added 🎉, Fixed 🐛, ...)\" },\n { long: \"--include-metadata\", description: \"Append compact item metadata (type/status/priority/release/milestone) to each entry\" },\n { long: \"--changelog-json\", description: \"Return the full structured changelog document (releases->sections->items)\" },\n { long: \"--explain\", description: \"Return item-selection diagnostics (counts, exclusions, hints)\" },\n { long: \"--summary\", description: \"Return a compact one-line-per-change summary instead of full markdown\" },\n { long: \"--format\", value_name: \"md|json\", description: \"Output format: md (default) or json for machine-readable output\" },\n { long: \"--mode\", value_name: \"mode\", description: \"replace or prepend existing changelog (default: replace)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n { long: \"--check\", description: \"Do not write; report whether the changelog would change\" },\n ],\n async run(ctx) {\n const output = (ctx.options[\"output\"] as string | undefined) ?? \"CHANGELOG.md\";\n const stdout = Boolean(ctx.options[\"stdout\"]);\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n const modeOption = (ctx.options[\"mode\"] as string | undefined) ?? \"replace\";\n\n // Throw (with a numeric exitCode) rather than returning { error }: the\n // runtime treats a returned object as a successful run (exit 0), so a\n // returned error silently passed validation failures. A PmCliError\n // carries its exitCode so the handler exits non-zero and runs once.\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n if (modeOption !== \"replace\" && modeOption !== \"prepend\") {\n throw new PmCliError(\"--mode must be 'replace' or 'prepend'\", EXIT_CODE.USAGE);\n }\n const sectionByOption = stringOption(ctx.options, \"section-by\", \"sectionBy\") ?? \"category\";\n if (sectionByOption !== \"category\" && sectionByOption !== \"type\" && sectionByOption !== \"status\" && sectionByOption !== \"label\") {\n throw new PmCliError(\"--section-by must be 'category', 'type', 'status', or 'label'\", EXIT_CODE.USAGE);\n }\n // Validate --format up front (matching `changelog export`) instead of\n // silently treating unsupported values as the default markdown output.\n const formatOption = stringOption(ctx.options, \"format\", \"format\");\n const normalizedFormat = formatOption?.trim().toLowerCase();\n if (normalizedFormat !== undefined && normalizedFormat !== \"md\" && normalizedFormat !== \"markdown\" && normalizedFormat !== \"json\") {\n throw new PmCliError(\"--format must be 'md' or 'json'\", EXIT_CODE.USAGE);\n }\n const wantsJsonFormat = normalizedFormat === \"json\";\n const limitValue = parseLimitOption(ctx.options);\n const groupBy: ChangelogGroupBy = groupByOption;\n const sectionBy: ChangelogSectionBy = sectionByOption;\n const mode: \"replace\" | \"prepend\" = modeOption;\n\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\")\n .map((status) => status.trim())\n .filter(Boolean);\n\n const allReleaseTags = booleanOption(ctx.options, \"all-release-tags\", \"allReleaseTags\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const titleOption = stringOption(ctx.options, \"title\", \"title\");\n const dateOption = stringOption(ctx.options, \"date\", \"date\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const releaseContext = allReleaseTags\n ? { version: undefined, date: undefined, since: undefined, until: undefined }\n : resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n const releaseWindows = allReleaseTags\n ? resolveReleaseTagWindows({\n cwd: ctx.pm_root,\n tagPattern: stringOption(ctx.options, \"release-tag-pattern\", \"releaseTagPattern\"),\n includeOrphaned: true,\n pendingVersion: releaseVersion,\n pendingTimestamp: untilOption ?? dateOption,\n })\n : undefined;\n\n const items = (await listAllItemMetadata(ctx.pm_root)) as PmItem[];\n const bodyPreview = parseBodyPreviewOption(ctx.options);\n // listAllItemMetadata omits item bodies, so --body-preview would silently\n // render nothing (GH #27). Load bodies on demand only when previewing.\n if (bodyPreview !== undefined && bodyPreview > 0) {\n await enrichItemBodies(ctx.pm_root, items);\n }\n const generationOptions = {\n items,\n title: titleOption,\n version: releaseContext.version,\n date: dateOption ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n releaseWindows,\n includeStatuses: statuses,\n groupBy,\n sectionBy,\n conventional: booleanOption(ctx.options, \"conventional\", \"conventional\"),\n contributors: booleanOption(ctx.options, \"contributors\", \"contributors\"),\n limit: limitValue,\n sinceVersion: stringOption(ctx.options, \"since-version\", \"sinceVersion\"),\n breakingChanges: booleanOption(ctx.options, \"breaking-changes\", \"breakingChanges\"),\n bodyPreview,\n emojiPrefix: booleanOption(ctx.options, \"emoji-prefix\", \"emojiPrefix\"),\n includeMetadata: booleanOption(ctx.options, \"include-metadata\", \"includeMetadata\"),\n suggestSemver: booleanOption(ctx.options, \"suggest-semver\", \"suggestSemver\"),\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n };\n const selectionReport = booleanOption(ctx.options, \"explain\", \"explain\")\n ? explainChangelogSelection(generationOptions)\n : undefined;\n\n // OPT-IN (`--format json` without `--summary`): alias for the structured\n // --changelog-json document so agents have a single --format flag.\n const summaryOption = booleanOption(ctx.options, \"summary\", \"summary\");\n\n // OPT-IN (`--summary`): compact one-line-per-change output for quick\n // agent scanning. Never writes a file.\n if (summaryOption) {\n const entries = createChangelogSummary(generationOptions);\n if (wantsJsonFormat) {\n return renderedCommandResult({\n entries,\n format: \"json\",\n item_count: entries.length,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n });\n }\n const lines = entries.map((entry) => formatSummaryLine(entry));\n return {\n summary: lines.join(\"\\n\"),\n format: \"text\",\n item_count: entries.length,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n\n // OPT-IN (`--changelog-json` or `--format json`): structured document;\n // never writes a file. `--suggest-semver` keeps its dedicated JSON shape\n // below instead of being aliased to the full document.\n const suggestSemverOption = booleanOption(ctx.options, \"suggest-semver\", \"suggestSemver\");\n if (booleanOption(ctx.options, \"changelog-json\", \"changelogJson\") || (wantsJsonFormat && !suggestSemverOption)) {\n const document = buildChangelogDocument(generationOptions);\n return renderedCommandResult({\n document,\n format: \"json\",\n item_count: document.item_count,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n });\n }\n\n // OPT-IN (`--suggest-semver`) standalone: emit only the semver analysis;\n // never writes a file and never alters default markdown.\n if (suggestSemverOption) {\n const suggestion = suggestSemver(generationOptions);\n return renderedCommandResult({\n suggested_semver: suggestion,\n format: \"json\",\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n });\n }\n\n const generated = createChangelog(generationOptions);\n\n if (stdout) {\n const merged = mode === \"prepend\"\n ? mergeChangelog(undefined, generated.markdown, { title: titleOption })\n : { markdown: generated.markdown, action: \"replaced\" as const, changed: true };\n return {\n changelog: merged.markdown,\n action: merged.action,\n changed: merged.changed,\n item_count: generated.itemCount,\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n }\n\n const result = writeChangelog({\n ...generationOptions,\n output,\n mode,\n check: Boolean(ctx.options[\"check\"]),\n });\n if (result.changed && Boolean(ctx.options[\"check\"])) {\n throw new PmCliError(`Changelog is out of date: ${result.output}`, EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n file: result.output,\n action: result.action,\n changed: result.changed,\n item_count: result.itemCount,\n bytes: result.bytes,\n check: Boolean(ctx.options[\"check\"]),\n ...(selectionReport ? { selection_report: selectionReport } : {}),\n };\n },\n });\n\n // -----------------------------------------------------------------------\n // Exporter: `pm changelog export` — native export pipeline.\n // Reuses the same generation core as `changelog generate` (whose default\n // output is intentionally left byte-identical). Adds --format md|json and a\n // --release-notes concise mode. Does NOT write CHANGELOG.md unless --output\n // is given, so it is side-effect free by default.\n // -----------------------------------------------------------------------\n const changelogExportMetadata = {\n description: \"Export changelog or release notes through the pm import/export pipeline.\",\n intent: \"export changelog release notes as markdown or json\",\n examples: [\n \"pm changelog export\",\n \"pm changelog export --format json\",\n \"pm changelog export --release-notes --since-previous-tag --until-release-tag\",\n \"pm changelog export --output RELEASE_NOTES.md --release-version-from-package\",\n ],\n flags: [\n { long: \"--format\", value_name: \"md|json\", description: \"Export format (default: md)\" },\n { long: \"--output\", value_name: \"file\", description: \"Write output to a file instead of stdout\" },\n { long: \"--release-notes\", description: \"Use a concise release-notes title and output shape\" },\n { long: \"--title\", value_name: \"text\", description: \"Output title (default: Changelog or Release Notes)\" },\n { long: \"--release-version\", value_name: \"version\", description: \"Release/version heading (default: Unreleased)\" },\n { long: \"--release-version-from-package\", description: \"Read release/version heading from nearest package.json\" },\n { long: \"--date\", value_name: \"date\", description: \"Release date (default: resolved tag date when available, otherwise today)\" },\n { long: \"--since\", value_name: \"date\", description: \"Include items changed on or after this date\" },\n { long: \"--since-previous-tag\", description: \"Derive --since from the previous git tag\" },\n { long: \"--until\", value_name: \"date\", description: \"Include items changed on or before this date\" },\n { long: \"--until-release-tag\", description: \"Derive --until from the current release tag when it exists\" },\n { long: \"--status\", value_name: \"list\", description: \"Comma-separated statuses (default: closed)\" },\n { long: \"--group-by\", value_name: \"mode\", description: \"version, release, or milestone (default: version)\" },\n { long: \"--include-empty\", description: \"Emit an empty release section when no items match\" },\n { long: \"--include-links\", description: \"Include item URLs in generated entries (default: false)\" },\n { long: \"--include-metadata\", description: \"Append compact item metadata (type/status/priority/release/milestone) to each entry\" },\n { long: \"--item-url-base\", value_name: \"url\", description: \"Make item IDs clickable links to .toon files under the base URL\" },\n ],\n };\n const registerExporterWithMetadata = api.registerExporter as unknown as (\n name: string,\n exporter: Parameters<typeof api.registerExporter>[1],\n options: typeof changelogExportMetadata,\n ) => void;\n\n registerExporterWithMetadata(\"changelog\", async (ctx) => {\n const format = (stringOption(ctx.options, \"format\", \"format\") ?? \"md\").toLowerCase();\n if (format !== \"md\" && format !== \"markdown\" && format !== \"json\") {\n throw new PmCliError(\"--format must be 'md' or 'json'\", EXIT_CODE.USAGE);\n }\n const groupByOption = stringOption(ctx.options, \"group-by\", \"groupBy\") ?? \"version\";\n if (groupByOption !== \"version\" && groupByOption !== \"release\" && groupByOption !== \"milestone\") {\n throw new PmCliError(\"--group-by must be 'version', 'release', or 'milestone'\", EXIT_CODE.USAGE);\n }\n const releaseNotes = booleanOption(ctx.options, \"release-notes\", \"releaseNotes\");\n const releaseVersion = stringOption(ctx.options, \"release-version\", \"releaseVersion\");\n const sinceOption = stringOption(ctx.options, \"since\", \"since\");\n const untilOption = stringOption(ctx.options, \"until\", \"until\");\n const statuses = (ctx.options[\"status\"] as string | undefined)\n ?.split(\",\").map((s) => s.trim()).filter(Boolean);\n\n const releaseContext = resolveReleaseContext({\n cwd: ctx.pm_root,\n version: releaseVersion,\n versionFromPackage: booleanOption(ctx.options, \"release-version-from-package\", \"releaseVersionFromPackage\"),\n since: sinceOption,\n sincePreviousTag: booleanOption(ctx.options, \"since-previous-tag\", \"sincePreviousTag\"),\n until: untilOption,\n untilReleaseTag: booleanOption(ctx.options, \"until-release-tag\", \"untilReleaseTag\"),\n });\n\n const items = await listAllItemMetadata(ctx.pm_root);\n const generated = createChangelog({\n items,\n title: stringOption(ctx.options, \"title\", \"title\") ?? (releaseNotes ? \"Release Notes\" : undefined),\n version: releaseContext.version,\n date: stringOption(ctx.options, \"date\", \"date\") ?? releaseContext.date,\n since: releaseContext.since,\n until: releaseContext.until,\n includeStatuses: statuses,\n groupBy: groupByOption as ChangelogGroupBy,\n includeEmpty: booleanOption(ctx.options, \"include-empty\", \"includeEmpty\"),\n includeLinks: booleanOption(ctx.options, \"include-links\", \"includeLinks\"),\n includeMetadata: booleanOption(ctx.options, \"include-metadata\", \"includeMetadata\"),\n itemUrlBase: stringOption(ctx.options, \"item-url-base\", \"itemUrlBase\"),\n });\n\n const outputPath = stringOption(ctx.options, \"output\", \"output\");\n if (format === \"json\") {\n const payload = {\n version: releaseContext.version ?? \"Unreleased\",\n item_count: generated.itemCount,\n group_by: groupByOption,\n markdown: generated.markdown,\n };\n if (outputPath) {\n writeFileSync(resolve(outputPath), JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"json\", item_count: generated.itemCount };\n }\n return renderedCommandResult(payload);\n }\n\n if (outputPath) {\n writeFileSync(resolve(outputPath), generated.markdown.endsWith(\"\\n\") ? generated.markdown : generated.markdown + \"\\n\", \"utf-8\");\n return { file: outputPath, format: \"markdown\", item_count: generated.itemCount };\n }\n return { changelog: generated.markdown, format: \"markdown\", item_count: generated.itemCount };\n }, changelogExportMetadata);\n if (api.registerExporter.length < 3 && typeof api.registerFlags === \"function\") {\n api.registerFlags(\"changelog export\", changelogExportMetadata.flags);\n }\n // Register renderer overrides so json-mode results print verbatim JSON to\n // stdout under both the default (toon) and global --json renderers. Guarded\n // for older hosts without renderer support.\n const registerRenderer = (api as { registerRenderer?: (format: string, fn: typeof renderCommandResult) => void }).registerRenderer;\n if (typeof registerRenderer === \"function\") {\n registerRenderer(\"toon\", renderCommandResult);\n registerRenderer(\"json\", renderCommandResult);\n }\n },\n});\n\n/**\n * Best-effort enrichment of item metadata with the on-disk body, used so\n * `--body-preview` renders real body content in the extension path (GH #27).\n * `listAllItemMetadata` omits bodies, so each item is re-read via the public SDK\n * locate/read helpers. Items already carrying a body are skipped, and any\n * per-item read failure is swallowed so changelog generation never breaks.\n */\nasync function enrichItemBodies(pmRoot: string, items: PmItem[]): Promise<void> {\n let typeToFolder: Record<string, string>;\n let idPrefix: string;\n let format: Awaited<ReturnType<typeof readSettings>>[\"item_format\"];\n try {\n const settings = await readSettings(pmRoot);\n typeToFolder = resolveItemTypeRegistry(settings).type_to_folder;\n idPrefix = settings.id_prefix;\n format = settings.item_format;\n } catch {\n return; // cannot resolve settings/registry → leave item metadata as-is\n }\n\n const loadBody = async (item: PmItem): Promise<void> => {\n if (!item.id) return;\n if (typeof item.body === \"string\" && item.body.trim() !== \"\") return;\n try {\n const located = await locateItem(pmRoot, item.id, idPrefix, format, typeToFolder);\n if (!located) return;\n const { document } = await readLocatedItem(located);\n if (typeof document.body === \"string\" && document.body.trim() !== \"\") {\n item.body = document.body;\n }\n } catch {\n // best-effort: a single unreadable item must not fail generation\n }\n };\n\n // Bound concurrency so a large workspace can't exhaust file descriptors\n // (EMFILE) by issuing one locate+read per item all at once.\n const CONCURRENCY_LIMIT = 16;\n for (let i = 0; i < items.length; i += CONCURRENCY_LIMIT) {\n await Promise.all(items.slice(i, i + CONCURRENCY_LIMIT).map(loadBody));\n }\n}\n\nfunction stringOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): string | undefined {\n const value = options[kebabKey] ?? options[camelKey];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction booleanOption(options: Record<string, unknown>, kebabKey: string, camelKey: string): boolean {\n return Boolean(options[kebabKey] ?? options[camelKey]);\n}\n\nfunction parseLimitOption(options: Record<string, unknown>): number | undefined {\n const raw = options[\"limit\"];\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number.parseInt(String(raw), 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new PmCliError(\"--limit must be a positive integer\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n\nfunction parseBodyPreviewOption(options: Record<string, unknown>): number | undefined {\n const raw = options[\"body-preview\"] ?? options[\"bodyPreview\"];\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number.parseInt(String(raw), 10);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new PmCliError(\"--body-preview must be a positive integer\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n"]}
package/docs/release.md CHANGED
@@ -16,6 +16,18 @@ The gate:
16
16
  - Verifies package contents with `npm pack --dry-run`.
17
17
  - Checks that `CHANGELOG.md` is current.
18
18
 
19
+ The changelog check derives its release window from git tags, so release
20
+ validation requires a checkout with tag history. Both repository workflows use
21
+ `actions/checkout` with `fetch-depth: 0`. Before running the gate in a shallow
22
+ or tagless clone, restore the tag refs:
23
+
24
+ ```bash
25
+ git fetch --tags --force
26
+ ```
27
+
28
+ A sandbox that intentionally omits tags cannot reconstruct the previous-tag to
29
+ release-tag window and is not a valid changelog release-gate environment.
30
+
19
31
  ## Automated Release
20
32
 
21
33
  `.github/workflows/release.yml` runs daily and by manual dispatch. It uses free GitHub Actions features only.
@@ -28,19 +40,48 @@ The workflow skips publishing when there are no commits after the latest release
28
40
  - Generates or refreshes the current `CHANGELOG.md` release section with `pm-changelog` itself while preserving older release sections.
29
41
  - Runs release checks.
30
42
  - Commits release files.
43
+ - Pushes the release commit to a deterministic `release/<version>` branch and creates or reuses a pull request.
44
+ - Merges that pull request through normal `main` branch protection, then checks out and fully revalidates the exact merged commit.
31
45
  - Publishes to npm with provenance.
46
+ - Tags the verified merged commit and removes the temporary release branch.
32
47
  - Creates the public GitHub release.
33
48
 
49
+ The workflow never pushes a release commit directly to `main`, and it never
50
+ publishes npm before the matching version metadata and changelog are present on
51
+ protected `main`. If publication fails after the release PR merges, the next run
52
+ recognizes that the release metadata is already on `main` and retries the same
53
+ version, including after the local calendar date changes. It also skips an npm
54
+ version that the registry already contains, which lets an interrupted run
55
+ converge without duplicating publication. If npm and the tag exist but GitHub
56
+ release creation was interrupted, a no-change run verifies the registry package
57
+ and reconstructs the missing GitHub release from the tagged changelog window.
58
+ Provenance is mandatory: after three failed attested publish attempts, the run
59
+ fails and relies on the same-version recovery path instead of silently
60
+ downgrading the package's supply-chain evidence.
61
+
34
62
  Required repository secret:
35
63
 
36
64
  ```text
37
65
  NPM_TOKEN
38
66
  ```
39
67
 
40
- Required workflow permissions:
68
+ Required `release` job permissions (scoped to that job, not the workflow):
41
69
 
42
70
  - `contents: write` for release commits, tags, and GitHub releases.
43
71
  - `id-token: write` for npm provenance.
72
+ - `pull-requests: write` for the protected release-metadata PR transaction.
73
+
74
+ The repository must also enable **Settings → Actions → General → Workflow
75
+ permissions → Allow GitHub Actions to create and approve pull requests**. Keep
76
+ the repository's default `GITHUB_TOKEN` permission read-only; the release
77
+ workflow's `release` job declares only the three write capabilities above. GitHub documents
78
+ this repository setting in [Managing GitHub Actions settings for a
79
+ repository](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#preventing-github-actions-from-creating-or-approving-pull-requests).
80
+
81
+ The release merge uses GitHub's pull-request merge endpoint with the prepared
82
+ release commit as the required head `sha`. A changed head is rejected instead
83
+ of being merged accidentally; see [Merge a pull
84
+ request](https://docs.github.com/en/rest/pulls/pulls#merge-a-pull-request).
44
85
 
45
86
  ## Versioning
46
87
 
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-changelog",
3
- "version": "2026.7.13",
3
+ "version": "2026.7.14-2",
4
4
  "manifest_version": 2,
5
5
  "description": "Generate CHANGELOG.md release notes from pm-cli items",
6
6
  "author": "@unbraind",
@@ -20,7 +20,8 @@
20
20
  "capabilities": [
21
21
  "commands",
22
22
  "schema",
23
- "importers"
23
+ "importers",
24
+ "renderers"
24
25
  ],
25
26
  "activation": {
26
27
  "commands": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-changelog",
3
- "version": "2026.7.13",
3
+ "version": "2026.7.14-2",
4
4
  "description": "Generate CHANGELOG.md files from pm-cli items for local and CI usage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -98,7 +98,7 @@
98
98
  },
99
99
  "devDependencies": {
100
100
  "@types/node": "^26.1.1",
101
- "@unbrained/pm-cli": "^2026.7.12",
101
+ "@unbrained/pm-cli": "^2026.7.13",
102
102
  "typescript": "^7.0.2"
103
103
  },
104
104
  "keywords": [