| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #!/usr/bin/env bash
- set -euo pipefail
- # Claude-CN Installer (Claude汉化版安装脚本)
- # Usage: curl -fsSL https://raw.githubusercontent.com/go-enols/Claude-CN/main/install.sh | bash
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- CYAN='\033[0;36m'
- BOLD='\033[1m'
- DIM='\033[2m'
- RESET='\033[0m'
- REPO="https://github.com/go-enols/Claude-CN.git"
- INSTALL_DIR="$HOME/claude-cn"
- BUN_MIN_VERSION="1.3.11"
- info() { printf "${CYAN}[*]${RESET} %s\n" "$*"; }
- ok() { printf "${GREEN}[+]${RESET} %s\n" "$*"; }
- warn() { printf "${YELLOW}[!]${RESET} %s\n" "$*"; }
- fail() { printf "${RED}[x]${RESET} %s\n" "$*"; exit 1; }
- header() {
- echo ""
- printf "${BOLD}${CYAN}"
- cat << 'ART'
- ___ _
- / _|_ __ ___ ___ ___ __| | ___
- | |_| '__/ _ \/ _ \_____ / __/ _` |/ _ \
- | _| | | __/ __/_____| (_| (_| | __/
- |_| |_| \___|\___| \___\__,_|\___|
- ART
- printf "${RESET}"
- printf "${DIM} Claude Code 汉化中文版本${RESET}\n"
- echo ""
- }
- # -------------------------------------------------------------------
- # System checks
- # -------------------------------------------------------------------
- check_os() {
- case "$(uname -s)" in
- Darwin) OS="macos" ;;
- Linux) OS="linux" ;;
- *) fail "Unsupported OS: $(uname -s). macOS or Linux required." ;;
- esac
- ok "OS: $(uname -s) $(uname -m)"
- }
- check_git() {
- if ! command -v git &>/dev/null; then
- fail "git is not installed. Install it first:
- macOS: xcode-select --install
- Linux: sudo apt install git (or your distro's equivalent)"
- fi
- ok "git: $(git --version | head -1)"
- }
- # Compare semver: returns 0 if $1 >= $2
- version_gte() {
- [ "$(printf '%s\n' "$1" "$2" | sort -V | head -1)" = "$2" ]
- }
- check_bun() {
- if command -v bun &>/dev/null; then
- local ver
- ver="$(bun --version 2>/dev/null || echo "0.0.0")"
- if version_gte "$ver" "$BUN_MIN_VERSION"; then
- ok "bun: v${ver}"
- return
- fi
- warn "bun v${ver} found but v${BUN_MIN_VERSION}+ required. Upgrading..."
- else
- info "bun not found. Installing..."
- fi
- install_bun
- }
- install_bun() {
- curl -fsSL https://bun.sh/install | bash
- # Source the updated profile so bun is on PATH for this session
- export BUN_INSTALL="${BUN_INSTALL:-$HOME/.bun}"
- export PATH="$BUN_INSTALL/bin:$PATH"
- if ! command -v bun &>/dev/null; then
- fail "bun installation succeeded but binary not found on PATH.
- Add this to your shell profile and restart:
- export PATH=\"\$HOME/.bun/bin:\$PATH\""
- fi
- ok "bun: v$(bun --version) (just installed)"
- }
- # -------------------------------------------------------------------
- # Clone & build
- # -------------------------------------------------------------------
- clone_repo() {
- if [ -d "$INSTALL_DIR" ]; then
- warn "$INSTALL_DIR already exists"
- if [ -d "$INSTALL_DIR/.git" ]; then
- info "Pulling latest changes..."
- git -C "$INSTALL_DIR" pull --ff-only origin main 2>/dev/null || {
- warn "Pull failed, continuing with existing copy"
- }
- fi
- else
- info "Cloning repository..."
- git clone --depth 1 "$REPO" "$INSTALL_DIR"
- fi
- ok "Source: $INSTALL_DIR"
- }
- install_deps() {
- info "Installing dependencies..."
- cd "$INSTALL_DIR"
- bun install --frozen-lockfile 2>/dev/null || bun install
- ok "Dependencies installed"
- }
- build_binary() {
- info "正在构建 Claude-CN (启用所有实验性功能)..."
- cd "$INSTALL_DIR"
- bun run build:dev:full
- ok "构建完成: $INSTALL_DIR/cli-dev"
- }
- link_binary() {
- local link_dir="$HOME/.local/bin"
- mkdir -p "$link_dir"
- ln -sf "$INSTALL_DIR/cli-dev" "$link_dir/claude-cn"
- ok "Symlinked: $link_dir/claude-cn"
- if ! echo "$PATH" | tr ':' '\n' | grep -qx "$link_dir"; then
- warn "$link_dir is not on your PATH"
- echo ""
- printf "${YELLOW} Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):${RESET}\n"
- printf "${BOLD} export PATH=\"\$HOME/.local/bin:\$PATH\"${RESET}\n"
- echo ""
- fi
- }
- # -------------------------------------------------------------------
- # Main
- # -------------------------------------------------------------------
- header
- info "Starting installation..."
- echo ""
- check_os
- check_git
- check_bun
- echo ""
- clone_repo
- install_deps
- build_binary
- link_binary
- echo ""
- printf "${GREEN}${BOLD} 安装完成!${RESET}\n"
- echo ""
- printf " ${BOLD}运行方式:${RESET}\n"
- printf " ${CYAN}claude-cn${RESET} # 交互式REPL模式\n"
- printf " ${CYAN}claude-cn -p \"你的提示词\"${RESET} # 单次执行模式\n"
- echo ""
- printf " ${BOLD}设置API密钥:${RESET}\n"
- printf " ${CYAN}export ANTHROPIC_API_KEY=\"sk-ant-...\"${RESET}\n"
- echo ""
- printf " ${BOLD}或使用Claude.ai OAuth登录:${RESET}\n"
- printf " ${CYAN}claude-cn /login${RESET}\n"
- echo ""
- printf " ${DIM}源码目录: $INSTALL_DIR${RESET}\n"
- printf " ${DIM}二进制文件: $INSTALL_DIR/cli-dev${RESET}\n"
- printf " ${DIM}快捷命令: ~/.local/bin/claude-cn${RESET}\n"
- echo ""
|