#!/usr/bin/env bash # UserPromptSubmit hook: перехватывает /add-account. # 1) сохраняет текущий аккаунт по его реальному email (account-email.sh) # 2) запускает oauth-логин в фоне (открывает браузер) # 3) после логина фоновый процесс сам определяет email нового аккаунта по токену # и сохраняет его credentials + делает current input=$(cat) prompt=$(echo "$input" | jq -r '.user_prompt // .prompt // empty' 2>/dev/null) normalized=$(echo "$prompt" | sed 's|^[[:space:]]*/||; s|[[:space:]]*$||') [ "$normalized" != "add-account" ] && exit 0 CREDS="$HOME/.claude/.credentials.json" ACCOUNTS_DIR="$HOME/.claude/accounts" CURRENT_FILE="$ACCOUNTS_DIR/current" EMAIL_HELPER="$HOME/.claude/hooks/account-email.sh" mkdir -p "$ACCOUNTS_DIR" # Сохраняем текущий активный аккаунт под его реальным email (по токену) if [ -f "$CREDS" ]; then cur_email=$(bash "$EMAIL_HELPER" "$CREDS" 2>/dev/null) if [ -n "$cur_email" ]; then cp "$CREDS" "$ACCOUNTS_DIR/${cur_email}.credentials.json" chmod 600 "$ACCOUNTS_DIR/${cur_email}.credentials.json" echo "$cur_email" > "$CURRENT_FILE" fi fi # Фоновый процесс: логин нового аккаунта + автосохранение после успеха. # claude auth login ждёт авторизации в браузере и завершается после неё, # затем определяем email нового аккаунта по токену (через API) и сохраняем. ( claude auth login --claudeai /tmp/claude-add-account.log 2>&1 new_email=$(bash "$EMAIL_HELPER" "$CREDS" 2>/dev/null) if [ -n "$new_email" ] && [ -f "$CREDS" ]; then cp "$CREDS" "$ACCOUNTS_DIR/${new_email}.credentials.json" chmod 600 "$ACCOUNTS_DIR/${new_email}.credentials.json" echo "$new_email" > "$CURRENT_FILE" echo "SAVED: $new_email" >> /tmp/claude-add-account.log fi ) & disown # exit 0: Claude загружает скилл add-account и говорит что делать exit 0