feat(home): What's new beside each update, the release notes read in the launcher #109

Merged
HumanBean merged 1 commit from HumanBean/LongshotLauncher:feat/release-notes into main 2026-11-15 18:01:13 +00:00
Owner

Players can't see what an update brings without leaving the launcher for the release page on git.magicbean.dev. This shows each release's notes inside the launcher, beside the update.

What changed

  • The body is kept, no new request. The update check already reads each product's release list (/releases?limit=50), and Forgejo's list includes every release's body. ListedRelease now keeps it (cut at 64 KB), and Releases.Listed keeps the last list that answered.

  • Which pages to show (Core/ReleaseNotes.cs). Each page's notes start after a known version (scripts/release.py notes): a stable after the stable before it, a first rc after the version before it, a later rc after the last stable. So the pages from the player's version to the offered one form a chain, newest first: v3.0.0 → v3.2.0 shows v3.2.0 and v3.1.0, and rc.3 → rc.6 shows only rc.6 because rc.6 already covers the earlier rcs. A nightly shows only the newest one, since each nightly's notes include the ones before it. At most 8 pages are shown. A version that isn't a release (dev) or is newer than the offered one gets only the offered page.

  • Markdown without a package (Core/Markdown.cs, App/Controls/Notes.cs). Supports headings, paragraphs, nested bullets, numbered items, rules, code, and inline bold/italic/code/links. The download header at the top of each page (everything up to the first ---) is dropped. #123 links to the pull request. Links open through the host's Open, and only http(s) addresses become links: no file:, program paths or javascript:.

  • Where it shows (Home):

    • a What's new link under the default version's "vX is out" line;
    • a What's new link in the selected version's action row when it has an update;
    • a What's new link in the launcher's update banner.

    Each opens a dialog with the notes, Open the release page, Close and the update button (Update, or the launcher's Update the launcher / Switch to it).

  • No notes: if the list didn't answer or doesn't have that version, the link opens the release page in the browser. A page with no text says "This version's page has no notes."

  • Six new texts, translated in the 12 full catalogs (fr with U+00A0 before :;?!). scripts/translations.py still reports 5 missing per catalog (3 for es), the same as main.

  • Screenshot scenes home-update, whats-new and whats-new-launcher. LauncherService.SetLauncherUpdate exists for the launcher scene, like SetNewest.

Tests

  • python -I tests/test_launcher_core.py: 1274 checks passed. New ReleaseNotesChecks.cs covers:

    • the page text after the downloads;
    • the release chain for stable, rc, first-rc, nightly, dev, a draft, a version not listed, no list, and the 8-page cap;
    • block and inline markdown, including the cases that must stay plain (snake_case, a ** b **, unclosed marks, file:/javascript:/relative links, entities, C#1).

    ReleaseChecks also checks that the list is kept without drafts.

  • python -I tests/test_release.py: 31 tests OK.

  • dotnet build App -c Release -warnaserror and tools/screenshots: clean.

Not tried on a real window: clicking links (hit-testing the text) and the hand cursor. The screenshots are headless.

🤖 Generated with Claude Code

Players can't see what an update brings without leaving the launcher for the release page on git.magicbean.dev. This shows each release's notes inside the launcher, beside the update. ## What changed - **The body is kept, no new request.** The update check already reads each product's release list (`/releases?limit=50`), and Forgejo's list includes every release's `body`. `ListedRelease` now keeps it (cut at 64 KB), and `Releases.Listed` keeps the last list that answered. - **Which pages to show** (`Core/ReleaseNotes.cs`). Each page's notes start after a known version (scripts/release.py `notes`): a stable after the stable before it, a first rc after the version before it, a later rc after the last stable. So the pages from the player's version to the offered one form a chain, newest first: v3.0.0 → v3.2.0 shows v3.2.0 and v3.1.0, and rc.3 → rc.6 shows only rc.6 because rc.6 already covers the earlier rcs. A nightly shows only the newest one, since each nightly's notes include the ones before it. At most 8 pages are shown. A version that isn't a release (`dev`) or is newer than the offered one gets only the offered page. - **Markdown without a package** (`Core/Markdown.cs`, `App/Controls/Notes.cs`). Supports headings, paragraphs, nested bullets, numbered items, rules, code, and inline bold/italic/code/links. The download header at the top of each page (everything up to the first `---`) is dropped. `#123` links to the pull request. Links open through the host's `Open`, and only http(s) addresses become links: no `file:`, program paths or `javascript:`. - **Where it shows** (Home): - a *What's new* link under the default version's "vX is out" line; - a *What's new* link in the selected version's action row when it has an update; - a *What's new* link in the launcher's update banner. Each opens a dialog with the notes, *Open the release page*, *Close* and the update button (*Update*, or the launcher's *Update the launcher* / *Switch to it*). - **No notes:** if the list didn't answer or doesn't have that version, the link opens the release page in the browser. A page with no text says "This version's page has no notes." - Six new texts, translated in the 12 full catalogs (fr with U+00A0 before `:;?!`). `scripts/translations.py` still reports 5 missing per catalog (3 for es), the same as main. - Screenshot scenes `home-update`, `whats-new` and `whats-new-launcher`. `LauncherService.SetLauncherUpdate` exists for the launcher scene, like `SetNewest`. ## Tests - `python -I tests/test_launcher_core.py`: 1274 checks passed. New `ReleaseNotesChecks.cs` covers: - the page text after the downloads; - the release chain for stable, rc, first-rc, nightly, `dev`, a draft, a version not listed, no list, and the 8-page cap; - block and inline markdown, including the cases that must stay plain (snake_case, `a ** b **`, unclosed marks, `file:`/`javascript:`/relative links, entities, `C#1`). `ReleaseChecks` also checks that the list is kept without drafts. - `python -I tests/test_release.py`: 31 tests OK. - `dotnet build App -c Release -warnaserror` and `tools/screenshots`: clean. Not tried on a real window: clicking links (hit-testing the text) and the hand cursor. The screenshots are headless. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(home): What's new beside each update, the release notes read in the launcher
All checks were successful
CI / Compile and test (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 5s
c96443c0cf
The update check already reads each product's release list; it now keeps
each release's page text (the body), and Home shows What's new beside a
build's update and the launcher's own: every release from the player's
version to the offered one, newest first, rendered from markdown with no
new package.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Author
Owner

Screenshots (tools/screenshots: home-update, whats-new, whats-new-launcher).

Home with an update: What's new under the default version's "is out" line.

home-update

What's new for a v3.0.0 build with v3.2.0 out: both stables since, newest first.

whats-new

The launcher's own update, from the banner's What's new.

whats-new-launcher

Screenshots (`tools/screenshots`: `home-update`, `whats-new`, `whats-new-launcher`). **Home with an update:** *What's new* under the default version's "is out" line. ![home-update](https://git.magicbean.dev/attachments/1379adf2-a410-4422-893e-8e606b91097e) **What's new for a v3.0.0 build with v3.2.0 out:** both stables since, newest first. ![whats-new](https://git.magicbean.dev/attachments/1a20a8a4-9dc6-4618-b5ec-a21d720b75e8) **The launcher's own update**, from the banner's *What's new*. ![whats-new-launcher](https://git.magicbean.dev/attachments/379afc61-8175-42b2-8e4b-262ae5be883e)
HumanBean deleted branch feat/release-notes 2026-11-15 18:01:16 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/LongshotLauncher!109
No description provided.