53 KiB
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.mdnow states that Windows app routing is planned as a separate Tauri 2 desktop utility, notAPP_MODE=windowsinside the current Node gateway/client server.docs/roadmap.mdnow listswindows-gamingas a standalone Tauri 2 app direction and points to this execution plan.docs/superpowers/specs/2026-05-21-windows-client-design.mdis marked superseded and points to the product/tech brief plus this plan.docs/superpowers/plans/2026-05-21-windows-client.mdis marked superseded and says not to execute the old NodeAPP_MODE=windowsplan.- 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-clientnow 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.rsnow defines Rust DTO/domain models for profiles, profile items, targets, component status, and activity entries.apps/windows-client/src-tauri/src/validation.rsnow normalizes profile and target inputs.apps/windows-client/src/domain/types.tsmirrors the Rust-facing DTOs for React/TypeScript callers.apps/windows-client/src-tauri/tests/domain_tests.rscontains 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.rsnow definesJsonStoragewith a default root ofC:\ProgramData\VpnProxy.- The storage paths split source config files under
config, activity understate, and future generated artifacts undergenerated. - Profiles, targets, components, and activity have typed JSON read/write methods.
- Writes create parent directories, write through a sibling
.tmpfile, and copy the existing source file to a sibling.bakfile before overwrite. - Missing files and invalid JSON fall back to empty collections instead of crashing callers.
apps/windows-client/src-tauri/src/activity.rsnow owns activity sorting, append, and cap behavior.apps/windows-client/src-tauri/tests/storage_tests.rscontains 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.rsnow defines theProxyRouterAdaptertrait, request DTO, generated config DTO, and structured adapter errors.apps/windows-client/src-tauri/src/adapters/proxifyre.rsnow definesProxiFyreAdapterand typedProxiFyreConfig/ProxiFyreProxyderived-config DTOs.- The ProxiFyre generated JSON follows the official ProxiFyre
app-config.jsonshape:logLevel,bypassLan,proxies,appNames,socks5ProxyEndpoint, andsupportedProtocols. - 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-singboxrequiringsingbox, 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.rscontains 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.rsnow defines structured Tauri command DTOs and handlers for status, profiles, targets, components, resolve preview, apply, and logs.apps/windows-client/src-tauri/src/main.rsnow registers the Task 6 commands throughtauri::generate_handler!.apps/windows-client/src/api/tauriCommands.tsnow exposes typed asyncinvoke(...)wrappers forget_status,get_profiles,save_profile,get_targets,save_target,get_components,resolve_profile_preview,apply_profiles, andget_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
ProxyRouterAdapterboundary, 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-singboxtarget with missing/stopped sing-box, records an error activity entry before returning a structured command error. apps/windows-client/src-tauri/tests/command_tests.rscontains 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.tsxnow 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.tsxnow 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.tsxnow 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.tsxnow provides an external proxy target editor and target list.apps/windows-client/src/features/components/ComponentsPage.tsxnow shows Control App, Proxyfier Layer, and Local sing-box as separate operable components with explicit actions.apps/windows-client/src/features/logs/LogsPage.tsxnow shows activity entries and copy diagnostics output.apps/windows-client/src/styles/app.cssnow 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.rsnow 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, andservice.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.rscontains 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, andinstall-singbox.ps1are 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.jsonremains narrow with onlycore: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.rsnow defines a separateSingBoxAdapterfor generated local sing-box config.- The generated config uses a local
mixedinbound on the configuredlocal-singboxtarget host/port, a direct outbound placeholder, androute.finalpointing at that outbound. SingBoxGenerationRequestaccepts an optional binary path;SingBoxCommandCheckerwrites a temporary config and runssing-box check -c <config>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
singboxcomponent is installed, running, and inComponentState::Running. apps/windows-client/src-tauri/tests/singbox_adapter_tests.rscontains 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.tsxnow renders the local sing-box target as an explicitinstall promptrow instead of a normal ready target when it requiressingbox.apps/windows-client/src/features/components/ComponentsPage.tsxnow 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.mdnow documents the Windows client component split, source JSON paths, generated artifact paths, development commands, native prerequisites, explicit installer boundaries, and MVP verification flow.README.mdnow 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.mdnow 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/: titleVPN 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-configwithGenerated config staged in preview modeand showedC:\ProgramData\VpnProxy\generated\proxifyre-app-config.json. - Installer
-PlanOnlycommands 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:
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 utilitydocs\roadmap.md:11:standalone Tauri 2 app + ProxiFyre adapter + optional native sing-box.exedocs\roadmap.md:91:- Standalone Tauri 2 + React/TypeScript + Rust app under apps/windows-clientdocs\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 activedocs\superpowers\plans\2026-05-21-windows-client.md:3:> Superseded: do not execute this Node APP_MODE=windows plan as the currentdocs\superpowers\plans\2026-05-21-windows-client.md:7:> Content below is retained for historical context and may contradict the active
Command:
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:
node --version
npm --version
cargo --version
rustc --version
Important output:
node:v26.4.0npm:11.17.0cargo: not recognizedrustc: not recognized
Command:
cd apps/windows-client
npm install
Important output:
added 72 packagesfound 0 vulnerabilities- npm warned that
esbuild@0.28.1has an install script not yet covered byallowScripts.
Command:
cd apps/windows-client
npm run build
Important output:
tsc && vite buildvite v7.3.6 building client environment for production36 modules transformedbuilt in 426ms
Command:
cd apps/windows-client
npm run tauri -- info
Important output:
- Tauri detected app config: framework
React, bundlerVite,frontendDist: ../dist,devUrl: http://localhost:5173/. - Tauri packages detected:
@tauri-apps/api 2.11.1,@tauri-apps/cli 2.11.4, Rust cratetauri: 2. - Environment blockers: no Visual Studio/MSVC Build Tools,
rustcnot installed,Cargonot installed,rustupnot installed.
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois 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: truefor 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:
cd apps/windows-client
npm run build
Important output:
tsc && vite build36 modules transformedbuilt in 424ms
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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, andrustup.
Command:
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 ProfileInputapps\windows-client\src-tauri\src\models.rs:92:pub struct TargetInputapps\windows-client\src-tauri\src\models.rs:117:pub struct ComponentStatusapps\windows-client\src-tauri\src\models.rs:132:pub struct ActivityEntryapps\windows-client\src-tauri\src\validation.rs:109:pub fn normalize_profileapps\windows-client\src-tauri\src\validation.rs:175:pub fn normalize_targetapps\windows-client\src-tauri\tests\domain_tests.rs:94:fn local_singbox_target_can_exist_before_component_is_installedapps\windows-client\src-tauri\tests\domain_tests.rs:111:fn rejects_malformed_target_fields
Task 4 Verification
Command:
cd apps/windows-client
npm run build
Important output:
tsc && vite build36 modules transformedbuilt in 395ms
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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:
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_rootapps\windows-client\src-tauri\src\storage.rs:79:pub fn read_profilesapps\windows-client\src-tauri\src\storage.rs:83:pub fn write_profilesapps\windows-client\src-tauri\src\storage.rs:150:pub fn backup_pathapps\windows-client\src-tauri\src\activity.rs:16:pub fn append_activityapps\windows-client\src-tauri\tests\storage_tests.rs:26:fn roundtrips_profiles_targets_components_and_activityapps\windows-client\src-tauri\tests\storage_tests.rs:55:fn invalid_json_falls_back_to_empty_collectionapps\windows-client\src-tauri\tests\storage_tests.rs:93:fn activity_entries_are_sorted_and_capped
Command:
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:
cd apps/windows-client
npm run build
Important output:
tsc && vite build36 modules transformedbuilt in 401ms
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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:
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 ProxyRouterAdapterapps\windows-client\src-tauri\src\adapters\proxifyre.rs:21:pub struct ProxiFyreAdapterapps\windows-client\src-tauri\src\adapters\proxifyre.rs:34:pub fn generate_proxifyre_configapps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:16:fn generates_proxifyre_config_for_discord_external_socks5_targetapps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:61:fn blocks_local_singbox_target_when_required_component_is_missingapps\windows-client\src-tauri\tests\proxifyre_adapter_tests.rs:92:fn rejects_http_target_because_proxifyre_adapter_is_socks5_only
Command:
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:
cd apps/windows-client
npm run build
Important output:
tsc && vite build38 modules transformedbuilt in 393ms
Command:
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:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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_statusapps\windows-client\src-tauri\src\commands.rs:289:pub fn get_profilesapps\windows-client\src-tauri\src\commands.rs:296:pub fn save_profileapps\windows-client\src-tauri\src\commands.rs:304:pub fn get_targetsapps\windows-client\src-tauri\src\commands.rs:309:pub fn save_targetapps\windows-client\src-tauri\src\commands.rs:317:pub fn get_componentsapps\windows-client\src-tauri\src\commands.rs:324:pub fn resolve_profile_previewapps\windows-client\src-tauri\src\commands.rs:331:pub fn apply_profilesapps\windows-client\src-tauri\src\commands.rs:343:pub fn get_logsapps\windows-client\src-tauri\tests\command_tests.rs:116:fn apply_generates_derived_config_and_records_activity_with_mock_helperapps\windows-client\src\api\tauriCommands.ts:96:return invoke<StatusResponse>('get_status')apps\windows-client\src\api\tauriCommands.ts:126:return invoke<ApplyProfilesResponse>('apply_profiles')
Command:
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_errorapps\windows-client\src-tauri\src\commands.rs:633:fn activity_for_apply_errorapps\windows-client\src-tauri\tests\command_tests.rs:116:fn apply_generates_derived_config_and_records_activity_with_mock_helperapps\windows-client\src-tauri\tests\command_tests.rs:158:fn apply_blocks_local_singbox_target_when_component_is_missing
Command:
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:
cd apps/windows-client
npm run build
Important output:
tsc && vite build38 modules transformedbuilt in 431ms
Command:
cd apps/windows-client
npm run dev -- --host 127.0.0.1
Important output:
VITE v7.3.6 ready in 206 msLocal: http://127.0.0.1:5173/
Command:
Invoke-WebRequest -UseBasicParsing -Uri 'http://127.0.0.1:5173/' | Select-Object StatusCode,Content
Important output:
StatusCode 200- Response content starts with
<!doctype html>.
Command:
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:<h2>External proxy first, local sing-box optional</h2>apps\windows-client\src\features\overview\OverviewPage.tsx:43:{isApplying ? 'Applying' : 'Apply changes'}apps\windows-client\src\features\profiles\ProfilesPage.tsx:48:Save profileapps\windows-client\src\features\targets\TargetsPage.tsx:27:Save targetapps\windows-client\src\features\logs\LogsPage.tsx:29:Copy diagnostics
Command:
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.mdand read before browser work. mcp__node_repl.jsbrowser setup failed withwindows sandbox failed: helper_unknown_error: setup refresh had errors.apply_patchalso failed with the same sandbox helper error, so Task 7 file edits were made with explicit escalatedSet-Contentfallback against Task 7-allowed files only.
Task 8 Verification
Command:
cd apps/windows-client
npm run build
Important output:
tsc && vite build38 modules transformedbuilt in 404ms
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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:
$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 okapps\windows-client\scripts\install-proxyfier.ps1 parser okapps\windows-client\scripts\install-singbox.ps1 parser ok
Command:
& '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:
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_requestapps\windows-client\src-tauri\src\helper.rs:159:pub fn proxifyre_apply_requestapps\windows-client\src-tauri\tests\helper_tests.rs:73:fn install_requests_are_explicit_component_actionsapps\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:
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:
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:
cd apps/windows-client
npm run build
Important output:
tsc && vite build38 modules transformedbuilt in 469ms
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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:
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 SingBoxAdapterapps\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_componentapps\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:
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:
cd apps/windows-client
npm run build
Important output:
tsc && vite build38 modules transformedbuilt in 428ms
Command:
cd apps/windows-client/src-tauri
cargo test
Result:
- Blocked:
cargois not recognized in the current environment.
Command:
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: ../distanddevUrl: http://localhost:5173/.
Command:
cd apps/windows-client
npm run tauri -- build
Result:
- Blocked:
failed to run 'cargo metadata' ... program not found.
Command:
$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 okapps\windows-client\scripts\install-proxyfier.ps1 parser okapps\windows-client\scripts\install-singbox.ps1 parser ok
Command:
$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
5173was already occupied by an unrelated page, so the Windows client dev server was started onhttp://127.0.0.1:5174/with--strictPort. - Initial app state payload included:
title:VPN Proxy WindowsrouteHeading:OverviewpanelHeading:External proxy first, local sing-box optionalrouteLine: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.jsonvisible. - Browser tab was closed after verification. The extra dev server on
5174was stopped. The attempted process for5173was already not running.
Command:
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.mdREADME.md:97:& .\scripts\install-control-app.ps1 -PlanOnlyREADME.md:98:& .\scripts\install-proxyfier.ps1 -PlanOnlyREADME.md:99:& .\scripts\install-singbox.ps1 -PlanOnlyREADME.md:107:C:\ProgramData\VpnProxy\configdocs\roadmap.md:89:Current checkpoint:apps\windows-client\README.md:60:cargo test
Command:
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=windowspath 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-clientTauri 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.rsso 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.
ProxyRouterAdapterkeeps 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.jsonformat with aproxieslist. - Component dependency checks are target-driven, so missing
singboxblocks only targets that declarerequires_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 onProxyRouterAdapterandProxyRouterGeneratedConfig. - 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
StagedApplyHelperwithout rewriting the UI wrapper. - Residual maintainability caveat:
src-tauri/src/lib.rsstill contains the original scaffoldrun()path without command registration because Task 6's allowed file list targetedmain.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, andsrc/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 buildpassed 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.tsxfor 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_patchwas unavailable due sandbox helper failure, so Task 7 edits used escalatedSet-Contentfallback; future edits should return toapply_patchwhen 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
-PlanOnlyevidence 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 buildpassed after Task 8 changes.- PowerShell parser checks passed for all three installer scripts.
-PlanOnlyoutput 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.rsowns 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.
SingBoxAdapteris separate fromProxiFyreAdapterand 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 buildpassed 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 checkexecution 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
-PlanOnlyevidence 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 buildpassed after documentation updates.- Browser preview apply showed the intended generated ProxiFyre config path and staged helper response.
cargo testandnpm run tauri -- buildare blocked by missingcargo; 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\configas source and generated files undergeneratedas 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.