/grill-me, монорепозиторий делится на 5 изолированных пакетов, а параллельный рой из 4 субагентов поднимает ядро за рекордные два часа.
Запись 00. Как родилась идея и почему не подошел просто Termius
⏱️ Время: 18 сентября 2026, 13:00 — 13:25 (~25 минут)Честно скажу: я не программист и не трачу время на ручную набивку кода со скобочками и классами — мой фокус лежит в системной архитектуре, пользовательских сценариях и логике продукта.
Поэтому, когда появились мощные современные нейросети, способные по четкому техническому описанию проектировать архитектуру и писать надежный софт, для меня это стало настоящим прорывом. Барьер между хорошей идеей в голове и готовым приложением на экране наконец-то растворился. Главное — мыслить системно: четко понимать логику, структуру данных, сценарии пользователей и направлять процесс как продуктовый архитектор.
Идея сделать собственный SSH-клиент назрела по вполне житейской причине. Каждый, кто администрирует серверы, держит домашнюю лабораторию или настраивает VPS, неизбежно сталкивается с выбором рабочего инструмента.
Я долго смотрел на популярный Termius и похожие утилиты. Продукт симпатичный, спору нет. Но при регулярной работе быстро бросаются в глаза слабые места:
- Слепые карточки хостов: Открываешь список из пары десятков серверов — и они все одинаково статичные. Сервер лежит? Пинг просел? Ошибся ли ты и зашел на боевой прод вместо тестовой виртуалки? Никакой внятной индикации.
- Ограниченность подходов: Либо плоская плитка, либо ничего. Когда хостов становится за 50+, скроллить эти карточки — сомнительное удовольствие. Нужна компактная таблица и дерево папок.
- Закрытость: Никаких сторонних расширений или плагинов. Нужен тебе простой монитор Docker-контейнеров в боковой панели — переключайся в консоль руками и пиши
docker ps.
В итоге я сел, набросал логику, выделил ключевые эргономические плюсы (сайдбар, удобный ввод, карточки) и сразу отсек слепое копирование. Так родилось видение будущего продукта: самостоятельный, быстрый инструмент с живой телеметрией доступности прямо на плитке, защитой от случайного ввода команд на проде, матричными сплитами экранов, командной палитрой Ctrl+K и открытыми плагинами на десктопе.
Запись 01. Почему мы начали с правил, а не побежали сразу кодить
⏱️ Время: 18 сентября 2026, 13:25 — 13:45 (~20 минут)Самый большой соблазн при работе с ИИ — сразу сказать: “Сделай мне красивый терминал!” Результат такого подхода всегда один: монолитная простыня кода на две тысячи строк, в которой через три дня путается даже сама нейросеть, а при попытке прикрутить базу данных всё приложение начинает рассыпаться.
Чтобы этого не произошло, мы сегодня заложили фундамент:
- Разбили проект на изолированные пакеты: Хранилище с шифрованием отдельно (
storage_vault), сетевой стек SSH отдельно (ssh_network_core), терминальный интерфейс отдельно (terminal_ui), плагины отдельно (desktop_plugin_sdk). - Связали всё через абстрактный слой контрактов (
core_foundation): Теперь над проектом могут параллельно трудиться разные специализированные субагенты. Сетевик не сломает базу данных, а верстальщик терминала не уронит шифрование AES-256. - Развернули живой трекер багов и банк идей: Ни одна найденная нестыковка не замнется, а хорошие задумки не потеряются в переписке.
Все регламенты и контракты готовы. Дальше переходим к сборке первого пакета core_foundation и запуску параллельных модулей.
Запись 02. Итоги большого интервью (/grill-me) и кристаллизация архитектуры Shellit
⏱️ Время: 18 сентября 2026, 13:45 — 14:15 (~30 минут)1. Повод: когда нейросети задают неудобные вопросы
Прежде чем бросаться писать код модулей, мы решили устроить проекту хорошую проверку на прочность. В вайб-кодинге есть опасная ловушка: кажется, что задумка в голове выглядит стройно, а начни реализовывать — всплывут десятки серых зон и архитектурных тупиков. Поэтому я запустил режим дотошного интервью /grill-me, чтобы ИИ выступил не услужливым исполнителем, а въедливым системным архитектором и продуктовым скептиком.
Мы по косточкам разобрали ключевые пользовательские сценарии, эргономику интерфейса и даже само позиционирование проекта.
2. Подводные камни: муки нейминга и медицинские ассоциации
Первый серьезный вопрос возник вокруг имени. Изначальный рабочий вариант «TermIt» казался понятным и лаконичным, но при проверке репозиториев пакетов выяснилось, что в мире Linux уже больше десяти лет существует легковесный VTE-терминал termit, давно прописавшийся в официальных репозиториях Debian и Ubuntu. Создавать коллизии с чужим пакетом и ломать поисковую выдачу с первого же дня — затея сомнительная.
Латинский termes сразу уводил мысль к биологическим термитам и древоточцам, а греческий корень termitis и вовсе отдавал медицинским привкусом воспалений и диагнозов. В итоге вышли на имя, которое легло как влитое — Shellit (причем именно со строчной ‘i’). Это плотное, звонкое слово и одновременно прямой призыв к действию («Shell it!» — «Запусти в шелле!»).
3. Логика решений с ИИ: разбираем спорные развилки
В ходе интервью мы прошлись по тем местам, где чаще всего срезаются опенсорсные терминалы, и довели логику интерфейса до ума:
- Двухпанельный SFTP в отдельной вкладке: SFTP открывается в самостоятельной вкладке с двумя полноценными панелями (локальная файловая система слева, удаленный сервер справа), поддержкой drag-and-drop, очередью передачи и встроенным редактором конфигурационных файлов.
- Матричные сплиты 2x2 и Broadcast-ввод: Сетка сплитов вплоть до матрицы 2x2 и режим синхронного ввода (Broadcast), когда команды с клавиатуры параллельно транслируются сразу во все открытые консоли. Незаменимая вещь для кластеров.
- Живой RTT-пинг на карточках хостов: Фоновый легковесный пинг замеряет round-trip time, отображая живую задержку в миллисекундах и аккуратный пульсирующий статус (зеленый, желтый или оффлайн) прямо в каталоге.
- Production Safety — защита от «rm -rf»: Если сервер помечен тегом
PROD, терминальная вкладка получает акцентную красную статусную рамку по периметру, а деструктивные команды перехватываются подтверждением.
4. Итог: команда в строю
- Foundation & Vault Agent — защищенное локальное хранилище Drift/SQLCipher и контракты ядра.
- SSH Network Core Agent — сетевой стек, стримы PTY, SFTP и туннелирование на
dartssh2. - Terminal UI Agent — эргономика интерфейса Flutter, мультиплексор сплитов, вкладки и темы.
- Desktop Plugin SDK Agent — платформа расширений и изолированный IPC для десктопа.
Запись 03. Триумф параллельной разработки: Ядро, Хранилище, Сеть и Плагины готовы (105 тестов из 105)
⏱️ Время: 18 сентября 2026, 14:15 — 14:40 (~25 минут)1. Повод: проверка боем для параллельного роя
В классической разработке модули делаются последовательно: сначала неделями пишут базу данных, потом сеть, потом мучительно сращивают их вместе. Я решил проверить другой подход: запустить специализированных агентов параллельно, дав каждому четко очерченную зону ответственности.
- Пока один субагент в
storage_vaultшлифовал шифрование Drift/SQLCipher, прикручивал KDF на Argon2id и настраивал затирание оперативной памяти (zeroize) после работы с секретами; - Второй в
ssh_network_coreна лету препарировал бинарные форматы ключей OpenSSH, потоки PTY и двухсторонний обмен по SFTP; - Третий в
desktop_plugin_sdkизолировал песочницу плагинов и жестко отсекал уязвимость Zip Slip.
2. Подводные камни: три бага, пойманных на месте
- BUG-001 (Нюансы архивов в
desktop_plugin_sdk): При реализации распаковщика пакетов.shell-pluginсвежая версия пакетаarchiveвнезапно не имела геттераentry.isDirectory. Оказалось, в библиотеке каталог определяется исключительно инверсией!entry.isFile. Поправили логику на лету. - BUG-002 (Неизменяемая память в
storage_vault): Безопасность требует, чтобы приватные ключи и мастер-пароли не болтались в оперативной памяти после расшифровки. МетодextractBytes()в библиотекеcryptographyвозвращал защищенное представлениеUnmodifiableUint8ListView, которое среда выполнения модифицировать напрямую запрещает. Перехватили исключение и занулили только честно выделенные мутабельные буферы. - BUG-003 (Привередливость
dartssh2и магия ECDSA): Библиотекаdartssh2категорически отказывалась принимать приватные ключи без пароля при передаче пустой строки — требовался строгийnull. А ключи формата OpenSSH для алгоритма ECDSA прятали тип кривой глубоко внутри wire-формата. Прикрутили чтение 4-байтных заголовков OpenSSH.
3. Итог: 105 из 105
- 105 юнит-тестов во всех пакетах ядра проходят со 100% успехом.
- Статический анализатор
dart analyzeвыдает образцовые 0 warnings, 0 errors. - Архитектура доказала полную жизнеспособность монорепозитория. Переходим к визуализации UI!