#!/usr/bin/env bash # ============================================================================== # OpenCode Agent & CLI v2 - Instalador Automatizado para Linux / macOS # https://opencode.developed.work # ============================================================================== set -euo pipefail COLOR_RESET="\033[0m" COLOR_CYAN="\033[36m" COLOR_GREEN="\033[32m" COLOR_YELLOW="\033[33m" COLOR_RED="\033[31m" COLOR_BOLD="\033[1m" COLOR_DIM="\033[2m" echo -e "${COLOR_CYAN}${COLOR_BOLD}======================================================${COLOR_RESET}" echo -e "${COLOR_CYAN}${COLOR_BOLD} OpenCode Agent & CLI v2 - Instalador Oficial ${COLOR_RESET}" echo -e "${COLOR_CYAN}${COLOR_BOLD} https://opencode.developed.work ${COLOR_RESET}" echo -e "${COLOR_CYAN}${COLOR_BOLD}======================================================${COLOR_RESET}\n" # ------------------------------------------------------------------------------ # 1. Detección del Editor (VS Code / Cursor / Insiders / Codium) # ------------------------------------------------------------------------------ EDITOR_CMD="" if command -v code >/dev/null 2>&1; then EDITOR_CMD="code" elif command -v cursor >/dev/null 2>&1; then EDITOR_CMD="cursor" elif command -v code-insiders >/dev/null 2>&1; then EDITOR_CMD="code-insiders" elif command -v codium >/dev/null 2>&1; then EDITOR_CMD="codium" fi if [ -n "${EDITOR_CMD}" ]; then echo -e "${COLOR_GREEN}✓ Editor detectado:${COLOR_RESET} ${COLOR_BOLD}${EDITOR_CMD}${COLOR_RESET}" else echo -e "${COLOR_YELLOW}⚠️ No se encontró 'code' en PATH.${COLOR_RESET} Se continuará con la verificación de CLI y descarga del paquete." fi # ------------------------------------------------------------------------------ # 2. Instalación de la Extensión .VSIX en el Editor # ------------------------------------------------------------------------------ VSIX_URL="https://opencode.developed.work/downloads/opencode-vscode-agent-0.2.5.vsix" TMP_DIR=$(mktemp -d) TMP_VSIX="${TMP_DIR}/opencode-vscode-agent.vsix" cleanup() { rm -rf "${TMP_DIR}" } trap cleanup EXIT echo -e "\n${COLOR_CYAN}⬇ [1/4] Descargando OpenCode Agent v0.2.5 para VS Code...${COLOR_RESET}" if command -v curl >/dev/null 2>&1; then curl -fSL "${VSIX_URL}" -o "${TMP_VSIX}" --progress-bar elif command -v wget >/dev/null 2>&1; then wget -q --show-progress "${VSIX_URL}" -O "${TMP_VSIX}" else echo -e "${COLOR_RED}Error: curl o wget son requeridos para descargar.${COLOR_RESET}" exit 1 fi if [ -n "${EDITOR_CMD}" ]; then echo -e "${COLOR_CYAN}⚙ [2/4] Instalando extensión en ${EDITOR_CMD}...${COLOR_RESET}" "${EDITOR_CMD}" --install-extension "${TMP_VSIX}" --force echo -e "${COLOR_GREEN}✓ Extensión instalada con éxito en ${EDITOR_CMD}.${COLOR_RESET}" else DEST_VSIX="${HOME}/opencode-vscode-agent-0.2.5.vsix" cp "${TMP_VSIX}" "${DEST_VSIX}" echo -e "${COLOR_YELLOW}ℹ Guardado en: ${DEST_VSIX}${COLOR_RESET}" echo -e " Instálalo manualmente desde VS Code: Extensions > ... > 'Install from VSIX...'" fi # ------------------------------------------------------------------------------ # 3. Verificación de OpenCode CLI v2 y Gestión de Permisos / Password # ------------------------------------------------------------------------------ echo -e "\n${COLOR_CYAN}🔍 [3/4] Verificando motor OpenCode CLI v2...${COLOR_RESET}" is_opencode_v2() { local bin="$1" if [ -x "${bin}" ]; then if "${bin}" serve --help 2>&1 | grep -q -- "--service"; then return 0 fi fi return 1 } OPENCODE_BIN="" for candidate in \ "$(command -v opencode 2>/dev/null || true)" \ "/usr/local/bin/opencode" \ "${HOME}/.opencode/bin/opencode" \ "${HOME}/.local/bin/opencode" \ "${HOME}/.antigravity-ide-server/bin/bin/opencode" do if [ -n "${candidate}" ] && [ -x "${candidate}" ]; then if is_opencode_v2 "${candidate}"; then OPENCODE_BIN="${candidate}" break fi fi done if [ -n "${OPENCODE_BIN}" ]; then CLI_VER=$("${OPENCODE_BIN}" --version 2>/dev/null || echo "v2") echo -e "${COLOR_GREEN}✓ OpenCode CLI v2 detectado:${COLOR_RESET} ${COLOR_BOLD}${OPENCODE_BIN}${COLOR_RESET} (${CLI_VER})" else echo -e "${COLOR_YELLOW}⚠️ OpenCode CLI v2 no está instalado o se detectó una versión desactualizada (v1).${COLOR_RESET}" echo -e "${COLOR_CYAN}Iniciando instalación de OpenCode CLI v2 (@opencode/cli)...${COLOR_RESET}" INSTALLED=0 # Opción A: npm global con solicitud de sudo/pass si es requerido if command -v npm >/dev/null 2>&1; then echo -e "${COLOR_DIM}Probando instalación mediante npm...${COLOR_DIM}" # Probar instalación directa sin sudo (si npm prefix es de usuario) if npm install -g @opencode/cli >/dev/null 2>&1; then INSTALLED=1 else # Si requiere permisos de root, solicitar contraseña en consola echo -e "${COLOR_YELLOW}🔐 Se requieren permisos de superusuario (sudo) para instalar globalmente en el sistema.${COLOR_RESET}" if command -v sudo >/dev/null 2>&1; then echo -e "${COLOR_CYAN}Por favor ingresa tu contraseña de usuario si el sistema la solicita:${COLOR_RESET}" if sudo npm install -g @opencode/cli; then INSTALLED=1 fi fi fi # Si falló sudo o no hay permisos, instalar en directorio local ~/.opencode sin password if [ ${INSTALLED} -eq 0 ]; then echo -e "${COLOR_CYAN}Instalando en espacio de usuario local (~/.opencode/bin) sin requerir contraseña...${COLOR_RESET}" mkdir -p "${HOME}/.opencode" npm install -g --prefix "${HOME}/.opencode" @opencode/cli mkdir -p "${HOME}/.opencode/bin" # Buscar binario instalado FOUND_BIN=$(find "${HOME}/.opencode" -name "opencode" -type f -perm /111 2>/dev/null | head -n 1) if [ -n "${FOUND_BIN}" ]; then ln -sf "${FOUND_BIN}" "${HOME}/.opencode/bin/opencode" OPENCODE_BIN="${HOME}/.opencode/bin/opencode" INSTALLED=1 fi fi fi # Verificar si se completó la instalación if [ ${INSTALLED} -eq 1 ]; then OPENCODE_BIN=$(command -v opencode 2>/dev/null || echo "${HOME}/.opencode/bin/opencode") echo -e "${COLOR_GREEN}✓ OpenCode CLI v2 instalado exitosamente.${COLOR_RESET}" else echo -e "${COLOR_RED}❌ No se pudo completar la instalación automática de OpenCode CLI v2.${COLOR_RESET}" echo -e "Puedes instalarlo manualmente ejecutando:" echo -e " ${COLOR_BOLD}sudo npm install -g @opencode/cli${COLOR_RESET}" fi fi # ------------------------------------------------------------------------------ # 4. Verificación de Autorización y Estado del Servicio # ------------------------------------------------------------------------------ echo -e "\n${COLOR_CYAN}🛡️ [4/4] Verificando Autorización e Integraciones...${COLOR_RESET}" if [ -n "${OPENCODE_BIN}" ] && [ -x "${OPENCODE_BIN}" ]; then AUTH_OUTPUT=$("${OPENCODE_BIN}" auth list 2>&1 || true) if echo "${AUTH_OUTPUT}" | grep -qi "No authenticated"; then echo -e "${COLOR_YELLOW}ℹ️ Estado de Autorización:${COLOR_RESET} No hay cuentas de pago vinculadas actualmente." echo -e " ${COLOR_GREEN}✓ Tienes acceso inmediato a los 10 modelos gratuitos integrados (Plan Gratuito).${COLOR_RESET}" echo -e " Para autorizar proveedores adicionales (Anthropic Claude, OpenAI, DeepSeek, Google Gemini):" echo -e " • En consola ejecuta: ${COLOR_BOLD}${OPENCODE_BIN} auth login${COLOR_RESET}" echo -e " • O en VS Code presiona ${COLOR_BOLD}Ctrl+Shift+P${COLOR_RESET} y selecciona ${COLOR_BOLD}'OpenCode: Iniciar Sesión / Establecer API Key'${COLOR_RESET}\n" else echo -e "${COLOR_GREEN}✓ Cuentas e integraciones autenticadas encontradas:${COLOR_RESET}" echo "${AUTH_OUTPUT}" fi # Prueba de arranque del servicio en segundo plano echo -e "${COLOR_CYAN}Iniciando servicio de fondo OpenCode v2...${COLOR_RESET}" "${OPENCODE_BIN}" serve --service >/dev/null 2>&1 || true echo -e "${COLOR_GREEN}✓ Servicio de fondo OpenCode v2 activo y escuchando peticiones locales.${COLOR_RESET}" fi echo -e "\n${COLOR_GREEN}${COLOR_BOLD}======================================================${COLOR_RESET}" echo -e "${COLOR_GREEN}${COLOR_BOLD} 🎉 ¡Instalación y Verificación Completa! ${COLOR_RESET}" echo -e "${COLOR_GREEN}${COLOR_BOLD}======================================================${COLOR_RESET}" echo -e "${COLOR_CYAN}Pasos para comenzar:${COLOR_RESET}" echo -e " 1. Abre tu proyecto en VS Code: ${COLOR_BOLD}${EDITOR_CMD:-code} .${COLOR_RESET}" echo -e " 2. Haz clic en el icono de ${COLOR_BOLD}OpenCode${COLOR_RESET} en la barra lateral izquierda." echo -e " 3. ¡Escribe tus instrucciones o usa ${COLOR_BOLD}/help${COLOR_RESET} para explorar los comandos!\n"