152 lines
5.8 KiB
PowerShell
152 lines
5.8 KiB
PowerShell
|
|
<#
|
|||
|
|
.SYNOPSIS
|
|||
|
|
Bookworm Portable - 清理/卸载脚本
|
|||
|
|
.DESCRIPTION
|
|||
|
|
清除环境变量, 恢复原始 .claude 目录, 清理痕迹.
|
|||
|
|
.USAGE
|
|||
|
|
.\stop.ps1 # 标准清理 (保留 Bookworm 配置)
|
|||
|
|
.\stop.ps1 -Restore # 完整恢复 (删除 Bookworm, 恢复备份)
|
|||
|
|
.\stop.ps1 -Deep # 深度清理 (含 PS 历史)
|
|||
|
|
#>
|
|||
|
|
|
|||
|
|
param(
|
|||
|
|
[switch]$Restore,
|
|||
|
|
[switch]$Deep
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
$ClaudeTarget = Join-Path $env:USERPROFILE ".claude"
|
|||
|
|
$BackupPath = Join-Path $env:USERPROFILE ".claude.bw-backup"
|
|||
|
|
|
|||
|
|
Write-Host ""
|
|||
|
|
Write-Host " Bookworm Portable - 清理" -ForegroundColor Cyan
|
|||
|
|
Write-Host " ========================" -ForegroundColor Cyan
|
|||
|
|
Write-Host ""
|
|||
|
|
|
|||
|
|
# 1. 终止 Claude Code 及 Node.js 子进程
|
|||
|
|
$claudeProcs = Get-Process -ErrorAction SilentlyContinue | Where-Object { $_.ProcessName -in @("claude", "claude-code") }
|
|||
|
|
if ($claudeProcs) {
|
|||
|
|
Write-Host "[1/5] 终止 Claude Code 进程..." -ForegroundColor Yellow
|
|||
|
|
$claudeProcs | Stop-Process -Force
|
|||
|
|
Start-Sleep -Seconds 3
|
|||
|
|
# 清理残留 node 子进程 (hooks)
|
|||
|
|
Get-Process node -ErrorAction SilentlyContinue | Where-Object {
|
|||
|
|
$_.CommandLine -match '\.claude[\\/]hooks'
|
|||
|
|
} | Stop-Process -Force -ErrorAction SilentlyContinue
|
|||
|
|
Write-Host " [OK] 进程已终止" -ForegroundColor Green
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
Write-Host "[1/5] 无 Claude Code 进程运行" -ForegroundColor Gray
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 2. 清除进程级环境变量
|
|||
|
|
Write-Host "[2/5] 清除环境变量..." -ForegroundColor White
|
|||
|
|
$envVars = @(
|
|||
|
|
"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"
|
|||
|
|
)
|
|||
|
|
foreach ($v in $envVars) {
|
|||
|
|
if ([System.Environment]::GetEnvironmentVariable($v, "Process")) {
|
|||
|
|
[System.Environment]::SetEnvironmentVariable($v, $null, "Process")
|
|||
|
|
Write-Host " 清除: $v" -ForegroundColor Gray
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Write-Host " [OK] 环境变量已清除" -ForegroundColor Green
|
|||
|
|
|
|||
|
|
# 3. 清除凭证缓存 (Credential Manager + 注册表)
|
|||
|
|
Write-Host "[3/5] 清除凭证缓存..." -ForegroundColor White
|
|||
|
|
cmdkey /delete:bookworm-secrets 2>$null | Out-Null
|
|||
|
|
Remove-Item "HKCU:\Software\Bookworm" -Recurse -Force -ErrorAction SilentlyContinue
|
|||
|
|
Write-Host " 清除: Bookworm 本日免密缓存" -ForegroundColor Gray
|
|||
|
|
|
|||
|
|
# 4. 清除 Git 凭证缓存
|
|||
|
|
Write-Host "[4/5] 清除 Git 凭证缓存..." -ForegroundColor White
|
|||
|
|
$gitCredTargets = @("git:https://code.letcareme.com", "git:http://8.138.11.105", "git:https://8.138.11.105")
|
|||
|
|
foreach ($target in $gitCredTargets) {
|
|||
|
|
$exists = cmdkey /list 2>$null | Select-String $target
|
|||
|
|
if ($exists) {
|
|||
|
|
cmdkey /delete:$target 2>$null
|
|||
|
|
Write-Host " 清除: $target" -ForegroundColor Gray
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
# 通过 git credential reject 清除缓存
|
|||
|
|
@("code.letcareme.com", "8.138.11.105") | ForEach-Object {
|
|||
|
|
@"
|
|||
|
|
protocol=https
|
|||
|
|
host=$_
|
|||
|
|
"@ | git credential reject 2>$null
|
|||
|
|
}
|
|||
|
|
Write-Host " [OK] Git 凭证已清除" -ForegroundColor Green
|
|||
|
|
|
|||
|
|
# 4. 恢复备份 (如果请求)
|
|||
|
|
if ($Restore) {
|
|||
|
|
Write-Host "[4/5] 恢复原始 .claude 目录..." -ForegroundColor White
|
|||
|
|
if (Test-Path $BackupPath) {
|
|||
|
|
if (Test-Path $ClaudeTarget) {
|
|||
|
|
$retries = 3
|
|||
|
|
while ($retries -gt 0) {
|
|||
|
|
try {
|
|||
|
|
Remove-Item $ClaudeTarget -Recurse -Force -ErrorAction Stop
|
|||
|
|
break
|
|||
|
|
} catch {
|
|||
|
|
$retries--
|
|||
|
|
if ($retries -gt 0) {
|
|||
|
|
Write-Host " 文件占用,等待重试... ($retries)" -ForegroundColor Yellow
|
|||
|
|
Start-Sleep 3
|
|||
|
|
} else {
|
|||
|
|
Write-Host " [ERROR] 无法删除 .claude,可能有文件被占用" -ForegroundColor Red
|
|||
|
|
Write-Host " 请关闭所有 Node.js/Claude 进程后重试" -ForegroundColor Yellow
|
|||
|
|
exit 1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Write-Host " 已删除 Bookworm 配置" -ForegroundColor Gray
|
|||
|
|
}
|
|||
|
|
Rename-Item $BackupPath $ClaudeTarget
|
|||
|
|
Write-Host " [OK] 原始 .claude 已恢复" -ForegroundColor Green
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
Write-Host " [!] 无备份可恢复 (.claude.bw-backup 不存在)" -ForegroundColor Yellow
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
Write-Host "[4/5] 保留 Bookworm 配置 (使用 -Restore 可恢复原始)" -ForegroundColor Gray
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 5. 深度清理 (可选)
|
|||
|
|
if ($Deep) {
|
|||
|
|
Write-Host "[5/5] 深度清理..." -ForegroundColor White
|
|||
|
|
|
|||
|
|
# 清除 PowerShell 历史
|
|||
|
|
$histFile = Join-Path $env:APPDATA "Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt"
|
|||
|
|
if (Test-Path $histFile) {
|
|||
|
|
# 仅删除含 bookworm/secrets/api_key 的行
|
|||
|
|
$lines = Get-Content $histFile
|
|||
|
|
$cleaned = $lines | Where-Object {
|
|||
|
|
$_ -notmatch 'secrets\.enc|ANTHROPIC_API_KEY|api[_-]?key|bookworm-portable'
|
|||
|
|
}
|
|||
|
|
Set-Content $histFile -Value $cleaned
|
|||
|
|
Write-Host " [OK] PS 历史已清理敏感条目" -ForegroundColor Green
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 清除 Claude Code 本地缓存
|
|||
|
|
$cacheDir = Join-Path $env:LOCALAPPDATA "claude-code"
|
|||
|
|
if (Test-Path $cacheDir) {
|
|||
|
|
Write-Host " 发现本地缓存: $cacheDir" -ForegroundColor Yellow
|
|||
|
|
Write-Host " (手动决定是否删除)" -ForegroundColor Yellow
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Write-Host " [OK] 深度清理完成" -ForegroundColor Green
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
Write-Host "[5/5] 跳过深度清理 (使用 -Deep 可清理 PS 历史)" -ForegroundColor Gray
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Write-Host ""
|
|||
|
|
Write-Host " ╔══════════════════════════════════════════╗" -ForegroundColor Green
|
|||
|
|
Write-Host " ║ Bookworm 已清理完毕 ║" -ForegroundColor Green
|
|||
|
|
Write-Host " ╚══════════════════════════════════════════╝" -ForegroundColor Green
|
|||
|
|
Write-Host ""
|