#!/usr/bin/env bash # Monorepo Readiness Gate Script # Runs all tests and checks to prevent regressions across backend, web, desktop, and mobile set -e RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(dirname "$SCRIPT_DIR")" # Results tracking TOTAL_CHECKS=0 PASSED_CHECKS=0 FAILED_CHECKS=0 # Function to run a check and track results run_check() { local name="$1" local command="$2" TOTAL_CHECKS=$((TOTAL_CHECKS + 1)) echo -e "\n${BLUE}▶ Running: $name${NC}" if eval "$command"; then PASSED_CHECKS=$((PASSED_CHECKS + 1)) echo -e "${GREEN}✓ PASSED: $name${NC}" return 0 else FAILED_CHECKS=$((FAILED_CHECKS + 1)) echo -e "${RED}✗ FAILED: $name${NC}" return 1 fi } # Function to check if a command exists command_exists() { command -v "$1" >/dev/null 2>&1 } echo "==========================================" echo " SwingMusic Monorepo Readiness Gate" echo "==========================================" echo "" # =========================================== # BACKEND CHECKS # =========================================== echo -e "\n${YELLOW}════════════════════════════════════════${NC}" echo -e "${YELLOW} BACKEND CHECKS${NC}" echo -e "${YELLOW}════════════════════════════════════════${NC}" cd "$ROOT_DIR" # Check Python version run_check "Python version (3.11+)" "python3 --version | grep -E '3\.(1[1-9]|[2-9][0-9])'" # Check backend dependencies installed run_check "Backend dependencies" "test -d .venv || pip list | grep -q flask" # Run backend linting (if ruff available) if command_exists ruff; then run_check "Backend linting (ruff)" "ruff check src/swingmusic" fi # Run backend unit tests if [ -d "tests" ]; then run_check "Backend unit tests" "python3 -m pytest tests/ -v --tb=short -x" fi # Check backend can start run_check "Backend startup check" "python3 -c 'from swingmusic.app_builder import build; app = build(); print(\"OK\")'" # =========================================== # MOBILE CHECKS # =========================================== echo -e "\n${YELLOW}════════════════════════════════════════${NC}" echo -e "${YELLOW} MOBILE CHECKS${NC}" echo -e "${YELLOW}════════════════════════════════════════${NC}" MOBILE_DIR="$ROOT_DIR/swingmusic_mobile" if [ -d "$MOBILE_DIR" ]; then cd "$MOBILE_DIR" # Check Flutter is available if command_exists flutter; then run_check "Flutter version" "flutter --version" # Check Flutter dependencies run_check "Flutter pub get" "flutter pub get" # Run Flutter analyze run_check "Flutter analyze" "flutter analyze --no-fatal-infos" # Check Flutter build (dry run) run_check "Flutter build check" "flutter build apk --debug --target-platform android-arm64" else echo -e "${YELLOW}⚠ Flutter not installed, skipping mobile checks${NC}" fi else echo -e "${YELLOW}⚠ Mobile directory not found, skipping mobile checks${NC}" fi # =========================================== # WEB CLIENT CHECKS # =========================================== echo -e "\n${YELLOW}════════════════════════════════════════${NC}" echo -e "${YELLOW} WEB CLIENT CHECKS${NC}" echo -e "${YELLOW}════════════════════════════════════════${NC}" WEB_DIR="$ROOT_DIR/swingmusic_web" if [ -d "$WEB_DIR" ]; then cd "$WEB_DIR" # Check Node.js is available if command_exists node; then run_check "Node.js version" "node --version" # Check npm dependencies if [ -f "package.json" ]; then run_check "npm install" "npm install --quiet" # Run linting if command_exists npm; then run_check "npm lint" "npm run lint" # Build check run_check "npm build" "npm run build" fi fi else echo -e "${YELLOW}⚠ Node.js not installed, skipping web checks${NC}" fi else echo -e "${YELLOW}⚠ Web directory not found, skipping web checks${NC}" fi # =========================================== # DESKTOP CLIENT CHECKS # =========================================== echo -e "\n${YELLOW}════════════════════════════════════════${NC}" echo -e "${YELLOW} DESKTOP CLIENT CHECKS${NC}" echo -e "${YELLOW}════════════════════════════════════════${NC}" DESKTOP_DIR="$ROOT_DIR/swingmusic-desktop" if [ -d "$DESKTOP_DIR" ]; then cd "$DESKTOP_DIR" # Check Node.js is available if command_exists node; then run_check "Node.js version" "node --version" # Check npm dependencies if [ -f "package.json" ]; then run_check "npm install" "npm install --quiet" # Run linting if command_exists npm; then run_check "npm build" "npm run build" fi fi else echo -e "${YELLOW}⚠ Node.js not installed, skipping desktop checks${NC}" fi else echo -e "${YELLOW}⚠ Desktop directory not found, skipping desktop checks${NC}" fi # =========================================== # CROSS-PLATFORM CHECKS # =========================================== echo -e "\n${YELLOW}════════════════════════════════════════${NC}" echo -e "${YELLOW} CROSS-PLATFORM CHECKS${NC}" echo -e "${YELLOW}════════════════════════════════════════${NC}" cd "$ROOT_DIR" # Check for uncommitted changes (WIP state) if git diff --quiet 2>/dev/null && git diff --staged --quiet 2>/dev/null; then run_check "Git clean state" "true" else echo -e "${YELLOW}⚠ Uncommitted changes detected (WIP state)${NC}" run_check "Git clean state" "false" fi # Check for merge conflicts run_check "No merge conflicts" "! git diff --check 2>/dev/null || true" # Check for large files (>10MB) run_check "No large files" "! find . -type f -size +10M -not -path './.git/*' -not -path '*/node_modules/*' -not -path '*/.venv/*' | grep -q ." # =========================================== # SUMMARY # =========================================== echo -e "\n==========================================" echo -e " READINESS GATE SUMMARY" echo -e "==========================================" echo "" echo -e "Total checks: $TOTAL_CHECKS" echo -e "${GREEN}Passed: $PASSED_CHECKS${NC}" echo -e "${RED}Failed: $FAILED_CHECKS${NC}" echo "" # Calculate health score if [ "$TOTAL_CHECKS" -gt 0 ]; then HEALTH_SCORE=$((PASSED_CHECKS * 100 / TOTAL_CHECKS)) else HEALTH_SCORE=0 fi echo -e "Health Score: ${HEALTH_SCORE}%" echo "" if [ "$FAILED_CHECKS" -eq 0 ]; then echo -e "${GREEN}✓ ALL CHECKS PASSED - Repository is ready for deployment${NC}" exit 0 elif [ "$HEALTH_SCORE" -ge 80 ]; then echo -e "${YELLOW}⚠ MOSTLY READY - Some checks failed but score is acceptable${NC}" exit 0 else echo -e "${RED}✗ NOT READY - Too many checks failed, please fix issues${NC}" exit 1 fi