{"id":"695930da9a6ad5c359ebbcb1","title":"2026 01 03 Issue 111","path":"how-to/committee/release-notes/2026-01-03-issue-111","contentMarkdown":"# 03-Jan-2026 — release-notes: polish release-note automation and shared code [#111](https://github.com/nbarrett/ngx-ramblers/issues/111)\n\n## [build 403](https://github.com/nbarrett/ngx-ramblers/actions/runs/20678226936) — [commit 9dae9ef](https://github.com/nbarrett/ngx-ramblers/commit/9dae9ef0fe9ac95a3b821e5d829a689ad1dca7bf)\n\n_____\n\n### **release-notes**: polish release-note automation and shared code, include id in update payload for backend compatibility and resolve CMS update error and CI/CD credential prompting ([#111](https://github.com/nbarrett/ngx-ramblers/issues/111))\n\n- build core script features (issue grouping, CLI menus, dry-run/preview, CMS JWT integration) and keep release notes concise with linked issues, ISO/11-Nov-2025 formatting, and index dedupe\n- add GitHub build-number preservation with automatic workflow lookups, canonical date-based paths, and legacy page cleanup\n- support flexible --since-date/--until-date parsing via UIDateFormat and include the new --include-unassigned flag\n- centralize numeric parsing in numbers.ts and reuse it across Angular + Node code (map controls, audits, grid refs, etc.), keeping structured branching and declarative loops per AGENTS.md\n- resolve index duplicates via CMS-based state and upserts (ref: #111)\n- Migrate from local processed-commits.json to CMS as source of truth for state tracking and duplicate detection\n- Remove loadStateFile, saveStateFile, and all processedCommits filtering logic\n- Add filterExistingReleaseNotes: queries CMS for each release note path, skips existing pages, shows new vs existing count\n- Change all command modes (--all, --latest, --since, --since-date) to regenerate/upsert ALL release notes in the range (not just new ones)\n- Leverage createOrUpdatePageContent's upsert behavior + automatic index updates to deduplicate entries\n- Remove early return when all pages already exist\n- Update logging to reflect create/update behavior, show \"will update all\" when existing pages found, and display new/existing counts\n- Refactor commandLineMode to use explicit nested if/else chains instead of scattered early returns (follows AGENTS.md structured branching)\n- Refactor cms-client.ts from class-based to functional exports\n- Move CMSAuth interface to models.ts\n- Rename getPageContent → pageContent, add deletePageContent function\n- Update generate-release-notes.ts and delete-pages.ts to use new functional CMS API\n- Fix dry run mode to skip CMS filtering when auth is unavailable\n- Update README to document CMS-based approach\n\nThe backend findId logic prioritizes body.id over params.id - when body.id is undefined, it incorrectly uses the entire body as MongoDB criteria\n\n- Remove id from request payload in updatePageContent to fix \"Document not found\" MongoDB error\n- Add non-interactive environment detection to prevent credential prompting in GitHub Actions","contentHtml":"<h1>03-Jan-2026 — release-notes: polish release-note automation and shared code <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/111\">#111</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/20678226936\">build 403</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/9dae9ef0fe9ac95a3b821e5d829a689ad1dca7bf\">commit 9dae9ef</a></h2>\n<hr>\n<h3><strong>release-notes</strong>: polish release-note automation and shared code, include id in update payload for backend compatibility and resolve CMS update error and CI/CD credential prompting (<a href=\"https://github.com/nbarrett/ngx-ramblers/issues/111\">#111</a>)</h3>\n<ul>\n<li>build core script features (issue grouping, CLI menus, dry-run/preview, CMS JWT integration) and keep release notes concise with linked issues, ISO/11-Nov-2025 formatting, and index dedupe</li>\n<li>add GitHub build-number preservation with automatic workflow lookups, canonical date-based paths, and legacy page cleanup</li>\n<li>support flexible --since-date/--until-date parsing via UIDateFormat and include the new --include-unassigned flag</li>\n<li>centralize numeric parsing in numbers.ts and reuse it across Angular + Node code (map controls, audits, grid refs, etc.), keeping structured branching and declarative loops per AGENTS.md</li>\n<li>resolve index duplicates via CMS-based state and upserts (ref: #111)</li>\n<li>Migrate from local processed-commits.json to CMS as source of truth for state tracking and duplicate detection</li>\n<li>Remove loadStateFile, saveStateFile, and all processedCommits filtering logic</li>\n<li>Add filterExistingReleaseNotes: queries CMS for each release note path, skips existing pages, shows new vs existing count</li>\n<li>Change all command modes (--all, --latest, --since, --since-date) to regenerate/upsert ALL release notes in the range (not just new ones)</li>\n<li>Leverage createOrUpdatePageContent&#39;s upsert behavior + automatic index updates to deduplicate entries</li>\n<li>Remove early return when all pages already exist</li>\n<li>Update logging to reflect create/update behavior, show &quot;will update all&quot; when existing pages found, and display new/existing counts</li>\n<li>Refactor commandLineMode to use explicit nested if/else chains instead of scattered early returns (follows AGENTS.md structured branching)</li>\n<li>Refactor cms-client.ts from class-based to functional exports</li>\n<li>Move CMSAuth interface to models.ts</li>\n<li>Rename getPageContent → pageContent, add deletePageContent function</li>\n<li>Update generate-release-notes.ts and delete-pages.ts to use new functional CMS API</li>\n<li>Fix dry run mode to skip CMS filtering when auth is unavailable</li>\n<li>Update README to document CMS-based approach</li>\n</ul>\n<p>The backend findId logic prioritizes body.id over params.id - when body.id is undefined, it incorrectly uses the entire body as MongoDB criteria</p>\n<ul>\n<li>Remove id from request payload in updatePageContent to fix &quot;Document not found&quot; MongoDB error</li>\n<li>Add non-interactive environment detection to prevent credential prompting in GitHub Actions</li>\n</ul>\n"}