#!/usr/bin/env bash # brain-dev.sh — Démarrage brain en mode dev local (laptop / offline) # Usage : bash scripts/brain-dev.sh [--engine] [--ui] # Sans arguments → démarre brain-engine (mock désactivé) + brain-ui # --engine : démarre brain-engine localement sur :7700 (uvicorn) # --ui : démarre brain-ui en dev (npm run dev) # Sans aucun argument : démarre les deux (engine + ui) set -euo pipefail BRAIN_ROOT="$(cd "$(dirname "$0")/.." && pwd)" BRAIN_UI="$BRAIN_ROOT/brain-ui" ENGINE_PORT=7700 GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' ok() { echo -e "${GREEN}✅ $1${NC}"; } warn() { echo -e "${YELLOW}⚠️ $1${NC}"; } info() { echo -e " $1"; } # ── Parse args ──────────────────────────────────────────────────────────────── START_ENGINE=false START_UI=false if [[ $# -eq 0 ]]; then START_ENGINE=true START_UI=true fi for arg in "$@"; do case "$arg" in --engine) START_ENGINE=true ;; --ui) START_UI=true ;; *) echo "Usage: bash scripts/brain-dev.sh [--engine] [--ui]" echo " --engine : démarre brain-engine sur :$ENGINE_PORT" echo " --ui : démarre brain-ui en dev" echo " (sans args) : démarre les deux" exit 1 ;; esac done echo "" echo "╔══════════════════════════════════════════════╗" echo "║ brain-dev.sh — mode dev local ║" echo "╚══════════════════════════════════════════════╝" echo "" # ── Vérifications préalables ────────────────────────────────────────────────── if $START_ENGINE; then if ! command -v python3 &>/dev/null; then warn "python3 non trouvé — impossible de démarrer brain-engine" START_ENGINE=false fi if ! command -v uvicorn &>/dev/null && ! python3 -c "import uvicorn" 2>/dev/null; then warn "uvicorn non installé — pip3 install uvicorn[standard]" START_ENGINE=false fi fi if $START_UI; then if [[ ! -d "$BRAIN_UI" ]]; then warn "brain-ui absent ($BRAIN_UI) — --ui ignoré" START_UI=false elif ! command -v npm &>/dev/null; then warn "npm non trouvé — impossible de démarrer brain-ui" START_UI=false fi fi # ── Créer .env.local pour brain-ui ─────────────────────────────────────────── if [[ -d "$BRAIN_UI" ]]; then if $START_ENGINE; then # engine local disponible → pas de mock cat > "$BRAIN_UI/.env.local" << 'EOF' VITE_USE_MOCK=false VITE_BRAIN_API=http://localhost:7700 EOF ok "brain-ui/.env.local → engine local (:7700)" else # pas d'engine → mode mock cat > "$BRAIN_UI/.env.local" << 'EOF' VITE_USE_MOCK=true VITE_BRAIN_API= EOF ok "brain-ui/.env.local → mode mock (pas de VPS requis)" fi fi # ── Trap Ctrl+C → tuer les processus fils ──────────────────────────────────── PIDS=() cleanup() { echo "" info "Arrêt en cours..." for pid in "${PIDS[@]}"; do kill "$pid" 2>/dev/null || true done wait 2>/dev/null || true ok "Processus arrêtés proprement." exit 0 } trap cleanup INT TERM # ── Démarrer brain-engine ───────────────────────────────────────────────────── if $START_ENGINE; then info "Démarrage brain-engine sur :$ENGINE_PORT..." cd "$BRAIN_ROOT" BRAIN_PORT=$ENGINE_PORT python3 -m uvicorn brain-engine.server:app \ --host 0.0.0.0 --port $ENGINE_PORT --reload 2>&1 | sed 's/^/[engine] /' & PIDS+=($!) ok "brain-engine démarré (PID ${PIDS[-1]})" fi # ── Démarrer brain-ui ───────────────────────────────────────────────────────── if $START_UI; then info "Démarrage brain-ui (npm run dev)..." cd "$BRAIN_UI" npm run dev 2>&1 | sed 's/^/[ui] /' & PIDS+=($!) ok "brain-ui démarré (PID ${PIDS[-1]})" fi if [[ ${#PIDS[@]} -eq 0 ]]; then warn "Aucun processus démarré — vérifier les prérequis ci-dessus." exit 1 fi echo "" if $START_ENGINE; then info "brain-engine : http://localhost:$ENGINE_PORT" info " /health : http://localhost:$ENGINE_PORT/health" fi if $START_UI; then info "brain-ui : http://localhost:5173 (port Vite par défaut)" fi echo "" info "Ctrl+C pour arrêter." echo "" # Attendre les processus fils wait