パッケージ
各ワークスペースパッケージには正確に 1 つの責任があり、依存関係は下方向のみを向きます。これによりモノレポは循環依存から解放されます。
依存関係の方向
コードは「下の」パッケージにのみ依存できます:
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 ID、Result、AppErrorエンベロープ、シークレット編集付きの構造化ロガー、タイムアウトとシグナルヘルパー、プロンプトマクロ。@neotavern/contracts— すべての API 入力と出力の TypeBox スキーマ。サーバーと Web が共有する唯一の情報源。手で重複させることはありません。@neotavern/db— SQLite: Drizzle スキーマ、マイグレーション、リポジトリ、FTS5 検索。データベースとやり取りする唯一のパッケージ。@neotavern/ui— Radix プリミティブ上に構築されたヘッドレスベースコンポーネント、デザイントークン、テーマが依存するdata-*フック。@neotavern/i18n— i18next のセットアップ、名前空間、enとruのリソース、マシンエラーコードをローカライズされたテキストにマップするエラーコードローカライザー。@neotavern/plugin-sdk— バージョン管理された Plugin SDK: マニフェストスキーマ、権限とケイパビリティ付与、プラグインがコンパイル対象とするフロントエンド・バックエンド API コントラクト。@neotavern/theme-sdk— Theme SDK: マニフェストスキーマ、トークン/コンポーネント/シェルのレベル、継承解決。@neotavern/provider-sdk— 統一プロバイダーアダプターコントラクトに加え、LLM、TTS、STT、画像プロバイダー用の組み込みアダプターとアダプターレジストリ。@neotavern/legacy-compat— レガシー互換レイヤー: SillyTavern 時代のスクリプト用のwindowグローバル、イベントバス、管理外 DOM アイランド。@neotavern/gestures— フレームワーク非依存の行ジェスチャー: コンテキストメニュー(右クリックと長押し)とドラッグ&ドロップの並べ替え認識。@neotavern/plugin-build— プラグインのビルドと公開パイプライン: 分析、署名、プラグインパッケージのビルド。
何がどこに置かれるか
- API シェイプ は常に
@neotavern/contractsから来ます。バックエンドとフロントエンドが同じ型を 2 回宣言することはありません。 - データベースアクセス は
@neotavern/dbリポジトリを通じてのみ行われます。プラグインコードが SQLite 接続を受け取ることはありません。 - プロバイダー動作 は
@neotavern/provider-sdkアダプターにあります。サーバーコアは、1 つの文書化された例外を除き、単一のプロバイダーの SDK に結合されません: Anthropic アダプターはベータサーフェスに公式 SDK を使用します。 - UI ビルディングブロック は
@neotavern/uiから来ます。アプリケーション画面はそれらを組み合わせます。フレームワーク非依存のジェスチャーは React の外でも再利用できるよう@neotavern/gesturesに残ります。
パッケージの追加
新しいパッケージには、目的、公開エントリポイント、依存関係、制約を述べた README.md が必要です — ドキュメントは実装の一部です。作成する前に、コードが既存のパッケージに収まらないかを確認してください。デフォルトの答えは「新しいパッケージは作らない」です。