install.sh 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. # Claude-CN Installer (Claude汉化版安装脚本)
  4. # Usage: curl -fsSL https://raw.githubusercontent.com/go-enols/Claude-CN/main/install.sh | bash
  5. RED='\033[0;31m'
  6. GREEN='\033[0;32m'
  7. YELLOW='\033[1;33m'
  8. CYAN='\033[0;36m'
  9. BOLD='\033[1m'
  10. DIM='\033[2m'
  11. RESET='\033[0m'
  12. REPO="https://github.com/go-enols/Claude-CN.git"
  13. INSTALL_DIR="$HOME/claude-cn"
  14. BUN_MIN_VERSION="1.3.11"
  15. info() { printf "${CYAN}[*]${RESET} %s\n" "$*"; }
  16. ok() { printf "${GREEN}[+]${RESET} %s\n" "$*"; }
  17. warn() { printf "${YELLOW}[!]${RESET} %s\n" "$*"; }
  18. fail() { printf "${RED}[x]${RESET} %s\n" "$*"; exit 1; }
  19. header() {
  20. echo ""
  21. printf "${BOLD}${CYAN}"
  22. cat << 'ART'
  23. ___ _
  24. / _|_ __ ___ ___ ___ __| | ___
  25. | |_| '__/ _ \/ _ \_____ / __/ _` |/ _ \
  26. | _| | | __/ __/_____| (_| (_| | __/
  27. |_| |_| \___|\___| \___\__,_|\___|
  28. ART
  29. printf "${RESET}"
  30. printf "${DIM} Claude Code 汉化中文版本${RESET}\n"
  31. echo ""
  32. }
  33. # -------------------------------------------------------------------
  34. # System checks
  35. # -------------------------------------------------------------------
  36. check_os() {
  37. case "$(uname -s)" in
  38. Darwin) OS="macos" ;;
  39. Linux) OS="linux" ;;
  40. *) fail "Unsupported OS: $(uname -s). macOS or Linux required." ;;
  41. esac
  42. ok "OS: $(uname -s) $(uname -m)"
  43. }
  44. check_git() {
  45. if ! command -v git &>/dev/null; then
  46. fail "git is not installed. Install it first:
  47. macOS: xcode-select --install
  48. Linux: sudo apt install git (or your distro's equivalent)"
  49. fi
  50. ok "git: $(git --version | head -1)"
  51. }
  52. # Compare semver: returns 0 if $1 >= $2
  53. version_gte() {
  54. [ "$(printf '%s\n' "$1" "$2" | sort -V | head -1)" = "$2" ]
  55. }
  56. check_bun() {
  57. if command -v bun &>/dev/null; then
  58. local ver
  59. ver="$(bun --version 2>/dev/null || echo "0.0.0")"
  60. if version_gte "$ver" "$BUN_MIN_VERSION"; then
  61. ok "bun: v${ver}"
  62. return
  63. fi
  64. warn "bun v${ver} found but v${BUN_MIN_VERSION}+ required. Upgrading..."
  65. else
  66. info "bun not found. Installing..."
  67. fi
  68. install_bun
  69. }
  70. install_bun() {
  71. curl -fsSL https://bun.sh/install | bash
  72. # Source the updated profile so bun is on PATH for this session
  73. export BUN_INSTALL="${BUN_INSTALL:-$HOME/.bun}"
  74. export PATH="$BUN_INSTALL/bin:$PATH"
  75. if ! command -v bun &>/dev/null; then
  76. fail "bun installation succeeded but binary not found on PATH.
  77. Add this to your shell profile and restart:
  78. export PATH=\"\$HOME/.bun/bin:\$PATH\""
  79. fi
  80. ok "bun: v$(bun --version) (just installed)"
  81. }
  82. # -------------------------------------------------------------------
  83. # Clone & build
  84. # -------------------------------------------------------------------
  85. clone_repo() {
  86. if [ -d "$INSTALL_DIR" ]; then
  87. warn "$INSTALL_DIR already exists"
  88. if [ -d "$INSTALL_DIR/.git" ]; then
  89. info "Pulling latest changes..."
  90. git -C "$INSTALL_DIR" pull --ff-only origin main 2>/dev/null || {
  91. warn "Pull failed, continuing with existing copy"
  92. }
  93. fi
  94. else
  95. info "Cloning repository..."
  96. git clone --depth 1 "$REPO" "$INSTALL_DIR"
  97. fi
  98. ok "Source: $INSTALL_DIR"
  99. }
  100. install_deps() {
  101. info "Installing dependencies..."
  102. cd "$INSTALL_DIR"
  103. bun install --frozen-lockfile 2>/dev/null || bun install
  104. ok "Dependencies installed"
  105. }
  106. build_binary() {
  107. info "正在构建 Claude-CN (启用所有实验性功能)..."
  108. cd "$INSTALL_DIR"
  109. bun run build:dev:full
  110. ok "构建完成: $INSTALL_DIR/cli-dev"
  111. }
  112. link_binary() {
  113. local link_dir="$HOME/.local/bin"
  114. mkdir -p "$link_dir"
  115. ln -sf "$INSTALL_DIR/cli-dev" "$link_dir/claude-cn"
  116. ok "Symlinked: $link_dir/claude-cn"
  117. if ! echo "$PATH" | tr ':' '\n' | grep -qx "$link_dir"; then
  118. warn "$link_dir is not on your PATH"
  119. echo ""
  120. printf "${YELLOW} Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):${RESET}\n"
  121. printf "${BOLD} export PATH=\"\$HOME/.local/bin:\$PATH\"${RESET}\n"
  122. echo ""
  123. fi
  124. }
  125. # -------------------------------------------------------------------
  126. # Main
  127. # -------------------------------------------------------------------
  128. header
  129. info "Starting installation..."
  130. echo ""
  131. check_os
  132. check_git
  133. check_bun
  134. echo ""
  135. clone_repo
  136. install_deps
  137. build_binary
  138. link_binary
  139. echo ""
  140. printf "${GREEN}${BOLD} 安装完成!${RESET}\n"
  141. echo ""
  142. printf " ${BOLD}运行方式:${RESET}\n"
  143. printf " ${CYAN}claude-cn${RESET} # 交互式REPL模式\n"
  144. printf " ${CYAN}claude-cn -p \"你的提示词\"${RESET} # 单次执行模式\n"
  145. echo ""
  146. printf " ${BOLD}设置API密钥:${RESET}\n"
  147. printf " ${CYAN}export ANTHROPIC_API_KEY=\"sk-ant-...\"${RESET}\n"
  148. echo ""
  149. printf " ${BOLD}或使用Claude.ai OAuth登录:${RESET}\n"
  150. printf " ${CYAN}claude-cn /login${RESET}\n"
  151. echo ""
  152. printf " ${DIM}源码目录: $INSTALL_DIR${RESET}\n"
  153. printf " ${DIM}二进制文件: $INSTALL_DIR/cli-dev${RESET}\n"
  154. printf " ${DIM}快捷命令: ~/.local/bin/claude-cn${RESET}\n"
  155. echo ""