Skip to content

WPF cutover — sole shipping app is WinRestoreKit (0.1.0) - #13

Merged
nicolasestrem merged 1 commit into
mainfrom
release/0.1.0
Aug 11, 2026
Merged

nicolasestrem merged 1 commit into
mainfrom
release/0.1.0

Conversation

@nicolasestrem

Copy link
Copy Markdown
Owner

What

Completes Stage 5 of the Timeline+Compare WPF migration: the WPF shell becomes the only shipping WinRestoreKit application, all WinForms is removed, and the release artifact is one self-contained WinRestoreKit.exe.

This is the entire remaining gap from the plan review — Stages 1–4 (Foundation Application layer, Timeline, Compare/Confirm/Restore, Backup/Progress/Results) were already complete with no stubs.

Changes

Cutover (no compatibility shims):

  • src/WinRestoreKit is now the WPF app (AssemblyName WinRestoreKit, UseWPF, GenerateAssemblyInfo=false). Shell keeps its WinRestoreKit.Wpf C# namespace; only the assembly/exe identity is WinRestoreKit.
  • Moved App/MainWindow/Views/ViewModels/Services/Themes from src/WinRestoreKit.Wpf into src/WinRestoreKit.
  • Deleted the entire WinForms shell (MainForm, Program, Views/, Forms/, Controls/, WinForms Helpers/, Resources.*, WinForms-only fonts). Preserved load-bearing shared assets at their paths.
  • Removed the src/WinRestoreKit.Wpf project; solution is now four projects.
  • Repointed five pack URIs and dropped redundant InternalsVisibleTo.

Safety net restored: DescribeStartupFailure → neutral StartupDiagnostics; App.OnStartup wraps construction in try/catch (visible message, not silent crash).

Tests (985 pass, 0 fail): deleted WinForms-only tests covered by WPF STA tests; ported LogHelperTests to a neutral sink; repointed assembly anchors.

Version + docs: bumped to 0.1.0; updated CLAUDE.md.

Verification

  • dotnet build (Release): 0 warnings, 0 errors
  • dotnet test (Release): 985 passed, 0 failed
  • dotnet publish: exactly one WinRestoreKit.exe (~68.8 MB, self-contained)
  • Real-desktop smoke test: published exe launches, MainWindowTitle = "WinRestoreKit", WPF shell renders Timeline + navigation + dark theme

Completes Stage 5 of the Timeline+Compare WPF migration: the WPF shell
becomes the only shipping WinRestoreKit application, all WinForms is
removed, and the release artifact is one self-contained WinRestoreKit.exe.

Cutover (no compatibility shims):
- src/WinRestoreKit is now the WPF app (AssemblyName WinRestoreKit,
  UseWPF, GenerateAssemblyInfo=false). Shell keeps its WinRestoreKit.Wpf
  C# namespace; only the assembly/exe identity is WinRestoreKit.
- Moved App/MainWindow/Views/ViewModels/Services/Themes/Resources/
  Navigation/Infrastructure from src/WinRestoreKit.Wpf into src/WinRestoreKit.
- Deleted the entire WinForms shell: MainForm, Program, Views/, Forms/,
  Controls/, WinForms Helpers/, Resources.*, and WinForms-only fonts.
  Preserved the load-bearing shared assets at their paths: app.manifest,
  WinRestoreKit.ico, Properties/AssemblyInfo.cs, IBMPlexMono-Regular.ttf.
- Removed the src/WinRestoreKit.Wpf project; solution now has four projects
  (WinRestoreKit WPF, Core, Application, Tests).
- Repointed the five /WinRestoreKit.Wpf;component/ pack URIs to
  /WinRestoreKit;component/ (themes, templates).
- Dropped redundant InternalsVisibleTo("WinRestoreKit.Wpf") from Core and
  Application (the renamed app is covered by the existing "WinRestoreKit").

Safety net restored for the new shell:
- Relocated DescribeStartupFailure to the neutral Application layer
  (StartupDiagnostics). App.OnStartup now wraps shell construction in a
  try/catch that shows the diagnostic and rethrows, preserving the Phase 2c
  guarantee that a construction-time failure is a visible message, not a
  silent WER tear-down.

Test triage (985 pass, 0 fail):
- Deleted WinForms-only tests (MainForm/ProgressPageView/BackupPageView/
  HomePageView/HistoryPageView/FontLoader/NavigationService/ShellLayout/
  RestoreDialogOwner); their contracts are covered by the WPF STA tests.
- Deleted CompressedDriftPayloadTests + HomePageViewDriftTests (reflected
  the deleted HomePageView.DetectDrift); compressed-payload drift + scope
  disposal is covered by SnapshotPayloadPreparationServiceTests,
  SnapshotComparisonServiceTests, and BackupPayloadTests.
- Ported LogHelperTests to a neutral ILogSink capture (drops the RichTextBox
  dependency; keeps the load-bearing format-string-hazard coverage).
- Repointed typeof(MainForm/Program).Assembly anchors to
  typeof(WinRestoreKit.Wpf.App).Assembly; removed one WinForms close-rule
  fact and two stale `using Views;` imports.

Version + docs:
- Bumped AssemblyVersion/AssemblyFileVersion to 0.1.0 (three-part) in the
  canonical AssemblyInfo.cs; updated RebrandIdentity expected version.
- CLAUDE.md updated to describe the WPF app, the four-project layout, and
  the relocated seams/startup guard.

Verified: Release build 0 warnings/0 errors; 985/985 tests pass; published
artifact is a single 68.8 MB self-contained WinRestoreKit.exe that launches
and renders the WPF shell (Timeline, navigation, dark theme) on a real
Windows desktop.
@nicolasestrem
nicolasestrem merged commit 176eef6 into main Aug 11, 2026
1 check passed
@nicolasestrem
nicolasestrem deleted the release/0.1.0 branch August 11, 2026 12:27
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.

1 participant