Pakete
Jedes Workspace-Paket hat genau eine Verantwortung, und Abhängigkeiten zeigen nur nach unten, was das Monorepo zyklusfrei hält.
Abhängigkeitsrichtung
Code darf nur von Paketen „unterhalb" abhängen:
apps (server, web, desktop, plugin-runtime)
→ packages
→ shared, contracts (the floor)
server und web hängen von Paketen ab; Pakete hängen höchstens von
shared und contracts ab. Zyklische Abhängigkeiten sind verboten. Wenn
Sie neuen Code hinzufügen, legen Sie ihn in das engste Paket, das ihn
aufnehmen kann: Gemeinsame Helfer gehören zu @neotavern/shared, API-Formen zu
@neotavern/contracts, und alles Datenbankbezogene zu @neotavern/db.
Paketverantwortlichkeiten
@neotavern/shared— isomorphe Utilities ohne Laufzeitabhängigkeiten: UUIDv7-IDs,Result, derAppError-Envelope, ein strukturierter Logger mit Geheimnis-Redaktion, Timeout- und Signal-Helfer und Prompt-Makros.@neotavern/contracts— TypeBox-Schemata für jede API-Eingabe und -Ausgabe. Die einzige Quelle der Wahrheit, die Server und Web teilen; nie von Hand dupliziert.@neotavern/db— SQLite: das Drizzle-Schema, Migrationen, Repositories und FTS5-Suche. Das einzige Paket, das mit der Datenbank spricht.@neotavern/ui— Headless-Basiskomponenten auf Radix-Primitiven, Design-Tokens und diedata-*-Hooks, auf die Themes sich stützen.@neotavern/i18n— i18next-Setup, Namespaces,en- undru-Ressourcen und der Fehlercode-Lokalisierer, der Maschinen-Fehlercodes in lokalisierten Text übersetzt.@neotavern/plugin-sdk— das versionierte Plugin SDK: Manifest-Schema, Berechtigungen und Fähigkeitsgewährungen sowie die Frontend- und Backend-API-Verträge, gegen die Plugins kompilieren.@neotavern/theme-sdk— das Theme SDK: Manifest-Schema, die Token-/Komponenten-/Shell-Ebenen und die Vererbungsauflösung.@neotavern/provider-sdk— der einheitliche Anbieter-Adaptervertrag plus die integrierten Adapter für LLM-, TTS-, STT- und Bild-Anbieter sowie das Adapter-Registry.@neotavern/legacy-compat— die Legacy-Kompatibilitätsebene:window-Globals, den Ereignisbus und nicht verwaltete DOM-Inseln für Skripte aus der SillyTavern-Ära.@neotavern/gestures— framework-agnostische Zeilengesten: Kontextmenüs (Rechtsklick und langes Drücken) und Drag-and-Drop- Neuanordnungserkennung.@neotavern/plugin-build— die Plugin-Build- und Veröffentlichungspipeline: analysieren, signieren und Plugin-Pakete bauen.
Was wo lebt
- API-Formen kommen immer aus
@neotavern/contracts. Backend und Frontend deklarieren nie denselben Typ zweimal. - Datenbankzugriff erfolgt nur über die Repositories von
@neotavern/db. Plugin-Code erhält nie eine SQLite-Verbindung. - Anbieterverhalten lebt in den Adaptern von
@neotavern/provider-sdk. Der Serverkern ist an kein SDK eines einzelnen Anbieters gekoppelt, mit einer dokumentierten Ausnahme: Der Anthropic-Adapter verwendet das offizielle SDK für Beta-Oberflächen. - UI-Bausteine kommen aus
@neotavern/ui; Anwendungsbildschirme setzen sie zusammen. Framework-agnostische Gesten bleiben in@neotavern/gestures, damit sie außerhalb von React wiederverwendet werden können.
Ein Paket hinzufügen
Ein neues Paket benötigt eine README.md, die Zweck, öffentliche
Einstiegspunkte, Abhängigkeiten und Einschränkungen angibt — Dokumentation
ist Teil der Implementierung. Prüfen Sie vor der Erstellung, ob der Code in
ein bestehendes Paket passt; die Standardantwort lautet: kein neues Paket.