mcpField
R
roblox-code-review

roblox-code-review

github.com/el4cteoテスト・品質56529 回インストール2 週間前に更新
リポジトリ

roblox-code-review について

roblox-code-reviewは、Robloxコードを重大度順に確認し、ファイルと行番号を示すスキルです。セキュリティ、データ処理、ライフサイクル、性能、テキスト安全性、最新APIの利用状況を調べ、影響と修正方法を提示します。

主な機能

  1. 01重大度順に指摘を整理
  2. 02ファイル、行番号、影響、修正方法を報告
  3. 03リモート引数の検証とセキュリティを確認
  4. 04データストアと購入処理をレビュー
  5. 05ライフサイクル、性能、テキストフィルタリングを点検
  6. 06最新Roblox APIの利用状況を確認

活用シーン

  1. 01リリース前のRobloxコードレビュー
  2. 02不正利用やデータ損失のリスク調査
  3. 03ライフサイクルや性能の問題発見
  4. 04非推奨APIの使用箇所を置き換え

インストール

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

$npx skills add https://github.com/el4cteo/roblox-skills --skill roblox-code-review

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

同梱ファイルreferences/deprecated-apis.md

詳細

Roblox コードレビュー

重大度の高い順にレビューします。各指摘は ファイル:行、重大度、何が壊れるか、修正方法 を添えて報告してください。 主張はコード(不明な場合はエンジンのリファレンス)に照らして検証してください — パターンマッチで盲目的に判断しないでください。

重大度ガイド

重大度例
Criticalクライアント権威の報酬/ダメージ/通貨; 検証されていないリモート引数(NaN、インスタンスのなりすまし); ProcessReceipt の外で付与される購入、または冪等でない購入; セッションロックなしで複数のサーバーから SetAsync で保存されるデータ; レプリケートされるコード内のシークレット/API キー; 他プレイヤーに表示されるフィルタリングされていないプレイヤーテキスト。
Highデータ損失の経路(BindToClose がない、ロード失敗後にデフォルトデータを保存する、リトライがない); メモリリーク(コネクション、プレイヤーをキーとするテーブル); InvokeClient; フレームごとのリモート; 無限の yield(オプションのインスタンスに対するタイムアウトなしの WaitForChild、永遠に yield しうる RemoteFunction ハンドラ); ストリーミング非対応のクライアントインデックス。
Medium非推奨/置き換えられた API; wait/spawn/delay; ポーリングループ; サーバー側の tween; ネットワーク/yield する API に対する pcall の欠如; 途中参加者への対応の欠如; CharacterAdded の競合状態。
Lowスタイル、命名、型の欠如、マジックナンバー、デッドコード、軽微な非効率。

チェックリスト

セキュリティ (roblox-security)

  • すべての OnServerEvent/OnServerInvoke: 型を typeof でチェック、数値は math.isfinite、文字列は 長さ/UTF-8 をチェック、インスタンスは IsA + IsDescendantOf(trusted)、レート制限、コンテキストをチェック。
  • サーバー専用のロジック、管理者リスト、シークレットを ReplicatedStorage/StarterPlayer/Workspace に置かない。
  • ProximityPrompt/ClickDetector/Touched ハンドラーはサーバー側で距離/状態を再検証する。
  • ゲームプレイに重要なアンカーされていないパーツはサーバーが所有する。

データ (roblox-data-stores)

  • セッションロック (ProfileStore または同等のもの)。読み取り-変更-書き込みには UpdateAsync。バックオフ付きのリトライ。
  • BindToClose は保存を並列でフラッシュする。Instance/Vector3/混在テーブルの保存は行わない。
  • 読み込み失敗をデフォルト値で上書きしない。プレイヤーをキーとするテーブルは退出時にクリアする。
  • キーは安定させる (User_{UserId})。Studio は別のストア/ユニバースを使用する。

マネタイズ (roblox-monetization)

  • 単一の ProcessReceipt。PurchaseId による冪等性。永続化した後にのみ PurchaseGranted を返す。
  • パスの特典は参加時およびセッション中の購入後にチェックする。価格をハードコードしない。有料のランダムアイテムは 確率を開示し、PolicyService を尊重する。

正確性とライフサイクル (roblox-architecture)

  • すでにゲーム内にいるプレイヤー (for _, p in Players:GetPlayers()) と、すでにスポーンしたキャラクターを処理する。
  • キャラクターごとの状態はリスポーン時に再構築する。プレイヤーごとの状態は PlayerRemoving でクリーンアップする。
  • モジュールのトップレベルで yield しない。循環 require を行わない。状態の各部分につき所有者は 1 つ。
  • 遅延イベントに対して安全 (ハンドラーが同期的に実行されることに依存しない)。
  • クライアントコードはストリーミングに対して安全 (Workspace のコンテンツに対して WaitForChild/nil チェック)。

パフォーマンス (roblox-performance)

  • フレームごとの FindFirstChild/GetDescendants/Instance.new を行わない。params オブジェクトは再利用する。
  • ポーリングではなくイベント駆動にする。think ループはスロットルして分散させる。
  • トゥイーンと見た目のエフェクトはクライアント側で行う。リモートはバッチ化/スロットルする。ペイロードは最小限にする。
  • コネクションは切断し、インスタンスは破棄する。無制限のキャッシュを作らない。

テキストと安全性 (roblox-text-chat)

  • 他プレイヤーに表示されるすべてのプレイヤー作成テキストはサーバー側でフィルタリングする (FilterStringAsync)。フェイルクローズド。
  • チャットは TextChatService を使用する。公開の編集可能なテキストはレート制限する (1 分以上)。

モダンな API の使用

  • task.*、*Async バリアント、Raycast、mover 制約、PivotTo、Animator:LoadAnimation、 TextChatService、UIDragDetector、workspace のコリジョングループ API、CreatePath+ComputeAsync。
  • 非推奨および置き換えられたメンバーの完全なマップ: references/deprecated-apis.md。

コード品質 (roblox-luau)

  • 型付き公開 API を備えた --!strict。サービスは GetService 経由。_G/shared は使わない。
  • 明確なモジュール境界。設定とロジックを分離する。純粋なロジックのテスト (roblox-testing)。

出力形式

## Summary
<2–3 sentences: overall risk, the most important fixes>

## Findings
1. [Critical] src/server/Shop.server.luau:42 — Price read from client argument.
   Impact: exploiters buy anything for 0 coins. Fix: look up ITEMS[itemId].price on the server.
2. [High] ...

## Modernization (optional)
- Replace `wait()` → `task.wait()` (12 occurrences) ...

修正の適用を提案してください。修正する際は、バグ以外の挙動を同一に保ち、関連する チェック (型チェック、テスト、roblox-studio-mcp 経由の Studio プレイテスト) を再実行してください。

コメント