feat(welcome): SilverOS Welcome first-logon wizard (flavour engine + apply orchestrator + MAUI UI + image bake) #4
Reference in New Issue
Block a user
Delete Branch "feat/welcome-app"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements the SilverOS Welcome app — a first-logon Blazor Hybrid (.NET MAUI) wizard that lets the user pick a device flavour, create a least-privilege account + BitLocker PIN, and have the device configure itself by orchestrating the existing §A–H PowerShell hardening modules. Per the plan in
windows/welcome-app-plan.md(16 tasks, 5 TDD phases). Tasks 1–15 are complete and reviewed; Task 16 (full VM e2e) is the remaining operational milestone and is what this PR's CI run begins to enable.What's here
windows/welcome/src/SilverOS.Welcome.Core, net9.0-windows) — flavour manifest model + loader/validator;IProcessRunnerseam; Account/BitLocker/Bootstrap services (mockable);ApplyServiceorchestrator (modules → accounts → BitLocker → bootstrap teardown, teardown only on success).windows/flavours/*.json): Daily-Driver (default), Privacy-Max, Journalist, Developer.SilverOS.Welcome.App) — Welcome→Flavour→Account→Prefs→Apply→Done; real account validation; live progress; failure surfacing + Retry; offline-bundled Mercury theme (no CDN).autounattend.xmlephemeralsm-bootstrapadmin + one-time AutoLogon launching the app;SetupComplete.cmddefers hardening to the app when present;build.ps1publishes (win-x64, self-contained) + bakes the app + flavours intoinstall.wim, and fails the build if the payload isn't baked;Invoke-Hardening.ps1gains-Modules/-ParamsJson.build-iso-windows.yamlpins the .NET 9 SDK (setup-dotnet), installs the MAUI workload, and runsdotnet test …sln -c Releasebefore the ISO build;Assert-IsoStructure.ps1now asserts the baked Welcome exe + ≥1 flavour.Quality
Invoke-Hardening.ps1against harmless dummy modules to lock the module-subset arg contract.-Modules '00','01'encoding was silently dropping all hardening on a real apply (mocks couldn't see it) → fixed to a robust CSV-split contract + guarded by the integration test.Test Plan
dotnet test windows/welcome/SilverOS.Welcome.sln— 17/17 green (built locally on ARM64 dev box; CI builds win-x64).dotnet test -c Release, ISO build withbuild.ps1publish+bake,Assert-IsoStructure.ps1payload assertions.SilverOS Adminexists and IS;sm-bootstrapgone + AutoAdminLogon=0; module subset ran; verify report present.Known follow-ups (out of this PR's scope, noted in final review)
LogonCount=1failure path: a reboot after a failed apply won't auto-relaunch the wizard (FirstLogonCommands is first-logon-only); in-app Retry is the recovery path. Consider a persistent relaunch + per-device bootstrap credential before shipping.🤖 Generated with Claude Code