#!/bin/bash # Kill existing processes on our ports using PowerShell - with retry kill_port() { local port=$1 for i in 1 2 3; do powershell -Command "Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id \$_.OwningProcess -Force -ErrorAction SilentlyContinue }" 2>/dev/null sleep 1 # Check if port is free if ! powershell -Command "Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue" 2>/dev/null | grep -q LISTENING; then break fi done } echo "Cleaning up existing processes..." kill_port 4000 kill_port 5173 sleep 2 # Get the script directory and resolve to absolute Windows path SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" # Start server in background cd "$ROOT_DIR/apps/server" nohup npx tsx watch src/main.ts > "$ROOT_DIR/data/server.log" 2>&1 & SERVER_PID=$! echo "Server started (PID: $SERVER_PID)" # Start web in background cd "$ROOT_DIR/apps/web" nohup npm run dev > "$ROOT_DIR/data/web.log" 2>&1 & WEB_PID=$! echo "Web started (PID: $WEB_PID)" # Wait for both to be ready echo "Waiting for services to start..." sleep 6 # Check health sleep 2 if curl -s http://127.0.0.1:4000/health 2>/dev/null | grep -q "ok"; then echo "✓ Server is running on http://localhost:4000" else echo "✗ Server failed to start" echo "Server log:" cat "$ROOT_DIR/data/server.log" 2>/dev/null | tail -20 exit 1 fi if curl -s http://127.0.0.1:5173/ 2>/dev/null | grep -qi "campaign"; then echo "✓ Web is running on http://localhost:5173" else # Fallback: check if port is listening if netstat -ano 2>/dev/null | grep -q ":5173.*LISTENING"; then echo "✓ Web is running on http://localhost:5173" else echo "✗ Web failed to start" echo "Web log:" cat "$ROOT_DIR/data/web.log" 2>/dev/null | tail -10 fi fi echo "" echo "Both services running. Press Ctrl+C to stop." # Handle Ctrl+C cleanup() { echo "Stopping services..." taskkill //F //PID $SERVER_PID 2>/dev/null taskkill //F //PID $WEB_PID 2>/dev/null exit 0 } trap cleanup INT TERM # Keep script running wait