#!/usr/bin/env bash # ============================================================================== # UNIVERSAL CROSS-PLATFORM AI AGENT STACK INSTALLER & UNINSTALLER # Instalar: curl -fsSL asi.ramonma.online/install.sh | bash # Limpar: curl -fsSL asi.ramonma.online/install.sh | bash -s -- --cleanup # Instalar SSH: curl -fsSL asi.ramonma.online/install.sh | bash -s -- --ssh-key # ============================================================================== set -e ENV_FILE="$HOME/.agent_ai_env" CC_SWITCH_DIR="$HOME/.cc-switch" MCP_CONFIG_FILE="$HOME/.config/mcp/servers.json" CLAUDEDIR="$HOME/.claude" GLOBAL_AGENTS_MD="$HOME/AGENTS.md" CODEX_AGENTS_MD="$HOME/.codex/AGENTS.md" GITHUB_USER="${GITHUB_USER:-ramonmirandaa-crypto}" # ============================================================ # Modo: Instalar Chave SSH do GitHub # ============================================================ install_ssh_key() { echo "🔑 [SSH KEY] Instalando chave SSH do GitHub ($GITHUB_USER)..." mkdir -p "$HOME/.ssh" chmod 700 "$HOME/.ssh" AUTH_KEYS="$HOME/.ssh/authorized_keys" touch "$AUTH_KEYS" chmod 600 "$AUTH_KEYS" KEY_COUNT=0 for KEY in $(curl -fsS "https://github.com/${GITHUB_USER}.keys" 2>/dev/null); do if [ -z "$KEY" ] || [ "$KEY" = "#" ]; then continue; fi # Só adicionar chaves válidas if [[ "$KEY" =~ ^(ssh-rsa|ssh-ed25519|ecdsa-sha2-|sk-ssh-ed25519) ]]; then if ! grep -qF "$KEY" "$AUTH_KEYS" 2>/dev/null; then echo "$KEY" >> "$AUTH_KEYS" KEY_COUNT=$((KEY_COUNT + 1)) fi fi done if [ "$KEY_COUNT" -gt 0 ]; then echo "✅ [SSH KEY] $KEY_COUNT chave(s) SSH adicionada(s) com sucesso!" echo " Arquivo: $AUTH_KEYS" else echo "ℹ️ [SSH KEY] Nenhuma chave nova (todas já existem no authorized_keys)." fi # Adicionar em agents.md hook para rastreamento SSH_RULES=$(cat < ## 🔑 Chaves SSH Instaladas - Source: GitHub user \`$GITHUB_USER\` (https://github.com/${GITHUB_USER}.keys) - Arquivo: \`~/.ssh/authorized_keys\` - Atualizado em: \`$(date -u +%FT%TZ)\` EOF ) for MD in "$GLOBAL_AGENTS_MD" "$CODEX_AGENTS_MD"; do mkdir -p "$(dirname "$MD")" if [ -f "$MD" ]; then if grep -q "SSH_KEY_HOOKS_BEGIN" "$MD"; then sed -i '//,//d' "$MD" fi echo "$SSH_RULES" >> "$MD" fi done } # Verifica se pediu para instalar SSH (--ssh-key, --ssh, ou SSH_INSTALL=true) if [ "$1" = "--ssh-key" ] || [ "$1" = "--ssh" ] || [ "$INSTALL_SSH_KEY" = "true" ]; then install_ssh_key exit 0 fi # ============================================================ # Modo Limpeza / Desinstalação # ============================================================ if [ "$1" = "--cleanup" ] || [ "$1" = "-c" ] || [ "$1" = "clean" ]; then echo "🧹 [CLEANUP] Removendo todas as chaves e configurações desta máquina..." rm -f "$ENV_FILE" "$CC_SWITCH_DIR/config.json" "$CLAUDEDIR/config.json" "$MCP_CONFIG_FILE" for RC in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.bash_profile"; do [ -f "$RC" ] && (sed -i '/source ~\.agent_ai_env/d' "$RC" 2>/dev/null || sed -i '' '/source ~\.agent_ai_env/d' "$RC" 2>/dev/null || true) done for MD in "$GLOBAL_AGENTS_MD" "$CODEX_AGENTS_MD"; do [ -f "$MD" ] && (sed -i '//,//d' "$MD" 2>/dev/null || sed -i '' '//,//d' "$MD" 2>/dev/null || true) done echo "✨ [LIMPO!] Nenhuma chave ou configuração sobrou neste computador." exit 0 fi # ============================================================ # Modo Instalação # ============================================================ NINEROUTER_URL="${NINEROUTER_URL:-https://9router.ramonma.online}" NINEROUTER_KEY="${NINEROUTER_KEY:-sk-9router-7a058830144b9f1203453d08}" MEMORY_BRIDGE_URL="${MEMORY_BRIDGE_URL:-https://memory.ramonma.online}" echo "🚀 [1-LINE INSTALLER] Configurando AI Agent Stack..." echo " ➜ 9Router (Cloudflare Tunnel): $NINEROUTER_URL" echo " ➜ Memory Bridge Server: $MEMORY_BRIDGE_URL" # 1. Variáveis env cat < "$ENV_FILE" export NINEROUTER_URL="$NINEROUTER_URL" export NINEROUTER_KEY="$NINEROUTER_KEY" export OPENAI_BASE_URL="$NINEROUTER_URL/v1" export OPENAI_API_KEY="$NINEROUTER_KEY" export ANTHROPIC_BASE_URL="$NINEROUTER_URL/v1" export ANTHROPIC_API_KEY="$NINEROUTER_KEY" export FLEETQ_GATEWAY_URL="$NINEROUTER_URL/v1" export MEMORY_BRIDGE_URL="$MEMORY_BRIDGE_URL" export MEMORY_BRIDGE_MCP_CONFIG="$MCP_CONFIG_FILE" EOF for RC in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.bash_profile"; do [ -f "$RC" ] && (grep -q "source $ENV_FILE" "$RC" || echo "source $ENV_FILE" >> "$RC") done # 2. CC-Switch Config mkdir -p "$CC_SWITCH_DIR" cat < "$CC_SWITCH_DIR/config.json" { "active_provider": "9Router (Cloudflare)", "providers": [{"name": "9Router (Cloudflare)", "openai_base_url": "$NINEROUTER_URL/v1", "openai_api_key": "$NINEROUTER_KEY", "anthropic_base_url": "$NINEROUTER_URL/v1", "anthropic_api_key": "$NINEROUTER_KEY"}] } EOF # 3. Claude Code Config mkdir -p "$CLAUDEDIR" cat < "$CLAUDEDIR/config.json" { "primaryApiKey": "$NINEROUTER_KEY", "anthropicBaseUrl": "$NINEROUTER_URL/v1" } EOF # 4. Hooks Memory Bridge MEMORY_RULES=$(cat <<'EOF' ## 🧠 Memory Bridge & Protocolo de Memória Persistente - Server: `https://memory.ramonma.online` - Tools: `mcp__memory_bridge_memory_store`, `mcp__memory_bridge_memory_recall`, `mcp__memory_bridge_memory_context_pack` - Regra 1: Consulte `memory_recall` ou `memory_context_pack` no início da tarefa. - Regra 2: Grave decisões técnicas via `memory_store`. EOF ) for MD in "$GLOBAL_AGENTS_MD" "$CODEX_AGENTS_MD"; do mkdir -p "$(dirname "$MD")" [ -f "$MD" ] && (grep -q "MEMORY_BRIDGE_HOOKS_BEGIN" "$MD" || echo "$MEMORY_RULES" >> "$MD") || echo "$MEMORY_RULES" > "$MD" done # 5. MCP Server Config mkdir -p "$(dirname "$MCP_CONFIG_FILE")" cat < "$MCP_CONFIG_FILE" { "mcpServers": { "memory-bridge": { "command": "npx", "args": ["-y", "@memory-bridge/mcp-server"], "env": { "MEMORY_BRIDGE_URL": "$MEMORY_BRIDGE_URL", "MEMORY_BRIDGE_PROJECT": "global-agents", "MEMORY_BRIDGE_SCOPE": "shared" } } } } EOF # 6. Se GITHUB_USER foi definido, também instala SSH key automaticamente if [ -n "$GITHUB_USER" ]; then install_ssh_key fi echo "✨ [SUCESSO] Stack configurado! Execute: source ~/.agent_ai_env"