mcpField
C
codeprobe-framework

codeprobe-framework

github.com/machineroom-devその他5107 回インストール6 日前に更新
リポジトリ

codeprobe-framework について

PHP/Laravel、React/Next.js、Python/Django/FastAPIの規約を確認するcodeprobeのサブスキルです。一般的なセキュリティや性能ではなく、フレームワーク固有の使い方をレビューします。

主な機能

  1. 01LaravelとEloquentの規約チェック
  2. 02ReactとNext.jsの使い方を確認
  3. 03DjangoとFastAPIの実践を確認
  4. 04フレームワークのバージョンを考慮
  5. 05他のスキルが扱う問題を除外

活用シーン

  1. 01Laravelのモデルやルーティングのレビュー
  2. 02React Hooksやコンポーネント規約の確認
  3. 03DjangoやFastAPIの利用方法の監査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/machineroom-dev/codeprobe --skill codeprobe-framework

インストール後、Claude Code で/codeprobe-frameworkを入力して読み込まれたか確認します。

詳細

スタンドアロンモード

オーケストレーター経由ではなく直接実行する場合は、まず次の手順を実行してください。

  1. ../codeprobe/shared-preamble.md(この SKILL.md の場所を基準に解決してください。ユーザーのプロジェクトではなく、隣接する codeprobe スキルディレクトリを基準にします)を読み、出力契約、実行モード、制約を確認します。
  2. プロジェクトの技術スタックに基づいて、該当する参照ファイルを ../codeprobe/references/(同じ基準で解決)から読み込みます。
  3. ユーザーから別の指定がない限り、full モードをデフォルトとします。

フレームワーク固有のベストプラクティス

対象範囲

このサブスキルは、フレームワーク固有のアンチパターンや規約違反を検出します。普遍的な原則を適用する他のサブスキルとは異なり、フレームワーク固有のリファレンスガイドを読み込み、フレームワークの慣用的な使い方に照らしてチェックします。

サポート対象のフレームワーク:

  1. PHP / Laravel — Eloquent ORM、ルーティング、バリデーション、キュー、イベント、設定
  2. React / Next.js — コンポーネント設計、フック、データ取得、型安全性
  3. 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 PrefixAreaWhat to DetectHow to DetectSeverity
FWKEloquentEloquent クエリビルダーで対応できる箇所での生クエリDB::select()、DB::statement()、またはモデル/サービスのコード内にある生の SQL 文字列を検索します。Eloquent のクエリビルダー(where()、join()、whereHas())を使うほうが、より簡潔で安全な箇所が対象です。本当に生の SQL が必要な複雑なレポートクエリは除外します。Minor
FWKEloquentモデルに $casts がない$casts の定義がないまま、キャストすべきモデル属性(日付、ブール値、配列、JSON)にアクセスしている箇所です。アクセサー内の手動キャストや、モデル属性への (bool)、(int)、json_decode() の繰り返しを確認します。Minor
FWKEloquentスコープを使わずに WHERE 条件を繰り返している同じモデルで、同一の where() 条件の連鎖が3か所以上で使われている箇所です。名前付きスコープ(scopeActive()、scopePublished())として切り出すべきです。Minor
FWKRoutingコントローラーではなくルートのクロージャーにロジックがあるroutes/web.php または routes/api.php のルート定義に、3行を超えるクロージャーハンドラーがある箇所です。コントローラーメソッドに移すべきです。Minor
FWKRoutingルートモデルバインディングがないID パラメーターを受け取り、メソッドのシグネチャでルートモデルバインディングを使わずに、Model::find($id) または Model::findOrFail($id) を手動で呼び出しているルートです。Minor
FWKValidationForm Request ではなくコントローラーで検証しているインラインの検証ルール(5つを超えるルールを含む $request->validate([...]))を持つコントローラーメソッドです。専用の Form Request クラスを使うべきです。Minor
FWKQueuesリクエスト処理中に時間のかかるタスクを実行している5秒を超える可能性のある処理(メール送信、PDF 生成、外部 API 呼び出し、アップロード処理)を、コントローラー/リクエストハンドラーで同期的に実行している箇所です。キューにディスパッチすべきです。Major
FWKQueues再試行設定のないキュージョブ$tries、$timeout、または $backoff プロパティがないジョブクラスです。これらがないと、ジョブは失敗時に無期限に再試行されます。Minor
FWKEventsイベントで疎結合にできる箇所が密結合になっている状態の変更(作成、更新、削除)の後、メソッドが他の3つ以上のサービスを直接呼び出している箇所です。イベントをディスパッチし、副作用の処理をリスナーに任せるべきです。Minor
FWKConfig設定ファイル以外で 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 プレフィックス領域検出対象検出方法重大度
FWKDjango500 LOC を超える views.pyビューの数が多すぎる単一のビュー モジュールです。個別のビュー モジュールに分割するか、ViewSets を使用する必要があります。軽微
FWKDjangoモデルの Meta クラスの欠落並び順、詳細名、または制約を指定する Meta クラスがない Django モデルです。軽微
FWKDjangoテンプレート内の N+1ビューで select_related()/prefetch_related() を使わずに、テンプレートタグから関連オブジェクトにアクセスしています。重大
FWKFastAPI非同期ビュー内での同期データベース呼び出しasync def ビュー関数内で同期 ORM 呼び出し(Django ORM、同期版 SQLAlchemy)を使用しています。イベントループをブロックします。重大
FWKPythonPEP 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 で一度だけエフェクトが実行され、値が変わっても再取得されません。"

コメント