game-review について
ゲームのコードベースを対象とする読み取り専用のレビュー用スキルです。エンジニアリング上のリスク、物語の整合性、スコープ逸脱を調べ、ファイル位置と修正案を含む指摘を分類して出力します。
主な機能
- 01プロジェクト計画と構築記録の確認
- 02TypeScript の設計リスクのレビュー
- 03世界設定とクエストの整合性確認
- 04MVP スコープからの逸脱検出
- 05修正案とスキル参照付きの指摘出力
活用シーン
- 01認証や決済コードの監査
- 02マルチプレイヤー状態処理のレビュー
- 03クエストと世界設定資料の照合
- 04MVP 計画外の機能の検出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fcsouza/ agent-skills --skill game-reviewインストール後、Claude Code で/game-reviewを入力して読み込まれたか確認します。
詳細
ゲームレビュー — コード監査
前提条件
- 検出されたコード領域に基づいて、関連するエンジニアリングおよび設計スキルを適用します(フェーズ 0 を参照)
フェーズ 0 — コンテキストの読み込み(サイレント)
docs/mvp-first-draft.mdが存在する場合は読み込みます(比較のためのアーキテクチャ上の意図を確認できます)docs/build-registry.mdが存在する場合は読み込みます(実装済みとモックの状況を確認できます)- ユーザーのメッセージから対象範囲を判断します。
- コンポーネント名またはパスが指定されている場合:
src/[component]/または指定されたパスに注目します - 指定がない場合:
src/全体をレビューします
- コンポーネント名またはパスが指定されている場合:
- 対象範囲をスキャンし、存在する技術領域(認証、決済、WebSocket、Redis、BullMQ、クエストなど)を特定します
- 検出された領域に関連するスキルのみを適用します。
- 認証を検出 →
betterauth-integrationスキルを適用します - 決済/Stripe を検出 →
stripe-game-paymentsスキルを適用します - WebSocket/ゲーム状態を検出 →
game-state-syncスキルを適用します - Redis を検出 →
redis-game-patternsスキルを適用します - BullMQ を検出 →
bullmq-game-queuesスキルを適用します - クエスト/ナラティブのコードを検出 →
quest-narrative-coherenceスキルを適用します - データベース/Drizzle を検出 →
postgres-game-schemaスキルを適用します - マッチメイキングを検出 →
matchmaking-systemスキルを適用します - アナリティクスを検出 →
gameplay-analyticsスキルを適用します
- 認証を検出 →
フェーズ 1 — エンジニアリングレビュー
対象範囲内の TypeScript ファイルをすべて読みます。以下のチェックを適用します。各指摘事項について、重大度、ファイルパス、行番号(概算)、説明、修正案、および違反しているスキルを記録します。
状態の権威性(マルチプレイヤー/WebSocket コード)
- 🔴 CRITICAL:クライアントからの
message.userIdまたはmessage.playerIdを信頼する WebSocket ハンドラーは、必ずサーバーセッションから ID を取得する必要があります - 🔴 CRITICAL:サーバーによる検証なしに、クライアントメッセージから直接ゲーム状態が変更される処理
- 🟡 WARNING:正当な理由なくゲームループのティックレートが 60Hz を超えている
データベース/スキーマ
- 🔴 CRITICAL:Drizzle の
sqlタグ付きヘルパー以外で、生の SQL テンプレートリテラル(sql\SELECT...``)を使用している場合は、Drizzle の型付きクエリビルダーを使用する必要があります - 🟡 WARNING:プレイヤー向けテーブル(players、inventory、characters)にソフトデリート用の
deletedAtカラムがない - 🟡 WARNING:JSONB にするべきゲーム固有属性のカラム名がハードコードされている(例:
manaPoints、fireResistanceがトップレベルのカラムになっている) - 🟢 SUGGESTION:イベント/ログテーブルに
(playerId, type)の複合インデックスがない
認証とセッション
- 🔴 CRITICAL:アクターの特定に
req.body.userIdまたはreq.query.userIdを読み取るエンドポイントは、auth.api.getSession()を使用してセッションから特定する必要があります - 🔴 CRITICAL:有効期限を確認せずに JWT を検証している
- 🟡 WARNING:
/auth/loginまたは/auth/signupルートにレート制限がない - 🟡 WARNING:管理者/モデレーターのロールが Cookie または JWT クレームに保存されている(リクエストごとに DB から取得する必要があります)
決済(Stripe)
- 🔴 CRITICAL:チェックアウト成功後のリダイレクト(GET
/success)を契機に購入内容を付与している場合は、Webhook を契機にする必要があります - 🔴 CRITICAL:Webhook ハンドラーで署名検証用の
stripe.webhooks.constructEvent()を呼び出していない - 🔴 CRITICAL:クライアント側のコード(
public/、client/、frontend/内のファイル)から Stripe のシークレットキーを参照している - 🟡 WARNING:
checkout.session.completedイベントの冪等性チェックがないため、Webhook の再送時に報酬を二重付与する可能性があります
ジョブキュー(BullMQ)
- 🟡 WARNING:
attemptsの設定がない BullMQ プロセッサは、すべてのジョブに再試行ポリシーを設定する必要があります - 🟡 WARNING:
backoffの設定がない BullMQ プロセッサは、指数バックオフを使用する必要があります - 🟢 SUGGESTION:キューの肥大化を防ぐため、
removeOnCompleteとremoveOnFailオプションの追加を検討してください
Redis
- 🟡 WARNING:Redis キーが
{entity}:{id}:{field}の命名規則に従っていない - 🟡 WARNING:Redis に保存されたセッションキーに
EXPIREが設定されていない(一時的な状態には TTL が必要です) - 🟢 SUGGESTION:リーダーボードのソート済みセットでは、スコアが向上した場合にのみ更新するよう
ZADD NXまたはGTを使用してください
全般的なセキュリティ
- 🔴 CRITICAL:
.envの値やシークレットがソースファイルにハードコードされています - 🔴 CRITICAL:ユーザー入力を引数として
eval()またはFunction()コンストラクターが呼び出されています - 🟡 WARNING:ユーザーが制御できるデータを受け付ける API エンドポイントで、入力検証が不足しています
Phase 2 — ナラティブの整合性チェック
docs/world-lore.md と docs/quest-registry.md の両方が存在しない場合は、次を出力します。
📋 Narrative coherence check: skipped (docs/quest-registry.md not found — run the game-quest skill to create it)
その後、Phase 3 に進みます。
いずれかのファイルが存在する場合:
docs/world-lore.mdとdocs/quest-registry.mdを読み込みます- ソースファイルからクエスト ID、キャラクター名、派閥名、場所の名前を検索します
- コード内にハードコードされたクエスト/キャラクター/派閥/場所の文字列が、世界設定に登録された内容と矛盾していないか確認します
- 次の形式で報告します:
⚠️ LORE CONFLICT: Character "Mira" referenced in src/quests/main.ts but not registered in quest-registry.md
Phase 3 — MVP スコープ逸脱チェック
docs/mvp-first-draft.md が存在しない場合は、次を出力します。
📋 Scope audit: skipped (docs/mvp-first-draft.md not found — run the game-architect skill first)
その後、Phase 4 に進みます。
docs/mvp-first-draft.mdのセクション 10(対象外)を読み込みますsrc/を検索し、明示的に延期された機能が実装されていないか確認します- 次の形式で報告します:
⚠️ SCOPE DRIFT: [feature] found in [file] but listed as out-of-scope in MVP plan Section 10
また、docs/build-registry.md で「built」とマークされているものの、MVP のビルド手順(セクション 9)に含まれていないコンポーネントも確認します。これらは過剰な作り込みの可能性があります。
Phase 4 — レポートの出力
次の形式でレビュー結果を出力します。
# Game Review Report
Scope: [path reviewed]
Generated: [timestamp]
## Summary
🔴 Critical: X | 🟡 Warning: Y | 🟢 Suggestion: Z
次に、すべての指摘事項をカテゴリ(Engineering、Narrative、Scope)ごとに分類して列挙します。各指摘事項について:
### [🔴/🟡/🟢] [Title]
**File:** `src/path/to/file.ts` (line ~42)
**Issue:** [what's wrong]
**Fix:** [concrete fix description]
**Skill ref:** [→ stripe-game-payments: webhook-first fulfillment]
最後に次を出力します。
## Next Steps
- Fix all 🔴 CRITICAL issues before committing
- Review the [top-violation-category] skill for correct patterns
- Run the game-build skill to rebuild any component with critical violations
カテゴリに該当する問題がない場合は、次を出力します。
### ✅ [Category] — No issues found
厳守事項
- コードを変更しないでください — これは読み取り専用の監査コマンドです。指摘事項のみを出力してください。
- 誤検出を報告しないでください — 違反に見えるパターンでも、文脈上問題がなければ報告を省略するか、🟢 に引き下げてください。
- 必ずスキルへのリンクを付けてください — 各指摘事項では、正しいパターンを定めているスキルを参照してください。
- 具体的に記述してください — 各指摘事項にファイルパスとおおよその行番号を記載してください。
- 重要な情報を優先してください — 実際に重大な問題が 5 件あるほうが、ノイズとなる提案が 30 件あるよりも有用です。