#!/bin/bash # Script de démarrage des agents IA # Démarre tous les agents configurés pour Veza Platform set -e # Configuration AGENTS_DIR=".cursor/agents" CONFIG_FILE=".cursor/agents/config.yaml" LOG_DIR="logs" PID_DIR=".cursor/agents/pids" # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Fonction d'aide show_help() { echo -e "${CYAN}🤖 Script de démarrage des agents IA - Veza Platform${NC}" echo "" echo "Usage: $0 [OPTIONS] [AGENT]" echo "" echo "Options:" echo " -h, --help Afficher cette aide" echo " -a, --all Démarrer tous les agents" echo " -s, --status Afficher le statut des agents" echo " -k, --kill Arrêter tous les agents" echo " -r, --restart Redémarrer tous les agents" echo " -l, --logs Afficher les logs des agents" echo " -c, --config Afficher la configuration" echo "" echo "Agents disponibles:" echo " planner Agent planificateur" echo " researcher Agent chercheur" echo " implementer Agent implémenteur" echo " qa Agent QA" echo " docs Agent documentation" echo " maintainer Agent maintenance" echo "" echo "Exemples:" echo " $0 --all # Démarrer tous les agents" echo " $0 planner # Démarrer seulement l'agent planificateur" echo " $0 --status # Afficher le statut" echo " $0 --kill # Arrêter tous les agents" } # Fonction pour créer les répertoires nécessaires setup_directories() { echo -e "${BLUE}[INFO]${NC} Configuration des répertoires..." mkdir -p "$LOG_DIR" mkdir -p "$PID_DIR" mkdir -p "$AGENTS_DIR"/{planner,researcher,implementer,qa,docs,maintainer} echo -e "${GREEN}[SUCCESS]${NC} Répertoires configurés" } # Fonction pour vérifier la configuration check_config() { if [ ! -f "$CONFIG_FILE" ]; then echo -e "${RED}[ERROR]${NC} Fichier de configuration non trouvé: $CONFIG_FILE" exit 1 fi if ! command -v yq &> /dev/null; then echo -e "${YELLOW}[WARNING]${NC} yq non installé, utilisation de grep pour la configuration" return 1 fi return 0 } # Fonction pour démarrer un agent start_agent() { local agent_name="$1" local agent_dir="$AGENTS_DIR/$agent_name" local pid_file="$PID_DIR/$agent_name.pid" local log_file="$LOG_DIR/$agent_name.log" # Vérifier si l'agent est déjà en cours d'exécution if [ -f "$pid_file" ] && kill -0 "$(cat "$pid_file")" 2>/dev/null; then echo -e "${YELLOW}[WARNING]${NC} Agent $agent_name est déjà en cours d'exécution (PID: $(cat "$pid_file"))" return 0 fi echo -e "${BLUE}[INFO]${NC} Démarrage de l'agent $agent_name..." # Créer le script de l'agent s'il n'existe pas local agent_script="$agent_dir/run.sh" if [ ! -f "$agent_script" ]; then create_agent_script "$agent_name" "$agent_script" fi # Démarrer l'agent en arrière-plan nohup bash "$agent_script" > "$log_file" 2>&1 & local pid=$! echo $pid > "$pid_file" # Attendre un peu pour vérifier que l'agent démarre correctement sleep 2 if kill -0 $pid 2>/dev/null; then echo -e "${GREEN}[SUCCESS]${NC} Agent $agent_name démarré (PID: $pid)" echo "Agent $agent_name démarré" > "$agent_dir/status.txt" else echo -e "${RED}[ERROR]${NC} Échec du démarrage de l'agent $agent_name" rm -f "$pid_file" return 1 fi } # Fonction pour créer le script d'un agent create_agent_script() { local agent_name="$1" local script_path="$2" cat > "$script_path" << EOF #!/bin/bash # Script d'exécution pour l'agent $agent_name set -e # Configuration AGENT_NAME="$agent_name" AGENT_DIR=".cursor/agents/$agent_name" LOG_FILE="logs/$agent_name.log" PID_FILE=".cursor/agents/pids/$agent_name.pid" # Fonction de nettoyage cleanup() { echo "Arrêt de l'agent \$AGENT_NAME..." rm -f "\$PID_FILE" exit 0 } # Capturer les signaux d'arrêt trap cleanup SIGTERM SIGINT # Boucle principale de l'agent while true; do case "\$AGENT_NAME" in "planner") echo "\$(date): Exécution de l'agent Planificateur..." >> "\$LOG_FILE" # Logique de planification sleep 60 ;; "researcher") echo "\$(date): Exécution de l'agent Chercheur..." >> "\$LOG_FILE" # Logique de recherche sleep 300 ;; "implementer") echo "\$(date): Exécution de l'agent Implémenteur..." >> "\$LOG_FILE" # Logique d'implémentation sleep 30 ;; "qa") echo "\$(date): Exécution de l'agent QA..." >> "\$LOG_FILE" # Logique de QA sleep 120 ;; "docs") echo "\$(date): Exécution de l'agent Documentation..." >> "\$LOG_FILE" # Logique de documentation sleep 180 ;; "maintainer") echo "\$(date): Exécution de l'agent Maintenance..." >> "\$LOG_FILE" # Logique de maintenance sleep 600 ;; *) echo "\$(date): Agent inconnu: \$AGENT_NAME" >> "\$LOG_FILE" sleep 60 ;; esac done EOF chmod +x "$script_path" } # Fonction pour arrêter un agent stop_agent() { local agent_name="$1" local pid_file="$PID_DIR/$agent_name.pid" if [ -f "$pid_file" ]; then local pid=$(cat "$pid_file") if kill -0 "$pid" 2>/dev/null; then echo -e "${BLUE}[INFO]${NC} Arrêt de l'agent $agent_name (PID: $pid)..." kill "$pid" rm -f "$pid_file" echo "Agent $agent_name arrêté" > "$AGENTS_DIR/$agent_name/status.txt" echo -e "${GREEN}[SUCCESS]${NC} Agent $agent_name arrêté" else echo -e "${YELLOW}[WARNING]${NC} Agent $agent_name n'était pas en cours d'exécution" rm -f "$pid_file" fi else echo -e "${YELLOW}[WARNING]${NC} Fichier PID non trouvé pour l'agent $agent_name" fi } # Fonction pour afficher le statut des agents show_status() { echo -e "${CYAN}🤖 Statut des Agents IA - Veza Platform${NC}" echo "" echo "| Agent | PID | Statut | Dernière activité |" echo "|-------|-----|--------|-------------------|" for agent in planner researcher implementer qa docs maintainer; do local pid_file="$PID_DIR/$agent.pid" local status_file="$AGENTS_DIR/$agent/status.txt" if [ -f "$pid_file" ]; then local pid=$(cat "$pid_file") if kill -0 "$pid" 2>/dev/null; then local status="🟢 Actif" local last_activity=$(stat -c %y "$status_file" 2>/dev/null | cut -d' ' -f2 | cut -d'.' -f1 || echo "N/A") else local status="🔴 Arrêté" local last_activity="N/A" fi else local status="⚪ Inactif" local last_activity="N/A" fi printf "| %-10s | %-3s | %-10s | %-17s |\n" "$agent" "${pid:-N/A}" "$status" "$last_activity" done echo "" } # Fonction pour afficher les logs show_logs() { local agent_name="$1" if [ -n "$agent_name" ]; then local log_file="$LOG_DIR/$agent_name.log" if [ -f "$log_file" ]; then echo -e "${CYAN}📋 Logs de l'agent $agent_name${NC}" echo "" tail -f "$log_file" else echo -e "${RED}[ERROR]${NC} Fichier de log non trouvé: $log_file" fi else echo -e "${CYAN}📋 Logs de tous les agents${NC}" echo "" for agent in planner researcher implementer qa docs maintainer; do local log_file="$LOG_DIR/$agent.log" if [ -f "$log_file" ]; then echo -e "${YELLOW}=== $agent ===${NC}" tail -5 "$log_file" echo "" fi done fi } # Fonction pour afficher la configuration show_config() { if [ -f "$CONFIG_FILE" ]; then echo -e "${CYAN}⚙️ Configuration des Agents IA${NC}" echo "" if command -v yq &> /dev/null; then yq eval '.agents' "$CONFIG_FILE" else cat "$CONFIG_FILE" fi else echo -e "${RED}[ERROR]${NC} Fichier de configuration non trouvé: $CONFIG_FILE" fi } # Fonction principale main() { case "${1:-}" in -h|--help) show_help ;; -a|--all) setup_directories echo -e "${CYAN}🚀 Démarrage de tous les agents...${NC}" for agent in planner researcher implementer qa docs maintainer; do start_agent "$agent" done echo -e "${GREEN}✅ Tous les agents démarrés${NC}" ;; -s|--status) show_status ;; -k|--kill) echo -e "${CYAN}🛑 Arrêt de tous les agents...${NC}" for agent in planner researcher implementer qa docs maintainer; do stop_agent "$agent" done echo -e "${GREEN}✅ Tous les agents arrêtés${NC}" ;; -r|--restart) echo -e "${CYAN}🔄 Redémarrage de tous les agents...${NC}" for agent in planner researcher implementer qa docs maintainer; do stop_agent "$agent" done sleep 2 for agent in planner researcher implementer qa docs maintainer; do start_agent "$agent" done echo -e "${GREEN}✅ Tous les agents redémarrés${NC}" ;; -l|--logs) show_logs "$2" ;; -c|--config) show_config ;; planner|researcher|implementer|qa|docs|maintainer) setup_directories start_agent "$1" ;; "") show_help ;; *) echo -e "${RED}[ERROR]${NC} Option ou agent inconnu: $1" show_help exit 1 ;; esac } # Exécuter la fonction principale main "$@"