Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ src/packages/

# Release artifact directory used by the /release skill (a ~69 MB self-contained exe).
publish/
# WPF and UI test publish directories (self-contained executables, ~70 MB each).
publish-*/

# dotnet test output: .trx logs, and the crash/hang dumps --blame-hang writes, which run to
# hundreds of megabytes each.
Expand Down
47 changes: 41 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,47 @@ version numbers, because that is what those releases were called.

## [Unreleased]

### Added — WPF Timeline + Compare shell (side-by-side with WinForms)

A new WPF application (`WinRestoreKit.Wpf`) ships alongside the existing WinForms app, implementing the
approved Timeline + Comparison Workspace design direction. It does not replace WinForms yet; both run
from the same solution and share the same Core engine and Application layer.

**Timeline is the home experience.** Every snapshot and failed attempt on this PC appears as a card on a
point-in-time rail, newest first. Selecting a verified snapshot opens comparison; failed and unreadable
entries open their diagnostic reason. Arrow keys navigate the list and every custom visual exposes UI
Automation names, roles, and states.

**Compare shows evidence before restore.** Selecting a snapshot compares each module against the current
PC and reports honest state: captured, not captured, or changed. You build a restore set by selecting
whole modules, then move to a Confirm stage that reviews impact, warnings, and application-close
consent before any restore starts.

**Backup, Progress, and Results are migrated.** The backup workspace offers scope presets, destination,
compression, and validation. Progress shows stage, percent, throughput, byte counts, errors, warnings,
and a live log. Results present a severity summary with per-module outcomes.

**Visual system.** Neutral Windows surfaces, one mineral-blue action colour, one restrained coral
warning, Light/Dark/Follow-system themes, Segoe UI Variable typography, IBM Plex Mono for technical
identifiers, 6–10 px corner radii, flat panes, and visible keyboard focus throughout. Raw icon-enum
text (e.g. `ErrorCircle`) was eliminated at its source: status glyphs are vector paths keyed by tone,
never text.

**Application layer extraction.** Orchestration, backup presets, scope groups, run UI, snapshot
services, and update/theme services moved from the WinForms project into a new
`WinRestoreKit.Application` library shared by both shells. Core remains unchanged in its isolation
guarantee: no WinForms or WPF dependency can compile against it.

### Fixed — WPF crashes on snapshot creation and About navigation

Two read-only property bindings in the redesigned WPF views caused `InvalidOperationException` crashes:

- **About page** bound `Run.Text` to the read-only `CurrentVersion` property (TwoWay by default).
- **Progress view** bound `ProgressBar.Value` to the read-only `Percent` property (TwoWay by default).

Both are fixed with `Mode=OneWay`. Regression tests render each view through the layout dispatcher to
prove the crash path no longer fires.

### Design

- Started a three-direction visual identity and WinUI 3 Home-screen exploration around the
Expand All @@ -17,12 +58,6 @@ version numbers, because that is what those releases were called.
calmer spacing. Logo exploration remains unselected and no runtime or backup-format behavior has
changed.

### Changed

- Rebuilt the app shell and all primary views with the Industry design system: bundled Barlow, Barlow Condensed, and IBM Plex Mono typography; Voltage, Flux, and Follow system palettes; blueprint frames; icon rail navigation; and a dedicated progress view.
- Added snapshot display names, selectable destination folders, Fast and Max archive compression, archive-backed restore discovery, live registry drift detection, rich backup progress metrics, and safe pause or cancel controls.
- Reworked backup, restore, History, Home, and About around real manifest and module data. Existing backup folders and frozen manifest keys remain compatible.

## [0.0.1] - 2026-08-02
### Changed

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Output lands in `src\WinRestoreKit\bin\<Configuration>\net8.0-windows\`. This de

Releases are different: they ship **self-contained single-file**, so end users install nothing. The `/release` skill has the exact publish command and the flags it depends on - all of them matter, and the artifact must come out as exactly one ~69 MB `WinRestoreKit.exe`. Never ship the framework-dependent `bin\Release\` exe; on its own it cannot start. Do not add `PublishTrimmed` - WinForms resolves types by reflection and is not trim-safe.

The only runtime NuGet dependency is Newtonsoft.Json, declared as a `<PackageReference>` in both the app and Core projects at the same version (`packages.config` is gone). Tests are xUnit, in `src/WinRestoreKit.Tests`. There is no linter.
The only runtime NuGet dependency is Newtonsoft.Json, declared as a `<PackageReference>` in the app, Application, and Core projects at the same version (`packages.config` is gone). Tests are xUnit, in `src/WinRestoreKit.Tests`. There is no linter.

`src/WinRestoreKit/Properties/AssemblyInfo.cs` is hand-maintained and the **app** `WinRestoreKit.csproj` sets `<GenerateAssemblyInfo>false</GenerateAssemblyInfo>` - this is load-bearing for the update checker (see "Data flow and paths"). It must not move to Core: the file must stay at its exact path with its exact line format because it is the update checker's raw fallback source. `WinRestoreKit.Core.csproj` leaves `GenerateAssemblyInfo` at its default on purpose, since no client fetches anything from it and the generated `SupportedOSPlatform` attribute is what keeps CA1416 honest there. Never set `Version`/`AssemblyVersion`/`FileVersion`/`InformationalVersion` in the csproj, and never add an `AssemblyInformationalVersion` attribute; both would create a second, silently diverging version source. The csproj carries comments explaining this and…

Expand Down
Loading
Loading