Windows has reserved device names that cannot be used as file names: - CON, PRN, AUX, NUL - COM1-9, LPT1-9 Changed backup function from Copy-Item to Robocopy which properly handles these reserved names. This fixes the error when backing up .claude directories that contain files with these names. Robocopy exit codes: - 0-7 = Success - 8+ = Errors Co-Authored-By: Claude <noreply@anthropic.com>
497 lines
20 KiB
PowerShell
497 lines
20 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
|
|
}
|
|
|
|
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) {
|
|
$version = & node --version
|
|
Write-ColorOutput "Node.js found: $version" -Type Success
|
|
} else {
|
|
Write-ColorOutput "Node.js not found. Some features may not work." -Type Warning
|
|
}
|
|
|
|
# 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 items
|
|
Get-ChildItem -Path $Source -Force | ForEach-Object {
|
|
Copy-Item -Path $_.FullName -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
|
|
}
|