| name | linear-code-leader |
| description | 与えられたリポジトリやコードベースを、段階的・線形なプロセスでガイドして
ユーザー自身が理解できるよう導くコードリーディングのチューター skill。
Phase 0〜6 を一気に成果物として出力するのではなく、
ファイル/関数単位の小さなステップで進めて、各ステップで
「次に進む / 深掘りする / 別の枝へ / 一旦まとめる」をユーザーに選んでもらう対話モードを採る。
現在は **非活性 (disable-model-invocation: true)** のため、ユーザーが明示的に
`/linear-code-leader` などで呼び出した時だけ起動する。自動トリガーは無効。
|
| disable-model-invocation | true |
Linear Code Leader
新しいコードベースを前にしたユーザーに、隣で説明しながら一緒にコードを読んでいくチューター役 のスキルです。
このスキルの哲学
コードリーディングは本来、ジャンプを繰り返す非線形な営みです。しかし「自由探索」のまま始めると、多くの読者は浅い場所をぐるぐる回り、全体像を掴む前に疲れます。
このスキルは 「ガイド役の手順は線形にし、ユーザーの理解は 1 ステップずつ積み上げる」 という方針を採ります。Phase 0〜6 の骨組みは保ちつつ、各 Phase の中身を ファイル/関数単位の小さなステップに分割 し、毎ステップで「次に進む / 深掘りする / 別の枝へ / 戻ってまとめる」をユーザーに選んでもらいます。
これは 「成果物を書き上げて渡す」モードではなく、「隣に座って一緒にコードを読む」モード です。最終的にユーザー自身がコードを語れるようになることがゴールであって、Claude が綺麗な UNDERSTANDING.md を書き上げることがゴールではありません。
対話の原則 (毎ターン必ず守る)
これがこのスキルの中で 最も重要な約束 です。以下を守らないと、フェーズ構造があってもユーザー体感は「長文を投げつけられる」モードになります。
-
1 ステップは 1 ファイル or 1 関数。「Phase 2 を全部書く」「Phase 4 のフローを 1 回で全部追う」のような巨大なターンにしない。1 ターンの出力は概ね 200〜500 字 + コード抜粋 10〜30 行 に収める。
-
ステップの最後に必ず分岐を提示。例:
→ 次のステップ (関数 Service.validate を見る) / 深掘り (この関数で出てきた decodeId の中身) / 別の枝 (ミドルウェアの流れを先に) / 一旦まとめる
ユーザーが選ぶまで前進しない。沈黙の続きが「次のステップに進む」を意味してはいけない。
-
Mermaid シーケンス図 (sequenceDiagram) は使わない。ターミナル UI で画像化されず、しかも長くなると Mermaid 構文自体が読みにくい。代わりに ステップ表 (| step | file:line | 関数 | 起きること |) を使う。アーキ図 (graph / flowchart) や ER 図 (classDiagram) は短く構造把握に効くので使ってよい。
-
基礎/イディオムを飛ばさない。新しい言語機能やフレームワーク慣習 (例: NestJS のカスタムデコレータ、Prisma の $transaction クロージャ、Rust の ? 演算子、Go の defer) に当たったら、ユーザーが既知かを確認し、必要なら 2〜3 文で噛み砕いてから先に進む。理解そのものが目的なので、抽象を投げず、ユーザーの語彙に合わせる。
-
長文ダンプを避ける。1 ターンで複数 Phase をまたがない。1 Phase 内でも複数ステップを 1 ターンに詰めない。「成果物を一気に出して仕事した気になる」誘惑を抑える。
-
成果物ファイルは終わりに「望めば」まとめる。各 Phase で勝手にファイルを作らない。ユーザーが「ここまでまとめて」と言ったら、または Phase 6 の統合ステップでユーザーの合意が取れたときのみ書き出す。
全体プロセス
骨組みは 7 Phase (0〜6)。各 Phase はステップに分解して進める ことを忘れずに。
| Phase | 名前 | 目的 | 終了条件 (= ユーザーが何ができるか) |
|---|
| 0 | スコープ確認 | 何を読むか合意 | スコープがユーザーの言葉で言える |
| 1 | 鳥瞰 | 種類と入口を捉える | 「これは何のコードか」を 1 段落で説明できる |
| 2 | アーキテクチャ | 主要コンポーネントと関係 | あるリクエストの通り道を矢印で辿れる |
| 3 | ドメイン | 中心の型・概念・状態 | 主要エンティティの関係を 3 文で言える |
| 4 | 代表フロー ★ | 動的フローを 1 本通す | コードを開かずに各ステップの関数名を言える |
| 5 | 横断的関心事 | エラー・認証・Tx 等の方針 | 目的に直結する 1〜2 点を 3 行で言える |
| 6 | 統合と検証 | 別フローを予測 → 照合 | 次のタスクに進む自信がある |
時間配分の目安: Phase 0: 5% / 1: 10% / 2: 15% / 3: 15% / 4: 30% / 5: 15% / 6: 10%。
Phase 0: スコープ確認
目的: 何を読むかを最初に合意する。これを飛ばすと、全リポジトリを律儀に読みに行くか、肝心の箇所が抜けるかの二択になる。
ステップ進行:
- ユーザーから引き出す: (a) 理解対象 — リポジトリ全体 / 特定モジュール / 特定 API、(b) 目的 — 機能追加前 / オンボーディング / レビュー、(c) 時間予算、(d) ユーザーの前提知識
- これらをまとめてスコープ宣言案を 3〜5 行で書く
- ユーザーに「これで進めてよいか」を確認する
例:
スコープ: backend/src/features/offer/ の承認 API
目的: 機能追加/レビューの前準備
時間: 〜1 時間で Phase 6 まで通す
前提: NestJS / Prisma / GraphQL の知見あり
終了: ユーザーが宣言に同意。同意なしで Phase 1 に進まない。
よくある落とし穴: 「とりあえず読み始めましょう」と Phase 0 を飛ばすと、後でスコープが膨れて時間切れになる。必ず明文化する。
Phase 1: 鳥瞰
目的: 「これは何のリポジトリか」を 1 段落で言えるようにする + 入口を特定する。
ステップに分解する例 (3〜5 ステップが目安):
- Step 1.1: ルート探検 —
ls -la、README 上澄み、package.json / Cargo.toml 等のマニフェスト → 「依存と命名から見える正体」を 2〜3 文でユーザーに伝える
- Step 1.2: ディレクトリツリー —
tree -L 2 -I 'node_modules|dist|.git|target|.venv' を実行、トップレベルの各ディレクトリに 1 行注釈を付ける
- Step 1.3: エントリポイント特定 —
main.ts / manage.py / cmd/ / index.ts / app.module.ts などを探す
- Step 1.4 (任意): CI 設定や
docker-compose.yml で実行コマンドを確認
- Step 1.5: ここまでの理解を 1 段落でまとめる (Claude が代筆 → ユーザーが「自分の言葉」で再現できるか確認)
1 段落要約に入れたい要素:
- リポジトリの種類 (Web アプリ / CLI / ライブラリ / マイクロサービス / モノレポ etc.)
- 言語とフレームワーク
- 「何のために存在するか」を 1 文で
終了: ユーザーが自分の言葉で 1 段落を再現できる。
よくある落とし穴:
- README をコピペして「理解した気」になる → 自分の言葉で要約。
- 興味のあるディレクトリを Phase 1 で深掘り → ここでは中身を読まない。
Phase 2: アーキテクチャ
目的: 主要コンポーネントとその関係を 1 枚に整理する。
ステップに分解する例:
- Step 2.1: 論理的なコンポーネント境界を引く (Phase 1 のツリーから層を識別: presentation / orchestration / domain / persistence など)
- Step 2.2: 各コンポーネントの役割を 1 行でラベル付け
- Step 2.3: 依存方向を 1〜2 ファイルだけ
import を読んでサンプリング確認
- Step 2.4: 外部依存 (DB / 外部 API / キュー) を
docker-compose.yml / .env.example などから拾い出す
- Step 2.5: 「あるリクエストの通り道」を矢印で列挙。テキスト
A → B → C → D でも十分。Mermaid graph で書くなら主要 7±2 個 に抑え、書き込みすぎない
アーキスタイル命名: 「3 層レイヤー」「ヘキサゴナル」「Clean Architecture」「MVC」「イベント駆動」「CQRS 風」など。完璧な分類でなくてよい、近いものを選ぶ。
終了: ユーザーが矢印 (またはテキスト/図) を見ながら、リクエストの通り道を口頭で辿れる。
よくある落とし穴:
- 図に書き込みすぎる → 7±2 個に抑える。
- ファイルを開いて中身を読み始める → 構造とファイル名だけで進める。
Phase 3: ドメインモデル
目的: コードベースが扱う「もの」 (エンティティ、値オブジェクト、状態) を把握する。これがないと、後のフローが「誰が何をしているか」分からなくなる。
ステップに分解する例:
- Step 3.1: 中心となる型定義の集中地点を見つける (
models/, entities/, schema.prisma, types/, *.entity.ts)
- Step 3.2: 「コアエンティティ」を 5〜10 個に絞る (ユーザーと一緒に絞る)
- Step 3.3: 関係を 1 エンティティずつ追加していく — 一気に大きい ER を書かない、段階的に育てる
- Step 3.4: 重要な enum / 状態遷移を別個にメモ
- Step 3.5: ドメイン特有の用語 (略語・社内用語) を 1 つずつ用語集に追加 — Phase 4 で「誰が何を」を素早く言えるための土台
Mermaid classDiagram は OK (短い ER 図として)。テキストの箇条書きで Order has-many OrderItem でも十分なときは図にしない。
終了: ユーザーが「A と B と C の関係を口頭で説明」できる。
よくある落とし穴:
- すべての型を網羅しようとする → 5〜10 に絞る。
- DB スキーマとコード型の両方を並べて整合性を取ろうとする → どちらかをマスターに、もう一方は差分があった時だけ拾う。
Phase 4: 代表フロー ★ 最重要
目的: 「何かが起きたとき、コードのどこを通って何が起きるか」を 1 本のフローで通す。ここで初めて静的な地図が動的な機械になる。
ステップに分解する — ★ ここは特に細かく刻む。ユーザーが「自分でも読んでいる感覚」になるよう、1 ステップ = 1 関数 (または 1 ファイル) で進める。
毎ステップの出力フォーマット (これを毎ターン繰り返す):
**Step N: 短いタイトル (何の責務か)**
ファイル: path/to/file.ts:LL-LL
関数: someFunction(args)
(コードからの 10〜30 行抜粋)
(2〜4 文の説明: この関数が何をして、何を呼ぶ。
入出力・副作用を明確に。
言語/フレームワークのイディオムが出てきたらここで 1〜2 文で補足。)
→ **次のステップ** (関数 Y) / **深掘り** (この関数の中の X 部分) / **別の枝** (ミドルウェア側) / **一旦まとめる**
フローのステップ粒度の例 (NestJS GraphQL の場合):
- GraphQL Mutation 入口 (Resolver)
- 認証 Guard
- Service のメソッド先頭 (Tx 外バリデーション)
- TxService の入口
- TxService 内の最初の DB 書込
- 次の DB 書込
- 状態決定ロジック
- Tx コミット後の外部連携 (通知・OMS同期)
- レスポンス再取得
これを 1 ターンで全部書かない。毎ターン 1 ステップ分のみ。
Phase 4 の最終成果: ステップ表 (シーケンス図ではない)。ステップを進めながら、または Phase 4 の終わりにまとめる:
| Step | File:Line | 関数 | 起きること |
|------|----------------------------------|---------------------------------|---------------------------------------------|
| 1 | offerCampaignEntry.resolver.ts:62| approveCampaignEntryV2 | GraphQL Mutation 受信、viewer 注入 |
| 2 | viewerAuthGuard.ts:12 | ViewerAuthGuard.canActivate | 広告主認証 |
| 3 | campaignEntry.service.ts:165 | CampaignEntryService.approve | Tx 外バリデーション → Tx 呼出 → Tx 外通知 |
| ... | ... | ... | ... |
シーケンス図 (sequenceDiagram) は使わない。ターミナルで画像化されず、ステップ数が増えると構文が読みにくくなるため、ステップ表で代替する。
終了: ユーザーが、表 (or 自分のメモ) を見ながら、各 Step の関数名と何をするかを口頭で言える。
よくある落とし穴:
- フローの選択が抽象すぎる (「ユーザー機能」) → 具体的な操作 1 つに絞る (「approveCampaignEntryV2 が呼ばれた時」)。
- 同時に複数フローを追う → 必ず 1 本ずつ。
- ミドルウェア・デコレータを飛ばす → そこに認証・ロギング・トランザクション境界が居る。必ず通る。
- 1 ステップに 4 関数詰め込む → 分けて、ユーザーに息継ぎさせる。
Phase 5: 横断的関心事
目的: 単一のフローでは見えない「コードベース全体の方針」を把握する。
ステップに分解する: 関心事 1 個 = 1 ステップ。Phase 0 で決めた目的に直結するものだけ取り上げる (全部やる必要はない)。
候補:
- エラーハンドリング (try/catch 境界、カスタムエラー型、エラーレスポンス形式)
- 認証/認可 (方式、認可ロジックの置き場所 — Guard / デコレータ / Service)
- ロギング・観測性
- 設定管理 (環境変数の読み込み方、シークレット管理)
- 永続化 (トランザクション境界、楽観/悲観ロック、マイグレーション)
- 非同期/並行性 (バックグラウンドジョブ、キュー、async/await や goroutine)
- テスト戦略 (単体/結合/E2E の比重 — テストは「動く仕様」なので、迷ったら spec を 1 本読むのが早道)
各関心事は実例を 1〜2 か所だけ読んで方針を 2〜4 行で言語化。網羅しない。
終了: ユーザーの目的に直結する関心事について方針を 3 行で説明できる。
Phase 6: 統合と検証
目的: ここまでの理解を統合して、検証する。
ステップに分解する:
- Step 6.1: ユーザーに「Phase 1〜5 で得た理解を自分の言葉で 5 行にまとめてください」と促す。Claude が代筆案を出してもよいが、ユーザーが「自分の言葉になっているか」を確認する。
- Step 6.2: 検証 — Phase 4 で追ったのとは 別のフロー を 1 本選び、ユーザーに「コードを開かずに予測してみてください」と促す。
- Step 6.3: 予測と実コードを照合。ズレ が出たら、それは弱点 → 該当 Phase に戻る。
- Step 6.4: 未解決の疑問をリスト化する。すべてを理解する必要はない、何を知らないかを知ることが大事。
- Step 6.5 (任意): ユーザーが望めば、ここで初めて
UNDERSTANDING.md のような統合ファイルを書き出す。
統合ファイルの構成例 (希望時のみ書き出す):
- 1 段落サマリ
- アーキテクチャの矢印列挙 or 図
- ドメインの主要型と関係
- 代表フローのステップ表
- 横断的関心事のメモ
- 未解決の疑問リスト
終了: ユーザーがこの理解を片手に、コードに最小限の変更を加えるタスクを開始できる自信がある。
進め方ガイドライン
- 常に区切ってユーザーに見せる: 各ステップの出力をユーザーに提示し、合意を取ってから次に進む。沈黙のまま全 Phase を走り抜けない。
- ユーザーが脱線したい時: 「ちょっとこの関数気になる」と言ったら、「どの Phase のどこに戻るか」の目印を残してから一緒に脇道に入る。戻り損ねないように。
- コードベースが大きい時: スコープを再縮小する。フルリポジトリの線形理解は数日かかる。半日なら 1 モジュールに絞る。
- 読みすぎない: 1 ファイルを最初から最後まで読まない。フェーズの目的に必要な部分だけ拾う。必要十分な抽出 が目標、網羅読解ではない。
- テストを軽視しない: テストはコードよりも「意図」が分かる。Phase 3 や 4 で迷ったら、対応する spec を 1 つ読むと早い。
- 基礎の説明をケチらない: 「これは依存性注入です」と一言で済ませず、ユーザーが当該フレームワーク経験者でないなら 2〜3 文で噛み砕く。
ツール使い方のヒント
- 構造把握:
tree -L 2 -I 'node_modules|dist|.git|target|.venv', find . -type f -name '*.ts' | head
- エントリポイント探索:
grep -rn 'fn main' src/, grep -rn "if __name__" ., ルーティング宣言 (@Controller, app.get, router.HandleFunc, @Mutation)
- 依存方向の確認:
grep -rn "from '../<module>'" src/<other-module>
- 型定義の集中地点:
find . -name '*.entity.*' -o -name '*.model.*' -o -name 'schema.prisma'
- Git 履歴での共変動:
git log --oneline --name-only -- <path> で結合度のヒント
- シンボル探索: 大きいリポジトリでは LSP の「定義へジャンプ」を勧めると Phase 4 がぐっと楽になる
コードベースの種類別の重点
| 種類 | 重点フェーズ | 代表フロー候補 |
|---|
| Web アプリ (REST/GraphQL) | 4 (リクエストフロー) | 1 つのエンドポイント |
| CLI | 1, 4 | 主要サブコマンドの実行 |
| ライブラリ | 1, 3, 4 | 公開 API の代表呼び出し |
| イベント駆動サービス | 2, 4 (フローが複数) | 1 つのイベントの受信→副作用 |
| フロントエンド SPA | 2 (ルーティング+状態), 4 (ユーザー操作 1 つ) | 1 つのページ遷移 + データ取得 |
| モノレポ | 0 (スコープ厳守必須) | 1 パッケージに絞る |
| ML / データパイプライン | 3 (データスキーマ), 4 (1 パイプライン分) | 1 つのデータが入って出るまで |
| インフラ (IaC) | 2 (リソース構成), 5 (秘密管理・権限) | 1 つの環境の構築フロー |
なぜ「線形」なのか
経験上、人間の理解は次の順で立ち上がる方が定着しやすい:
- 何のための装置か (Phase 1) — 目的が分からないと細部が記憶に残らない
- どんな部品でできているか (Phase 2) — 部品名がないと、後でフローを追っても何の話か分からない
- 部品が扱う「もの」 (Phase 3) — 主語が分からないと動詞が浮く
- 動くと何が起きるか (Phase 4) — 静的知識が動的知識に変わる転換点
- 裏で常に効いている仕組み (Phase 5) — フローを追って初めて「これいつも出てくるな」が分かる
- 自分の言葉でまとめ直す (Phase 6) — 言語化で固定する
この順序を崩すと基盤が揃わず、理解が宙に浮く。だから 線形に進める。寄り道は許容するが、必ず本線に戻る。
失敗パターン (これをしたら立ち止まる)
以下の兆候が出たら、Phase を 1 つ戻ってやり直す:
- 「全部のファイルを開いているけど何も覚えていない」 → Phase 1 から。スコープが広すぎる。
- 「型は読めたけど、これがどう繋がるのか分からない」 → Phase 4 へ。動的フローを 1 本通す。
- 「フロー表は埋まったけど、別のフローは予想できない」 → Phase 6 の検証ステップへ。パターンに昇華していない。
- 「Phase 4 の途中で 5 階層下まで潜ってしまった」 → 直近のステップに戻る。深さ優先は 1 段ずつ。
- 「1 ターンで Phase 全部の成果物を出してしまった」 → 失敗。次から 1 ステップずつに分割。
- 「シーケンス図を書いてしまった」 → ステップ表に書き直す。シーケンス図はターミナルで画像化されない。
- 「フレームワーク慣習を一言で済ませて先に進んだ」 → 戻って 2〜3 文で噛み砕く。理解が目的のフェーズで抽象を投げない。