-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdev.sh
More file actions
executable file
·108 lines (94 loc) · 4.85 KB
/
Copy pathdev.sh
File metadata and controls
executable file
·108 lines (94 loc) · 4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/bash
set -e
PROJECT_ROOT="$(cd "$(dirname "$0")" && pwd)"
# ── Load .env if present (never committed — see .gitignore) ───────────────────
if [ -f "$PROJECT_ROOT/.env" ]; then
set -a
# shellcheck disable=SC1091
source "$PROJECT_ROOT/.env"
set +a
echo " Loaded .env"
fi
echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║ Spec-Drift Chronometer — Dev Launcher ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo ""
# ── Defaults (env vars from .env take precedence over these) ──────────────────
export DEMO_MODE="${DEMO_MODE:-true}"
export DRIFT_THRESHOLD="${DRIFT_THRESHOLD:-0.0075}"
BACKEND_PORT="${BACKEND_PORT:-8000}"
FRONTEND_PORT="${FRONTEND_PORT:-3000}"
echo " DEMO_MODE = $DEMO_MODE"
echo " DRIFT_THRESHOLD = $DRIFT_THRESHOLD"
echo " Backend port = $BACKEND_PORT"
echo " Frontend port = $FRONTEND_PORT"
echo ""
# ── Cleanup on Ctrl+C ─────────────────────────────────────────────────────────
cleanup() {
echo ""
echo "Shutting down Spec-Drift Chronometer..."
kill "$BACKEND_PID" "$FRONTEND_PID" 2>/dev/null || true
sleep 1
kill -9 "$BACKEND_PID" "$FRONTEND_PID" 2>/dev/null || true
echo "System offline."
exit 0
}
trap cleanup INT TERM
# ── Python virtual environment ─────────────────────────────────────────────────
echo "[1/4] Setting up Python environment..."
cd "$PROJECT_ROOT"
if [ ! -d "venv" ]; then
python3 -m venv venv
fi
# shellcheck disable=SC1091
source venv/bin/activate
pip install -r backend/requirements.txt --quiet
# ── Backend ────────────────────────────────────────────────────────────────────
echo "[2/4] Starting Warden Engine (backend) on port $BACKEND_PORT..."
cd "$PROJECT_ROOT/backend"
python -m uvicorn main:app --host 0.0.0.0 --port "$BACKEND_PORT" --reload > "$PROJECT_ROOT/backend.log" 2>&1 &
BACKEND_PID=$!
cd "$PROJECT_ROOT"
# Wait for backend to be ready
echo " Waiting for backend..."
for i in $(seq 1 15); do
if curl -sf "http://localhost:${BACKEND_PORT}/drift" > /dev/null 2>&1; then
echo " Backend LIVE at http://localhost:${BACKEND_PORT}"
break
fi
sleep 1
if [ "$i" -eq 15 ]; then
echo " WARNING: Backend did not start in 15s. Check backend.log for errors."
fi
done
# ── Frontend env ───────────────────────────────────────────────────────────────
echo "[3/4] Writing frontend environment..."
cat > "$PROJECT_ROOT/frontend/.env.local" <<EOF
# Auto-generated by dev.sh — edit for production
NEXT_PUBLIC_API_URL=http://localhost:${BACKEND_PORT}
EOF
# ── Frontend ───────────────────────────────────────────────────────────────────
echo "[4/4] Starting Dashboard (frontend) on port $FRONTEND_PORT..."
cd "$PROJECT_ROOT/frontend"
if [ ! -d "node_modules" ]; then
echo " Installing frontend dependencies (first run only)..."
npm install --quiet
fi
npm run dev -- --port "$FRONTEND_PORT" > "$PROJECT_ROOT/frontend.log" 2>&1 &
FRONTEND_PID=$!
cd "$PROJECT_ROOT"
# Brief pause for Next.js to start compiling
sleep 3
echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║ System is LIVE ║"
echo "║ ║"
echo "║ Dashboard → http://localhost:${FRONTEND_PORT} ║"
echo "║ Backend API → http://localhost:${BACKEND_PORT} ║"
echo "║ ║"
echo "║ Logs: backend.log | frontend.log ║"
echo "║ Press [CTRL+C] to stop all services. ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo ""
wait