#!/bin/bash # Gemini CLI Configuration Script for XCodeCLI # This script configures Gemini CLI to use your XCodeCLI instance # Automatically tests multiple API endpoints and selects the working one set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Configuration DEFAULT_BASE_URL="https://api2.xcodecli.com" GEMINI_CONFIG_DIR="$HOME/.gemini" GEMINI_ENV_FILE="$GEMINI_CONFIG_DIR/.env" # Function to print colored output print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Function to backup existing settings backup_settings() { if [ -f "$GEMINI_ENV_FILE" ]; then local backup_file="${GEMINI_ENV_FILE}.backup.$(date +%Y%m%d_%H%M%S)" cp "$GEMINI_ENV_FILE" "$backup_file" print_info "Backed up existing settings to: $backup_file" fi local settings_json_path="$GEMINI_CONFIG_DIR/settings.json" if [ -f "$settings_json_path" ]; then local backup_file="${settings_json_path}.backup.$(date +%Y%m%d_%H%M%S)" cp "$settings_json_path" "$backup_file" print_info "Backed up existing settings to: $backup_file" fi } # Function to create settings directory create_settings_dir() { if [ ! -d "$GEMINI_CONFIG_DIR" ]; then mkdir -p "$GEMINI_CONFIG_DIR" print_info "Created Gemini configuration directory: $GEMINI_CONFIG_DIR" fi } # Function to validate API key format validate_api_key() { local api_key="$1" if [[ ! "$api_key" =~ ^[A-Za-z0-9_-]+$ ]]; then print_error "Invalid API key format. API key should contain only alphanumeric characters, hyphens, and underscores." return 1 fi return 0 } # Function to test API connection and return working base URL test_api_connection() { local api_key="$1" local test_urls=( "https://api2.xcodecli.com" "https://api.xcodecli.com" ) print_info "Testing API connections..." >&2 for base_url in "${test_urls[@]}"; do print_info "Testing $base_url..." >&2 local test_endpoint="$base_url/v1/models" # Test with x-goog-api-key header (Gemini API style) local response response=$(curl -s -w "%{http_code}" -o /tmp/gemini_test_response \ -X GET "$test_endpoint" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $api_key" \ 2>/dev/null || echo "000") if [ "$response" = "200" ]; then # Check if response contains models if grep -q '"models"' /tmp/gemini_test_response 2>/dev/null; then local model_count model_count=$(grep -oE '"name"[[:space:]]*:' /tmp/gemini_test_response | wc -l | tr -d ' ') print_success "API connection successful! Found $model_count models at $base_url" >&2 rm -f /tmp/gemini_test_response echo "$base_url" return 0 else print_warning "API responded but no models found at $base_url" >&2 fi elif [ "$response" = "401" ]; then print_warning "API key authentication failed for $base_url" >&2 elif [ "$response" = "000" ]; then print_warning "Cannot connect to $base_url" >&2 else print_warning "API test failed for $base_url with HTTP status: $response" >&2 fi rm -f /tmp/gemini_test_response done print_error "All API connections failed. Please check your API key and internet connection." >&2 return 1 } # Function to create Gemini CLI settings file create_settings_file() { local base_url="$1" local api_key="$2" # Write to .env file cat < "$GEMINI_ENV_FILE" GOOGLE_GEMINI_BASE_URL="$base_url" GEMINI_API_KEY="$api_key" GEMINI_MODEL="gemini-3-pro-preview" EOF print_success "Gemini CLI settings written to: $GEMINI_ENV_FILE" # Write to settings.json local settings_json_path="$GEMINI_CONFIG_DIR/settings.json" cat < "$settings_json_path" { "general": { "previewFeatures": true }, "security": { "auth": { "selectedType": "gemini-api-key" } } } EOF print_success "Gemini CLI settings written to: $settings_json_path" } # Function to display current settings display_settings() { if [ -f "$GEMINI_ENV_FILE" ]; then print_info "Current Gemini CLI settings file ($GEMINI_ENV_FILE):" echo "----------------------------------------" cat "$GEMINI_ENV_FILE" echo "----------------------------------------" else print_info "No existing Gemini CLI .env file found." fi } # Main function main() { print_info "Gemini CLI Configuration Script for XCodeCLI" echo "=======================================================" echo # Parse command line arguments local api_key="" local test_only=false local show_settings=false # Check for environment variable API_KEY if [ -n "$API_KEY" ]; then api_key="$API_KEY" fi while [[ $# -gt 0 ]]; do case $1 in -k|--key) api_key="$2" shift 2 ;; -t|--test) test_only=true shift ;; -s|--show) show_settings=true shift ;; -h|--help) cat <