feat: переключение аккаунтов через хук без токенов LLM

- UserPromptSubmit хук перехватывает /switch-account до LLM, переключает
  credentials по кругу и возвращает decision:block - нулевой расход токенов
- Статусная строка: effort и имя аккаунта в квадратных скобках [high·work]
- ai-setup.sh деплоит хук switch-account-hook.sh и прописывает его в settings.json
- Скилл switch-account оставлен как fallback-документация для setup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 20:58:06 +03:00
parent 57d171a592
commit c6161c3332
4 changed files with 169 additions and 1 deletions

View File

@@ -681,6 +681,41 @@ else
warn "Файл $STATUSLINE_SRC не найден, пропускаю"
fi
# ── 6.7.1. Хук switch-account ───────────────────────────────────
info "Деплою хук switch-account..."
SWITCH_HOOK_SRC="$SCRIPT_DIR/home-configs/claude/hooks/switch-account-hook.sh"
SWITCH_HOOK_DST="$HOME/.claude/hooks/switch-account-hook.sh"
mkdir -p "$HOME/.claude/hooks"
if [ -f "$SWITCH_HOOK_SRC" ]; then
cp "$SWITCH_HOOK_SRC" "$SWITCH_HOOK_DST"
chmod +x "$SWITCH_HOOK_DST"
# Прописываем хук в settings.json (идемпотентно)
python3 - "$HOME/.claude/settings.json" "$SWITCH_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 "Хук switch-account установлен"
else
warn "Файл $SWITCH_HOOK_SRC не найден, пропускаю"
fi
# ── 6.8. Регистрация официального маркетплейса плагинов Claude ──
info "Настраиваю маркетплейс плагинов Claude Code..."
if ! command -v claude &>/dev/null; then