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

1.6 KiB

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.