モノレポはClaude Codeが最も効果を発揮しにくい環境のひとつです。複数のパッケージにまたがるコードベース、パッケージ間の依存関係、それぞれ異なる技術スタック——これらを適切にコンテキストとして伝えないと、Claude Codeが엉뚱なパッケージを操作したり、古い記法で設定ファイルを生成したりします。
この記事では、Turborepo・Nxを使ったモノレポ環境でClaude Codeを最大限活用するための実践的な方法を解説します。コピペ即使えるCLAUDE.md階層テンプレート・turbo.json設定・クロスパッケージ書き込み防止フック・GitHub Actions連携まで、設定ファイル込みで紹介します。
モノレポでClaude Codeが失敗しやすい理由
モノレポ特有の問題として、Claude Codeが以下のような誤操作をしやすいです。
- スコープ外のパッケージを変更する:
packages/apiの作業中にpackages/uiやpackages/sharedを勝手に変更する - 古いturbo.jsonの記法を使う: Turborepo v2以降は
pipeline→tasksに変更されたが、古い記法で生成してしまう - パッケージをまたいだimportを生成する: 共有型パッケージを経由せず直接importする(循環依存の原因に)
- コンテキストが肥大化する: すべてのCLAUDE.mdを読み込み続けてトークンを無駄消費する
これらは「CLAUDE.mdの階層設計」と「フックによるパス制限」で大部分が防げます。
CLAUDE.md 階層設計パターン ── 4層構造が基本
モノレポでは、CLAUDE.mdをどこに置くかによってClaude Codeの動作が変わります。公式の仕様では、カレントディレクトリから上方向に走査してすべてのCLAUDE.mdを読み込みます。サブディレクトリのCLAUDE.mdは「そのディレクトリのファイルを操作したとき」に遅延ロードされます。
my-monorepo/
├── CLAUDE.md # 全体共通ルール(常時ロード)
├── .claude/
│ └── rules/
│ ├── code-style.md # コーディング規約(常時ロード)
│ └── api-design.md # APIルール(paths指定で遅延ロード)
├── apps/
│ └── web/
│ └── CLAUDE.md # Next.js専用ルール(遅延ロード)
└── packages/
├── ui/
│ └── CLAUDE.md # UIライブラリルール(遅延ロード)
├── api/
│ └── CLAUDE.md # API固有ルール(遅延ロード)
└── shared/
└── CLAUDE.md # 共有型・変更制限(遅延ロード)
ルートCLAUDE.md ── 全体共通ルール
# Monorepo 共通ルール ## ビルドシステム - パッケージマネージャ: pnpm - ビルドシステム: Turborepo(turbo.jsonのtasksキーを使う。pipelineは旧記法) - タスク実行: turbo run build / test / lint - 特定パッケージ: pnpm --filter=@myapp/api run build ## 命名規則 - パッケージ名: @myapp/<name>(スコープ付き) - 内部import: @myapp/shared(相対パスでの他パッケージ参照禁止) ## パッケージ間のルール - 共有型・ユーティリティは必ず packages/shared 経由 - packages/shared を変更する際はチーム承認が必要(勝手に変更しない) - パッケージ間の循環依存は禁止 ## Claude Codeへの指示 - 作業ディレクトリ外のファイルは変更しない - pnpm --filter=<package> でパッケージ限定コマンドを実行する - turbo run build で全体のビルド確認をする ## 個人設定 @~/.claude/my-monorepo-preferences.md
パッケージ固有CLAUDE.md ── スコープを明示する
# API パッケージルール ## スタック - Express + Prisma + TypeScript strict ## アーキテクチャ - router → controller → service → repository の4層 - ビジネスロジックは service 層のみ ## 作業スコープ(重要) - 変更可能: packages/api/ 以下のファイルのみ - 変更禁止: packages/ui/, apps/web/, packages/shared/ - packages/shared の型が不足している場合: 変更せず上位に報告する ## コマンド - 開発サーバー: pnpm --filter=@myapp/api dev - テスト: pnpm --filter=@myapp/api test - 型チェック: pnpm --filter=@myapp/api typecheck
# UI パッケージルール ## スタック - React + TypeScript + Tailwind CSS v4 - shadcn/ui(CLIでインストール。直接編集禁止) ## コンポーネントルール - Server Components は apps/ 配下のみ(このパッケージはクライアントコンポーネント専用) - すべてのコンポーネントに型定義ファイルを追加する - アクセシビリティ属性(aria-*)を必ず含める ## エクスポート - index.tsからのみエクスポート(内部ファイルの直接import禁止) ## 作業スコープ - 変更可能: packages/ui/ 以下のファイルのみ - apps/ 配下のファイルは変更しない
.claude/rules/ のパス指定スコープ ── 必要なときだけロード
.claude/rules/ 配下にフロントマターでpathsを指定すると、そのパスのファイルを操作したときだけルールが読み込まれます。常時ロードを減らしてコンテキストを節約できます。
---
paths:
- "packages/api/src/routes/**/*.ts"
- "packages/api/src/controllers/**/*.ts"
---
# API設計ルール(APIファイル操作時のみロード)
## エンドポイント設計
- RESTful原則に従う(GETはデータ取得のみ、変更はPOST/PUT/DELETE)
- バージョニング: /api/v1/...
- レスポンス形式: { data: T, error: null } または { data: null, error: string }
## バリデーション
- すべてのエンドポイントにZodバリデーション必須
- リクエストボディ・クエリパラメータ・パスパラメータを個別にバリデート
claudeMdExcludes設定で他チームのCLAUDE.mdを排除できます。.claude/settings.local.jsonに"claudeMdExcludes": ["**/other-team/.claude/rules/**"]と書くだけです。CLAUDE.mdの詳しい書き方はCLAUDE.md完全ガイドで解説しています。
Turborepoの設定をClaude Codeで管理する
turbo.json 生成プロンプト
turbo.jsonを生成してください。 構成: - apps/web: Next.js 16 - apps/admin: Vite + React - packages/ui: 共有コンポーネント - packages/api: Express + Prisma 要件: - buildは依存パッケージのbuild完了後に実行(^buildで宣言) - devはキャッシュなし・永続化 - testはsrc/**とtest/**のみ変更検知 - Next.jsのoutputは.next/**(キャッシュ除く) - Turbopack v2の最新記法(pipeline→tasks)を使う
{
"$schema": "https://turborepo.org/schema.json",
"globalEnv": ["NODE_ENV", "GITHUB_TOKEN"],
"globalDependencies": [".env"],
"tasks": {
"build": {
"description": "本番ビルド",
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL", "API_KEY"]
},
"dev": {
"cache": false,
"persistent": true
},
"lint": {
"outputs": []
},
"test": {
"inputs": ["src/**/*.ts", "test/**/*.ts"],
"outputs": ["coverage/**"]
}
},
"remoteCache": {
"enabled": true,
"signature": true
}
}
pipelineキーがtasksに変わりました。Claude Codeのトレーニングデータに古い記法が多く含まれているため、CLAUDE.mdに「turbo.jsonはtasksキーを使う(pipelineは旧記法)」と明記することが重要です。パッケージ固有のturbo.json継承
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": [".next/**", "!.next/cache/**"]
}
}
}
pnpm workspace設定
packages: - "apps/*" - "packages/*"
{
"name": "my-monorepo",
"private": true,
"packageManager": "pnpm@9.0.0",
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"lint": "turbo run lint",
"test": "turbo run test"
},
"devDependencies": {
"turbo": "latest"
}
}
特定パッケージだけClaude Codeに操作させる
# packages/api ディレクトリで起動(このパッケージのコンテキストのみ) cd packages/api claude # 起動後にセッション開始プロンプト > packages/api 内の作業のみ行います。 > 他パッケージのファイルは変更しないでください。 > コマンド実行は pnpm --filter=@myapp/api <cmd> を使ってください。
.claude/設定が読み込まれないことがあります。--add-dir ../../フラグでルートディレクトリを追加すると回避できます。NxでのClaude Code活用 ── ワンコマンドで設定完了
Nxは2026年時点でClaude Code向けの公式サポートが充実しています。
# Nx CLIがClaude Code向け設定を全自動生成 npx nx configure-ai-agents # 生成されるもの: # - .mcp.json(Nx Cloud MCPサーバー設定) # - CLAUDE.md / AGENTS.md(Nx操作ガイドライン) # - Claude Code Skill(nx show projects・nx graphの使い方)
TurborepoとNxの選択基準
| 観点 | Turborepo | Nx |
|---|---|---|
| 起動速度 | 約1.5秒(Rustバイナリ) | 約3秒(Node.js) |
| 設定の複雑さ | 低(turbo.json 1ファイル) | 高(nx.json + project.json) |
| コード生成 | なし | あり(Nxジェネレーター) |
| モジュール境界強制 | なし | あり(ESLintルール) |
| Claude Code公式対応 | Skill追加中 | 公式Claude Code Skill・MCP提供済み |
| 向いているチーム規模 | 3〜15人 | 15人以上 |
# 変更されたパッケージとその依存先のテストのみ実行 npx nx affected:test # 依存グラフをビジュアル確認 npx nx graph # Claude Codeにaffectedを使って指示 > nx affected:testを実行して、失敗したテストの原因を特定して修正してください
クロスパッケージ書き込みをフックで防止する
Claude Codeが作業スコープ外のパッケージを変更するリスクを、PreToolUseフックで自動的にブロックできます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "bash -c \'FILE=$(echo \"$CLAUDE_TOOL_INPUT\" | jq -r \".file_path // empty\"); CWD=$(pwd); if [[ -n \"$FILE\" ]] && [[ \"$FILE\" == */packages/shared/* ]] && [[ \"$CWD\" != */packages/shared* ]]; then echo \"ERROR: packages/shared への直接変更は禁止されています。変更が必要な場合は確認してください。\" >&2; exit 2; fi\'"
}
]
}
]
}
}
より簡易な設定として、CLAUDE.mdにスコープ宣言を書く方法もあります。
# packages/api/CLAUDE.md に追記 ## 作業スコープ制限(IMPORTANT) - ONLY modify files under: packages/api/ - NEVER touch: packages/shared/, packages/ui/, apps/ - If shared types need updating: describe what's needed but DO NOT edit directly
フックの詳しい使い方はClaude Code Hooks完全ガイドで解説しています。
GitHub Actions + Turborepoキャッシュでビルドを高速化
Turborepoのリモートキャッシュを使ったCI/CD設定です。キャッシュが効いた場合、ビルド時間を50〜58%削減できた事例があります。
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
build-test:
runs-on: ubuntu-latest
env:
# Vercel Remote Cache を使う場合
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
# Vercel不使用の場合はローカルキャッシュで代替
- name: Cache turbo build
uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-
- name: Build & Test
run: pnpm turbo run build test lint
パス変更でAffectedビルドを実現
name: Deploy Web
on:
push:
branches: [main]
paths:
- "apps/web/**"
- "packages/ui/**"
- "packages/shared/**"
- ".github/workflows/deploy-web.yml"
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: 9
- run: pnpm install --frozen-lockfile
- run: pnpm --filter=@myapp/web build
- name: Deploy to Vercel
run: npx vercel --prod
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
CI/CDの設定生成をClaude Codeに依頼する
このモノレポ(pnpm workspace + Turborepo)のGitHub Actionsを生成してください。 構成: - apps/web(Next.js → Vercelにデプロイ) - apps/admin(Vite → S3にデプロイ) - packages/*(共有パッケージ) 要件: - apps/webの変更時のみwebデプロイジョブを実行 - apps/adminの変更時のみadminデプロイジョブを実行 - packages/の変更は両方の下流デプロイをトリガー - Turboリモートキャッシュ(TURBO_TOKEN/TURBO_TEAM)を使う - pnpm install はNode.jsキャッシュを活用する
モノレポ × Claude Codeでよくある失敗パターン
| 失敗パターン | 原因 | 対策 |
|---|---|---|
turbo.jsonにpipelineキーを生成する |
旧記法(v1)の知識でコード生成 | CLAUDE.mdに「tasksキーを使う(pipelineは旧記法)」と明記 |
| 相対パスで他パッケージをimportする | パッケージ名で参照すべきところを../../packages/uiのように書く |
CLAUDE.mdに「他パッケージは@myapp/uiでimport(相対パス禁止)」と明記 |
| 作業スコープ外のパッケージを変更する | 型が足りないときなどにpackages/sharedを直接変更する |
CLAUDE.mdにスコープ宣言+PreToolUseフックで物理的にブロック |
| ルートでpnpm installせずパッケージ内でinstallする | モノレポではルートからの一括インストールが正しい | CLAUDE.mdに「パッケージ追加はルートからpnpm add -F @myapp/api <pkg>」と明記 |
| turbo runの代わりにnpm/yarn scriptを使う | 依存関係の順序制御ができなくなる | CLAUDE.mdに「タスク実行は必ずturbo runを使う」と明記 |
よくある質問
actions/cacheで.turboディレクトリをキャッシュする方法があります。コミットハッシュをキャッシュキーに使い、前のコミットのキャッシュをリストアキーで引き継ぐことで、変更のないパッケージのタスクをスキップできます。CLAUDE.mdが優先的に読み込まれ、スコープが明確になります。ただしルートの.claude/設定が読み込まれなくなるため、--add-dir ../../でルートを追加するか、ルートから起動してセッション開始時にスコープを宣言する方法も有効です。npx nx configure-ai-agents一発設定)。packages/sharedの変更が必要なときClaude Codeにどう指示すればよいですか?packages/sharedの変更が必要な場合は変更内容を説明してください。実際の編集は行わないでください」とCLAUDE.mdに書いておきます。変更内容を確認してから手動またはセッションを分けて実施します。outputsの設定漏れです。キャッシュを復元してもファイルが存在しない状態になります。次に多いのがenvの設定漏れで、環境変数が変わってもキャッシュがヒットし続ける問題が起きます。Claude Codeに「このturbo.jsonのoutputsとenvが正しく設定されているか確認して」と依頼すると見落としを検出できます。まとめ
モノレポでClaude Codeを使いこなすための要点をまとめます。
- CLAUDE.md 4層構造: ルート(全体共通)→ パッケージ固有の順で設計し、スコープを明示する
- .claude/rules/ のパス指定スコープ: 必要なときだけルールをロードしてコンテキストを節約する
- turbo.jsonは最新記法(tasks)を明記: CLAUDE.mdに書かないと旧記法(pipeline)で生成される
- クロスパッケージ書き込みをフックで防止: CLAUDE.mdのスコープ宣言+PreToolUseフックで物理的にブロックする
- Turborepoリモートキャッシュ: CIビルドを50〜58%削減できた実績がある
- Nxは
npx nx configure-ai-agents一発: MCP・CLAUDE.md・Skillが自動設定される
Claude Codeの全体的なワークフローはClaude Codeワークフロー完全ガイド、フックの詳細設定はClaude Code Hooks完全ガイドをご覧ください。
