feat(updates): "What's New" highlights after update + pre-update teaser

Surfaces release highlights to admins, sourced from the GitHub release notes
(no AI at runtime). Bullets are written once per release in CI via GitHub Models
(see docs/ci/whatsnew-highlights.yml) into a <!-- whatsnew --> block; the app
reads that block and falls back to the changelog's "### Features" for releases
without it — so it works against today's releases immediately.

- backend utils/whatsNew.parseWhatsNew(body): curated block else Features
  section, strips scope/PR-links, de-dups, caps at 8 (tested).
- GET  /admin/system/updates/whatsnew: highlights for every version moved
  through since the per-instance marker (whatsnew_last_seen_version); fresh
  installs self-anchor silently. Best-effort, never errors.
- POST /admin/system/updates/whatsnew/seen: advance the marker (per-instance).
- /admin/system/updates also returns latestHighlights for the teaser.
- Frontend: WhatsNewBanner (green bar -> modal with "Full changelog" link) on
  the dashboard via adminService; UpdateNotification shows a "New features
  include:" teaser. i18n de/en. No migration (uses app_settings).
This commit is contained in:
Luca
2026-06-30 02:31:13 +02:00
parent a24821de55
commit 500cf8522e
10 changed files with 463 additions and 2 deletions
+8
View File
@@ -2295,10 +2295,18 @@
"warning": "Warnung",
"error": "Fehler"
},
"whatsnew": {
"title": "Neu in {{version}}",
"viewAll": "Was ist neu",
"modalTitle": "Was ist neu",
"fullChangelog": "Vollständiges Änderungsprotokoll",
"gotIt": "Verstanden"
},
"updates": {
"available": "Update verfügbar",
"newVersion": "Version {{version}} ist verfügbar",
"currentVersion": "Aktuell: {{version}}",
"newFeatures": "Neue Funktionen:",
"channel": "Kanal: {{channel}}",
"channelStable": "Stabil",
"channelBeta": "Beta",
+8
View File
@@ -1880,10 +1880,18 @@
"error": "Error",
"checking": "Checking..."
},
"whatsnew": {
"title": "What's new in {{version}}",
"viewAll": "What's new",
"modalTitle": "What's new",
"fullChangelog": "Full changelog",
"gotIt": "Got it"
},
"updates": {
"available": "Update Available",
"newVersion": "Version {{version}} is available",
"currentVersion": "Current: {{version}}",
"newFeatures": "New features include:",
"channel": "Channel: {{channel}}",
"channelStable": "Stable",
"channelBeta": "Beta",