earl 0.5.2

AI-safe CLI for AI agents
param(
  [Parameter(Mandatory = $false)]
  [string]$Version = "latest",

  [Parameter(Mandatory = $false)]
  [string]$InstallDir,

  [Parameter(Mandatory = $false)]
  [string]$BinDir
)

$ErrorActionPreference = "Stop"
$repo = if ($env:EARL_INSTALL_REPO) { $env:EARL_INSTALL_REPO } else { "brwse/earl" }

$arch = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture
switch ($arch) {
  "X64" { $target = "x86_64-pc-windows-msvc" }
  "Arm64" { $target = "aarch64-pc-windows-msvc" }
  default { throw "Unsupported architecture: $arch" }
}

if ($Version -eq "latest") {
  $latest = Invoke-RestMethod -Uri "https://api.github.com/repos/$repo/releases/latest"
  if (-not $latest.tag_name) {
    throw "Failed to resolve latest release tag"
  }
  $Version = $latest.tag_name.TrimStart("v")
}

$Version = $Version.TrimStart("v")
$tag = "v$Version"
$fileName = "earl-$Version-$target.zip"

$tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ("earl-install-" + [System.Guid]::NewGuid().ToString("N"))
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null

try {
  $archivePath = Join-Path $tempDir $fileName
  $checksumsPath = Join-Path $tempDir "SHA256SUMS"

  $archiveUrl = "https://github.com/$repo/releases/download/$tag/$fileName"
  $checksumsUrl = "https://github.com/$repo/releases/download/$tag/SHA256SUMS"

  Invoke-WebRequest -Uri $archiveUrl -OutFile $archivePath
  Invoke-WebRequest -Uri $checksumsUrl -OutFile $checksumsPath

  $checksumLine = Get-Content $checksumsPath | Where-Object { $_ -match "\s$([regex]::Escape($fileName))$" } | Select-Object -First 1
  if (-not $checksumLine) {
    throw "Checksum entry for $fileName was not found"
  }

  $expectedHash = ($checksumLine -split "\s+")[0].ToLowerInvariant()
  $actualHash = (Get-FileHash -Path $archivePath -Algorithm SHA256).Hash.ToLowerInvariant()
  if ($expectedHash -ne $actualHash) {
    throw "Checksum verification failed for $fileName"
  }

  $extractPath = Join-Path $tempDir "extract"
  Expand-Archive -Path $archivePath -DestinationPath $extractPath -Force

  if ($BinDir) {
    $destinationDir = $BinDir
  } elseif ($InstallDir) {
    $destinationDir = Join-Path $InstallDir "bin"
  } else {
    $destinationDir = Join-Path $env:LOCALAPPDATA "Programs\earl\bin"
  }

  New-Item -ItemType Directory -Path $destinationDir -Force | Out-Null
  Copy-Item -Path (Join-Path $extractPath "earl.exe") -Destination (Join-Path $destinationDir "earl.exe") -Force

  Write-Host "Installed earl $Version to $destinationDir\earl.exe"

  $pathParts = $env:PATH -split ';'
  if ($pathParts -notcontains $destinationDir) {
    Write-Host "Add $destinationDir to PATH to run 'earl' from any shell."
  }
}
finally {
  if (Test-Path $tempDir) {
    Remove-Item -Recurse -Force $tempDir
  }
}