Improved Node.js version check logic to handle prefixed version strings and avoid brittle cut commands. Verified with multiple version formats including v24.11.1.
514 lines
21 KiB
PowerShell
514 lines
21 KiB
PowerShell
#!/usr/bin/env pwsh
|
|
################################################################################
|
|
# SuperCharge Claude Code - Windows PowerShell Installer
|
|
################################################################################
|
|
# This script transforms any Claude Code installation into a supercharged
|
|
# version with all customizations, skills, agents, plugins, and integrations.
|
|
#
|
|
# Usage:
|
|
# pwsh -ExecutionPolicy Bypass -File install-windows.ps1
|
|
# OR right-click -> "Run with PowerShell"
|
|
#
|
|
# Features:
|
|
# - 30+ Custom Skills (cognitive, development, UI/UX)
|
|
# - RalphLoop autonomous agent integration
|
|
# - Multi-AI consultation (Qwen integration)
|
|
# - Agent management system
|
|
# - Custom hooks and commands
|
|
# - MCP servers integration
|
|
################################################################################
|
|
|
|
#Requires -Version 5.1
|
|
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
# Colors for output
|
|
function Write-ColorOutput {
|
|
param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Message,
|
|
|
|
[Parameter(Mandatory=$false)]
|
|
[ValidateSet("Info", "Success", "Warning", "Error", "Step")]
|
|
[string]$Type = "Info"
|
|
)
|
|
|
|
$colors = @{
|
|
"Info" = "Cyan"
|
|
"Success" = "Green"
|
|
"Warning" = "Yellow"
|
|
"Error" = "Red"
|
|
"Step" = "Magenta"
|
|
}
|
|
|
|
$prefixes = @{
|
|
"Info" = "[INFO]"
|
|
"Success" = "[SUCCESS]"
|
|
"Warning" = "[WARN]"
|
|
"Error" = "[ERROR]"
|
|
"Step" = "==>"
|
|
}
|
|
|
|
Write-Host "$($prefixes[$Type]) $Message" -ForegroundColor $colors[$Type]
|
|
}
|
|
|
|
function Show-Banner {
|
|
Write-Host @"
|
|
|
|
╔═══════════════════════════════════════════════════════════════╗
|
|
║ ║
|
|
║ ███████╗██╗ █████╗ ██████╗ ║
|
|
║ ██╔════╝██║ ██╔══██╗██╔════╝ ║
|
|
║ ███████╗██║ ███████║██║ ███╗ ║
|
|
║ ╚════██║██║ ██╔══██║██║ ██║ ║
|
|
║ ███████║███████╗██║ ██║╚██████╔╝ ║
|
|
║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ║
|
|
║ ║
|
|
║ ███████╗██╗ ██╗███████╗███╗ ██╗ ║
|
|
║ ██╔════╝╚██╗██╔╝██╔════╝████╗ ██║ ║
|
|
║ █████╗ ╚███╔╝ █████╗ ██╔██╗ ██║ ║
|
|
║ ██╔══╝ ██╔██╗ ██╔══╝ ██║╚██╗██║ ║
|
|
║ ███████╗██║██╗██║███████╗██║ ╚████║ ║
|
|
║ ╚══════╝╚═╝╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ ║
|
|
║ ║
|
|
║ Windows PowerShell Installer ║
|
|
║ ║
|
|
╚═══════════════════════════════════════════════════════════════╝
|
|
|
|
"@ -ForegroundColor Cyan
|
|
|
|
# Show warning about experimental status
|
|
Write-Host ""
|
|
Write-Host "⚠️ WARNING: This PowerShell installer is EXPERIMENTAL and may have bugs." -ForegroundColor Yellow
|
|
Write-Host " For reliable installation, we recommend using WSL instead:" -ForegroundColor Yellow
|
|
Write-Host " wsl bash -c 'git clone https://github.rommark.dev/admin/SuperCharged-Claude-Code-Upgrade.git && cd SuperCharged-Claude-Code-Upgrade && ./supercharge.sh'" -ForegroundColor White
|
|
Write-Host ""
|
|
Write-Host " Press Ctrl+C to exit and use WSL, or press Enter to continue..." -ForegroundColor Cyan
|
|
Read-Host
|
|
Write-Host ""
|
|
}
|
|
|
|
function Test-ClaudeCode {
|
|
Write-ColorOutput "Checking for Claude Code installation..." -Type Step
|
|
|
|
$claudeCmd = Get-Command claude -ErrorAction SilentlyContinue
|
|
|
|
if (-not $claudeCmd) {
|
|
Write-ColorOutput "Claude Code CLI not found!" -Type Warning
|
|
Write-Host ""
|
|
Write-Host "Claude Code is required to use these customizations." -ForegroundColor Yellow
|
|
Write-Host ""
|
|
Write-Host "Installation options:" -ForegroundColor White
|
|
Write-Host " 1. Install Claude Code with npm (requires Node.js)"
|
|
Write-Host " 2. Install manually later"
|
|
Write-Host " 3. Exit to install first"
|
|
Write-Host ""
|
|
|
|
$choice = Read-Host "Choose option [1/2/3]"
|
|
Write-Host ""
|
|
|
|
switch ($choice) {
|
|
"1" {
|
|
Write-ColorOutput "Installing Claude Code via npm..." -Type Info
|
|
try {
|
|
npm install -g @anthropic-ai/claude-code
|
|
if ($LASTEXITCODE -eq 0) {
|
|
Write-ColorOutput "Claude Code installed successfully!" -Type Success
|
|
} else {
|
|
Write-ColorOutput "Claude Code installation failed. Please install manually." -Type Error
|
|
exit 1
|
|
}
|
|
} catch {
|
|
Write-ColorOutput "npm install failed: $_" -Type Error
|
|
Write-ColorOutput "Please install Node.js from https://nodejs.org/ and try again." -Type Info
|
|
exit 1
|
|
}
|
|
}
|
|
"2" {
|
|
Write-ColorOutput "Skipping Claude Code installation." -Type Warning
|
|
Write-ColorOutput "You can install it later with: npm install -g @anthropic-ai/claude-code" -Type Info
|
|
return $false
|
|
}
|
|
"3" {
|
|
Write-ColorOutput "Please install Claude Code first:" -Type Info
|
|
Write-Host " npm install -g @anthropic-ai/claude-code" -ForegroundColor White
|
|
exit 1
|
|
}
|
|
default {
|
|
Write-ColorOutput "Invalid choice." -Type Error
|
|
exit 1
|
|
}
|
|
}
|
|
}
|
|
|
|
# Refresh path and check again
|
|
$claudeCmd = Get-Command claude -ErrorAction SilentlyContinue
|
|
if ($claudeCmd) {
|
|
$version = & claude --version 2>$null
|
|
Write-ColorOutput "Claude Code found: $version" -Type Success
|
|
return $true
|
|
}
|
|
|
|
return $false
|
|
}
|
|
|
|
function Backup-ExistingConfig {
|
|
Write-ColorOutput "Backing up existing configuration..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$backupDir = Join-Path $env:USERPROFILE ".claude-backup-$(Get-Date -Format 'yyyyMMdd_HHmmss')"
|
|
|
|
if (Test-Path $claudeDir) {
|
|
# Use Robocopy to handle reserved device names (nul, con, prn, etc.)
|
|
$robocopyResult = robocopy $claudeDir $backupDir /E /R:0 /W:0 /NFL /NDL /NJH /NJS 2>&1
|
|
|
|
if ($LASTEXITCODE -lt 8) {
|
|
Write-ColorOutput "Backup created at: $backupDir" -Type Success
|
|
} else {
|
|
Write-ColorOutput "Backup had some issues (continued anyway)." -Type Warning
|
|
}
|
|
} else {
|
|
Write-ColorOutput "No existing configuration to backup." -Type Info
|
|
}
|
|
}
|
|
|
|
function Install-Dependencies {
|
|
Write-ColorOutput "Checking dependencies..." -Type Step
|
|
|
|
# Check Node.js
|
|
$nodeCmd = Get-Command node -ErrorAction SilentlyContinue
|
|
if ($nodeCmd) {
|
|
$nodeFullVersion = & node --version
|
|
$nodeMajorVersion = ($nodeFullVersion -replace '^v', '') -split '\.' | Select-Object -First 1
|
|
|
|
if ([int]$nodeMajorVersion -lt 18) {
|
|
Write-ColorOutput "Node.js version $nodeMajorVersion is too old! Node.js 18 or newer is required." -Type Error
|
|
exit 1
|
|
}
|
|
|
|
Write-ColorOutput "Node.js found: $nodeFullVersion" -Type Success
|
|
} else {
|
|
Write-ColorOutput "Node.js not found. Node.js 18 or newer is required to install Claude Code." -Type Error
|
|
exit 1
|
|
}
|
|
|
|
# Check Git
|
|
$gitCmd = Get-Command git -ErrorAction SilentlyContinue
|
|
if (-not $gitCmd) {
|
|
Write-ColorOutput "Git not found. Please install Git from https://git-scm.com/" -Type Error
|
|
exit 1
|
|
} else {
|
|
$version = & git --version
|
|
Write-ColorOutput "Git found: $version" -Type Success
|
|
}
|
|
|
|
# Check Python (optional)
|
|
$pythonCmd = Get-Command python -ErrorAction SilentlyContinue
|
|
if (-not $pythonCmd) {
|
|
$pythonCmd = Get-Command python3 -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
if ($pythonCmd) {
|
|
$version = & $pythonCmd --version
|
|
Write-ColorOutput "Python found: $version" -Type Success
|
|
|
|
# Try to install Ralph Orchestrator
|
|
Write-ColorOutput "Installing Ralph Orchestrator..." -Type Info
|
|
try {
|
|
& $pythonCmd -m pip install ralph-orchestrator 2>$null
|
|
if ($LASTEXITCODE -eq 0) {
|
|
Write-ColorOutput "Ralph Orchestrator installed." -Type Success
|
|
}
|
|
} catch {
|
|
Write-ColorOutput "Could not install Ralph Orchestrator (optional)." -Type Warning
|
|
}
|
|
} else {
|
|
Write-ColorOutput "Python not found. Some features may not work." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Download-Repository {
|
|
Write-ColorOutput "Downloading SuperCharge Claude Code package..." -Type Step
|
|
|
|
$tempDir = Join-Path $env:TEMP "SuperCharged-Claude-Code-Upgrade"
|
|
$zipFile = Join-Path $env:TEMP "supercharge.zip"
|
|
$repoUrl = "https://github.rommark.dev/admin/SuperCharged-Claude-Code-Upgrade/archive/refs/heads/main.zip"
|
|
|
|
# Clean up any existing download
|
|
if (Test-Path $tempDir) {
|
|
Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|
|
if (Test-Path $zipFile) {
|
|
Remove-Item -Path $zipFile -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
# Download the repository
|
|
try {
|
|
Write-ColorOutput "Downloading from: $repoUrl" -Type Info
|
|
Invoke-WebRequest -Uri $repoUrl -OutFile $zipFile -UseBasicParsing
|
|
|
|
# Extract the zip
|
|
Write-ColorOutput "Extracting files..." -Type Info
|
|
Expand-Archive -Path $zipFile -DestinationPath $env:TEMP -Force
|
|
|
|
# Rename the extracted folder
|
|
$extractedDir = Join-Path $env:TEMP "SuperCharged-Claude-Code-Upgrade-main"
|
|
if (Test-Path $extractedDir) {
|
|
Move-Item -Path $extractedDir -Destination $tempDir -Force
|
|
}
|
|
|
|
Write-ColorOutput "Repository downloaded to: $tempDir" -Type Success
|
|
return $tempDir
|
|
} catch {
|
|
Write-ColorOutput "Failed to download repository: $_" -Type Error
|
|
return $null
|
|
}
|
|
}
|
|
|
|
function Copy-DirectoryContent {
|
|
param(
|
|
[string]$Source,
|
|
[string]$Destination
|
|
)
|
|
|
|
if (Test-Path $Source) {
|
|
# Create destination if it doesn't exist
|
|
if (-not (Test-Path $Destination)) {
|
|
New-Item -Path $Destination -ItemType Directory -Force | Out-Null
|
|
}
|
|
|
|
# Copy all contents from source to destination
|
|
# Using -Container to properly handle nested directories
|
|
Copy-Item -Path "$Source\*" -Destination $Destination -Recurse -Force -ErrorAction SilentlyContinue
|
|
return $true
|
|
}
|
|
return $false
|
|
}
|
|
|
|
function Install-Skills {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing custom skills..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$skillsDir = Join-Path $SourceDir "skills"
|
|
$destDir = Join-Path $claudeDir "skills"
|
|
|
|
if (Copy-DirectoryContent -Source $skillsDir -Destination $destDir) {
|
|
$count = (Get-ChildItem -Path $destDir -Filter "SKILL.md" -Recurse -ErrorAction SilentlyContinue).Count
|
|
Write-ColorOutput "Installed $count custom skills." -Type Success
|
|
} else {
|
|
Write-ColorOutput "Skills directory not found in source." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Install-Agents {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing agent management system..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$agentsDir = Join-Path $SourceDir "agents"
|
|
$destDir = Join-Path $claudeDir "agents"
|
|
|
|
if (Copy-DirectoryContent -Source $agentsDir -Destination $destDir) {
|
|
Write-ColorOutput "Agent management system installed." -Type Success
|
|
} else {
|
|
Write-ColorOutput "Agents directory not found in source." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Install-Hooks {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing custom hooks..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$hooksDir = Join-Path $SourceDir "hooks"
|
|
$destDir = Join-Path $claudeDir "hooks"
|
|
|
|
if (Copy-DirectoryContent -Source $hooksDir -Destination $destDir) {
|
|
Write-ColorOutput "Custom hooks installed." -Type Success
|
|
} else {
|
|
Write-ColorOutput "Hooks directory not found in source." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Install-Commands {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing custom commands..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$commandsDir = Join-Path $SourceDir "commands"
|
|
$destDir = Join-Path $claudeDir "commands"
|
|
|
|
if (Copy-DirectoryContent -Source $commandsDir -Destination $destDir) {
|
|
$count = (Get-ChildItem -Path $destDir -ErrorAction SilentlyContinue).Count
|
|
Write-ColorOutput "Installed $count custom commands." -Type Success
|
|
} else {
|
|
Write-ColorOutput "Commands directory not found in source." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Install-Plugins {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing plugin references..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$pluginsDir = Join-Path $SourceDir "plugins"
|
|
$destDir = Join-Path $claudeDir "plugins"
|
|
|
|
if (Copy-DirectoryContent -Source $pluginsDir -Destination $destDir) {
|
|
$count = (Get-ChildItem -Path $destDir -Directory -ErrorAction SilentlyContinue).Count
|
|
Write-ColorOutput "Installed $count plugin references." -Type Success
|
|
} else {
|
|
Write-ColorOutput "Plugins directory not found in source." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Install-Scripts {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing utility scripts..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$scriptsDir = Join-Path $SourceDir "scripts"
|
|
$destDir = Join-Path $claudeDir "scripts"
|
|
|
|
if (Copy-DirectoryContent -Source $scriptsDir -Destination $destDir) {
|
|
Write-ColorOutput "Utility scripts installed." -Type Success
|
|
} else {
|
|
Write-ColorOutput "Scripts directory not found in source." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Install-Templates {
|
|
param([string]$SourceDir)
|
|
|
|
Write-ColorOutput "Installing configuration templates..." -Type Step
|
|
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
$templatesDir = Join-Path $SourceDir "templates"
|
|
|
|
if (Test-Path $templatesDir) {
|
|
# Install config.json if not exists
|
|
$configJson = Join-Path $templatesDir "config.json"
|
|
if ((Test-Path $configJson) -and -not (Test-Path (Join-Path $claudeDir "config.json"))) {
|
|
Copy-Item -Path $configJson -Destination (Join-Path $claudeDir "config.json") -Force
|
|
Write-ColorOutput "config.json installed." -Type Success
|
|
}
|
|
|
|
# Install hooks.json if not exists
|
|
$hooksJson = Join-Path $templatesDir "hooks.json"
|
|
if ((Test-Path $hooksJson) -and -not (Test-Path (Join-Path $claudeDir "hooks.json"))) {
|
|
Copy-Item -Path $hooksJson -Destination (Join-Path $claudeDir "hooks.json") -Force
|
|
Write-ColorOutput "hooks.json installed." -Type Success
|
|
}
|
|
|
|
# Install settings.local.json if not exists
|
|
$settingsLocalJson = Join-Path $templatesDir "settings.local.json"
|
|
if ((Test-Path $settingsLocalJson) -and -not (Test-Path (Join-Path $claudeDir "settings.local.json"))) {
|
|
Copy-Item -Path $settingsLocalJson -Destination (Join-Path $claudeDir "settings.local.json") -Force
|
|
Write-ColorOutput "settings.local.json installed." -Type Success
|
|
}
|
|
} else {
|
|
Write-ColorOutput "Templates directory not found." -Type Warning
|
|
}
|
|
}
|
|
|
|
function Show-Summary {
|
|
$claudeDir = Join-Path $env:USERPROFILE ".claude"
|
|
|
|
Write-Host ""
|
|
Write-Host "╔═══════════════════════════════════════════════════════════════╗" -ForegroundColor Green
|
|
Write-Host "║ INSTALLATION COMPLETE! ║" -ForegroundColor Green
|
|
Write-Host "╚═══════════════════════════════════════════════════════════════╝" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "Your Claude Code installation is now SUPERCHARGED!" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "Installed Features:" -ForegroundColor Cyan
|
|
Write-Host " [OK] 30+ Custom Skills (cognitive, development, UI/UX)" -ForegroundColor Green
|
|
Write-Host " [OK] RalphLoop Autonomous Agent Integration" -ForegroundColor Green
|
|
Write-Host " [OK] Multi-AI Consultation (Qwen)" -ForegroundColor Green
|
|
Write-Host " [OK] Agent Management System" -ForegroundColor Green
|
|
Write-Host " [OK] Custom Hooks & Commands" -ForegroundColor Green
|
|
Write-Host " [OK] Plugin Marketplace Setup" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "New Commands Available:" -ForegroundColor Cyan
|
|
Write-Host " /ralph - Autonomous 'Tackle Until Solved' agent" -ForegroundColor Yellow
|
|
Write-Host " /brainstorm - Multi-AI brainstorming session" -ForegroundColor Yellow
|
|
Write-Host " /write-plan - Create implementation plans" -ForegroundColor Yellow
|
|
Write-Host " /execute-plan - Execute written plans" -ForegroundColor Yellow
|
|
Write-Host ""
|
|
Write-Host "Quick Start:" -ForegroundColor Cyan
|
|
Write-Host " 1. Close and reopen your terminal" -ForegroundColor White
|
|
Write-Host " 2. Run Claude Code: claude" -ForegroundColor Yellow
|
|
Write-Host " 3. Try: /ralph 'Design a microservices architecture'" -ForegroundColor Yellow
|
|
Write-Host ""
|
|
Write-Host "Configuration:" -ForegroundColor Cyan
|
|
Write-Host " Config dir: $claudeDir" -ForegroundColor Yellow
|
|
Write-Host ""
|
|
Write-Host "Enjoy your supercharged Claude Code experience!" -ForegroundColor Green
|
|
Write-Host ""
|
|
}
|
|
|
|
################################################################################
|
|
# Main Installation
|
|
################################################################################
|
|
|
|
function Main {
|
|
Show-Banner
|
|
|
|
# Check for Claude Code
|
|
$claudeInstalled = Test-ClaudeCode
|
|
if (-not $claudeInstalled) {
|
|
Write-Host ""
|
|
Write-Host "Customizations installed. Install Claude Code to use them." -ForegroundColor Cyan
|
|
Write-Host ""
|
|
Write-Host "Install Claude Code:" -ForegroundColor Cyan
|
|
Write-Host " npm install -g @anthropic-ai/claude-code" -ForegroundColor White
|
|
Write-Host ""
|
|
return
|
|
}
|
|
|
|
# Run installation steps
|
|
Backup-ExistingConfig
|
|
Install-Dependencies
|
|
|
|
# Download the repository
|
|
$repoDir = Download-Repository
|
|
if (-not $repoDir) {
|
|
Write-ColorOutput "Failed to download repository. Installation aborted." -Type Error
|
|
exit 1
|
|
}
|
|
|
|
# Install all components
|
|
Install-Skills -SourceDir $repoDir
|
|
Install-Agents -SourceDir $repoDir
|
|
Install-Hooks -SourceDir $repoDir
|
|
Install-Commands -SourceDir $repoDir
|
|
Install-Plugins -SourceDir $repoDir
|
|
Install-Scripts -SourceDir $repoDir
|
|
Install-Templates -SourceDir $repoDir
|
|
|
|
# Clean up
|
|
Write-ColorOutput "Cleaning up temporary files..." -Type Info
|
|
$zipFile = Join-Path $env:TEMP "supercharge.zip"
|
|
if (Test-Path $zipFile) {
|
|
Remove-Item -Path $zipFile -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
Show-Summary
|
|
}
|
|
|
|
# Run main function
|
|
try {
|
|
Main
|
|
} catch {
|
|
Write-ColorOutput "Installation failed: $_" -Type Error
|
|
exit 1
|
|
}
|