fix: обнаружение процесса на Маке, чистка кэшей, откат через Sign out

This commit is contained in:
2026-09-01 19:23:02 +00:00
parent 5b78aa9c0e
commit 093fc4c371
+48 -10
View File
@@ -181,6 +181,39 @@ print("ДА: %s" % name if cfg.get("inferenceProvider") else "НЕТ: приме
PY
}
# ---------- Чистка кэшей ----------
# Повторяет пункт меню Developer -> Clear Cache and Restart. В коде приложения он
# чистит ТОЛЬКО кэши: HTTP, скомпилированный JS, шейдеры, service workers, DNS.
# Ни cookies, ни Local Storage там нет, поэтому вход в аккаунт, чаты, MCP,
# скиллы и наши конфиги остаются на месте. Делать это можно лишь при закрытом
# приложении, иначе файлы заняты.
# ВАЖНО: не путать с соседним пунктом Reset App Data, тот сносит папку целиком.
clear_caches() {
local d
for d in "$C1P" "$C3P"; do
[ -d "$d" ] || continue
rm -rf "$d/Cache" "$d/Code Cache" "$d/GPUCache" \
"$d/DawnGraphiteCache" "$d/DawnWebGPUCache" "$d/Service Worker" 2>/dev/null || true
done
ok "Кэши очищены (чаты, входы и конфиги не тронуты)."
}
# ---------- Обнаружение приложения (Мак) ----------
# pgrep тут ненадёжен: под песочницей он не видит процесс, хотя тот живой.
# Единственный путь приложения, который нам нужен, это главный бинарь в
# /Applications. Рядом крутится встроенный агент по похожему пути внутри
# папки данных, и его трогать нельзя, поэтому сравниваем строго целиком.
CLAUDE_BIN="/Applications/Claude.app/Contents/MacOS/Claude"
claude_pids() { ps -Ao pid=,comm= | awk -v b="$CLAUDE_BIN" '$2==b {print $1}'; }
claude_running() {
case "$(osascript -e 'application "Claude" is running' 2>/dev/null)" in
true) return 0 ;;
esac
[ -n "$(claude_pids)" ]
}
# ---------- Честный перезапуск ----------
# open -a на живом процессе только активирует окно: приложение не завершается
# при закрытии окна и настройки перечитывает лишь при настоящем старте.
@@ -188,31 +221,34 @@ restart_claude() {
if [ "$NO_RESTART" = "true" ]; then warn "Перезапуск пропущен (--no-restart). Настройки применятся после Cmd+Q и запуска."; return 0; fi
say "Перезапускаю приложение Claude..."
if [ "$OS" = "mac" ]; then
if pgrep -x "Claude" >/dev/null 2>&1; then
if claude_running; then
osascript -e 'tell application "Claude" to quit' >/dev/null 2>&1 || true
i=0; while pgrep -x "Claude" >/dev/null 2>&1 && [ "$i" -lt 12 ]; do sleep 1; i=$((i+1)); done
if pgrep -x "Claude" >/dev/null 2>&1; then
pkill -x "Claude" >/dev/null 2>&1 || true
sleep 2
i=0; while claude_running && [ "$i" -lt 12 ]; do sleep 1; i=$((i+1)); done
if claude_running; then
for pid in $(claude_pids); do kill "$pid" 2>/dev/null || true; done
sleep 3
fi
if pgrep -x "Claude" >/dev/null 2>&1; then
if claude_running; then
warn "Claude не закрылся сам (обычно это запрет на автоматизацию:"
echo " Системные настройки -> Конфиденциальность и безопасность -> Автоматизация)."
echo " Конфиги уже на месте. Закрой Claude вручную через Cmd+Q и открой заново."
return 0
fi
fi
clear_caches
open -a "Claude" >/dev/null 2>&1 || { warn "Не смог открыть Claude, открой вручную."; return 0; }
# Проверяем, что процесс реально поднялся: рапортовать успех вслепую нельзя.
j=0; while ! pgrep -x "Claude" >/dev/null 2>&1 && [ "$j" -lt 8 ]; do sleep 1; j=$((j+1)); done
if ! pgrep -x "Claude" >/dev/null 2>&1; then
j=0; while ! claude_running && [ "$j" -lt 10 ]; do sleep 1; j=$((j+1)); done
if ! claude_running; then
warn "Claude не поднялся автоматически. Конфиги на месте, открой приложение вручную."
return 0
fi
else
powershell.exe -NoProfile -Command '
Get-Process -Name "Claude*" -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep 3
Start-Sleep 3' 2>/dev/null || true
clear_caches
powershell.exe -NoProfile -Command '
$exe=@("$env:LOCALAPPDATA\AnthropicClaude","$env:LOCALAPPDATA\Programs") | ForEach-Object { Get-ChildItem $_ -Recurse -Filter "claude.exe" -ErrorAction SilentlyContinue } | Select-Object -First 1
if($exe){ Start-Process $exe.FullName } else { exit 1 }
' || { warn "Не смог перезапустить Claude, закрой и открой его вручную."; return 0; }
@@ -252,7 +288,9 @@ if [ "$MODE" = "restore" ]; then
say "Откат на родного Claude..."
if [ ! -f "$LIB/_meta.json" ]; then ok "Конфигов нет, откатывать нечего."; exit 0; fi
merge_meta default none
ok "Применён пустой конфиг Default: приложение вернётся к родному входу."
ok "Применён пустой профиль Default."
echo " Если приложение всё равно открывается на чужом мозге: меню аккаунта внизу слева -> Sign out,"
echo " затем на экране входа выбери обычный вход по почте или Google."
write_dev_flag
restart_claude
echo