# Claudible Installer for Claude Code (Windows PowerShell 5.1+) # Configures Claude Code to use Claudible # Compatible with Windows 10/11 (PowerShell 5.1) and PowerShell 7+ $ErrorActionPreference = "Stop" # Configuration (auto-populated by server) $ENDPOINT_URL = "https://claudible.io" $API_KEY = '' $HAIKU_MODEL = "claude-haiku-4.5" $OPUS_MODEL = "claude-opus-4.6" $SONNET_MODEL = "claude-sonnet-4.6" Write-Host "================================" -ForegroundColor Blue Write-Host " Claudible Configuration" -ForegroundColor Blue Write-Host "================================" -ForegroundColor Blue Write-Host "" # Validate configuration if ($ENDPOINT_URL -eq "__" + "ENDPOINT_URL__" -or [string]::IsNullOrEmpty($ENDPOINT_URL)) { Write-Host "Error: Endpoint URL not configured" -ForegroundColor Red exit 1 } if ($API_KEY -eq "__" + "API_KEY__" -or [string]::IsNullOrEmpty($API_KEY)) { Write-Host "Error: API key not configured" -ForegroundColor Red exit 1 } # Mask API key for display $MASKED_KEY = $API_KEY.Substring(0, [Math]::Min(10, $API_KEY.Length)) Write-Host "Endpoint URL: " -NoNewline Write-Host "$ENDPOINT_URL" -ForegroundColor Green Write-Host "API Key: " -NoNewline Write-Host "$MASKED_KEY..." -ForegroundColor Green Write-Host "" # Set environment variables for current user Write-Host "Configuring environment variables..." -ForegroundColor Blue [Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", $ENDPOINT_URL, "User") [Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", $API_KEY, "User") Write-Host " " -NoNewline Write-Host "OK" -ForegroundColor Green -NoNewline Write-Host " Set ANTHROPIC_BASE_URL" Write-Host " " -NoNewline Write-Host "OK" -ForegroundColor Green -NoNewline Write-Host " Set ANTHROPIC_AUTH_TOKEN" # Also set for current session $env:ANTHROPIC_BASE_URL = $ENDPOINT_URL $env:ANTHROPIC_AUTH_TOKEN = $API_KEY # Define paths $settingsDir = Join-Path $env:USERPROFILE ".claude" $settingsPath = Join-Path $settingsDir "settings.json" $statuslinePath = Join-Path $settingsDir "statusline.ps1" # Ensure .claude directory exists if (-not (Test-Path $settingsDir)) { New-Item -ItemType Directory -Path $settingsDir -Force | Out-Null } # Ensure TLS 1.2 for PS 5.1 compatibility try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13 } catch { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } # Install statusline script Write-Host "" Write-Host "Installing statusline script..." -ForegroundColor Blue $statuslineInstalled = $false try { $statuslineUrl = "$ENDPOINT_URL/statusline.ps1?key=$API_KEY" Invoke-WebRequest -Uri $statuslineUrl -OutFile $statuslinePath -UseBasicParsing -TimeoutSec 10 -ErrorAction Stop Write-Host " " -NoNewline Write-Host "OK" -ForegroundColor Green -NoNewline Write-Host " Installed $statuslinePath" $statuslineInstalled = $true } catch { Write-Host " " -NoNewline Write-Host "Warning" -ForegroundColor Yellow -NoNewline Write-Host " Could not download statusline script" Write-Host " Reason: $($_.Exception.Message)" -ForegroundColor Yellow } # Update Claude Code settings.json Write-Host "" Write-Host "Configuring Claude Code settings..." -ForegroundColor Blue # Initialize settings object $settings = $null if (Test-Path $settingsPath) { # Backup existing file $backupPath = "$settingsPath.backup.$(Get-Date -Format 'yyyyMMddHHmmss')" Copy-Item $settingsPath $backupPath Write-Host " Backed up: $settingsPath" -ForegroundColor Yellow try { $content = Get-Content $settingsPath -Raw -ErrorAction Stop if ($content) { $settings = ConvertFrom-Json $content } } catch { Write-Host " Warning: Could not parse existing settings.json, creating new one" -ForegroundColor Yellow $settings = $null } } # Create new settings object if needed if ($null -eq $settings) { $settings = New-Object PSObject } # Ensure env property exists (PowerShell 5.1 compatible) if (-not (Get-Member -InputObject $settings -Name "env" -MemberType Properties)) { $settings | Add-Member -MemberType NoteProperty -Name "env" -Value (New-Object PSObject) } # Set ANTHROPIC_BASE_URL if (Get-Member -InputObject $settings.env -Name "ANTHROPIC_BASE_URL" -MemberType Properties) { $settings.env.ANTHROPIC_BASE_URL = $ENDPOINT_URL } else { $settings.env | Add-Member -MemberType NoteProperty -Name "ANTHROPIC_BASE_URL" -Value $ENDPOINT_URL } # Set ANTHROPIC_AUTH_TOKEN if (Get-Member -InputObject $settings.env -Name "ANTHROPIC_AUTH_TOKEN" -MemberType Properties) { $settings.env.ANTHROPIC_AUTH_TOKEN = $API_KEY } else { $settings.env | Add-Member -MemberType NoteProperty -Name "ANTHROPIC_AUTH_TOKEN" -Value $API_KEY } # Set ANTHROPIC_DEFAULT_HAIKU_MODEL if (Get-Member -InputObject $settings.env -Name "ANTHROPIC_DEFAULT_HAIKU_MODEL" -MemberType Properties) { $settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = $HAIKU_MODEL } else { $settings.env | Add-Member -MemberType NoteProperty -Name "ANTHROPIC_DEFAULT_HAIKU_MODEL" -Value $HAIKU_MODEL } # Set ANTHROPIC_DEFAULT_OPUS_MODEL if (Get-Member -InputObject $settings.env -Name "ANTHROPIC_DEFAULT_OPUS_MODEL" -MemberType Properties) { $settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = $OPUS_MODEL } else { $settings.env | Add-Member -MemberType NoteProperty -Name "ANTHROPIC_DEFAULT_OPUS_MODEL" -Value $OPUS_MODEL } # Set ANTHROPIC_DEFAULT_SONNET_MODEL if (Get-Member -InputObject $settings.env -Name "ANTHROPIC_DEFAULT_SONNET_MODEL" -MemberType Properties) { $settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = $SONNET_MODEL } else { $settings.env | Add-Member -MemberType NoteProperty -Name "ANTHROPIC_DEFAULT_SONNET_MODEL" -Value $SONNET_MODEL } # Set CLAUDE_CODE_DISABLE_1M_CONTEXT if (Get-Member -InputObject $settings.env -Name "CLAUDE_CODE_DISABLE_1M_CONTEXT" -MemberType Properties) { $settings.env.CLAUDE_CODE_DISABLE_1M_CONTEXT = "1" } else { $settings.env | Add-Member -MemberType NoteProperty -Name "CLAUDE_CODE_DISABLE_1M_CONTEXT" -Value "1" } # Set disableLoginPrompt if (Get-Member -InputObject $settings -Name "disableLoginPrompt" -MemberType Properties) { $settings.disableLoginPrompt = $true } else { $settings | Add-Member -MemberType NoteProperty -Name "disableLoginPrompt" -Value $true } # Set statusLine if statusline script was installed if ($statuslineInstalled) { $statuslineCommand = "powershell -ExecutionPolicy Bypass -File `"$statuslinePath`"" # Create statusLine object $statusLineObj = New-Object PSObject $statusLineObj | Add-Member -MemberType NoteProperty -Name "type" -Value "command" $statusLineObj | Add-Member -MemberType NoteProperty -Name "command" -Value $statuslineCommand if (Get-Member -InputObject $settings -Name "statusLine" -MemberType Properties) { $settings.statusLine = $statusLineObj } else { $settings | Add-Member -MemberType NoteProperty -Name "statusLine" -Value $statusLineObj } } # Convert to JSON and write (UTF-8 without BOM for compatibility) $jsonContent = $settings | ConvertTo-Json -Depth 10 [System.IO.File]::WriteAllText($settingsPath, $jsonContent, [System.Text.UTF8Encoding]::new($false)) Write-Host " " -NoNewline Write-Host "OK" -ForegroundColor Green -NoNewline Write-Host " Updated $settingsPath" Write-Host "" Write-Host "================================" -ForegroundColor Green Write-Host " Configuration Complete!" -ForegroundColor Green Write-Host "================================" -ForegroundColor Green Write-Host "" Write-Host "Claude Code is now configured to use Claudible:" Write-Host " Endpoint: " -NoNewline Write-Host "$ENDPOINT_URL" -ForegroundColor Blue Write-Host " API Key: " -NoNewline Write-Host "$MASKED_KEY..." -ForegroundColor Blue if ($statuslineInstalled) { Write-Host " Statusline: " -NoNewline Write-Host "Enabled" -ForegroundColor Green } Write-Host "" Write-Host "Next steps:" -ForegroundColor Yellow Write-Host " 1. Restart PowerShell or open a new terminal" Write-Host " 2. Run: " -NoNewline Write-Host "claude" -ForegroundColor Blue Write-Host ""