- новый хук add-account-hook.sh: сохраняет текущий аккаунт по реальному
email (claude auth status), запускает OAuth-логин в фоне и после успеха
сам сохраняет новый аккаунт в ~/.claude/accounts + делает его current
- switch-account-hook.sh: активный аккаунт определяется через
claude auth status, а не через хрупкий файл current - защита от порчи
сохранённых credentials при рассинхроне токена
- скилл add-account: краткая инструкция после срабатывания хука
- ai-setup.sh: деплой add-account-hook + регистрация в UserPromptSubmit
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раньше все ai-* лаунчеры делили один ~/.claude и общий settings.json, из-за
чего кастомная модель (openai/gpt-5.5) из ai-openrouter протекала в пикер
ai-claude. Теперь каждый сторонний провайдер изолирован в своём
CLAUDE_CONFIG_DIR (~/.config/ai-setup/cfg/<launcher>) - свои settings.json и
.claude.json, ноль протечек. ai-claude остаётся на ~/.claude (нативный логин).
Пикеры /model приведены к требуемому виду:
- ai-deepseek: только DeepSeek V4 Pro (opus) и DeepSeek V4 Flash (haiku),
дефолт Pro; через availableModels + ANTHROPIC_DEFAULT_*_MODEL_NAME
- ai-kimi: только Kimi K2.6 (opus)
- ai-claude: только нативные модели Claude
Общие skills и CLAUDE.md шарятся симлинком из ~/.claude.
Persistence effort - гибрид:
- low/medium/high/xhigh живут нативно в settings.json лаунчера, /effort
внутри сессии работает свободно и уровень сохраняется
- max нельзя сохранить в settings.json (session-only), поэтому он
восстанавливается через CLAUDE_CODE_EFFORT_LEVEL; в такой max-сессии
/effort залочен (ограничение Claude Code), выход - AI_EFFORT=<lvl> ai-*
Текущий уровень ловит статусбар в ~/.cache/ai-setup/effort_<launcher>.
Удалён устаревший effort-save-hook (заменён нативным persistence + гибридом),
почищен из ~/.claude/settings.json и осиротевший кэш model_*.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- _brand_color: цвет имени модели по AI_LAUNCHER
deepseek=синий(69), claude=оранжевый(173), kimi=голубой(81),
openrouter=фиолетовый(135), остальные=кремовый(223)
- _restore_model / _restore_model_str: сохранение и восстановление
model_id в кэше лаунчера (~/.cache/ai-setup/model_<launcher>)
- effort-save-hook также сохраняет model_id при завершении сессии
- ai-claude/ai-openrouter используют восстановленную модель при старте
Co-Authored-By: Claude <noreply@anthropic.com>
- _restore_effort: каждый лаунчер читает свой effort из
~/.cache/ai-setup/effort_<launcher> и записывает в settings.json
- effort-save-hook.sh: сохраняет effortLevel из settings.json в кэш
при завершении сессии (через Claude Code hooks)
- Все лаунчеры (claude/deepseek/kimi/openrouter) экспортируют
AI_LAUNCHER для идентификации в statusline и хуках
- _deepseek_balance: мультивалютный вывод (USD + CNY с символами $ и ¥)
- Дефолтные effort: claude=xhigh, deepseek/kimi/openrouter=high
Co-Authored-By: Claude <noreply@anthropic.com>
- switch-account-hook.sh: сохранять обновлённые OAuth-токены обратно в файл
аккаунта перед переключением — предотвращает 401 после обратного свитча
- statusline-command.sh:
- effort.level из stdin (сессия), а не из общего settings.json —
ai-claude и ai-deepseek больше не пересекаются
- автоопределение аккаунта по access-токену в .credentials.json
- фолбек: если аккаунт не найден — запрос к haiku напрямую через
Anthropic (в обход DeepSeek) для определения email
- показ аккаунта только для claude-* моделей
- statusline: [account] выводится между [branch] и model, тот же оранжевый цвет
- switch-account-hook: exit 0 вместо exit 2, чтобы Claude ответил и перерисовал статусбар
- switch-account skill: инструкция отвечать одним символом ✓
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude Code не предоставляет API для обновления статусной строки в idle.
SIGWINCH, TIOCSWINSZ, запись в TTY, write в stdin - ничего не работает.
Статусная строка обновится при следующем LLM запросе автоматически.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SIGWINCH и TIOCSWINSZ не заставляют Claude Code обновить статусную строку.
Запускаем statusline-command.sh с кешем и пишем результат напрямую
в TTY claude через \0337 (save cursor) / \033[999B / \033[2K / \0338.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SIGWINCH напрямую игнорируется. TIOCSWINSZ на TTY claude посылает
SIGWINCH через kernel к foreground process group.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SIGWINCH до exit 2 игнорируется - claude ещё рисует блокировку.
Запускаем sleep+kill в фоне, они живут после завершения хука.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Посылаем SIGWINCH родительскому процессу claude после переключения -
это заставляет TUI перерисовать UI включая статусную строку.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Документация врала: реальный UserPromptSubmit шлёт поле prompt, а не user_prompt.
Хук получал пустую строку и выходил с exit 0, пропуская блокировку.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Без скилла Claude Code выдаёт "Unknown command" до запуска хука.
Скилл нужен как регистрация команды, но тело пустое - хук перехватывает
через exit 2 (stderr) до вызова LLM. Откат изменения в ai-setup.sh
которое скрывало скилл от деплоя.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- Все лаунчеры (ai-claude, ai-deepseek, ai-kimi, ai-openrouter): промпт
пишется во временный файл через --system-prompt-file вместо аргумента
командной строки. Решает E2BIG при промптах > 128KB (MAX_ARG_STRLEN)
из проектов с большими .md файлами.
- statusline: кешируем rate_limits по model_id (раздельные файлы для
claude/kimi/openrouter). При старте сессии показываем данные из кеша
+ ctx:0%. Убирает пустую статусную строку до первого запроса.
- settings.json: добавляем SessionStart хук при setup, триггерит
вызов statusLine при открытии сессии.
- ai-claude: --model sonnet зафиксирован, убрали exec для корректной
работы trap (cleanup временного файла).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
DeepSeek: накопленная стоимость сессии по DeepSeek-ценам (V4: $0.55/$2.19, V3: $0.27/$1.10)
Anthropic/Kimi/прочие: рейт-лимиты (5h, 7d) без долларов
Все: заполнение контекста (ctx%)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- все скрипты перенесены в scripts/ (ai-setup.sh, ru-bypass.sh, ks-off.sh, ks-on.sh)
- setup.sh — новый мастер-скрипт с меню: шаги 1-2 отделены от опций 3-4
- пояснения к GATEWAY и DEV при выборе пункта 2
- ai-setup.sh: SCRIPT_DIR поднят на уровень выше (/../) чтобы находить home-configs/
- tests/test_fixes.sh, test_isolated.sh: пути обновлены на scripts/ai-setup.sh
- QUICK_START.md, README.md, home-configs/network/README.md: пути обновлены
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ru-bypass.sh: маршруты для 10/8, 172.16/12, 192.168/16 через локальный роутер
- ru-bypass.sh: UFW правила для тех же диапазонов (однократно, before.rules)
- ru-bypass.sh: пример IP в конце теперь резолвится из ya.ru динамически
- README.md: описание RFC1918 bypass в разделах про UFW и про шаги скрипта
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ru-bypass.sh: GATEWAY и DEV теперь переопределяются через env (${VAR:-default})
Запуск на другой машине: sudo GATEWAY=10.0.0.1 DEV=eth0 bash ru-bypass.sh
- home-configs/network/README.md: объяснение как работает ru-bypass, kill switch,
как запускать на разных машинах с разными сетевыми интерфейсами
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- путь и ветка: светло-серый (37), как хинты Claude Code
- модель: приглушённый лососевый (173), фирменный цвет Claude
- лимиты и ctx: единая функция pct_color (зелёный/жёлтый/красный)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
timeout возвращает код 124 при обрезке, что запускало fallback-цепочку.
Заменил || на ; true чтобы подавить код выхода timeout.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- зелёный <30%, жёлтый 30-50%, красный 50%+
- однократный звуковой сигнал (alarm-clock-elapsed.oga, 1s) при первом достижении 60%
- сброс флага алерта когда ctx опускается ниже 50%
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Без него [ -n "$ctx_pct" ] && ... возвращал exit 1 когда ctx пустой,
и Claude Code прятал всю строку статуса.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ctx:35% отображается серым в конце строки у всех провайдеров.
Для Kimi (нет rate limits) это единственная полезная метрика.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Вместо одного показываются оба: "4ч20м:1% 5д3ч:4%".
Для недельного добавлен формат дней: "5д3ч".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Вместо захардкоженного "5h" теперь считается оставшееся время
из resets_at timestamp: "4ч40м:25%", "58м:80%" и т.д.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ks-off.sh — временно отключить UFW kill switch перед сёрфингом без VPN
- ks-on.sh — восстановить kill switch (с проверкой что amn0 поднят)
- ru-direct.sh — роутинг всех российских IP напрямую через провайдера, минуя Amnezia
- ru-direct-undo.sh — откат ru-direct.sh, возврат к "всё через VPN"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Шаг 6.7 - копирует statusline-command.sh и прописывает statusLine
в settings.json. Показывает user@host, путь, git-ветку, модель и usage%.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
while read ломается на последней строке без переноса — loop body не выполняется.
Добавлен || [[ -n "$line" ]] для обработки EOF без trailing newline.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Добавлен сервер 202.148.54.122 (AmneziaVPN) с flow=xtls-rprx-vision
- Парсер VLESS URL: автоопределение типа транспорта (xhttp/tcp)
- Если flow указан → тип по умолчанию tcp
- Если flow пустой → тип по умолчанию xhttp
- Генератор конфига: xhttpSettings только для xhttp-транспорта
- Поле flow в users теперь берётся из URL (ранее было пустым)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ai-setup.sh now asks interactive Y/n prompt for vless mode
- On Y: installs xray + proxychains-ng, deploys configs, enables proxychains4 in all ai-* launchers
- On N: generates plain ai-* scripts without proxychains
- Templates moved to home-configs/xray/ and home-configs/proxychains/
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Move GLOBAL_RULES.md to home-configs/ as single source of truth
- Add el-review and el-review-heavy skills for GitLab-style branch diff review
- Update ai-setup.sh to deploy skills to ~/.claude/skills/
- Update README and tests for new paths