diff --git a/home-configs/claude/hooks/switch-account-hook.sh b/home-configs/claude/hooks/switch-account-hook.sh index 8895f74..6c065ee 100755 --- a/home-configs/claude/hooks/switch-account-hook.sh +++ b/home-configs/claude/hooks/switch-account-hook.sh @@ -20,11 +20,8 @@ mapfile -t accounts < <(ls "$ACCOUNTS_DIR"/*.credentials.json 2>/dev/null \ | xargs -I{} basename {} .credentials.json | sort) if [ ${#accounts[@]} -eq 0 ]; then - jq -n '{ - "decision": "block", - "reason": "Аккаунты не настроены. Создай ~/.claude/accounts/.credentials.json для каждого аккаунта и запиши текущий в ~/.claude/accounts/current" - }' - exit 0 + echo "Аккаунты не настроены. Создай ~/.claude/accounts/.credentials.json для каждого аккаунта." >&2 + exit 2 fi current=$(cat "$CURRENT_FILE" 2>/dev/null || echo "") @@ -41,8 +38,5 @@ cp "$ACCOUNTS_DIR/${next}.credentials.json" "$CREDS" chmod 600 "$CREDS" echo "$next" > "$CURRENT_FILE" -total=${#accounts[@]} -msg="Аккаунт: ${current:-?} -> ${next} (${total} аккаунтов)" - -jq -n --arg msg "$msg" '{"decision": "block", "reason": $msg}' -exit 0 +echo "Аккаунт: ${current:-?} -> ${next} (всего: ${#accounts[@]})" >&2 +exit 2 diff --git a/home-configs/claude/skills/switch-account/SKILL.md b/home-configs/claude/skills/switch-account/SKILL.md index 76804be..6092930 100644 --- a/home-configs/claude/skills/switch-account/SKILL.md +++ b/home-configs/claude/skills/switch-account/SKILL.md @@ -1,73 +1,4 @@ --- name: switch-account -description: Use when user types /switch-account - switches to the next saved Claude.ai OAuth account in rotation +description: Switch to next Claude.ai account (handled by UserPromptSubmit hook, no LLM needed) --- - -# Switch Account - -Переключает между сохранёнными Claude.ai OAuth аккаунтами по кругу. - -## Действия - -Выполни эту Bash-команду и интерпретируй вывод: - -```bash -python3 << 'EOF' -import os, json, glob, shutil, sys - -accounts_dir = os.path.expanduser("~/.claude/accounts") -creds_path = os.path.expanduser("~/.claude/.credentials.json") -current_file = os.path.join(accounts_dir, "current") - -os.makedirs(accounts_dir, exist_ok=True) - -files = sorted(glob.glob(os.path.join(accounts_dir, "*.credentials.json"))) -accounts = [os.path.basename(f).replace(".credentials.json", "") for f in files] - -if not accounts: - print("NO_ACCOUNTS") - sys.exit(0) - -current = open(current_file).read().strip() if os.path.exists(current_file) else "" - -try: - idx = accounts.index(current) - next_idx = (idx + 1) % len(accounts) -except ValueError: - next_idx = 0 - -next_account = accounts[next_idx] -shutil.copy(os.path.join(accounts_dir, f"{next_account}.credentials.json"), creds_path) -os.chmod(creds_path, 0o600) -open(current_file, "w").write(next_account) - -print(f"SWITCHED:{current}->{next_account}:{len(accounts)}") -EOF -``` - -Интерпретируй вывод: -- `NO_ACCOUNTS` -> скажи пользователю что аккаунты не настроены и покажи инструкцию из раздела Setup ниже -- `SWITCHED:old->new:N` -> сообщи коротко: "Переключено: **old** -> **new** (всего аккаунтов: N). Статусная строка обновится при следующем запросе." - -## Setup - как добавить аккаунты (если NO_ACCOUNTS) - -Показывай эту инструкцию пользователю дословно: - -```bash -mkdir -p ~/.claude/accounts - -# 1. Сохрани текущий залогиненный аккаунт (дай ему имя, например "personal"): -cp ~/.claude/.credentials.json ~/.claude/accounts/personal.credentials.json -echo personal > ~/.claude/accounts/current - -# 2. Залогинься во второй аккаунт в отдельном терминале (НЕ в Claude Code): -# claude auth login -# cp ~/.claude/.credentials.json ~/.claude/accounts/work.credentials.json - -# 3. Восстанови первый как активный: -# cp ~/.claude/accounts/personal.credentials.json ~/.claude/.credentials.json - -# Теперь /switch-account будет переключать между personal и work. -``` - -Имена файлов (`personal`, `work`) - произвольные, можно любые. diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index b45608d..e6c12f6 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -630,21 +630,10 @@ if [ -d "$SKILLS_SRC" ]; then } EOF - # Скиллы, реализованные через хуки — не деплоятся как скиллы, - # иначе Claude Code загрузит их в LLM до того как хук успеет перехватить. - HOOK_BACKED_SKILLS="switch-account" - for skill_dir in "$SKILLS_SRC"/*; do [ -d "$skill_dir" ] || continue skill_name=$(basename "$skill_dir") - # Пропускаем скиллы-хуки - skip=false - for hbs in $HOOK_BACKED_SKILLS; do - [ "$skill_name" = "$hbs" ] && skip=true && break - done - $skip && continue - # Деплой для Claude mkdir -p "$CLAUDE_SKILLS_DST/$skill_name" cp -r "$skill_dir/"* "$CLAUDE_SKILLS_DST/$skill_name/"