Коробка передач для Claude Code: переключение моделей через tmux и Node.js

Переключать модели в Claude Code можно обычной командой /model, но разработчик Илья Тузов решил превратить эту операцию в отдельный механический интерфейс. Он собрал приложение ituzov-gearbox — виртуальную коробку передач с рычагом, прорезями, щелчками и перегазовкой.
Проект написан на Node.js и ванильном JavaScript, использует tmux для управления терминалом, а кулиса передач отрисована в SVG. Исходный код открыт, поэтому приложение можно установить, изучить или адаптировать под собственный сценарий.
Как интерфейс управляет Claude Code
Claude Code запускается внутри tmux. У каждой панели tmux есть собственный идентификатор, например %3. Из другого терминала в неё можно передать команду и имитировать нажатие клавиш. Для переключения модели достаточно отправить последовательность вроде tmux send-keys -t %3 "/model opus" Enter.
В ituzov-gearbox браузерный интерфейс передаёт локальному серверу выбранную модель и адрес панели. Node.js вызывает tmux, который печатает команду в нужном терминале. Связь с tmux сосредоточена в файле src/tmux.js. Сервер проверяет название модели и формат идентификатора панели, а аргументы передаёт через execFile массивом, не собирая одну строку команды.
Приложение не определяет содержимое панели напрямую: оно отправляет ввод в выбранный shell. Поэтому в интерфейсе панели предварительно помечаются как похожие на Claude Code по процессу и заголовку, но перед запуском стоит убедиться, что выбрана правильная панель. Сервер работает только на локальном адресе 127.0.0.1, однако его возможность отправлять клавиши в терминал требует внимательного отношения к выбору панели.
Список моделей считывается из меню Claude Code
Чтобы не поддерживать вручную список моделей, коробка открывает меню /model прямо в Claude Code и считывает его содержимое. Для этого используется команда tmux capture-pane, возвращающая текст, отображаемый в панели. Приложение ждёт появления меню, извлекает названия моделей регулярным выражением и затем закрывает меню клавишей Escape.
Перед открытием меню программа дополнительно проверяет, не занят ли Claude генерацией. Если в содержимом панели есть подсказка о прерывании ответа, чтение списка прекращается с ошибкой. Это важно, потому что Escape во время генерации может остановить текущий ответ. У подхода есть ограничения: парсер зависит от внешнего вида меню, а фиксированная задержка в 1200 миллисекунд может оказаться недостаточной на медленной машине.
Если меню не удалось прочитать, приложение показывает ошибку и использует резервную раскладку. Пользователь также может задать собственный список передач в файле gearbox.config.json.
Механика виртуальной кулисы
Рычаг не просто следует за курсором. Автор представил кулису как граф: горизонтальная линия соответствует нейтрали, а вертикальные участки — прорезям передач. По нейтрали рычаг можно перемещать вбок, после выбора нужной колонки он движется только вверх или вниз в пределах паза.
Перейти напрямую из одной передачи в другую нельзя — рычаг должен сначала вернуться в нейтраль. Если отпустить его между положениями, он возвращается в текущую передачу. Клик по номеру передачи также запускает движение по разрешённому маршруту. После попадания в паз воспроизводятся щелчок и короткая перегазовка, а выбранная модель отправляется в терминал.
Физический движок для этого не понадобился: ограничения движения, возврат в паз и простые звуковые эффекты реализованы кодом. Звук создаётся средствами Web Audio.
Отдельное окно и запуск
Интерфейс открывается как небольшое самостоятельное окно браузера. Node.js запускает локальный сервер, а Chromium открывает страницу с флагом --app, скрывающим вкладки и адресную строку. Для корректного размера и положения используется отдельный профиль браузера. Если Chromium не найден, приложение открывается в обычной вкладке.
Проект рассчитан на macOS, Linux и Windows через WSL. На Windows без WSL он не работает, поскольку основой служит tmux. Для запуска нужны Node.js 18 или новее, tmux и установленный Claude Code:
- Запустить Claude Code внутри tmux.
- В другом терминале выполнить npx ituzov-gearbox или установить проект из исходников и запустить командой npm start.
- Выбрать панель с Claude Code и дождаться загрузки списка моделей.
- Переключать передачи рычагом, контролируя результат в терминале.
За работой с терминалом отвечает src/tmux.js, а логика рычага, кулисы и звуковых эффектов находится в public/app.js. Сейчас проект уже позволяет переключать модели с механическим антуражем, а среди будущих идей автора — сцепление на пробел и отдельный ручник для отмены генерации.


