mcpField
L
laravel:debugging-prompts

laravel:debugging-prompts

github.com/jpcaparasエージェントワークフロー157111 回インストール18 週間前に更新
リポジトリ

laravel:debugging-prompts について

Laravel の AI デバッグ向けプロンプト作成スキルです。エラー、期待値と実際の結果、ログ、状態、試した対処法を示し、エージェントに具体的な診断情報を提供する方法を扱います。

主な機能

  1. 01エラーとスタックトレースの詳細テンプレート
  2. 02期待値と実際の結果の例
  3. 03ログと状態の共有ガイド
  4. 04仮説と根拠の整理方法
  5. 05一般的なデバッグ問題のテンプレート

活用シーン

  1. 01データベースエラー報告の作成
  2. 02API 応答の不具合の説明
  3. 03キュー障害とジョブ状態の共有
  4. 04試したパフォーマンス改善策の記録

インストール

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

$npx skills add https://github.com/jpcaparas/superpowers-laravel --skill laravel:debugging-prompts

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

詳細

デバッグ用プロンプト

AI を使ったデバッグには、完全な情報が必要です。コンテキストが不足していると、具体的な問題を解決できない一般的な提案になってしまいます。

エラーメッセージとスタックトレース

不完全

「決済コントローラーでエラーが発生します」

完全

「決済の処理中にエラーが発生します。

エラー:

Illuminate\Database\QueryException: SQLSTATE[23000]: 
Integrity constraint violation: 1452 Cannot add or update a child row: 
a foreign key constraint fails (`app`.`payments`, CONSTRAINT `payments_order_id_foreign` 
FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE)

スタックトレース:

#0 app/Services/PaymentService.php(45): Payment::create()
#1 app/Http/Controllers/PaymentController.php(28): PaymentService->process()
#2 vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54)

コンテキスト:

  • Laravel 13.x、MySQL 8.0
  • order_id が orders テーブルに存在しない場合に発生します
  • 決済データ:['order_id' => 999, 'amount' => 5000, 'status' => 'pending']
  • 注文 999 はデータベースに存在しません」

効果がある理由: エラー、スタックトレース、コンテキスト、問題の原因となる具体的なデータが揃っています。

期待される動作と実際の動作

曖昧

「API が正しいデータを返しません」

具体的

「Product API が正しくないデータを返します。

期待される動作:

{
  "data": {
    "id": 1,
    "name": "Widget",
    "price": "29.99",
    "category": {
      "id": 5,
      "name": "Tools"
    }
  }
}

実際の動作:

{
  "data": {
    "id": 1,
    "name": "Widget",
    "price": 2999,
    "category": null
  }
}

問題点:

  1. 価格が書式設定されたドル表記("29.99")ではなく、セント単位(2999)です
  2. 商品に category_id = 5 があるにもかかわらず、カテゴリが null です

コード:

// ProductController@show
return new ProductResource($product);

データベースでは商品に category_id = 5 が設定されていますが、リレーションが読み込まれません。」

効果がある理由: 期待値と実際の出力を正確に示し、具体的な問題点を特定して、関連するコードも含めています。

ログエントリーと状態

不十分

「キューに問題があるようです」

十分

「キュー内のジョブが失敗します。

ログエントリー:

[2024-01-15 10:30:15] local.ERROR: Job failed: ProcessOrderJob
{"order_id":123,"exception":"Stripe\\Exception\\InvalidRequestException: 
No such customer: cus_invalid","attempts":3}

[2024-01-15 10:30:15] local.INFO: Order state before job
{"id":123,"status":"pending","stripe_customer_id":"cus_invalid"}

ジョブコード:

public function handle()
{
    $customer = $this->stripe->customers->retrieve(
        $this->order->stripe_customer_id
    );
    // ...
}

状態:

  • 注文 123 の stripe_customer_id = "cus_invalid"
  • Stripe に顧客が存在しません
  • ジョブは 3 回リトライされ、現在は failed_jobs テーブルにあります
  • Laravel 13.x と Horizon を使用しています」

効果がある理由: ログ、状態に関する情報、関連するコード、リトライに関するコンテキストが含まれています。

仮説と根拠

弱い

「キャッシュの問題だと思います」

強い

「Redis キャッシュが古くなっていると思われます。

仮説: 商品価格がキャッシュされているものの、更新時にキャッシュが無効化されていません。

根拠:

  1. データベースの商品価格を更新しました:UPDATE products SET price = 3999 WHERE id = 1
  2. データベースの表示:SELECT price FROM products WHERE id = 1 → 3999
  3. API は古い価格を返します:GET /api/products/1 → "price": "29.99"
  4. php artisan cache:clear の実行後、API は正しい価格を返します:"price": "39.99"

キャッシュのコード:

public function show(Product $product)
{
    $cached = Cache::remember("product.{$product->id}", 3600, function () use ($product) {
        return new ProductResource($product);
    });
    return $cached;
}

問題: 商品の更新時にキャッシュキーが無効化されません。ProductObserver でキャッシュを無効化するか、show メソッドからキャッシュ処理を削除する必要があります。」

効果がある理由: 明確な仮説、具体的な根拠、関連するコード、解決策の提案が含まれています。

試した解決策

役に立たない

「いくつか試しましたが、何も解決しませんでした」

役に立つ

「試した解決策と結果:

試行 1: Eager Loading を追加しました

$products = Product::with('category')->get();

結果: N+1 クエリが引き続き発生します。Debugbar では 101 件のクエリ(商品に 1 件、カテゴリに 100 件)が表示されます。

試行 2: データ取得後に load() を使用しました

$products = Product::all();
$products->load('category');

結果: 同じ問題が発生し、引き続き 101 件のクエリが実行されます。

試行 3: リレーションの定義を確認しました

// In Product model
public function category()
{
    return $this->belongsTo(Category::class);
}

結果: リレーションは正しく見えます。外部キー category_id は products テーブルに存在します。

現在の状態: Eager Loading の構文は正しいようですが、機能しません。Laravel 13.x を使用しています。何が不足していますか?」

効果がある理由: 試した内容、実際に使用したコード、確認された結果を示すことで、すでに試した解決策が再度提案されるのを防げます。

デバッグ用テンプレート

テンプレート:エラーレポート
**Error:** [Full error message]
**Stack trace:** [Complete stack trace]
**File/Line:** [Where error occurs]
**Context:** [Laravel version, packages, environment]
**Data:** [Input data causing error]
**Expected:** [What should happen]
テンプレート:予期しない動作
**Expected:** [Describe expected behavior with example]
**Actual:** [Describe actual behavior with example]
**Code:** [Relevant code snippet]
**State:** [Database state, variable values]
**Environment:** [Laravel version, Sail/host, packages]
テンプレート:パフォーマンスの問題
**Problem:** [Describe slow operation]
**Metrics:** [Response time, query count, memory usage]
**Query log:** [Slow queries from Debugbar/Telescope]
**Code:** [Code causing performance issue]
**Dataset size:** [Number of records involved]
**Attempted:** [Optimizations already tried]

クイックリファレンス

AI を使って効果的にデバッグする方法:

  • エラーを完全に示す - メッセージ全文、スタックトレース、ファイルと行番号
  • 両方を示す - 期待される動作と実際の動作
  • ログを含める - エラーログ、情報ログ、状態のダンプ
  • 根拠を共有する - データベースクエリ、API レスポンス、変数のダンプ
  • 試した内容を記録する - 試したこと、実際のコード、結果
  • コンテキストを提示する - Laravel のバージョン、環境、パッケージ

情報が多いほど、解決が早くなります。デバッグでは、できる限り詳しく伝えましょう。

コメント