#!/usr/bin/env bash # ============================================================================== # install.sh — Multi-Agent Mux (MAM) Orchestration Installer # ============================================================================== # Idempotent, robust installer to bootstrap MAM orchestration skills # and Python backplane dependencies on any local workspace. # ============================================================================== set -euo pipefail # --- Configuration & Defaults --- TARGET_DIR="${1:-$(pwd)}" VENV_NAME=".venv" MIN_PYTHON_VERSION="3.9" echo "====================================================================" echo "⚡ Starting Multi-Agent Mux (MAM) Installation" echo "📂 Target Workspace: $TARGET_DIR" echo "====================================================================" # --- 1. System Requirements Validation --- echo "🔍 Checking system dependencies..." check_cmd() { local cmd="$1" if ! command -v "$cmd" &>/dev/null; then echo "❌ Error: '$cmd' is not installed. Please install it first." >&2 exit 1 fi } check_cmd tmux check_cmd python3 # Verify Python Version PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') PYTHON_MAJOR="${MIN_PYTHON_VERSION%%.*}" PYTHON_MINOR="${MIN_PYTHON_VERSION##*.}" if python3 -c "import sys; exit(0 if sys.version_info >= ($PYTHON_MAJOR, $PYTHON_MINOR) else 1)"; then echo "✅ Python $PYTHON_VERSION detected." else echo "❌ Error: Python version must be $MIN_PYTHON_VERSION or higher. Detected: $PYTHON_VERSION" >&2 exit 1 fi # --- 2. Workspace Setup --- cd "$TARGET_DIR" echo "📂 Ensuring metadata directory structure (.mam/)..." mkdir -p .mam/jobs .mam/delegate_job_logs # File permission lockdown on database directory (if owned by the current user to prevent multi-user system issues) if [ -O .mam ]; then chmod 0700 .mam fi # --- 3. Check Network File System (NFS) Warnings --- echo "💾 Detecting file system mount type..." if command -v df &>/dev/null && command -v mount &>/dev/null; then MOUNTPOINT="$(df --output=target . 2>/dev/null | tail -1 || echo "")" if [ -n "$MOUNTPOINT" ]; then if mount | grep -q "$MOUNTPOINT.*nfs\|$MOUNTPOINT.*cifs\|$MOUNTPOINT.*fuse.sshfs"; then echo "âš ī¸ WARNING: Target directory is on a network filesystem (NFS/CIFS/SSHFS)." echo " File locks (fcntl.flock) are UNRELIABLE on network storage." echo " The sqlite3 registry will fall back to 'DELETE' journaling instead of WAL." else echo "✅ File system supports WAL (Local storage detected)." fi fi fi # --- 4. Python Virtual Environment Setup --- echo "🐍 Bootstrapping Python virtual environment (.venv)..." if [ ! -d "$VENV_NAME" ]; then python3 -m venv "$VENV_NAME" echo "✅ Virtual environment created." else echo "â„šī¸ Virtual environment (.venv) already exists. Skipping creation." fi # Activate virtual environment # shellcheck disable=SC1091 source "$VENV_NAME"/bin/activate # Upgrade pip pip install --upgrade pip # Install requirements REQ_FILE=".agents/skills/multi-agent-mux-delegate-job/requirements.txt" if [ -f "$REQ_FILE" ]; then echo "đŸ“Ļ Installing backplane dependencies from $REQ_FILE..." pip install -r "$REQ_FILE" echo "✅ Dependencies installed successfully." else echo "âš ī¸ WARNING: Could not find requirements file: $REQ_FILE" echo " Installing default packages (paho-mqtt, pyyaml) manually..." pip install "paho-mqtt>=2.0.0" pyyaml fi # --- 5. Generate Environment Template --- ENV_FILE=".env" ENV_EXAMPLE=".env.example" if [ ! -f "$ENV_FILE" ]; then if [ -f "$ENV_EXAMPLE" ]; then echo "📝 Creating configuration from $ENV_EXAMPLE..." cp "$ENV_EXAMPLE" "$ENV_FILE" else echo "📝 Creating default $ENV_FILE..." touch "$ENV_FILE" fi # Always append the active defaults to ensure they are set and not commented out cat <> "$ENV_FILE" # === Installer-applied active defaults === MQTT_BROKER=broker.hivemq.com MQTT_PORT=1883 MQTT_TLS=0 MQTT_CLIENT_ID_PREFIX=mam-agent TMUX_SERVER_NAME=default EOF chmod 0600 "$ENV_FILE" echo "✅ Config file .env initialized with chmod 0600." else echo "â„šī¸ $ENV_FILE already exists. Skipping config override." fi echo "====================================================================" echo "🎉 Installation complete!" echo "✨ You can now run the status or monitor skills." echo "💡 Hint: Try executing: .venv/bin/python .agents/skills/multi-agent-mux-delegate-job/scripts/registry.py list" echo "===================================================================="