#!/bin/bash # Tigre (codeclass) - App GUI SwiftUI: build + empacota .app + abre. # Sobe um nivel: o script vive em admin/, o projeto e a pasta pai. # # Uso: # admin/run-app.command # build + indexa RAG + abre app # TIGRE_SKIP_RAG_INDEX=1 admin/run-app.command # pula a reindexação do RAG # TIGRE_APP_CONFIG=release admin/run-app.command# build release (otimizado) # # O que faz: # 1) build do TigreAppUI (via make-app.command) e monta o bundle Tigre.app # em ~/Applications/Tigre.app — um .app no macOS é uma pasta; a cada run # nós SOBRESCREVEMOS o bundle (sem "instalar/desinstalar" nada no sistema). # 2) reindexa o RAG do codeclass (rag/index_tigre.sh) — o build acabou de # atualizar Sources/; pode ser pulado com TIGRE_SKIP_RAG_INDEX=1 # 3) finaliza instancia anterior do app GUI, se houver # 4) abre o Tigre.app com `open` → macOS registra no LaunchServices: o app # aparece no Dock com ícone, Cmd+Tab, menu no topo e nome "Tigre". # # Nao conflita com deploy-codeclass.command (servidor web na porta 5050) — # os dois podem rodar juntos e enxergam os mesmos projetos. set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" CLASSDIR="$PROJECT_DIR/codeclass" APP_DIR="${TIGRE_APP_DIR:-$HOME/Applications/Tigre.app}" APP_BIN="$APP_DIR/Contents/MacOS/Tigre" LOG="/tmp/tigre-appui.log" echo "============================================================" echo " Tigre (codeclass) :: App GUI SwiftUI" echo " Pasta: $PROJECT_DIR" echo " App bundle: $APP_DIR" echo "============================================================" echo # 1) Empacotar/atualizar o bundle .app (faz o swift build internamente) echo "[1/3] Build + bundle .app (make-app.command)..." "$SCRIPT_DIR/make-app.command" || exit 1 echo # 2) Reindexar o RAG do codeclass (rag_tigre) — passo best effort: falha de # indexação (ex.: túnel SSH fora) NÃO impede o app de subir. RAG_INDEXER="$PROJECT_DIR/rag/index_tigre.sh" RAG_LOG="/tmp/tigre-rag-index.log" if [ "${TIGRE_SKIP_RAG_INDEX:-0}" = "1" ]; then echo "[2/3] Reindexação do RAG pulada (TIGRE_SKIP_RAG_INDEX=1)." elif [ ! -x "$RAG_INDEXER" ]; then echo "[2/3] AVISO: rag/index_tigre.sh não encontrado — reindexação pulada." else echo "[2/3] Reindexando o RAG do codeclass (rag/index_tigre.sh)..." if "$RAG_INDEXER" > "$RAG_LOG" 2>&1; then grep -E 'OK:|gravado' "$RAG_LOG" | tail -2 | sed 's/^/ /' echo " RAG indexado." else echo " AVISO: reindexação do RAG falhou (o app segue). Log: $RAG_LOG" tail -3 "$RAG_LOG" | sed 's/^/ /' fi fi echo # 3) Encerrar instancia anterior do app GUI — tanto do bundle (.app) quanto do # binario solto do .build (debug/release), senao sobram instancias antigas # vivas e o `open -n` abre uma nova por cima. echo "[3/3] Encerrando instâncias anteriores do Tigre (se houver)..." pkill -f "$APP_BIN" 2>/dev/null || true # instancia do bundle .app pkill -f "TigreAppUI" 2>/dev/null || true # binario solto do .build (debug/release) pkill -x "Tigre" 2>/dev/null || true # qualquer processo "Tigre" restante # Espera o processo encerrar de verdade (SIGTERM pode ser ignorado pelo app) for _ in 1 2 3 4 5; do pgrep -f "TigreAppUI|$APP_BIN" >/dev/null 2>&1 || break sleep 1 done # Forca a saida se ainda estiver vivo pkill -9 -f "$APP_BIN" 2>/dev/null || true pkill -9 -f "TigreAppUI" 2>/dev/null || true pkill -9 -x "Tigre" 2>/dev/null || true sleep 1 true # 4) Abrir o app via LaunchServices (`open`) — não é nohup de binário solto. # TIGRE_PROJECT_ROOT garante que o app ache o puente Python do legado. echo " Abrindo o Tigre.app..." TIGRE_PROJECT_ROOT="$PROJECT_DIR" open -n "$APP_DIR" echo # Confere se o processo do bundle subiu sleep 3 if pgrep -f "$APP_BIN" >/dev/null 2>&1; then echo "============================================================" echo " Tigre no ar. Ele aparece no Dock com icon e nome 'Tigre'." echo " Para encerrar: Cmd+Q no app | pkill -f '$APP_BIN'" echo " Para remover: rm -rf '$APP_DIR'" echo "============================================================" else echo "============================================================" echo " AVISO: nao detectamos o processo do app. Log do ultimo launch:" echo "------------------------------------------------------------" tail -20 "$LOG" 2>/dev/null || true echo "============================================================" fi # Fecha a janela do Terminal que rodou o .command (padrao G-ART run_app): # o app ja esta desacoplado, o script so encerra antes do aviso de # "finalizar processos nesta janela". ( sleep 2 osascript -e 'tell application "Terminal" to close (every window whose name contains "run-app")' >/dev/null 2>&1 ) & exit 0