Skip to content

feat(launcher): add Help, News and the player Guide on one launcher design system - #537

Merged
Mat4m0 merged 14 commits into
mainfrom
feat/launcher-help-page
Nov 5, 2026
Merged

Mat4m0 merged 14 commits into
mainfrom
feat/launcher-help-page

Conversation

@Mat4m0

@Mat4m0 Mat4m0 commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner

This PR now also carries #540 (News tab and the player Guide in Help), which was stacked on it. Both land as one squash commit after one CI round. Part 1 is the original #537; part 2 is #540.

Part 1: Help page and design system

What changed

The launcher gets one Help page and one design system.

  • Help replaces Known Issues and Feedback. It lists the open issues in ArenaNet's official client with what players can do now (⌘Q → Reload Guild Wars), explains how to tell a Mac issue from a client issue, and has a feedback form. Main sends the form to Basin and the page confirms only after Basin accepted it.
  • Funding bar removed. src/shared/funding.json and the remote fetch are gone. Support is a quiet Ko-fi pill in the title bar on every page.
  • Design system. style.css names every colour, radius, and type size once in :root; components use only those tokens and one button vocabulary (.primary, .secondary, .quiet, .small, .icon-button, .chip). Documented in DESIGN.md.
  • Polish. No eyebrow labels. Nav labels stay visible at narrow widths. The title bar shows the gwonmac icon and name instead of the Reforged logo. News rows carry a source mark (Guild Wars helmet, gwonmac icon, event calendar).
  • Dailies are real. src/shared/daily-activities.ts computes Zaishen, Shining Blade, Vanguard, and Nicholas Sandford rotations offline from Guild Wars Wiki anchors, with a 7-day table and a reset countdown. The placeholder contentAvailability flag is deleted.
  • Ended events leave the news. The hero showed a finished event as "Upcoming event".
  • Settings sidebar fix. An unscoped nav {} rule from the title bar laid out the Settings groups side by side.

Why

Pages used different title sizes, five button styles, ~76 distinct colours, and square and round corners side by side. Feedback, known issues, and funding were three surfaces for one job.

Invariant

  • tests/policy/source-ui-system.test.ts: launcher shell colours come only from :root tokens, and every custom property it reads is defined. Both proven to fail on a probe.
  • tests/unit/launcher-news.test.ts: an event disappears once endsAt has passed (fails without the fix).
  • tests/unit/daily-activities.test.ts: rotations match the Wiki for today and 2026-11-23; moving one anchor by a day fails 4 of 5 tests.
  • tests/unit/launcher-feedback.test.ts and HelpView.test.ts: a report is confirmed only after it was sent, and the text survives a failed send.

Delivery

Target main. Ships with the next Beta. Installed apps that still fetch funding.json fall back to their bundled figures when the file is gone, so they keep working; they just stop updating the amount.

Verification

  • pnpm run check passed (unit, policy, tools 283, launcher 90).
  • Browser preview of the launcher renderer at 1280×800, 1100×720, 800×600 (window minimum), and 420 px, with the production, update, failed, and offline fixtures; Settings, the article modal, and the Help form.
  • Basin test submission returned HTTP 200.
  • Not checked in a packaged app or with a live game session.

Part 2: News tab and Guide (from #540)

What changed

  • News tab. Every story opens as a full page in the launcher. The news modal is deleted. Home shows the five newest stories with an "All news" link.

  • Guild Wars Wiki updates load the page source of the five newest Feedback:Game updates/ pages in one request and convert it to Markdown. Before, the API returned full text for only one page per request, so most wiki stories had no body.

  • What's new. The release post whose launcherId matches the installed version is bundled. It opens once in News after an update, but not on a new install.

  • Help is for players who already have the app. The sidebar has two groups:

    • Get help: Known issues, Troubleshooting, Report a problem.
    • Features: Accounts and launcher, Hub and Switch Character, Travel and maps, Chat and trade, Inventory, Timers and readouts, Build templates, Appearance, Performance, Game files and updates.

    The pages are the website's Markdown, bundled at build time, so they match this version and work offline. The install and comparison pages stay on the website.

  • Guide links open a Settings control (settings:<section>/<control>, checked against the settings catalogue), another Guide page, or one of a short list of allowed websites through the new externalOpenUrl IPC.

  • Media placeholders. ::media-placeholder{type="image|video"} blocks mark the screenshots and videos still to make. They render as dashed boxes in the launcher and on the website.

  • Reading styles for Guide pages and articles: lines stop at about 75 characters, emphasis is semibold, link underlines are quieter, and key chips are smaller. Troubleshooting now uses one symptom heading per problem, and each fix starts with the action.

  • 2026.11.0 release notes (draft: true, so hidden on the website and skipped by the news generator until release). They list what changes for Stable users: ⌘R opens the Hub, Xunlai moved to ⌘S, one Settings page, and templates moved to the Build Library.

Why

Many players will move from Stable 2026.8.12 to the new launcher. They need to read what changed and how each feature works inside the app. A modal was the wrong place for long text, and the old Help pointed at an install guide they no longer need.

This change deletes NewsArticle.vue and the hand-written known-issues list in HelpView.vue. The website's 7.known-issues.md is now the only source for that list. News and the Guide share one Markdown subset parser (src/shared/launcher-markdown.ts).

Invariant

  • No address in news or the Guide is trusted. Every link goes through a resolver and becomes an opaque action ID: a main-process news-link-* ID, or guide:, settings: or url: with the origin allowlist re-checked in main by parseLauncherGuideUrl.
  • guide.test.ts fails if any Guide page is missing, or if any of its links or images does not resolve.

Delivery

Folded in from #540. Recommend shipping with 2026.11.0 (Beta, then Stable). Before Stable, remove draft: true from 13.gwonmac-2026-11-0.md.

5.templates.md and the release notes describe Template files in the Build Library. That feature is in #541, which should land in the same release.

Verification

  • pnpm run check passed. After the last change, which only touched reading styles and Troubleshooting copy, the launcher vitest suite (93) and tests/policy/source-ui-system.test.ts passed again.
  • Regression tests that fail without their fix:
    • The wiki body is parsed from page source.
    • A feed copy of the release notes opens its own links, not Guide links. This bug was found while testing this branch.
  • Browser check of the launcher preview at 1280×800 and 800×600:
    • the Help groups and feature pages, placeholders, and a Settings link;
    • the News list and reader, and a wiki article with "Open on Guild Wars Wiki".
  • The eight feature pages were checked against the code. All 83 settings: links resolve, and claims found only in older docs were dropped.
  • Not checked: the website rendering of MediaPlaceholder and ProseA. No live game QA.

Fold check

  • Main (with docs(news): backfill Stable release notes in one changelog format #538's release-notes backfill) merged in without conflicts. check:links, the launcher vitest suite (93, including guide.test.ts) and typecheck passed on the merged tree.

  • I kept this pull request focused.

  • I ran the relevant checks.

  • I did not add game binaries, credentials, diagnostics, or private traffic.

  • I updated documentation when behavior or an invariant changed.

🤖 Generated with Claude Code

Mat4m0 and others added 4 commits November 3, 2026 10:33
The hero showed a finished event as "Upcoming event". The post stays on the website.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zaishen, Shining Blade, Vanguard, and Nicholas Sandford rotations follow from fixed cycles anchored on Guild Wars Wiki dates, so Dailies need no network.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Help replaces Known Issues and Feedback: open ArenaNet client issues with
what players can do now, where to report a problem, and a feedback form
that Basin receives through main. The funding bar and its remote
funding.json are removed; support is a quiet Ko-fi pill in the title bar.

The launcher now names every colour, radius, and type size once in the
:root tokens of style.css and uses one button vocabulary. Two policy tests
reject raw colours and undefined tokens. Eyebrow labels are gone, nav
labels stay visible, the title bar shows the gwonmac icon and name, news
rows carry a source mark, and Dailies show the real rotations. The
unscoped title-bar nav rule no longer breaks the Settings sidebar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue #98 is an open defect in ArenaNet's client and was missing from the list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Nov 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
gwonmac-website Skipped Skipped Nov 3, 2026 9:35am UTC

Request Review

News is now a tab: every story opens as a full page instead of a modal.
Guild Wars Wiki updates load their full page source, and the installed
version's release notes open once after an update as What's new.

Help shows the website's Known issues, Troubleshooting and eight new
feature pages, bundled at build time so they match this version and work
offline. Guide links open Settings controls, other Guide pages, or an
allowlisted website. A shared Markdown subset parser serves news and the
Guide; ::media-placeholder blocks mark screenshots and videos still to make.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mat4m0 and others added 6 commits November 3, 2026 12:56
The layout spec still clicked the old Known issues and Feedback nav buttons,
which the Help page replaced.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ginko-content's render policy refuses any link that is not https, mailto,
tel, or relative, so every page with a `settings:` link failed to
prerender. Settings are now the inline component
`:setting[Label]{to="section/control"}`, which the launcher's parser reads as
before. Both Guide components are declared in the site's component policy,
mapped through `content.markdown.tags`, and registered globally; the ProseA
override never took effect and is deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Help page's feedback form added window.launcherNative.feedback; the
shell spec's list of bridge namespaces did not have it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With News added, the tabs spilled under the Support pill at 900×640 and
200% zoom, so Help could not be clicked. The brand column now takes the
icon's width, and below 480px the tabs drop their icons; the labels stay.
The layout spec now walks Report a problem and a Guide page too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mat4m0 added a commit that referenced this pull request Nov 3, 2026
## What changed

- Raise Electron to `^43.8.1`; it resolves to 43.8.6
(GHSA-jr5w-w6x2-84p9). This replaces #536.
- Move the undici overrides to the patched 7.30.1 and 8.12.2.
- Raise happy-dom to `^21.0.4` in the launcher and tools test setups. It
is a test-only DOM, and no app bundle ships it.
- Update the website's lockfile to patched vue-i18n / `@intlify` 11.4.17
and node-forge 1.4.2. These are named lockfile updates, so no new
overrides. The i18n build plugins stay at their current versions:
`@intlify/unplugin-vue-i18n` 11.2.8 breaks the website type check.
- Pin zod 4.6.7 and body-parser 2.4.0 through overrides. Nuxt DevTools
pins zod 4.4.3 exactly, and express keeps body-parser on 2.3.0.
- Remove the node-forge exception GHSA-86w9-cpqp-85rv from the audit
config and its policy test. node-forge 1.4.2 fixes it, which is the
removal condition the exception named.

## Why

Since these advisories were published, `runtime / static` fails at `pnpm
audit --audit-level=high` on `main` and on every open pull request
(#537, #539, #540, #541 and others). No code on `main` changed. Once
this lands, a PR only needs an update from `main`.

## Verification

- `pnpm audit --audit-level=high --ignore-registry-errors` exits 0. The
remaining high and critical findings are only the documented exceptions.
- `pnpm verify:static` passed: check, build, both kernel verifiers,
integration and release tests (1907 unit, 188 policy, 283 tools, 92
launcher, 120 integration, 30 release).
- `pnpm test:website` (type check, build, release-output invariants)
passed on a fresh install of this commit.
- `pnpm test:electron` locally: 182 of 184 passed on the first run. The
2 failures were focus-sensitive specs (`character-switch-background`,
`input-clipboard`) that fought my desktop for focus. On reruns
`input-clipboard` passed, and `character-switch-background` passed 18 of
18 with `--repeat-each=3`. The CI Electron and Hub e2e shards are the
authority here.

## Rollout

The shipped app changes only by the Electron patch release (43.7.6 →
43.8.6, same major). Everything else is test or website tooling. It goes
out with the next release (2026.11.0); no separate Beta is needed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Mat4m0 added a commit that referenced this pull request Nov 4, 2026
## What changed

- New workflow `Retry runner shortages`
(`.github/workflows/retry-runner-shortage.yml`). When an Application
verification, client canary or client recertification run fails, it
checks why. If every failed or cancelled job was either cancelled with
"not acquired by Runner" or is the `verify / verify` gate that fails as
a result, it reruns the failed jobs. It stops after three attempts in
all.
- A short note under "GitHub enforcement" in
`docs/development-workflow.md`.

## Why

GitHub's macOS arm64 pool is short of machines. A job that waits too
long is cancelled, and `verify / verify` turns red although no test ran.
Since Nov 1 this has hit #539 (three manual reruns), #544, #537, #541,
both main runs (d6d046f, 70cb19f) and the client recertification.
Every case needed a manual `gh run rerun --failed`.

## Safety

- It never reruns a real failure. A failed test, a failed audit, a
failed install, or a cancellation for another reason (such as a newer
push) stops the retry.
- It reads job results and annotations only. It does not check out or
run PR code, so fork PRs are safe. Its permissions are `actions: write`
and `checks: read`.
- Versioned release is not covered; a release rerun stays a manual
decision.

## Verification

- `actionlint` passes. `pnpm test:policy` passes (188 tests).
- The run script was replayed against real runs from today, with the
rerun call replaced by an echo:

| Run | Situation | Result |
|---|---|---|
| 41663036291 (#544) | 3 jobs not acquired | rerun |
| 41622716010 (recertification) | derive not acquired | rerun |
| 41634472759 (#537) | 3 jobs not acquired | rerun |
| 41631535647 (#537) | audit + Electron shard failed | no rerun |
| 41612162024 (#537) | cancelled by a newer push | no rerun |
| 41643011855 (Dependabot) | install failed | no rerun |
| 41635280475 (#540) | audit failed + 1 not acquired | no rerun |
| invalid run ID | API 404 | step fails |

- Not verifiable before merge: a `workflow_run` workflow runs only from
the default branch. The first real shortage after merge is the live
test. If GitHub does not trigger `workflow_run` for a rerun started by
the workflow token, the limit is effectively two attempts instead of
three.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@Mat4m0 Mat4m0 changed the title feat(launcher): add Help page and one launcher design system feat(launcher): add Help, News and the player Guide on one launcher design system Nov 4, 2026
@Mat4m0
Mat4m0 enabled auto-merge (squash) November 4, 2026 14:26
Comment thread src/main/core/launcher-news.ts Fixed
…ands

Wiki news dropped only complete tags, so a tag that continues on the next
line, or an HTML comment over several lines, left markup in the article
text (CodeQL: incomplete multi-character sanitization). Comments are now
removed before the split, and an unclosed tag is dropped to the line end.

The built-preload release test did not call feedback.send or
external.openUrl, so it failed once the audit step passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread src/main/core/launcher-news.ts Fixed
…f the page

CodeQL flagged that an unclosed <!-- could stay in the news text.
MediaWiki hides everything after such a comment, so the launcher does too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Mat4m0
Mat4m0 merged commit 1476b1e into main Nov 5, 2026
42 of 54 checks passed
@Mat4m0
Mat4m0 deleted the feat/launcher-help-page branch November 5, 2026 08:04
Mat4m0 added a commit that referenced this pull request Nov 5, 2026
…lectron download in CI (#546)

## Why

Main went red after #537 (run 41991775466):
`tests/electron/multiple-accounts.spec.ts:180` looked up the Play button
by substring, and a live news row ("GWonMac 2026.8.8 …") matched too.
Every Electron test launch fetched the real news feed, so role lookups
depended on the latest release notes and on network timing. Separately,
the website moved to gwonmac.com and the app still pointed at the old
vercel.app address.

## What changes

- **Tests stay off live news.** `tests/electron/fixtures.mts` starts
Electron with `--host-resolver-rules` that fail DNS for the two news
hosts (derived from `PROJECT_NEWS_URL` and `WIKI_UPDATES_URL`).
`app.spec.ts` uses the same switch; `live.spec.ts` stays online on
purpose. The launcher shell test asserts news ends `offline` with no
stories, so a new unblocked news host fails every run instead of some.
- **Play lookup is exact**, like
`tests/helpers/packaged-enhancement-fixture.ts`.
- **www.gwonmac.com everywhere.** `gwonmac.com` redirects to
`www.gwonmac.com`, and the app compares origins exactly, so the news
feed URL, the trusted link origin, the Guide's website links and the
website's canonical URL use `https://www.gwonmac.com`. No `vercel.app`
remains in the repository.
- **Feed links are relative.** Released 2026.10 betas fetch the feed
from the old address and trust only that origin; `/blog/<slug>` resolves
against whichever address the app used, so their news keeps working.
- **Electron download retries.** The first run of this PR failed in
`pnpm install`: GitHub answered 504 for
`electron-v43.8.6-darwin-arm64.zip` (run 41998706328, electron (2)).
`postinstall` now runs `scripts/install-electron.mjs`, which retries
Electron's own `install-electron` twice (10 s, 30 s) and still fails on
a lasting outage. It covers every workflow that installs.
- **Less Electron downloading in CI.** The second run hit 504s for over
40 s on `hub-e2e (2)` (run 41999227783). The Hub suite runs in Chromium
and never starts Electron, so its install skips the binary
(`ELECTRON_SKIP_BINARY_DOWNLOAD=1`, honoured by the postinstall because
Electron 43's installer dropped it). Mac jobs in `macos-verify.yml`
cache `~/Library/Caches/electron` per locked Electron version. Retries
wait 10, 30 and 60 s.

## Checks

- Local: typecheck, eslint, `check:links`, `check:launcher-news`,
launcher-ui vitest (93), `tests/unit/launcher-news.test.ts`,
`tests/unit/no-game-traffic-is-uploaded.test.ts`,
`tests/release/launcher-preload-behaviour.test.ts` (12).
- `pnpm install --frozen-lockfile` and `pnpm run postinstall` with
Electron present: no-op, exit 0. A fake always-failing
`install-electron` gives 3 attempts, then its exit code.
- `pnpm test:policy` (190, includes action pinning);
`ELECTRON_SKIP_BINARY_DOWNLOAD=1` exits 0 without calling the installer.
- Electron suites run in CI only. Run 41999227783 already passed both
Electron shards with the news host block.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Mat4m0 added a commit that referenced this pull request Nov 5, 2026
Prepare `2026.11.0-beta.1` from green main commit
`9c2c107bb68c42b02023cb6951c91ae13963ba73`. This changes only the
application version and targets the new planned release branch
`release/2026.11.0`.

Includes everything merged on main up to #541: the launcher Help, News
and player Guide (#537), released Stable notes backfill (#538),
held-modifier release (#535), the www.gwonmac.com move with offline
Electron test news and CI download hardening (#546), and Build Library
template import/export (#541). No features are added during release
preparation.

Validation: `pnpm run check` passed for this version change (unit 1918,
policy 190, tools 283, launcher 93). Full main Application verification
passed, including package:
https://github.com/Mat4m0/gwonmac/actions/runs/42005431996. Require this
PR and the release branch commit to pass Application verification before
signing.

Versioned release (`dry_run=false`) runs only on Matthias's explicit
request. Exact signed-draft live QA remains required before publication.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants