概要
普段, Webサービスのバックエンドの開発をしています.
worktreeごとにDBとPORTを作成し、他のagentと競合させない私のlocal開発環境と移行Promptを紹介します
(AIの進化は早く, アンチパターンになっていたらごめんね><)
個人的要件
- 作業ごとにworktreeを削除してもいいが、高速化やcontext保持のため使い回す(context節約)
- DBは共通にしたい(メモリがパンパンになる)
docker composeでも、露出するPORTを環境変数で与えたら同じようにできるはず
構成
<project>/
├── .bare/ # git bare repository(全worktreeの共有本体)
├── main/ # メインブランチ worktree
├── wt1/ # 作業用 worktree 1
├── wt2/ # 作業用 worktree 2
├── wt3/
├── wt4/
├── wt5/
└── <project>.code-workspace # VS Code workspace
AGENT_WORKTREE_IDで採番, wt1~5としています.
direnv でpath baseでAGENT_WORKTREE_IDを検出しています
# Auto-detect worktree ID from directory path
# Pattern: /wt{N}/ -> AGENT_WORKTREE_ID=N
if [[ "$PWD" =~ /wt([0-9]+)(/|$) ]]; then
export AGENT_WORKTREE_ID="${BASH_REMATCH[1]}"
export BACKEND_PORT="${AGENT_WORKTREE_ID}3000"
export REDIS_URL="redis://localhost:6379/${AGENT_WORKTREE_ID}"
export BACKEND_DEVELOPMENT_DATABASE_NAME="backend_${AGENT_WORKTREE_ID}_development"
export BACKEND_TEST_DATABASE_NAME="backend_${AGENT_WORKTREE_ID}_test"
worktreeの場合, PORTに AGENT_WORKTREE_IDのpreffixを追加します
mainが3000のとき, wt1は、13000, wt2は、23000
claude codeがdirenv, miseを読み込めない問題の解決
claude codeはdefault shellとは異なるbash環境を持っており、mise, direnvを読み込めない問題が発生します
(2026年3月に必要な設定で変わったらごめんね><)
❯ cat ~/.claude/settings.json
{
"env": {
"CLAUDE_ENV_FILE": "~/.claude/claude-env.sh"
}
}
❯ cat ~/.claude/claude-env.sh
# Claude Code 専用の環境設定ファイル
# CLAUDE_ENV_FILE に指定され、各 bash コマンドの前に自動で source される
# mise を bash で有効化(ツールのバージョン管理)
if command -v mise &>/dev/null; then
eval "$(mise activate bash 2>/dev/null)"
fi
# direnv でプロジェクトの .envrc を読み込む
if command -v direnv &>/dev/null; then
eval "$(direnv export bash 2>/dev/null)"
fi
作成prompt
PORTは環境によってい違うので調整してください!!
# Bare Repository + Worktree 並列開発環境セットアップ
あなたはプロジェクトの並列開発環境をセットアップするエージェントです。
以下の手順に従って、git bare clone + worktree構成を構築してください。
---
## 概要
1つのリポジトリに対して、bare cloneを中心に `main` + `wt1`〜`wt5` のworktreeを作成します。
各worktreeは独立したポート・DB・Redisを持ち、複数のAIエージェントまたは開発者が同時に独立して作業できます。
## ユーザーから受け取る情報
以下をユーザーに確認してください(未指定の場合はデフォルト値を使用):
| パラメータ | 説明 | デフォルト |
|---|---|---|
| `REPO_URL` | クローン対象のリポジトリURL | **必須** |
| `TARGET_DIR` | プロジェクトを配置するディレクトリ | リポジトリ名から自動決定 |
| `WT_COUNT` | worktree数 | `5` |
| サービス一覧 | プロジェクトで使うサービスとそのベースポート | ユーザーのプロジェクト構成に依存 |
---
## Step 1: Bare Clone + Worktree作成
"""bash
# 1. bare clone
mkdir -p <TARGET_DIR>
git clone --bare <REPO_URL> <TARGET_DIR>/.bare
# 2. fetch refspec設定(bare repoでもremote trackingが効くように)
git -C <TARGET_DIR>/.bare config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
git -C <TARGET_DIR>/.bare fetch origin
# 3. デフォルトブランチを確認
git -C <TARGET_DIR>/.bare symbolic-ref --short HEAD
# 4. main worktree作成
git -C <TARGET_DIR>/.bare worktree add <TARGET_DIR>/main <DEFAULT_BRANCH>
# 5. wt1〜wtN 作成(それぞれ一時ブランチで)
for i in $(seq 1 <WT_COUNT>); do
git -C <TARGET_DIR>/.bare worktree add -b "wt${i}/workspace" <TARGET_DIR>/wt${i} <DEFAULT_BRANCH>
done
"""
## Step 2: .envrc によるポート・DB・Redis分離
各worktreeに `.envrc` を配置します。**ポート分離の規約**:
"""
wt{N} のポート = {N}{ベースポート}
"""
例(ベースポートが3000の場合):
- wt1 → 13000
- wt2 → 23000
- wt3 → 33000
### .envrc テンプレート
各 `wt{N}/.envrc` に以下を配置してください。
**プロジェクト固有のサービスに合わせてカスタマイズが必要です。**
"""bash
# Auto-detect worktree ID from directory path
if [[ "$PWD" =~ /wt([0-9]+)(/|$) ]]; then
export WORKTREE_ID="${BASH_REMATCH[1]}"
# ============================================================
# ポート割り当て
# 規約: ${WORKTREE_ID}<base_port>
# ============================================================
# -- Backend --
export APP_PORT="${WORKTREE_ID}3000"
# -- Frontend(s) --
# export FRONTEND_PORT="${WORKTREE_ID}4000"
# export ADMIN_PORT="${WORKTREE_ID}4001"
# export STORYBOOK_PORT="${WORKTREE_ID}6006"
# -- Infra --
# export PC_PORT_NUM="${WORKTREE_ID}8080" # process-compose API
# ============================================================
# データベース分離
# 各worktreeが独立したDBを持つ
# ============================================================
export DATABASE_NAME="<project>_${WORKTREE_ID}_development"
export TEST_DATABASE_NAME="<project>_${WORKTREE_ID}_test"
# ============================================================
# Redis分離
# DB番号でworktreeごとに名前空間を分ける
# ============================================================
export REDIS_URL="redis://localhost:6379/${WORKTREE_ID}"
# ============================================================
# バックエンドURL(フロントエンドから参照)
# ============================================================
# export BACKEND_URL="http://localhost:${APP_PORT}"
echo "Worktree wt${WORKTREE_ID}: PORT=${APP_PORT} DB=${DATABASE_NAME} REDIS=db${WORKTREE_ID}"
fi
"""
### 重要なポイント
- `.envrc` は `direnv` で自動読み込みされる前提です。各worktreeで `direnv allow` を実行してください。
- ポート番号規約 `${WORKTREE_ID}<base_port>` により、wt1=1xxxx, wt2=2xxxx, ... でポート衝突を完全回避します。
- DBは名前で分離: `<project>_1_development`, `<project>_2_development`, ...
- Redisは論理DB番号で分離: `redis://localhost:6379/1`, `redis://localhost:6379/2`, ...
- S3/R2互換ストレージはバケット名で分離: `<project>-uploads-1`, `<project>-uploads-2`, ...
## Step 3: VS Code Workspace ファイル生成
`<TARGET_DIR>/<project>.code-workspace` を生成:
"""json
{
"folders": [
{ "name": "main", "path": "./main" },
{ "name": "wt1", "path": "./wt1" },
{ "name": "wt2", "path": "./wt2" },
{ "name": "wt3", "path": "./wt3" },
{ "name": "wt4", "path": "./wt4" },
{ "name": "wt5", "path": "./wt5" }
],
"settings": {
"files.exclude": {
"**/.bare": true,
"**/.git": true
}
}
}
"""
## Step 4: DB作成
各worktreeのDBを作成します。プロジェクトのDB種別に応じて実行:
### PostgreSQL の場合
"""bash
for i in $(seq 1 <WT_COUNT>); do
createdb "<project>_${i}_development" 2>/dev/null || true
createdb "<project>_${i}_test" 2>/dev/null || true
done
"""
### Rails の場合
"""bash
for i in $(seq 1 <WT_COUNT>); do
cd <TARGET_DIR>/wt${i}
direnv allow
bin/rails db:create db:migrate db:seed
done
"""
### Prisma の場合
"""bash
for i in $(seq 1 <WT_COUNT>); do
cd <TARGET_DIR>/wt${i}
direnv allow
npx prisma db push
npx prisma db seed
done
"""
## Step 5: 検証
セットアップ完了後、以下を確認:
"""bash
# worktreeが正しく作成されたか
git -C <TARGET_DIR>/.bare worktree list
# .envrcが各worktreeにあるか
ls -la <TARGET_DIR>/wt*/.envrc
# ポートが正しく割り当てられるか(wt1で確認)
cd <TARGET_DIR>/wt1
direnv allow
echo "PORT=$APP_PORT DB=$DATABASE_NAME REDIS=$REDIS_URL"
"""
---
## 最終的なディレクトリ構成
"""
<project>/
├── .bare/ # git bare repository(全worktreeの共有本体)
├── main/ # メインブランチ worktree
│ └── .envrc # (mainはworktree検出されないのでデフォルト値)
├── wt1/ # 作業用 worktree 1
│ └── .envrc # PORT=1xxxx, DB=*_1_dev, Redis=db1
├── wt2/ # 作業用 worktree 2
│ └── .envrc # PORT=2xxxx, DB=*_2_dev, Redis=db2
├── wt3/
│ └── .envrc
├── wt4/
│ └── .envrc
├── wt5/
│ └── .envrc
└── <project>.code-workspace # VS Code workspace
"""
## 運用ルール
1. **ブランチ命名**: `agent/{N}/{YYYYMMDD}-{feature}` (例: `agent/3/20260320-add-login`)
2. **mainは直接編集しない**: mainはpull/確認用。作業は必ずwt1〜wt5で行う
3. **worktreeでgit switch mainは不可**: mainは別のworktreeが使用中のため。代わりに `git merge origin/main` や `git rebase origin/main` を使う
4. **direnv allowを忘れずに**: 新しいworktreeや.envrc変更後は必ず実行
5. **DB migrationは各worktreeで個別実行**: DBが分離されているため