Skip to content

Commit 1252378

Browse files
committed
fix(installer): unblock Windows source installs
1 parent def4b51 commit 1252378

2 files changed

Lines changed: 19 additions & 21 deletions

File tree

scripts/install.ps1

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -901,22 +901,16 @@ function Ensure-Pnpm {
901901
}
902902
}
903903
Write-Host "[*] Installing pnpm..." -ForegroundColor Yellow
904-
$prevScriptShell = $env:NPM_CONFIG_SCRIPT_SHELL
905-
$env:NPM_CONFIG_SCRIPT_SHELL = "cmd.exe"
904+
$pnpmInstalled = $false
906905
try {
906+
Invoke-NpmCommand -Arguments @("install", "-g", $pnpmSpec)
907+
$pnpmInstalled = ($LASTEXITCODE -eq 0)
908+
} catch {
907909
$pnpmInstalled = $false
908-
try {
909-
Invoke-NpmCommand -Arguments @("install", "-g", $pnpmSpec)
910-
$pnpmInstalled = ($LASTEXITCODE -eq 0)
911-
} catch {
912-
$pnpmInstalled = $false
913-
}
914-
if (-not $pnpmInstalled) {
915-
Write-Host "[!] pnpm install hit an existing or broken shim; retrying with --force" -ForegroundColor Yellow
916-
Invoke-NpmCommand -Arguments @("install", "-g", "--force", $pnpmSpec)
917-
}
918-
} finally {
919-
$env:NPM_CONFIG_SCRIPT_SHELL = $prevScriptShell
910+
}
911+
if (-not $pnpmInstalled) {
912+
Write-Host "[!] pnpm install hit an existing or broken shim; retrying with --force" -ForegroundColor Yellow
913+
Invoke-NpmCommand -Arguments @("install", "-g", "--force", $pnpmSpec)
920914
}
921915
if (-not (Test-PnpmCommandMatchesVersion -PnpmVersion $pnpmVersion -RepoDir $RepoDir)) {
922916
throw "pnpm install completed, but $pnpmSpec is not first on PATH."
@@ -1196,15 +1190,13 @@ function Install-OpenClaw {
11961190
$prevUpdateNotifier = $env:NPM_CONFIG_UPDATE_NOTIFIER
11971191
$prevFund = $env:NPM_CONFIG_FUND
11981192
$prevAudit = $env:NPM_CONFIG_AUDIT
1199-
$prevScriptShell = $env:NPM_CONFIG_SCRIPT_SHELL
12001193
$prevNodeLlamaSkipDownload = $env:NODE_LLAMA_CPP_SKIP_DOWNLOAD
12011194
$prevBefore = $env:NPM_CONFIG_BEFORE
12021195
$prevMinReleaseAge = $env:NPM_CONFIG_MIN_RELEASE_AGE
12031196
$env:NPM_CONFIG_LOGLEVEL = "error"
12041197
$env:NPM_CONFIG_UPDATE_NOTIFIER = "false"
12051198
$env:NPM_CONFIG_FUND = "false"
12061199
$env:NPM_CONFIG_AUDIT = "false"
1207-
$env:NPM_CONFIG_SCRIPT_SHELL = "cmd.exe"
12081200
$env:NODE_LLAMA_CPP_SKIP_DOWNLOAD = "1"
12091201
Remove-Item Env:NPM_CONFIG_BEFORE -ErrorAction SilentlyContinue
12101202
Remove-Item Env:NPM_CONFIG_MIN_RELEASE_AGE -ErrorAction SilentlyContinue
@@ -1228,7 +1220,6 @@ function Install-OpenClaw {
12281220
$env:NPM_CONFIG_UPDATE_NOTIFIER = $prevUpdateNotifier
12291221
$env:NPM_CONFIG_FUND = $prevFund
12301222
$env:NPM_CONFIG_AUDIT = $prevAudit
1231-
$env:NPM_CONFIG_SCRIPT_SHELL = $prevScriptShell
12321223
$env:NODE_LLAMA_CPP_SKIP_DOWNLOAD = $prevNodeLlamaSkipDownload
12331224
$env:NPM_CONFIG_BEFORE = $prevBefore
12341225
$env:NPM_CONFIG_MIN_RELEASE_AGE = $prevMinReleaseAge
@@ -1272,7 +1263,6 @@ function Install-OpenClawFromGit {
12721263

12731264
Remove-LegacySubmodule -RepoDir $RepoDir
12741265

1275-
$prevPnpmScriptShell = $env:NPM_CONFIG_SCRIPT_SHELL
12761266
$prevPnpmChildConcurrency = $env:PNPM_CONFIG_CHILD_CONCURRENCY
12771267
$prevPnpmNetworkConcurrency = $env:PNPM_CONFIG_NETWORK_CONCURRENCY
12781268
$prevPnpmWorkspaceConcurrency = $env:PNPM_CONFIG_WORKSPACE_CONCURRENCY
@@ -1284,7 +1274,6 @@ function Install-OpenClawFromGit {
12841274
if (-not $pnpmCommand) {
12851275
throw "pnpm not found after installation."
12861276
}
1287-
$env:NPM_CONFIG_SCRIPT_SHELL = "cmd.exe"
12881277
$env:PNPM_CONFIG_CHILD_CONCURRENCY = "1"
12891278
$env:PNPM_CONFIG_NETWORK_CONCURRENCY = "4"
12901279
$env:PNPM_CONFIG_WORKSPACE_CONCURRENCY = "1"
@@ -1332,7 +1321,6 @@ function Install-OpenClawFromGit {
13321321
if ($pushedRepoLocation) {
13331322
Pop-Location
13341323
}
1335-
$env:NPM_CONFIG_SCRIPT_SHELL = $prevPnpmScriptShell
13361324
$env:PNPM_CONFIG_CHILD_CONCURRENCY = $prevPnpmChildConcurrency
13371325
$env:PNPM_CONFIG_NETWORK_CONCURRENCY = $prevPnpmNetworkConcurrency
13381326
$env:PNPM_CONFIG_WORKSPACE_CONCURRENCY = $prevPnpmWorkspaceConcurrency

test/scripts/install-ps1.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ describe("install.ps1 failure handling", () => {
9696
expect(npmInstallBody).toContain('$env:NPM_CONFIG_UPDATE_NOTIFIER = "false"');
9797
expect(npmInstallBody).toContain('$env:NPM_CONFIG_FUND = "false"');
9898
expect(npmInstallBody).toContain('$env:NPM_CONFIG_AUDIT = "false"');
99-
expect(npmInstallBody).toContain('$env:NPM_CONFIG_SCRIPT_SHELL = "cmd.exe"');
99+
expect(npmInstallBody).not.toContain("NPM_CONFIG_SCRIPT_SHELL");
100100
expect(npmInstallBody).toContain('$freshnessArgs = @("--min-release-age=0")');
101101
expect(npmInstallBody).toContain("Remove-Item Env:NPM_CONFIG_BEFORE");
102102
expect(npmInstallBody).toContain("Remove-Item Env:NPM_CONFIG_MIN_RELEASE_AGE");
@@ -117,6 +117,16 @@ describe("install.ps1 failure handling", () => {
117117
expect(source).toContain("Get-Content -LiteralPath $latestLog -Tail 120");
118118
});
119119

120+
it("does not force npm or pnpm lifecycle scripts through cmd.exe", () => {
121+
const ensurePnpmBody = extractFunctionBody(source, "Ensure-Pnpm");
122+
const npmInstallBody = extractFunctionBody(source, "Install-OpenClaw");
123+
const gitInstallBody = extractFunctionBody(source, "Install-OpenClawFromGit");
124+
125+
expect(ensurePnpmBody).not.toContain("NPM_CONFIG_SCRIPT_SHELL");
126+
expect(npmInstallBody).not.toContain("NPM_CONFIG_SCRIPT_SHELL");
127+
expect(gitInstallBody).not.toContain("NPM_CONFIG_SCRIPT_SHELL");
128+
});
129+
120130
it("runs Windows command shims from a Windows-local cwd", () => {
121131
const commandSafeBody = extractFunctionBody(source, "Invoke-CommandFromWindowsSafeDirectory");
122132
const npmCommandBody = extractFunctionBody(source, "Invoke-NpmCommand");

0 commit comments

Comments
 (0)