# QwenClaw Full Installation Script (Windows PowerShell) # # Usage: .\install.ps1 $ErrorActionPreference = "Stop" # Colors function Write-Color { param([string]$Text, [string]$Color) Write-Host $Text -ForegroundColor $Color } Write-Host "" Write-Color " ____ _ __ _ _ " "Cyan" Write-Color " / ___|_ __ __ _ ___| | __ / _(_) | ___ " "Cyan" Write-Color "| | | '__/ _` |/ __| |/ /| |_| | |/ _ \ " "Cyan" Write-Color " \____|_| \__,_|\___|_|\_\|_| |_|_|\___| " "Cyan" Write-Host "" Write-Color "Windows Installation Script" "Cyan" Write-Host "=============================" Write-Host "" $SCRIPT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location $SCRIPT_DIR $QWEN_DIR = Join-Path $env:USERPROFILE ".qwen" $QWENCLAW_DATA_DIR = Join-Path $QWEN_DIR "qwenclaw" # Step 1: Check prerequisites Write-Color "[1/6] Checking prerequisites..." "Yellow" # Check Git try { $gitVersion = git --version 2>&1 Write-Host "[OK] Git is installed" -ForegroundColor Green } catch { Write-Host "[ERROR] Git is not installed. Install from: https://git-scm.com" -ForegroundColor Red exit 1 } # Check Bun try { $bunVersion = bun --version 2>&1 Write-Host "[OK] Bun is installed (v$bunVersion)" -ForegroundColor Green } catch { Write-Host "[INFO] Bun is not installed. Installing..." -ForegroundColor Yellow try { powershell -c "irm bun.sh/install.ps1 | iex" $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") $bunVersion = bun --version 2>&1 Write-Host "[OK] Bun installed successfully (v$bunVersion)" -ForegroundColor Green } catch { Write-Host "[ERROR] Failed to install Bun. Install manually from: https://bun.sh" -ForegroundColor Red exit 1 } } # Step 2: Install dependencies Write-Host "" Write-Color "[2/6] Installing dependencies..." "Yellow" bun install Write-Host "[OK] Dependencies installed" -ForegroundColor Green # Step 3: Create directories Write-Host "" Write-Color "[3/6] Creating directories..." "Yellow" $dirs = @( $QWENCLAW_DATA_DIR, (Join-Path $QWENCLAW_DATA_DIR "jobs"), (Join-Path $QWENCLAW_DATA_DIR "logs"), (Join-Path $QWENCLAW_DATA_DIR "inbox"), (Join-Path $QWENCLAW_DATA_DIR "inbox\telegram") ) foreach ($dir in $dirs) { if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null Write-Host " Created: $dir" -ForegroundColor Green } } # Step 4: Create default settings Write-Host "" Write-Color "[4/6] Creating default configuration..." "Yellow" $SETTINGS_FILE = Join-Path $QWENCLAW_DATA_DIR "settings.json" if (-not (Test-Path $SETTINGS_FILE)) { $settings = @{ model = "" api = "" autoStart = $true fallback = @{ model = "" api = "" } timezone = "UTC" timezoneOffsetMinutes = 0 heartbeat = @{ enabled = $false interval = 15 prompt = "" excludeWindows = @() } telegram = @{ token = "" allowedUserIds = @() } security = @{ level = "moderate" allowedTools = @() disallowedTools = @() } web = @{ enabled = $true host = "127.0.0.1" port = 4632 } } $settings | ConvertTo-Json -Depth 10 | Out-File -FilePath $SETTINGS_FILE -Encoding utf8 Write-Host "[OK] Default settings created: $SETTINGS_FILE" -ForegroundColor Green } else { Write-Host "[INFO] Settings already exist, skipping" -ForegroundColor Yellow } # Step 5: Set up auto-start Write-Host "" Write-Color "[5/6] Configuring Windows auto-start..." "Yellow" $STARTUP_FOLDER = [Environment]::GetFolderPath("Startup") $STARTUP_BAT = Join-Path $STARTUP_FOLDER "QwenClaw Daemon.bat" # Create startup batch file $startupContent = @" @echo off cd /d "$SCRIPT_DIR" start /B bun run start --web "@ $startupContent | Out-File -FilePath $STARTUP_BAT -Encoding ASCII Write-Host "[OK] Windows auto-start configured" -ForegroundColor Green # Step 6: Initialize git Write-Host "" Write-Color "[6/6] Finalizing installation..." "Yellow" if (-not (Test-Path ".git")) { git init | Out-Null git checkout -b main 2>$null | Out-Null Write-Host "[OK] Git repository initialized" -ForegroundColor Green } else { Write-Host "[INFO] Git repository already exists" -ForegroundColor Yellow } # Create example job $EXAMPLE_JOB = Join-Path $QWENCLAW_DATA_DIR "jobs\example-daily-check.md" if (-not (Test-Path $EXAMPLE_JOB)) { $jobContent = @" --- schedule: 0 9 * * * recurring: true notify: true --- Good morning! Here's your daily check-in: 1. What are today's priorities? 2. Any pending tasks from yesterday? 3. Weather and calendar summary. "@ $jobContent | Out-File -FilePath $EXAMPLE_JOB -Encoding utf8 Write-Host "[OK] Example job created" -ForegroundColor Green } # Summary Write-Host "" Write-Host "========================================" -ForegroundColor Green Write-Host " Installation Complete!" -ForegroundColor Green Write-Host "========================================" -ForegroundColor Green Write-Host "" Write-Color "What's configured:" "Cyan" Write-Host " [OK] Dependencies installed" -ForegroundColor Green Write-Host " [OK] Directories created" -ForegroundColor Green Write-Host " [OK] Default settings created" -ForegroundColor Green Write-Host " [OK] Windows auto-start configured" -ForegroundColor Green Write-Host " [OK] Example job created" -ForegroundColor Green Write-Host "" Write-Color "Quick Start:" "Cyan" Write-Host " bun run start --web - Start daemon" -ForegroundColor White Write-Host " bun run status - Check status" -ForegroundColor White Write-Host " bun run stop - Stop daemon" -ForegroundColor White Write-Host " bun run send 'hello' - Send prompt" -ForegroundColor White Write-Host "" Write-Color "Web Dashboard:" "Cyan" Write-Host " http://127.0.0.1:4632" -ForegroundColor White Write-Host "" Write-Color "Configuration:" "Cyan" Write-Host " Edit: $SETTINGS_FILE" -ForegroundColor Yellow Write-Host " Jobs: $QWENCLAW_DATA_DIR\jobs\" -ForegroundColor Yellow Write-Host " Logs: $QWENCLAW_DATA_DIR\logs\" -ForegroundColor Yellow Write-Host "" Write-Color "Documentation:" "Cyan" Write-Host " README.md - Full documentation" -ForegroundColor White Write-Host " QUICKSTART.md - Quick reference" -ForegroundColor White Write-Host "" Write-Host "The daemon will start automatically when you log in to Windows." -ForegroundColor Green Write-Host ""