codeprobe-framework について
PHP/Laravel、React/Next.js、Python/Django/FastAPIの規約を確認するcodeprobeのサブスキルです。一般的なセキュリティや性能ではなく、フレームワーク固有の使い方をレビューします。
主な機能
- 01LaravelとEloquentの規約チェック
- 02ReactとNext.jsの使い方を確認
- 03DjangoとFastAPIの実践を確認
- 04フレームワークのバージョンを考慮
- 05他のスキルが扱う問題を除外
活用シーン
- 01Laravelのモデルやルーティングのレビュー
- 02React Hooksやコンポーネント規約の確認
- 03DjangoやFastAPIの利用方法の監査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ machineroom-dev/ codeprobe --skill codeprobe-frameworkインストール後、Claude Code で/codeprobe-frameworkを入力して読み込まれたか確認します。
詳細
スタンドアロンモード
オーケストレーター経由ではなく直接実行する場合は、まず次の手順を実行してください。
../codeprobe/shared-preamble.md(この SKILL.md の場所を基準に解決してください。ユーザーのプロジェクトではなく、隣接するcodeprobeスキルディレクトリを基準にします)を読み、出力契約、実行モード、制約を確認します。- プロジェクトの技術スタックに基づいて、該当する参照ファイルを
../codeprobe/references/(同じ基準で解決)から読み込みます。 - ユーザーから別の指定がない限り、
fullモードをデフォルトとします。
フレームワーク固有のベストプラクティス
対象範囲
このサブスキルは、フレームワーク固有のアンチパターンや規約違反を検出します。普遍的な原則を適用する他のサブスキルとは異なり、フレームワーク固有のリファレンスガイドを読み込み、フレームワークの慣用的な使い方に照らしてチェックします。
サポート対象のフレームワーク:
- PHP / Laravel — Eloquent ORM、ルーティング、バリデーション、キュー、イベント、設定
- React / Next.js — コンポーネント設計、フック、データ取得、型安全性
- Python / Django / FastAPI — PEP 規約、ORM パターン、非同期処理
重要: 対象パスでサポート対象のフレームワークが検出されない場合は、検出結果を 0 件とし、「No supported framework detected — skipping framework-specific checks.」という注記を付けた空のサマリーを返してください。
バージョンの確認: フレームワークの規約をチェックする際は、フレームワークのバージョンの特定を試みてください。
- Laravel:
composer.jsonでlaravel/frameworkのバージョンを確認します。Laravel 9 以降では、getXAttribute()ではなく属性ベースのアクセサーを使用します。 - Next.js:
next.config.*とpackage.jsonで Next.js のバージョンを確認します。13 以降では、app/ディレクトリを使った App Router を使用します。 - Django:
requirements.txtまたはsetup.pyで Django のバージョンを確認します。
検出対象外
- 他のサブスキルですでに扱われている問題。フレームワークのコード内に見られる場合も対象外です。具体的には次のとおりです。
- フレームワークのコード内のセキュリティ問題 →
codeprobe-security(SEC)が対象 - フレームワークのクラス内の SOLID 違反 →
codeprobe-solid(SRP/OCP など)が対象 - N+1 クエリなどのパフォーマンス問題 →
codeprobe-performance(PERF)が対象 - フレームワークのミドルウェアにおけるエラー処理 →
codeprobe-error-handling(ERR)が対象
- フレームワークのコード内のセキュリティ問題 →
- このサブスキルが対象とするのは、フレームワークの慣用的な使い方への違反のみです。つまり、フレームワークを誤って使用している場合や、規約を無視している場合です。
- このサブスキルと別のサブスキルが同じファイルの同じ行範囲を指摘した場合、オーケストレーターの重複排除ステップ(セクション 7A)で、最も関連性の高いカテゴリの指摘が残され、フレームワークに関する指摘は重複として扱われます。
- フレームワークが生成したボイラープレートファイル(マイグレーションのスタブ、デフォルト設定、スキャフォールドされたコントローラー)。
- 理由を説明する明確なコメントがある、意図的な規約からの逸脱。
- テストファイル — テスト固有のフレームワークの使用方法には、異なる規約があります。
検出の指示
PHP / Laravel
| ID Prefix | Area | What to Detect | How to Detect | Severity |
|---|---|---|---|---|
FWK | Eloquent | Eloquent クエリビルダーで対応できる箇所での生クエリ | DB::select()、DB::statement()、またはモデル/サービスのコード内にある生の SQL 文字列を検索します。Eloquent のクエリビルダー(where()、join()、whereHas())を使うほうが、より簡潔で安全な箇所が対象です。本当に生の SQL が必要な複雑なレポートクエリは除外します。 | Minor |
FWK | Eloquent | モデルに $casts がない | $casts の定義がないまま、キャストすべきモデル属性(日付、ブール値、配列、JSON)にアクセスしている箇所です。アクセサー内の手動キャストや、モデル属性への (bool)、(int)、json_decode() の繰り返しを確認します。 | Minor |
FWK | Eloquent | スコープを使わずに WHERE 条件を繰り返している | 同じモデルで、同一の where() 条件の連鎖が3か所以上で使われている箇所です。名前付きスコープ(scopeActive()、scopePublished())として切り出すべきです。 | Minor |
FWK | Routing | コントローラーではなくルートのクロージャーにロジックがある | routes/web.php または routes/api.php のルート定義に、3行を超えるクロージャーハンドラーがある箇所です。コントローラーメソッドに移すべきです。 | Minor |
FWK | Routing | ルートモデルバインディングがない | ID パラメーターを受け取り、メソッドのシグネチャでルートモデルバインディングを使わずに、Model::find($id) または Model::findOrFail($id) を手動で呼び出しているルートです。 | Minor |
FWK | Validation | Form Request ではなくコントローラーで検証している | インラインの検証ルール(5つを超えるルールを含む $request->validate([...]))を持つコントローラーメソッドです。専用の Form Request クラスを使うべきです。 | Minor |
FWK | Queues | リクエスト処理中に時間のかかるタスクを実行している | 5秒を超える可能性のある処理(メール送信、PDF 生成、外部 API 呼び出し、アップロード処理)を、コントローラー/リクエストハンドラーで同期的に実行している箇所です。キューにディスパッチすべきです。 | Major |
FWK | Queues | 再試行設定のないキュージョブ | $tries、$timeout、または $backoff プロパティがないジョブクラスです。これらがないと、ジョブは失敗時に無期限に再試行されます。 | Minor |
FWK | Events | イベントで疎結合にできる箇所が密結合になっている | 状態の変更(作成、更新、削除)の後、メソッドが他の3つ以上のサービスを直接呼び出している箇所です。イベントをディスパッチし、副作用の処理をリスナーに任せるべきです。 | Minor |
FWK | Config | 設定ファイル以外で env() を呼び出している | サービスクラス、コントローラー、または Blade テンプレートで env() ヘルパーを直接使っている箇所です。設定がキャッシュされると、env() は null を返します。config/ ファイル内で呼び出す必要があります。 | Major |
React / Next.js
| ID プレフィックス | 領域 | 検出対象 | 検出方法 | 重大度 |
|---|---|---|---|---|
FWK | コンポーネント | 200 LOC を超えるコンポーネント | 200 行を超えるコードを含む単一のコンポーネントファイルです。より小さく、役割を絞ったコンポーネントに分割する必要があります。 | 軽微 |
FWK | コンポーネント | 3 レベルを超えるプロップスのバケツリレー | プロップスを使用しない 3 つ以上の中間コンポーネントを経由してプロップスが渡されています。Context、状態管理、またはコンポジションを使用する必要があります。コンポーネント階層をたどってプロップス名を確認します。 | 軽微 |
FWK | フック | 依存配列がない、または不適切な useEffect | エフェクト内で使用されている変数が依存配列に含まれていない useEffect フックです。また、変更される可能性のあるプロップスや状態を参照する useEffect の空の [] も検出します。 | 重大 |
FWK | フック | レンダリング中の状態更新 | イベントハンドラーやエフェクトの外、つまりレンダリング中にコンポーネント本体で直接 setState/状態セッターを呼び出すと、無限の再レンダリングループが発生します。 | 重大 |
FWK | フック | 50 LOC を超えるカスタムフック | 多くの処理を担いすぎているカスタムフックです。より小さなフックを組み合わせて構成する必要があります。 | 軽微 |
FWK | データ取得 | SSR/SSG が適切な場面でのクライアント側の fetch | ビルド時またはリクエスト時に取得できるデータに対して useEffect + fetch() を使用しています。Next.js では、getServerSideProps、getStaticProps、またはサーバーコンポーネントを使用する必要があります。 | 軽微 |
FWK | データ取得 | エラー状態と読み込み状態の欠落 | 対応する読み込みインジケーターや、UI でのエラー処理を伴わないデータ取得です。 | 軽微 |
FWK | 型安全性 | TypeScript での any 型の使用 | .tsx/.ts ファイル内で明示的に any 型を注釈しています。適切な型、unknown、またはジェネリクスを使用する必要があります。 | 軽微 |
FWK | 型安全性 | エクスポートされた関数の戻り値の型の欠落 | 明示的な戻り値の型注釈がないエクスポート関数です。内部の関数では型推論を使用できますが、エクスポートされる API は明示的に型付けする必要があります。 | 軽微 |
Python / Django / FastAPI
| ID プレフィックス | 領域 | 検出対象 | 検出方法 | 重大度 |
|---|---|---|---|---|
FWK | Django | 500 LOC を超える views.py | ビューの数が多すぎる単一のビュー モジュールです。個別のビュー モジュールに分割するか、ViewSets を使用する必要があります。 | 軽微 |
FWK | Django | モデルの Meta クラスの欠落 | 並び順、詳細名、または制約を指定する Meta クラスがない Django モデルです。 | 軽微 |
FWK | Django | テンプレート内の N+1 | ビューで select_related()/prefetch_related() を使わずに、テンプレートタグから関連オブジェクトにアクセスしています。 | 重大 |
FWK | FastAPI | 非同期ビュー内での同期データベース呼び出し | async def ビュー関数内で同期 ORM 呼び出し(Django ORM、同期版 SQLAlchemy)を使用しています。イベントループをブロックします。 | 重大 |
FWK | Python | PEP 8 に準拠しない命名 | 関数/変数に camelCase(snake_case にする必要があります)、クラスに snake_case(PascalCase にする必要があります)を使用しています。 | 軽微 |
ID プレフィックスと修正プロンプトの例
すべての検出項目には FWK- プレフィックスを使用し、FWK-001、FWK-002 のように連番を付けます。
プロンプトの修正例
- "
OrderController@store(15~30 行目)からバリデーションルールを新しいStoreOrderRequestフォームリクエストクラスに移動します。php artisan make:request StoreOrderRequestを実行し、バリデーション配列を移動して、コントローラーメソッドのシグネチャでStoreOrderRequestを型指定してください。" - "
app/Services/MailService.phpの 12 行目にあるenv('MAIL_HOST')の呼び出しをconfig('mail.mailers.smtp.host')に置き換えてください。設定がキャッシュされている場合、env()関数はnullを返します。環境変数の参照は、本来あるべきconfig/mail.phpに移動してください。" - "
src/components/ProductList.tsxにあるProductListコンポーネント(220 LOC)を分割してください。ProductCard(50~90 行目)、ProductFilters(100~140 行目)、ProductPagination(160~200 行目)を同じディレクトリ内の個別のコンポーネントとして抽出してください。" - "
src/hooks/useProfile.ts:15のuseEffectの依存配列に、欠けている依存関係userIdを追加してください。現在の空配列[]では、初期値のuserIdで一度だけエフェクトが実行され、値が変わっても再取得されません。"
コメント
Markdown 対応