Claude Code × モノレポ完全ガイド|Turborepo・Nx・CLAUDE.md階層設計・クロスパッケージ保護・CI高速化【2026年最新】

Claude Code × モノレポ完全ガイド|Turborepo・Nx・CLAUDE.md階層設計・クロスパッケージ保護・CI高速化【2026年最新】 AI開発

モノレポはClaude Codeが最も効果を発揮しにくい環境のひとつです。複数のパッケージにまたがるコードベース、パッケージ間の依存関係、それぞれ異なる技術スタック——これらを適切にコンテキストとして伝えないと、Claude Codeが엉뚱なパッケージを操作したり、古い記法で設定ファイルを生成したりします。

この記事では、Turborepo・Nxを使ったモノレポ環境でClaude Codeを最大限活用するための実践的な方法を解説します。コピペ即使えるCLAUDE.md階層テンプレート・turbo.json設定・クロスパッケージ書き込み防止フック・GitHub Actions連携まで、設定ファイル込みで紹介します。

スポンサーリンク

モノレポでClaude Codeが失敗しやすい理由

モノレポ特有の問題として、Claude Codeが以下のような誤操作をしやすいです。

  • スコープ外のパッケージを変更する: packages/apiの作業中にpackages/uipackages/sharedを勝手に変更する
  • 古いturbo.jsonの記法を使う: Turborepo v2以降はpipelinetasksに変更されたが、古い記法で生成してしまう
  • パッケージをまたいだimportを生成する: 共有型パッケージを経由せず直接importする(循環依存の原因に)
  • コンテキストが肥大化する: すべてのCLAUDE.mdを読み込み続けてトークンを無駄消費する

これらは「CLAUDE.mdの階層設計」と「フックによるパス制限」で大部分が防げます。

Claude Codeの大規模コードベースでの活用法についてはClaude Code大規模コードベース攻略ガイドもあわせてご覧ください。

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 ── 全体共通ルール

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 ── スコープを明示する

packages/api/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
packages/ui/CLAUDE.md
# UI パッケージルール

## スタック
- React + TypeScript + Tailwind CSS v4
- shadcn/ui(CLIでインストール。直接編集禁止)

## コンポーネントルール
- Server Components は apps/ 配下のみ(このパッケージはクライアントコンポーネント専用)
- すべてのコンポーネントに型定義ファイルを追加する
- アクセシビリティ属性(aria-*)を必ず含める

## エクスポート
- index.tsからのみエクスポート(内部ファイルの直接import禁止)

## 作業スコープ
- 変更可能: packages/ui/ 以下のファイルのみ
- apps/ 配下のファイルは変更しない

.claude/rules/ のパス指定スコープ ── 必要なときだけロード

.claude/rules/ 配下にフロントマターでpathsを指定すると、そのパスのファイルを操作したときだけルールが読み込まれます。常時ロードを減らしてコンテキストを節約できます。

.claude/rules/api-design.md(パス指定スコープ)
---
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 生成プロンプト
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)を使う
生成されるturbo.json
{
  "$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
  }
}
Turborepo v2以降はpipelineキーがtasksに変わりました。Claude Codeのトレーニングデータに古い記法が多く含まれているため、CLAUDE.mdに「turbo.jsonはtasksキーを使う(pipelineは旧記法)」と明記することが重要です。

パッケージ固有のturbo.json継承

apps/web/turbo.json(ルートを継承して上書き)
{
  "extends": ["//"],
  "tasks": {
    "build": {
      "outputs": [".next/**", "!.next/cache/**"]
    }
  }
}

pnpm workspace設定

pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"
package.json(ルート)
{
  "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に操作させる

パッケージ限定でClaude Codeを起動
# packages/api ディレクトリで起動(このパッケージのコンテキストのみ)
cd packages/api
claude

# 起動後にセッション開始プロンプト
> packages/api 内の作業のみ行います。
> 他パッケージのファイルは変更しないでください。
> コマンド実行は pnpm --filter=@myapp/api <cmd> を使ってください。
Claude Codeをサブディレクトリから起動した場合、ルートの.claude/設定が読み込まれないことがあります。--add-dir ../../フラグでルートディレクトリを追加すると回避できます。

NxでのClaude Code活用 ── ワンコマンドで設定完了

Nxは2026年時点でClaude Code向けの公式サポートが充実しています。

Nx AIエージェント設定(ワンコマンド)
# 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人以上
Nxのaffectedコマンド(変更影響範囲だけテスト)
# 変更されたパッケージとその依存先のテストのみ実行
npx nx affected:test

# 依存グラフをビジュアル確認
npx nx graph

# Claude Codeにaffectedを使って指示
> nx affected:testを実行して、失敗したテストの原因を特定して修正してください

クロスパッケージ書き込みをフックで防止する

Claude Codeが作業スコープ外のパッケージを変更するリスクを、PreToolUseフックで自動的にブロックできます。

.claude/settings.json(クロスパッケージ保護フック)
{
  "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にスコープ宣言を書く方法もあります。

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%削減できた事例があります。

.github/workflows/ci.yml(Turboリモートキャッシュ対応)
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ビルドを実現

.github/workflows/deploy-web.yml(変更時のみデプロイ)
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に依頼する

CI/CD生成プロンプト
このモノレポ(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キャッシュを活用する
Turborepoのリモートキャッシュが有効な場合、2回目以降のCIビルドでキャッシュヒットするタスクはスキップされます。SIOS Tech Labの事例では12分→5分(58%削減)、Mercariの事例ではタスク時間約50%削減の実績があります。

モノレポ × 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を使う」と明記

よくある質問

QTurborepoのリモートキャッシュを使わずにCI高速化できますか?
Aはい。Vercelリモートキャッシュを使わない場合は、GitHub Actionsのactions/cache.turboディレクトリをキャッシュする方法があります。コミットハッシュをキャッシュキーに使い、前のコミットのキャッシュをリストアキーで引き継ぐことで、変更のないパッケージのタスクをスキップできます。
QモノレポのどこでClaude Codeを起動するのがベストですか?
A作業するパッケージのディレクトリから起動するのが基本です。そのパッケージのCLAUDE.mdが優先的に読み込まれ、スコープが明確になります。ただしルートの.claude/設定が読み込まれなくなるため、--add-dir ../../でルートを追加するか、ルートから起動してセッション開始時にスコープを宣言する方法も有効です。
QTurborepoとNxはどちらを選べばよいですか?
Aチーム規模が目安になります。3〜15人のスタートアップ・スモールチームはTurborepo(設定が少なく素早く始められる)、15人以上のエンタープライズはNx(モジュール境界の強制・ジェネレーターによるアーキテクチャガバナンスが必要になる)が適しています。Claude Code連携の観点ではNxの方が公式サポートが充実しています(npx nx configure-ai-agents一発設定)。
Qpackages/sharedの変更が必要なときClaude Codeにどう指示すればよいですか?
ACLAUDE.mdで直接変更を禁止しつつ、「必要な変更内容を説明して止まる」よう指示するのが安全です。具体的には「packages/sharedの変更が必要な場合は変更内容を説明してください。実際の編集は行わないでください」とCLAUDE.mdに書いておきます。変更内容を確認してから手動またはセッションを分けて実施します。
QTurborepoのキャッシュが効かないことがあります。原因は何ですか?
A最も多い原因は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完全ガイドをご覧ください。