Skip to content
This repository was archived by the owner on Jul 12, 2026. It is now read-only.

Release 1.1.1.0#26

Merged
dary1337 merged 28 commits into
masterfrom
release/1.1.1.0
Jul 11, 2026
Merged

Release 1.1.1.0#26
dary1337 merged 28 commits into
masterfrom
release/1.1.1.0

Conversation

@dary1337

@dary1337 dary1337 commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features
    • Added automatic WARNO version switching through Steam, including progress, cancellation, and recovery messaging.
    • Improved build selection with clearer readiness/upgrade/downgrade/manual-install flows.
    • Added a “Meet Yuri’s WARNO Toolkit” prompt and updated links to the successor product.
  • UI/Visual Updates
    • Refreshed the app’s Material 3 look and updated the final-release sunset banner.
  • Bug Fixes / Improvements
    • On first run, the installer cleans up legacy settings and removes previous leftover folders, leaving only the mod plus a temporary log file.

dary1337 and others added 21 commits June 7, 2026 20:06
refactor: migrate UI to Material3.WinForms library
@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

The release replaces legacy custom WinForms infrastructure with Material3.WinForms, adds automated Steam WARNO version switching with rollback, removes local executable/catalog persistence, cleans legacy settings on startup, and marks YSM Installer as superseded by Yuri’s WARNO Toolkit.

Changes

Material3 UI shell and project wiring

Layer / File(s) Summary
Material3 migration and application shell
src/YSMInstaller.csproj, src/UI/Tokens.cs, src/Properties/Program.cs, src/Forms/Form1.Layout.cs, src/Controls/Material/MaterialRadioCard.cs, src/Forms/Form1.Installation.cs
Material3.WinForms references, startup theme initialization, shared token aliases, card rendering, layout, dialogs, and installation screens are migrated to Material3 APIs. Legacy custom controls and rendering helpers are removed from the project.
Supporting form and message integration
src/Forms/Form1.cs, src/Forms/Form1.Dev.cs, src/Forms/Form1.Scan.cs, src/Forms/SettingsForm.cs, src/UI/UserMessages.cs, src/UI/BuildIcons.cs, src/Utilities/UpdateService.cs
Forms, developer scenarios, scan states, settings, messages, icons, and update dialogs use Material3 colors, controls, and message-box APIs.

Build selection and Steam branch switching

Layer / File(s) Summary
Build option model and selection flow
src/Forms/Form1.BuildSelect.cs
Build choices now carry readiness, switch direction, target version, and manual-install metadata; cards are grouped by readiness and route non-ready selections into a version-switch plan.
Steam manifest switching and rollback
src/Utilities/AcfKeyValues.cs, src/Warno/SteamVersionSwitcher.cs, src/Forms/Form1.cs, src/Forms/Form1.Installation.cs
Steam KeyValues manifests are parsed, updated atomically, polled for branch installation, and restored on cancellation or failure. The form renders switching progress and confirms close requests while switching.

Final-release cleanup and documentation

Layer / File(s) Summary
Release messaging and local-state cleanup
README.md, src/UI/AppLinks.cs, src/Properties/AssemblyInfo.cs, src/Utilities/LegacySettingsCleanup.cs, src/Warno/ModCatalogSettings.cs, src/Warno/WarnoFinder.cs
The release points to the successor toolkit, bumps assembly version to 1.1.1.0, deletes the legacy local settings folder on startup, and makes catalog and executable discovery session-scoped.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested labels: security, install-flow, ui-state, needs-tests

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the primary change: a versioned release update to 1.1.1.0.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/1.1.1.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@dary1337

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/Forms/Form1.Installation.cs (1)

364-418: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Cap the action-card subtitle width src/Forms/Form1.Installation.cs:364-418grid puts textStack in a Percent(100) column with no wrap cap. Mirror BuildMessageCard and set MaximumSize on the subtitle label so long switch descriptions don’t blow out the card.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Forms/Form1.Installation.cs` around lines 364 - 418, Update
BuildActionCard so the subtitle Label added to textStack has a MaximumSize
matching the width cap used by BuildMessageCard. Preserve the existing title and
button layout while ensuring long switch descriptions wrap within the action
card instead of expanding the card.

Source: Path instructions

src/Utilities/UpdateService.cs (1)

94-118: 🔒 Security & Privacy | 🔴 Critical | 🏗️ Heavy lift

Auto-update path executes an unverified downloaded binary.

FetchLatestReleaseAsync/IsSafeDownloadUrl only enforce HTTPS transport; DownloadAndRestartAsync then copies tempExePath over the running installer and relaunches it with no hash or signature check against the downloaded payload. A compromised release asset or GitHub account takeover gets silent code execution on every user who accepts the update prompt.

Pin a checksum/signature (e.g. publish a SHA-256 or code-signing cert alongside the release asset) and verify it before Process.Start launches the updater script.

As per path instructions for src/Utilities/UpdateService.cs: "the downloaded payload is hash/signature-verified before execution."

Also applies to: 162-191

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Utilities/UpdateService.cs` around lines 94 - 118, Require downloaded
update payloads to be cryptographically verified before execution: extend
FetchLatestReleaseAsync to obtain the expected SHA-256 checksum or trusted
code-signing certificate associated with the release, then have
DownloadAndRestartAsync validate tempExePath against it before copying or
launching the updater. Reject and clean up any payload that fails verification,
and preserve Process.Start only for successfully verified binaries.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/Forms/Form1.BuildSelect.cs`:
- Around line 43-44: Update the identifier comparisons in the release filtering
logic around _supportedVersions and the code at the additional referenced
location to use string.Equals with StringComparison.Ordinal instead of ==. Apply
this consistently to identifier, path, and key comparisons in
Form1.BuildSelect.cs while preserving the existing selection behavior.

In `@src/Forms/Form1.Dev.cs`:
- Around line 382-390: Update DevRunInstall so the StartInstallAsync invocation
is executed through the existing SafeFireDev wrapper, preserving the selected
target and version arguments while ensuring asynchronous failures are caught and
reported via the established AppLogger.Critical path.

In `@src/Forms/Form1.Layout.cs`:
- Around line 180-188: Remove the icon.Disposed handler that disposes icon.Image
in the icon construction block, leaving the cached bitmap from
MaterialIconRenderer.Get untouched. Follow the existing ownership pattern used
by badgeIcon.Image, while retaining disposal only for freshly allocated images
such as those returned by BuildSuccessBadge.

In `@src/Utilities/AcfKeyValues.cs`:
- Around line 110-120: Update the key comparison in AcfKeyValues.FindChild to
use StringComparison.Ordinal instead of StringComparison.OrdinalIgnoreCase,
ensuring only an exact-case manifest key is matched while preserving the
existing child traversal and null behavior.
- Around line 95-100: Update the escape-handling branch in the parser around the
backslash logic to preserve unrecognized escape sequences, including the leading
backslash, so Serialize() can reproduce them unchanged. Continue decoding the
recognized \n and \t sequences, while retaining the existing handling for
supported escapes such as \\ and \".

In `@src/Utilities/IniFile.cs`:
- Around line 81-82: The comment near the atomic write logic in IniFile should
accurately describe that WriteAllLines writes to path + ".tmp" before
replacement. Remove the claim that File.Replace is NTFS-journal-atomic and use a
concise plain explanation of the temporary-file-then-replace flow.

In `@src/Warno/SteamVersionSwitcher.cs`:
- Around line 64-71: Update ReadCurrentBranch and ReadMountedBranch to return an
explicit success/failure result instead of using an empty branch string as the
error sentinel. In the initial switch flow, abort when reading the original
branch fails; during rollback or mounted-branch handling, treat an unknown
mounted branch as requiring StateFlagsNeedsUpdate so it cannot be mistaken for
the valid public branch.
- Around line 205-250: Update the manifest polling logic around
AcfKeyValues.Parse and the snapshot stall guard so failed reads do not replace
the last valid snapshot with an empty value or reset lastChange. Track whether
the current read produced a valid snapshot, preserving the prior snapshot on
transient IOException/FormatException retries; ensure FileNotFoundException is
not swallowed and propagates to the caller.
- Around line 183-195: Update LaunchSteam to propagate failures after logging
the exception instead of swallowing them, so callers can stop the normal switch
wait and report rollback failure when Steam does not launch. Preserve the
existing Steam executable selection and AppLogger.Error call, and ensure the
exception reaches the methods that invoke LaunchSteam.

---

Outside diff comments:
In `@src/Forms/Form1.Installation.cs`:
- Around line 364-418: Update BuildActionCard so the subtitle Label added to
textStack has a MaximumSize matching the width cap used by BuildMessageCard.
Preserve the existing title and button layout while ensuring long switch
descriptions wrap within the action card instead of expanding the card.

In `@src/Utilities/UpdateService.cs`:
- Around line 94-118: Require downloaded update payloads to be cryptographically
verified before execution: extend FetchLatestReleaseAsync to obtain the expected
SHA-256 checksum or trusted code-signing certificate associated with the
release, then have DownloadAndRestartAsync validate tempExePath against it
before copying or launching the updater. Reject and clean up any payload that
fails verification, and preserve Process.Start only for successfully verified
binaries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 813b29fe-b2fa-4bda-be5f-d32de91eb751

📥 Commits

Reviewing files that changed from the base of the PR and between 95e3f4e and 9464819.

⛔ Files ignored due to path filters (45)
  • src/Forms/Form1.Designer.cs is excluded by !**/*.designer.cs, !**/*.Designer.cs
  • src/Forms/StepsForm.Designer.cs is excluded by !**/*.designer.cs, !**/*.Designer.cs
  • src/Forms/StepsForm.resx is excluded by !**/*.resx
  • src/Properties/Resources.Designer.cs is excluded by !**/*.designer.cs, !**/*.Designer.cs
  • src/Properties/Resources.resx is excluded by !**/*.resx
  • src/Properties/Settings.Designer.cs is excluded by !**/*.designer.cs, !**/*.Designer.cs
  • src/Resources/Screenshot 2025-03-02 182641.png is excluded by !**/*.png, !**/Resources/**
  • src/Resources/Screenshot 2025-03-02 182659.png is excluded by !**/*.png, !**/Resources/**
  • src/Resources/Screenshot 2025-03-02 182718.png is excluded by !**/*.png, !**/Resources/**
  • src/Resources/Screenshot 2025-03-02 182724.png is excluded by !**/*.png, !**/Resources/**
  • src/Resources/icons/arrow_drop_down.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/arrow_forward.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/check.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/check_circle.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/check_circle_filled.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/check_filled.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/close.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/cloud.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/deployed_code.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/download.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/error.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/error_filled.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/expand_more.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/folder.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/folder_open.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/help.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/help_outline.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/info.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/info_filled.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/layers.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/minimize.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/open_in_new.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/play_arrow.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/play_arrow_filled.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/radio_button_checked.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/radio_button_unchecked.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/refresh.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/search_off.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/settings.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/tips_and_updates.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/travel_explore.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/videogame_asset.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/warning.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/warning_filled.svg is excluded by !**/*.svg, !**/Resources/**
  • src/Resources/icons/ysm.png is excluded by !**/*.png, !**/Resources/**
📒 Files selected for processing (62)
  • README.md
  • src/Controls/Material/MaterialButton.cs
  • src/Controls/Material/MaterialCard.cs
  • src/Controls/Material/MaterialOptionCard.cs
  • src/Controls/Material/MaterialProgressBar.cs
  • src/Controls/Material/MaterialRadioCard.cs
  • src/Controls/Material/MaterialScrollPanel.cs
  • src/Controls/Material/MaterialTitleBar.cs
  • src/Controls/Material/SkeletonCard.cs
  • src/Controls/Material/SoftLabel.cs
  • src/Controls/Material/StepChecklist.cs
  • src/Controls/Rounded/RoundedButton.cs
  • src/Controls/Rounded/RoundedControls.cs
  • src/Controls/Rounded/RoundedPanel.cs
  • src/Controls/Ui/DropdownSelect.cs
  • src/Forms/BorderlessForm.cs
  • src/Forms/Form1.BuildSelect.cs
  • src/Forms/Form1.Dev.cs
  • src/Forms/Form1.Installation.cs
  • src/Forms/Form1.Layout.cs
  • src/Forms/Form1.ManualInstall.cs
  • src/Forms/Form1.Scan.cs
  • src/Forms/Form1.cs
  • src/Forms/MaterialDialog.cs
  • src/Forms/SettingsForm.cs
  • src/Forms/StepsForm.cs
  • src/Models/ModMetadata.cs
  • src/Properties/AssemblyInfo.cs
  • src/Properties/Program.cs
  • src/Properties/Settings.settings
  • src/UI/AppLinks.cs
  • src/UI/BuildIcons.cs
  • src/UI/FormAnimation.cs
  • src/UI/FormDragAnywhere.cs
  • src/UI/MaterialIconRenderer.cs
  • src/UI/MaterialIcons.cs
  • src/UI/MaterialPalette.cs
  • src/UI/MaterialType.cs
  • src/UI/Sizes.cs
  • src/UI/TaskbarProgress.cs
  • src/UI/Tokens.cs
  • src/UI/UserMessages.cs
  • src/UI/WindowChrome.cs
  • src/Utilities/AcfKeyValues.cs
  • src/Utilities/Connectivity.cs
  • src/Utilities/DevService.cs
  • src/Utilities/IniFile.cs
  • src/Utilities/LegacySettingsCleanup.cs
  • src/Utilities/PathFormatting.cs
  • src/Utilities/RemoteHtmlResponseException.cs
  • src/Utilities/SafeArchiveExtractor.cs
  • src/Utilities/ShellOpen.cs
  • src/Utilities/SystemCursors.cs
  • src/Utilities/UpdateService.cs
  • src/Warno/DevWarnoMocks.cs
  • src/Warno/InstallWorkflow.cs
  • src/Warno/ModArchiveFormats.cs
  • src/Warno/ModCatalogSettings.cs
  • src/Warno/SteamVersionSwitcher.cs
  • src/Warno/WarnoFinder.cs
  • src/Warno/WarnoPaths.cs
  • src/YSMInstaller.csproj
💤 Files with no reviewable changes (32)
  • src/Utilities/PathFormatting.cs
  • src/Controls/Rounded/RoundedPanel.cs
  • src/Utilities/Connectivity.cs
  • src/UI/Sizes.cs
  • src/UI/TaskbarProgress.cs
  • src/UI/FormAnimation.cs
  • src/Properties/Settings.settings
  • src/Controls/Material/MaterialButton.cs
  • src/Controls/Rounded/RoundedButton.cs
  • src/Controls/Material/SoftLabel.cs
  • src/Controls/Ui/DropdownSelect.cs
  • src/Controls/Material/MaterialTitleBar.cs
  • src/Warno/InstallWorkflow.cs
  • src/Controls/Material/SkeletonCard.cs
  • src/UI/MaterialPalette.cs
  • src/Forms/BorderlessForm.cs
  • src/UI/MaterialType.cs
  • src/Controls/Material/MaterialCard.cs
  • src/Controls/Material/StepChecklist.cs
  • src/UI/WindowChrome.cs
  • src/Utilities/ShellOpen.cs
  • src/UI/MaterialIcons.cs
  • src/Utilities/SystemCursors.cs
  • src/Controls/Material/MaterialProgressBar.cs
  • src/UI/MaterialIconRenderer.cs
  • src/Controls/Material/MaterialOptionCard.cs
  • src/Forms/StepsForm.cs
  • src/Forms/MaterialDialog.cs
  • src/Controls/Rounded/RoundedControls.cs
  • src/Controls/Material/MaterialScrollPanel.cs
  • src/UI/FormDragAnywhere.cs
  • src/Warno/ModArchiveFormats.cs

Comment thread src/Forms/Form1.BuildSelect.cs
Comment thread src/Forms/Form1.Dev.cs Outdated
Comment thread src/Forms/Form1.Layout.cs Outdated
Comment thread src/Utilities/AcfKeyValues.cs
Comment thread src/Utilities/AcfKeyValues.cs
Comment thread src/Utilities/IniFile.cs Outdated
Comment thread src/Warno/SteamVersionSwitcher.cs Outdated
Comment thread src/Warno/SteamVersionSwitcher.cs
Comment thread src/Warno/SteamVersionSwitcher.cs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/Warno/SteamVersionSwitcher.cs (1)

208-218: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

DirectoryNotFoundException slips through the "transient" filter.

DirectoryNotFoundException derives from IOException and isn't excluded like FileNotFoundException is (line 213). If the steamapps folder itself vanishes mid-switch, this gets retried as a transient glitch instead of propagating immediately — contradicting the comment's stated intent ("a vanished manifest ... propagates to the caller"). It'll still eventually fail via the 180s stall timeout, just with a much slower, mislabeled failure.

🐛 Proposed fix
 catch (Exception exception) when (
-    (exception is IOException && !(exception is FileNotFoundException)) || exception is FormatException) {
+    (exception is IOException && !(exception is FileNotFoundException) && !(exception is DirectoryNotFoundException))
+    || exception is FormatException) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Warno/SteamVersionSwitcher.cs` around lines 208 - 218, Update the
exception filter around AcfKeyValues.Parse and File.ReadAllText to exclude
DirectoryNotFoundException alongside FileNotFoundException, so a missing
steamapps directory propagates immediately while other transient IOExceptions
and FormatException remain retriable.
src/Forms/Form1.Installation.cs (1)

364-419: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

BuildActionCard's click delegate runs unguarded — inconsistent with every other Click handler here.

actionBtn.Click += (s, e) => captured(); (line 413) invokes onClick with no try/catch. Its only caller passes () => RenderVersionSwitchPlan(switchOption) (RenderVersionMismatch, lines 331-337) — the same RenderVersionSwitchPlan call is wrapped in try/catch + AppLogger.Critical at its other two call sites (Form1.BuildSelect.cs:288-295, 351-358). An exception here (UI construction/layout) escapes uncaught instead of being logged, breaking the established convention.

As per path instructions, "every async lambda passed to Click/Activated must have a try/catch around its body OR funnel through a helper that logs via AppLogger" — the same convention this codebase already applies to every other RenderVersionSwitchPlan call site.

🐛 Proposed fix
             MaterialButton switchCard's action button, or fix at call site:
-                () => RenderVersionSwitchPlan(switchOption)
+                () => {
+                    try {
+                        RenderVersionSwitchPlan(switchOption);
+                    }
+                    catch (Exception ex) {
+                        AppLogger.Critical("Render version switch plan failed (mismatch card).", ex);
+                    }
+                }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Forms/Form1.Installation.cs` around lines 364 - 419, Update the click
handler created in BuildActionCard so invoking the captured onClick delegate is
guarded by try/catch, matching the existing Click-handler convention. Log any
exception through AppLogger.Critical while preserving the current delegate
invocation behavior.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/Forms/Form1.Installation.cs`:
- Around line 364-419: Update the click handler created in BuildActionCard so
invoking the captured onClick delegate is guarded by try/catch, matching the
existing Click-handler convention. Log any exception through AppLogger.Critical
while preserving the current delegate invocation behavior.

In `@src/Warno/SteamVersionSwitcher.cs`:
- Around line 208-218: Update the exception filter around AcfKeyValues.Parse and
File.ReadAllText to exclude DirectoryNotFoundException alongside
FileNotFoundException, so a missing steamapps directory propagates immediately
while other transient IOExceptions and FormatException remain retriable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 127a3dc4-5b32-454f-9668-75b8f5c40d5c

📥 Commits

Reviewing files that changed from the base of the PR and between 9464819 and 9c7b8ba.

📒 Files selected for processing (7)
  • src/Forms/Form1.BuildSelect.cs
  • src/Forms/Form1.Dev.cs
  • src/Forms/Form1.Installation.cs
  • src/Forms/Form1.Layout.cs
  • src/Utilities/AcfKeyValues.cs
  • src/Utilities/IniFile.cs
  • src/Warno/SteamVersionSwitcher.cs
💤 Files with no reviewable changes (1)
  • src/Forms/Form1.Layout.cs

@dary1337
dary1337 merged commit f6a5a63 into master Jul 11, 2026
3 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant