======================================================================== プロトコル追加手順 (Protocol Extension Guide) ======================================================================== 1. 目的 (Purpose) ------------------------------------------------------------------------ 本ドキュメントは,ソケットイベントの追加・変更時に,修正箇所の漏れを防ぐための標準手順を定義する. `packages/shared/src/protocol` の責務分割方針に従い,イベント名,ペイロード型,方向別マップ,公開エントリを順に更新する. 2. 適用対象 (Scope) ------------------------------------------------------------------------ ・対象レイヤ: shared プロトコル定義(client/server 共通契約) ・対象ディレクトリ: `packages/shared/src/protocol` ・対象ユースケース: 新規イベント追加,既存イベントのペイロード変更,イベント廃止 3. ディレクトリ構成 (Directory Layout) ------------------------------------------------------------------------ ・基準構成は以下とする. packages/shared/src/protocol/ ├── socketEvents.ts ├── eventPayloads.ts ├── eventPayloadMaps.ts ├── events.ts ├── socketEventBridge.ts ├── payloads/ │ ├── commonPayloads.ts │ ├── lobbyPayloads.ts │ └── gamePayloads.ts └── maps/ ├── commonEventPayloadMap.ts ├── lobbyEventPayloadMap.ts └── gameEventPayloadMap.ts 4. 標準追加フロー (Standard Flow) ------------------------------------------------------------------------ 新規イベントを追加する場合は,必ず次の順で更新する. 4-1. イベント名を追加する ・ファイル: socketEvents.ts ・作業: `SocketEvents` にイベント名を追加する ・確認: 命名規則(kebab-case / snake_case)を既存方針に合わせる 4-2. ペイロード型を追加する ・ファイル: payloads/commonPayloads.ts または payloads/lobbyPayloads.ts または payloads/gamePayloads.ts ・作業: イベントに対応する payload 型を追加する ・確認: 既存型の再利用可否を確認し,重複定義を避ける 4-3. 方向別マップへ対応を追加する ・ファイル: maps/commonEventPayloadMap.ts / maps/lobbyEventPayloadMap.ts / maps/gameEventPayloadMap.ts ・作業: 追加イベントを C→S または S→C の適切な map に追記する ・確認: 方向が誤っていないかを必ず確認する 4-4. 集約エントリの再公開を調整する ・ファイル: eventPayloads.ts / eventPayloadMaps.ts / events.ts ・作業: 外部利用が必要な型のみ再公開する ・確認: 既存 import パス互換(`@repo/shared` 経由)を維持する 4-5. 利用側を接続する ・対象: client/server の handler / bridge / useCase ・作業: on/off/emit と payload 型参照を更新する 5. 変更時のチェックポイント (Checklist) ------------------------------------------------------------------------ ・イベント名追加済みか ・payload 型追加済みか ・map への方向別登録済みか ・events.ts 再公開が過不足ないか ・client/server で型エラーがないか ・既存イベントの型互換を壊していないか ・player 座標差分イベント(UPDATE_PLAYERS)に teamId を含めていないか ・初期同期イベント(CURRENT_PLAYERS / NEW_PLAYER)に teamId を含めているか 6. 典型ミスと対策 (Common Pitfalls) ------------------------------------------------------------------------ ■ イベント名だけ追加して map を更新しない ・症状: emit/on の型推論が崩れる,もしくは any 化する ・対策: 4-3 を必須工程として実施する ■ payload 定義場所が不適切 ・症状: common/lobby/game の境界が曖昧になる ・対策: イベント責務に従って payloads 配下へ配置する ■ 循環参照を作る ・症状: 型解決エラー,TS2307/TS2456 系が発生しやすくなる ・対策: `events.ts` は再公開専用とし,型本体は payload 側へ置く 7. 検証コマンド (Validation Commands) ------------------------------------------------------------------------ ・shared 型定義のビルド確認 $ pnpm --filter @repo/shared build ・サーバー互換確認 $ pnpm --filter server build ・クライアント互換確認 $ pnpm --filter client build 8. 運用ルール (Operation Rules) ------------------------------------------------------------------------ ・プロトコル追加時は,本ガイドの 4-1 から 4-5 までを PR テンプレート上でチェックする ・events.ts に型本体を戻さない(再公開専用を維持する) ・新規型のコメントは `GUIDE_04_コードコメント規則` に従う