182 lines
5.5 KiB
Bash
182 lines
5.5 KiB
Bash
|
|
#!/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 ""
|