ralph 0.1.5

A CLI agent harness for running AI coding agents (Codex, Claude, Pi, Gemini)
$ErrorActionPreference = "Stop"

$Repo = "madhavajay/ralph"
$BinName = "ralph"

function Fail {
    param([string]$Message)
    Write-Error $Message
    Write-Error "If no prebuilt binary is available, use: cargo install ralph"
    exit 1
}

$Arch = $env:PROCESSOR_ARCHITECTURE
switch ($Arch) {
    "AMD64" { $Arch = "x86_64" }
    "ARM64" { $Arch = "aarch64" }
    default { Fail "unsupported arch: $Arch" }
}

$Target = "$Arch-pc-windows-msvc"
$Asset = "$BinName-$Target.zip"
$Url = "https://github.com/$Repo/releases/latest/download/$Asset"

$TempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Force -Path $TempDir | Out-Null
$ZipPath = Join-Path $TempDir $Asset

try {
    Invoke-WebRequest -Uri $Url -OutFile $ZipPath
} catch {
    Fail "failed to download $Url"
}

try {
    Expand-Archive -Path $ZipPath -DestinationPath $TempDir -Force
} catch {
    Fail "failed to extract $ZipPath"
}

$BinPath = Get-ChildItem -Path $TempDir -Recurse -Filter "$BinName.exe" | Select-Object -First 1
if (-not $BinPath) {
    Fail "download succeeded but $BinName.exe not found in archive"
}

$BaseDir = if ($env:LOCALAPPDATA) { $env:LOCALAPPDATA } else { $env:USERPROFILE }
$InstallDir = Join-Path $BaseDir "ralph\bin"
New-Item -ItemType Directory -Force -Path $InstallDir | Out-Null
Copy-Item -Force $BinPath.FullName (Join-Path $InstallDir "$BinName.exe")

Write-Host "Installed $BinName to $InstallDir\$BinName.exe"
if (($env:Path -split ';') -notcontains $InstallDir) {
    Write-Host "Note: $InstallDir is not on your PATH. Add it to use '$BinName' directly."
}

Remove-Item -Recurse -Force $TempDir -ErrorAction SilentlyContinue