From 093fc4c3713acf42b903f0e3e65bc158d14be391 Mon Sep 17 00:00:00 2001 From: giteaMyFirstvdsRoot Date: Tue, 1 Sep 2026 19:23:02 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BE=D0=B1=D0=BD=D0=B0=D1=80=D1=83?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B0=20=D0=BD=D0=B0=20=D0=9C=D0=B0=D0=BA=D0=B5,?= =?UTF-8?q?=20=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=BA=D1=8D=D1=88?= =?UTF-8?q?=D0=B5=D0=B9,=20=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20Sign=20out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.sh | 58 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/setup.sh b/setup.sh index 01832e2..1b24f2d 100644 --- a/setup.sh +++ b/setup.sh @@ -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