#!/usr/bin/env bash # AOS all-in-one verification: start server, verify, cleanup. set -u cd /home/z/my-project BASE=http://127.0.0.1:3000 SHOTS=/home/z/my-project/aos-shots mkdir -p "$SHOTS" echo "=== Starting dev server (output -> dev.log) ===" pkill -f "next dev" 2>/dev/null sleep 1 bun run dev > dev.log 2>&1 & SRV=$! echo " server pid $SRV" echo "=== Waiting for server ready ===" ok=0 for i in $(seq 1 90); do if curl -s -o /dev/null -w "%{http_code}" "$BASE/" 2>/dev/null | grep -q 200; then ok=1; break; fi sleep 1 done if [ "$ok" != "1" ]; then echo "SERVER NOT READY after ${i}s" echo "--- dev.log tail ---" tail -30 dev.log kill $SRV 2>/dev/null exit 1 fi echo " server ready after ${i}s" sleep 2 echo "" echo "=== API smoke tests ===" for ep in dashboard crm leads projects licenses finance modules audit; do code=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/api/aos/$ep") echo " /api/aos/$ep -> $code" done echo "" echo "=== Agent Browser: open dashboard ===" agent-browser open "$BASE/" >/dev/null 2>&1 agent-browser wait --load networkidle >/dev/null 2>&1 || true agent-browser wait 2000 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/01-dashboard.png" >/dev/null 2>&1 && echo " shot 01-dashboard OK" || echo " shot 01 FAILED" echo "" echo "=== Snapshot interactive (first 30 lines) ===" agent-browser snapshot -i 2>&1 | head -30 echo "" echo "=== Page errors so far ===" agent-browser errors 2>&1 | head -15 echo "" echo "=== Navigate: CRM ===" agent-browser find text "CRM" click >/dev/null 2>&1 agent-browser wait 2500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/02-crm.png" >/dev/null 2>&1 && echo " shot 02-crm OK" || echo " shot 02 FAILED" echo "=== Navigate: Leads Finder ===" agent-browser find text "Leads Finder" click >/dev/null 2>&1 agent-browser wait 2500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/03-leads.png" >/dev/null 2>&1 && echo " shot 03-leads OK" || echo " shot 03 FAILED" echo "=== Navigate: Projekte ===" agent-browser find text "Projekte" click >/dev/null 2>&1 agent-browser wait 2500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/04-projects.png" >/dev/null 2>&1 && echo " shot 04-projects OK" || echo " shot 04 FAILED" echo "=== Navigate: Lizenzen ===" agent-browser find text "Lizenzen" click >/dev/null 2>&1 agent-browser wait 2500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/05-licenses.png" >/dev/null 2>&1 && echo " shot 05-licenses OK" || echo " shot 05 FAILED" echo "=== Navigate: Finanzen ===" agent-browser find text "Finanzen" click >/dev/null 2>&1 agent-browser wait 2500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/06-finance.png" >/dev/null 2>&1 && echo " shot 06-finance OK" || echo " shot 06 FAILED" echo "=== Navigate: Erweiterungen ===" agent-browser find text "Erweiterungen" click >/dev/null 2>&1 agent-browser wait 2500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/07-settings.png" >/dev/null 2>&1 && echo " shot 07-settings OK" || echo " shot 07 FAILED" echo "" echo "=== Interactivity: Leads -> select first lead -> Erzeugen (AI) ===" agent-browser find text "Leads Finder" click >/dev/null 2>&1 agent-browser wait 2000 >/dev/null 2>&1 # click first lead card in the list agent-browser eval "document.querySelector('button[class*=border]')?.click()" >/dev/null 2>&1 agent-browser wait 1500 >/dev/null 2>&1 # click the Erzeugen button if present agent-browser find text "Erzeugen" click 2>&1 | head -3 agent-browser wait 10000 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/08-lead-explain.png" >/dev/null 2>&1 && echo " shot 08-explain OK" || echo " shot 08 FAILED" echo "" echo "=== Final error check ===" echo "--- page errors ---" agent-browser errors 2>&1 | head -15 echo "--- console (last 8) ---" agent-browser console 2>&1 | tail -8 echo "" echo "=== Sticky footer check (dashboard) ===" agent-browser find text "Dashboard" click >/dev/null 2>&1 agent-browser wait 1500 >/dev/null 2>&1 agent-browser eval "JSON.stringify({vh: window.innerHeight, bodyH: document.body.scrollHeight, footer: document.querySelector('footer') ? document.querySelector('footer').getBoundingClientRect().top : -1})" 2>&1 | tail -2 echo "" echo "=== Mobile viewport check ===" agent-browser set viewport 390 844 >/dev/null 2>&1 agent-browser wait 1000 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/09-mobile-dashboard.png" >/dev/null 2>&1 && echo " shot 09-mobile OK" || echo " shot 09 FAILED" agent-browser find text "CRM" click >/dev/null 2>&1 agent-browser wait 1500 >/dev/null 2>&1 agent-browser screenshot --full "$SHOTS/10-mobile-crm.png" >/dev/null 2>&1 && echo " shot 10-mobile-crm OK" || echo " shot 10 FAILED" # reset viewport agent-browser set viewport 1440 900 >/dev/null 2>&1 echo "" echo "=== Cleanup ===" agent-browser close >/dev/null 2>&1 kill $SRV 2>/dev/null sleep 1 echo "=== dev.log tail (last 20) ===" tail -20 dev.log echo "" echo "=== Screenshots ===" ls -la "$SHOTS" 2>/dev/null | tail -15 echo "" echo "=== VERIFICATION COMPLETE ==="