Files
aicodemirror-switcher/env-deploy.sh
2025-11-03 23:32:29 +08:00

327 lines
11 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Claude Code Environment Setup Script
# Author: Claude Assistant
# Purpose: Automatically configure environment variables for Claude Code on macOS and Linux
set -e # Exit on error
# Colors for output
RED='\033[1;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Function to print colored output
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
# Function to display current environment variables
display_current_env() {
print_info "当前环境变量状态:"
echo -e "${BLUE}----------------------------------------${NC}"
# Get current shell type for proper variable display
CURRENT_SHELL=$(basename "$SHELL")
if [[ "$CURRENT_SHELL" == "fish" ]]; then
# Fish shell syntax
echo "ANTHROPIC_BASE_URL=$(set -q ANTHROPIC_BASE_URL && echo $ANTHROPIC_BASE_URL || echo '(未设置)')"
echo "ANTHROPIC_API_KEY=$(set -q ANTHROPIC_API_KEY && echo '****'${ANTHROPIC_API_KEY: -4} || echo '(未设置)')"
echo "ANTHROPIC_AUTH_TOKEN=$(set -q ANTHROPIC_AUTH_TOKEN && echo $ANTHROPIC_AUTH_TOKEN || echo '(未设置)')"
else
# Bash/Zsh syntax
if [ -n "$ANTHROPIC_BASE_URL" ]; then
echo "ANTHROPIC_BASE_URL=$ANTHROPIC_BASE_URL"
else
echo "ANTHROPIC_BASE_URL=(未设置)"
fi
if [ -n "$ANTHROPIC_API_KEY" ]; then
echo "ANTHROPIC_API_KEY=****${ANTHROPIC_API_KEY: -4}"
else
echo "ANTHROPIC_API_KEY=(未设置)"
fi
if [ -n "$ANTHROPIC_AUTH_TOKEN" ]; then
echo "ANTHROPIC_AUTH_TOKEN=$ANTHROPIC_AUTH_TOKEN"
else
echo "ANTHROPIC_AUTH_TOKEN=(未设置)"
fi
fi
echo -e "${BLUE}----------------------------------------${NC}"
}
# Header
echo -e "\n${BLUE}========================================${NC}"
echo -e "${BLUE}Claude Code Environment Setup${NC}"
echo -e "${BLUE}========================================${NC}\n"
# Display current environment variables before any changes
display_current_env
echo
# Check if API key is provided as argument
if [ $# -eq 0 ]; then
print_error "请提供API密钥作为参数"
echo "使用方法: $0 <your-api-key>"
exit 1
fi
ANTHROPIC_API_KEY="$1"
ANTHROPIC_BASE_URL="https://api.aicodemirror.com/api/claudecode"
# Detect OS and shell
detect_os_and_shell() {
print_info "检测操作系统和Shell环境..."
# Detect OS
if [[ "$OSTYPE" == "darwin"* ]]; then
OS="macOS"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
OS="Linux"
else
print_error "不支持的操作系统: $OSTYPE"
exit 1
fi
# Detect Shell
CURRENT_SHELL=$(basename "$SHELL")
# Determine config file based on shell
case "$CURRENT_SHELL" in
bash)
if [[ "$OS" == "macOS" ]]; then
CONFIG_FILE="$HOME/.bash_profile"
else
CONFIG_FILE="$HOME/.bashrc"
fi
;;
zsh)
CONFIG_FILE="$HOME/.zshrc"
;;
fish)
CONFIG_FILE="$HOME/.config/fish/config.fish"
;;
*)
print_error "不支持的Shell: $CURRENT_SHELL"
exit 1
;;
esac
print_success "检测完成 - 系统: $OS, Shell: $CURRENT_SHELL"
print_info "配置文件: $CONFIG_FILE"
}
# Function to add environment variables to config file
add_env_vars() {
print_info "开始配置环境变量..."
# Create backup
if [ -f "$CONFIG_FILE" ]; then
cp "$CONFIG_FILE" "$CONFIG_FILE.backup.$(date +%Y%m%d_%H%M%S)"
print_info "已备份原配置文件"
fi
# Check if variables already exist
if grep -q "ANTHROPIC_BASE_URL" "$CONFIG_FILE" 2>/dev/null || grep -q "ANTHROPIC_API_KEY" "$CONFIG_FILE" 2>/dev/null; then
print_warning "检测到已存在的Claude Code环境变量配置"
print_info "正在清理所有现有配置..."
# Remove ALL existing ANTHROPIC environment variable configurations
# For bash/zsh: export VARIABLE=...
# For fish: set -x VARIABLE ...
if [[ "$CURRENT_SHELL" == "fish" ]]; then
# Fish shell: remove 'set -x VARIABLE ...' patterns
# Using -E for extended regex on macOS/BSD sed
sed -i.tmp -E '/^[[:space:]]*set[[:space:]]+-x[[:space:]]+ANTHROPIC_BASE_URL/d' "$CONFIG_FILE" 2>/dev/null || true
sed -i.tmp -E '/^[[:space:]]*set[[:space:]]+-x[[:space:]]+ANTHROPIC_API_KEY/d' "$CONFIG_FILE" 2>/dev/null || true
sed -i.tmp -E '/^[[:space:]]*set[[:space:]]+-x[[:space:]]+ANTHROPIC_AUTH_TOKEN/d' "$CONFIG_FILE" 2>/dev/null || true
else
# Bash/Zsh: remove 'export VARIABLE=...' patterns
# Using -E for extended regex on macOS/BSD sed
sed -i.tmp -E '/^[[:space:]]*export[[:space:]]+ANTHROPIC_BASE_URL=/d' "$CONFIG_FILE" 2>/dev/null || true
sed -i.tmp -E '/^[[:space:]]*export[[:space:]]+ANTHROPIC_API_KEY=/d' "$CONFIG_FILE" 2>/dev/null || true
sed -i.tmp -E '/^[[:space:]]*export[[:space:]]+ANTHROPIC_AUTH_TOKEN=/d' "$CONFIG_FILE" 2>/dev/null || true
fi
# Also remove the marked sections for backward compatibility
sed -i.tmp '/# Claude Code Environment Variables/,/# End Claude Code Environment Variables/d' "$CONFIG_FILE" 2>/dev/null || true
# Clean up temporary files
rm -f "$CONFIG_FILE.tmp"
print_success "已彻底清理所有旧配置,准备写入新配置"
fi
# Add environment variables based on shell type
if [[ "$CURRENT_SHELL" == "fish" ]]; then
cat >> "$CONFIG_FILE" << EOF
# Claude Code Environment Variables
set -x ANTHROPIC_BASE_URL "$ANTHROPIC_BASE_URL"
set -x ANTHROPIC_API_KEY "$ANTHROPIC_API_KEY"
set -x ANTHROPIC_AUTH_TOKEN ""
# End Claude Code Environment Variables
EOF
else
cat >> "$CONFIG_FILE" << EOF
# Claude Code Environment Variables
export ANTHROPIC_BASE_URL="$ANTHROPIC_BASE_URL"
export ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY"
export ANTHROPIC_AUTH_TOKEN=""
# End Claude Code Environment Variables
EOF
fi
print_success "环境变量已写入配置文件"
}
# Function to update .claude.json
update_claude_json() {
print_info "更新 ~/.claude.json 配置..."
# Check if jq is installed
if ! command -v jq &> /dev/null; then
print_error "需要安装 jq 工具"
if [[ "$OS" == "macOS" ]]; then
print_info "请运行: brew install jq"
else
print_info "请运行: sudo apt-get install jq (Ubuntu/Debian) 或 sudo yum install jq (CentOS/RHEL)"
fi
return 1
fi
# Execute the jq command
print_info "添加API密钥到Claude配置..."
# Get the last 20 characters of the API key
KEY_SUFFIX="${ANTHROPIC_API_KEY: -20}"
# Create .claude.json if it doesn't exist
if [ ! -f "$HOME/.claude.json" ]; then
echo '{}' > "$HOME/.claude.json"
print_info "创建新的 ~/.claude.json 文件"
fi
# Update the JSON file
if (cat ~/.claude.json 2>/dev/null || echo 'null') | jq --arg key "$KEY_SUFFIX" '(. // {}) | .customApiKeyResponses.approved |= ([.[]?, $key] | unique)' > ~/.claude.json.tmp; then
mv ~/.claude.json.tmp ~/.claude.json
print_success "Claude配置已更新"
# Display the updated customApiKeyResponses
print_info "更新后的 customApiKeyResponses 内容:"
echo -e "${BLUE}----------------------------------------${NC}"
jq '.customApiKeyResponses' ~/.claude.json 2>/dev/null || echo "{}"
echo -e "${BLUE}----------------------------------------${NC}"
else
print_error "更新Claude配置失败"
rm -f ~/.claude.json.tmp
return 1
fi
}
# Function to source the config file
activate_config() {
print_info "激活配置..."
# Export variables for current session
export ANTHROPIC_BASE_URL="$ANTHROPIC_BASE_URL"
export ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY"
export ANTHROPIC_AUTH_TOKEN=""
print_success "环境变量已在当前会话中激活"
print_info "要在新的终端会话中使用,请运行以下命令:"
if [[ "$CURRENT_SHELL" == "fish" ]]; then
echo -e "${GREEN}source $CONFIG_FILE${NC}"
else
echo -e "${GREEN}source $CONFIG_FILE${NC}"
fi
print_info "或者重新打开终端窗口"
}
# Function to verify configuration
verify_config() {
print_info "验证配置..."
# Check if variables are set
if [ -n "$ANTHROPIC_BASE_URL" ] && [ -n "$ANTHROPIC_API_KEY" ]; then
print_success "环境变量验证成功"
echo "ANTHROPIC_BASE_URL: $ANTHROPIC_BASE_URL"
echo "ANTHROPIC_API_KEY: ****${ANTHROPIC_API_KEY: -4}"
echo "ANTHROPIC_AUTH_TOKEN: ${ANTHROPIC_AUTH_TOKEN:-\"\"}"
else
print_error "环境变量验证失败"
return 1
fi
# Check .claude.json
if [ -f "$HOME/.claude.json" ]; then
if jq -e '.customApiKeyResponses.approved' "$HOME/.claude.json" &>/dev/null; then
print_success "Claude配置文件验证成功"
else
print_warning "Claude配置文件存在但可能不完整"
fi
else
print_error "Claude配置文件不存在"
fi
}
# Main execution
main() {
# Step 1: Detect OS and Shell
detect_os_and_shell
echo
# Step 2: Add environment variables
add_env_vars
echo
# Step 3: Update .claude.json
update_claude_json
echo
# Step 4: Activate configuration
activate_config
echo
# Step 5: Verify configuration
verify_config
echo
print_success "Claude Code环境配置完成"
echo -e "${BLUE}========================================${NC}"
# Important reminder in red
echo
echo -e "${RED}╔══════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ ║${NC}"
echo -e "${RED}║ 请关闭终端后重新打开,开始 claude code 使用~ ║${NC}"
echo -e "${RED}║ ║${NC}"
echo -e "${RED}╚══════════════════════════════════════════════════════════╝${NC}"
echo
}
# Run main function
main
# Exit successfully
exit 0