🧑‍💻

【CCA-F学習ログ #4】ドメイン③ Claude Code の構成とワークフローを手を動かして整理する

に公開

はじめに

この記事は、Claude Certified Architect – Foundations(CCA-F)合格を目指す学習ログの第4弾です。

#1(概要編)で試験の全体像と学習リソースを整理し、#2(基礎編)で Claude API の最小実装を、#3(ドメイン①)ではエージェントループとオーケストレーションを手を動かして固めました。

#3 では「Claude が自分で次の手を決めて反復する」エージェントの仕組みを、コードで組み立てました。今回の #4 は、そのエージェントを実際の製品として触れる形にした「Claude Code」 を扱います。試験ドメインでいうと ドメイン③「Claude Code Configuration & Workflows(出題比率 20%)」 です。

この記事の少し変わった点は、この記事自体を Claude Code で書いていることです。設定ファイルやワークフローの説明は、机上の知識ではなく、普段の執筆で実際に使っている構成を汎用化して載せています(クライアント名などの固有情報は伏せ、そのままコピーして使える形に置き換えています)。

想定読者

  • #1〜#3 を読み、Claude API とエージェントの基礎を押さえた人
  • Claude Code を「なんとなく」使っているが、CLAUDE.md・hooks・スラッシュコマンド・サブエージェントといった設定の全体像が曖昧な人
  • CCA-F ドメイン③(20%)を体系的に押さえたい人

この記事のスコープと、送り先

Claude Code は設定項目が多いので、今回は「どこに何を置き、どう組み合わせるか」の地図づくりに集中します。次の3点は、それぞれ担当するドメイン回で深掘りするため、ここでは触れる程度にとどめます。

  • MCP サーバの設計・実装 → ドメイン②回(ツール設計・MCP 連携)
  • プロンプト設計・構造化出力 → ドメイン④回
  • コンテキスト管理・信頼性 → ドメイン⑤回

ドメイン③とは

CCA-F は5つの出題ドメインに分かれています(配分は対策コミュニティで広く共有されているもので、Anthropic の公開ページに一覧として掲載されているわけではありません。最新は公式で確認してください)。

ドメイン 配分
① Agentic Architecture & Orchestration 27%
③ Claude Code Configuration & Workflows 20%
④ Prompt Engineering & Structured Output 20%
② Tool Design & MCP Integration 18%
⑤ Context Management & Reliability 15%

今回のドメイン③は、大まかにいうと 「Claude Code を実際の開発ワークフローに組み込み、設定・カスタマイズできる力」 を問う領域です。設定ファイルの役割、カスタマイズの手段(コマンド・サブエージェント・hooks・Skill など)、そして「探索 → 計画 → 実装 → コミット」という開発の回し方が中心になります。

Claude Code の全体像

Claude Code は、ターミナルや IDE の中で動くエージェント型のコーディングツールです。単なるコード補完ではなく、#3 で組み立てたエージェントループがそのまま製品になったもの、と捉えると分かりやすいです。

  • ファイルを読み書きする
  • シェルコマンドを実行する
  • 複数ステップを、stop_reason(応答の停止理由。#3 で扱った)を見ながら自分で判断して反復する

つまり #3 で「手書きのループ」として書いていた仕組みを、Claude Code が内部で回してくれます。私たちは「何を、どうやってほしいか」を設定で伝え、Claude Code がそれに従って作業します。この「設定で伝える手段」がドメイン③の主役です。

図1: Claude Code の全体像
図1: Claude Code はターミナル/IDE 上で動き、内部でエージェントループを回す。ユーザーは CLAUDE.md・設定・コマンド・サブエージェント・hooks・Skill・MCP といった手段で「振る舞い」を伝える。

カスタマイズの手段は一見バラバラに見えますが、役割で整理すると次のようになります。この記事では上から順に見ていきます。

手段 役割 ひとことで言うと
CLAUDE.md プロジェクトの前提知識を毎回渡す 常に読まれる「事実メモ」
settings.json 権限・環境・自動化の設定 挙動のスイッチ
スラッシュコマンド 定型の指示をコマンド化 よく使う頼みごとの短縮形
サブエージェント 役割特化の別エージェントに委譲 #3 のオーケストレーションの実物
hooks イベント発生時に必ず実行 決定論的な自動化
Skill 手順書をパッケージ化 使うときだけ読まれる「手順」
MCP 外部ツール・データに接続 外部連携(詳細は次回以降)

設定はどこに置くか(階層)

具体的な設定に入る前に、「どこに置くか」 を押さえておくと迷いません。Claude Code の設定には大きく2つの置き場所があります。

  • ユーザー全体~/.claude/(ホームディレクトリ)配下。すべてのプロジェクトに効く。自分専用の設定。
  • プロジェクト:リポジトリ直下の .claude/ 配下。そのプロジェクトだけに効く。git にコミットすればチームで共有できる。

さらにプロジェクトの設定には、共有用.claude/settings.json)と手元だけの上書き用.claude/settings.local.json.gitignore 対象)があります。

図2: 設定ファイルの階層マップ
図2: ユーザー全体(~/.claude/)とプロジェクト(.claude/)の2層。設定ファイルは「ユーザー → プロジェクト → ローカル」の順で上書きされ、後のものが優先される。

ざっくりした優先順位は次の通りです(settings.json の場合)。

~/.claude/settings.json        (ユーザー全体・いちばん弱い)
  ↓ 上書き
.claude/settings.json          (プロジェクト共有)
  ↓ 上書き
.claude/settings.local.json    (手元だけ・いちばん強い)

一方 CLAUDE.md は「上書き」ではなく、ユーザー全体とプロジェクトの両方がまとめて読み込まれます。共通ルールは ~/.claude/CLAUDE.md、プロジェクト固有のことは ./CLAUDE.md に、と使い分けます。

CLAUDE.md — プロジェクトのメモリ

CLAUDE.md は、 セッション開始時に自動で読み込まれる「前提知識」 です。毎回チャットで説明しなくて済むように、プロジェクトの常識をここに書いておきます。

配置場所は主に次の3つです。

  • ./CLAUDE.md(リポジトリ直下・プロジェクトの前提)
  • .claude/CLAUDE.md(同じくプロジェクト用。.claude/ にまとめたい場合)
  • ~/.claude/CLAUDE.md(ユーザー全体・全プロジェクト共通の自分ルール)
  • CLAUDE.local.md(プロジェクト直下・手元だけの上書き。.gitignore 対象)

書く内容は「毎回伝えたい事実」に絞ります。プロジェクトの概要、よく使うコマンド、守ってほしい規約、やってほしくないことなどです。

# プロジェクト概要

Zenn に技術記事を書くリポジトリ。記事は articles/ に Markdown で置く。

## よく使うコマンド
- `npm run lint` — 記事の文体チェック
- `npx zenn preview` — ローカルでプレビュー

## 執筆ルール
- 日本語で書く。専門語は初出で一言だけ補足する。
- 確認できない事実は「要確認」と明示し、推測で断定しない。

## 詳しい執筆手順
@.claude/docs/writing-guide.md

最後の行の @.claude/docs/writing-guide.md@ によるファイル参照(import) です。別ファイルの内容を CLAUDE.md に読み込めます。~ から始めればホーム配下も参照できます(例:@~/.claude/docs/common-rules.md)。

settings.json と権限

settings.json は、権限(permissions)・環境変数・hooks など、Claude Code の挙動を決める設定ファイルです。中でも最初に触るのが権限設定です。

Claude Code は、ファイル編集やコマンド実行の前に確認を求めます。毎回「はい」を押すのは大変なので、 安全な操作は事前に許可(allow) し、 危険な操作は明示的に拒否(deny) しておきます。

{
  "permissions": {
    "allow": [
      "Bash(npm run lint)",
      "Bash(npx zenn preview)",
      "Read(./articles/**)"
    ],
    "deny": [
      "Read(./.env)",
      "Bash(rm *)"
    ]
  }
}
  • allow … 確認なしで実行してよい操作
  • deny … 常に禁止する操作(allow より優先される)
  • 記法は ツール名(パターン)Bash(...) はコマンド、Read(...) / Write(...) はファイルパスで、*** のワイルドカードが使えます

上の例では「lint とプレビューは自由に実行してよい/articles/ は読んでよい」一方で、「.env は読ませない/rm は実行させない」と決めています。秘密情報のファイルや破壊的コマンドを deny に入れておくのが安全側の基本です。

権限モード

その場の作業スタイルに合わせて、権限モードを切り替えることもできます。代表的なものは次の通りです(正確な一覧と最新仕様は公式で確認してください)。

モード 挙動
default 都度確認する(標準)
acceptEdits ファイル編集は自動承認、コマンドは確認
plan 読み取り専用。まず計画を立てさせる(後述)
bypassPermissions すべて確認しない

モードはセッション中に切り替えられます(既定値は settings.jsondefaultMode で指定できます)。このほかに auto(CI 向けの自動承認)や dontAsk などのモードもあり、全一覧と最新仕様は公式で確認してください。

スラッシュコマンド — 定型作業をコマンド化

/help/clear/compact のような スラッシュコマンドは Claude Code に組み込まれていますが、自分専用のコマンドも追加できます。よく使う頼みごとを短い一言で呼び出せるようになります。

.claude/commands/<名前>.md を作ると、/<名前> で呼べるようになります。たとえば .claude/commands/review-article.md を用意すると /review-article が使えます。

---
description: 指定した記事を文体ガイドでチェックする
argument-hint: [記事のパス]
---

次の記事を読み、CLAUDE.md の執筆ルールに沿っているか確認し、
違反していそうな箇所と修正案を挙げてください。

対象記事: $ARGUMENTS
  • 冒頭の frontmatter(Zenn 記事と同じく、ファイル先頭を --- で囲んだ YAML ブロック)で description(説明)や argument-hint(引数のヒント)を書けます
  • 本文の $ARGUMENTS に、呼び出し時に渡した引数が入ります(/review-article articles/foo.md なら articles/foo.md

これで、記事チェックのたびに長い指示を書かず /review-article articles/foo.md の一行で済みます。

サブエージェント — 役割特化のエージェント

#3 で「coordinator が複数の subagent にタスクを分けて委譲する」オーケストレーションを扱いました。Claude Code のサブエージェントは、まさにその実物です。

サブエージェントは 独立したコンテキスト(別の会話ウィンドウ)で作業し、結果の要約だけをメインに返します。大量の検索結果やログでメインの会話を埋めたくないとき、あるいは特定の役割に絞りたいときに使います。

.claude/agents/<名前>.md を作って定義します。

---
name: explorer
description: リポジトリを調べて要点だけ返す。調査でメインの文脈を汚したくないときに使う。
tools: Read, Grep, Glob
---

あなたは調査専門のエージェントです。指示されたテーマについてリポジトリを検索し、
関係するファイルのパスと要点だけを簡潔に報告してください。
ファイルの中身をそのまま貼らず、要約に徹してください。
  • name / description … サブエージェントの名前と、いつ使うか。Claude はこの description を見て委譲を判断します。「いつ使うか」を具体的に書くほど、適切な場面で自動的に呼ばれやすくなります(必須はこの2つだけ)
  • tools … 使わせるツールを絞れます(この例は読み取り系の Read / Grep / Glob のみで、編集はさせない。いずれも Claude Code 組み込みのツール名で、カンマ区切りで指定する)
  • 本文 … サブエージェントのシステムプロンプト(役割の指示)

ポイントは2つです。メインの文脈を汚さない(調査ログはサブ側に残り、要約だけ返る)ことと、ツールを制限して安全にできることです。#3 の「独立コンテキストで並列に働くサブエージェント」が、そのまま設定ファイルになったわけです。

Hooks — イベントで自動実行(決定論的)

これまでの手段は「Claude に判断させる」ものでしたが、hooks は逆に「Claude の判断に頼らず、必ず実行する」仕組みです。特定のイベントが起きたときに、決まったコマンドを自動で走らせます。

代表的なイベントには次のようなものがあります(このほかにも多数あり、最新は公式で確認してください)。

イベント 発火タイミング
SessionStart セッション開始時
UserPromptSubmit ユーザーが入力を送った時
PreToolUse ツール実行の直前
PostToolUse ツール実行の直後
Stop 応答の完了時
PreCompact コンテキスト圧縮の直前

図3: hooks のライフサイクル
図3: 1ターンの流れの中で hooks が発火するポイント。UserPromptSubmit → (PreToolUse → ツール実行 → PostToolUse)を必要なだけ繰り返す → Stop。各イベントに自分のコマンドを差し込める。

設定は settings.jsonhooks に書きます。次は「ファイルを編集(Edit または Write)した直後に、lint を自動で走らせる」例です。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "npm run lint" }
        ]
      }
    ]
  }
}
  • matcher … 対象のツール名で判定(Edit|Write のように | で複数指定できる)
  • hooks[].type: "command" … 実行するのはシェルコマンド
  • command … 実際に走らせるコマンド

「編集したら必ず整形/チェックする」のように、忘れず・毎回・同じようにやってほしいことを hooks に寄せると、品質が安定します。

カスタム Skill — 手順をパッケージ化

Skill は、繰り返す手順やチェックリストを1つのパッケージにまとめ、必要なときだけ読み込む仕組みです。CLAUDE.md との違いは読み込まれ方にあります。

  • CLAUDE.md … 毎回読まれる「事実」。常に文脈に載る
  • Skill … 使うときだけ読まれる「手順」。長い手順書でも、呼ばれるまで本文のコストがかからない

正確には、スキルの名前と説明(description)は常に読み込まれ(Claude が「いつ使うか」を判断するため)、本文の手順は呼ばれたときに読み込まれます。この「必要になるまで本文を読み込まない」仕組みを progressive disclosure(段階的開示) と呼びます。CLAUDE.md が膨らんできたら、手順の部分を Skill に切り出すのが定石です。

.claude/skills/<名前>/SKILL.md を作って定義します。

---
name: new-article
description: Zenn の新しい記事の下書きを、決まった構成で作成する手順
---

# 新規記事の作成手順

1. `articles/``<日付>_<slug>.md` を作る
2. front matter(title / emoji / type / topics / published: false)を埋める
3. 「はじめに → 背景 → 手順 → ハマりどころ → まとめ」の見出しを置く
4. 各見出しに要点を箇条書きで下書きする

コマンドとして呼ぶときの名前(/new-article)はフォルダ名から決まります(frontmatter の name は一覧での表示名)。/new-article で手動起動できるほか、description を見て Claude が関連する場面で自動的に使うこともあります。

前節で触れた「コマンドと Skill の統合」を踏まえると、両者は地続きです。1ファイルの軽い定型指示ならコマンド(.claude/commands/*.md)、補助ファイルを伴う手順や自動起動させたいものは Skill(.claude/skills/<名前>/SKILL.md、と考えると整理できます。

MCP サーバの接続(軽く)

MCP(Model Context Protocol) は、Claude を外部のツールやデータに接続するために Anthropic が提唱したオープンな標準規格です。Claude Code からも MCP サーバを追加でき、たとえば外部 API や社内ツールを Claude から呼べるようになります。

Claude Code 側の設定だけ簡単に触れておきます。

# プロジェクトで共有する MCP サーバを追加する(.mcp.json に記録される)
claude mcp add --scope project <> -- <サーバの起動コマン>
  • スコープは local(自分だけ・このプロジェクト)/project(このプロジェクトで共有)/user(全プロジェクト・自分だけ)から選べます
  • プロジェクト共有の設定は .mcp.json に書き出されます

開発ワークフロー(実際の回し方)

設定が揃ったら、実際の開発をどう回すかです。Claude Code で安定して成果を出す基本形は 「探索 → 計画 → 実装 → コミット(Explore → Plan → Code → Commit)」 です。

図4: 開発ワークフロー
図4: Explore(現状把握)→ Plan(計画)→ Code(実装)→ Commit(確定)の循環。計画段階では plan mode(読み取り専用)で方針を固めてから実装に移ると、手戻りが減る。ヘッドレス実行(対話なし・1回きり)は自動化ルート。

  • Explore(探索):いきなり書かせず、まず関連ファイルや現状を把握させる。サブエージェントに調べさせると文脈を汚さない
  • Plan(計画)plan モード(読み取り専用)で方針を立てさせ、内容を確認・承認してから進む。大きな変更ほど効く
  • Code(実装):承認した方針に沿って実装。acceptEdits モードなら編集を自動承認して速く回せる
  • Commit(確定):変更をまとめて確定する

この「まず計画、次に実装」の流れは、#3 のエージェント設計とも重なります。いきなり全部作らせず、段階を踏むほど安定します。

ヘッドレス実行(自動化に組み込む)

対話せずに 1回だけ実行して結果を受け取ることもできます。-p--print)を使うと、CI やスクリプトに Claude Code を組み込めます。

# 記事ファイルを渡して要点を出させ、結果を JSON で受け取る
cat articles/foo.md | claude -p "この記事の要点を3つ、日本語で挙げて" --output-format json
  • -p / --print … 対話に入らず、処理して終了する
  • --output-format … 出力形式(text / json / stream-json)。json は応答全体をまとめて構造化して返すので後続スクリプトで扱いやすい(stream-json は逐次イベントを流す形式)

「記事の下書きに定型チェックを自動でかける」といった用途で、ワークフローの一部として呼び出せます。

ハマりどころ

手を動かしていて、つまずきやすかった点を挙げておきます。

  • 権限の過不足allow を広げすぎると危険、狭すぎると毎回確認で止まって作業が進まない。「安全な定型コマンドは allow、破壊的操作と秘密情報は deny」から始めるとバランスがよい
  • CLAUDE.md の肥大化:なんでも書くと毎回のコストになる。手順は Skill へ逃がし、CLAUDE.md は事実に絞る
  • hook の誤爆matcher を広くしすぎると意図しない場面で発火する。対象を絞って小さく試す
  • 設定の優先順位の混同:同じ項目をユーザー全体・プロジェクト・ローカルで別々に書くと、どれが効いているか分からなくなる。「ローカル > プロジェクト > ユーザー」を意識する
  • MCP は深追いしない(今回は):Claude Code への追加方法だけ押さえ、サーバ設計はドメイン②回で

理解度トラッカー(#4 更新後)

#3 終了時点から #4 の学習を経て、ドメイン③の理解度を底上げしました。

ドメイン 理解度(/5) #3→#4 コメント
③ Claude Code Configuration & Workflows 3→4 +1 設定の階層・CLAUDE.md・コマンド・サブエージェント・hooks・Skill・ワークフローを手を動かして整理した
① Agentic Architecture & Orchestration 4 → 4 変化なし(#3 で底上げ済み。サブエージェントとして実物に触れた)
④ Prompt Engineering & Structured Output 4 → 4 変化なし(#2 で底上げ済み)
② Tool Design & MCP Integration 2 → 2 MCP の追加方法に軽く触れた。ツール設計・実装は次回
⑤ Context Management & Reliability 2 → 2 サブエージェントによる文脈分離は把握。詳細は後続回

図5: 理解度トラッカー(#4 更新版)
図5: ドメイン別の理解度(5段階)。#3 → #4 でドメイン③ Claude Code を 3 → 4 に底上げした。他ドメインは次回以降で引き上げていく。

#4 で底上げできた点

  • 設定の階層(ユーザー全体 ~/.claude/ とプロジェクト .claude/ の使い分け・優先順位)
  • CLAUDE.md(毎回読まれる事実メモ)と @import
  • settings.json の権限設定(allow / deny と権限モード)
  • カスタムスラッシュコマンド(と Skill への統合)
  • サブエージェント(#3 のオーケストレーションの実物)
  • hooks(決定論的な自動化)と Skill(progressive disclosure)
  • Explore → Plan → Code → Commit のワークフロー

まだ曖昧な点(正直に残す)

  • hooks の全イベントの使い分けと、exit code・出力による制御の細部
  • 権限モードの正確な一覧(更新で増減しうる)
  • MCP サーバの設計・接続の実際(次回のドメイン②で手を動かす)
  • サブエージェントに「ループを持つエージェント」を渡す場合の設計
  • 長いセッションでのコンテキスト圧縮(PreCompact 周辺)の最適な運用

まとめ

この記事で扱った内容を整理します。

Claude Code とは

  • ターミナル/IDE 上で動くエージェント型コーディングツール
  • #3 のエージェントループの実物。ユーザーは「設定」で振る舞いを伝える

設定はどこに置くか

  • ユーザー全体 ~/.claude/ と プロジェクト .claude/ の2層
  • settings.json は「ローカル > プロジェクト > ユーザー」で上書き。CLAUDE.md は両方まとめて読まれる

カスタマイズの手段(役割で覚える)

  • CLAUDE.md = 毎回読まれる事実メモ(肥大化させない)
  • settings.json = 権限・環境・自動化のスイッチ
  • スラッシュコマンド = よく使う頼みごとの短縮形(Skill に統合された)
  • サブエージェント = 役割特化の別エージェント(文脈を汚さない・ツールを絞れる)
  • hooks = イベントで必ず実行する決定論的な自動化
  • Skill = 使うときだけ読まれる手順パッケージ(progressive disclosure)

ワークフロー

  • Explore → Plan → Code → Commit を基本形にする
  • plan モードで方針を固めてから実装すると手戻りが減る
  • claude -p のヘッドレス実行で CI・スクリプトに組み込める

ドメイン③は「Claude Code をどう設定し、どう回すか」を問う領域です。手段の役割を地図で押さえ、実際に自分の .claude/ を育てていくのが近道だと感じました。

まず試すなら、小さく始められる3ステップです。

  1. CLAUDE.md にプロジェクトのルールを1つ書いてみる
  2. settings.jsondeny を1つ足してみる(例:Read(./.env)
  3. よく使う頼みごとを1つ、スラッシュコマンド(.claude/commands/)にしてみる

次回予告

#5「ドメイン② ツール設計と MCP 連携」(予定)

参照する Academy コース: Introduction to Model Context Protocol / MCP: Advanced Topics

次回はドメイン②「Tool Design & MCP Integration(18%)」を扱う予定です。今回軽く触れた MCP を、サーバの作り方・ツール設計・接続の実際まで手を動かして掘り下げます。テーマは学習の進み具合で調整します。

参考リンク

Anthropic Academy コース

公式ドキュメント(Claude Code)

この連載

Discussion