#!/usr/bin/env bash # Repeatable B12 smoke harness for running the reused Chatwoot frontend against GoChat. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" CHATWOOT_DIR="${CHATWOOT_DIR:-$ROOT/reference/chatwoot}" LOG_DIR="${GOCHAT_SMOKE_LOG_DIR:-$ROOT/.tmp/frontend-smoke}" REPORT_PATH="${GOCHAT_SMOKE_REPORT:-$ROOT/docs/parity/frontend_smoke_report.md}" API_HOST="${GOCHAT_SMOKE_API_HOST:-127.0.0.1}" API_PORT="${GOCHAT_SMOKE_API_PORT:-3000}" FRONTEND_HOST="${GOCHAT_SMOKE_FRONTEND_HOST:-127.0.0.1}" FRONTEND_PORT="${GOCHAT_SMOKE_FRONTEND_PORT:-3036}" SEARCH_ENGINE="${GOCHAT_SMOKE_SEARCH_ENGINE:-meilisearch}" MEILI_HOST="${GOCHAT_SMOKE_MEILI_HOST:-http://127.0.0.1:7700}" MEILI_API_KEY="${GOCHAT_SMOKE_MEILI_API_KEY:-gochat_dev}" MODE="run" KEEP_ALIVE="true" usage() { cat <&2; usage; exit 2 ;; esac done backend_cmd=(env GOCHAT_ENV=development GOCHAT_SERVER_HOST="$API_HOST" GOCHAT_SERVER_PORT="$API_PORT" GOCHAT_SERVER_MODE=debug GOCHAT_SEARCH_ENGINE="$SEARCH_ENGINE" GOCHAT_SEARCH_HOST="$MEILI_HOST" GOCHAT_SEARCH_API_KEY="$MEILI_API_KEY" GOCHAT_CAPTAIN_ENABLED=false go run ./cmd/gochat serve) frontend_cmd=(env CHATWOOT_API_HOST="http://$API_HOST:$API_PORT" pnpm exec vite --host "$FRONTEND_HOST" --port "$FRONTEND_PORT") need() { if ! command -v "$1" >/dev/null 2>&1; then echo "missing required command: $1" >&2 return 1 fi } write_report() { local status="$1" local notes="$2" mkdir -p "$(dirname "$REPORT_PATH")" cat >"$REPORT_PATH" <&2; return 1; } test -f "$CHATWOOT_DIR/package.json" || { echo "missing Chatwoot package.json" >&2; return 1; } test -f "$ROOT/cmd/gochat/main.go" || { echo "missing GoChat server entrypoint cmd/gochat/main.go" >&2; return 1; } } wait_url() { local url="$1" local label="$2" for _ in $(seq 1 60); do if curl -fsS "$url" >/dev/null 2>&1; then echo "$label ready: $url" return 0 fi sleep 1 done echo "$label did not become ready: $url" >&2 return 1 } print_commands() { echo "Backend: ${backend_cmd[*]}" echo "Frontend: (cd $CHATWOOT_DIR && ${frontend_cmd[*]})" echo "Report: $REPORT_PATH" } if [[ "$MODE" == "print" ]]; then print_commands exit 0 fi check_prereqs if [[ "$MODE" == "check" ]]; then env GOCACHE="${GOCACHE:-/tmp/gochat-gocache}" GOMODCACHE="${GOMODCACHE:-/tmp/gochat-gomodcache}" go test ./cmd/gochat -count=1 write_report "Harness readiness check passed; live frontend smoke not run in this mode." "Run \`scripts/parity_frontend_smoke.sh --boot-only\` after PostgreSQL, Redis, Meilisearch, and Chatwoot frontend dependencies are available." echo "check passed; report written to $REPORT_PATH" exit 0 fi mkdir -p "$LOG_DIR" trap 'jobs -pr | xargs -r kill 2>/dev/null || true' EXIT echo "starting GoChat backend..." (cd "$ROOT" && "${backend_cmd[@]}") >"$LOG_DIR/gochat.log" 2>&1 & wait_url "http://$API_HOST:$API_PORT/health" "GoChat" echo "starting reused Chatwoot frontend..." (cd "$CHATWOOT_DIR" && "${frontend_cmd[@]}") >"$LOG_DIR/chatwoot-vite.log" 2>&1 & wait_url "http://$FRONTEND_HOST:$FRONTEND_PORT" "Chatwoot Vite" write_report "Boot smoke passed for backend and reused Chatwoot frontend." "This run verified process boot and HTTP readiness only. B12.2 must add browser/API path assertions and update the smoke matrix." echo "smoke boot passed; report written to $REPORT_PATH" if [[ "$KEEP_ALIVE" == "true" ]]; then echo "press Ctrl-C to stop both processes" wait fi