fix: replace claude setup symlinks with files
This commit is contained in:
@@ -17,6 +17,54 @@ NC='\033[0m' # No Color
|
||||
DEFAULT_BASE_URL="https://api2.xcodecli.com"
|
||||
CLAUDE_CONFIG_DIR="$HOME/.claude"
|
||||
CLAUDE_SETTINGS_FILE="$CLAUDE_CONFIG_DIR/settings.json"
|
||||
TOOL_COMMAND="claude"
|
||||
TOOL_PACKAGE="@anthropic-ai/claude-code"
|
||||
TOOL_NAME="Claude Code"
|
||||
|
||||
# ========== Shell 环境变量配置 ==========
|
||||
get_shell_rc() {
|
||||
if [ -n "${ZSH_VERSION:-}" ] || [ "${SHELL##*/}" = "zsh" ]; then
|
||||
echo "$HOME/.zshrc"
|
||||
elif [ -n "${BASH_VERSION:-}" ] || [ "${SHELL##*/}" = "bash" ]; then
|
||||
if [ -f "$HOME/.bashrc" ]; then
|
||||
echo "$HOME/.bashrc"
|
||||
else
|
||||
echo "$HOME/.bash_profile"
|
||||
fi
|
||||
else
|
||||
print_error "不支持当前 shell: ${SHELL##*/}"
|
||||
print_error "仅支持 bash 和 zsh"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
write_env_to_shell() {
|
||||
local var_name="$1"
|
||||
local var_value="$2"
|
||||
local rc_file
|
||||
rc_file=$(get_shell_rc)
|
||||
|
||||
mkdir -p "$(dirname "$rc_file")"
|
||||
touch "$rc_file"
|
||||
|
||||
if [ -s "$rc_file" ] && [ "$(tail -c1 "$rc_file" | wc -l)" -eq 0 ]; then
|
||||
echo "" >>"$rc_file"
|
||||
fi
|
||||
|
||||
local export_line="export $var_name='$var_value'"
|
||||
|
||||
local tmp_file
|
||||
tmp_file=$(mktemp)
|
||||
if [ -s "$rc_file" ]; then
|
||||
grep -v "^export $var_name=" "$rc_file" >"$tmp_file" 2>/dev/null || true
|
||||
fi
|
||||
echo "$export_line" >>"$tmp_file"
|
||||
|
||||
cat "$tmp_file" >"$rc_file"
|
||||
rm -f "$tmp_file"
|
||||
|
||||
export "$var_name=$var_value"
|
||||
}
|
||||
|
||||
# Function to print colored output
|
||||
print_info() {
|
||||
@@ -35,6 +83,134 @@ print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# ========== Node.js 环境检测 ==========
|
||||
get_node_version() {
|
||||
if command -v node >/dev/null 2>&1; then
|
||||
node --version 2>/dev/null | sed 's/v//'
|
||||
fi
|
||||
}
|
||||
|
||||
get_node_major_version() {
|
||||
local version
|
||||
version=$(get_node_version)
|
||||
if [ -n "$version" ]; then
|
||||
echo "$version" | cut -d. -f1
|
||||
fi
|
||||
}
|
||||
|
||||
install_fnm() {
|
||||
echo ""
|
||||
print_info "正在安装 fnm (Fast Node Manager)..."
|
||||
|
||||
if curl -fsSL https://fnm.vercel.app/install | bash; then
|
||||
# 加载 fnm 环境
|
||||
export PATH="$HOME/.local/share/fnm:$PATH"
|
||||
if [ -f "$HOME/.local/share/fnm/fnm" ]; then
|
||||
eval "$(~/.local/share/fnm/fnm env)"
|
||||
fi
|
||||
|
||||
if command -v fnm >/dev/null 2>&1; then
|
||||
print_success "fnm 安装成功!"
|
||||
return 0
|
||||
else
|
||||
print_warning "fnm 可能已安装,但需要重新打开终端才能生效"
|
||||
print_info "请重新打开终端后再运行此脚本"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
print_error "fnm 安装失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
install_node_with_fnm() {
|
||||
print_info "使用 fnm 安装 Node.js 24.x..."
|
||||
|
||||
if fnm install 24 && fnm use 24 && fnm default 24; then
|
||||
# 刷新 PATH
|
||||
eval "$(fnm env)"
|
||||
|
||||
if command -v node >/dev/null 2>&1; then
|
||||
local version
|
||||
version=$(get_node_version)
|
||||
print_success "Node.js v$version 安装成功!"
|
||||
return 0
|
||||
else
|
||||
print_warning "Node.js 可能已安装,但需要重新打开终端才能生效"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
print_error "Node.js 安装失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_node_environment() {
|
||||
local version major
|
||||
|
||||
version=$(get_node_version)
|
||||
if [ -n "$version" ]; then
|
||||
major=$(get_node_major_version)
|
||||
print_info "检测到 Node.js v$version"
|
||||
|
||||
if [ "$major" -lt 20 ]; then
|
||||
print_warning "Node.js 版本过低 (需要 >= 20.x)"
|
||||
|
||||
read -p "是否使用 fnm 安装 Node.js 24.x? (Y/n): " -r
|
||||
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
||||
print_error "Node.js 版本不满足要求,请手动升级后重试"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! command -v fnm >/dev/null 2>&1; then
|
||||
install_fnm || return 1
|
||||
fi
|
||||
|
||||
install_node_with_fnm || return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_warning "未检测到 Node.js"
|
||||
print_info "将使用 fnm 安装 Node.js 24.x"
|
||||
|
||||
read -p "是否继续? (Y/n): " -r
|
||||
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! command -v fnm >/dev/null 2>&1; then
|
||||
install_fnm || return 1
|
||||
fi
|
||||
|
||||
install_node_with_fnm || return 1
|
||||
}
|
||||
|
||||
install_tool() {
|
||||
ensure_node_environment || return 1
|
||||
|
||||
print_info "使用 npm 安装 $TOOL_NAME..."
|
||||
echo " 执行: npm install -g $TOOL_PACKAGE"
|
||||
|
||||
if npm install -g "$TOOL_PACKAGE"; then
|
||||
if command -v "$TOOL_COMMAND" >/dev/null 2>&1; then
|
||||
print_success "$TOOL_NAME 安装成功!"
|
||||
return 0
|
||||
else
|
||||
print_warning "$TOOL_NAME 可能已安装,但需要重新打开终端才能生效"
|
||||
read -p "是否继续进行配置? (Y/n): " -r
|
||||
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
print_error "安装失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if jq is installed
|
||||
check_jq() {
|
||||
if ! command -v jq &>/dev/null; then
|
||||
@@ -80,6 +256,25 @@ validate_api_key() {
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to extract model count from API response (supports both data[] and models[])
|
||||
get_model_count() {
|
||||
local response_file="$1"
|
||||
local count="0"
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
count=$(jq -r '
|
||||
if (.data | type) == "array" and (.data | length) > 0 then (.data | length)
|
||||
elif (.models | type) == "array" and (.models | length) > 0 then (.models | length)
|
||||
else 0 end
|
||||
' "$response_file" 2>/dev/null || echo "0")
|
||||
else
|
||||
if grep -qE '"(data|models)"[[:space:]]*:[[:space:]]*\[' "$response_file" 2>/dev/null; then
|
||||
count=$(grep -oE '"id"[[:space:]]*:' "$response_file" | wc -l | tr -d ' ')
|
||||
fi
|
||||
fi
|
||||
[ -z "$count" ] && count="0"
|
||||
echo "$count"
|
||||
}
|
||||
|
||||
# Function to test API connection and return working base URL
|
||||
test_api_connection() {
|
||||
local api_key="$1"
|
||||
@@ -106,7 +301,7 @@ test_api_connection() {
|
||||
|
||||
if [ "$response" = "200" ]; then
|
||||
local model_count
|
||||
model_count=$(cat /tmp/claude_test_response | jq -r '.data | length' 2>/dev/null || echo "0")
|
||||
model_count=$(get_model_count /tmp/claude_test_response)
|
||||
if [ "$model_count" -gt "0" ]; then
|
||||
print_success "API connection successful! Found $model_count models at $base_url" >&2
|
||||
rm -f /tmp/claude_test_response
|
||||
@@ -142,13 +337,19 @@ create_settings() {
|
||||
--arg api_key "$api_key" \
|
||||
'{
|
||||
"env": {
|
||||
"ANTHROPIC_BASE_URL": $base_url,
|
||||
"ANTHROPIC_AUTH_TOKEN": $api_key,
|
||||
"DISABLE_TELEMETRY": 1,
|
||||
"DISABLE_ERROR_REPORTING": 1,
|
||||
"API_TIMEOUT_MS": 600000,
|
||||
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1
|
||||
}
|
||||
"ANTHROPIC_BASE_URL": $base_url,
|
||||
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
|
||||
"DISABLE_TELEMETRY": "1",
|
||||
"DISABLE_ERROR_REPORTING": "1",
|
||||
"API_TIMEOUT_MS": "600000"
|
||||
},
|
||||
"permissions": {
|
||||
"allow": [],
|
||||
"deny": []
|
||||
},
|
||||
"model": "opus",
|
||||
"alwaysThinkingEnabled": true
|
||||
}')
|
||||
|
||||
# Validate JSON
|
||||
@@ -169,6 +370,14 @@ create_settings() {
|
||||
}
|
||||
EOF
|
||||
print_success "VSCode Claude config written to: $config_json_path"
|
||||
|
||||
# Write environment variables to shell config
|
||||
local rc_file
|
||||
rc_file=$(get_shell_rc)
|
||||
print_info "Writing environment variables to: $rc_file"
|
||||
write_env_to_shell "ANTHROPIC_BASE_URL" "$base_url"
|
||||
write_env_to_shell "ANTHROPIC_AUTH_TOKEN" "$api_key"
|
||||
print_success "Environment variables written to shell config"
|
||||
}
|
||||
|
||||
# Function to display current settings
|
||||
@@ -257,6 +466,21 @@ EOF
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 检测工具是否已安装
|
||||
if ! command -v "$TOOL_COMMAND" >/dev/null 2>&1; then
|
||||
echo ""
|
||||
print_warning "$TOOL_NAME 未安装"
|
||||
read -p "是否立即安装? (Y/n): " -r
|
||||
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
||||
print_info "已取消"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
install_tool || exit 1
|
||||
else
|
||||
print_success "$TOOL_NAME 已安装"
|
||||
fi
|
||||
|
||||
# Interactive mode if no API key provided
|
||||
if [ -z "$api_key" ]; then
|
||||
print_info "Interactive setup mode"
|
||||
@@ -339,6 +563,9 @@ EOF
|
||||
print_info "Current settings:"
|
||||
cat "$CLAUDE_SETTINGS_FILE" | jq .
|
||||
fi
|
||||
|
||||
echo
|
||||
print_warning "Please restart your terminal or run 'source $(get_shell_rc)' for environment variables to take effect."
|
||||
else
|
||||
print_error "Failed to create Claude Code settings"
|
||||
exit 1
|
||||
|
||||
Reference in New Issue
Block a user