SFRA Best Practices Review スキル
SFCC/SFRA コードベースのベストプラクティスレビューを実行する。Swarm パターン(並列エージェント実行)で網羅的な分析を行い、P0/P1/P2 の重大度付きレビューレポートを生成。
概要
| 項目 | 内容 |
|---|---|
| 対象 | SFRA Storefront + Jobs(app_storefront_base + overlay cartridges) |
| 除外 | Headless/SCAPI/PWA Kit の実装レビュー(別スキルで対応)。SCAPI 移行準備度チェックは含む |
| 出力形式 | Markdown レビューレポート(P0/P1/P2 重大度付き) |
| 中間成果物 | docs/review/.work/ に保存 |
| 最終成果物 | docs/review/sfra-review.md |
アーキテクチャ
┌─────────────────────────────────────────────────────────────────┐ │ Orchestrator (SKILL.md) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Phase 0: Scope Detection │ │ ┌─────────────────────────────────────────────────────────────┐│ │ │ - Cartridge 構成検出(app_storefront_base, plugin_, int_) ││ │ │ - Sites/Locales 検出 ││ │ │ - 対象ファイル数/LOC 算出 ││ │ └─────────────────────────────────────────────────────────────┘│ │ │ │ │ Phase 1: Indexer (sequential) │ │ ┌─────────────────────────────────────────────────────────────┐│ │ │ Controllers/Routes マップ、ISML 一覧、Services 定義、 ││ │ │ Hooks/Jobs 一覧、Model 一覧を "地図" として生成 ││ │ └─────────────────────────────────────────────────────────────┘│ │ │ │ │ Phase 2: Explorer Swarm (並列 - 7 agents) │ │ ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ │ │controller│ model │ isml │ client │ service │cartridge│ jobs │ │ │ (sonnet) │ (opus) │(sonnet) │(sonnet) │ (opus) │(sonnet) │(sonnet) │ │ └────┬─────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┘ │ └──────────┴─────────┼─────────┴─────────┴─────────┴─────────┘│ │ ▼ │ │ Aggregator (opus) │ │ Two-step Reduce │ │ │ │ │ Phase 3: Reviewer Swarm (並列 - 4 agents) │ │ ┌─────────┬─────────┬─────────┬─────────┐ │ │ │perform. │security │ best- │ anti- │ │ │ │ (haiku) │ (opus) │practice │ pattern │ │ │ │ │ │ (haiku) │ (haiku) │ │ │ └────┬────┴────┬────┴────┬────┴────┬────┘ │ │ └─────────┴─────────┼─────────┘ │ │ ▼ │ │ Aggregator (opus) │ │ 統合レビュー + Gate 判定 │ │ │ │ │ Phase 4: Reporter (sonnet) │ │ ▼ │ │ sfra-review.md │ └─────────────────────────────────────────────────────────────────┘
ワークフロー
Phase 0: スコープ検出
目的: レビュー対象の Cartridge 構成と規模を把握
手順:
- •プロジェクトルートで cartridge 構成を検出
- •
cartridgeディレクトリ配下の構造を分析 - •対象ファイル数と LOC を算出
検出項目:
scope:
cartridges:
- name: "app_storefront_base"
type: "base"
path: "cartridges/app_storefront_base"
- name: "app_custom_mystore"
type: "overlay"
path: "cartridges/app_custom_mystore"
- name: "int_payment"
type: "integration"
path: "cartridges/int_payment"
stats:
total_files: 450
total_loc: 25000
controllers: 35
models: 28
templates: 120
jobs: 8
出力: docs/review/.work/00_scope.json
Done 条件: cartridge 構成が検出され、stats が算出されている
Phase 1: Indexer(コードベース地図作成)
目的: レビュー対象のコードベース全体像を "地図" として可視化
入力: Phase 0 の scope 情報
手順:
- •Task ツールで
sfra-indexerエージェントを起動(model: sonnet) - •Controllers/Routes のマッピング
- •Models/Decorators の一覧化
- •ISML テンプレートの依存関係
- •Services/Hooks の定義収集
- •Jobs の一覧化
出力: docs/review/.work/01_index.md
出力形式:
# SFRA Codebase Index ## Controllers (35 files) | Controller | Routes | Middleware | Cartridge | |------------|--------|------------|-----------| | Account.js | Login, Register, ... | auth, csrf | app_custom | ## Models (28 files) | Model | Decorators | Used By | |-------|------------|---------| | ProductModel.js | base, full | PDP, PLP | ## ISML Templates (120 files) | Template | Includes | Remote Includes | |----------|----------|-----------------| | pdpMain.isml | productCard, reviews | recommendations | ## Services (12 definitions) | Service ID | Type | Timeout | Retry | |------------|------|---------|-------| | payment.authorize | HTTP | 30s | 3 | ## Jobs (8 definitions) | Job ID | Steps | Schedule | |--------|-------|----------| | ProductSync | 3 | Daily 2AM |
Done 条件: 全カテゴリの index が生成されている
Phase 2: Explorer Swarm(コード分析)
目的: 各レイヤーを専門エージェントが並列で分析
入力: Phase 1 の index 情報
手順:
- •並列実行: 7 つの Explorer エージェントを Task ツールで同時起動
┌─────────────────────────────────────────────────────────────────┐ │ 並列実行(単一メッセージで複数 Task tool 呼び出し) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Task(sfra-explorer-controller, model: sonnet) ──┐ │ │ Task(sfra-explorer-model, model: opus) ──┼─→ 並列 │ │ Task(sfra-explorer-isml, model: sonnet) ──┤ │ │ Task(sfra-explorer-client, model: sonnet) ──┤ │ │ Task(sfra-explorer-service, model: opus) ──┤ │ │ Task(sfra-explorer-cartridge, model: sonnet) ──┤ │ │ Task(sfra-explorer-jobs, model: sonnet) ──┘ │ │ │ └─────────────────────────────────────────────────────────────────┘
- •各エージェントは担当範囲のみを分析し、ハンドオフ封筒形式で出力
- •Aggregator 呼び出し: Two-step Reduce で統合
- •Step 1: JSON 正規化(各エージェントの findings をマージ)
- •Step 2: Adjudication Pass(矛盾解消、重複排除)
Explorer エージェント一覧:
| Agent | Model | 担当範囲 |
|---|---|---|
| explorer-controller | sonnet | Controllers, Routes, Middleware |
| explorer-model | opus | Models, Decorators, Transactions |
| explorer-isml | sonnet | Templates, Resource Bundles |
| explorer-client | sonnet | Client-side JS, CSS |
| explorer-service | opus | Services, External Integrations |
| explorer-cartridge | sonnet | Architecture, Layering |
| explorer-jobs | sonnet | Jobs, Batch Processing |
出力:
- •
docs/review/.work/02_explorer/*.md(各エージェントの生出力) - •
docs/review/.work/03_explorer_unified.md(統合済み分析)
Done 条件:
- •7 エージェントすべてが status: ok で完了
- •explorer_unified.md が生成されている
Phase 3: Reviewer Swarm(品質レビュー)
目的: Cross-cutting concerns を専門エージェントが並列でレビュー
入力: Phase 2 の統合分析結果
手順:
- •並列実行: 4 つの Reviewer エージェントを Task ツールで同時起動
┌─────────────────────────────────────────────────────────────────┐ │ 並列実行(単一メッセージで複数 Task tool 呼び出し) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Task(sfra-reviewer-performance, model: haiku) ──┐ │ │ Task(sfra-reviewer-security, model: opus) ──┼─→ 並列 │ │ Task(sfra-reviewer-bestpractice, model: haiku) ──┤ │ │ Task(sfra-reviewer-antipattern, model: haiku) ──┘ │ │ │ └─────────────────────────────────────────────────────────────────┘
- •各 Reviewer は P0/P1/P2 の重大度付きで指摘事項を出力
- •Aggregator 呼び出し: 指摘の統合と Gate 判定
Reviewer エージェント一覧:
| Agent | Model | 担当範囲 |
|---|---|---|
| reviewer-performance | haiku | Caching, require scope, API calls |
| reviewer-security | opus | XSS, CSRF, Input validation, PII |
| reviewer-bestpractice | haiku | SFRA guidelines, patterns |
| reviewer-antipattern | haiku | Known anti-patterns detection |
出力:
- •
docs/review/.work/04_reviewer/*.md(各エージェントの生出力) - •
docs/review/.work/05_review_unified.md(統合済みレビュー)
Done 条件:
- •4 エージェントすべてが status: ok で完了
- •Gate 判定が実行されている
Phase 4: Reporter(レポート生成)
目的: 最終レビューレポートを生成
入力: Phase 3 の統合レビュー結果
手順:
- •Task ツールで
sfra-reporterエージェントを起動(model: sonnet) - •テンプレートに基づいてレポート生成
- •Executive Summary 作成
- •カテゴリ別 Findings 整理
- •Recommendations 作成
出力: docs/review/sfra-review.md
Done 条件: レポートが生成され、P0/P1/P2 のサマリーが含まれている
Gate 判定ロジック
P0 (Blocker) - 1 つで FAIL
| Category | Trigger |
|---|---|
| Security | XSS 脆弱性、PII ログ出力、CSRF 未対策 |
| Transaction | Transaction 境界外の書き込み |
| Architecture | app_storefront_base 直接編集 |
| Performance | グローバル require が 10 箇所以上 |
P1 (Major) - 2 つ以上で FAIL
| Category | Trigger |
|---|---|
| Controller | server.append() での ViewData 変更 |
| ISML | isscript 内 business logic 5 箇所以上 |
| Service | タイムアウト/リトライ未設定 |
| Cartridge | Naming collision 検出 |
| Jobs | 冪等性未保証、Transaction 境界違反 |
P2 (Minor) - 要対応リスト
| Category | Trigger |
|---|---|
| Performance | キャッシュ未活用 |
| Code Quality | Magic numbers |
| Best Practice | 軽微なガイドライン違反 |
Gate 判定結果
gate_decision: p0_count: 0 p1_count: 3 p2_count: 12 result: "PASS" # P0=0 かつ P1<2 なら PASS overall_status: "REVIEW_NEEDED" # P1>0 または P2>5 なら要レビュー
エージェント呼び出しパターン
Phase 2 Explorer Swarm 呼び出し例
7 つの Explorer エージェントを並列で起動する。
単一のメッセージ内で複数の Task tool を呼び出す。
Task(
description: "Analyze SFRA controllers",
prompt: "Index ファイル (.work/01_index.md) を読み、
Controllers/Routes/Middleware を分析して
ベストプラクティス違反を検出せよ。
出力: .work/02_explorer/controller.md",
subagent_type: "sfra-explorer-controller",
model: "sonnet"
)
Task(
description: "Analyze SFRA models",
prompt: "Index ファイル (.work/01_index.md) を読み、
Models/Decorators/Transactions を分析して
ベストプラクティス違反を検出せよ。
出力: .work/02_explorer/model.md",
subagent_type: "sfra-explorer-model",
model: "opus"
)
// ... 残り 5 エージェント同様
Aggregator 呼び出し例
全 Explorer の出力が揃ったら Aggregator を呼び出す。
Task(
description: "Aggregate explorer findings",
prompt: ".work/02_explorer/ 配下の全ファイルを読み、
Two-step Reduce で統合せよ。
Step 1: findings のマージ
Step 2: 矛盾解消・重複排除
出力: .work/03_explorer_unified.md",
subagent_type: "sfra-aggregator",
model: "opus"
)
ツール使用ルール
各 Phase で使用可能なツール
| Phase | 許可ツール | 備考 |
|---|---|---|
| Phase 0 | Glob, Bash (read-only) | ファイル検出のみ |
| Phase 1 | Read, Glob, Grep | Index 作成 |
| Phase 2 | Read, Glob, Grep | 分析のみ |
| Phase 3 | Read | レビューのみ |
| Phase 4 | Read, Write | レポート生成 |
書き込み制限
- •書き込み可能:
docs/review/およびdocs/review/.work/のみ - •読み取り専用: その他すべてのディレクトリ
Orchestrate コマンド
自動実行モードでは、以下のフローで全 Phase を順次実行する:
自動実行フロー
/sfra-review → Phase 0 → Phase 1 → Phase 2 (7 agents) → Aggregator
→ Phase 3 (4 agents) → Aggregator + Gate → Phase 4 → Report
Done 判定
各 Phase の完了条件をチェックし、次の Phase に自動遷移:
| Phase | Done 条件 |
|---|---|
| 0 | 00_scope.json が生成済み |
| 1 | 01_index.md が生成済み |
| 2 | 7 Explorer が status: ok、03_explorer_unified.md 生成済み |
| 3 | 4 Reviewer が status: ok、Gate 判定完了 |
| 4 | sfra-review.md が生成済み |
エラーリカバリー
- •Explorer 一部失敗: 成功分のみで Aggregator 実行(警告付き)
- •Reviewer 失敗: Phase 3 からリトライ
- •Aggregator 失敗: 対応する Phase からリトライ
エラーハンドリング
| 状況 | 対応 |
|---|---|
| Cartridge 未検出 | status: blocked、ユーザーにパス確認を求める |
| Explorer 一部失敗 | 警告を出力し、成功したものだけで続行 |
| 全 Explorer 失敗 | status: blocked、原因を報告 |
| Aggregator 失敗 | Phase 2 からリトライ |
| Reporter 失敗 | Phase 4 からリトライ |
出力ディレクトリ構造
docs/review/ ├── .work/ # 中間成果物(.gitignore 推奨) │ ├── 00_scope.json # Phase 0: スコープ │ ├── 01_index.md # Phase 1: Index │ ├── 02_explorer/ # Phase 2: Explorer 生出力 │ │ ├── controller.md │ │ ├── model.md │ │ ├── isml.md │ │ ├── client.md │ │ ├── service.md │ │ ├── cartridge.md │ │ └── jobs.md │ ├── 03_explorer_unified.md # Phase 2: 統合分析 │ ├── 04_reviewer/ # Phase 3: Reviewer 生出力 │ │ ├── performance.md │ │ ├── security.md │ │ ├── bestpractice.md │ │ └── antipattern.md │ └── 05_review_unified.md # Phase 3: 統合レビュー └── sfra-review.md # 最終レポート