#!/bin/bash # ============================================================ # Bookworm Portable - macOS 卸载脚本 # 对标 Windows 版 stop.ps1 + 卸载Bookworm.bat # # 用法: # bash uninstall-mac.sh # 基础清理 (保留配置) # bash uninstall-mac.sh --restore # 完整恢复 (删除 Bookworm) # bash uninstall-mac.sh --deep # 深度清理 (含历史+凭证) # ============================================================ set -e # 颜色 RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'; BOLD='\033[1m' # 路径 CLAUDE_DIR="$HOME/.claude" BACKUP_DIR="$HOME/.claude.bw-backup" BOOT_DIR="$HOME/bookworm-boot" # 参数解析 RESTORE=false DEEP=false for arg in "$@"; do case "$arg" in --restore) RESTORE=true ;; --deep) DEEP=true ;; esac done info() { echo -e " ${BLUE}[INFO]${NC} $1"; } success() { echo -e " ${GREEN}[OK]${NC} $1"; } warn() { echo -e " ${YELLOW}[!]${NC} $1"; } fail() { echo -e " ${RED}[!!]${NC} $1"; } echo "" echo -e "${CYAN} Bookworm Portable - macOS 卸载${NC}" echo -e "${CYAN} ================================${NC}" echo "" if $RESTORE || $DEEP; then echo -e " 将执行:" echo -e " - 终止 Claude Code 进程" echo -e " - 清除环境变量" $RESTORE && echo -e " - 删除 ~/.claude 配置目录" $RESTORE && echo -e " - 恢复原始 .claude 备份 (如有)" $DEEP && echo -e " - 清除 shell 历史敏感条目" $DEEP && echo -e " - 清除 Git 凭证 (Keychain)" $DEEP && echo -e " - 清除终端别名" echo "" read -p " 确认卸载? (y/n): " CONFIRM if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then echo " 已取消" exit 0 fi fi echo "" # ─── 1/5: 终止 Claude Code 进程 ─── echo -e "${BOLD} [1/5]${NC} 终止 Claude Code 进程..." CLAUDE_PIDS=$(pgrep -f "claude" 2>/dev/null || true) if [ -n "$CLAUDE_PIDS" ]; then kill $CLAUDE_PIDS 2>/dev/null || true sleep 2 # 强制终止残留 kill -9 $CLAUDE_PIDS 2>/dev/null || true success "进程已终止" else info "无 Claude Code 进程运行" fi # 清理残留 node hook 进程 NODE_HOOK_PIDS=$(pgrep -f "\.claude/hooks" 2>/dev/null || true) if [ -n "$NODE_HOOK_PIDS" ]; then kill $NODE_HOOK_PIDS 2>/dev/null || true info "Hook 子进程已清理" fi # ─── 2/5: 清除环境变量 ─── echo -e "${BOLD} [2/5]${NC} 清除环境变量..." ENV_VARS=( CLAUDE_HOME CLAUDE_ROOT ANTHROPIC_API_KEY ANTHROPIC_BASE_URL SUPABASE_ACCESS_TOKEN GITHUB_PERSONAL_ACCESS_TOKEN SLACK_BOT_TOKEN ATLASSIAN_API_TOKEN BROWSERBASE_API_KEY FIRECRAWL_API_KEY ) CLEARED=0 for v in "${ENV_VARS[@]}"; do if [ -n "${!v}" ]; then unset "$v" CLEARED=$((CLEARED + 1)) fi done success "已清除 $CLEARED 个环境变量" # ─── 3/5: Git 凭证清除 ─── echo -e "${BOLD} [3/5]${NC} 清除 Git 凭证缓存..." # macOS Keychain 凭证 for host in code.letcareme.com 8.138.11.105; do security delete-internet-password -s "$host" 2>/dev/null && info "Keychain: $host 已清除" || true # git credential reject printf "protocol=https\nhost=%s\n\n" "$host" | git credential reject 2>/dev/null || true done success "Git 凭证已清除" # ─── 4/5: 恢复/删除 .claude 目录 ─── if $RESTORE; then echo -e "${BOLD} [4/5]${NC} 恢复原始 .claude 目录..." if [ -d "$CLAUDE_DIR" ]; then rm -rf "$CLAUDE_DIR" info "已删除 Bookworm 配置" fi if [ -d "$BACKUP_DIR" ]; then mv "$BACKUP_DIR" "$CLAUDE_DIR" success "原始 .claude 已恢复" else warn "无备份可恢复 (.claude.bw-backup 不存在)" fi # 删除 boot 仓库 if [ -d "$BOOT_DIR" ]; then rm -rf "$BOOT_DIR" info "已删除 ~/bookworm-boot" fi else echo -e "${BOLD} [4/5]${NC} 保留 Bookworm 配置 (使用 --restore 可恢复原始)" fi # ─── 5/5: 深度清理 ─── if $DEEP; then echo -e "${BOLD} [5/5]${NC} 深度清理..." # 清除 shell 历史中的敏感条目 for histfile in "$HOME/.zsh_history" "$HOME/.bash_history"; do if [ -f "$histfile" ]; then BEFORE=$(wc -l < "$histfile") grep -v -i -E 'secrets\.enc|ANTHROPIC_API_KEY|api[_-]?key|bookworm-portable|主密码' "$histfile" > "${histfile}.tmp" 2>/dev/null || true mv "${histfile}.tmp" "$histfile" 2>/dev/null || true AFTER=$(wc -l < "$histfile") info "$(basename $histfile): 清理 $((BEFORE - AFTER)) 条敏感记录" fi done # 清除终端别名 for rcfile in "$HOME/.zshrc" "$HOME/.bashrc"; do if [ -f "$rcfile" ] && grep -q "Bookworm Portable aliases" "$rcfile" 2>/dev/null; then # 删除别名块 (标记行 + 后续 alias 行) sed -i '' '/# Bookworm Portable aliases/,/^$/d' "$rcfile" 2>/dev/null || true info "$(basename $rcfile): 别名已清除" fi done # 清除 macOS Keychain 中的 Bookworm 凭证 security delete-generic-password -s "bookworm-secrets" 2>/dev/null && info "Keychain: bookworm-secrets 已清除" || true success "深度清理完成" else echo -e "${BOLD} [5/5]${NC} 跳过深度清理 (使用 --deep 可清理历史+凭证)" fi # ─── 完成 ─── echo "" echo -e "${GREEN} ================================${NC}" if $RESTORE; then echo -e "${GREEN} Bookworm 已完全卸载${NC}" echo -e "${GREEN} 可安全删除 bookworm-boot 文件夹${NC}" else echo -e "${GREEN} Bookworm 已清理完毕${NC}" echo -e "${GREEN} 配置保留,可重新启动${NC}" fi echo -e "${GREEN} ================================${NC}" echo ""