Как это устроено, часть за частью
Всю программу держит одно правило: состояние окна живёт в памяти, а настройки живут в файлах. Всё, что описано ниже, следует из этого.
Правило, на котором всё держится
Окно содержит вкладки. Вкладка содержит блоки. Блок - это терминал, редактируемый файл, панель файлов, веб-страница, картинка, PDF, страница Markdown, diff, системный монитор, экран настроек или панель дополнения. Они делятся в любом направлении с вложенностью, перетаскиваются, меняют размер и закрываются по одному набору правил, а не по новому набору для каждой новой функции. Всё, что слишком велико, чтобы принадлежать каждому, - это дополнение из собственного каталога vobuda, пока это Design и Director, которое ставится и удаляется целиком одним нажатием.
Ничто из этого расположения не хранится в базе данных, потому что базы данных нет. То, что делает окно, живёт в памяти; то, что вы решили, живёт в файлах. Поэтому кнопка, клавиша, строка меню, Cmd+K и командная строка вызывают одно и то же действие по имени, и поэтому изменить поведение почти всегда означает отредактировать JSON.
Именно поэтому лучший терминал для Mac, если речь о такой работе, для которой он создан, это тот, который можно изучить. Если настройка существует, для неё есть строка в файле. Если действие существует, у него есть имя, по которому его можно вызвать.
Пять способов вызвать действие, и это одно и то же действие
При таком количестве действий большая часть программы на практике скрыта. Cmd+K отвечает на вопрос «что она умеет», а не «сделай это».
-
Он учит клавишам, а не заменяет их
У каждой строки показан свой шорткат. Человек, который дважды открывает список ради одного и того же действия, к третьему разу уже выучит клавишу.
-
Это не пятый словарь
Каждая строка запускает действие по имени, точно так же, как остальные четыре способа. Проверка сверяет таблицу, из которой он строится, со списком ядра о том, что может быть привязано к клавише, в обе стороны: действие, которое существует, но не предложено там, ломает сборку.
-
Командная строка - тот же набор
vobuda do block.split-down, vobuda button files, vobuda theme catppuccin-mocha, vobuda send, vobuda signal, vobuda state, vobuda log, набранные в любом блоке vobuda, а
vobuda mcpпредлагает те же команды агенту как инструменты MCP. Это не чёрный ход для скриптов: через него вся программа управляется в интерфейсных тестах, поэтому ей можно доверять, и поэтому агент может перестроить ваше окно, а вы можете прочитать, что именно он сделал.
Блоки и что они гарантируют
Блок меняет вкладку, не останавливая свою оболочку
Перетащите блок за заголовок на вкладку в полосе, и он окажется там: тот же id, та же оболочка, та же папка, и в ней по-прежнему работает то, что работало. Пока блок над вкладкой, она подсвечивается акцентным цветом. Для этого тоже есть действие, block.to-tab:2, поэтому его можно повесить на клавишу, и проверка без мыши сможет его нажать.
Размеры запоминаются, и у них есть нижний предел
Для каждого блока отдельно, и ни один блок не может стать настолько узким, что станет непригодным для использования. Панель шириной 200 точек - это панель, которой никто не может пользоваться.
Ничего вашего не уходит тихо
Закрытие того, что работает, сначала спрашивает подтверждение, по имени, потому что потеря чьей-то работы хотя бы раз стоит больше доверия, чем приносит целая функция. По той же причине папка проекта сохраняется в снимок перед каждым ходом агента, и одним нажатием её можно вернуть; ключ, вставленный агенту, останавливается прежде, чем агент его увидит; а ограждение, которое можно включить, не даёт агенту записывать и удалять что-либо вне проекта.
Сессии восстанавливаются по умолчанию
Вкладки, блоки и рабочая папка каждого блока возвращаются после перезапуска, и по умолчанию это включено; один переключатель в разделе «Основные» это выключает. Сессия, пришедшая с другого компьютера, открывает то, что может, и сообщает, что не смогла открыть, а не отбрасывает блоки молча.
Папка настроек, файл за файлом
Всё в ~/.config/vobuda - это читаемый JSON, за которым программа следит во время работы. Сохраните файл, и окно перерисуется.
| Файл | Что в нём хранится |
|---|---|
| settings.json | Тема, оформление, терминал, оболочка, окно, сигналы: все настройки десяти разделов |
| themes/*.json | Цвета терминала и окна. В комплекте 25 палитр, две из них сделаны для людей с нарушением цветовосприятия |
| looks/*.json | Форма окна: углы, тени, цвета панелей, прозрачность. В комплекте 29 вариантов |
| skins/*.json | Какие панели монитора отображаются и как |
| buttons.json | Док: кнопки, порядок, сторона, форма и цвет для тех немногих, что стоит выделить |
| agents.json | Как распознаётся агент и что ему предлагается |
| keys.json | Все шорткаты. Из этого же файла строится нативное меню macOS |
| workspaces/*.json | Проекты: каждый - окно со своими вкладками, папкой, темой и доком |
Встроенные темы находятся внутри бинарника, а папка их переопределяет, поэтому обновление приносит новые цвета, не перезаписывая то, что вы отредактировали. Вся папка сохраняется в один архив и восстанавливается на другом Mac, а на Mac копия хранится в iCloud Drive, по умолчанию включённая, с одним переключателем, чтобы её выключить.
Системный монитор, устроенный через файл
Двенадцать видов панелей, и то, какие из них вы видите, это скин, а не экран, который кто-то нарисовал один раз.
-
Цифры честны насчёт самих себя
Значение, которое система оценивает, а не измеряет, отображается с тильдой, а отсутствующее оборудование даёт отсутствующее значение, а не ноль. На машине без дискретного GPU не появится панель GPU с нулём процентов.
-
Оба адреса, и у каждого своя кнопка копирования
Панель адресов показывает сначала адрес, который видит интернет, а под ним - адрес этой машины в её собственной сети. Она спрашивает только пока панель на экране, примерно раз в десять минут, или раз в тридцать секунд, пока адрес ещё неизвестен, и запрос не несёт никакой информации о машине.
-
Порядок меняется перетаскиванием, как и всё остальное
Панели монитора, кнопки дока и части панели агента подхватываются и переставляются одним и тем же жестом. Строку настроек берут за ручку слева, а не за любое место строки, поэтому перетаскивание, начатое с текстового поля, не мешает выделить слово, которое вы хотели изменить.
Файл открывается рядом с оболочкой
То, за чем терминал обычно отправляет вас в другое место: в выводе появляется путь, нужно поменять две строки, и до сих пор это означало уйти в редактор и вернуться, потеряв контекст оболочки.
-
Сохранение происходит осознанно
Ничего не записывается до нажатия Cmd+S. Редактор, который пишет на диск по мере ввода, хорош в приложении для заметок и плох рядом с работающей оболочкой. Это действие, а не просто нажатие клавиши, поэтому у него, как и у всего остального здесь, есть пункт меню, шорткат и запись в командной строке.
-
Отказы важны не меньше, чем запись
Файл, изменённый на диске с момента открытия, не перезаписывается. Бинарный файл не показывается как искажённый текст. Папка вообще не открывается. Несохранённые изменения помечаются видимой отметкой, а закрытие изменённого файла спрашивает подтверждение.
-
Поиск файла
Панель файлов ищет по имени внутри папки, в которой вы находитесь, и каждый результат показывает, в каких двух папках он лежит, потому что одно имя не отличит два index.ts друг от друга. Она пропускает node_modules, .git, target и подобные, останавливается на восьми уровнях или двухстах результатах и не делает ничего при вводе меньше двух букв.
Настройки как экран и как файлы
Десять разделов, от «Основных» до «Данных и конфиденциальности», поиск по каждой настройке, и каждая из них - это строка в файле, которую можно отредактировать вручную.
-
Настройки приходят к блоку
Клик правой кнопкой по панели означает «вот эту штуку здесь, измени её». Поэтому выбор строки настроек в собственном меню блока открывает нужный раздел поверх окна, в углу меню, а не уводит вас на экран настроек. Это действие, как и всё остальное: settings.here:themes, settings.here:monitor.
-
Звук, который слышно в момент выбора
Выбор звука сигнала или звонка терминала воспроизводит его. Выбирать звук из списка названий, которые не слышно, это выбирать название.
-
Ничто не требует перезапуска
За папкой настроек следит и то, чем управляет ядро: строка меню macOS, построенная из вашего файла шорткатов, и глобальная клавиша выпадающего окна, причём старая клавиша освобождается до регистрации новой, чтобы две не отвечали одновременно. Проверка читает каждую подсказку на экране настроек и падает на слове «перезапуск».
Голосовой ввод и озвучка
Оба используют системную речь прямо на вашей машине. Звук никогда не покидает компьютер.
Диктовка
Cmd+Shift+V печатает сказанное вами в тот блок, с которым вы работаете, а полоса показывает двумя буквами, на каком языке идёт распознавание. Продиктованная фраза печатается, но никогда не запускается сама: распознавание ошибается, а неверно распознанная команда, которая выполняется сама собой, это программа, которая удаляет файлы, потому что рядом играло радио. Рядом с агентом, где фраза - это сообщение, а не команда, она может отправляться сама, и это настройка, которая считывается в момент, когда фраза заканчивается.
Озвучка ответа
Cmd+Shift+R озвучивает последний ответ агента; повторное нажатие останавливает. Озвучивается ответ, а не экран. Маркер списка в начале строки, звёздочки вокруг выделенного слова, обратные кавычки вокруг имени, линия-рамка, полный путь там, где хватило бы имени файла - всё это убирается, а слова внутри остаются. Чтение ограничено формами, а не словами: снизу строкой ввода агента, сверху его логотипом, потому что обвязка агента меняется с каждым его релизом.
Мелочи, которые решают, останетесь вы с ним или нет
Правая кнопка мыши - наша
Везде в окне: собственное меню блока внутри блока, внешнее меню окна, полоса вкладок, док, промежуток между плитками. Каждая строка - это действие, и у самого меню есть своё действие, block.menu, поэтому жест, доступный только руке, не остаётся жестом, который ничем не проверить. Единственное место, где сохранено системное меню, это текстовое поле, где оно предлагает вырезать, копировать, вставить и словарь.
Открыть папку откуда угодно
vobuda://open?path=/some/path открывает вкладку в этой папке из действия Finder, скрипта или другого приложения. В macOS нет системной настройки терминала по умолчанию, поэтому это честная версия такой функции, а не обещание, которое нельзя сдержать.
Поиск внутри блока
Cmd+F. Поле принадлежит тому блоку, в котором ищет, и после закрытия вид остаётся там, где было найдено совпадение.
Забрать блок с собой
Cmd+Shift+X копирует текст блока, запрашивая его у самого терминала, из-за чего это работает и при включённой отрисовке на GPU, когда на странице нет текста, который можно выделить. Картинка блока - это два действия в Cmd+K: «Block snapshot to clipboard» и «Block snapshot to a file».
Проверка обновлений, которая не превращается в обязанность
Ядро проверяет раз в день, в отдельном потоке, и то, что вы видите, это полоса над раскладкой, а не поверх неё, потому что уведомление, закрывающее терминал, люди привыкают закрывать не читая. Ничто не устанавливается, пока вы не нажмёте: для агента обновление - это команда, введённая в активный блок, где виден её вывод, а для Vobuda на Mac кнопка устанавливает новую версию в фоне, затем предлагает перезапуск, который происходит сам через десять секунд, если ничего не запущено.
Сорок языков, и в каждом своё руководство
Включая строку меню macOS, которую система строит внутри ядра. Арабский и иврит отражают всё окно зеркально, кроме самого терминала, где зеркалирование сделало бы вывод и пути нечитаемыми. Ключом перевода служит английская строка, поэтому непереведённая строка откатывается к читаемому английскому тексту, а не к пустоте или идентификатору.
Попробуйте то, о чём только что прочитали
После двух коротких вопросов при первом запуске она открывается с одним терминальным блоком и ничем больше. Всё, о чём рассказано выше, включается тогда, когда вам это нужно.
curl -fsSL https://vobuda.com/install.sh | sh