feat(ai-setup): /logout для ai-glm, ai-deepseek, ai-kimi

Новый UserPromptSubmit хук logout-account-hook.sh перехватывает /logout
(провайдер по AI_LAUNCHER) и /logout-glm|/logout-deepseek|/logout-kimi
(явно), удаляет сохранённый ключ провайдера. Для ai-claude /logout
отступает — работает нативный oauth-logout.

- хук: удаляет glm_key/deepseek_key или текущий kimi_keys/<current>.key
  (+.meta) с пересчётом current; exit 2 глушит нативную /logout для
  api-key провайдеров
- 3 скилла logout-{glm,deepseek,kimi} для автокомплита
- ai-setup.sh: секция деплоя 6.7.3 + хук в копирование/регистрацию
  изолированных cfg

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Виталий Никитенко
2026-07-14 10:10:14 +03:00
parent 1bfef33da1
commit c379ee8efc
5 changed files with 123 additions and 4 deletions

View File

@@ -557,6 +557,41 @@ else
warn "Файл $ADD_HOOK_SRC не найден, пропускаю"
fi
# ── 6.7.3. Хук logout-account ───────────────────────────────────
info "Деплою хук logout-account..."
LOGOUT_HOOK_SRC="$SCRIPT_DIR/home-configs/claude/hooks/logout-account-hook.sh"
LOGOUT_HOOK_DST="$HOME/.claude/hooks/logout-account-hook.sh"
mkdir -p "$HOME/.claude/hooks"
if [ -f "$LOGOUT_HOOK_SRC" ]; then
cp "$LOGOUT_HOOK_SRC" "$LOGOUT_HOOK_DST"
chmod +x "$LOGOUT_HOOK_DST"
# Прописываем хук в settings.json (идемпотентно)
python3 - "$HOME/.claude/settings.json" "$LOGOUT_HOOK_DST" <<'PYEOF'
import sys, json, os
settings_path, hook_path = sys.argv[1], sys.argv[2]
data = {}
if os.path.exists(settings_path):
with open(settings_path) as f:
try: data = json.load(f)
except json.JSONDecodeError: pass
data.setdefault("hooks", {}).setdefault("UserPromptSubmit", [{"hooks": []}])
hook_cmd = f'bash "{hook_path}"'
ups = data["hooks"]["UserPromptSubmit"]
already = any(
any(h.get("command", "") == hook_cmd for h in entry.get("hooks", []))
for entry in ups
)
if not already:
ups[0]["hooks"].append({"type": "command", "command": hook_cmd})
with open(settings_path, "w") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
f.write("\n")
PYEOF
success "Хук logout-account установлен"
else
warn "Файл $LOGOUT_HOOK_SRC не найден, пропускаю"
fi
# ── 6.8. Регистрация официального маркетплейса плагинов Claude ──
info "Настраиваю маркетплейс плагинов Claude Code..."
if ! command -v claude &>/dev/null; then
@@ -989,16 +1024,16 @@ PYEOF
# ai-claude использует ~/.claude/hooks напрямую; остальные лаунчеры получают
# свою копию, чтобы /switch-account и /add-account работали изолированно.
mkdir -p "$cfg/hooks"
for hook in switch-account-hook.sh add-account-hook.sh account-email.sh; do
for hook in switch-account-hook.sh add-account-hook.sh logout-account-hook.sh account-email.sh; do
if [ -f "$HOME/.claude/hooks/$hook" ]; then
cp "$HOME/.claude/hooks/$hook" "$cfg/hooks/$hook"
chmod +x "$cfg/hooks/$hook"
fi
done
# Регистрируем UserPromptSubmit хуки в изолированном settings.json
python3 - "$cfg/settings.json" "$cfg/hooks/switch-account-hook.sh" "$cfg/hooks/add-account-hook.sh" <<'PYEOF'
python3 - "$cfg/settings.json" "$cfg/hooks/switch-account-hook.sh" "$cfg/hooks/add-account-hook.sh" "$cfg/hooks/logout-account-hook.sh" <<'PYEOF'
import sys, json, os
settings_path, switch_hook, add_hook = sys.argv[1:4]
settings_path = sys.argv[1]
data = {}
if os.path.exists(settings_path):
try:
@@ -1008,7 +1043,7 @@ if os.path.exists(settings_path):
pass
data.setdefault("hooks", {}).setdefault("UserPromptSubmit", [{"hooks": []}])
ups = data["hooks"]["UserPromptSubmit"]
for hook_path in (switch_hook, add_hook):
for hook_path in sys.argv[2:]:
hook_cmd = f'bash "{hook_path}"'
already = any(
any(h.get("command", "") == hook_cmd for h in entry.get("hooks", []))