diff --git a/claude-code-installer.ps1 b/claude-code-installer.ps1 index d155083..c21918c 100644 --- a/claude-code-installer.ps1 +++ b/claude-code-installer.ps1 @@ -31,6 +31,12 @@ $ErrorActionPreference = "Stop" $ProgressPreference = "SilentlyContinue" +#------------------------------------------------------------------------------- +# Configuration +#------------------------------------------------------------------------------- + +$script:BoxWidth = 65 # Inner width of boxes + #------------------------------------------------------------------------------- # Color and Display Functions #------------------------------------------------------------------------------- @@ -48,66 +54,193 @@ function Write-ColorText { } } +function Write-BoxTop { + param([int]$Width = $script:BoxWidth) + $line = "─" * $Width + Write-ColorText " ┌$line┐" -Color White +} + +function Write-BoxMiddle { + param([int]$Width = $script:BoxWidth) + $line = "─" * $Width + Write-ColorText " ├$line┤" -Color White +} + +function Write-BoxBottom { + param([int]$Width = $script:BoxWidth) + $line = "─" * $Width + Write-ColorText " └$line┘" -Color White +} + +function Write-BoxTitle { + param( + [string]$Title, + [int]$Width = $script:BoxWidth + ) + $padding = $Width - $Title.Length - 2 + $leftPad = [math]::Floor($padding / 2) + $rightPad = $padding - $leftPad + + Write-ColorText " │" -Color White -NoNewline + Write-ColorText (" " * ($leftPad + 1)) -Color White -NoNewline + Write-ColorText $Title -Color White -NoNewline + Write-ColorText (" " * ($rightPad + 1)) -Color White -NoNewline + Write-ColorText "│" -Color White +} + +function Write-BoxEmpty { + param([int]$Width = $script:BoxWidth) + Write-ColorText " │" -Color White -NoNewline + Write-ColorText (" " * $Width) -Color White -NoNewline + Write-ColorText "│" -Color White +} + +function Write-BoxContent { + param( + [string]$Label, + [ConsoleColor]$LabelColor = "Cyan", + [string]$Value, + [ConsoleColor]$ValueColor = "Green", + [int]$LabelWidth = 16, + [int]$Width = $script:BoxWidth + ) + + $paddedLabel = $Label.PadRight($LabelWidth) + $remainingWidth = $Width - $LabelWidth - 4 # 4 for prefix spacing + $paddedValue = $Value + if ($Value.Length -gt $remainingWidth) { + $paddedValue = $Value.Substring(0, $remainingWidth - 3) + "..." + } + $totalPadding = $Width - $paddedLabel.Length - $paddedValue.Length - 2 + if ($totalPadding -lt 0) { $totalPadding = 0 } + + Write-ColorText " │ " -Color White -NoNewline + Write-ColorText $paddedLabel -Color $LabelColor -NoNewline + Write-ColorText $paddedValue -Color $ValueColor -NoNewline + Write-ColorText (" " * $totalPadding) -Color White -NoNewline + Write-ColorText " │" -Color White +} + +function Write-BoxLine { + param( + [string]$Text, + [ConsoleColor]$Color = "White", + [int]$Width = $script:BoxWidth, + [int]$Indent = 1 + ) + + $indentStr = " " * $Indent + $maxTextWidth = $Width - $Indent - 1 + $displayText = $Text + if ($Text.Length -gt $maxTextWidth) { + $displayText = $Text.Substring(0, $maxTextWidth - 3) + "..." + } + $padding = $Width - $Indent - $displayText.Length - 1 + if ($padding -lt 0) { $padding = 0 } + + Write-ColorText " │" -Color White -NoNewline + Write-ColorText $indentStr -Color White -NoNewline + Write-ColorText $displayText -Color $Color -NoNewline + Write-ColorText (" " * $padding) -Color White -NoNewline + Write-ColorText " │" -Color White +} + +function Write-BoxLineMultiColor { + param( + [array]$Parts, # Array of @{Text=""; Color="White"} + [int]$Width = $script:BoxWidth, + [int]$Indent = 1 + ) + + $indentStr = " " * $Indent + $totalLength = $Indent + foreach ($part in $Parts) { + $totalLength += $part.Text.Length + } + $padding = $Width - $totalLength - 1 + if ($padding -lt 0) { $padding = 0 } + + Write-ColorText " │" -Color White -NoNewline + Write-ColorText $indentStr -Color White -NoNewline + foreach ($part in $Parts) { + Write-ColorText $part.Text -Color $part.Color -NoNewline + } + Write-ColorText (" " * $padding) -Color White -NoNewline + Write-ColorText " │" -Color White +} + function Write-Banner { Clear-Host Write-Host "" - Write-ColorText "╔═══════════════════════════════════════════════════════════════════════════╗" -Color Cyan - Write-ColorText "║ ║" -Color Cyan - Write-ColorText "║ ██████╗██╗ █████╗ ██╗ ██╗██████╗ ███████╗ ║" -Color Cyan - Write-ColorText "║ ██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗██╔════╝ ║" -Color Cyan - Write-ColorText "║ ██║ ██║ ███████║██║ ██║██║ ██║█████╗ ║" -Color Cyan - Write-ColorText "║ ██║ ██║ ██╔══██║██║ ██║██║ ██║██╔══╝ ║" -Color Cyan - Write-ColorText "║ ╚██████╗███████╗██║ ██║╚██████╔╝██████╔╝███████╗ ║" -Color Cyan - Write-ColorText "║ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ║" -Color Cyan - Write-ColorText "║ ║" -Color Cyan - Write-ColorText "║ " -Color Cyan -NoNewline + Write-ColorText " ╔═══════════════════════════════════════════════════════════════════╗" -Color Cyan + Write-ColorText " ║ ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline + Write-ColorText "██████╗██╗ █████╗ ██╗ ██╗██████╗ ███████╗" -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline + Write-ColorText "██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗██╔════╝" -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline + Write-ColorText "██║ ██║ ███████║██║ ██║██║ ██║█████╗" -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline + Write-ColorText "██║ ██║ ██╔══██║██║ ██║██║ ██║██╔══╝" -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline + Write-ColorText "╚██████╗███████╗██║ ██║╚██████╔╝██████╔╝███████╗" -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline + Write-ColorText "╚═════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝" -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline Write-ColorText "C O D E I N S T A L L E R" -Color White -NoNewline - Write-ColorText " ║" -Color Cyan - Write-ColorText "║ ║" -Color Cyan - Write-ColorText "║ " -Color Cyan -NoNewline + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ ║" -Color Cyan + Write-ColorText " ║ " -Color Cyan -NoNewline Write-ColorText "[ Windows Edition ]" -Color Yellow -NoNewline - Write-ColorText " ║" -Color Cyan - Write-ColorText "║ ║" -Color Cyan - Write-ColorText "╚═══════════════════════════════════════════════════════════════════════════╝" -Color Cyan + Write-ColorText " ║" -Color Cyan + Write-ColorText " ║ ║" -Color Cyan + Write-ColorText " ╚═══════════════════════════════════════════════════════════════════╝" -Color Cyan Write-Host "" } function Write-Section { param([string]$Title) Write-Host "" - Write-ColorText "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -Color Blue - Write-ColorText " $Title" -Color White - Write-ColorText "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -Color Blue + Write-ColorText " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -Color Blue + Write-ColorText " $Title" -Color White + Write-ColorText " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -Color Blue Write-Host "" } function Write-Step { param([string]$Message) - Write-ColorText "→ " -Color Cyan -NoNewline + Write-ColorText " → " -Color Cyan -NoNewline Write-ColorText $Message -Color White } function Write-Success { param([string]$Message) - Write-ColorText "✓ " -Color Green -NoNewline + Write-ColorText " ✓ " -Color Green -NoNewline Write-ColorText $Message -Color Green } function Write-Error2 { param([string]$Message) - Write-ColorText "✗ " -Color Red -NoNewline + Write-ColorText " ✗ " -Color Red -NoNewline Write-ColorText $Message -Color Red } function Write-Warning2 { param([string]$Message) - Write-ColorText "⚠ " -Color Yellow -NoNewline + Write-ColorText " ⚠ " -Color Yellow -NoNewline Write-ColorText $Message -Color Yellow } function Write-Info { param([string]$Message) - Write-ColorText "ℹ " -Color Blue -NoNewline + Write-ColorText " ℹ " -Color Blue -NoNewline Write-ColorText $Message -Color DarkGray } @@ -123,7 +256,7 @@ function Confirm-Action { $options = "[y/N]" } - Write-ColorText "? " -Color Yellow -NoNewline + Write-ColorText " ? " -Color Yellow -NoNewline Write-ColorText "$Prompt " -Color White -NoNewline Write-ColorText $options -Color DarkGray -NoNewline Write-ColorText ": " -Color White -NoNewline @@ -139,7 +272,7 @@ function Confirm-Action { function Wait-ForKey { Write-Host "" - Write-ColorText "Press any key to continue..." -Color DarkGray + Write-ColorText " Press any key to continue..." -Color DarkGray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") Write-Host "" } @@ -184,37 +317,22 @@ function Get-SystemInfo { # Display detected information Write-Host "" - Write-ColorText " ┌─────────────────────────────────────────────────────────┐" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "System Information" -Color White -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " ├─────────────────────────────────────────────────────────┤" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Windows: " -Color Cyan -NoNewline - Write-ColorText "$WindowsVersion" -Color Green - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Build: " -Color Cyan -NoNewline - Write-ColorText "$WindowsBuild" -Color Green - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Architecture: " -Color Cyan -NoNewline - Write-ColorText "$ArchDisplay" -Color Green - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Computer: " -Color Cyan -NoNewline - Write-ColorText "$ComputerName" -Color Green - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "RAM: " -Color Cyan -NoNewline - Write-ColorText "$TotalRAM GB" -Color Green - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "PowerShell: " -Color Cyan -NoNewline - Write-ColorText "v$PSVersion" -Color Green - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Admin Rights: " -Color Cyan -NoNewline + Write-BoxTop + Write-BoxTitle -Title "System Information" + Write-BoxMiddle + Write-BoxContent -Label "Windows:" -Value $WindowsVersion + Write-BoxContent -Label "Build:" -Value $WindowsBuild + Write-BoxContent -Label "Architecture:" -Value $ArchDisplay + Write-BoxContent -Label "Computer:" -Value $ComputerName + Write-BoxContent -Label "RAM:" -Value "$TotalRAM GB" + Write-BoxContent -Label "PowerShell:" -Value "v$PSVersion" + if ($IsAdmin) { - Write-ColorText "Yes" -Color Green + Write-BoxContent -Label "Admin Rights:" -Value "Yes" -ValueColor Green } else { - Write-ColorText "No" -Color Yellow + Write-BoxContent -Label "Admin Rights:" -Value "No" -ValueColor Yellow } - Write-ColorText " └─────────────────────────────────────────────────────────┘" -Color White + Write-BoxBottom Write-Host "" Write-Success "System detected successfully!" @@ -261,11 +379,9 @@ function Test-NodeInstallation { # Display current status Write-Host "" - Write-ColorText " ┌─────────────────────────────────────────────────────────┐" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Current Installation Status" -Color White -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " ├─────────────────────────────────────────────────────────┤" -Color White + Write-BoxTop + Write-BoxTitle -Title "Current Installation Status" + Write-BoxMiddle if ($NodeInstalled) { # Check if version is sufficient (need v18+) @@ -273,40 +389,45 @@ function Test-NodeInstallation { $majorVersion = [int]($versionNum.Split('.')[0]) if ($majorVersion -ge 18) { - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "✓" -Color Green -NoNewline - Write-ColorText " Node.js: " -Color White -NoNewline - Write-ColorText "$NodeVersion" -Color Green -NoNewline - Write-ColorText " (Compatible)" -Color Green + Write-BoxLineMultiColor -Parts @( + @{Text="✓ "; Color="Green"}, + @{Text="Node.js: "; Color="White"}, + @{Text="$NodeVersion"; Color="Green"}, + @{Text=" (Compatible)"; Color="Green"} + ) } else { - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "⚠" -Color Yellow -NoNewline - Write-ColorText " Node.js: " -Color White -NoNewline - Write-ColorText "$NodeVersion" -Color Yellow -NoNewline - Write-ColorText " (Needs upgrade to v18+)" -Color Yellow + Write-BoxLineMultiColor -Parts @( + @{Text="⚠ "; Color="Yellow"}, + @{Text="Node.js: "; Color="White"}, + @{Text="$NodeVersion"; Color="Yellow"}, + @{Text=" (Needs upgrade to v18+)"; Color="Yellow"} + ) $script:NeedsUpgrade = $true } } else { - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "✗" -Color Red -NoNewline - Write-ColorText " Node.js: " -Color White -NoNewline - Write-ColorText "Not installed" -Color Red + Write-BoxLineMultiColor -Parts @( + @{Text="✗ "; Color="Red"}, + @{Text="Node.js: "; Color="White"}, + @{Text="Not installed"; Color="Red"} + ) $script:NeedsUpgrade = $true } if ($NpmInstalled) { - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "✓" -Color Green -NoNewline - Write-ColorText " npm: " -Color White -NoNewline - Write-ColorText "v$NpmVersion" -Color Green + Write-BoxLineMultiColor -Parts @( + @{Text="✓ "; Color="Green"}, + @{Text="npm: "; Color="White"}, + @{Text="v$NpmVersion"; Color="Green"} + ) } else { - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "✗" -Color Red -NoNewline - Write-ColorText " npm: " -Color White -NoNewline - Write-ColorText "Not installed" -Color Red + Write-BoxLineMultiColor -Parts @( + @{Text="✗ "; Color="Red"}, + @{Text="npm: "; Color="White"}, + @{Text="Not installed"; Color="Red"} + ) } - Write-ColorText " └─────────────────────────────────────────────────────────┘" -Color White + Write-BoxBottom Write-Host "" # Determine action needed @@ -357,7 +478,7 @@ function Uninstall-Node { ) # Try to uninstall via Windows installer - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Checking for installed Node.js package..." -Color White $uninstallKeys = @( @@ -375,7 +496,7 @@ function Uninstall-Node { } if ($nodePackage -and $nodePackage.UninstallString) { - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Found Node.js installation. Uninstalling..." -Color White try { @@ -398,7 +519,7 @@ function Uninstall-Node { # Remove Node.js directories foreach ($path in $nodePaths) { if (Test-Path $path) { - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Removing $path..." -Color White -NoNewline try { Remove-Item -Path $path -Recurse -Force -ErrorAction Stop @@ -418,7 +539,7 @@ function Uninstall-Node { foreach ($path in $npmPaths) { if (Test-Path $path) { - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Removing $path..." -Color White -NoNewline try { Remove-Item -Path $path -Recurse -Force -ErrorAction Stop @@ -456,15 +577,15 @@ function Install-Node { $downloadUrl = "https://nodejs.org/dist/v$nodeVersion/$installerFile" $installerPath = "$env:TEMP\$installerFile" - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Downloading Node.js v$nodeVersion ($Arch)..." -Color White - Write-Info " URL: $downloadUrl" + Write-Info " URL: $downloadUrl" try { # Download with progress $webClient = New-Object System.Net.WebClient $webClient.DownloadFile($downloadUrl, $installerPath) - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Download complete!" -Color Green } catch { Write-Error2 "Failed to download Node.js installer." @@ -475,7 +596,7 @@ function Install-Node { # Install Node.js Write-Host "" - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Installing Node.js (this may take a minute)..." -Color White try { @@ -483,10 +604,10 @@ function Install-Node { $process = Start-Process "msiexec.exe" -ArgumentList $installArgs -Wait -PassThru -NoNewWindow if ($process.ExitCode -eq 0) { - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Installation successful!" -Color Green } elseif ($process.ExitCode -eq 3010) { - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Installation successful (restart may be required)" -Color Yellow } else { throw "MSI installer returned code: $($process.ExitCode)" @@ -498,7 +619,7 @@ function Install-Node { } # Refresh environment variables - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Refreshing environment variables..." -Color White # Add Node.js to PATH for current session @@ -515,7 +636,7 @@ function Install-Node { Write-ColorText " done" -Color Green # Cleanup - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Cleaning up installer..." -Color White -NoNewline Remove-Item -Path $installerPath -Force -ErrorAction SilentlyContinue Write-ColorText " done" -Color Green @@ -553,13 +674,13 @@ function Test-NodeVerification { $majorVersion = [int]($versionNum.Split('.')[0]) if ($majorVersion -ge 18) { - Write-ColorText " ✓ " -Color Green -NoNewline + Write-ColorText " ✓ " -Color Green -NoNewline Write-ColorText "Node.js: " -Color White -NoNewline Write-ColorText "$newNodeVersion" -Color Green -NoNewline Write-ColorText " (Compatible!)" -Color Green $nodeOk = $true } else { - Write-ColorText " ✗ " -Color Red -NoNewline + Write-ColorText " ✗ " -Color Red -NoNewline Write-ColorText "Node.js: " -Color White -NoNewline Write-ColorText "$newNodeVersion (Too old - need v18+)" -Color Red } @@ -567,7 +688,7 @@ function Test-NodeVerification { throw "No version output" } } catch { - Write-ColorText " ✗ " -Color Red -NoNewline + Write-ColorText " ✗ " -Color Red -NoNewline Write-ColorText "Node.js: " -Color White -NoNewline Write-ColorText "Not found!" -Color Red } @@ -580,7 +701,7 @@ function Test-NodeVerification { } if ($newNpmVersion) { - Write-ColorText " ✓ " -Color Green -NoNewline + Write-ColorText " ✓ " -Color Green -NoNewline Write-ColorText "npm: " -Color White -NoNewline Write-ColorText "v$newNpmVersion" -Color Green $npmOk = $true @@ -588,7 +709,7 @@ function Test-NodeVerification { throw "No version output" } } catch { - Write-ColorText " ✗ " -Color Red -NoNewline + Write-ColorText " ✗ " -Color Red -NoNewline Write-ColorText "npm: " -Color White -NoNewline Write-ColorText "Not found!" -Color Red } @@ -624,7 +745,7 @@ function Install-ClaudeCode { $npmPath = "$env:APPDATA\npm" $env:Path = "$nodePath;$npmPath;$env:Path" - Write-ColorText " → " -Color Yellow -NoNewline + Write-ColorText " → " -Color Yellow -NoNewline Write-ColorText "Running npm install..." -Color White Write-Host "" @@ -640,11 +761,11 @@ function Install-ClaudeCode { if ($output) { $output.Split("`n") | ForEach-Object { if ($_ -match "added|packages") { - Write-ColorText " $_" -Color Green + Write-ColorText " $_" -Color Green } elseif ($_ -match "WARN") { - Write-ColorText " $_" -Color Yellow + Write-ColorText " $_" -Color Yellow } elseif ($_.Trim()) { - Write-ColorText " $_" -Color DarkGray + Write-ColorText " $_" -Color DarkGray } } } @@ -656,9 +777,9 @@ function Install-ClaudeCode { if ($errOutput -and $errOutput.Trim()) { $errOutput.Split("`n") | ForEach-Object { if ($_ -match "ERR|error") { - Write-ColorText " $_" -Color Red + Write-ColorText " $_" -Color Red } elseif ($_ -match "WARN") { - Write-ColorText " $_" -Color Yellow + Write-ColorText " $_" -Color Yellow } } } @@ -706,54 +827,58 @@ function Set-ClaudePermissions { Write-Host " Claude Code can run with different permission levels:" Write-Host "" - Write-ColorText " ┌─────────────────────────────────────────────────────────────────────┐" -Color White - Write-ColorText " │ │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "1." -Color Cyan -NoNewline - Write-ColorText " Normal Mode" -Color White -NoNewline - Write-ColorText " (Recommended for most users) │" -Color DarkGray - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Claude will ask permission before file edits and commands" -Color DarkGray -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "✓ Safe ✓ Interactive ✓ Full control" -Color Green -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "2." -Color Cyan -NoNewline - Write-ColorText " Auto-Accept Edits" -Color White -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Automatically accept file edits, ask for commands" -Color DarkGray -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "⚡ Faster editing ✓ Command safety" -Color Yellow -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "3." -Color Cyan -NoNewline - Write-ColorText " Full Auto Mode" -Color White -NoNewline - Write-ColorText " (--dangerously-skip-permissions) │" -Color DarkGray - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Skip all permission prompts (use with caution!)" -Color DarkGray -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "⚠ No confirmations ⚠ Full system access" -Color Red -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "4." -Color Cyan -NoNewline - Write-ColorText " Don't start Claude" -Color White -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ " -Color White -NoNewline - Write-ColorText "Exit installer without starting Claude" -Color DarkGray -NoNewline - Write-ColorText " │" -Color White - Write-ColorText " │ │" -Color White - Write-ColorText " └─────────────────────────────────────────────────────────────────────┘" -Color White + + Write-BoxTop + Write-BoxEmpty + + # Option 1 - Normal Mode + Write-BoxLineMultiColor -Parts @( + @{Text="1."; Color="Cyan"}, + @{Text=" Normal Mode"; Color="White"}, + @{Text=" (Recommended for most users)"; Color="DarkGray"} + ) + Write-BoxLine -Text "Claude will ask permission before file edits and commands" -Color DarkGray -Indent 4 + Write-BoxLineMultiColor -Parts @( + @{Text="✓ Safe ✓ Interactive ✓ Full control"; Color="Green"} + ) -Indent 4 + Write-BoxEmpty + + # Option 2 - Auto-Accept Edits + Write-BoxLineMultiColor -Parts @( + @{Text="2."; Color="Cyan"}, + @{Text=" Auto-Accept Edits"; Color="White"} + ) + Write-BoxLine -Text "Automatically accept file edits, ask for commands" -Color DarkGray -Indent 4 + Write-BoxLineMultiColor -Parts @( + @{Text="⚡ Faster editing ✓ Command safety"; Color="Yellow"} + ) -Indent 4 + Write-BoxEmpty + + # Option 3 - Full Auto Mode + Write-BoxLineMultiColor -Parts @( + @{Text="3."; Color="Cyan"}, + @{Text=" Full Auto Mode"; Color="White"}, + @{Text=" (--dangerously-skip-permissions)"; Color="DarkGray"} + ) + Write-BoxLine -Text "Skip all permission prompts (use with caution!)" -Color DarkGray -Indent 4 + Write-BoxLineMultiColor -Parts @( + @{Text="⚠ No confirmations ⚠ Full system access"; Color="Red"} + ) -Indent 4 + Write-BoxEmpty + + # Option 4 - Don't start + Write-BoxLineMultiColor -Parts @( + @{Text="4."; Color="Cyan"}, + @{Text=" Don't start Claude"; Color="White"} + ) + Write-BoxLine -Text "Exit installer without starting Claude" -Color DarkGray -Indent 4 + Write-BoxEmpty + + Write-BoxBottom Write-Host "" while ($true) { - Write-ColorText "? " -Color Yellow -NoNewline + Write-ColorText " ? " -Color Yellow -NoNewline Write-ColorText "Select permission mode [" -Color White -NoNewline Write-ColorText "1" -Color Green -NoNewline Write-ColorText "/" -Color White -NoNewline @@ -783,11 +908,10 @@ function Set-ClaudePermissions { $script:PermissionMode = "full-auto" Write-Host "" Write-Warning2 "⚠️ WARNING: Full Auto Mode gives Claude unrestricted access!" - Write-ColorText " " -Color White -NoNewline - Write-ColorText "This mode will:" -Color Red - Write-ColorText " • Execute commands without confirmation" -Color Red - Write-ColorText " • Modify files without asking" -Color Red - Write-ColorText " • Have full access to your system" -Color Red + Write-ColorText " This mode will:" -Color Red + Write-ColorText " • Execute commands without confirmation" -Color Red + Write-ColorText " • Modify files without asking" -Color Red + Write-ColorText " • Have full access to your system" -Color Red Write-Host "" if (Confirm-Action "Are you sure you want to use Full Auto Mode?" -DefaultYes $false) { @@ -825,9 +949,9 @@ function Start-Claude { Write-ColorText " To start Claude Code, open a new terminal and run:" -Color White Write-Host "" Write-ColorText " claude" -Color Cyan -NoNewline - Write-ColorText " # Normal mode" -Color DarkGray + Write-ColorText " # Normal mode" -Color DarkGray Write-ColorText " claude --auto-accept-edits" -Color Cyan -NoNewline - Write-ColorText " # Auto-accept file edits" -Color DarkGray + Write-ColorText " # Auto-accept file edits" -Color DarkGray Write-ColorText " claude --dangerously-skip-permissions" -Color Cyan -NoNewline Write-ColorText " # Full auto mode" -Color DarkGray Write-Host "" @@ -842,7 +966,7 @@ function Start-Claude { Write-ColorText " Starting Claude Code with: " -Color White -NoNewline Write-ColorText $ClaudeCmd -Color Cyan Write-Host "" - Write-ColorText " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -Color DarkGray + Write-ColorText " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -Color DarkGray Write-Host "" Start-Sleep -Seconds 1 @@ -912,4 +1036,4 @@ function Main { } # Run main function -Main +Main \ No newline at end of file