# FSS-Mini-RAG PowerShell Installation Script # Interactive installer that sets up Python environment and dependencies # Enable advanced features $ErrorActionPreference = "Stop" # Color functions for better output function Write-ColorOutput($message, $color = "White") { Write-Host $message -ForegroundColor $color } function Write-Header($message) { Write-Host "`n" -NoNewline Write-ColorOutput "=== $message ===" "Cyan" } function Write-Success($message) { Write-ColorOutput "✅ $message" "Green" } function Write-Warning($message) { Write-ColorOutput "⚠️ $message" "Yellow" } function Write-Error($message) { Write-ColorOutput "❌ $message" "Red" } function Write-Info($message) { Write-ColorOutput "ℹ️ $message" "Blue" } # Get script directory $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path # Main installation function function Main { Write-Host "" Write-ColorOutput "╔══════════════════════════════════════╗" "Cyan" Write-ColorOutput "║ FSS-Mini-RAG Installer ║" "Cyan" Write-ColorOutput "║ Fast Semantic Search for Code ║" "Cyan" Write-ColorOutput "╚══════════════════════════════════════╝" "Cyan" Write-Host "" Write-Info "PowerShell installation process:" Write-Host " • Python environment setup" Write-Host " • Smart configuration based on your system" Write-Host " • Optional AI model downloads (with consent)" Write-Host " • Testing and verification" Write-Host "" Write-ColorOutput "Note: You'll be asked before downloading any models" "Cyan" Write-Host "" $continue = Read-Host "Begin installation? [Y/n]" if ($continue -eq "n" -or $continue -eq "N") { Write-Host "Installation cancelled." exit 0 } # Run installation steps Check-Python Create-VirtualEnvironment # Check Ollama availability $ollamaAvailable = Check-Ollama # Get installation preferences Get-InstallationPreferences $ollamaAvailable # Install dependencies Install-Dependencies # Setup models if available if ($ollamaAvailable) { Setup-OllamaModel } # Test installation if (Test-Installation) { Show-Completion } else { Write-Error "Installation test failed" Write-Host "Please check error messages and try again." exit 1 } } function Check-Python { Write-Header "Checking Python Installation" # Try different Python commands $pythonCmd = $null $pythonVersion = $null foreach ($cmd in @("python", "python3", "py")) { try { $version = & $cmd --version 2>&1 if ($LASTEXITCODE -eq 0) { $pythonCmd = $cmd $pythonVersion = ($version -split " ")[1] break } } catch { continue } } if (-not $pythonCmd) { Write-Error "Python not found!" Write-Host "" Write-ColorOutput "Please install Python 3.8+ from:" "Yellow" Write-Host " • https://python.org/downloads" Write-Host " • Make sure to check 'Add Python to PATH' during installation" Write-Host "" Write-ColorOutput "After installing Python, run this script again." "Cyan" exit 1 } # Check version $versionParts = $pythonVersion -split "\." $major = [int]$versionParts[0] $minor = [int]$versionParts[1] if ($major -lt 3 -or ($major -eq 3 -and $minor -lt 8)) { Write-Error "Python $pythonVersion found, but 3.8+ required" Write-Host "Please upgrade Python to 3.8 or higher." exit 1 } Write-Success "Found Python $pythonVersion ($pythonCmd)" $script:PythonCmd = $pythonCmd } function Create-VirtualEnvironment { Write-Header "Creating Python Virtual Environment" $venvPath = Join-Path $ScriptDir ".venv" if (Test-Path $venvPath) { Write-Info "Virtual environment already exists at $venvPath" $recreate = Read-Host "Recreate it? (y/N)" if ($recreate -eq "y" -or $recreate -eq "Y") { Write-Info "Removing existing virtual environment..." Remove-Item -Recurse -Force $venvPath } else { Write-Success "Using existing virtual environment" return } } Write-Info "Creating virtual environment at $venvPath" try { & $script:PythonCmd -m venv $venvPath if ($LASTEXITCODE -ne 0) { throw "Virtual environment creation failed" } Write-Success "Virtual environment created" } catch { Write-Error "Failed to create virtual environment" Write-Host "This might be because python venv module is not available." Write-Host "Try installing Python from python.org with full installation." exit 1 } # Activate virtual environment and upgrade pip $activateScript = Join-Path $venvPath "Scripts\Activate.ps1" if (Test-Path $activateScript) { & $activateScript Write-Success "Virtual environment activated" Write-Info "Upgrading pip..." try { & python -m pip install --upgrade pip --quiet } catch { Write-Warning "Could not upgrade pip, continuing anyway..." } } } function Check-Ollama { Write-Header "Checking Ollama (AI Model Server)" try { $response = Invoke-WebRequest -Uri "http://localhost:11434/api/version" -TimeoutSec 5 -ErrorAction SilentlyContinue if ($response.StatusCode -eq 200) { Write-Success "Ollama server is running" return $true } } catch { # Ollama not running, check if installed } try { & ollama version 2>$null if ($LASTEXITCODE -eq 0) { Write-Warning "Ollama is installed but not running" $startOllama = Read-Host "Start Ollama now? (Y/n)" if ($startOllama -ne "n" -and $startOllama -ne "N") { Write-Info "Starting Ollama server..." Start-Process -FilePath "ollama" -ArgumentList "serve" -WindowStyle Hidden Start-Sleep -Seconds 3 try { $response = Invoke-WebRequest -Uri "http://localhost:11434/api/version" -TimeoutSec 5 -ErrorAction SilentlyContinue if ($response.StatusCode -eq 200) { Write-Success "Ollama server started" return $true } } catch { Write-Warning "Failed to start Ollama automatically" Write-Host "Please start Ollama manually: ollama serve" return $false } } return $false } } catch { # Ollama not installed } Write-Warning "Ollama not found" Write-Host "" Write-ColorOutput "Ollama provides the best embedding quality and performance." "Cyan" Write-Host "" Write-ColorOutput "Options:" "White" Write-ColorOutput "1) Install Ollama automatically" "Green" -NoNewline Write-Host " (recommended)" Write-ColorOutput "2) Manual installation" "Yellow" -NoNewline Write-Host " - Visit https://ollama.com/download" Write-ColorOutput "3) Continue without Ollama" "Blue" -NoNewline Write-Host " (uses ML fallback)" Write-Host "" $choice = Read-Host "Choose [1/2/3]" switch ($choice) { "1" { Write-Info "Opening Ollama download page..." Start-Process "https://ollama.com/download" Write-Host "" Write-ColorOutput "Please:" "Yellow" Write-Host " 1. Download and install Ollama from the opened page" Write-Host " 2. Run 'ollama serve' in a new terminal" Write-Host " 3. Re-run this installer" Write-Host "" Read-Host "Press Enter to exit" exit 0 } "2" { Write-Host "" Write-ColorOutput "Manual Ollama installation:" "Yellow" Write-Host " 1. Visit: https://ollama.com/download" Write-Host " 2. Download and install for Windows" Write-Host " 3. Run: ollama serve" Write-Host " 4. Re-run this installer" Read-Host "Press Enter to exit" exit 0 } "3" { Write-Info "Continuing without Ollama (will use ML fallback)" return $false } default { Write-Warning "Invalid choice, continuing without Ollama" return $false } } } function Get-InstallationPreferences($ollamaAvailable) { Write-Header "Installation Configuration" Write-ColorOutput "FSS-Mini-RAG can run with different embedding backends:" "Cyan" Write-Host "" Write-ColorOutput "• Ollama" "Green" -NoNewline Write-Host " (recommended) - Best quality, local AI server" Write-ColorOutput "• ML Fallback" "Yellow" -NoNewline Write-Host " - Offline transformers, larger but always works" Write-ColorOutput "• Hash-based" "Blue" -NoNewline Write-Host " - Lightweight fallback, basic similarity" Write-Host "" if ($ollamaAvailable) { $recommended = "light (Ollama detected)" Write-ColorOutput "✓ Ollama detected - light installation recommended" "Green" } else { $recommended = "full (no Ollama)" Write-ColorOutput "⚠ No Ollama - full installation recommended for better quality" "Yellow" } Write-Host "" Write-ColorOutput "Installation options:" "White" Write-ColorOutput "L) Light" "Green" -NoNewline Write-Host " - Ollama + basic deps (~50MB) " -NoNewline Write-ColorOutput "← Best performance + AI chat" "Cyan" Write-ColorOutput "F) Full" "Yellow" -NoNewline Write-Host " - Light + ML fallback (~2-3GB) " -NoNewline Write-ColorOutput "← Works without Ollama" "Cyan" Write-Host "" $choice = Read-Host "Choose [L/F] or Enter for recommended ($recommended)" if ($choice -eq "") { if ($ollamaAvailable) { $choice = "L" } else { $choice = "F" } } switch ($choice.ToUpper()) { "L" { $script:InstallType = "light" Write-ColorOutput "Selected: Light installation" "Green" } "F" { $script:InstallType = "full" Write-ColorOutput "Selected: Full installation" "Yellow" } default { Write-Warning "Invalid choice, using light installation" $script:InstallType = "light" } } } function Install-Dependencies { Write-Header "Installing Python Dependencies" if ($script:InstallType -eq "light") { Write-Info "Installing core dependencies (~50MB)..." Write-ColorOutput " Installing: lancedb, pandas, numpy, PyYAML, etc." "Blue" try { & pip install -r (Join-Path $ScriptDir "requirements.txt") --quiet if ($LASTEXITCODE -ne 0) { throw "Dependency installation failed" } Write-Success "Dependencies installed" } catch { Write-Error "Failed to install dependencies" Write-Host "Try: pip install -r requirements.txt" exit 1 } } else { Write-Info "Installing full dependencies (~2-3GB)..." Write-ColorOutput "This includes PyTorch and transformers - will take several minutes" "Yellow" try { & pip install -r (Join-Path $ScriptDir "requirements-full.txt") if ($LASTEXITCODE -ne 0) { throw "Dependency installation failed" } Write-Success "All dependencies installed" } catch { Write-Error "Failed to install dependencies" Write-Host "Try: pip install -r requirements-full.txt" exit 1 } } Write-Info "Verifying installation..." try { & python -c "import lancedb, pandas, numpy" 2>$null if ($LASTEXITCODE -ne 0) { throw "Package verification failed" } Write-Success "Core packages verified" } catch { Write-Error "Package verification failed" exit 1 } } function Setup-OllamaModel { # Implementation similar to bash version but adapted for PowerShell Write-Header "Ollama Model Setup" # For brevity, implementing basic version Write-Info "Ollama model setup available - see bash version for full implementation" } function Test-Installation { Write-Header "Testing Installation" Write-Info "Testing basic functionality..." try { & python -c "from mini_rag import CodeEmbedder, ProjectIndexer, CodeSearcher; print('✅ Import successful')" 2>$null if ($LASTEXITCODE -ne 0) { throw "Import test failed" } Write-Success "Python imports working" return $true } catch { Write-Error "Import test failed" return $false } } function Show-Completion { Write-Header "Installation Complete!" Write-ColorOutput "FSS-Mini-RAG is now installed!" "Green" Write-Host "" Write-ColorOutput "Quick Start Options:" "Cyan" Write-Host "" Write-ColorOutput "🎯 TUI (Beginner-Friendly):" "Green" Write-Host " rag-tui.bat" Write-Host " # Interactive interface with guided setup" Write-Host "" Write-ColorOutput "💻 CLI (Advanced):" "Blue" Write-Host " rag-mini.bat index C:\path\to\project" Write-Host " rag-mini.bat search C:\path\to\project `"query`"" Write-Host " rag-mini.bat status C:\path\to\project" Write-Host "" Write-ColorOutput "Documentation:" "Cyan" Write-Host " • README.md - Complete technical documentation" Write-Host " • docs\GETTING_STARTED.md - Step-by-step guide" Write-Host " • examples\ - Usage examples and sample configs" Write-Host "" $runTest = Read-Host "Run quick test now? [Y/n]" if ($runTest -ne "n" -and $runTest -ne "N") { Run-QuickTest } Write-Host "" Write-ColorOutput "🎉 Setup complete! FSS-Mini-RAG is ready to use." "Green" } function Run-QuickTest { Write-Header "Quick Test" Write-Info "Testing with FSS-Mini-RAG codebase..." $ragDir = Join-Path $ScriptDir ".mini-rag" if (Test-Path $ragDir) { Write-Success "Project already indexed, running search..." } else { Write-Info "Indexing FSS-Mini-RAG system for demo..." & python (Join-Path $ScriptDir "rag-mini.py") index $ScriptDir if ($LASTEXITCODE -ne 0) { Write-Error "Test indexing failed" return } } Write-Host "" Write-Success "Running demo search: 'embedding system'" & python (Join-Path $ScriptDir "rag-mini.py") search $ScriptDir "embedding system" --top-k 3 Write-Host "" Write-Success "Test completed successfully!" Write-ColorOutput "FSS-Mini-RAG is working perfectly on Windows!" "Cyan" } # Run main function Main