131 lines
4.5 KiB
Bash
131 lines
4.5 KiB
Bash
#!/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 <<EOF >> "$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 "===================================================================="
|