@purpleschool/ai-for-code
v0.6.1
Published
Автоматическая настройка AI для кода (Claude и OpenAI Codex через PurpleSchool) в IDE и CLI: Claude Code, OpenCode, Pi, VS Code, Cursor, Windsurf, JetBrains (Cline), Neovim, OpenAI Codex CLI
Readme
@purpleschool/ai-for-code
Мастер настройки «AI для кода» от PurpleSchool: подставляет ключ и base URL прокси PurpleSchool в нужные конфиги. Два провайдера:
- Claude —
ANTHROPIC_API_KEY/ANTHROPIC_BASE_URLдля Claude Code CLI, OpenCode, Pi, VS Code, Cursor, Windsurf, Cline (JetBrains) и Neovim (avante.nvim). - OpenAI Codex —
OPENAI_API_KEYиmodel_providersв~/.codex/config.tomlдля Codex CLI.
Без ручной правки JSON/TOML/dotfiles.
Использование
npx @purpleschool/ai-for-codeПервый вопрос — «Установить» или «Удалить», второй — какого провайдера настраиваем (Claude или OpenAI Codex).
Установить
- Спросит API-ключ (личный кабинет → раздел «API») и сразу проверит его живым запросом
к proxy (
GET /v1/models) — при 401/403 попросит ввести ключ заново, при недоступности сети спросит, продолжать ли без проверки. - Сам определит, какие инструменты уже установлены на машине, и предложит их отметить (можно доотметить вручную то, что не нашёл).
- Предупредит, какие файлы будет менять, и попросит подтверждение.
- Внесёт изменения, сохранив бэкап каждого тронутого файла в
~/.purpleschool-ai-backups/.
Удалить
Ключ не спрашивается — не нужен для отката. Мастер сам определяет, что похоже настроено
именно им (по маркеру в shell rc, по нашим записям в settings.json, по файлу
purpleschool-avante.lua), предлагает отметить нужное и точечно снимает только то, что
сам добавлял — чужие настройки, комментарии в JSON и посторонние переменные окружения
не трогает. Каждая правка тоже бэкапится перед изменением.
Все инструменты, которые пишут переменные окружения в shell rc (Claude Code CLI, OpenCode, Pi,
Neovim, OpenAI Codex CLI), делят один и тот же маркированный блок, но удаление точечное — снимаются
только переменные конкретного инструмента, ключи остальных в этом же блоке не трогаются.
CLI-пакеты (@anthropic-ai/claude-code, @openai/codex) и расширения в IDE при удалении
не трогаются — только конфиг подключения к прокси.
Флаг --dry-run в любом режиме показывает план действий без изменения файлов.
Что именно меняется
| Инструмент | Файл(ы) | Как |
| --- | --- | --- |
| Claude Code (CLI) | ~/.zshrc/~/.bashrc (или setx), ~/.claude/settings.json (env-блок), ~/.claude.json | env-блок в шелле, тот же креды в официальный env-блок настроек (работает сразу, без нового терминала), hasCompletedOnboarding, плюс пред-одобрение ключа (customApiKeyResponses.approved) — без него интерактивный claude пишет «Not logged in», пока не одобришь ключ вручную через /config |
| OpenCode (CLI) | shell rc (или setx), ~/.config/opencode/opencode.json (на Windows — %APPDATA%\opencode\) | ANTHROPIC_API_KEY в shell rc; встроенный провайдер anthropic перенаправляется на прокси через provider.anthropic.options.baseURL + apiKey: "{env:ANTHROPIC_API_KEY}" — модели, blacklist/whitelist и другие провайдеры в файле не трогаются |
| Pi (CLI) | shell rc (или setx), ~/.pi/agent/models.json | ANTHROPIC_API_KEY в shell rc; providers.anthropic.baseUrl + apiKey: "$ANTHROPIC_API_KEY" — блок models не пишем, поэтому весь встроенный список моделей Anthropic остаётся, просто ходит через прокси |
| VS Code / Cursor / Windsurf | settings.json расширения Claude Code | мерджит claudeCode.environmentVariables по имени переменной и claudeCode.disableLoginPrompt, не трогая остальные настройки |
| Cline (JetBrains) | — | автонастройка недоступна (нет стабильного пути к конфигу плагина) — пошаговая инструкция (View → Tool Windows → Cline → шестерёнка) + ключ в буфере обмена |
| Neovim (avante.nvim) | shell rc + lua/plugins/purpleschool-avante.lua | env-переменные + файл-спека для lazy.nvim в актуальной схеме providers.claude |
| OpenAI Codex (CLI) | shell rc (или setx), ~/.codex/config.toml | OPENAI_API_KEY в shell rc; model_providers.purpleschool (base_url, env_key, wire_api = "responses") и model_provider в config.toml |
Все правки — аддитивные и идемпотентные: повторный запуск не плодит дублирующиеся блоки и не трогает несвязанные настройки пользователя.
Доктор конфликтующих настроек
Перед записью в ~/.claude/settings.json мастер проверяет файл на настройки, которые, по
документации Anthropic (или по отсутствию в ней), могут молча перебивать наш ключ:
apiKeyHelper— если задан, его вывод имеет приоритет надenv.ANTHROPIC_API_KEYи полностью его перебивает (документированное поведение).env.CLAUDE_CODE_DISABLE_GATEWAY— не встречается ни в одном официальном источнике Anthropic; судя по названию, может отключать трактовкуANTHROPIC_BASE_URLкак шлюза.
Если что-то из этого найдено — мастер явно показывает находку и спрашивает разрешения убрать (с бэкапом, как обычно), не удаляет молча. Проверка сознательно не пытается угадывать «все подозрительные ключи» — Claude Code имеет много легитимных env-переменных (Bedrock/Vertex/ Foundry, кастомные заголовки и т.д.), и общая эвристика по имени ключа дала бы ложные срабатывания.
Кросс-платформенность
Работает под macOS, Windows и любой дистрибутив Linux (детект платформы, command -v
вместо which, $XDG_CONFIG_HOME — всё уважает конкретный дистрибутив, а не только
Ubuntu/Debian).
Отдельно на Linux для VS Code учитываются три способа установки: нативная (.deb/.rpm/
tarball), официальный Flatpak (com.visualstudio.code) и официальный Snap (code) —
CLI сам находит, какой из них реально используется. Для Cursor и Windsurf это не сделано:
у них нет подтверждённых официальных Flatpak/Snap-сборок, а гадать чужой app id не хотелось.
На Linux у Windsurf папка настроек — строчными буквами (~/.config/windsurf), в отличие от
macOS/Windows (Windsurf) и в отличие от Cursor, у которого регистр везде одинаковый
(Cursor) — учтено отдельно, файловая система на Linux регистрозависима.
Сверено с официальной документацией
Каждая настройка проверена по первоисточникам (Anthropic docs, GitHub-репозитории avante.nvim и Cline, а не только по инструкциям с сайта PurpleSchool). По итогам сверки:
claudeCode.environmentVariables,claudeCode.disableLoginPrompt— подтверждены дословно официальной страницей Connect Claude Code to an LLM gateway и Use Claude Code in VS Code: формат массива{name, value}и сами имена ключей совпадают один в один.CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY— подтверждена, требует Claude Code ≥2.1.129, дёргаетGET /v1/modelsу прокси — тем же эндпоинтом мы проверяем валидность ключа при вводе.~/.claude.json+hasCompletedOnboarding— оказался недокументированным файлом (это файл OAuth-сессии/MCP/кеша, не settings.json); официально задокументированный способ решить ту же проблему («просит войти, хотя прокси отвечает») —env-блок в~/.claude/settings.json. Мы теперь пишем оба: официальныйenv-блок (работает мгновенно) иhasCompletedOnboarding(сохранили как доп. подстраховку для более старых версий CLI, где встречался этот баг).avante.nvim: схема конфига провайдера сменилась. Актуальный формат — вложенный
providers.claude = {...}, а не плоскийclaude = {...}рядом сprovider. Старая схема, которую мы генерировали раньше, устарела — обновили генератор снипета под текущую.Cline (JetBrains) существует и общедоступен (GA с сентября 2025), но наша инструкция по доступу к настройкам была неточной («File → Settings → Tools → Cline» — такой страницы нет). Верно: View → Tool Windows → Cline открывает панель плагина, дальше — значок настроек внутри неё, поле «Use custom base URL».
OpenCode и Pi: base URL нужен уже с
/v1. В отличие отANTHROPIC_BASE_URL(там/v1дописывает сам Anthropic SDK), оба инструмента используютbaseURL/baseUrlкак есть:@ai-sdk/anthropicв OpenCode имеет дефолтhttps://api.anthropic.com/v1, а в примерах pi прокси тоже указан с/v1. Поэтому в их конфиги пишется.../ai-proxy/anthropic/v1.Ключ в их конфиги не попадает. У обоих есть родная подстановка переменных окружения (
{env:ANTHROPIC_API_KEY}у OpenCode,$ANTHROPIC_API_KEYу pi) — в файле лежит только ссылка, сам ключ живёт в shell rc /setx.Оба переопределяют встроенного провайдера, а не заводят свой. Список моделей Anthropic берётся из самого инструмента (
/modelsв OpenCode,/modelв pi) — нам не нужно хардкодить и поддерживать актуальный перечень моделей.
Известные ограничения (сознательно не покрыты в v1):
ANTHROPIC_API_KEYобщий у Claude Code CLI, OpenCode, Pi и Neovim. Это одна и та же переменная в одном блоке shell rc, поэтому удаление любой из этих целей убирает её и у остальных (конфиги самих инструментов при этом не трогаются). Если сняли лишнее — просто прогоните «Установить» ещё раз.- WSL + VS Code на Windows-хосте. Если запустить мастер внутри WSL, а VS Code
использует Remote-WSL с хостовым
settings.jsonна Windows-стороне, правки попадут не в тот файл. Запускай мастер там же, где физически лежит нужныйsettings.json. - Корпоративные HTTP(S)-прокси. Проверка ключа не читает
HTTP_PROXY/HTTPS_PROXY— за прокси она просто скажет «не смог проверить» и предложит продолжить без неё (не блокирует настройку, только сам шаг верификации). sudo. Запуск черезsudoзаблокирован явным сообщением —$HOMEв этом случае указывает на/root, а не на реальный профиль пользователя.~/.codex/config.toml— комментарии не сохраняются. В отличие от правокsettings.json(сохраняют комментарии черезjsonc-parser), TOML-библиотека без CST-редактора: файл парсится в объект, правится и сериализуется заново. Бэкап оригинала сохраняется перед каждой правкой, но ручные комментарии вconfig.tomlпосле этого пропадут./compactв Codex для стороннего провайдера. У Codex CLI команда/compactбьёт вPOST /v1/responses/compactтолько при разговоре сapi.openai.com; для любого кастомногоmodel_provider(включая наш) Codex сам переключается на локальный fallback — суммаризацию через обычный/v1/responses. Поэтому эндпоинт.../openai/v1/responses/compactна прокси можно не поднимать: Codex CLI его не вызывает при работе через кастомного провайдера.
FAQ
«Запускаю claude, а он не видит API-ключ / пишет "Not logged in · Please run /login", хотя настройка вроде прошла».
С версии 0.2.0 мастер сам решает эту проблему при установке (см. customApiKeyResponses в
таблице выше). Если всё равно видишь это сообщение — например, ключ был прописан вручную или
машина настраивалась старой версией мастера:
- Запусти
claudeинтерактивно. - Введи
/config. - Найди пункт «Use custom API key» и включи его.
- Задай вопрос заново — статус login должен пропасть.
Причина: Claude Code требует одноразового интерактивного подтверждения кастомного API-ключа.
Без него headless-запросы (claude --print "...") работают нормально, а интерактивная сессия
держит баннер «не залогинен», даже если сам ключ рабочий. Официально задокументировано в
troubleshooting-таблице Connect Claude Code to an LLM gateway.
«В ~/.claude/settings.json появились apiKeyHelper или CLAUDE_CODE_DISABLE_GATEWAY, и всё сломалось».
См. «Доктор конфликтующих настроек» выше — при следующем запуске «Установить» мастер сам
это найдёт и предложит убрать. Вручную: удали apiKeyHelper и env.CLAUDE_CODE_DISABLE_GATEWAY
из файла, оставь только env.ANTHROPIC_API_KEY и env.ANTHROPIC_BASE_URL.
Разработка
npm install
npm run dev # запуск через tsx без сборки
npm run typecheck
npm run build # сборка в dist/cli.js (ESM, с shebang)Публикация
npm run build
npm publish --access publicТребуется npm-аккаунт с доступом к организации @purpleschool.
