diff --git a/docs/plans/2026-08-14-launcher-campaign.md b/docs/plans/2026-08-14-launcher-campaign.md index 1a104e65..ecb3620b 100644 --- a/docs/plans/2026-08-14-launcher-campaign.md +++ b/docs/plans/2026-08-14-launcher-campaign.md @@ -51,6 +51,32 @@ Parallelism guide: LA3/LA4 (launcher side) proceed alongside LA5–LA8 (client side) — different assemblies, no shared files. LA9/LA10 close the launcher side; LA11 closes the campaign. +## Linux posture (binding — user decision 2026-08-14) + +Everything the launcher does must WORK ON LINUX in this campaign, except +GUI client launches: the Linux graphical client is Slice L, parked at L1, +resuming later ("ok we will do it later"). Concretely: + +- **Linux-shipping in LA:** the Avalonia launcher UI, profile CRUD + + 0600-permission file, installer (manual DAT picker — the auto-detect + paths are Windows-only; `acdream-bake` is GL-free and runs on Linux), + updater (staged swap; Linux can replace a running binary but keep the + same staged-atomic flow), headless launches with plugins + login + commands, and the character probe. +- **Launcher UX on Linux:** the `gui` / `guiSelect` launch modes render + disabled with an explicit "requires the Linux graphical client (Slice + L)" note — never a silent failure. +- **Per-slice enforcement:** every slice touching Launcher.Core, Headless, + Runtime, Bake, or Platform runs its test projects on Linux (native + Ubuntu or WSL, matching the K-slice practice) before the slice is DONE; + LA4/LA9/LA10 additionally prove a real `linux-x64` self-contained + publish. LA11's connected-gate script gets a Linux section: launcher on + Ubuntu doing CRUD, probe, headless launch with plugin + login commands, + first-run install with a manual DAT path, and an update swap. +- When Slice L later ships, the launcher's Linux GUI modes light up with + NO launcher changes (the session-config contract is host-agnostic) — + that expectation is part of LA's design acceptance. + ## LA0 — `AcDream.Platform` extraction New BCL-only project `src/AcDream.Platform/` holding `ApplicationPathSet` + diff --git a/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md b/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md index 162778ff..a68527c5 100644 --- a/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md +++ b/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md @@ -45,6 +45,7 @@ Decided this session (2026-08-14): | Launcher ↔ client coupling | **Approach A: file-contract orchestrator** (config in, status events out; no game-protocol code in the launcher) | | Update feed | **GitHub Releases** (manifest.json + per-RID zips as release assets) | | Profile editing | **Full CRUD in the launcher UI** — add/edit/remove servers, accounts, passwords, per-character settings. The JSON file is storage (hand-editable as a bonus), never the required interface | +| Linux scope | **Full launcher stack Linux-tested in LA** (launcher UI, install/update, headless + plugins + probe); GUI launches stay Windows-only until Slice L resumes later (user 2026-08-14). Launcher disables GUI modes on Linux with an explicit note | | Character enumeration | **On-demand probe**: launcher spawns the headless host in a probe mode (connect → `CharacterList` → status event → graceful disconnect BEFORE entering world → exit) and folds the roster into the profile store | Rejected: the launcher itself embedding Runtime/Core.Net to speak the