Files
LanMountainDesktop/.trae/specs/launcher-upgrade/spec.md
lincube 9224c9a33a Harden OOBE, launch-source and elevation flow
Introduce a per-user OOBE state model and hardened launch/elevation handling. Adds OobeStateFile/OobeLaunchDecision models, OobeStateService (persisting %LOCALAPPDATA%/.launcher/state/oobe-state.json), and LauncherExecutionContext to capture elevation and user SID. CommandContext now normalizes/infers launch-source values (normal, postinstall, apply-update, plugin-install, debug-preview) and exposes maintenance checks. LauncherFlowCoordinator propagates richer launcher context details for diagnostics and suppresses OOBE for elevated/maintenance contexts. PluginInstallerService avoids requesting elevation for user-scoped installs and returns a clear error when installation target is outside the current user's LocalAppData. LauncherClient maps and surfaces result codes, UpdateWorkflow and installer invocation now pass explicit --launch-source values, and WelcomeOobeStep persists OOBE completion via the new service. Adds unit tests (CommandContext, OobeStateService, PluginInstallerService), docs/specs/checklists for the contract, and makes internals visible to tests.
2026-04-22 09:25:22 +08:00

61 lines
1.6 KiB
Markdown

# Launcher Upgrade Spec
## Goal
Upgrade `LanMountainDesktop.Launcher` into the unified Launcher for:
- OOBE first-run entry
- startup splash window
- silent/incremental/rollback update
- plugin install/update
## Scope (Phase 1)
- Avalonia GUI launcher with two windows:
- `OOBEWindow` (first run only)
- `SplashWindow` (every launch)
- Default command `launch`
- CLI commands:
- `update check|download|apply|rollback`
- `plugin install|update`
- Legacy compatibility:
- `--source --plugins-dir --result` still works for plugin install
## Update Behavior
- ClassIsland-style deployment folders:
- `app-<version>-<number>/`
- marker files `.current`, `.partial`, `.destroy`
- Signed file map:
- `files.json`
- `files.json.sig`
- `public-key.pem`
- Incremental update:
- `replace` from archive
- `reuse` from current deployment
- `delete` skip file in target deployment
- Rollback:
- snapshot metadata is written before apply
- automatic rollback on apply failure
- manual rollback via command
## OOBE and Splash
- OOBE is independent from splash.
- OOBE shows only:
- welcome text: `欢迎使用阑山桌面`
- arrow button for continue
- Splash shows only:
- app name: `阑山桌面`
## Extensibility
- `IOobeStep` for future multi-step OOBE
- `ISplashStageReporter` for future startup progress visualization
## Compatibility Addendum
- The current production OOBE state format is a per-user JSON file at `%LOCALAPPDATA%\LanMountainDesktop\.launcher\state\oobe-state.json`.
- `first_run_completed` remains legacy compatibility data only.
- Same-user reinstall or upgrade should not re-enter OOBE.