diff --git a/INSTALL_ES.md b/INSTALL_ES.md new file mode 100644 index 00000000..22d62425 --- /dev/null +++ b/INSTALL_ES.md @@ -0,0 +1,138 @@ +# Guía de Instalación en macOS + +[English installation instructions / Instrucciones de instalación en inglés](README.md#installation-and-setup) + +## Requisitos Previos + +- Conexión a internet pública. + +Para funciones de sugerencia de código: + +- Para usuarios de GitHub Copilot: + - [Node.js](https://nodejs.org/) instalado para ejecutar el LSP de Copilot. + - Suscripción activa a GitHub Copilot. +- Para usuarios de Codeium: + - Cuenta activa de Codeium. +- Acceso a otros LLMs. + +Para funciones de chat y "Prompt to Code": + +- Una clave de API de OpenAI válida. +- Acceso a otros LLMs. + +## Permisos Requeridos + +- Acceso a carpetas +- API de Accesibilidad + +> Si te preocupa el registro de teclas y no puedes confiar en el binario, recomendamos revisar el código y [compilarlo tú mismo](DEVELOPMENT.md). + +## Instalación y Configuración + +> El proceso de instalación puede parecer complejo al principio. Aquí tienes un resumen rápido: +> +> 1. Instala la app en la carpeta Aplicaciones y ábrela una vez. +> 2. Habilita la extensión del editor de código fuente. +> 3. Otorga permiso de API de Accesibilidad a la extensión. +> 4. Configura las cuentas y modelos en la app principal. +> 5. Opcionalmente, ajusta la configuración de cada función y los atajos de teclado. + +### Paso 1: Instalar la Aplicación + +Puedes instalarla con [Homebrew](http://brew.sh/): + +```bash +brew install --cask copilot-for-xcode +``` + +O instalarla manualmente descargando `Copilot for Xcode.app` desde la última [versión publicada](https://github.com/intitni/CopilotForXcode/releases). + +Asegúrate de que la app esté dentro de la carpeta **Aplicaciones**. + +Abre la app; esta creará un agente de inicio para configurar un servicio en segundo plano que realiza el trabajo real. + +### Paso 2: Habilitar la Extensión + +Habilita la extensión en `Ajustes del Sistema`. + +#### macOS 15 + +Desde el menú Apple en la esquina superior izquierda, haz clic en `Ajustes del Sistema`. Navega a `General` → `Ítems de inicio y extensiones`. Haz clic en `Xcode Source Editor` y marca `Copilot for Xcode`. + +#### macOS 14 + +Desde el menú Apple en la esquina superior izquierda, haz clic en `Ajustes del Sistema`. Navega a `Privacidad y seguridad` → desplázate hacia abajo y haz clic en `Extensiones`. Haz clic en `Xcode Source Editor` y marca `Copilot`. + +#### Versiones Anteriores + +Si usas macOS Monterey, accede al menú `Extensiones` en `Preferencias del Sistema` con su icono dedicado. + +### Paso 3: Otorgar Permisos a la App + +La primera vez que abras la app y ejecutes un comando, la extensión solicitará los permisos necesarios. + +También puedes otorgar los permisos manualmente en la pestaña `Privacidad y seguridad` en `Ajustes del Sistema`. + +- Para otorgar permisos de la API de Accesibilidad, haz clic en `Accesibilidad` y arrastra `CopilotForXcodeExtensionService.app` a la lista. Puedes localizar la app de extensión haciendo clic en `Reveal Extension App in Finder` en la app principal. + +Permiso API de Accesibilidad + +Si aparece una alerta solicitando un permiso que ya habías otorgado, elimina el permiso de la lista y vuelve a agregarlo. + +### Paso 4: Configurar Atajos de Teclado + +La extensión funciona mejor con atajos de teclado. + +Puedes configurarlos en `Ajustes de Xcode > Key Bindings`. Filtra la lista escribiendo `copilot` en la barra de búsqueda. + +Una [configuración recomendada](https://github.com/intitni/CopilotForXcode/issues/14) sin conflictos es: + +| Comando | Atajo de Teclado | +| ---------------------- | ------------------------------------------------------ | +| Aceptar Sugerencias | `⌥}` o Tab | +| Descartar Sugerencias | Esc | +| Rechazar Sugerencia | `⌥{` | +| Siguiente Sugerencia | `⌥>` | +| Sugerencia Anterior | `⌥<` | +| Abrir Chat | `⌥"` | +| Explicar Selección | `⌥\|` | + +También puedes usar `⇧⌘/` para buscar un comando en la barra de menú. + +### Paso 5: Configurar Sugerencias de Código + +#### Configurar GitHub Copilot + +1. En la app principal, navega a "Service - GitHub Copilot" para acceder a la configuración de tu cuenta. +2. Haz clic en "Install" para instalar el servidor de lenguaje. +3. Opcionalmente, configura la ruta a Node. El valor predeterminado es simplemente `node`. La app buscará Node en: `/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin`. + + Si tu instalación de Node está en otra ubicación, ejecuta `which node` en la terminal para obtener la ruta correcta. + +4. Haz clic en "Sign In" y serás redirigido a un sitio de verificación de GitHub. Se copiará un código de usuario a tu portapapeles. +5. Después de iniciar sesión, regresa a la app y haz clic en "Confirm Sign-in" para completar el proceso. +6. Ve a "Feature - Suggestion" y actualiza el proveedor a "GitHub Copilot". + +#### Configurar Codeium + +1. En la app principal, navega a "Service - Codeium" para acceder a la configuración de Codeium. +2. Haz clic en "Install" para instalar el servidor de lenguaje. +3. Haz clic en "Sign In" y serás redirigido a codeium.com. Después de iniciar sesión, se te proporcionará un token. Copia y pega este token en la app para completar el inicio de sesión. +4. Ve a "Feature - Suggestion" y actualiza el proveedor a "Codeium". + +> La clave se almacena en el llavero. Cuando la app auxiliar intente acceder a la clave por primera vez, te pedirá la contraseña del llavero. Selecciona "Permitir siempre". + +### Paso 6: Configurar la Función de Chat + +1. En la app principal, navega a "Service - Chat Model". +2. Actualiza el modelo de OpenAI o crea uno nuevo si es necesario. Usa el botón de prueba para verificar el modelo. +3. Opcionalmente, configura el modelo de embedding en "Service - Embedding Model", necesario para algunas funciones del chat. +4. Ve a "Feature - Chat" y actualiza el proveedor de chat/embedding con el que acabas de configurar. + +## Actualización + +Puedes usar el actualizador integrado en la app o descargar la última versión manualmente desde la última [versión publicada](https://github.com/intitni/CopilotForXcode/releases). + +Después de actualizar, abre Copilot for Xcode.app una vez y reinicia Xcode para permitir que la extensión se recargue. + +Si encuentras que algunas funciones dejaron de funcionar, intenta primero volver a otorgar los permisos a la app. diff --git a/OverlayWindow/Package.swift b/OverlayWindow/Package.swift index b875c713..b19520d7 100644 --- a/OverlayWindow/Package.swift +++ b/OverlayWindow/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 6.2 +// swift-tools-version: 5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription diff --git a/README.md b/README.md index c4066a45..7add1194 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,8 @@ For more information, check the [Wiki Page](https://copilotforxcode.intii.com/wi ## Prerequisites +- macOS 13 (Ventura) or later. +- Xcode 15 or later (Swift 5.9+). - Public network connection. For suggestion features: @@ -79,6 +81,8 @@ For chat and prompt to code features: ## Installation and Setup +[🇪🇸 Guía de instalación en español / Spanish installation guide](INSTALL_ES.md) + > The installation process is a bit complicated. Here is a quick overview: > > 1. Install the app into the Applications folder, open it once. @@ -89,13 +93,25 @@ For chat and prompt to code features: ### Install -You can install it via [Homebrew](http://brew.sh/): +**One-line installer** — runs the bundled `install.sh` script which handles the download, moves the app to `/Applications`, and prints the remaining manual steps: + +```bash +bash <(curl -fsSL https://raw.githubusercontent.com/intitni/CopilotForXcode/main/install.sh) +``` + +Or, if you have already cloned the repository: + +```bash +bash install.sh +``` + +Alternatively, you can install it via [Homebrew](http://brew.sh/) directly: ```bash brew install --cask copilot-for-xcode ``` -Or install it manually, by downloading the `Copilot for Xcode.app` from the latest [release](https://github.com/intitni/CopilotForXcode/releases). +Or install it manually by downloading the `Copilot for Xcode.app` from the latest [release](https://github.com/intitni/CopilotForXcode/releases). Please make sure the app is inside the Applications folder. diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..7c55df16 --- /dev/null +++ b/install.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +# install.sh — Install Copilot for Xcode on macOS +# +# Usage: +# bash install.sh +# +# The script will: +# 1. Verify prerequisites (macOS 12+, Xcode installed) +# 2. Install the app via Homebrew cask when available, or download the +# latest release from GitHub otherwise +# 3. Launch the app once so it registers its background launch agent +# 4. Print step-by-step instructions for the manual post-install tasks +# (enabling the Source Editor Extension and granting Accessibility access) + +set -euo pipefail + +# ── color helpers ───────────────────────────────────────────────────────────── +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +BOLD='\033[1m' +RESET='\033[0m' + +info() { echo -e "${CYAN}[info]${RESET} $*"; } +success() { echo -e "${GREEN}[ok]${RESET} $*"; } +warn() { echo -e "${YELLOW}[warn]${RESET} $*"; } +error() { echo -e "${RED}[error]${RESET} $*" >&2; } +step() { echo -e "\n${BOLD}$*${RESET}"; } + +# ── constants ───────────────────────────────────────────────────────────────── +APP_NAME="Copilot for Xcode" +APP_BUNDLE="Copilot for Xcode.app" +APP_PATH="/Applications/${APP_BUNDLE}" +BREW_CASK="copilot-for-xcode" +GITHUB_RELEASES="https://api.github.com/repos/intitni/CopilotForXcode/releases/latest" +MIN_MACOS_MAJOR=12 # macOS Monterey + +# ── prerequisite checks ─────────────────────────────────────────────────────── +step "1/4 Checking prerequisites" + +# macOS version +os_version=$(sw_vers -productVersion 2>/dev/null || echo "0.0") +os_major=$(echo "$os_version" | cut -d. -f1) +if [[ "$os_major" -lt "$MIN_MACOS_MAJOR" ]]; then + error "${APP_NAME} requires macOS Monterey (12) or later." + error "Current version: ${os_version}" + exit 1 +fi +success "macOS ${os_version} — compatible" + +# Xcode installed (look for the app bundle or xcode-select path) +if ! xcode-select -p &>/dev/null || [[ ! -d "$(xcode-select -p)" ]]; then + error "Xcode does not appear to be installed." + error "Install Xcode from the Mac App Store, then re-run this script." + exit 1 +fi +success "Xcode found at $(xcode-select -p)" + +# ── installation ────────────────────────────────────────────────────────────── +step "2/4 Installing ${APP_NAME}" + +if [[ -d "$APP_PATH" ]]; then + success "${APP_NAME} is already installed at ${APP_PATH}" +elif command -v brew &>/dev/null; then + info "Homebrew detected — installing via cask …" + brew install --cask "$BREW_CASK" + success "Installed via Homebrew" +else + warn "Homebrew not found — falling back to manual download." + + # Fetch the download URL of the latest release asset + info "Fetching latest release information from GitHub …" + asset_url=$( + curl -fsSL "$GITHUB_RELEASES" \ + | grep '"browser_download_url"' \ + | grep '\.zip"' \ + | head -1 \ + | sed 's/.*"browser_download_url": "\(.*\)"/\1/' + ) + + if [[ -z "$asset_url" ]]; then + error "Could not determine the download URL from GitHub." + error "Please download ${APP_NAME} manually from:" + error " https://github.com/intitni/CopilotForXcode/releases" + exit 1 + fi + + tmp_dir=$(mktemp -d) + zip_path="${tmp_dir}/CopilotForXcode.zip" + + info "Downloading ${APP_NAME} …" + curl -fL --progress-bar "$asset_url" -o "$zip_path" + + info "Extracting …" + unzip -q "$zip_path" -d "$tmp_dir" + + extracted_app=$(find "$tmp_dir" -maxdepth 2 -name "*.app" | head -1) + if [[ -z "$extracted_app" ]]; then + error "Could not find the .app bundle inside the downloaded archive." + rm -rf "$tmp_dir" + exit 1 + fi + + info "Moving ${APP_BUNDLE} to /Applications …" + # Remove a stale copy if present (handles re-install after failed attempt) + [[ -d "$APP_PATH" ]] && rm -rf "$APP_PATH" + cp -R "$extracted_app" "$APP_PATH" + rm -rf "$tmp_dir" + + success "Installed to ${APP_PATH}" +fi + +# ── launch the app once ─────────────────────────────────────────────────────── +step "3/4 Launching ${APP_NAME}" + +info "Opening ${APP_NAME} to register its background service …" +open -a "$APP_PATH" + +# Give the app a moment to start before we print the next instructions +sleep 3 +success "${APP_NAME} has been opened" + +# ── post-install instructions ───────────────────────────────────────────────── +step "4/4 Post-install steps (manual)" + +os_minor=$(echo "$os_version" | cut -d. -f2) + +echo "" +echo -e "${BOLD}A) Enable the Source Editor Extension${RESET}" +if [[ "$os_major" -ge 15 ]]; then + echo " Open: System Settings → General → Login Items & Extensions" + echo " Click 'Xcode Source Editor' and tick 'Copilot for Xcode'." +elif [[ "$os_major" -eq 14 ]]; then + echo " Open: System Settings → Privacy & Security → Extensions" + echo " Click 'Xcode Source Editor' and tick 'Copilot'." +else + echo " Open: System Preferences → Extensions" + echo " Tick 'Copilot' under 'Xcode Source Editor'." +fi + +echo "" +echo -e "${BOLD}B) Grant Accessibility permission${RESET}" +echo " Open: System Settings → Privacy & Security → Accessibility" +echo " Add 'CopilotForXcodeExtensionService.app' to the list." +echo " (Click 'Reveal Extension App in Finder' inside ${APP_NAME} to locate it.)" + +echo "" +echo -e "${BOLD}C) Set up your AI provider${RESET}" +echo " • GitHub Copilot: navigate to 'Service → GitHub Copilot' in the host app," +echo " click 'Install' then 'Sign In'." +echo " • Codeium: navigate to 'Service → Codeium', click 'Install' then 'Sign In'." +echo " • OpenAI / other chat models: navigate to 'Service → Chat Model'." + +echo "" +echo -e "${BOLD}D) (Optional) Set up key bindings in Xcode${RESET}" +echo " Xcode → Settings → Key Bindings → search for 'copilot'" + +echo "" +success "Installation complete! Enjoy ${APP_NAME} 🎉"