Aller au contenu principal

Packages

Chaque package de l'espace de travail a exactement une responsabilité, et les dépendances ne pointent que vers le bas, ce qui garde le monorepo exempt de cycles.

Direction des Dépendances

Le code ne peut dépendre que des packages « en dessous » de lui :

apps (server, web, desktop, plugin-runtime)
→ packages
→ shared, contracts (le socle)

server et web dépendent des packages ; les packages dépendent au plus de shared et contracts. Les dépendances cycliques sont interdites. Quand vous ajoutez du nouveau code, placez-le dans le package le plus étroit qui peut l'héberger : les utilitaires partagés vont dans @neotavern/shared, les formes d'API dans @neotavern/contracts, et tout ce qui touche à la base de données dans @neotavern/db.

Responsabilités des Packages

  • @neotavern/shared — utilitaires isomorphes sans dépendances de runtime : IDs UUIDv7, Result, l'enveloppe AppError, un logger structuré avec expurgation des secrets, des utilitaires de délai et de signal, et les macros de prompt.
  • @neotavern/contracts — schémas TypeBox pour chaque entrée et sortie d'API. La source unique de vérité partagée entre le serveur et le web ; jamais dupliquée à la main.
  • @neotavern/db — SQLite : le schéma Drizzle, les migrations, les dépôts et la recherche FTS5. Le seul package qui parle à la base de données.
  • @neotavern/ui — composants de base headless construits sur les primitives Radix, les design tokens et les hooks data-* sur lesquels les thèmes s'appuient.
  • @neotavern/i18n — configuration i18next, espaces de noms, ressources en et ru, et le localiseur de codes d'erreur qui mappe les codes machine aux textes localisés.
  • @neotavern/plugin-sdk — le Plugin SDK versionné : schéma de manifeste, permissions et octrois de capacités, et les contrats d'API frontend et backend contre lesquels les plugins compilent.
  • @neotavern/theme-sdk — le Theme SDK : schéma de manifeste, les niveaux jeton/composant/shell et la résolution d'héritage.
  • @neotavern/provider-sdk — le contrat d'adaptateur de fournisseur unifié plus les adaptateurs intégrés pour les fournisseurs LLM, TTS, STT et d'images, et le registre d'adaptateurs.
  • @neotavern/legacy-compat — la couche de compatibilité héritée : globals window, le bus d'événements et les îlots DOM non gérés pour les scripts de l'ère SillyTavern.
  • @neotavern/gestures — gestes de lignes indépendants du framework : menus contextuels (clic droit et appui long) et reconnaissance de réorganisation par glisser-déposer.
  • @neotavern/plugin-build — le pipeline de build et de publication des plugins : analyser, signer et construire les packages de plugins.

Ce Qui Va Où

  • Les formes d'API viennent toujours de @neotavern/contracts. Le backend et le frontend ne déclarent jamais deux fois le même type.
  • L'accès à la base de données passe uniquement par les dépôts de @neotavern/db. Le code de plugin ne reçoit jamais de connexion SQLite.
  • Le comportement des fournisseurs vit dans les adaptateurs de @neotavern/provider-sdk. Le cœur du serveur n'est couplé au SDK d'aucun fournisseur, avec une exception documentée : l'adaptateur Anthropic utilise le SDK officiel pour les surfaces bêta.
  • Les blocs de construction d'interface viennent de @neotavern/ui ; les écrans de l'application les composent. Les gestes indépendants du framework restent dans @neotavern/gestures pour pouvoir être réutilisés en dehors de React.

Ajouter un Package

Un nouveau package a besoin d'un README.md qui énonce son but, ses points d'entrée publics, ses dépendances et ses contraintes — la documentation fait partie de l'implémentation. Avant d'en créer un, vérifiez si le code s'adapte à un package existant ; la réponse par défaut est pas de nouveau package.