Пакеты
У каждого пакета рабочей области ровно одна обязанность, а зависимости направлены только вниз, что сохраняет монорепозиторий свободным от циклов.
Направление зависимостей
Код может зависеть только от пакетов «ниже» себя:
apps (server, web, desktop, plugin-runtime)
→ packages
→ shared, contracts (the floor)
server и web зависят от пакетов; пакеты зависят максимум от shared и
contracts. Циклические зависимости запрещены. Добавляя новый код,
помещайте его в самый узкий пакет, который может его разместить: общие
хелперы — в @neotavern/shared, формы API — в @neotavern/contracts, а всё, что
связано с базой данных, — в @neotavern/db.
Обязанности пакетов
@neotavern/shared— изоморфные утилиты без зависимостей рантайма: UUIDv7- идентификаторы,Result, конвертAppError, структурированный логгер с редактированием секретов, хелперы таймаутов и сигналов, макросы промптов.@neotavern/contracts— TypeBox-схемы для каждого входа и выхода API. Единый источник истины, общий для сервера и веб-клиента; никогда не дублируется вручную.@neotavern/db— SQLite: схема Drizzle, миграции, репозитории и поиск FTS5. Единственный пакет, который общается с базой данных.@neotavern/ui— бесголовые базовые компоненты на примитивах Radix, дизайн- токены и хукиdata-*, на которые опираются темы.@neotavern/i18n— настройка i18next, пространства имён, ресурсыenиruи локализатор кодов ошибок, сопоставляющий машинные коды с локализованным текстом.@neotavern/plugin-sdk— версионируемый Plugin SDK: схема манифеста, разрешения и выдачи возможностей, а также frontend- и backend-контракты API, против которых компилируются плагины.@neotavern/theme-sdk— Theme SDK: схема манифеста, уровни токены/компоненты/оболочка и разрешение наследования.@neotavern/provider-sdk— единый контракт адаптера провайдера плюс встроенные адаптеры для LLM, TTS, STT и изображений, а также реестр адаптеров.@neotavern/legacy-compat— слой совместимости с наследием: глобальные объектыwindow, шина событий и неуправляемые DOM-островки для скриптов эпохи SillyTavern.@neotavern/gestures— независимые от фреймворка жесты строк: контекстные меню (правый клик и долгое нажатие) и распознавание перестановок перетаскиванием.@neotavern/plugin-build— конвейер сборки и публикации плагинов: анализ, подпись и сборка пакетов плагинов.
Что где живёт
- Формы API всегда берутся из
@neotavern/contracts. Backend и фронтенд никогда не объявляют один тип дважды. - Доступ к базе данных осуществляется только через репозитории
@neotavern/db. Код плагинов никогда не получает соединение SQLite. - Поведение провайдеров живёт в адаптерах
@neotavern/provider-sdk. Ядро сервера не связано ни с одним SDK конкретного провайдера, с одним документированным исключением: адаптер Anthropic использует официальный SDK для бета-поверхностей. - Строительные блоки UI берутся из
@neotavern/ui; экраны приложения их компонуют. Независимые от фреймворка жесты остаются в@neotavern/gestures, чтобы их можно было переиспользовать вне React.
Добавление пакета
Новому пакету нужен README.md, в котором указаны его назначение,
публичные точки входа, зависимости и ограничения, — документация является
частью реализации. Прежде чем создавать его, проверьте, подходит ли код в
существующий пакет; ответ по умолчанию — нового пакета не нужно.