fix: обнаружение процесса на Маке, чистка кэшей, откат через Sign out
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user