sliced-bread-review について
Sliced Bread アーキテクチャに照らして変更をレビューするスキルです。依存方向、スライス境界、モデルの純粋性、抽象化の根拠、イベント利用を確認し、コードは変更せず指摘を報告します。
主な機能
- 01変更ファイルの依存方向を確認
- 02公開境界を迂回するインポートを検出
- 03ドメインモデルのインフラ依存を確認
- 04新しい抽象化の導入根拠を評価
- 05イベントが逆方向依存を表すか確認
活用シーン
- 01ブランチや未コミット変更をレビュー
- 02レイヤー間依存とスライス境界違反を特定
- 03マージ前に根拠の薄い抽象化やイベント利用を発見
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ paulnsorensen/ sliced-bread-architecture --skill sliced-bread-reviewインストール後、Claude Code で/sliced-bread-reviewを入力して読み込まれたか確認します。
詳細
Sliced Bread のレビュー
対象の変更セットを Sliced Bread アーキテクチャに照らしてレビューします。詳細な根拠は https://cheeselord.dev/sliced-bread-architecture/reference/sliced-bread/ に記載されています。このスキルは実務向けのチェックリストです。
対象範囲
呼び出し内容から、次の優先順位でレビュー対象を決定します。
- ユーザーが指定したパス、差分、ブランチ、または PR。
- デフォルトブランチとの差分である現在のブランチの変更。
- 未コミットの変更(
git diff HEAD)。
変更されたファイルと、変更されたファイルからインポートされているファイルのみをレビューします。
5 つのチェック項目
変更されたすべてのファイルに対して、すべてのチェックを実施します。指摘ごとに file:line を記載し、問題のあるインポートまたは定義を引用します。
1. インポートの方向
依存の矢印は、許可された方向にのみ向けられます。具象アダプターをインポートできるのはコンポジションルート(app/bootstrap、main)のみです。また、entrypoints/ をインポートしてはいけません。スライスは、兄弟スライスの公開インターフェースを直接インポートできます。矢印は許可される方向を示すものであり、必須のディレクトリ構成を定めるものではありません。entrypoints/ レイヤーがないリポジトリは違反ではありません。
entrypoints/ -> app/ -> domains/* -> domains/common/
app/bootstrap -> adapters/ (composition root only)
adapters/ -> domains/* (implement domain ports)
Never:
app/use_cases/* -> adapters/*
domains/* -> adapters/ | app/ | entrypoints/
adapters/* -> app/ | entrypoints/
common/ -> sibling domains
anything -> entrypoints/
これらの矢印に反する依存はブロッカーです。ユースケースが具象アダプターをインポートしている場合は中程度です。
2. 境界の完全性
外部の利用側は、言語本来の形式でスライスの公開インターフェースを使用します。Go ではエクスポートされた識別子、Python ではパッケージの __init__ サーフェス、TypeScript では index モジュール、その他の言語では公開クラスのサーフェスを使用し、内部実装にはアクセスしません。from domains.pricing import calculate_discount は問題ありませんが、from domains.pricing.discount_calculator import ... は違反です。利用側が複数ある場合は高、1 つの場合は低です。
3. モデルの純粋性
ドメインファイルがインポートできるのは、標準ライブラリ、common/、および兄弟スライスの公開 API のみです。HTTP クライアント、ORM、またはキューをインポートするドメインファイルは違反です。修正するには、ドメイン内でポート(プロトコル)を定義し、アダプターで実装します。重大度は、以下の重大度にある doctrine:severity-cases マトリクスを、最初に一致する項目から順に適用して判定します。
4. 成長の正当性
新しいディレクトリや抽象化を導入するには、実証された必要性が求められます。具体的な用途が2つあることは通常の証拠基準であり、絶対条件ではありません。実装が1つしかない抽象基底クラス、まだイベントが存在しないのに導入されたイベントバスインターフェース、プラグインが1つしかないレジストリは、具体的な必要性が正当化されない場合に限り中程度です。以下のガードでいう「数値しきい値」とは、推奨される成長の兆候(約200行、3つ以上の概念、まとまりのあるファイルが3つ以上)を指し、採点可能な制限ではありません。次の誤検出は抑制してください:
- 利用側が1つだけでも、それだけで時期尚早な抽象化の証明にはなりません。具体的な必要性があるかを評価してください。利用側が2つあることは通常の証拠であり、絶対条件ではありません。
- 単一ファイルのまま維持された新しい概念は適切です。問題として指摘しないでください。
- スライス間の循環依存を解消するために導入されたディスパッチャーは、イベントと購読者が1つずつでも、実証された必要性があります。
- 数値しきい値は推奨される兆候であり、採点可能な違反ではありません。実装の共有状況、公開インターフェースの規模、ライフタイムの混在を評価してください。
- プライバシーを確保する唯一の方法がファイル配置である言語では、内容を内部扱いにするサブディレクトリは、内部にファイルが1つだけでも、その可視性境界に対する実証された必要性があります。
| ID | 条件 | 期待値 | 理由 |
|---|---|---|---|
growth-cycle-event | スライス間の循環依存を解消するために、イベントディスパッチャーが導入されています。 | allow | ディスパッチャーは具体的な循環依存を解消しており、必要性を優先する成長の兆候に対する典型的な例外です。 |
growth-positional-one-file | 他のプライバシー確保手段がない言語で、1ファイルの位置指定の構成要素が内部可視性を示しています。 | allow | ファイルが1つだけでも、このディレクトリは推測的な成長構造ではなく、可視性の境界です。 |
growth-single-unpressured | 新しい抽象化の具体的な利用側は1つで、実証された必要性はありません。 | medium | 具体的な利用側が2つあるという通常の兆候を満たしていないため、抽象化を阻害要因とみなすのではなく、時期尚早ではないか検討してください。 |
参照が所有する doctrine:growth-cases マトリックスを先頭から順に適用してください。マトリックス外の文章から結果を推測しないでください。
5. イベントの使用
イベントは逆方向の依存関係に使用します。つまり、AがBの存在を知らずに、BがAに反応します。
スライス間の循環依存は、common/ で型定義されたイベントを介して解決する必要があります(high)。
直接インポートが自然な依存関係である場合に、イベントを汎用メッセージングとして使用することは、medium の指摘です。
重大度
上記のチェックで示されている重大度は、この表に基づいています。
| 重大度 | 意味 |
|---|---|
| blocker | 依存関係の矢印が逆向きです。ドメインファイルのインポート時にインフラストラクチャが実行されています |
| high | スライスをまたぐ内部インポートです。スライス間に循環依存があります。複数の利用側がある状態で、crust を迂回しています |
| medium | モデルの純粋性が損なわれています(インフラストラクチャはインポートされていますが、インポート時には実行されません)。抽象化が早すぎます。イベントをメッセージングとして使用しています。コンポジションルートの外部でアダプターがインポートされています |
| low | 単一の利用側による crust の迂回です。命名にずれがあります |
| ID | 前提 | 期待される結果 | 理由 |
|---|---|---|---|
severity-import-exec | ドメインモジュールが、インポート時にインフラストラクチャの処理を実行します。 | blocker | インポート時の副作用により、すべての利用側でインフラストラクチャのコストが発生し、アプリケーションの起動が制御される前に失敗する可能性があります。 |
severity-static-domain-infra | ドメインモデルがインフラストラクチャに静的に依存しています。 | medium | この依存関係はモデルの純粋性に反し、変更時の結合度を高めますが、静的な依存関係だけではインポート時の実行失敗にはなりません。 |
severity-static-concrete-adapter | ユースケースまたはアプリケーションサービスが、ドメインポートではなく具象アダプターをインポートしています。 | medium | アプリケーション層がインフラストラクチャの選択に結合しています。ポートを介した依存性注入により、意図された境界を取り戻せます。 |
severity-other-forbidden-edge | 依存関係の矢印が禁止された方向を向いており、より具体的な重大度のケースには該当しません。 | blocker | 他のケースに該当しない構造上の依存関係の逆転は、スライスの依存関係に関する契約を破るため、直ちに修正する必要があります。 |
参照元が管理する doctrine:severity-cases マトリックスを、先に一致したものから順に適用してください。マトリックス外の説明文から結果を推測してはいけません。
出力
重大度ごとに重大な順で指摘をまとめて報告します。各指摘は次の形式にしてください。
重大度 — チェック — ファイル:行 — 引用した証拠 — 1行の修正案。空の
レポートも有効な結果です。指摘を捏造してはいけません。修正は行わないでください。
このスキルはレビューのみを行います。