# Windows Tauri Proxy Client Evidence ## Acceptance Evidence Record target-perspective proof: - app screenshot or state payload; - generated ProxiFyre config artifact; - helper/apply response; - component status showing missing/installed states; - Windows manual checklist results. ### Task 1: Supersede Old Windows Node Plan Accepted evidence for this checkpoint: - `README.md` now states that Windows app routing is planned as a separate Tauri 2 desktop utility, not `APP_MODE=windows` inside the current Node gateway/client server. - `docs/roadmap.md` now lists `windows-gaming` as a standalone Tauri 2 app direction and points to this execution plan. - `docs/superpowers/specs/2026-05-21-windows-client-design.md` is marked superseded and points to the product/tech brief plus this plan. - `docs/superpowers/plans/2026-05-21-windows-client.md` is marked superseded and says not to execute the old Node `APP_MODE=windows` plan. - Both old Windows docs now state that the content below is historical context and may contradict the active Tauri plan. Product-level app evidence is not expected for Task 1 because this task is documentation cutover only. ### Task 2: Scaffold Tauri App Shell Accepted evidence for this checkpoint: - `apps/windows-client` now contains a standalone Tauri 2 + React + TypeScript app scaffold. - The shell has five visible navigation surfaces: Overview, Profiles, Targets, Components, Logs. - The shell shows the intended component split: Control App installed, Proxyfier Layer missing, Local sing-box missing/optional. - The shell route line starts with the MVP external proxy path: `Selected apps -> Proxyfier -> Existing proxy`. - Browser verification confirmed each navigation button renders a matching page heading. - Native Rust/Tauri compilation is blocked in this environment because Rust, Cargo, rustup, MSVC Build Tools, and Windows SDK components are not installed. ### Task 3: Define Domain Models And Validation Accepted evidence for this checkpoint: - `apps/windows-client/src-tauri/src/models.rs` now defines Rust DTO/domain models for profiles, profile items, targets, component status, and activity entries. - `apps/windows-client/src-tauri/src/validation.rs` now normalizes profile and target inputs. - `apps/windows-client/src/domain/types.ts` mirrors the Rust-facing DTOs for React/TypeScript callers. - `apps/windows-client/src-tauri/tests/domain_tests.rs` contains Rust tests for process/folder/exe normalization, malformed protocol rejection, external target normalization, local sing-box target definition without installed component state, and malformed target field rejection. - The validation design keeps Local sing-box optional: a local target can require `singbox`, but target definition validation does not require that component to be installed. Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2. ### Task 4: Implement JSON Storage And Activity Log Accepted evidence for this checkpoint: - `apps/windows-client/src-tauri/src/storage.rs` now defines `JsonStorage` with a default root of `C:\ProgramData\VpnProxy`. - The storage paths split source config files under `config`, activity under `state`, and future generated artifacts under `generated`. - Profiles, targets, components, and activity have typed JSON read/write methods. - Writes create parent directories, write through a sibling `.tmp` file, and copy the existing source file to a sibling `.bak` file before overwrite. - Missing files and invalid JSON fall back to empty collections instead of crashing callers. - `apps/windows-client/src-tauri/src/activity.rs` now owns activity sorting, append, and cap behavior. - `apps/windows-client/src-tauri/tests/storage_tests.rs` contains Rust tests for ProgramData default root, roundtrip persistence, invalid JSON fallback, backup creation, and activity cap/sort. Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment. ### Task 5: Add Proxy Router Adapter Boundary And ProxiFyre Adapter Accepted evidence for this checkpoint: - `apps/windows-client/src-tauri/src/adapters/proxy_router.rs` now defines the `ProxyRouterAdapter` trait, request DTO, generated config DTO, and structured adapter errors. - `apps/windows-client/src-tauri/src/adapters/proxifyre.rs` now defines `ProxiFyreAdapter` and typed `ProxiFyreConfig` / `ProxiFyreProxy` derived-config DTOs. - The ProxiFyre generated JSON follows the official ProxiFyre `app-config.json` shape: `logLevel`, `bypassLan`, `proxies`, `appNames`, `socks5ProxyEndpoint`, and `supportedProtocols`. - Enabled profiles generate ProxiFyre proxy entries from source profile items and targets; disabled profiles are skipped. - External SOCKS5 targets do not require Local sing-box component state. - Targets that require a component, such as `local-singbox` requiring `singbox`, are blocked unless the component is installed and running. - HTTP targets are rejected by the ProxiFyre adapter because ProxiFyre is a SOCKS5 proxy-router backend. - `apps/windows-client/src-tauri/tests/proxifyre_adapter_tests.rs` contains tests for Discord + external SOCKS5 config generation, disabled profile skipping, missing local sing-box blocking, running local sing-box allowing generation, and HTTP rejection. Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment. ### Task 6: Add Tauri Commands Accepted evidence for this checkpoint: - `apps/windows-client/src-tauri/src/commands.rs` now defines structured Tauri command DTOs and handlers for status, profiles, targets, components, resolve preview, apply, and logs. - `apps/windows-client/src-tauri/src/main.rs` now registers the Task 6 commands through `tauri::generate_handler!`. - `apps/windows-client/src/api/tauriCommands.ts` now exposes typed async `invoke(...)` wrappers for `get_status`, `get_profiles`, `save_profile`, `get_targets`, `save_target`, `get_components`, `resolve_profile_preview`, `apply_profiles`, and `get_logs`. - Command responses use structured JSON DTOs and camelCase fields for the TypeScript boundary. - Save profile/target command services normalize inputs through the existing Rust validation layer before writing JSON source files. - Apply uses the `ProxyRouterAdapter` boundary, writes the generated ProxiFyre config artifact under the configured generated directory, calls a helper trait, and records success activity. - Adapter-blocked apply, such as a `local-singbox` target with missing/stopped sing-box, records an error activity entry before returning a structured command error. - `apps/windows-client/src-tauri/tests/command_tests.rs` contains Rust tests for save normalization/persistence, resolve preview, generated config + mock helper + activity, and blocked local sing-box activity. Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment. ### Task 7: Build MVP UI Accepted evidence for this checkpoint: - `apps/windows-client/src/app/App.tsx` now owns MVP dashboard state, Tauri command loading, browser preview fallback, profile/target save handlers, profile preview, and apply action state. - `apps/windows-client/src/features/overview/OverviewPage.tsx` now shows route status, active profile/app counts, active target, Proxyfier state, Local sing-box optional state, recent activity, refresh, and apply controls. - `apps/windows-client/src/features/profiles/ProfilesPage.tsx` now provides a usable profile editor for process/folder/exe items, target selection, protocol toggles, enabled state, save, and preview. - `apps/windows-client/src/features/targets/TargetsPage.tsx` now provides an external proxy target editor and target list. - `apps/windows-client/src/features/components/ComponentsPage.tsx` now shows Control App, Proxyfier Layer, and Local sing-box as separate operable components with explicit actions. - `apps/windows-client/src/features/logs/LogsPage.tsx` now shows activity entries and copy diagnostics output. - `apps/windows-client/src/styles/app.css` now provides a responsive compact Windows utility layout with dense metrics, forms, lists, status badges, and component rail. - The UI uses Task 6 command wrappers when running inside Tauri and a local preview fallback for browser/dev verification. Browser screenshot/DOM automation remains blocked by the current sandbox/browser runtime helper failure, so this checkpoint is implemented but browser-unproven in the current environment. ### Task 8: Implement Helper And Explicit Installer Boundary Accepted evidence for this checkpoint: - `apps/windows-client/src-tauri/src/helper.rs` now defines structured helper requests/responses, action names, command specs, command runner abstraction, JSON parsing, explicit install requests, service requests, and ProxiFyre apply request construction. - Helper actions use machine-readable names such as `install-control-app`, `install-proxyfier`, `install-singbox`, `proxyfier.apply`, and `service.restart`. - Helper parsing rejects non-JSON stdout, preserving the rule that app logic does not parse raw PowerShell/stdout text. - `apps/windows-client/src-tauri/tests/helper_tests.rs` contains mock-runner tests for JSON stdin, structured response parsing, elevation flags, explicit install actions, ProxiFyre apply not encoding install, non-JSON rejection, and failed helper exit errors. - `apps/windows-client/scripts/install-control-app.ps1`, `install-proxyfier.ps1`, and `install-singbox.ps1` are explicit component installer entrypoints. - Installer scripts are idempotent boundaries: they create marker state only when needed, expose `-PlanOnly`, check admin before install work, return JSON, and backup existing component config files before overwrite where applicable. - `apps/windows-client/src-tauri/capabilities/default.json` remains narrow with only `core:default`; its description documents that no shell/sidecar helper launch permission is granted until a packaged helper is declared. Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment. ### Task 9: Add Optional Local Sing-Box Adapter Accepted evidence for this checkpoint: - `apps/windows-client/src-tauri/src/adapters/singbox.rs` now defines a separate `SingBoxAdapter` for generated local sing-box config. - The generated config uses a local `mixed` inbound on the configured `local-singbox` target host/port, a direct outbound placeholder, and `route.final` pointing at that outbound. - `SingBoxGenerationRequest` accepts an optional binary path; `SingBoxCommandChecker` writes a temporary config and runs `sing-box check -c ` only when a binary path is supplied. - Local sing-box config generation requires a target that is local, SOCKS5, and declares `requires_component: singbox`. - Local sing-box config generation is blocked unless the `singbox` component is installed, running, and in `ComponentState::Running`. - `apps/windows-client/src-tauri/tests/singbox_adapter_tests.rs` contains tests for config generation, optional check skipping, failed check propagation, missing/stopped sing-box blocking, and external ProxiFyre generation without sing-box. - `apps/windows-client/src/features/targets/TargetsPage.tsx` now renders the local sing-box target as an explicit `install prompt` row instead of a normal ready target when it requires `singbox`. - `apps/windows-client/src/features/components/ComponentsPage.tsx` now labels stopped/missing Local sing-box as optional and only needed when this PC should expose a local target. Rust test execution remains blocked by the missing Rust/MSVC toolchain recorded in Task 2, so this checkpoint is implemented but Rust-unproven in the current environment. ### Task 10: Package, Verify, And Record Evidence Accepted evidence for this checkpoint: - `apps/windows-client/README.md` now documents the Windows client component split, source JSON paths, generated artifact paths, development commands, native prerequisites, explicit installer boundaries, and MVP verification flow. - `README.md` now links the Windows client README, documents Windows client build/test commands, explains the three separate installer scripts, and records that generated ProxiFyre/sing-box files are derived artifacts. - `docs/roadmap.md` now records the Windows client checkpoint: MVP slice exists, frontend build passes, native Rust/Tauri verification needs the Windows Rust/MSVC toolchain, and Local sing-box remains optional. - Browser target-perspective state was captured against the Windows client dev server on `http://127.0.0.1:5174/`: title `VPN Proxy Windows`, five navigation surfaces, external SOCKS5 route line, Control App/Proxyfier/Local sing-box component rail, and no horizontal overflow. - Browser route checks confirmed Overview, Profiles, Targets, Components, and Logs surfaces render. Targets showed Local sing-box as an `install prompt`. - Browser preview apply produced the visible notice `proxifyre.stage-generated-config` with `Generated config staged in preview mode` and showed `C:\ProgramData\VpnProxy\generated\proxifyre-app-config.json`. - Installer `-PlanOnly` commands returned structured JSON for Control App, Proxyfier Layer, and Local sing-box without install side effects. - Native Rust/Tauri build and real generated-file/helper/service behavior remain implemented but unproven in this environment because Rust/Cargo/MSVC Build Tools are not installed and no elevated Windows helper/service run was performed. ## Verification Record focused checks that passed, including command and important output. ### Task 1 Verification Command: ```powershell rg -n "Tauri|superseded|Superseded|windows-client-product-tech-brief|apps/windows-client" README.md docs ``` Important output included: - `README.md:58:Windows app routing is planned as a separate Tauri 2 desktop utility` - `docs\roadmap.md:11:standalone Tauri 2 app + ProxiFyre adapter + optional native sing-box.exe` - `docs\roadmap.md:91:- Standalone Tauri 2 + React/TypeScript + Rust app under apps/windows-client` - `docs\superpowers\specs\2026-05-21-windows-client-design.md:3:> Superseded: this document describes the earlier Node/web-control Windows direction.` - `docs\superpowers\specs\2026-05-21-windows-client-design.md:7:> Content below is retained for historical context and may contradict the active` - `docs\superpowers\plans\2026-05-21-windows-client.md:3:> Superseded: do not execute this Node APP_MODE=windows plan as the current` - `docs\superpowers\plans\2026-05-21-windows-client.md:7:> Content below is retained for historical context and may contradict the active` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ### Task 2 Verification Command: ```powershell node --version npm --version cargo --version rustc --version ``` Important output: - `node`: `v26.4.0` - `npm`: `11.17.0` - `cargo`: not recognized - `rustc`: not recognized Command: ```powershell cd apps/windows-client npm install ``` Important output: - `added 72 packages` - `found 0 vulnerabilities` - npm warned that `esbuild@0.28.1` has an install script not yet covered by `allowScripts`. Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `vite v7.3.6 building client environment for production` - `36 modules transformed` - `built in 426ms` Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - Tauri detected app config: framework `React`, bundler `Vite`, `frontendDist: ../dist`, `devUrl: http://localhost:5173/`. - Tauri packages detected: `@tauri-apps/api 2.11.1`, `@tauri-apps/cli 2.11.4`, Rust crate `tauri: 2`. - Environment blockers: no Visual Studio/MSVC Build Tools, `rustc` not installed, `Cargo` not installed, `rustup` not installed. Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Browser verification: - Dev server: `http://127.0.0.1:5173/`. - DOM snapshot showed all five primary nav buttons and the component status rail. - Route click checks returned `ok: true` for Overview, Profiles, Targets, Components, and Logs. - Layout metrics at 1280px viewport: app shell grid `260px 1020px`, no horizontal overflow (`bodyClientWidth: 1280`, `bodyScrollWidth: 1280`). ### Task 3 Verification Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `36 modules transformed` - `built in 424ms` Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - App config still detected as React/Vite Tauri app. - Environment still reports missing MSVC Build Tools, `rustc`, `Cargo`, and `rustup`. Command: ```powershell rg -n "ProfileInput|ProfileItemInput|TargetInput|ComponentStatus|ActivityEntry|normalize_profile|normalize_target|local_singbox_target_can_exist_before_component_is_installed|rejects_malformed_target_fields" apps\windows-client\src-tauri apps\windows-client\src\domain\types.ts ``` Important output included: - `apps\windows-client\src-tauri\src\models.rs:60:pub struct ProfileInput` - `apps\windows-client\src-tauri\src\models.rs:92:pub struct TargetInput` - `apps\windows-client\src-tauri\src\models.rs:117:pub struct ComponentStatus` - `apps\windows-client\src-tauri\src\models.rs:132:pub struct ActivityEntry` - `apps\windows-client\src-tauri\src\validation.rs:109:pub fn normalize_profile` - `apps\windows-client\src-tauri\src\validation.rs:175:pub fn normalize_target` - `apps\windows-client\src-tauri\tests\domain_tests.rs:94:fn local_singbox_target_can_exist_before_component_is_installed` - `apps\windows-client\src-tauri\tests\domain_tests.rs:111:fn rejects_malformed_target_fields` ### Task 4 Verification Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `36 modules transformed` - `built in 395ms` Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - App config still detected as React/Vite Tauri app. - Environment still reports missing Visual Studio/MSVC Build Tools, `rustc`, `Cargo`, `rustup`, and Rust toolchain. Command: ```powershell rg -n "default_config_root|write_profiles|read_profiles|backup_path|append_activity|activity_entries_are_sorted_and_capped|invalid_json_falls_back_to_empty_collection|roundtrips_profiles_targets_components_and_activity" apps\windows-client\src-tauri ``` Important output included: - `apps\windows-client\src-tauri\src\storage.rs:8:pub fn default_config_root` - `apps\windows-client\src-tauri\src\storage.rs:79:pub fn read_profiles` - `apps\windows-client\src-tauri\src\storage.rs:83:pub fn write_profiles` - `apps\windows-client\src-tauri\src\storage.rs:150:pub fn backup_path` - `apps\windows-client\src-tauri\src\activity.rs:16:pub fn append_activity` - `apps\windows-client\src-tauri\tests\storage_tests.rs:26:fn roundtrips_profiles_targets_components_and_activity` - `apps\windows-client\src-tauri\tests\storage_tests.rs:55:fn invalid_json_falls_back_to_empty_collection` - `apps\windows-client\src-tauri\tests\storage_tests.rs:93:fn activity_entries_are_sorted_and_capped` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ### Task 5 Verification External reference checked: - Official ProxiFyre README: `https://github.com/wiresock/proxifyre` - Relevant config fields: `app-config.json`, `logLevel`, `bypassLan`, `proxies`, `appNames`, `socks5ProxyEndpoint`, `supportedProtocols`. Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `36 modules transformed` - `built in 401ms` Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - App config still detected as React/Vite Tauri app. - Environment still reports missing Visual Studio/MSVC Build Tools, `rustc`, `Cargo`, `rustup`, and Rust toolchain. Command: ```powershell rg -n "ProxyRouterAdapter|ProxiFyreAdapter|PROXIFYRE_OUTPUT_FILE|generate_proxifyre_config|generates_proxifyre_config_for_discord_external_socks5_target|blocks_local_singbox_target_when_required_component_is_missing|rejects_http_target" apps\windows-client\src-tauri ``` Important output included: - `apps\windows-client\src-tauri\src\adapters\proxy_router.rs:58:pub trait ProxyRouterAdapter` - `apps\windows-client\src-tauri\src\adapters\proxifyre.rs:21:pub struct ProxiFyreAdapter` - `apps\windows-client\src-tauri\src\adapters\proxifyre.rs:34:pub fn generate_proxifyre_config` - `apps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:16:fn generates_proxifyre_config_for_discord_external_socks5_target` - `apps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:61:fn blocks_local_singbox_target_when_required_component_is_missing` - `apps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:92:fn rejects_http_target_because_proxifyre_adapter_is_socks5_only` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ### Task 6 Verification Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `38 modules transformed` - `built in 393ms` Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - App config still detected as React/Vite Tauri app. - Environment still reports missing Visual Studio/MSVC Build Tools, `rustc`, `Cargo`, `rustup`, and Rust toolchain. Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell rg -n "tauri::command|get_status|get_profiles|save_profile|get_targets|save_target|get_components|resolve_profile_preview|apply_profiles|get_logs|apply_generates_derived_config_and_records_activity_with_mock_helper|invoke<" apps\windows-client\src-tauri apps\windows-client\src\api\tauriCommands.ts ``` Important output included: - `apps\windows-client\src-tauri\src\commands.rs:284:pub fn get_status` - `apps\windows-client\src-tauri\src\commands.rs:289:pub fn get_profiles` - `apps\windows-client\src-tauri\src\commands.rs:296:pub fn save_profile` - `apps\windows-client\src-tauri\src\commands.rs:304:pub fn get_targets` - `apps\windows-client\src-tauri\src\commands.rs:309:pub fn save_target` - `apps\windows-client\src-tauri\src\commands.rs:317:pub fn get_components` - `apps\windows-client\src-tauri\src\commands.rs:324:pub fn resolve_profile_preview` - `apps\windows-client\src-tauri\src\commands.rs:331:pub fn apply_profiles` - `apps\windows-client\src-tauri\src\commands.rs:343:pub fn get_logs` - `apps\windows-client\src-tauri\tests\command_tests.rs:116:fn apply_generates_derived_config_and_records_activity_with_mock_helper` - `apps\windows-client\src\api\tauriCommands.ts:96:return invoke('get_status')` - `apps\windows-client\src\api\tauriCommands.ts:126:return invoke('apply_profiles')` Command: ```powershell rg -n "activity_for_apply_error|apply_blocks_local_singbox_target_when_component_is_missing|apply_generates_derived_config_and_records_activity_with_mock_helper|invoke<|generate_handler" apps\windows-client\src-tauri apps\windows-client\src\api\tauriCommands.ts ``` Important output included: - `apps\windows-client\src-tauri\src\main.rs:17:.invoke_handler(tauri::generate_handler![` - `apps\windows-client\src-tauri\src\commands.rs:479:let activity = activity_for_apply_error` - `apps\windows-client\src-tauri\src\commands.rs:633:fn activity_for_apply_error` - `apps\windows-client\src-tauri\tests\command_tests.rs:116:fn apply_generates_derived_config_and_records_activity_with_mock_helper` - `apps\windows-client\src-tauri\tests\command_tests.rs:158:fn apply_blocks_local_singbox_target_when_component_is_missing` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ### Task 7 Verification Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `38 modules transformed` - `built in 431ms` Command: ```powershell cd apps/windows-client npm run dev -- --host 127.0.0.1 ``` Important output: - `VITE v7.3.6 ready in 206 ms` - `Local: http://127.0.0.1:5173/` Command: ```powershell Invoke-WebRequest -UseBasicParsing -Uri 'http://127.0.0.1:5173/' | Select-Object StatusCode,Content ``` Important output: - `StatusCode 200` - Response content starts with ``. Command: ```powershell rg -n "Apply changes|Save profile|Save target|External proxy first|Local sing-box|resolveProfilePreview|applyProfiles|Copy diagnostics|Preview state loaded" apps\windows-client\src\app apps\windows-client\src\features apps\windows-client\src\api\tauriCommands.ts ``` Important output included: - `apps\windows-client\src\app\App.tsx:328:const preview = await resolveProfilePreview(input)` - `apps\windows-client\src\app\App.tsx:371:const response = await applyProfiles()` - `apps\windows-client\src\features\overview\OverviewPage.tsx:36:

External proxy first, local sing-box optional

` - `apps\windows-client\src\features\overview\OverviewPage.tsx:43:{isApplying ? 'Applying' : 'Apply changes'}` - `apps\windows-client\src\features\profiles\ProfilesPage.tsx:48:Save profile` - `apps\windows-client\src\features\targets\TargetsPage.tsx:27:Save target` - `apps\windows-client\src\features\logs\LogsPage.tsx:29:Copy diagnostics` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. Blocked browser evidence: - Browser skill file listed in session context was stale; current skill was found at `C:\Users\PC\.codex\plugins\cache\openai-bundled\browser\26.623.101652\skills\control-in-app-browser\SKILL.md` and read before browser work. - `mcp__node_repl.js` browser setup failed with `windows sandbox failed: helper_unknown_error: setup refresh had errors`. - `apply_patch` also failed with the same sandbox helper error, so Task 7 file edits were made with explicit escalated `Set-Content` fallback against Task 7-allowed files only. ### Task 8 Verification Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `38 modules transformed` - `built in 404ms` Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - App config still detected as React/Vite Tauri app. - Environment still reports missing Visual Studio/MSVC Build Tools, `rustc`, `Cargo`, `rustup`, and Rust toolchain. Command: ```powershell $files = @( 'apps\windows-client\scripts\install-control-app.ps1', 'apps\windows-client\scripts\install-proxyfier.ps1', 'apps\windows-client\scripts\install-singbox.ps1' ) foreach ($file in $files) { $tokens = $null $errors = $null [System.Management.Automation.Language.Parser]::ParseFile((Resolve-Path $file), [ref]$tokens, [ref]$errors) | Out-Null if ($errors.Count -gt 0) { Write-Error "$file parser errors" } Write-Output "$file parser ok" } ``` Important output: - `apps\windows-client\scripts\install-control-app.ps1 parser ok` - `apps\windows-client\scripts\install-proxyfier.ps1 parser ok` - `apps\windows-client\scripts\install-singbox.ps1 parser ok` Command: ```powershell & 'apps\windows-client\scripts\install-control-app.ps1' -PlanOnly & 'apps\windows-client\scripts\install-proxyfier.ps1' -PlanOnly & 'apps\windows-client\scripts\install-singbox.ps1' -PlanOnly ``` Important output: - Control App returned JSON with `"success": true`, `"action": "install-control-app"`, `"changed": false`, and `"planOnly": true`. - Proxyfier returned JSON with `"success": true`, `"action": "install-proxyfier"`, `"changed": false`, `"serviceName": "ProxiFyreService"`, and `"planOnly": true`. - Local sing-box returned JSON with `"success": true`, `"action": "install-singbox"`, `"changed": false`, `"serviceName": "VpnProxySingBox"`, and `"planOnly": true`. Command: ```powershell rg -n "proxyfier\.apply|service\.restart|runner\(\)|install_request|proxifyre_apply_request|helper_response_decode|PlanOnly|core:default|no shell or sidecar" apps\windows-client\src-tauri apps\windows-client\scripts ``` Important output included: - `apps\windows-client\src-tauri\src\helper.rs:14:#[serde(rename = "proxyfier.apply")]` - `apps\windows-client\src-tauri\src\helper.rs:22:#[serde(rename = "service.restart")]` - `apps\windows-client\src-tauri\src\helper.rs:131:"helper_response_decode"` - `apps\windows-client\src-tauri\src\helper.rs:137:pub fn install_request` - `apps\windows-client\src-tauri\src\helper.rs:159:pub fn proxifyre_apply_request` - `apps\windows-client\src-tauri\tests\helper_tests.rs:73:fn install_requests_are_explicit_component_actions` - `apps\windows-client\src-tauri\capabilities\default.json:6:"permissions": ["core:default"]` - `apps\windows-client\scripts\install-control-app.ps1:50:if ($PlanOnly)` - `apps\windows-client\scripts\install-proxyfier.ps1:53:if ($PlanOnly)` - `apps\windows-client\scripts\install-singbox.ps1:53:if ($PlanOnly)` Command: ```powershell Get-Content -LiteralPath 'apps\windows-client\src-tauri\capabilities\default.json' -Raw | ConvertFrom-Json | Select-Object identifier,description,permissions ``` Result: - JSON parsed successfully. - `identifier`: `default` - Description states that no shell or sidecar permission is granted until a packaged helper is declared. Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ### Task 9 Verification External references checked: - Official sing-box Mixed inbound docs: `https://sing-box.sagernet.org/configuration/inbound/mixed/`. - Official sing-box Direct outbound docs: `https://sing-box.sagernet.org/configuration/outbound/direct/`. - Official sing-box Route docs for `route.final`: `https://sing-box.sagernet.org/configuration/route/`. - Official sing-box Log docs for log structure: `https://sing-box.sagernet.org/configuration/log/`. Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `38 modules transformed` - `built in 469ms` Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - App config still detected as React/Vite Tauri app. - Environment still reports missing Visual Studio/MSVC Build Tools, `rustc`, `Cargo`, `rustup`, and Rust toolchain. Command: ```powershell rg -n "SingBoxAdapter|SingBoxGenerationRequest|sing-box check|install prompt|Optional\. Install|external_proxifyre_apply_does_not_require_singbox_component" apps\windows-client\src-tauri apps\windows-client\src\features ``` Important output included: - `apps\windows-client\src-tauri\src\adapters\singbox.rs:18:pub struct SingBoxAdapter` - `apps\windows-client\src-tauri\src\adapters\singbox.rs:39:request: SingBoxGenerationRequest<'_>` - `apps\windows-client\src-tauri\src\adapters\singbox.rs:221:format!("sing-box check failed: {message}")` - `apps\windows-client\src-tauri\tests\singbox_adapter_tests.rs:145:fn external_proxifyre_apply_does_not_require_singbox_component` - `apps\windows-client\src\features\targets\TargetsPage.tsx:83:{localSingboxPrompt ? 'install prompt' : target.kind === 'local' ? 'local' : 'external'}` - `apps\windows-client\src\features\components\ComponentsPage.tsx:18:? 'Optional. Install and start only when this PC should expose a local target.'` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ### Task 10 Verification Command: ```powershell cd apps/windows-client npm run build ``` Important output: - `tsc && vite build` - `38 modules transformed` - `built in 428ms` Command: ```powershell cd apps/windows-client/src-tauri cargo test ``` Result: - Blocked: `cargo` is not recognized in the current environment. Command: ```powershell cd apps/windows-client npm run tauri -- info ``` Important output: - WebView2 detected: `149.0.4022.98`. - Environment still reports missing Visual Studio/MSVC Build Tools, `rustc`, `Cargo`, `rustup`, and Rust toolchain. - App config detected as React/Vite with `frontendDist: ../dist` and `devUrl: http://localhost:5173/`. Command: ```powershell cd apps/windows-client npm run tauri -- build ``` Result: - Blocked: `failed to run 'cargo metadata' ... program not found`. Command: ```powershell $files = @( 'apps\windows-client\scripts\install-control-app.ps1', 'apps\windows-client\scripts\install-proxyfier.ps1', 'apps\windows-client\scripts\install-singbox.ps1' ) foreach ($file in $files) { $tokens = $null $errors = $null [System.Management.Automation.Language.Parser]::ParseFile((Resolve-Path $file), [ref]$tokens, [ref]$errors) | Out-Null if ($errors.Count -gt 0) { Write-Error "$file parser errors" } else { Write-Output "$file parser ok" } } ``` Important output: - `apps\windows-client\scripts\install-control-app.ps1 parser ok` - `apps\windows-client\scripts\install-proxyfier.ps1 parser ok` - `apps\windows-client\scripts\install-singbox.ps1 parser ok` Command: ```powershell $files = @( 'apps\windows-client\scripts\install-control-app.ps1', 'apps\windows-client\scripts\install-proxyfier.ps1', 'apps\windows-client\scripts\install-singbox.ps1' ) foreach ($file in $files) { & $file -PlanOnly } ``` Important output: - Control App returned JSON with `"success": true`, `"action": "install-control-app"`, `"changed": false`, and `"planOnly": true`. - Proxyfier returned JSON with `"success": true`, `"action": "install-proxyfier"`, `"changed": false`, `"serviceName": "ProxiFyreService"`, and `"planOnly": true`. - Local sing-box returned JSON with `"success": true`, `"action": "install-singbox"`, `"changed": false`, `"serviceName": "VpnProxySingBox"`, and `"planOnly": true`. Browser evidence: - Port `5173` was already occupied by an unrelated page, so the Windows client dev server was started on `http://127.0.0.1:5174/` with `--strictPort`. - Initial app state payload included: - `title`: `VPN Proxy Windows` - `routeHeading`: `Overview` - `panelHeading`: `External proxy first, local sing-box optional` - `routeLine`: `Selected apps -> ProxiFyre -> Existing proxy 192.168.50.111:8080` - component rail: `Control AppRunning`, `Proxyfier LayerNot installed`, `Local sing-boxNot installed` - `horizontalOverflow`: `false` - Route checks returned five surfaces: Overview, Profiles, Targets, Components, Logs. - Targets route text included `Local sing-boxSOCKS5 127.0.0.1:1080Install and start Local sing-box before using this target.install prompt`. - Preview apply on Overview produced a visible notice: `proxifyre.stage-generated-configGenerated config staged in preview mode.` - Preview apply also kept `C:\ProgramData\VpnProxy\generated\proxifyre-app-config.json` visible. - Browser tab was closed after verification. The extra dev server on `5174` was stopped. The attempted process for `5173` was already not running. Command: ```powershell rg -n "Windows client README|install-control-app|install-proxyfier|install-singbox|C:\\ProgramData\\VpnProxy|Current checkpoint|npm run build|cargo test" README.md docs\roadmap.md apps\windows-client\README.md ``` Important output included: - `README.md:66:- Windows client README: apps/windows-client/README.md` - `README.md:97:& .\scripts\install-control-app.ps1 -PlanOnly` - `README.md:98:& .\scripts\install-proxyfier.ps1 -PlanOnly` - `README.md:99:& .\scripts\install-singbox.ps1 -PlanOnly` - `README.md:107:C:\ProgramData\VpnProxy\config` - `docs\roadmap.md:89:Current checkpoint:` - `apps\windows-client\README.md:60:cargo test` Command: ```powershell git diff --check ``` Result: - No whitespace errors reported. - Git warned that several modified Markdown files will be normalized from LF to CRLF next time Git touches them. ## Review Notes Record plan-reviewer, reviewer, maintainer, or verifier findings that changed the result. ### PRE Review Mode: PRE Verdict: aligned for Task 1. Findings: - No blocker findings. - The plan has explicit outcome, truth owner, contract boundary, cutover, displaced path, kill criteria, and evidence requirements. - Task 1 is documentation-only and its allowed file scope avoids runtime source files, matching the cutover requirement. ### POST Review Mode: POST Verdict: aligned. Findings: - No blocker or major findings. - Implementation stayed within Task 1's documentation-only file scope. - Displaced Node `APP_MODE=windows` path is demoted in README, roadmap, and both older Windows docs. - Acceptance evidence for this checkpoint is sufficient because Task 1 is cutover documentation, not product behavior. ### Correctness Review Findings: - No correctness issues found for this documentation checkpoint. - Residual risk: product behavior remains unimplemented; app/build/generated-config evidence is deferred to later tasks. ### Maintainer Review Findings: - Minor risk found and fixed: the old Windows spec still contains historical text such as "No Electron or Tauri wrapper"; both old Windows docs now explicitly warn that the remaining content is historical and may contradict the active Tauri plan. - No duplicate current-looking Windows implementation path remains after the added superseded notes. ### Task 2 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 2 creates only the separate `apps/windows-client` Tauri app slice plus evidence updates. - Current Node gateway/client runtime files remain out of scope. ### Task 2 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - The implementation stayed within the Tauri app slice and did not extend the current Node server. - Frontend build and browser shell evidence are captured. - Native Rust/Tauri checks are blocked by missing local toolchain, so this checkpoint is implemented but native-unproven. ### Task 2 Correctness Review Findings: - No runtime correctness issues found in the scaffold shell. - Residual risk: Tauri native compilation must be run after installing Rust, rustup, and Visual Studio Build Tools with MSVC/Windows SDK. ### Task 2 Maintainer Review Findings: - No duplicate Windows implementation path introduced. - The placeholder `getShellSnapshot()` is intentionally local shell scaffolding; Task 6 must replace it with typed Tauri command calls. ### Task 3 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 3 scope is limited to domain models, validation, TypeScript mirror types, and domain tests. - Current Node gateway/client runtime files remain out of scope. ### Task 3 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - Models and validation were added in the Tauri app slice only. - TypeScript build passed. - Rust domain tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing, so this checkpoint is implemented but Rust-unproven. ### Task 3 Correctness Review Findings: - No TypeScript/runtime issues found by `npm run build`. - Residual risk: Rust syntax and tests must be validated once Rust and MSVC Build Tools are installed. ### Task 3 Maintainer Review Findings: - No duplicate truth path introduced. - The Rust validation module is currently imported by integration tests via path modules because Task 3 did not modify `lib.rs`; Task 6 should expose stable crate modules when commands integrate the domain layer. ### Task 4 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 4 scope is limited to JSON storage, activity helpers, and storage tests. - UI screens, current Node gateway/client code, and adapter/helper behavior remain out of scope. ### Task 4 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - Implementation stayed within the Tauri Rust storage/activity slice and storage tests. - Source truth remains JSON under the planned ProgramData root, with generated artifacts represented only as a path directory. - Rust tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing. ### Task 4 Correctness Review Findings: - No TypeScript/runtime issues found by `npm run build`. - Storage writes use temp files and create backups before overwriting existing source files. - Invalid JSON fallback intentionally returns empty collections, matching the Task 4 evidence contract. - Residual risk: Rust syntax and behavior must be validated once Rust and MSVC Build Tools are installed. ### Task 4 Maintainer Review Findings: - No duplicate storage truth path introduced. - Activity ordering/capping is isolated in `activity.rs` so future commands can reuse it without duplicating list policy. - The Rust modules are currently imported by integration tests via path modules because Task 4 did not modify `lib.rs`; Task 6 should expose stable crate modules when commands integrate storage. ### Task 5 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 5 scope is limited to proxy-router adapter boundary, ProxiFyre generated config, and adapter tests. - UI screens, current Node gateway/client code, helper/service operations, and Tauri commands remain out of scope. ### Task 5 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - Implementation stayed within the Tauri Rust adapter slice and ProxiFyre adapter tests. - `ProxyRouterAdapter` keeps UI and source profile models separated from ProxiFyre-specific config fields. - External SOCKS5 generation explicitly does not depend on Local sing-box component state. - Rust tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing. ### Task 5 Correctness Review Findings: - No TypeScript/runtime issues found by `npm run build`. - ProxiFyre output uses the current official object-shaped `app-config.json` format with a `proxies` list. - Component dependency checks are target-driven, so missing `singbox` blocks only targets that declare `requires_component: singbox`. - Residual risk: Rust syntax and behavior must be validated once Rust and MSVC Build Tools are installed. ### Task 5 Maintainer Review Findings: - No duplicate adapter path introduced. - ProxiFyre-specific DTOs stay inside `proxifyre.rs`; shared callers should depend on `ProxyRouterAdapter` and `ProxyRouterGeneratedConfig`. - The Rust adapter modules are currently imported by integration tests via path modules because Task 5 did not modify `lib.rs`; Task 6 should expose stable crate modules when commands integrate adapters. ### Task 6 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 6 scope is limited to Tauri command handlers, command wrappers, command tests, and command registration. - Full UI screens, privileged helper implementation, installer scripts, and current Node gateway/client code remain out of scope. ### Task 6 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - Implementation stayed in the Tauri command/API slice and did not implement the Task 7 UI. - Commands return structured DTOs and errors instead of raw PowerShell/stdout parsing. - Apply remains behind adapter/helper interfaces; the Task 6 helper is staged/mock-style and does not perform hidden privileged installation. - Rust command tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing. ### Task 6 Correctness Review Findings: - No TypeScript/runtime issues found by `npm run build`. - Apply writes a generated ProxiFyre config artifact, calls the helper boundary, and records success activity. - Apply also records error activity when blocked by adapter checks, preserving user-visible failure evidence. - Residual risk: Rust syntax and command macro wiring must be validated once Rust and MSVC Build Tools are installed. ### Task 6 Maintainer Review Findings: - Command DTOs keep the TypeScript boundary camelCase without changing the source domain model storage contract. - The command service functions are separately callable from tests, so future helper integration can replace `StagedApplyHelper` without rewriting the UI wrapper. - Residual maintainability caveat: `src-tauri/src/lib.rs` still contains the original scaffold `run()` path without command registration because Task 6's allowed file list targeted `main.rs`; a later cleanup should align or remove that stale scaffold entrypoint. ### Task 7 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings in the plan contract. - Task 7 scope is limited to React app/features/styles and must not change Rust command/adapter behavior. - Required evidence is app-visible state, but browser automation availability must be verified during the task. ### Task 7 POST Review Mode: POST Verdict: aligned with browser evidence caveat. Findings: - No blocker or major findings in the implemented UI slice. - Implementation stayed within `apps/windows-client/src/app`, `src/features`, and `src/styles`. - UI is wired to Task 6 command wrappers with a preview fallback, so the desktop UI can be developed in a browser while still using Tauri commands in-app. - Browser screenshot/DOM evidence could not be captured because the browser runtime failed with the sandbox helper error. ### Task 7 Correctness Review Findings: - `npm run build` passed after the UI rewrite. - Overview, Profiles, Targets, Components, and Logs now expose the MVP workflows requested by Task 7. - Apply, profile preview, profile save, and target save call the command wrapper boundary and fall back locally when outside Tauri. - Residual risk: actual browser rendering and Tauri runtime command calls must be verified once the sandbox/browser helper issue is resolved. ### Task 7 Maintainer Review Findings: - UI state is centralized in `App.tsx` for the MVP; this is acceptable for Task 7 but should move to query/state hooks if the app grows. - The preview fallback is isolated to UI state and does not create a second source of truth for persisted configuration. - `apply_patch` was unavailable due sandbox helper failure, so Task 7 edits used escalated `Set-Content` fallback; future edits should return to `apply_patch` when the tool is healthy. ### Task 8 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 8 scope is limited to helper abstraction, installer scripts, capability declaration, and helper tests. - Hidden installer invocation inside profile apply remains forbidden and was not added. ### Task 8 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - Helper boundary returns structured JSON and rejects unstructured stdout. - Installer entrypoints are explicit per component and expose `-PlanOnly` evidence without admin/install side effects. - Capability remains narrow; no broad shell/sidecar permission was introduced. - Rust helper tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing. ### Task 8 Correctness Review Findings: - `npm run build` passed after Task 8 changes. - PowerShell parser checks passed for all three installer scripts. - `-PlanOnly` output proves all three installer scripts return machine-readable JSON and do not perform install work in plan mode. - Residual risk: real elevated install/service/apply behavior still requires manual Windows verification with installed helper and components. ### Task 8 Maintainer Review Findings: - No duplicate helper path introduced; `helper.rs` owns the helper JSON contract and runner abstraction. - Installer scripts remain thin boundaries and do not contain application profile/apply logic. - Task 6 still uses `StagedApplyHelper`; integrating the real helper into apply should be done in a later command/helper integration task or package verification pass. ### Task 9 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings. - Task 9 scope is limited to the optional sing-box adapter, adapter tests, and Targets/Components UI surfaces. - The plan forbids making sing-box mandatory for external targets; implementation must keep that dependency attached only to local targets declaring `requires_component: singbox`. ### Task 9 POST Review Mode: POST Verdict: aligned with environment caveat. Findings: - No blocker or major findings. - `SingBoxAdapter` is separate from `ProxiFyreAdapter` and does not alter external target apply behavior. - Binary validation is explicit and optional: config generation calls a checker only when a sing-box binary path is supplied. - UI changes make Local sing-box an explicit install prompt when absent instead of presenting it as a normal ready external path. - Rust tests are authored but not executable in this environment because Rust/Cargo/MSVC are missing. ### Task 9 Correctness Review Findings: - `npm run build` passed after Task 9 UI changes. - Local sing-box config generation checks the local target shape and requires the sing-box component to be installed and running. - The Task 9 tests include external ProxiFyre generation with missing sing-box to preserve the no-mandatory-sing-box invariant. - Residual risk: Rust syntax and actual `sing-box check` execution must be validated once Rust, MSVC Build Tools, and a real sing-box binary are installed. ### Task 9 Maintainer Review Findings: - No hidden installer path was introduced; install/service flows remain behind the explicit helper and installer boundary from Task 8. - sing-box generated config remains a derived artifact; no new source-of-truth JSON path was added. - The new adapter is currently test-imported directly like earlier Rust integration tests; a later integration cleanup should expose adapter modules through the stable crate entrypoint when package verification wires Local sing-box into commands. ### Task 10 PRE Review Mode: PRE Verdict: aligned. Findings: - No blocker findings in the plan contract. - Task 10 scope is documentation, final verification, target-perspective evidence, and the Windows app slice. - The acceptance gate requires honest handling of native Windows/Rust/service checks that cannot run in this environment. ### Task 10 POST Review Mode: POST Verdict: aligned with native verification blocker. Findings: - No blocker or major findings in the Task 10 documentation and verification updates. - README and roadmap now describe the separate Control App, Proxyfier Layer, and optional Local sing-box flows. - Browser evidence proves the MVP app surfaces and external SOCKS5 route line from the user's perspective. - Installer `-PlanOnly` evidence proves explicit component boundaries without side effects. - Native Tauri build, Rust tests, and real elevated service/helper behavior remain implemented but unproven until Rust/Cargo/MSVC and component binaries/services are available. ### Task 10 Correctness Review Findings: - `npm run build` passed after documentation updates. - Browser preview apply showed the intended generated ProxiFyre config path and staged helper response. - `cargo test` and `npm run tauri -- build` are blocked by missing `cargo`; this is recorded as an environment blocker rather than a passing result. - Real generated ProxiFyre file creation through Tauri commands is not proven in this environment because native command execution cannot run without the Rust toolchain. ### Task 10 Maintainer Review Findings: - No current Node gateway/client runtime files were changed for Windows behavior. - The Windows client README keeps operational knowledge local to `apps/windows-client`, while the root README points to it. - No additional source-of-truth path was introduced; docs keep JSON under `C:\ProgramData\VpnProxy\config` as source and generated files under `generated` as derived artifacts. - Residual cleanup for a future task: expose Rust modules through a stable crate entrypoint and run full native tests/build once the Windows toolchain is installed.