Claude Codeのlearning output styleプラグインで学習モードにする
explanatory-output-styleとlearning-output-styleはSessionStartフックで指示を注入するプラグインです。Insight出力と「自分で書く」依頼の違い、導入手順、トークンコストを解説します。
Claude Codeを「解説つき」「学習モード」で使いたいとき、選択肢は2つあります。組み込みのoutput styleに切り替えるか、公式マーケットプレイスのexplanatory-output-styleとlearning-output-styleプラグインを入れるかです。後者はoutput styleの機能ではなく、SessionStartフックで指示を注入する作りです。この記事では、その仕組みと、2つのプラグインが出力に与える違いを扱います。
/output-styleによる切り替え手順そのものは、Claude Code output styleを/output-styleか/configで切り替えるにまとめています。
2つのプラグインは何をするか
explanatory-output-styleは、実装の選択やコードベースのパターンについて教育的な解説(Insight)を挟むプラグインです。learning-output-styleは、そのInsightに加えて、重要な判断点で「ここは自分で書いてください」と依頼する対話型の学習機能を持ちます。learning側はexplanatory側の機能をすべて含みます。
| explanatory-output-style | learning-output-style | |
|---|---|---|
| 解説(Insight) | explanatory-output-styleあり | learning-output-styleあり |
| 自分で書く依頼 | explanatory-output-styleなし | learning-output-styleあり(5〜10行程度) |
| 想定する使い方 | explanatory-output-style実装の理由を読みながら進める | learning-output-style手を動かして身につける |
| 同時に入れる意味 | explanatory-output-stylelearningに含まれるため薄い | learning-output-style— |
どちらもインストールした時点で、以降のセッションで自動的に有効になります。追加設定は要りません。
SessionStartフックで指示を注入する仕組み
2つのプラグインの中身は、セッション開始時に追加の指示文を差し込むフックです。SessionStartフックが毎回のセッションに追加コンテキストを注入し、その内容が「教える側の振る舞い」を促します。
フックの側から見ると、これは公式のフック仕様に沿った動きです。SessionStartフックは新規セッション、--resumeや--continue、/clear、コンパクション、フォークのたびに走ります。標準出力のテキストかhookSpecificOutput.additionalContextに入れた文字列は、システムリマインダーとして会話の冒頭に挿入されます。チャット欄にメッセージとしては現れません。
ここが/output-styleとの違いです。
- output style: Claude Codeのシステムプロンプト自体を切り替える機能
- SessionStartフック方式: 既定のシステムプロンプトに指示を足す方式
この方式はCLAUDE.mdとほぼ同等で、より柔軟に使えて、プラグインとして配布できます。ソフトウェア開発以外の用途を想定したスタイルはサブエージェントのほうが向く、とも書かれています。システムプロンプトを差し替えるのはサブエージェントで、SessionStartフックは追記だけだからです。
フックは再開時にも再実行されます。--resumeで前の会話を開き直しても、指示文は改めて注入されるので、学習モードが途切れません。
Insight出力と「自分で書く依頼」はどう違うか
Explanatory: 実装の理由が囲み付きで出る
両プラグインが出すInsightは、次の書式のブロックです。
★ Insight ─────────────────────────────────────
[2-3 key educational points]
─────────────────────────────────────────────────内容は、一般的なプログラミング知識ではなく、自分のコードベース固有の話に絞られます。解説の対象は次の4つです。
- 実装の具体的な選択
- コード内のパターンと規約
- トレードオフと設計判断
- コードベース固有の事情
コードを書く前後に2〜3点の短い解説が付く、という形です。ファイルにコメントとして書き込まれるわけではなく、会話の中に出る説明です。
Learning: 判断が要る箇所だけを人に渡す
learning-output-styleは、すべてを自動で実装する代わりに、意味のある数行を利用者に書かせます。依頼する場面と直接実装する場面は次のように分かれます。
| 依頼する場面 | 直接実装する場面 |
|---|---|
| 複数の妥当な方針があるビジネスロジック | 直接実装する場面ボイラープレートや繰り返しコード |
| エラー処理の方針 | 直接実装する場面選択の余地がない実装 |
| アルゴリズムの選び方 | 直接実装する場面設定やセットアップのコード |
| データ構造の決定 | 直接実装する場面単純なCRUD |
| UXに関わる判断、設計パターン | 直接実装する場面— |
たとえば、認証ミドルウェアを用意したあと、セッションの自動延長とハードタイムアウトのトレードオフを示し、handleSessionTimeout()の実装を依頼します。Claudeは文脈と場所、考慮点を整えるところまでを受け持ち、5〜10行の本体は利用者が書きます。
組み込みのLearningスタイルも同じ発想です。コードにTODO(human)コメントを置き、「何が作ってあるか・何を書くか・何を比べるか」を示して待ち、書き終えたと伝えるとInsightを1つ返して続きに進みます。
実際の流れの例
次の流れは、仕様の説明に沿った一例です。実際の文面は、プロジェクトとプロンプトで変わります。
学習モードでの1往復
- 1
タスクを頼む
「ログインAPIにセッションタイムアウトを入れて」と依頼します。
- 2
Claudeが土台を作る
ミドルウェアなど定型の部分は、Claudeが直接実装します。
- 3
判断点で手が渡る
自動延長かハードタイムアウトかといったトレードオフの説明と、書く関数の場所が示されます。
- 4
自分で数行を書く
指定された関数に、方針に沿った5〜10行を自分で書きます。
- 5
Claudeが続きを進める
書いた内容を踏まえて、Claudeが残りの実装と解説を進めます。
導入・無効化・更新の手順
公式マーケットプレイスclaude-plugins-officialは、対話セッションを初めて開いたときにClaude Codeが自動で登録します。プラグインのインストールコマンドは/plugin install <名前>@claude-plugins-officialの形です。
/plugin install learning-output-style@claude-plugins-official解説だけで十分なら、名前をexplanatory-output-styleに替えます。シェルから入れる場合はclaude plugin install learning-output-style@claude-plugins-officialです。
入れたあとの管理は3通りです。
- 無効化: コードは端末に残したまま止める
- アンインストール: コードを端末から削除する
- 更新: プラグインのローカルコピーを作り、自分用に書き換える
学習が一段落したら無効化に切り替えれば、元に戻せます。
組み込みスタイルとの使い分け
読者が混乱しやすいのは、「組み込みのExplanatory・Learning」と「プラグイン版」の関係です。
プラグインのREADMEには、explanatory側が「非推奨になったExplanatory output styleをフックで再現するもの」、learning側が「未提供のLearning output styleとExplanatoryを合わせたもの」と書かれています。一方、現行のoutput styles公式ページは、Explanatory・Learningを組み込みスタイルとして掲載しています。Claude Codeはかつて組み込みスタイルを非推奨にした履歴があり、その後の変更でoutput styleが残っています。READMEの「非推奨」は、その時期の記述が残っていると読めます。
| 手段 | 切り替え | 向く場面 |
|---|---|---|
| 組み込みスタイル | 切り替え/output-style、outputStyle設定 | 向く場面一時的に切り替えたい、設定ファイルで管理したい |
| プラグイン(フック方式) | 切り替え/pluginで導入・無効化 | 向く場面チームにプラグインとして配る、指示文を自分用に改造したい |
組み込みはデフォルト(Default)のソフトウェアエンジニアリング指示を保ったまま、スタイルの指示を足します。プラグイン版は、そこにさらに別経路で指示を足す形です。学習モードを入れる目的が同じなら、どちらか一方で足ります。両方を同時に有効にした場合の重複挙動は、ドキュメントに記載がありません。切り替えて比べるときは、片方を無効にしてから試すと原因を切り分けやすくなります。
組み込みスタイルの全体像と自作は、output styleを自作する実践パターン集と、output styleとCLAUDE.md・Skillsの違いが扱っています。
トークンコストと注意点
READMEには、どちらのプラグインにも警告が付いています。追加の指示と出力ぶんのトークンコストを払える場合にだけ入れる、という内容です。learning側は、さらに対話型の学習モードの性質も受け入れられる場合に限るとしています。
コストが増える要因は2つです。
- 毎セッションの冒頭に指示文が加わるぶんの入力トークン
- Insightや依頼文が加わるぶんの出力トークン
組み込みのExplanatoryとLearningも、Defaultより長い応答を返す設計で、出力トークンが増えると説明されています。入力側は、プロンプトキャッシュが効くので2回目以降のリクエストでは小さくなります。
もうひとつの注意点は、学習モードは作業を速くする機能ではないことです。Learningは、判断の要る箇所で処理を止めて人に渡します。締め切りの近いタスクや、無人で回す自動化ジョブには向きません。学習用のサンドボックスリポジトリや、新しいコードベースの読み込みで使うのが素直です。
自分用の学習指示をフックで作る
「更新」でローカルコピーを作れます。そこまで改造しなくても、SessionStartフックを自分で書けば同じ方式を再現できます。たとえば次のような設定です(フックの公式仕様に沿った一例)。
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "cat ~/.claude/learning-notes.md"
}
]
}
]
}
}SessionStartフックの標準出力は、プレーンテキストならそのままClaudeが読めるコンテキストになります。learning-notes.mdには、たとえば「この利用者はGo初学者で、並行処理の説明を優先する」といった事実を書いておきます。
書き方にはコツがあります。フックのドキュメントは、注入する文を「システムへの命令」ではなく事実の叙述で書くよう勧めています。命令口調だと、プロンプトインジェクション対策が働いて、Claudeが内容を利用者にそのまま見せてしまうことがあるためです。「常にInsightを出せ」と書くより、「この利用者は設計判断の理由を知りたがっている」と書くほうが安全です。
変わらない静的な指示だけなら、フックを使わずCLAUDE.mdに書くほうが軽く済みます。フックが効くのは、セッションごとに内容を変えたいときです。たとえば当日の課題リストをcatではなくスクリプトで組み立てて流し込む用途があります。
効いていないと感じたとき
学習モードの出力が出ないときは、次の順で見ます。
/pluginで対象プラグインが有効になっているか/clearのあと、または新しいセッションで試したか。フックはセッションの開始、再開、/clearのタイミングで走ります- 組み込みスタイルと自作フックの両方で似た指示を入れていないか
- 依頼したタスクが単純なCRUDや設定変更ではないか。Learningは、そうした箇所では直接実装する作りです
Learningが「何も頼んでこない」場合の多くは、4が原因です。自分で書く箇所が出るのは、複数の妥当な方針があるロジックや設計判断の場面に限られます。
まとめ
2つのプラグインは、output styleの別名ではなく、SessionStartフックで指示を足す別の仕組みです。解説だけがほしいならexplanatory、自分で書く練習までしたいならlearningを選びます。learningはexplanatoryを含むので、両方を入れる必要はありません。
組み込みスタイルでも同じ結果が得られるため、プラグイン版を選ぶ理由は、チームへの配布や指示文の改造にあります。個人で試すだけなら、/output-styleで組み込みを切り替えるほうが手数は少なく済みます。プラグインの導入や管理の全般は、CLAUDE_CODE_PLUGIN_DIRSで複数プラグインをセッション単位で読み込むと、プラグイン推奨をSessionStartフックで自動化するが参考になります。