roblox-code-review について
roblox-code-reviewは、Robloxコードを重大度順に確認し、ファイルと行番号を示すスキルです。セキュリティ、データ処理、ライフサイクル、性能、テキスト安全性、最新APIの利用状況を調べ、影響と修正方法を提示します。
主な機能
- 01重大度順に指摘を整理
- 02ファイル、行番号、影響、修正方法を報告
- 03リモート引数の検証とセキュリティを確認
- 04データストアと購入処理をレビュー
- 05ライフサイクル、性能、テキストフィルタリングを点検
- 06最新Roblox APIの利用状況を確認
活用シーン
- 01リリース前のRobloxコードレビュー
- 02不正利用やデータ損失のリスク調査
- 03ライフサイクルや性能の問題発見
- 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 プレイテスト) を再実行してください。
コメント
Markdown 対応