install copilot cli

#!/bin/bash
#valid on july 4 2026
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# ──────────────────────────────────────────────
# Detection helpers
# ──────────────────────────────────────────────

CLI_EXISTS=false
CONFIG_EXISTS=false

detect_existing() {
 if [ -f /nzk/bin/copilot ]; then
 CLI_EXISTS=true
 echo -e "${GREEN}✓ Detected:${NC} copilot CLI at /nzk/bin/copilot"
 fi
 if [ -f /nzk/special/.deepseek_config ]; then
 CONFIG_EXISTS=true
 echo -e "${GREEN}✓ Detected:${NC} config files in /nzk/special/"
 fi
 if ! $CLI_EXISTS && ! $CONFIG_EXISTS; then
 echo -e "${YELLOW}ℹ️ No existing installation detected.${NC}"
 fi
 echo ""
}

# ──────────────────────────────────────────────
# Functions
# ──────────────────────────────────────────────

install_copilot() {
 if $CLI_EXISTS; then
 echo -e "${YELLOW}⚠️ Copilot CLI is already installed at /nzk/bin/copilot.${NC}"
 read -p "Reinstall? (y/N): " reinstall
 if [[ ! "$reinstall" =~ ^[Yy] ]]; then
 echo -e "${GREEN}⏭️ Skipping copilot install.${NC}"
 return 0
 fi
 fi

 echo -e "${YELLOW}📥 Installing GitHub Copilot CLI...${NC}"
 curl -fsSL https://gh.io/copilot-install | bash

 echo -e "${YELLOW}📁 Creating /nzk/bin directory...${NC}"
 mkdir -p /nzk/bin

 echo -e "${YELLOW}📦 Moving copilot to /nzk/bin...${NC}"
 if [ -f ~/.local/bin/copilot ]; then
 mv ~/.local/bin/copilot /nzk/bin/copilot
 elif [ -f /usr/local/bin/copilot ]; then
 mv /usr/local/bin/copilot /nzk/bin/copilot
 else
 echo -e "${RED}❌ Copilot binary not found after installation!${NC}"
 echo -e "${YELLOW} Please manually move it to /nzk/bin/copilot${NC}"
 return 1
 fi
 chmod +x /nzk/bin/copilot
 echo -e "${GREEN}✅ Copilot installed at /nzk/bin/copilot${NC}"
}

prompt_for_key() {
 local label="$1"
 local key_var
 echo -e "${YELLOW}🔑 Enter your API key${label}:${NC}"
 read -s key_var
 echo ""
 echo "$key_var"
}

# ── Choose provider and set env vars ──
choose_provider() {
 echo ""
 echo "Select a provider:"
 echo " 1) DeepSeek (deepseek-v4-pro / deepseek-v4-flash)"
 echo " 2) OpenAI (gpt-4o, o3, etc.)"
 echo " 3) Anthropic (claude-sonnet-4-20250514, etc.)"
 echo " 4) Google (gemini-2.5-pro, etc.)"
 echo " 5) Custom (enter your own)"
 echo ""
 read -p "Enter your choice [1-5]: " prov_choice

 case $prov_choice in
 1)
 PROVIDER_TYPE="anthropic"
 PROVIDER_BASE_URL="https://api.deepseek.com/anthropic"
 PROVIDER_LABEL="DeepSeek"
 PROVIDER_DEFAULT_MODEL="deepseek-v4-pro"
 PROVIDER_FLASH_MODEL="deepseek-v4-flash"
 SUPPORTS_DUAL=true
 ;;
 2)
 PROVIDER_TYPE="openai"
 PROVIDER_BASE_URL="https://api.openai.com/v1"
 PROVIDER_LABEL="OpenAI"
 PROVIDER_DEFAULT_MODEL="gpt-4o"
 SUPPORTS_DUAL=false
 ;;
 3)
 PROVIDER_TYPE="anthropic"
 PROVIDER_BASE_URL="https://api.anthropic.com/v1"
 PROVIDER_LABEL="Anthropic"
 PROVIDER_DEFAULT_MODEL="claude-sonnet-4-20250514"
 SUPPORTS_DUAL=false
 ;;
 4)
 PROVIDER_TYPE="google"
 PROVIDER_BASE_URL="https://generativelanguage.googleapis.com/v1/openai"
 PROVIDER_LABEL="Google"
 PROVIDER_DEFAULT_MODEL="gemini-2.5-pro"
 SUPPORTS_DUAL=false
 ;;
 5)
 PROVIDER_LABEL="Custom"
 SUPPORTS_DUAL=false
 read -p "Enter provider type (e.g. anthropic, openai): " PROVIDER_TYPE
 read -p "Enter base URL (e.g. https://api.example.com/v1): " PROVIDER_BASE_URL
 read -p "Enter default model name: " PROVIDER_DEFAULT_MODEL
 ;;
 *)
 echo -e "${RED}❌ Invalid choice. Defaulting to DeepSeek.${NC}"
 PROVIDER_TYPE="anthropic"
 PROVIDER_BASE_URL="https://api.deepseek.com/anthropic"
 PROVIDER_LABEL="DeepSeek"
 PROVIDER_DEFAULT_MODEL="deepseek-v4-pro"
 PROVIDER_FLASH_MODEL="deepseek-v4-flash"
 SUPPORTS_DUAL=true
 ;;
 esac

 # For non-DeepSeek, ask if they want a secondary model too
 if [ "$SUPPORTS_DUAL" != "true" ]; then
 echo ""
 echo -e "${YELLOW}❓ Do you want to set up a second model with a different key? (y/N):${NC}"
 read -r want_second
 if [[ "$want_second" =~ ^[Yy] ]]; then
 SUPPORTS_DUAL=true
 read -p "Enter second model name (e.g. gpt-4o-mini, claude-haiku): " PROVIDER_FLASH_MODEL
 fi
 fi

 echo -e "${GREEN}✅ Provider set to ${PROVIDER_LABEL} (${PROVIDER_TYPE})${NC}"
}

# ── Update API keys (and optionally provider) inside existing config files ──
update_keys_only() {
 local pro_config="/nzk/special/.deepseek_config"
 local flash_config="/nzk/special/.deepseek_config_flash"

 if [ ! -f "$pro_config" ] && [ ! -f "$flash_config" ]; then
 echo -e "${RED}❌ No existing config files found. Running full setup instead.${NC}"
 setup_api_keys
 return
 fi

 # Ask if they want to change provider too
 echo -e "${YELLOW}❓ Change provider (DeepSeek/OpenAI/Anthropic/etc.)? (y/N):${NC}"
 read -r change_prov
 if [[ "$change_prov" =~ ^[Yy] ]]; then
 choose_provider
 else
 # Keep existing — try to read from current config files
 if [ -f "$pro_config" ]; then
 PROVIDER_TYPE=$(grep "^export COPILOT_PROVIDER_TYPE=" "$pro_config" | sed 's/^export COPILOT_PROVIDER_TYPE=//')
 PROVIDER_BASE_URL=$(grep "^export COPILOT_PROVIDER_BASE_URL=" "$pro_config" | sed 's/^export COPILOT_PROVIDER_BASE_URL=//')
 PROVIDER_DEFAULT_MODEL=$(grep "^export COPILOT_MODEL=" "$pro_config" | sed 's/^export COPILOT_MODEL=//')
 PROVIDER_LABEL="${PROVIDER_TYPE}"
 fi
 if [ -f "$flash_config" ]; then
 PROVIDER_FLASH_MODEL=$(grep "^export COPILOT_MODEL=" "$flash_config" | sed 's/^export COPILOT_MODEL=//')
 fi
 fi

 echo -e "${YELLOW}🔑 Enter your new API key for ${PROVIDER_DEFAULT_MODEL:-${PROVIDER_LABEL}}:${NC}"
 read -s PRO_KEY
 echo ""
 if [ -z "$PRO_KEY" ]; then
 echo -e "${RED}❌ No key entered. Aborting.${NC}"
 return 1
 fi

 # If we have a flash/second model, ask about key
 if [ -n "${PROVIDER_FLASH_MODEL:-}" ]; then
 echo -e "${YELLOW}❓ Use the same key for ${PROVIDER_FLASH_MODEL}? (Y/n):${NC}"
 read -r use_same
 if [[ "$use_same" =~ ^[Nn] ]]; then
 echo -e "${YELLOW}🔑 Enter your API key for ${PROVIDER_FLASH_MODEL}:${NC}"
 read -s FLASH_KEY
 echo ""
 if [ -z "$FLASH_KEY" ]; then
 echo -e "${YELLOW}⚠️ No key entered, using the same key for both.${NC}"
 FLASH_KEY="$PRO_KEY"
 fi
 else
 FLASH_KEY="$PRO_KEY"
 fi
 else
 FLASH_KEY="$PRO_KEY"
 fi

 echo -e "${YELLOW}📝 Updating config files...${NC}"

 # Helper: set or replace a variable in a config file
 set_config_var() {
 local file="$1" var="$2" val="$3"
 if grep -q "^export ${var}=" "$file"; then
 sed -i "s|^export ${var}=.*|export ${var}=${val}|" "$file"
 else
 echo "export ${var}=${val}" >> "$file"
 fi
 }

 # Update/regenerate pro config
 cat > "$pro_config" << EOF
# Copilot Configuration
# Generated: $(date)
# Provider: ${PROVIDER_LABEL}

export COPILOT_PROVIDER_TYPE=${PROVIDER_TYPE}
export COPILOT_PROVIDER_BASE_URL=${PROVIDER_BASE_URL}
export COPILOT_PROVIDER_API_KEY=${PRO_KEY}
export COPILOT_MODEL=${PROVIDER_DEFAULT_MODEL}
EOF
 echo -e "${GREEN} ✓ Updated ${pro_config}${NC}"

 # Update/regenerate flash/secondary config
 if [ -n "${PROVIDER_FLASH_MODEL:-}" ]; then
 cat > "$flash_config" << EOF
# Copilot Configuration — secondary model
# Generated: $(date)
# Provider: ${PROVIDER_LABEL}

export COPILOT_PROVIDER_TYPE=${PROVIDER_TYPE}
export COPILOT_PROVIDER_BASE_URL=${PROVIDER_BASE_URL}
export COPILOT_PROVIDER_API_KEY=${FLASH_KEY}
export COPILOT_MODEL=${PROVIDER_FLASH_MODEL}
EOF
 echo -e "${GREEN} ✓ Updated ${flash_config}${NC}"
 fi

 # Update aliases to reflect current provider label
 cat > /nzk/special/.deepseek_aliases << ALIASEOF
# Copilot aliases — ${PROVIDER_LABEL}
alias copilot-default='source /nzk/special/.deepseek_config && copilot'
alias copilot-alt='source /nzk/special/.deepseek_config_flash && copilot'
ALIASEOF
 echo -e "${GREEN} ✓ Updated aliases${NC}"

 chmod 600 /nzk/special/.deepseek_config 2>/dev/null
 chmod 600 /nzk/special/.deepseek_config_flash 2>/dev/null
 chmod 600 /nzk/special/.deepseek_aliases 2>/dev/null

 echo -e "${GREEN}✅ Keys and config updated.${NC}"
}

setup_api_keys() {
 mkdir -p /nzk/special

 # If config already exists, ask what to do
 if $CONFIG_EXISTS; then
 echo ""
 echo -e "${YELLOW}⚠️ Config files already exist in /nzk/special/${NC}"
 echo " 1) Overwrite all config files (fresh setup)"
 echo " 2) Update API keys only (keep everything else)"
 echo " 3) Skip — don't touch config files"
 echo ""
 read -p "Enter your choice [1-3]: " cfg_choice
 case $cfg_choice in
 1)
 : # fall through to full key setup below
 ;;
 2)
 update_keys_only
 return $?
 ;;
 *)
 echo -e "${GREEN}⏭️ Skipping config file setup.${NC}"
 return 0
 ;;
 esac
 fi

 # Choose provider
 choose_provider

 # Prompt for primary key
 echo ""
 PRO_KEY=$(prompt_for_key " for ${PROVIDER_DEFAULT_MODEL}")
 if [ -z "$PRO_KEY" ]; then
 echo -e "${RED}❌ No key entered. Aborting.${NC}"
 return 1
 fi

 # Ask about second model key
 if [ "$SUPPORTS_DUAL" = "true" ] && [ -n "${PROVIDER_FLASH_MODEL:-}" ]; then
 echo -e "${YELLOW}❓ Use the same API key for ${PROVIDER_FLASH_MODEL}? (Y/n):${NC}"
 read -r use_same
 if [[ "$use_same" =~ ^[Nn] ]]; then
 FLASH_KEY=$(prompt_for_key " for ${PROVIDER_FLASH_MODEL}")
 if [ -z "$FLASH_KEY" ]; then
 echo -e "${YELLOW}⚠️ No key entered, using the same key for both.${NC}"
 FLASH_KEY="$PRO_KEY"
 fi
 else
 FLASH_KEY="$PRO_KEY"
 fi
 else
 FLASH_KEY="$PRO_KEY"
 fi

 echo -e "${YELLOW}📝 Creating configuration files...${NC}"

 # ── Main config ──
 cat > /nzk/special/.deepseek_config << EOF
# Copilot Configuration — ${PROVIDER_LABEL}
# Generated: $(date)

export COPILOT_PROVIDER_TYPE=${PROVIDER_TYPE}
export COPILOT_PROVIDER_BASE_URL=${PROVIDER_BASE_URL}
export COPILOT_PROVIDER_API_KEY=${PRO_KEY}
export COPILOT_MODEL=${PROVIDER_DEFAULT_MODEL}
EOF

 # ── Secondary model config ──
 if [ -n "${PROVIDER_FLASH_MODEL:-}" ]; then
 cat > /nzk/special/.deepseek_config_flash << EOF
# Copilot Configuration — ${PROVIDER_LABEL} (secondary)
# Generated: $(date)

export COPILOT_PROVIDER_TYPE=${PROVIDER_TYPE}
export COPILOT_PROVIDER_BASE_URL=${PROVIDER_BASE_URL}
export COPILOT_PROVIDER_API_KEY=${FLASH_KEY}
export COPILOT_MODEL=${PROVIDER_FLASH_MODEL}
EOF
 fi

 # ── Aliases ──
 cat > /nzk/special/.deepseek_aliases << ALIASEOF
# Copilot aliases — ${PROVIDER_LABEL}
alias copilot-default='source /nzk/special/.deepseek_config && copilot'
alias copilot-alt='source /nzk/special/.deepseek_config_flash && copilot'
ALIASEOF

 chmod 600 /nzk/special/.deepseek_config
 chmod 600 /nzk/special/.deepseek_config_flash 2>/dev/null
 chmod 600 /nzk/special/.deepseek_aliases

 echo -e "${GREEN}✅ API keys and config files created.${NC}"
}

setup_shell_config() {
 echo -e "${YELLOW}⚙️ Adding to shell config...${NC}"
 SHELL_CONFIG=""
 if [ -f ~/.zshrc ]; then
 SHELL_CONFIG=~/.zshrc
 elif [ -f ~/.bashrc ]; then
 SHELL_CONFIG=~/.bashrc
 else
 echo -e "${RED}❌ No .zshrc or .bashrc found!${NC}"
 return 1
 fi

 cp "${SHELL_CONFIG}" "${SHELL_CONFIG}.backup"

 if ! grep -q "/nzk/special/.deepseek_config" "${SHELL_CONFIG}"; then
 cat >> "${SHELL_CONFIG}" << 'EOF'

# DeepSeek Copilot Configuration
export PATH="/nzk/bin:/nzk/appimages:$PATH"
source /nzk/special/.deepseek_config
source /nzk/special/.deepseek_aliases
EOF
 echo -e "${GREEN}✅ Added to ${SHELL_CONFIG}${NC}"
 else
 echo -e "${YELLOW}⚠️ Already configured in ${SHELL_CONFIG}${NC}"
 fi
}

create_readme() {
 cat > /nzk/special/README.md << EOF
# Copilot Configuration — ${PROVIDER_LABEL:-Current Provider}

## Models
| Alias | Model | Config File |
|-------------------|-----------------------------------|------------------------------------|
| \`copilot-default\` | ${PROVIDER_DEFAULT_MODEL:-default} | \`.deepseek_config\` |
| \`copilot-alt\` | ${PROVIDER_FLASH_MODEL:-N/A} | \`.deepseek_config_flash\` |

## Usage
- \`copilot\` — Run with default model
- \`copilot-default\` — Explicitly use default model
- \`copilot-alt\` — Use secondary model (if configured)

## Switch models manually
\`\`\`bash
source /nzk/special/.deepseek_config # default model
source /nzk/special/.deepseek_config_flash # secondary model
\`\`\`

## Environment Variables
- \`COPILOT_PROVIDER_TYPE\`: ${PROVIDER_TYPE:-anthropic}
- \`COPILOT_PROVIDER_BASE_URL\`: ${PROVIDER_BASE_URL:-...}
- \`COPILOT_PROVIDER_API_KEY\`: Your API key
- \`COPILOT_MODEL\`: Model name

## Files
- \`.deepseek_config\` — Default model config + API key
- \`.deepseek_config_flash\` — Secondary model config + API key
- \`.deepseek_aliases\` — Convenience aliases
EOF
 echo -e "${GREEN}✅ README created.${NC}"
}

print_complete() {
 echo -e "${GREEN}========================================${NC}"
 echo -e "${GREEN}✅ All done!${NC}"
 echo -e "${GREEN}========================================${NC}"
 echo -e "${YELLOW}📝 Next steps:${NC}"
 echo -e "1. Source your shell config: ${GREEN}source ${SHELL_CONFIG}${NC}"
 echo -e " OR open a new terminal"
 echo -e ""
 echo -e "2. Test: ${GREEN}copilot-default${NC} or ${GREEN}copilot-alt${NC}"
 echo -e ""
 echo -e "${YELLOW}📂 Files:${NC}"
 echo -e " - /nzk/bin/copilot"
 echo -e " - /nzk/special/.deepseek_config"
 echo -e " - /nzk/special/.deepseek_config_flash"
 echo -e " - /nzk/special/.deepseek_aliases"
 echo -e " - /nzk/special/README.md"
 echo -e ""
 echo -e "${RED}🔑 API keys are stored in /nzk/special/.deepseek_config*${NC}"
 echo -e "${RED} Make sure to keep these files secure!${NC}"
}

# ──────────────────────────────────────────────
# Main Menu
# ──────────────────────────────────────────────

echo -e "${NC}"
echo -e "${GREEN}╔═══════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ GitHub Copilot CLI Configurator ║${NC}"
echo -e "${GREEN}╚═══════════════════════════════════════╝${NC}"
echo ""

# Detect existing installation
detect_existing

echo "What do you want to do?"
echo " 1) Install copilot CLI only"
echo " 2) Full API key & provider setup (DeepSeek, OpenAI, Anthropic, etc.)"
echo " 3) Both — install CLI + full setup"
echo " 4) Update keys / provider in existing config only"
echo ""

read -p "Enter your choice [1-4]: " choice

case $choice in
 1)
 install_copilot
 ;;
 2)
 setup_api_keys
 setup_shell_config
 create_readme
 print_complete
 ;;
 3)
 install_copilot
 setup_api_keys
 setup_shell_config
 create_readme
 print_complete
 ;;
 4)
 update_keys_only
 echo -e "${GREEN}✅ Key update complete.${NC}"
 ;;
 *)
 echo -e "${RED}❌ Invalid choice. Please run again and select 1-4.${NC}"
 exit 1
 ;;
esac
 
  