bookworm-boot/uninstall-mac.sh

182 lines
5.5 KiB
Bash
Raw Normal View History

#!/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 ""