Claude Code のソースコードを読み解く:知っておくべき 9 つの知見

@mal_shaik
英語4 か月前 · 2026年3月31日
1.7M
2.3K
334
54
6.0K

TL;DR

本記事では、Anthropic の Claude Code CLI の内部構造を解説します。CLAUDE.md の最適化方法、サブエージェントの並列処理を無料で活用する方法、カスタムフックによるワークフローの自動化について詳しく紹介します。

ほとんどの人は Claude Code を開いて、プロンプトを打ち込み、応答を待ち、またプロンプトを打ち込む。

それはまるでフェラーリを買って、1 速でだけ運転するようなものだ。

なぜ一部の人が他の人より 10 倍も Claude Code を使いこなせるのか、その理由を知りたかった。そこで私は、どんなまともな人間でもやることをやった:ソースコードを全部読んだ(「私」と言っても、もちろん Claude Code に読ませたけどね)。

11 層のアーキテクチャ。数千行のコード。ターミナル上のチャットに偽装されたエージェントオーケストレーションプラットフォーム。

このソースコードが明らかにする、このツールの真の使い方をお見せしよう。

1. CLAUDE.md は毎ターン読み込まれる。毎回。毎ターン。

これこそが最大のレバレッジポイントだが、ほとんどの人はちゃんと使っていない。

多くの人は CLAUDE.md ファイルに何も書いていないか、あるいは聖書のように長文を書き連ねている。

ソースコードを見ると、Claude Code はクエリのたびに CLAUDE.md ファイルを読み込んでいる。セッション開始時だけではない。毎ターンだ。つまり、メッセージを送信するたびに、指示を再読している。

階層は次の通り:

  • ~/.claude/CLAUDE.md — グローバル(自分のコーディングスタイル、好み)
  • ./CLAUDE.md — プロジェクトレベル(アーキテクチャの決定、規約)
  • .claude/rules/*.md — モジュール化されたルール
  • CLAUDE.local.md — 個人用メモ(gitignore 対象)

40,000 文字使える。これはかなりの量だ。ほとんどの人は 200 文字程度しか使っていない。

ここにアーキテクチャの決定、ファイル規約、テストパターン、「絶対やるな」ルールを書いておこう。モデルは毎ターンそれを読む。これが、Claude Code を単なる汎用アシスタントから、あなたのコードベースを知っている「あなた専用のアシスタント」に変える違いだ。

この記事を読んで一つだけやるとしたら、これだ。

2. サブエージェントはプロンプトキャッシュを共有する(並列化はほぼ無料)

これには本当に驚いた。

Claude Code がサブエージェントをフォークするとき、親コンテキストのバイト単位で同一のコピーを作成する。API がこれをキャッシュする。つまり、コードベースの別々の部分に 5 つのエージェントを起動しても、1 つのエージェントで逐次的に処理するのとほぼ同じコストしかかからない。

もう一度読んでほしい。

5 つのエージェント。コストは 1 つ分と同じ。なぜならすべてがプロンプトキャッシュをヒットするからだ。

ほとんどの人は Claude Code を単一ワーカーのように使っている。一度に一つのタスク。終わるのを待って、次のタスクを与える。

ソースコードには、サブエージェント用に文字通り 3 つの実行モデルがある:

  • fork — 親コンテキストを継承、キャッシュ最適化
  • teammate — tmux または iTerm で別ペイン、ファイルベースのメールボックスで通信
  • worktree — 独自の git ワークツリーを取得、エージェントごとに独立したブランチ

Claude Code に 5 つのエージェントを起動するよう指示できる:1 つはセキュリティ監査、1 つは認証モジュールのリファクタリング、1 つはテスト作成、1 つはドキュメント更新、1 つはバグ修正。すべて同時に。すべてキャッシュを共有。

アーキテクチャはこれのために作られている。シングルスレッドで使うのは犯罪的行為だ。

3. 権限システムはクリックではなく設定するために設計されている

Claude Code が「この操作を許可しますか?」と尋ねてきて、あなたが「はい」をクリックするたびに、それは設定の失敗であって、機能の利用ではない。

ソースコードは 5 段階の設定カスケードを明らかにしている:

text
1policy > flag > local > project > user

~/.claude/settings.json では、常に許可するグロブパターンを設定できる:

json
1{
2 "permissions": {
3 "allow": [
4 "Bash(npm *)",
5 "Bash(git *)",
6 "Edit(src/**)",
7 "Write(src/**)"
8 ]
9 }
10}

3 つの権限モードがある:

  • bypass — 権限チェックなし(危険だが高速)
  • allowEdits — 作業ディレクトリ内のファイル編集を自動許可
  • auto (新機能) — 各アクションに LLM 分類器を実行。これが最適なバランスだ。

auto モードには、設定可能な独自の許可/拒否リストがある。ソースコードを見ると、複数のリゾルバー(ユーザークリック、フック分類器、ブリッジ)が並列で競走し、最初に応答したものが勝つ。

「許可」をクリックするたびに時間を無駄にしている。一度設定してしまえば、二度とクリックしなくていい。

4. 5 つの圧縮戦略がある。コンテキストプレッシャーは現実の問題だ

ソースコードには、会話が長くなりすぎたときに圧縮する方法が 5 つ もある:

  1. microcompact — 古いツール結果を時間ベースでクリア
  2. context collapse — 会話のスパンを要約
  3. session memory — 重要なコンテキストをファイルに抽出
  4. full compact — 履歴全体を要約
  5. PTL truncation — 最も古いメッセージグループを削除

これで重要なことが分かる:コンテキストオーバーフローは、エンジニアが多大な時間をかけて取り組んだ中心的な問題だ。

これがあなたにとって意味すること:

  • プロアクティブに /compact を使おう。システムが自動圧縮して大切なコンテキストを失うのを待ってはいけない。
  • デフォルトのウィンドウは 200K トークン。ただし、[1m] モデルサフィックスを使えば 100 万トークンにオプトインできる。多数のファイルにわたる大規模リファクタリングではこれが重要だ。
  • 長いセッションは「セッションメモリ」を蓄積する — タスク仕様、ファイルリスト、ワークフロー状態、エラー、学びの構造化サマリー。だから新しいセッションを始めるより、セッションを再開する方が良い。
  • 大きなツール結果はディスクに保存され、モデルには 8KB のプレビューのみ送られる。巨大なファイルを貼り付けると、モデルはごく一部しか見えないかもしれない。入力を集中させよう。

Claude Code を最大限活用している人々は、/compact をビデオゲームの手動セーブポイントのように使っている。大切なものを保存し、不要なものをクリアし、前に進み続ける。

5. フックシステムが本当の拡張 API だ(25 以上のライフサイクルイベント)

これがパワーユーザー向け機能で、ほとんど誰も知らない。

ソースコードは、フックできる 25 以上のライフサイクルイベントを明らかにしている:

  • PreToolUse — ツール実行前に発動
  • PostToolUse — ツール実行後に発動
  • UserPromptSubmit — メッセージ送信時に発動
  • SessionStart / SessionEnd — セッションライフサイクル
  • さらに 20 以上

5 種類のフックがある:

  • command — シェルコマンドを実行
  • prompt — LLM 経由でコンテキストを注入
  • agent — 完全なエージェント検証ループを実行
  • HTTP — Webhook を呼び出す
  • function — JS を実行

実際にできることの例:

  • ファイル書き込み前に自動で lint を実行
  • 編集後にテストを実行
  • すべてのプロンプトに自動で関連ドキュメントを挿入
  • タスク完了時に Slack 通知を送信
  • コード出荷前にセキュリティパターンが守られているか検証

UserPromptSubmit フックは特にすごい。送信するすべてのメッセージに additionalContext を注入できる。テスト出力、最近の git 差分、プロジェクト状態などを、毎回タイプしなくても自動でプロンプトに添付できるイメージだ。

これが、Claude Code の上にカスタム開発環境を構築する方法だ。プロンプトを上手に打つことではなく、システムそのものにフックすることによって。

6. セッションは永続的で再開可能(毎回新しく始めるのはやめよう)

すべての会話は JSONL で保存される:

text
1~/.claude/projects/{hash}/{sessionId}.jsonl

ソースコードがサポートするのは:

  • --continue — 最後のセッションを再開
  • --resume — 特定の過去セッションを選択
  • --fork-session — 過去の会話から分岐(個人的にこれが大好き)

セッションメモリ抽出は、圧縮をまたいで重要なコンテキスト(タスク仕様、ファイルリスト、ワークフロー状態、エラー、学び)を保持する。

ほとんどの人は Claude Code を開くたびに新しいセッションを始める。それは IDE を閉じて毎時間ゼロから開き直すようなものだ。やっていたこと、失敗したこと、学んだこと — すべてのコンテキストが消える。

--continue を使おう。常に。コンテキストを蓄積させよう。セッションメモリに時間をかけて学びを積み上げさせよう。ソースコードには文字通りそのためのインフラがある。使おう。

7. ツールシステムは 60 以上のツールをスマートバッチングで実行する

Claude Code には 60 以上の組み込みツールがある。しかし面白いのは、それらを どのように 実行するかだ。

ソースコードはツール呼び出しを 2 つのカテゴリに分類している:

  • concurrent — 読み取り専用操作(ファイル読み込み、検索、glob)は並列実行
  • serial — 変更操作(編集、書き込み、bash コマンド)は一度に一つずつ実行

つまり、Claude Code がコードベースを理解するために 10 ファイルを読む必要がある場合、10 ファイルすべてを同時に読む。しかし 3 ファイルを編集する必要がある場合、競合を避けるために一つずつ実行する。

組み込みツールに加えて、さらにツールを追加する MCP サーバーを接続できる。ソースコードは遅延読み込みを使用している。MCP ツールは必要なときにのみ読み込まれるので、5 つの MCP サーバーを接続しても毎回のリクエストが遅くなることはない。

また、エージェントがまだ知らないツールを遅延発見するための ToolSearch もある。

実用的な教訓:ワークフローに外部システム(データベース、クラウドプロバイダー、CI/CD)が含まれるなら、それらの MCP サーバーを接続しよう。アーキテクチャが複雑さを処理してくれる。あなたはより多くの機能を得るだけだ。

8. ストリーミングアーキテクチャにより、中断は安価

パイプライン全体は、個々のイベントを生成する非同期ジェネレーターを使用している。Escape キーを押すと、以前のコンテキストを失うことなく現在のストリームをクリーンに中断する。

これは小さなことのように思えるが、Claude Code の使い方を変える。

間違った方向に進んでいることが分かっている応答を待ってはいけない。すぐに中断して方向転換しよう。ソースコードはそのために設計されている。以前のコンテキストは保存される。中断された応答はクリーンに破棄される。ペナルティはゼロ。

ペアプログラミングのようなものだ。ペアが間違った方向に進み始めたら、終わるまで待たずに「こっちに行こう」と言う。同じことだ。

9. リトライシステムは思っているより洗練されている

ソースコードが明らかにするのは:

  • 指数バックオフとジッター付きで 10 回リトライ(ベース 500ms)
  • 401/403 時の自動 OAuth トークン更新
  • モデルフォールバック:Opus が 529 エラーで 3 回失敗すると、自動的に Sonnet にフォールバック
  • ストリーム上の 90 秒アイドルウォッチドッグ — ストリーミングが停止した場合、非ストリーミングにフォールバック
  • 永続モードでは無限リトライ、最大バックオフ 5 分

つまり、Claude Code は実行しっぱなしにするように設計されている。API の不調、レート制限、障害を優雅に処理する。あなたが常に見張る必要はない。バックグラウンドで実行させて、結果を確認しに戻ればいい。

要約:ソースコードから得られる最大のレバレッジポイント

  • 本物の CLAUDE.md を書け → 毎ターン読み込まれる。4 万文字使える。最大の設定レバレッジ。
  • サブエージェントで並列化 → fork モデルはプロンプトキャッシュを共有。5 エージェントでコストは約 1 つ分。
  • settings.json で権限を設定 → クリック疲れを永遠に排除。
  • プロアクティブに /compact を使う → 5 つの圧縮戦略があるのは、コンテキストプレッシャーが現実だから。
  • フックを設定する → 25 以上のイベント、5 種類。これが本当の拡張 API。
  • 常に --continue でセッション → JSONL 永続化 + セッションメモリ = 蓄積されたコンテキスト。
  • MCP サーバーを接続 → 遅延読み込みで、使うまでコストゼロ。
  • 自由に中断する → 非同期ジェネレーターで方向転換にペナルティなし。

結論:Claude Code はターミナル UI をまとったエージェントオーケストレーションプラットフォームだ。

そこから 10 倍のアウトプットを得ている人々は、より良いプロンプターではない。設定したのだ。並列化したのだ。フックしたのだ。セッションをまたいでコンテキストを蓄積させたのだ。

ソースコードはそれを明白にしている。今や、あなたはその内部で実際に何が起こっているかを知っている。

参考になったら RT してね 🫶

YouMindで再制作

Turn one viral article into a full content workflow

Collect the source, decode the pattern, create assets, draft the story, and distribute from one AI workspace.

Explore YouMind
クリエイターのために

あなたの Markdown をきれいな 𝕏 記事に

自分の長文を投稿するとき、画像・表・コードブロックを 𝕏 向けに整形するのは手間がかかります。YouMind は Markdown 全体を、そのまま投稿できるきれいな 𝕏 記事に変換します。

Markdown → 𝕏 を試す

解読すべきパターンをもっと

最近のバイラル記事

バイラル記事をもっと見る