T-CREATOR

Claude Code のワークフロー超図解:要求 → 差分提案 → 検証 → 適用の実務フロー

Claude Code のワークフロー超図解:要求 → 差分提案 → 検証 → 適用の実務フロー

Claude Code を使いこなすには、内部で動いているワークフローの仕組みを理解することが大切です。 このツールは単なる「コード生成ツール」ではなく、開発者の要求を受け取り、ファイルの差分を提案し、検証を経て適用するという、一連の 精密なプロセス を踏んでいます。

本記事では、Claude Code が要求から実際のコード適用までをどのような流れで処理しているのか、図解を交えながら段階的に解説していきます。 この仕組みを知ることで、より効果的に Claude Code を活用できるようになるでしょう。

背景

AI 駆動開発ツールの進化

近年、GitHub Copilot や Cursor、Claude Code などの AI 駆動型コード支援ツール が急速に普及しています。 これらのツールは、開発者の生産性を飛躍的に向上させる一方で、その内部動作はブラックボックスになりがちです。

Claude Code は Anthropic が提供する Claude AI をベースにした開発支援ツールで、VSCode 拡張機能として動作します。 単にコードを生成するだけでなく、ファイルの読み取り、差分の提案、検証、適用という ステートフルなワークフロー を持っている点が特徴です。

ワークフロー理解の重要性

Claude Code を効果的に使うためには、次のような疑問を解消する必要があります。

  • 要求を出してから実際にコードが適用されるまで、内部で何が起きているのか?
  • どのタイミングでファイルが読み込まれ、どのタイミングで変更が適用されるのか?
  • エラーが発生した場合、どの段階で検出され、どう対処されるのか?

これらの疑問に答えるには、Claude Code の ワークフローの全体像 を把握することが不可欠です。

以下の図は、AI 駆動開発ツールが登場する前後での開発フローの変化を示しています。

mermaidflowchart TB
    subgraph old["従来の開発フロー"]
        old1["要求定義"] --> old2["設計"]
        old2 --> old3["コーディング"]
        old3 --> old4["テスト"]
        old4 --> old5["デバッグ"]
        old5 -->|繰り返し| old3
    end

    subgraph new["AI 駆動開発フロー"]
        new1["自然言語での要求"] --> new2["AI が設計・コード生成"]
        new2 --> new3["差分提案"]
        new3 --> new4["開発者が検証"]
        new4 --> new5["適用・テスト"]
        new5 -->|フィードバック| new1
    end

    old -.->|進化| new

従来の開発フローでは、設計からコーディング、テストまでを手動で行う必要がありました。 AI 駆動開発では、自然言語での要求から AI が設計とコード生成を担当し、開発者は 検証と適用 に集中できるようになっています。

課題

ブラックボックス化による問題

多くの開発者が Claude Code を使う際、以下のような課題に直面します。

予期しない動作への戸惑い

Claude Code が提案した変更が期待と異なる場合、どの段階で判断が行われたのかが分からないと、適切な修正指示を出せません。 「なぜこのファイルが選ばれたのか?」「なぜこの実装方法が提案されたのか?」といった疑問が解消されないままになります。

エラー発生時の対処困難

エラーが発生した際、それが要求の理解段階なのか、ファイル読み取り段階なのか、差分生成段階なのかによって対処方法は大きく異なります。 ワークフローを理解していないと、適切なデバッグができません。

効率的な使い方が分からない

Claude Code には複数のツール(Read、Edit、Write、Grep、Glob など)が用意されていますが、それらがワークフローのどの段階で使われるのかを知らないと、効率的な指示を出せません。

ワークフロー可視化の必要性

これらの課題を解決するには、Claude Code の内部ワークフローを 段階ごとに可視化 し、各ステップで何が行われているかを明確にする必要があります。

以下の表は、開発者が直面する典型的な課題とその原因をまとめたものです。

#課題原因影響
1提案された変更が期待と異なるワークフローの要求解釈段階の理解不足修正指示が不明確になる
2エラーの原因が特定できないどの段階でエラーが発生したか不明デバッグに時間がかかる
3同じ指示を繰り返す必要があるツールの適切な使い分けができていない生産性が低下する
4差分の適用タイミングが分からない検証と適用の段階の区別が曖昧意図しない変更が適用される

解決策

Claude Code ワークフローの 4 段階

Claude Code のワークフローは、以下の 4 つの主要段階 で構成されています。

第 1 段階:要求の受付と理解

開発者が自然言語でタスクを指示すると、Claude Code はまず要求内容を解析します。 この段階では、タスクの種類(新規作成、修正、リファクタリングなど)、対象ファイル、実装方針などを判断します。

第 2 段階:差分提案の生成

要求を理解した後、Claude Code は適切なツール(Read、Grep、Glob など)を使ってコンテキストを収集します。 そして、Edit や Write ツールを使って具体的な差分を生成し、提案として開発者に提示します。

第 3 段階:検証

提案された差分は、適用前に開発者によって検証されます。 Claude Code は変更内容を明確に表示し、開発者が承認または修正を指示できるようにします。

第 4 段階:適用

開発者が承認した差分は、実際のファイルに適用されます。 適用後、必要に応じてビルドやテストを実行し、変更が正しく機能するかを確認します。

以下の図は、Claude Code の全体ワークフローを示しています。

mermaidflowchart TD
    start["開発者の要求<br/>(自然言語)"] --> understand["第1段階<br/>要求の理解と解析"]

    understand --> planning["実行計画の策定<br/>(TodoWrite)"]
    planning --> context["コンテキスト収集<br/>(Read/Grep/Glob)"]

    context --> generate["第2段階<br/>差分提案の生成"]
    generate --> edit["Edit/Writeツールで<br/>差分を作成"]

    edit --> verify["第3段階<br/>開発者による検証"]
    verify --> approve{"承認?"}

    approve -->|Yes| apply["第4段階<br/>ファイルへの適用"]
    approve -->|No| feedback["修正指示"]
    feedback --> generate

    apply --> test["ビルド・テスト実行<br/>(Bash)"]
    test --> result{"成功?"}

    result -->|Yes| complete["完了"]
    result -->|No| debug["エラー解析"]
    debug --> feedback

この図から分かるように、Claude Code は単純な一方向の処理ではなく、フィードバックループ を持つ洗練されたワークフローを採用しています。

各段階で使用されるツール

Claude Code は、各段階で適切なツールを選択して使用します。

要求理解段階のツール

  • TodoWrite:タスクを段階的に分解し、進捗を管理します。
  • Task (Explore agent):コードベースの探索が必要な場合に使用します。

差分生成段階のツール

  • Read:既存ファイルの内容を読み取ります。
  • Grep:特定のパターンでコードを検索します。
  • Glob:ファイルパターンでファイルを探します。
  • Edit:既存ファイルの一部を置換します。
  • Write:新規ファイルを作成します。

検証・適用段階のツール

  • Bash:ビルド、テスト、git コマンドなどを実行します。
  • WebFetch/WebSearch:必要に応じて外部情報を取得します。

以下の表は、各段階で使用される主要なツールをまとめたものです。

#段階ツール用途
1要求理解TodoWriteタスク分解と進捗管理
2要求理解Task (Explore)コードベース探索
3差分生成Readファイル内容の読み取り
4差分生成Grepコード検索
5差分生成Globファイルパターン検索
6差分生成Editファイルの部分置換
7差分生成Write新規ファイル作成
8検証・適用Bashビルド・テスト実行

具体例

実際のワークフロー実行例

ここでは、「ユーザー認証機能を追加する」という要求を例に、Claude Code がどのようにワークフローを実行するかを見ていきます。

ステップ 1:要求の受付

開発者が以下のような指示を出します。

「Next.js アプリにユーザー認証機能を追加してください。JWT を使った実装でお願いします。」

Claude Code はこの要求を受け取り、タスクを分解します。

typescript// Claude Code が内部で生成する TodoList のイメージ

[
  {
    content: '既存の認証関連コードを調査する',
    status: 'in_progress',
    activeForm: '既存の認証関連コードを調査中',
  },
  {
    content: 'JWT 認証ミドルウェアを実装する',
    status: 'pending',
    activeForm: 'JWT 認証ミドルウェアを実装中',
  },
  {
    content: 'ログイン API エンドポイントを作成する',
    status: 'pending',
    activeForm: 'ログイン API エンドポイントを作成中',
  },
  {
    content: '認証状態管理を実装する',
    status: 'pending',
    activeForm: '認証状態管理を実装中',
  },
];

このコードは、Claude Code が内部でタスクをどのように分解するかを示しています。 各タスクには content(何をするか)、status(現在の状態)、activeForm(実行中の表示)の 3 つの属性があります。

ステップ 2:コンテキスト収集

Claude Code は適切なツールを使って、既存のコードベースを調査します。

bash# Glob ツールでファイルを検索
pattern: "**/*auth*.{ts,tsx,js,jsx}"

このコマンドは、認証関連のファイルをプロジェクト全体から探します。 **​/​*auth* という パターンは「任意の階層で auth という文字列を含むファイル」を意味します。

bash# Grep ツールでコード検索
pattern: "jwt|token|authentication"
output_mode: "files_with_matches"

このコマンドは、JWT やトークン、認証関連のコードが含まれているファイルを探します。 output_mode: "files_with_matches" は、マッチした行ではなくファイル名だけを返すオプションです。

以下の図は、コンテキスト収集のプロセスを示しています。

mermaidflowchart LR
    request["認証機能追加の要求"] --> glob["Globツールで<br/>ファイル検索"]
    request --> grep["Grepツールで<br/>コード検索"]

    glob --> files["auth.ts<br/>middleware.ts<br/>などを発見"]
    grep --> code["JWT関連コードを<br/>発見"]

    files --> read["Readツールで<br/>内容を読み取り"]
    code --> read

    read --> context["コンテキスト<br/>データベース"]
    context --> next["次の段階へ"]

この図から分かるように、Claude Code は複数のツールを組み合わせて効率的にコンテキストを収集します。

ステップ 3:差分提案の生成

収集したコンテキストをもとに、Claude Code は具体的な差分を生成します。

まず、JWT ミドルウェアのファイルを作成します。

typescript// Write ツールで新規ファイル作成
// ファイルパス: src/middleware/auth.ts

import { NextRequest, NextResponse } from 'next/server';
import jwt from 'jsonwebtoken';

// JWT 秘密鍵(環境変数から取得)
const JWT_SECRET =
  process.env.JWT_SECRET || 'default-secret';

// JWT トークンの型定義
interface JWTPayload {
  userId: string;
  email: string;
  iat: number;
  exp: number;
}

このコードブロックでは、必要なライブラリをインポートし、JWT 秘密鍵と型定義を設定しています。 JWT_SECRET は環境変数から取得することで、セキュリティを確保します。

次に、トークン検証関数を実装します。

typescript// トークン検証関数
export function verifyToken(
  token: string
): JWTPayload | null {
  try {
    // JWT トークンを検証
    const decoded = jwt.verify(
      token,
      JWT_SECRET
    ) as JWTPayload;
    return decoded;
  } catch (error) {
    // トークンが無効な場合は null を返す
    console.error('Token verification failed:', error);
    return null;
  }
}

この関数は、受け取ったトークンを検証し、有効な場合はペイロード情報を返します。 エラーが発生した場合は null を返すことで、呼び出し側でエラーハンドリングができるようにしています。

続いて、認証ミドルウェアを実装します。

typescript// 認証ミドルウェア
export function authMiddleware(request: NextRequest) {
  // Authorization ヘッダーからトークンを取得
  const authHeader = request.headers.get('authorization');

  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    // トークンがない場合は 401 エラーを返す
    return NextResponse.json(
      { error: 'Authentication required' },
      { status: 401 }
    );
  }

このコードは、リクエストヘッダーから Bearer トークンを取得します。 startsWith('Bearer ') で正しい形式かをチェックし、形式が不正な場合は早期リターンします。

typescript  // Bearer プレフィックスを除去してトークンを抽出
  const token = authHeader.substring(7);

  // トークンを検証
  const payload = verifyToken(token);

  if (!payload) {
    // トークンが無効な場合は 401 エラーを返す
    return NextResponse.json(
      { error: 'Invalid token' },
      { status: 401 }
    );
  }

  // 検証成功:ユーザー情報をヘッダーに追加
  const response = NextResponse.next();
  response.headers.set('X-User-Id', payload.userId);
  return response;
}

トークンが有効な場合、ユーザー ID をカスタムヘッダーに設定して次の処理に渡します。 これにより、後続の API ハンドラーでユーザー情報を簡単に取得できるようになります。

ステップ 4:既存ファイルの編集

既存のミドルウェア設定ファイルに認証ミドルウェアを組み込みます。

typescript// Edit ツールで既存ファイルを編集
// ファイルパス: src/middleware.ts

// 編集前のコード
export function middleware(request: NextRequest) {
  return NextResponse.next();
}

このコードは、編集前の状態を示しています。 現在は何も処理せずに次のミドルウェアに処理を渡しているだけです。

typescript// 編集後のコード
import { authMiddleware } from './middleware/auth';

export function middleware(request: NextRequest) {
  // 認証が必要なパスをチェック
  const protectedPaths = ['/api/protected', '/dashboard'];
  const isProtectedPath = protectedPaths.some((path) =>
    request.nextUrl.pathname.startsWith(path)
  );

  // 保護されたパスの場合は認証ミドルウェアを実行
  if (isProtectedPath) {
    return authMiddleware(request);
  }

  // それ以外のパスはそのまま通過
  return NextResponse.next();
}

編集後のコードでは、特定のパス(​/​api​/​protected​/​dashboard)にアクセスする際に認証ミドルウェアを実行するようにしています。 some メソッドを使うことで、複数の保護パスを柔軟にチェックできます。

以下の図は、差分生成から適用までのシーケンスを示しています。

mermaidsequenceDiagram
    participant Dev as 開発者
    participant CC as Claude Code
    participant Tools as ツール群
    participant Files as ファイル

    Dev->>CC: 認証機能追加の要求
    CC->>Tools: Read/Grep/Globで調査
    Tools->>CC: 既存コード情報を返却

    CC->>CC: 差分を生成
    CC->>Dev: 差分提案を表示

    Dev->>CC: 承認
    CC->>Tools: Write/Editツール実行
    Tools->>Files: ファイルを作成・更新

    CC->>Tools: Bashでテスト実行
    Tools->>CC: テスト結果を返却
    CC->>Dev: 完了報告

この図は、開発者の要求から完了までの一連のやり取りを時系列で示しています。 各ステップで適切なツールが選択され、段階的に処理が進むことが分かります。

ステップ 5:検証と適用

Claude Code は生成した差分を開発者に提示し、承認を待ちます。 開発者が承認すると、実際のファイルに変更が適用されます。

bash# Bash ツールで型チェックを実行
tsc --noEmit

このコマンドは、TypeScript の型チェックを行います。 --noEmit オプションにより、ファイルを出力せずに型エラーだけをチェックできます。

bash# Bash ツールでテストを実行
yarn test src/middleware/auth.test.ts

このコマンドは、作成した認証ミドルウェアのテストを実行します。 テストが成功すれば、実装が正しく動作していることが確認できます。

エラー発生時のワークフロー

エラーが発生した場合、Claude Code はエラーの種類に応じて適切に対処します。

型エラーの例

bash# エラーコード: TS2339
# エラーメッセージ:
src/middleware/auth.ts:15:20 - error TS2339:
Property 'userId' does not exist on type 'JWTPayload'.

このエラーは、JWTPayload 型に userId プロパティが定義されていないことを示しています。 TypeScript の型システムが、実行時エラーを未然に防いでくれます。

エラーの解決手順

Claude Code は以下の手順でエラーを解決します。

  1. エラーメッセージを解析して原因を特定します。
  2. 該当ファイルを Read ツールで再読み込みします。
  3. Edit ツールで修正を行います。
  4. 再度ビルド・テストを実行して確認します。
typescript// Edit ツールで型定義を修正
// 修正前
interface JWTPayload {
  email: string;
  iat: number;
  exp: number;
}

修正前の型定義には userId が含まれていません。

typescript// 修正後
interface JWTPayload {
  userId: string; // 追加
  email: string;
  iat: number;
  exp: number;
}

userId プロパティを追加することで、型エラーが解消されます。 このように、Claude Code はエラーを検出し、適切な修正を提案します。

以下の図は、エラー発生時のフィードバックループを示しています。

mermaidstateDiagram-v2
    [*] --> GenerateDiff: 差分生成
    GenerateDiff --> Apply: 適用
    Apply --> Test: テスト実行

    Test --> Success: テスト成功
    Test --> ErrorDetect: エラー検出

    ErrorDetect --> Analyze: エラー解析
    Analyze --> FixDiff: 修正差分生成
    FixDiff --> Apply

    Success --> [*]: 完了

エラーが検出されると、Claude Code は自動的にエラーを解析し、修正差分を生成して再度適用します。 このフィードバックループにより、開発者の手間を大幅に削減できます。

ワークフロー最適化のポイント

Claude Code のワークフローを最大限活用するためのポイントをまとめます。

明確な要求を出す

曖昧な指示ではなく、具体的な要求を出すことで、Claude Code はより適切な差分を生成できます。

悪い例:

「認証を追加して」

良い例:

「Next.js の API Routes に JWT ベースの認証ミドルウェアを追加してください。保護が必要なのは ​/​api​/​protected​/​dashboard です。」

TodoWrite を活用する

複雑なタスクは TodoWrite で段階的に管理すると、進捗が可視化されて理解しやすくなります。

差分を確認してから適用する

Claude Code が提案した差分は、必ず内容を確認してから適用しましょう。 意図しない変更が含まれていないかをチェックすることが重要です。

エラーログを活用する

エラーが発生した場合、エラーコードとメッセージを Claude Code に伝えることで、より正確な修正が可能になります。

以下の表は、ワークフロー最適化のベストプラクティスをまとめたものです。

#項目悪い例良い例
1要求の明確さ「認証を追加」「JWT 認証ミドルウェアを ​/​api​/​protected に追加」
2タスク管理すべてを一度に指示TodoWrite で段階的に分解
3差分確認すぐに適用内容を確認してから適用
4エラー対処「エラーが出ました」エラーコードとメッセージを共有

まとめ

本記事では、Claude Code の内部ワークフロー「要求 → 差分提案 → 検証 → 適用」という 4 段階のプロセスを図解とともに詳しく解説しました。

Claude Code は単純なコード生成ツールではなく、要求を理解し、コンテキストを収集し、差分を生成し、検証を経て適用するという 洗練されたワークフロー を持っています。 各段階で適切なツール(Read、Edit、Write、Grep、Glob、Bash など)が使われ、エラーが発生した場合はフィードバックループで自動的に修正されます。

このワークフローを理解することで、以下のメリットが得られます。

  • 予期しない動作が発生した際に、どの段階で問題が起きたかを推測できます。
  • より効果的な指示を出すことができ、生産性が向上します。
  • エラー発生時に適切な対処ができるようになります。
  • Claude Code の能力を最大限に引き出せるようになります。

Claude Code を使いこなすには、このワークフローを意識して要求を出し、提案された差分を適切に検証し、フィードバックを繰り返すことが重要です。 本記事で紹介した図解と具体例を参考に、ぜひ実際のプロジェクトで Claude Code のワークフローを体験してみてください。

関連リンク