diff --git a/CHANGELOG.md b/CHANGELOG.md index 5049d6f1..e5a55116 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ the frozen-backend fallback mirror it for their toolchains. - Tilde-separated number ranges are spoken clearly without running their endpoints together (#1821) — thanks @flutterkage2k! - Voice modes use themed tabs, with Synthesize and Convert pinned below their scrolling forms (#1823) - Fix current-user Windows installer validation and nested resource cleanup (#1873) +- Keep generated frontend assets available while building the current-user Windows installer (#1873) - Voice cloning now starts with a clear upload-or-record choice, reveals recording and reference details only when needed, and keeps sampling controls under Production Overrides (#1817) - The first-run welcome line uses an instruction accepted by OmniVoice and VoiceDesign engines (#1861) — thanks @psiberfunk! diff --git a/docs/install/windows.md b/docs/install/windows.md index d02a2eed..ce090491 100644 --- a/docs/install/windows.md +++ b/docs/install/windows.md @@ -308,8 +308,15 @@ stable per-user component identities, HKCU registry keypaths, and uninstall cleanup for nested resource folders. Missing or unrendered resources fail the build. The canonical system installer retains its per-machine authoring. -CI bundles both scopes with a tiny executable, an external helper, and nested -resources using the CLI version locked in `bun.lock`. The Windows MSI authoring +The per-user build reuses the system build's frontend output: its config clears +`beforeBuildCommand` so a second Vite build cannot replace the hashed files +referenced by the rendered WiX template. Keep using `tauri build` for the +per-user stage; it still recompiles the shell with its own product configuration. + +CI builds both scopes with a tiny executable, an external helper, and nested +resources using the CLI version locked in `bun.lock`. Its frontend-like build +hook rotates resource filenames, verifying the per-user build preserves the +system build's resource snapshot. The Windows MSI authoring job runs after the test suite and preserves verbose WiX logs and rendered XML. For focused diagnosis, dispatch CI with `windows_wix_diagnostic=true`; it skips the other jobs and never signs, publishes, or installs the fixture bundles. diff --git a/frontend/src-tauri/tauri.per-user.conf.json b/frontend/src-tauri/tauri.per-user.conf.json index a669693d..45632ab7 100644 --- a/frontend/src-tauri/tauri.per-user.conf.json +++ b/frontend/src-tauri/tauri.per-user.conf.json @@ -1,6 +1,9 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "productName": "VoiceStudio (Current User)", + "build": { + "beforeBuildCommand": null + }, "bundle": { "targets": ["msi"], "createUpdaterArtifacts": true, diff --git a/tests/test_windows_per_user_installer.py b/tests/test_windows_per_user_installer.py index 16b4b5c7..01c5de86 100644 --- a/tests/test_windows_per_user_installer.py +++ b/tests/test_windows_per_user_installer.py @@ -52,6 +52,9 @@ def test_machine_and_per_user_templates_have_distinct_scopes_and_roots(): def test_per_user_bundle_has_separate_identity_and_no_elevated_update_task(): config = json.loads(CONFIG.read_text(encoding="utf-8")) assert config["productName"].endswith("(Current User)") + # The WiX resource snapshot comes from the preceding system build. + # Null deletes the inherited hook via Tauri's JSON Merge Patch. + assert config["build"]["beforeBuildCommand"] is None wix = config["bundle"]["windows"]["wix"] assert wix["upgradeCode"] == "f27de3a8-a9dc-4a3d-84bb-e98f1bf82393" assert wix["enableElevatedUpdateTask"] is False