並列リソース分離
概要
同じプロジェクトで動作する複数のClaudeインスタンスは、ポート、データベース、ブラウザインスタンスで競合します。このスキルは、事前検出と静かな適応を行います — 使用中のリソースを確認し、別のものを選び、選択した内容を報告します。
基本原則: システムの状態を観察し、静かに適応し、ターミナルに報告する。調整ファイルもロックファイルも共有状態も必要ありません。
使用タイミング
以下のアクションの前に、必ず検出チェックを実行してください:
- 開発サーバーの起動 (
next dev,npm run dev) - Playwright e2eテストの実行
- データベースへの書き込みやアサーションを含むテストの実行
ポート分離 (開発サーバー)
開発サーバーを起動する前に:
lsof -i :3000 -t 2>/dev/null
使用中の場合は、空きポートが見つかるまで上位(3001, 3002, ...)をスキャンします。次のコマンドで起動:
PORT=<free_port> next dev
webServer設定を使用したPlaywright:
- 環境変数でポートを上書きし、同じポートを
baseURLに渡す - 環境変数によるポート上書きがサポートされていない場合はユーザーに通知する — 設定ファイルは変更しないでください
webServerを使用しないPlaywright(外部サーバー):
- 空きポートで開発サーバーを起動
- 上書きしたbaseURLでPlaywrightを実行:
BASE_URL=http://localhost:<free_port> npx playwright test
Playwright設定にハードコードされたbaseURL(よくあるケース):
多くの設定では、環境変数から読み取らずbaseURL: 'http://localhost:3000'とハードコードされています。その場合、BASE_URL=...は機能しません。以下の正確な修正をユーザーに通知してください:
playwright.config.tsにハードコードされたbaseURLがあります。次のように更新してください:baseURL: process.env.BASE_URL || 'http://localhost:3000'こうすることで、設定ファイルを変更せずに環境変数でポートを上書きできるようになります。
データベース分離 (Supabase)
データベースへの書き込みやアサーションを含むテストを実行する前に:
- 分離が必要かどうかを判断:
- 読み取りのみ → データベースを共有、分離はスキップ
- 書き込み / 変更 / データベース状態のアサーション → 分離する
- タイムスタンプベースのスキーマプレフィックスを生成:
parallel_<epoch>_(例:parallel_1741234567_) - 分離されたスキーマを作成し、マイグレーションを実行:
psql "$DATABASE_URL" -c "CREATE SCHEMA parallel_1741234567_;"
PGOPTIONS="--search_path=parallel_1741234567_" npx supabase db push
- 環境変数でアプリケーションを分離スキーマにポイント:
SUPABASE_SCHEMA=parallel_1741234567_ npx playwright test
- テスト完了後: スキーマを削除:
psql "$DATABASE_URL" -c "DROP SCHEMA parallel_1741234567_ CASCADE;"
Playwrightブラウザ分離
Playwrightテストを実行する前に:
- 競合する可能性のある実行中のPlaywrightブラウザプロセスをチェック
- ブラウザの状態を分離し、ロック競合を回避 — 次のいずれかの方法を使用:
TMPDIR=/tmp/playwright_<epoch> npx playwright test
または、より的を絞ってブラウザパスのみを分離:
PLAYWRIGHT_BROWSERS_PATH=/tmp/pw_browsers_<epoch> npx playwright install chromium
PLAYWRIGHT_BROWSERS_PATH=/tmp/pw_browsers_<epoch> npx playwright test
- Playwrightインスタンスが上記のポート分離で割り当てられたものと同じポートをターゲットにしていることを確認
報告
適応後、一度だけ報告し、先に進みます:
⚡ 並列分離:
開発サーバー: ポート3005(3000は使用中でした)
DBスキーマ: parallel_1741234567_
Playwright: /tmp/playwright_1741234567
実際に適応したリソースのみを報告します。競合がなければ、何も言いません。
クイックリファレンス
| リソース | 検出 | 適応 | 後始末 |
|---|---|---|---|
| 開発サーバーポート | lsof -i :<port> | PORT=<next_free> | 不要 |
| Supabase DB | テストが書き込み/アサーションを行うか確認 | parallel_<epoch>_ スキーマ | テスト後にスキーマを削除 |
| Playwrightブラウザ | ロック競合を確認 | TMPDIR または PLAYWRIGHT_BROWSERS_PATH | テンポラリディレクトリは自動クリーンアップ |
よくある間違い
他のClaudeのプロセスを強制終了する
- 問題: ポート3000が使用中のため、プロセスを強制終了して解放してしまう
- 修正: 自分が起動していないプロセスは絶対に強制終了しない。別のポートを選んでください。
ポート上書きのために設定ファイルを変更する
- 問題:
playwright.config.tsやnext.config.jsを編集するとgitコンフリクトが発生する - 修正: 環境変数を使用する。環境変数が機能しない場合は、ユーザーに通知する。
適応したポートをPlaywrightに渡し忘れる
- 問題: 開発サーバーは3005、Playwrightは依然として3000にアクセスする
- 修正: 常に連携する — 開発サーバーに割り当てられたポートを
BASE_URLとしてPlaywrightに渡す必要があります。
不要なデータベース分離
- 問題: 読み取り専用テストでスキーマ作成のオーバーヘッドが発生する
- 修正: テストがデータベースに書き込んだりアサーションを行う場合にのみ分離する。
レッドフラグ
絶対にしないこと:
- リソースを解放するために別のプロセスを強制終了する
- 設定ファイルを変更してポートを変える
- ポート競合を無視して「どうにかなるだろう」と期待する
- テスト後のデータベース後始末をスキップする
常に行うこと:
- 開始前に確認する
- 環境変数で静かに適応する
- 選択した内容を報告する
- テスト後にDBスキーマを後始末する