fix(windows): align install.ps1 MSI with per-machine scope (#913)#1187
Conversation
…sai#913) - Drop MSIINSTALLPERUSER/ALLUSERS=2 (conflicts with Tauri WiX perMachine MSI; 1603). - Elevate msiexec via -Verb RunAs when not admin. - Add PowerShell unit tests + installer-smoke windows job; pnpm test:install-ps1. Co-authored-by: Cursor <cursoragent@cursor.com>
📝 WalkthroughWalkthroughAdds Windows-specific installer helpers and elevation-aware install flow to the PowerShell installer, a PowerShell test runner validating those helpers, CI updates to run the tests then perform an installer dry-run, and bumps the reported installer version to 1.1.0. ChangesWindows installer refactor & CI test
Sequence Diagram(s)sequenceDiagram
participant GH_Actions as "GitHub Actions\n(installer-smoke)"
participant PWsh as "PowerShell Tests\n(OpenHumanWindowsInstall.Tests.ps1)"
participant Installer as "Install Script\n(scripts/install.ps1)"
participant GH_API as "GitHub Releases API"
participant MSI as "msiexec / UAC"
GH_Actions->>PWsh: checkout repo\nrun test script
PWsh->>Installer: dot-source helpers\nrun unit tests
PWsh-->>GH_Actions: exit 0/1
GH_Actions->>Installer: run install.ps1 -DryRun
Installer->>GH_API: query latest release assets
GH_API-->>Installer: return assets
Installer->>Installer: Select asset & build msiexec args
alt not elevated
Installer->>MSI: display RunAs instruction (DryRun) / start msiexec with -Verb RunAs
else elevated
Installer->>MSI: display direct msiexec args (DryRun) / start msiexec directly
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Review rate limit: 4/5 reviews remaining, refill in 12 minutes. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@scripts/install.ps1`:
- Around line 202-207: The dry-run branch always prints a "(non-admin)
Start-Process ... -Verb RunAs" message even when the process is elevated; modify
the DryRun handling in the if ($DryRun) block so it calls
Test-OpenHumanWindowsProcessElevated and conditionally prints either the
non-admin RunAs message or an "(already elevated) Start-Process msiexec -Wait
-ArgumentList <above>" message accordingly; locate the DryRun branch that uses
Get-OpenHumanMsiexecInstallArgumentList and update it to branch on
Test-OpenHumanWindowsProcessElevated to emit the correct hint for elevated vs
non-elevated execution.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 5e5ec95f-e37d-474c-bd24-c661da4db214
📒 Files selected for processing (4)
.github/workflows/installer-smoke.ymlpackage.jsonscripts/install.ps1scripts/tests/OpenHumanWindowsInstall.Tests.ps1
Dry-run now mirrors the real install path: print RunAs only when not elevated, otherwise print the direct msiexec -Wait hint. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@scripts/install.ps1`:
- Around line 23-33: The Get-OpenHumanMsiexecInstallArgumentList function
currently returns the raw $MsiPath as an array element which can be split if it
contains spaces; update the function so the MSI path element is properly quoted
(e.g., wrap $MsiPath in double quotes) before returning the ArgumentList array
so Start-Process will pass the full path as a single argument to msiexec; keep
the rest of the returned switches (/i, '/qn', '/norestart') unchanged and ensure
the quoted path is the second array element.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 91ff2301-fa61-4273-90df-a86fd8d80524
📒 Files selected for processing (1)
scripts/install.ps1
| function Get-OpenHumanMsiexecInstallArgumentList { | ||
| <# | ||
| .SYNOPSIS | ||
| Argument list for Start-Process msiexec.exe (no per-user MSI overrides). | ||
| #> | ||
| param( | ||
| [Parameter(Mandatory = $true)] | ||
| [string]$MsiPath | ||
| ) | ||
| return @('/i', $MsiPath, '/qn', '/norestart') | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's look at the full context of the install.ps1 file
head -250 scripts/install.ps1 | tail -+1Repository: tinyhumansai/openhuman
Length of output: 134
🏁 Script executed:
# Also search for where this helper is being called
rg "Get-OpenHumanMsiexecInstallArgumentList" scripts/install.ps1 -A 5 -B 2Repository: tinyhumansai/openhuman
Length of output: 1212
🌐 Web query:
Start-Process -ArgumentList PowerShell spaces quoting behavior
💡 Result:
PowerShell's Start-Process cmdlet with -ArgumentList has a longstanding bug where it joins array elements with spaces without automatically quoting arguments containing spaces or special characters. This causes arguments with spaces to be split incorrectly by the target process. Key behavior from official docs: - -ArgumentList accepts a string array or single string. - Array elements are joined into a single string separated by single spaces. - No automatic quoting: arguments with spaces or quotes must have embedded escaped double quotes (e.g., ""path with spaces""). - Best practice: Use a single string for all arguments with proper embedded quoting. Examples: Single string (recommended): Start-Process cmd.exe -ArgumentList "/c dir "C:\Program Files"" Array (requires manual quoting): Start-Process cmd.exe -ArgumentList "/c", "dir", ""C:\Program Files"" This bug (#5576) remains open as of 2025; won't be fixed for backward compatibility. Workaround: manual embedded quoting or direct invocation (& exe args) where PowerShell auto-quotes. For paths/files with spaces, always embed quotes like '"path with spaces"' in the argument string/array element.
Citations:
- 1: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.5
- 2: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.6
- 3: Start-Process doesn't pass arguments with embedded whitespace and double quotes correctly PowerShell/PowerShell#5576
- 4: https://github.com/MicrosoftDocs/PowerShell-Docs/blob/main/reference/7.4/Microsoft.PowerShell.Management/Start-Process.md
- 5: https://stackoverflow.com/questions/75048543/pass-arguments-to-start-process-with-spaces
- 6: https://stackoverflow.com/questions/79388953/running-a-powershell-start-process-command-with-arguments-containing-spaces-fr
- 7: https://stackoverflow.com/questions/67217049/passing-an-argument-list-with-spaces-in-powershell
- 8: https://stackoverflow.com/questions/70479960/how-to-pass-an-array-to-the-arguments-in-start-process-in-powershell
- 9: https://serverfault.com/questions/216790/pass-quoted-argument-string-to-start-process-in-powershell
🏁 Script executed:
# Check where $tmpFile is defined and used
rg '\$tmpFile' scripts/install.ps1 -B 2 -A 2 | head -60Repository: tinyhumansai/openhuman
Length of output: 1692
🏁 Script executed:
# Check the full context of the MSI invocation to ensure quoting is complete
sed -n '195,230p' scripts/install.ps1Repository: tinyhumansai/openhuman
Length of output: 1588
🏁 Script executed:
# Let's verify the proposed fix syntax is valid PowerShell
# and check if there are any other arguments that need quoting
cat > /tmp/test_quote.ps1 << 'EOF'
# Test the proposed quoting syntax
$MsiPath = "C:\Users\Test User\AppData\Local\Temp\OpenHuman.msi"
# Current implementation (WRONG)
$currentImpl = @('/i', $MsiPath, '/qn', '/norestart')
Write-Host "Current implementation:"
Write-Host ($currentImpl | ConvertTo-Json -Compress)
Write-Host "Joined: $($currentImpl -join ' ')"
Write-Host ""
# Proposed implementation (CORRECT)
$proposedImpl = @('/i', ('"{0}"' -f $MsiPath), '/qn', '/norestart')
Write-Host "Proposed implementation:"
Write-Host ($proposedImpl | ConvertTo-Json -Compress)
Write-Host "Joined: $($proposedImpl -join ' ')"
EOF
pwsh -NoProfile -File /tmp/test_quote.ps1Repository: tinyhumansai/openhuman
Length of output: 450
🏁 Script executed:
# Check if there are any other MSI-related invocations that might need review
rg "msiexec" scripts/install.ps1 -iRepository: tinyhumansai/openhuman
Length of output: 1037
Quote the MSI path to handle spaces in the temp directory.
Line 32 currently returns the raw MSI path as an array element to -ArgumentList. PowerShell's Start-Process joins array elements with spaces without automatic quoting, so the path will be incorrectly split if $env:TEMP contains spaces (common in Windows profiles with user names like "User Name"). This causes msiexec to receive multiple arguments instead of one quoted path, breaking silent installs.
Suggested fix
function Get-OpenHumanMsiexecInstallArgumentList {
<#
.SYNOPSIS
Argument list for Start-Process msiexec.exe (no per-user MSI overrides).
#>
param(
[Parameter(Mandatory = $true)]
[string]$MsiPath
)
- return @('/i', $MsiPath, '/qn', '/norestart')
+ return @('/i', ('"{0}"' -f $MsiPath), '/qn', '/norestart')
}🧰 Tools
🪛 PSScriptAnalyzer (1.25.0)
[warning] Missing BOM encoding for non-ASCII encoded file 'install.ps1'
(PSUseBOMForUnicodeEncodedFile)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@scripts/install.ps1` around lines 23 - 33, The
Get-OpenHumanMsiexecInstallArgumentList function currently returns the raw
$MsiPath as an array element which can be split if it contains spaces; update
the function so the MSI path element is properly quoted (e.g., wrap $MsiPath in
double quotes) before returning the ArgumentList array so Start-Process will
pass the full path as a single argument to msiexec; keep the rest of the
returned switches (/i, '/qn', '/norestart') unchanged and ensure the quoted path
is the second array element.
Responds to CodeRabbit on PR tinyhumansai#1187: string[] ArgumentList keeps paths with spaces as one token; dry-run elevation hint already fixed on branch. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
♻️ Duplicate comments (1)
scripts/install.ps1 (1)
32-35:⚠️ Potential issue | 🟠 Major | ⚡ Quick winQuote the MSI path token before passing it to
Start-Process -ArgumentList.At Line 35, returning raw
$MsiPathcan break installs when the temp path contains spaces, becauseStart-Processargument-list joining may not preserve it as one native argv token formsiexec. This is the root cause for intermittent path-based failures.Suggested fix
- return @('/i', $MsiPath, '/qn', '/norestart') + return @('/i', ('"{0}"' -f $MsiPath), '/qn', '/norestart')In PowerShell 7.x, when using Start-Process -ArgumentList with a string array, are elements containing spaces automatically quoted for the native process, or must embedded quotes be supplied manually?🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@scripts/install.ps1` around lines 32 - 35, The returned argument array currently returns the raw $MsiPath token which can be split when the temp path contains spaces; update the array construction in scripts/install.ps1 so the MSI path element is explicitly quoted before being returned (ensure the element passed to Start-Process -ArgumentList is a single quoted string token containing the full path), e.g., wrap $MsiPath in quotes or otherwise escape it so Start-Process receives one native argv for msiexec; keep the other tokens ('/i','/qn','/norestart') unchanged and verify the change is used by the code that calls Start-Process -ArgumentList.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@scripts/install.ps1`:
- Around line 32-35: The returned argument array currently returns the raw
$MsiPath token which can be split when the temp path contains spaces; update the
array construction in scripts/install.ps1 so the MSI path element is explicitly
quoted before being returned (ensure the element passed to Start-Process
-ArgumentList is a single quoted string token containing the full path), e.g.,
wrap $MsiPath in quotes or otherwise escape it so Start-Process receives one
native argv for msiexec; keep the other tokens ('/i','/qn','/norestart')
unchanged and verify the change is used by the code that calls Start-Process
-ArgumentList.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: f78e47c7-9b2d-4d8b-9c5e-e1a192253d2c
📒 Files selected for processing (2)
scripts/install.ps1scripts/tests/OpenHumanWindowsInstall.Tests.ps1
* feat(remotion): Ghosty character library with transparent MOV variants (tinyhumansai#1059) Co-authored-by: WOZCODE <contact@withwoz.com> * feat(composio/gmail): sync into memory tree (Slack-parity) (tinyhumansai#1056) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(scheduler-gate): throttle background AI on battery / busy CPU (tinyhumansai#1062) * fix(core,cef): run core in-process and stop orphaning CEF helpers on Cmd+Q (tinyhumansai#1061) * ci: add dedicated staging release workflow (tinyhumansai#1066) * fix(sentry): Rust source context + per-release deploy marker (tinyhumansai#405) (tinyhumansai#1067) * fix(welcome): re-enable OAuth buttons with focus/timeout recovery (tinyhumansai#1049) (tinyhumansai#1069) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(dependencies): update pnpm-lock.yaml and Cargo.lock for package… (tinyhumansai#1082) * fix(onboarding): personalize welcome agent greeting with user identity (tinyhumansai#1078) * fix(chat): make agent message bubbles fit content width (tinyhumansai#1083) * Feat/dmg checks (tinyhumansai#1084) * fix(linux): Add X11 platform flags to .deb package launcher (tinyhumansai#1087) Co-authored-by: unn-Known1 <unn-known1@users.noreply.github.com> * fix(sentry): auto-send React events; collapse core→tauri for desktop (tinyhumansai#1086) Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai> * fix(cef): run blank reload guard on the CEF UI thread (tinyhumansai#1092) * fix(app): reload webview instead of restart_app in dev mode (tinyhumansai#1068) (tinyhumansai#1071) * fix(linux): deliver X11 ozone flags via custom .desktop template (tinyhumansai#1091) * fix(webview-accounts): retry data-dir purge so CEF handle race doesn't leak cookies (tinyhumansai#1076) (tinyhumansai#1081) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai> * fix(webview/slack): media perms + deep-link isolation (tinyhumansai#1074) (tinyhumansai#1080) Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai> * ci(release): split staging vs production workflows; promote staging tags (tinyhumansai#1094) * Update release-staging.yml (tinyhumansai#1097) * chore(staging): v0.53.5 * chore(staging): v0.53.6 * ci(staging): cut staging from main; add act local-debug helper (tinyhumansai#1099) * chore(staging): v0.53.7 * fix(ci): correct sentry-cli download URL and trap scope (tinyhumansai#1100) * chore(staging): v0.53.8 * feat(chat): forward thread_id to backend for KV cache locality (tinyhumansai#1095) * fix(ci): bump pinned sentry-cli to 3.4.1 (2.34.2 was never published) (tinyhumansai#1102) * chore(staging): v0.53.9 * fix(ci): drop bash trap in upload_sentry_symbols.sh; inline cleanup (tinyhumansai#1103) * chore(staging): v0.53.10 * refactor(session): flatten session_raw/, switch md to YYYY_MM_DD (tinyhumansai#1098) * Add full Composio managed-auth toolkit catalog (tinyhumansai#1093) * ci: add diff-aware 80% coverage gate (Vitest + cargo-llvm-cov) (tinyhumansai#1104) * feat(scripts): pnpm work + pnpm debug for agent-driven workflows (tinyhumansai#1105) * ci: pull pnpm into CI image, drop redundant setup steps (tinyhumansai#1107) * docs: add Cursor Cloud specific instructions to AGENTS.md (tinyhumansai#1106) Co-authored-by: Cursor Agent <cursoragent@cursor.com> * chore(staging): v0.53.11 * docs: surface 80% coverage gate and scripts/debug runners (tinyhumansai#1108) * feat(app): show Composio integrations as sorted icon grid on Skills (tinyhumansai#1109) Co-authored-by: Cursor Agent <cursoragent@cursor.com> * feat(composio): client-side trigger enable/disable toggles (tinyhumansai#1110) * feat(skills): channels grid + integrations card polish; tolerant Composio trigger decode (tinyhumansai#1112) * chore(staging): v0.53.12 * feat(home): early-bird banner + assistant→agent terminology (tinyhumansai#1113) * feat(updater): in-app auto-update with auto-download + restart prompt (tinyhumansai#677) (tinyhumansai#1114) * chore(claude): add ship-and-babysit slash command (tinyhumansai#1115) * feat(home): EarlyBirdyBanner + agent terminology + LinkedIn enrichment model pin (tinyhumansai#1118) * fix(chat): single onboarding thread in sidebar after wizard (tinyhumansai#1116) Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Steven Enamakel <senamakel@users.noreply.github.com> * fix: filter out global namespace from citation chips (tinyhumansai#1124) Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com> * feat(nav): enable Memory tab in BottomTabBar (tinyhumansai#1125) * feat(memory): singleton ingestion + status RPC + UI pill (tinyhumansai#1126) * feat(human): mascot tab with viseme-driven lipsync (staging only) (tinyhumansai#1127) * Fix CEF zombie processes on full app close and restart (tinyhumansai#1128) Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com> Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai> * Update issue templates for GitHub issue types (tinyhumansai#1146) * feat(human): expand mascot expressions and tighten reply-speech state machine (tinyhumansai#1147) * feat(memory): ingestion pipeline + tree-architecture docs + ops/schemas split (tinyhumansai#1142) * feat(threads): surface live subagent work in parent thread (tinyhumansai#1122) (tinyhumansai#1159) * fix(human): keep mascot mouth animating when TTS ships no viseme data (tinyhumansai#1160) * feat(composio): consume backend markdownFormatted for LLM output (tinyhumansai#1165) * fix(subagent): lazy-register toolkit actions filtered out of fuzzy top-K (tinyhumansai#1162) * feat(memory): user-facing long-term memory window preset (tinyhumansai#1137) (tinyhumansai#1161) * fix(tauri-shell): proactively kill stale openhuman RPC on startup (tinyhumansai#1166) * chore(staging): v0.53.13 * fix(composio): per-action tool consumes backend markdownFormatted (tinyhumansai#1167) * fix(threads): persist selectedThreadId across reloads (tinyhumansai#1168) * feat(memory_tree): switch embed model to bge-m3 (1024-dim, 8K context) (tinyhumansai#1174) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(agent): drop redundant [Memory context] recall injection (tinyhumansai#1173) * chore(memory_tree): drop body-read timeouts on Ollama HTTP calls (tinyhumansai#1171) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(transcript): emit thread_id + fix orchestrator missing cost (tinyhumansai#1169) * fix(composio/gmail): phase out html2md, prefer text/plain MIME part (tinyhumansai#1170) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(tools): markdown output for internal tool results (tinyhumansai#1172) * feat(security): enforce prompt-injection guard before model and tool execution (tinyhumansai#1175) * fix(cef): popup paint dies after first frame — skip blank-page guard for popups (tinyhumansai#1079) (tinyhumansai#1182) Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com> * chore(sentry): rename OPENHUMAN_SENTRY_DSN → OPENHUMAN_CORE_SENTRY_DSN (tinyhumansai#1186) * feat(remotion): add yellow mascot character with all animation variants (tinyhumansai#1193) Co-authored-by: Neel Mistry <neelmistry@Neels-MacBook-Pro.local> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(composio): hide raw connection ID, derive friendly label (tinyhumansai#1153) (tinyhumansai#1185) Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> * fix(windows): align install.ps1 MSI with per-machine scope (tinyhumansai#913) (tinyhumansai#1187) Co-authored-by: Cursor <cursoragent@cursor.com> * fix(tauri): deterministic CEF teardown on full app close (tinyhumansai#1120) (tinyhumansai#1189) Co-authored-by: Cursor <cursoragent@cursor.com> * fix(composio): cap Gmail HTML body before strip (crash mitigation) (tinyhumansai#1191) Co-authored-by: Cursor <cursoragent@cursor.com> * fix(auth): stop stale chat threads after signup (tinyhumansai#1192) Co-authored-by: Cursor <cursoragent@cursor.com> * feat(sentry): staging-only "Trigger Sentry Test" button (tinyhumansai#1072) (tinyhumansai#1183) * chore(staging): v0.53.14 * chore(staging): v0.53.15 * feat(composio): format trigger slugs into human-readable labels (tinyhumansai#1129) (tinyhumansai#1179) Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> * fix(ui): hide unsupported permission UI on non-macOS for Screen Intelligence (tinyhumansai#1194) Co-authored-by: Cursor <cursoragent@cursor.com> * chore(tauri-shell): retire embedded Gmail webview-account flow (tinyhumansai#1181) * feat(onboarding): replace welcome-agent bot with react-joyride walkthrough (tinyhumansai#1180) * chore(release): v0.53.16 * fix(threads): preserve selectedThreadId on cold-boot identity hydration (tinyhumansai#1196) * feat(core): version/shutdown/update RPCs + mid-thread integration refresh (tinyhumansai#1195) * fix(mascot): swap to yellow mascot via @remotion/player (tinyhumansai#1200) * feat(memory_tree): cloud-default LLM, queue priority, entity filter, Memory tab UI (tinyhumansai#1198) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Persist turn state + restore conversation history on cold-boot (tinyhumansai#1202) * feat(mascot): floating desktop mascot via native NSPanel + WKWebView (macOS) (tinyhumansai#1203) * fix(memory/tree): emit summary children as Obsidian wikilinks (tinyhumansai#1210) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(tools): coding-harness baseline primitives (tinyhumansai#1205) (tinyhumansai#1208) * docs: add Codex PR checklist for remote agents --------- Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com> Co-authored-by: WOZCODE <contact@withwoz.com> Co-authored-by: sanil-23 <sanil@vezures.xyz> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Cyrus Gray <144336577+graycyrus@users.noreply.github.com> Co-authored-by: CodeGhost21 <164498022+CodeGhost21@users.noreply.github.com> Co-authored-by: oxoxDev <164490987+oxoxDev@users.noreply.github.com> Co-authored-by: Mega Mind <146339422+M3gA-Mind@users.noreply.github.com> Co-authored-by: Gaurang Patel <ptelgm.yt@gmail.com> Co-authored-by: unn-Known1 <unn-known1@users.noreply.github.com> Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Steven Enamakel <senamakel@users.noreply.github.com> Co-authored-by: Steven Enamakel's Droid <enamakel.agent@tinyhumans.ai> Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com> Co-authored-by: YellowSnnowmann <167776381+YellowSnnowmann@users.noreply.github.com> Co-authored-by: Neil <neil@maha.xyz> Co-authored-by: Neel Mistry <neelmistry@Neels-MacBook-Pro.local> Co-authored-by: obchain <167975049+obchain@users.noreply.github.com> Co-authored-by: Jwalin Shah <jshah1331@gmail.com>
Summary
MSIINSTALLPERUSER/ALLUSERS=2frommsiexecso silent install matches the Tauri WiX package (InstallScope="perMachine"), addressing MSI 1603 failures frominstall.ps1(see Windows installer exits with MSI error 1603 during OpenHuman install #913).msiexecvia-Verb RunAswhen the shell is not already admin so UAC can approve a machine-wide install (still works withirm … | iex).scripts/tests/OpenHumanWindowsInstall.Tests.ps1,pnpm test:install-ps1, and enable the Windows job ininstaller-smoke.yml.Problem
GitHub #913:
install.ps1verified the MSI download and SHA256, thenmsiexecexited 1603. The script passed per-user public properties while the shipped MSI is authored per-machine (Program Files, HKLM), which commonly produces a fatal install.Solution
/i <msi> /qn /norestartwith no conflicting ALLUSERS/MSIINSTALLPERUSER overrides.msiexecchild process when needed.windows-latest.Submission Checklist
N/A: PowerShell + workflow only (no Vitest/Rust diff-cover surface).N/A.N/A.N/A.Impact
installer-smokeruns Windows tests +install.ps1 -DryRun.Related
Closes #913
Summary by CodeRabbit
New Features
Tests
Chores