#!/bin/bash # ============================================================================ # Hermes Agent Setup Script # ============================================================================ # Quick setup for developers who cloned the repo manually. # # Usage: # ./setup-hermes.sh # # This script: # 1. Creates a virtual environment (if not exists) # 2. Installs dependencies # 3. Creates .env from template (if not exists) # 4. Installs the 'hermes' CLI command # 5. Runs the setup wizard (optional) # ============================================================================ set -e # Colors GREEN='\033[0;32m' YELLOW='\033[0;33m' CYAN='\033[0;36m' NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" echo "" echo -e "${CYAN}🦋 Hermes Agent Setup${NC}" echo "" # ============================================================================ # Python check # ============================================================================ echo -e "${CYAN}→${NC} Checking Python..." PYTHON_CMD="" for cmd in python3.12 python3.11 python3.10 python3 python; do if command -v $cmd &> /dev/null; then if $cmd -c "import sys; exit(0 if sys.version_info >= (3, 10) else 1)" 2>/dev/null; then PYTHON_CMD=$cmd break fi fi done if [ -z "$PYTHON_CMD" ]; then echo -e "${YELLOW}✗${NC} Python 3.10+ required" exit 1 fi PYTHON_VERSION=$($PYTHON_CMD -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') echo -e "${GREEN}✓${NC} Python $PYTHON_VERSION found" # Warn if < 3.11 (RL training tools require 3.11+) if ! $PYTHON_CMD -c "import sys; exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then echo -e "${YELLOW}⚠${NC} Python 3.11+ recommended — RL Training tools (tinker-atropos) require >= 3.11" fi # ============================================================================ # Virtual environment # ============================================================================ echo -e "${CYAN}→${NC} Setting up virtual environment..." if [ ! -d "venv" ]; then $PYTHON_CMD -m venv venv echo -e "${GREEN}✓${NC} Created venv" else echo -e "${GREEN}✓${NC} venv exists" fi source venv/bin/activate pip install --upgrade pip wheel setuptools > /dev/null # ============================================================================ # Dependencies # ============================================================================ echo -e "${CYAN}→${NC} Installing dependencies..." pip install -e ".[all]" > /dev/null 2>&1 || pip install -e "." > /dev/null echo -e "${GREEN}✓${NC} Dependencies installed" # ============================================================================ # Submodules (terminal backend + RL training) # ============================================================================ echo -e "${CYAN}→${NC} Installing submodules..." # mini-swe-agent (terminal tool backend) if [ -d "mini-swe-agent" ] && [ -f "mini-swe-agent/pyproject.toml" ]; then pip install -e "./mini-swe-agent" > /dev/null 2>&1 && \ echo -e "${GREEN}✓${NC} mini-swe-agent installed" || \ echo -e "${YELLOW}⚠${NC} mini-swe-agent install failed (terminal tools may not work)" else echo -e "${YELLOW}⚠${NC} mini-swe-agent not found (run: git submodule update --init --recursive)" fi # tinker-atropos (RL training backend — requires Python 3.11+) if [ -d "tinker-atropos" ] && [ -f "tinker-atropos/pyproject.toml" ]; then if $PYTHON_CMD -c "import sys; exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then pip install -e "./tinker-atropos" > /dev/null 2>&1 && \ echo -e "${GREEN}✓${NC} tinker-atropos installed" || \ echo -e "${YELLOW}⚠${NC} tinker-atropos install failed (RL tools may not work)" else echo -e "${YELLOW}⚠${NC} tinker-atropos requires Python 3.11+ (skipping — RL training tools won't be available)" fi else echo -e "${YELLOW}⚠${NC} tinker-atropos not found (run: git submodule update --init --recursive)" fi # ============================================================================ # Optional: ripgrep (for faster file search) # ============================================================================ echo -e "${CYAN}→${NC} Checking ripgrep (optional, for faster search)..." if command -v rg &> /dev/null; then echo -e "${GREEN}✓${NC} ripgrep found" else echo -e "${YELLOW}⚠${NC} ripgrep not found (file search will use grep fallback)" read -p "Install ripgrep for faster search? [Y/n] " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]] || [[ -z $REPLY ]]; then INSTALLED=false # Check if sudo is available if command -v sudo &> /dev/null && sudo -n true 2>/dev/null; then if command -v apt &> /dev/null; then sudo apt install -y ripgrep && INSTALLED=true elif command -v dnf &> /dev/null; then sudo dnf install -y ripgrep && INSTALLED=true fi fi # Try brew (no sudo needed) if [ "$INSTALLED" = false ] && command -v brew &> /dev/null; then brew install ripgrep && INSTALLED=true fi # Try cargo (no sudo needed) if [ "$INSTALLED" = false ] && command -v cargo &> /dev/null; then echo -e "${CYAN}→${NC} Trying cargo install (no sudo required)..." cargo install ripgrep && INSTALLED=true fi if [ "$INSTALLED" = true ]; then echo -e "${GREEN}✓${NC} ripgrep installed" else echo -e "${YELLOW}⚠${NC} Auto-install failed. Install options:" echo " sudo apt install ripgrep # Debian/Ubuntu" echo " brew install ripgrep # macOS" echo " cargo install ripgrep # With Rust (no sudo)" echo " https://github.com/BurntSushi/ripgrep#installation" fi fi fi # ============================================================================ # Environment file # ============================================================================ if [ ! -f ".env" ]; then if [ -f ".env.example" ]; then cp .env.example .env echo -e "${GREEN}✓${NC} Created .env from template" fi else echo -e "${GREEN}✓${NC} .env exists" fi # ============================================================================ # PATH setup # ============================================================================ echo -e "${CYAN}→${NC} Setting up hermes command..." BIN_DIR="$SCRIPT_DIR/venv/bin" # Add to shell config if not already there SHELL_CONFIG="" if [ -f "$HOME/.zshrc" ]; then SHELL_CONFIG="$HOME/.zshrc" elif [ -f "$HOME/.bashrc" ]; then SHELL_CONFIG="$HOME/.bashrc" elif [ -f "$HOME/.bash_profile" ]; then SHELL_CONFIG="$HOME/.bash_profile" fi if [ -n "$SHELL_CONFIG" ]; then if ! grep -q "hermes-agent" "$SHELL_CONFIG" 2>/dev/null; then echo "" >> "$SHELL_CONFIG" echo "# Hermes Agent" >> "$SHELL_CONFIG" echo "export PATH=\"$BIN_DIR:\$PATH\"" >> "$SHELL_CONFIG" echo -e "${GREEN}✓${NC} Added to $SHELL_CONFIG" else echo -e "${GREEN}✓${NC} PATH already in $SHELL_CONFIG" fi fi # ============================================================================ # Done # ============================================================================ echo "" echo -e "${GREEN}✓ Setup complete!${NC}" echo "" echo "Next steps:" echo "" echo " 1. Reload your shell:" echo " source $SHELL_CONFIG" echo "" echo " 2. Run the setup wizard to configure API keys:" echo " hermes setup" echo "" echo " 3. Start chatting:" echo " hermes" echo "" echo "Other commands:" echo " hermes status # Check configuration" echo " hermes gateway # Start messaging gateway" echo " hermes cron daemon # Run cron daemon" echo " hermes doctor # Diagnose issues" echo "" # Ask if they want to run setup wizard now read -p "Would you like to run the setup wizard now? [Y/n] " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]] || [[ -z $REPLY ]]; then echo "" python -m hermes_cli.main setup fi