ouroboros/scripts/download_node_standalone.ps1
Ouroboros 1cc0913173 rc(reliability): close subagent crash/ghost/spinner classes; provider-agnostic review; bundled node
Structurally closes the subagent worker-crash, ghost-task, and stuck-spinner
classes across all platforms, makes Ouroboros usable with any single provider
key, and ships node-runtime skill support.

- Workers: macOS/Windows use spawn (Linux keeps fork); central OUROBOROS_IN_WORKER
  no-proxy policy removes the macOS _scproxy fork SIGSEGV class. Signal crashes are
  terminal (no retry) for all task types.
- Lifecycle: monotonic write_task_result guard (terminal/cancel sticky); live
  cancel_task + cancel_requested latch; terminal task_done on every crash/kill/
  timeout/cancel path; snapshot restore skips terminal; schedule fail-fast when the
  worker pool is disabled. No ghosts, no perpetual spinner (incl. reconnect reconcile).
- Subagent UI: Variant A parent dashboard (in-place rows, child progress/terminal
  routed to parent, no duplicate child card).
- Providers: Cloud.ru is a first-class exclusive-direct provider (review/scope
  fallback + static pricing). New-user defaults: review claude-opus-4.8, Claude Code
  opus[1m]; existing anthropic-only migrate 4.6->4.8.
- Skills: skill_preflight tolerates missing/killed validators; build bundles a
  signed Node.js LTS (resolve_bundled_node) for node --check and node runtimes.
- Docs: README OuroborosHub badge/callout; ARCHITECTURE bundled-node + defaults.

Reviewed via multi-model adversarial (2 rounds) + Ouroboros triad/scope review
(converged). Local suite: 3207 passed, 1 skipped.
2026-05-29 22:48:13 +03:00

48 lines
2 KiB
PowerShell

# Downloads the official Node.js LTS runtime for Windows (x64), verifies it
# against the published SHASUMS256, and prunes it to just node.exe.
# Run from repo root: powershell -ExecutionPolicy Bypass -File scripts/download_node_standalone.ps1
$ErrorActionPreference = "Stop"
$NodeVersion = "v24.16.0" # Node.js LTS ("Krypton"); keep current with nodejs.org LTS
$Dest = "node-standalone"
$Name = "node-${NodeVersion}-win-x64"
$Filename = "${Name}.zip"
$BaseUrl = "https://nodejs.org/dist/${NodeVersion}"
$Url = "${BaseUrl}/${Filename}"
$ShasumsUrl = "${BaseUrl}/SHASUMS256.txt"
Write-Host "=== Downloading Node.js ${NodeVersion} for win-x64 ==="
Write-Host "URL: ${Url}"
if (Test-Path $Dest) { Remove-Item -Recurse -Force $Dest }
if (Test-Path "_node_tmp") { Remove-Item -Recurse -Force "_node_tmp" }
New-Item -ItemType Directory -Path "_node_tmp" | Out-Null
$ArchivePath = "_node_tmp\${Filename}"
Write-Host "Downloading..."
Invoke-WebRequest -Uri $Url -OutFile $ArchivePath -UseBasicParsing
Write-Host "Verifying SHASUMS256..."
$Shasums = (Invoke-WebRequest -Uri $ShasumsUrl -UseBasicParsing).Content
$Expected = ($Shasums -split "`n" | Where-Object { $_ -match [Regex]::Escape($Filename) } | Select-Object -First 1).Split(" ")[0]
if (-not $Expected) { throw "Could not find ${Filename} in ${ShasumsUrl}" }
$Actual = (Get-FileHash -Algorithm SHA256 $ArchivePath).Hash.ToLower()
if ($Expected.ToLower() -ne $Actual) {
throw "SHASUMS256 mismatch for ${Filename}: expected ${Expected}, got ${Actual}"
}
Write-Host "Checksum OK: ${Actual}"
Write-Host "Extracting..."
tar -xf $ArchivePath -C "_node_tmp"
# Keep only node.exe — drop npm/npx/corepack and node_modules.
New-Item -ItemType Directory -Path $Dest | Out-Null
Copy-Item "_node_tmp\${Name}\node.exe" "${Dest}\node.exe"
if (Test-Path "_node_tmp\${Name}\LICENSE") { Copy-Item "_node_tmp\${Name}\LICENSE" "${Dest}\LICENSE" }
Remove-Item -Recurse -Force "_node_tmp"
echo ""
Write-Host "=== Done ==="
Write-Host "Node: ${Dest}\node.exe"
& "${Dest}\node.exe" --version