Перейти к основному содержимому

Пакеты

У каждого пакета рабочей области ровно одна обязанность, а зависимости направлены только вниз, что сохраняет монорепозиторий свободным от циклов.

Направление зависимостей

Код может зависеть только от пакетов «ниже» себя:

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, в котором указаны его назначение, публичные точки входа, зависимости и ограничения, — документация является частью реализации. Прежде чем создавать его, проверьте, подходит ли код в существующий пакет; ответ по умолчанию — нового пакета не нужно.