monorepo について
monorepo のスクリプト規約、ローカル開発手順、パッケージ構成を説明するリポジトリスキルです。各パッケージで一貫した作業を行うコントリビューター向けです。
主な機能
- 01フォーマットと lint のスクリプト
- 02型チェックとテストコマンド
- 03ローカル開発スクリプトの規約
- 04新規パッケージの構成ガイド
活用シーン
- 01CI 前にチェックを実行
- 02リポジトリルートからアプリを起動
- 03packages/ にパッケージを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ epicenterhq/ epicenter --skill monorepoインストール後、Claude Code で/monorepoを入力して読み込まれたか確認します。
詳細
スクリプトコマンド
モノレポでは、一貫したスクリプトの命名規則を使用しています。
コマンド
| コマンド | 目的 | 使用するタイミング |
|---|---|---|
bun format | フォーマットを修正します(biome) | 開発 |
bun format:check | フォーマットを確認します | CI |
bun lint | lint の問題を修正します(biome) | 開発 |
bun lint:check | lint の問題を確認します | CI |
bun typecheck | 型チェック(tsc、svelte-check、astro check) | 両方 |
bun test | 単体テストを実行します(*.test.ts のみ) | 両方 |
bun bench | ベンチマークを実行します(*.bench.ts。レポートを出力し、アサーションは行いません) | 手動 |
規則
- サフィックスなし = 修正(ファイルを変更します)
:checkサフィックス = チェックのみ(CI 用。変更は行いません)typecheck単体 = 型チェック(別の用途であり、自動修正できません)testは*.test.tsのみを実行し、benchは*.bench.tsのみを実行します。ファイルはどちらか一方であり、両方にはなりません。ベンチマークはレポートを出力し、テストはアサーションを行います。
開発スクリプト
アプリはアプリのディレクトリに移動せず、リポジトリのルートから起動してください。ルートの
bun dev:<app> は、アプリに必要なすべてのプロセスを実行します。ホスト型 API と通信するアプリ(honeycrisp、vocab、whispering、
および api dashboard)では、bun run --filter を使って localhost:8787 で
@epicenter/api も起動します。ルートの bun dev:<app>:ui は、その分割がある場合にアプリのフロントエンドのみを実行します。Tauri アプリの場合は、パッケージの
dev:web に対応します。bun dev:api はバックエンドのみを実行します。Local Books、Local Mail、
Super Chat には、それぞれの README に記載された独自の複数プロセスの起動手順があります。
これらにはルートの dev:* ターゲットはありません。
単一のパッケージ内では、次の規則に従います。
Tauri を使わないアプリでは、基盤となるツールを直接実行する単一の dev スクリプトを使用します
(vite dev、astro dev、wrangler dev)。Tauri デスクトップアプリ
(honeycrisp、whispering、matter)には、2 つの開発環境があり、明示的に名前を付けています。
dev はデスクトップシェルを起動し(dev:desktop のエイリアスです)、dev:web は Vite のみを実行します。各アプリの tauri.conf.json がこれを
beforeDevCommand として呼び出します。サフィックスの規則は、主にデータベースコマンドに適用されます。
| スクリプト | 意味 |
|---|---|
dev | デフォルトのローカルワークフローです。アプリのシークレット(API キーなど)を使うために Infisical へのログインが必要な場合がありますが、実行時に通信するのは常にローカルのインフラストラクチャのみです。 |
dev:web | Tauri アプリの場合、デスクトップシェルを起動せずに Vite 開発サーバーのみを実行します。tauri.conf.json から beforeDevCommand として呼び出されます。 |
dev:desktop | Tauri アプリの場合、ネイティブデスクトップアプリを起動します(tauri dev)。dev はこれのエイリアスです。 |
db:*:local | ローカルの Postgres に対して実行します。Infisical へのログインなしで動作します。 |
db:*:remote | infisical run --env=prod をラップして実行します。本番データを扱うため、管理者として慎重に扱ってください。 |
dev:remote はありません。本番データにアクセスするのは :remote の db
スクリプトと deploy に限られ、開発サーバーからアクセスすることはありません。
コード変更の完了後
型チェックを実行して検証します。
bun typecheck
これは bun run --filter '*' typecheck を実行し、各パッケージの typecheck スクリプト(例:tsc --noEmit、svelte-check)を実行します。
新しいパッケージのひな形
packages/ に新しいパッケージを作成する場合は、この構成に正確に従ってください。
package.json
{
"name": "@epicenter/<package-name>",
"version": "0.0.1",
"exports": {
".": "./src/index.ts"
},
"license": "AGPL-3.0-or-later",
"scripts": {
"typecheck": "tsc --noEmit"
},
"dependencies": {},
"devDependencies": {
"@types/bun": "catalog:",
"typescript": "catalog:"
}
}
主な規約:
exportsのみを使用し、main/typesは使用しません。exportsが存在する場合、最新のリゾルバーはmain/typesを無視します。エントリーポイントは./src/index.tsです。ビルド手順はなく、利用側はソースを直接インポートします。- 内部依存関係には
"workspace:*"を使用します(例:"@epicenter/workspace": "workspace:*")。 - ルートの
package.jsonカタログで管理される共有バージョンには"catalog:"を使用します。 - 利用側でもインストールする必要があるパッケージには
peerDependenciesを使用します(例:yjs)。 license:デフォルトはAGPL-3.0-or-laterです(Epicenter が提供または実行するすべてのもの)。MITを使用するのは、サードパーティの開発者が自身のソフトウェアに組み込むことを想定したパッケージ(ツールキット)のみです。docs/licensing/licensing-strategy.mdを参照してください。MIT パッケージから AGPL パッケージに到達できる場合、bun run check:licensesは失敗します。
tsconfig.json
末端の設定では、1 つの階層を選び、ベース設定と重複する内容を追加しません。Bun ライブラリの場合:
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"types": ["bun"],
"noUnusedLocals": true,
"noUnusedParameters": true
}
}
Svelte またはブラウザー向けライブラリでは、代わりに ../../tsconfig.dom.json を継承します。8 つすべての末端階層、再宣言してはならない項目の一覧、およびモジュール戦略については、tsconfig スキルを参照してください。
パッケージを作成したら、リポジトリのルートで bun install を実行し、ワークスペースに登録します。