メインコンテンツまでスキップ

パッケージ

各ワークスペースパッケージには正確に 1 つの責任があり、依存関係は下方向のみを向きます。これによりモノレポは循環依存から解放されます。

依存関係の方向

コードは「下の」パッケージにのみ依存できます:

apps (server, web, desktop, plugin-runtime)
→ packages
→ shared, contracts (the floor)

serverweb はパッケージに依存し、パッケージはせいぜい sharedcontracts に依存します。循環依存は禁止されています。新しいコードを追加するときは、それをホストできる最も狭いパッケージに置いてください: 共有ヘルパーは @neotavern/shared へ、API シェイプは @neotavern/contracts へ、データベース関連はすべて @neotavern/db へ。

パッケージの責任

  • @neotavern/shared — ランタイム依存ゼロの同型ユーティリティ: UUIDv7 ID、ResultAppError エンベロープ、シークレット編集付きの構造化ロガー、タイムアウトとシグナルヘルパー、プロンプトマクロ。
  • @neotavern/contracts — すべての API 入力と出力の TypeBox スキーマ。サーバーと Web が共有する唯一の情報源。手で重複させることはありません。
  • @neotavern/db — SQLite: Drizzle スキーマ、マイグレーション、リポジトリ、FTS5 検索。データベースとやり取りする唯一のパッケージ。
  • @neotavern/ui — Radix プリミティブ上に構築されたヘッドレスベースコンポーネント、デザイントークン、テーマが依存する data-* フック。
  • @neotavern/i18n — i18next のセットアップ、名前空間、enru のリソース、マシンエラーコードをローカライズされたテキストにマップするエラーコードローカライザー。
  • @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 が必要です — ドキュメントは実装の一部です。作成する前に、コードが既存のパッケージに収まらないかを確認してください。デフォルトの答えは「新しいパッケージは作らない」です。