Files
pi-skill/skills/qa-automation/install.sh
2026-05-25 16:41:08 +07:00

274 lines
11 KiB
Bash
Executable File

#!/bin/bash
# ╔═══════════════════════════════════════════════════════════════════╗
# ║ install.sh — QA Automation Dependency Checker & Installer ║
# ╠═══════════════════════════════════════════════════════════════════╣
# ║ Checks for all required tools and installs any that are missing. ║
# ║ ║
# ║ Usage: ║
# ║ bash install.sh # Check + install missing ║
# ║ bash install.sh --check # Check only, don't install ║
# ╚═══════════════════════════════════════════════════════════════════╝
set -euo pipefail
CHECK_ONLY=false
if [ "${1:-}" = "--check" ]; then
CHECK_ONLY=true
fi
# ── Colors ───────────────────────────────────────────────────────────
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
RESET='\033[0m'
PASS_COUNT=0
FAIL_COUNT=0
INSTALLED_COUNT=0
echo ""
echo -e "${BOLD}╔═══════════════════════════════════════════════════════════╗${RESET}"
echo -e "${BOLD}║ QA Automation — Dependency Check & Install ║${RESET}"
echo -e "${BOLD}╚═══════════════════════════════════════════════════════════╝${RESET}"
echo ""
# ── Helper Functions ─────────────────────────────────────────────────
check_ok() {
echo -e " ${GREEN}${RESET} $1"
PASS_COUNT=$((PASS_COUNT + 1))
}
check_fail() {
echo -e " ${RED}${RESET} $1"
FAIL_COUNT=$((FAIL_COUNT + 1))
}
check_warn() {
echo -e " ${YELLOW}⚠️${RESET} $1"
}
check_install() {
echo -e " ${CYAN}📦${RESET} $1"
INSTALLED_COUNT=$((INSTALLED_COUNT + 1))
}
section() {
echo ""
echo -e "${BOLD}── $1 ──${RESET}"
}
# ── 1. Node.js ───────────────────────────────────────────────────────
section "Runtime"
if command -v node >/dev/null 2>&1; then
NODE_VERSION=$(node --version 2>/dev/null || echo "unknown")
check_ok "Node.js ${NODE_VERSION}"
else
check_fail "Node.js — not found"
echo " Install: https://nodejs.org or 'brew install node'"
fi
if command -v npm >/dev/null 2>&1; then
NPM_VERSION=$(npm --version 2>/dev/null || echo "unknown")
check_ok "npm ${NPM_VERSION}"
else
check_fail "npm — not found (usually installed with Node.js)"
fi
if command -v npx >/dev/null 2>&1; then
check_ok "npx available"
else
check_fail "npx — not found (usually installed with Node.js)"
fi
# ── 2. agent-device ──────────────────────────────────────────────────
section "agent-device (Native App Testing)"
if command -v agent-device >/dev/null 2>&1; then
AD_VERSION=$(agent-device --version 2>/dev/null || echo "unknown")
check_ok "agent-device ${AD_VERSION}"
else
check_fail "agent-device — not installed"
if [ "$CHECK_ONLY" = false ]; then
echo -e " ${CYAN}Installing agent-device...${RESET}"
if npm install -g agent-device 2>/dev/null; then
check_install "agent-device installed successfully"
else
check_warn "Install failed. Try: npm install -g agent-device"
fi
else
echo " Install: npm install -g agent-device"
fi
fi
# ── 3. agent-browser ─────────────────────────────────────────────────
section "agent-browser (Web App Testing)"
if command -v agent-browser >/dev/null 2>&1; then
AB_VERSION=$(agent-browser --version 2>/dev/null || echo "unknown")
check_ok "agent-browser ${AB_VERSION}"
else
check_fail "agent-browser — not installed"
if [ "$CHECK_ONLY" = false ]; then
echo -e " ${CYAN}Installing agent-browser...${RESET}"
if npm install -g agent-browser 2>/dev/null; then
check_install "agent-browser installed successfully"
else
check_warn "Install failed. Try: npm install -g agent-browser"
fi
else
echo " Install: npm install -g agent-browser"
fi
fi
# ── 4. WebSocket library (for CDP) ───────────────────────────────────
section "CDP Dependencies"
# Check if 'ws' is available (needed for CDP WebSocket connections)
WS_AVAILABLE=false
if node -e "require('ws')" 2>/dev/null; then
WS_VERSION=$(node -e "console.log(require('ws/package.json').version)" 2>/dev/null || echo "unknown")
check_ok "ws (WebSocket) ${WS_VERSION}"
WS_AVAILABLE=true
else
check_fail "ws (WebSocket) — not installed"
if [ "$CHECK_ONLY" = false ]; then
echo -e " ${CYAN}Installing ws...${RESET}"
if npm install -g ws 2>/dev/null; then
check_install "ws installed globally"
WS_AVAILABLE=true
else
# Try installing locally in project
echo " Global install failed. Trying local install..."
if npm install ws 2>/dev/null; then
check_install "ws installed locally"
WS_AVAILABLE=true
else
check_warn "Install failed. Run: npm install ws"
fi
fi
else
echo " Install: npm install ws (in your project)"
fi
fi
# ── 5. iOS Development Tools ─────────────────────────────────────────
section "iOS (optional — for native iOS testing)"
if command -v xcrun >/dev/null 2>&1; then
XCODE_VERSION=$(xcodebuild -version 2>/dev/null | head -1 || echo "unknown")
check_ok "Xcode / xcrun ($XCODE_VERSION)"
# Check for simulators
SIM_COUNT=$(xcrun simctl list devices available 2>/dev/null | grep -c "iPhone\|iPad" || echo "0")
if [ "$SIM_COUNT" -gt 0 ]; then
check_ok "iOS Simulators available ($SIM_COUNT devices)"
else
check_warn "No iOS simulators found. Create one via Xcode → Window → Devices and Simulators"
fi
else
check_warn "Xcode / xcrun — not found (needed for iOS simulator testing)"
echo " Install Xcode from the Mac App Store"
fi
# ── 6. Android Development Tools ─────────────────────────────────────
section "Android (optional — for native Android testing)"
ADB_FOUND=false
if command -v adb >/dev/null 2>&1; then
ADB_VERSION=$(adb --version 2>/dev/null | head -1 || echo "unknown")
check_ok "adb ($ADB_VERSION)"
ADB_FOUND=true
elif [ -f "$HOME/Library/Android/sdk/platform-tools/adb" ]; then
check_ok "adb (found at ~/Library/Android/sdk/platform-tools/adb)"
ADB_FOUND=true
else
check_warn "adb — not found (needed for Android emulator testing)"
echo " Install Android Studio or: brew install android-platform-tools"
fi
if [ -f "$HOME/Library/Android/sdk/emulator/emulator" ]; then
check_ok "Android Emulator available"
else
check_warn "Android Emulator — not found at default SDK path"
fi
# ── 7. Shell Environment ─────────────────────────────────────────────
section "Shell"
BASH_VERSION_STR=$(bash --version | head -1 | grep -oE '[0-9]+\.[0-9]+' | head -1 || echo "unknown")
BASH_MAJOR=$(echo "$BASH_VERSION_STR" | cut -d. -f1)
if [ "$BASH_MAJOR" -ge 4 ] 2>/dev/null; then
check_ok "Bash ${BASH_VERSION_STR} (4.0+ required for arrays)"
else
check_warn "Bash ${BASH_VERSION_STR} — version 4.0+ recommended"
echo " Install: brew install bash"
fi
if command -v curl >/dev/null 2>&1; then
check_ok "curl available"
else
check_fail "curl — not found"
fi
if command -v jq >/dev/null 2>&1; then
check_ok "jq available (JSON processing)"
else
check_warn "jq — not found (optional, for JSON parsing)"
echo " Install: brew install jq"
fi
# ── Summary ──────────────────────────────────────────────────────────
echo ""
echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo ""
TOTAL=$((PASS_COUNT + FAIL_COUNT))
echo -e " ${GREEN}Passed:${RESET} $PASS_COUNT / $TOTAL"
if [ $FAIL_COUNT -gt 0 ]; then
echo -e " ${RED}Failed:${RESET} $FAIL_COUNT"
fi
if [ $INSTALLED_COUNT -gt 0 ]; then
echo -e " ${CYAN}Installed:${RESET} $INSTALLED_COUNT"
fi
echo ""
if [ $FAIL_COUNT -eq 0 ]; then
echo -e " ${GREEN}${BOLD}All required dependencies are available! ✅${RESET}"
echo ""
echo " Next steps:"
echo " 1. Copy qa.config.sh and set your app-specific values"
echo " 2. Run: bash qa-scroll/run.sh (or any skill runner)"
echo ""
exit 0
else
CRITICAL_MISSING=""
if ! command -v agent-device >/dev/null 2>&1; then
CRITICAL_MISSING="$CRITICAL_MISSING agent-device"
fi
if ! command -v agent-browser >/dev/null 2>&1; then
CRITICAL_MISSING="$CRITICAL_MISSING agent-browser"
fi
if ! command -v node >/dev/null 2>&1; then
CRITICAL_MISSING="$CRITICAL_MISSING node"
fi
if [ -n "$CRITICAL_MISSING" ]; then
echo -e " ${RED}${BOLD}Missing critical dependencies:${RESET}${CRITICAL_MISSING}"
echo ""
echo " Install them and re-run: bash install.sh"
echo ""
exit 1
else
echo -e " ${YELLOW}Some optional tools are missing, but core functionality is available.${RESET}"
echo ""
exit 0
fi
fi