diff --git a/apps/client/eslint.config.mjs b/apps/client/eslint.config.mjs index bf06f7c..0e54284 100644 --- a/apps/client/eslint.config.mjs +++ b/apps/client/eslint.config.mjs @@ -28,4 +28,54 @@ 'local/prefer-relative-for-local-client-path': 'warn', }, }, + { + files: ['src/scenes/game/application/**/*.{ts,tsx}'], + rules: { + 'no-restricted-imports': ['warn', { + patterns: [ + { + group: ['@client/scenes/game/hooks/*', '@client/scenes/game/hooks/**'], + message: 'application層からhooks層への依存は禁止です', + }, + { + group: ['@client/scenes/game/input/*', '@client/scenes/game/input/**'], + message: 'application層からinput層への依存は禁止です', + }, + { + group: ['@client/scenes/game/styles/*', '@client/scenes/game/styles/**'], + message: 'application層からstyles層への依存は禁止です', + }, + { + group: ['@client/scenes/game/GameScene', '@client/scenes/game/GameView'], + message: 'application層からシーンUI層への依存は禁止です', + }, + ], + }], + }, + }, + { + files: ['src/scenes/game/entities/**/*.{ts,tsx}'], + rules: { + 'no-restricted-imports': ['warn', { + patterns: [ + { + group: ['@client/scenes/game/hooks/*', '@client/scenes/game/hooks/**'], + message: 'entities層からhooks層への依存は禁止です', + }, + { + group: ['@client/scenes/game/input/*', '@client/scenes/game/input/**'], + message: 'entities層からinput層への依存は禁止です', + }, + { + group: ['@client/scenes/game/styles/*', '@client/scenes/game/styles/**'], + message: 'entities層からstyles層への依存は禁止です', + }, + { + group: ['@client/scenes/game/GameScene', '@client/scenes/game/GameView'], + message: 'entities層からシーンUI層への依存は禁止です', + }, + ], + }], + }, + }, ]; diff --git a/apps/client/src/scenes/game/ARCHITECTURE.md b/apps/client/src/scenes/game/ARCHITECTURE.md new file mode 100644 index 0000000..7bbfe21 --- /dev/null +++ b/apps/client/src/scenes/game/ARCHITECTURE.md @@ -0,0 +1,28 @@ +# Game Scene Architecture + +## レイヤー定義 +- `GameScene.tsx` と `GameView.tsx` はシーンUI層 +- `hooks/` と `input/` と `styles/` はプレゼンテーション層 +- `application/` はユースケースとオーケストレーション層 +- `entities/` はドメインモデルと描画エンティティ層 + +## 依存方向 +- シーンUI層はプレゼンテーション層と application層へ依存可能 +- プレゼンテーション層は application層へ依存可能 +- application層は entities層へ依存可能 +- entities層は application層の抽象型へ依存可能 + +## 禁止依存 +- application層 -> hooks層 +- application層 -> input層 +- application層 -> styles層 +- application層 -> シーンUI層 +- entities層 -> hooks層 +- entities層 -> input層 +- entities層 -> styles層 +- entities層 -> シーンUI層 + +## 運用方針 +- 依存方向違反は `eslint.config.mjs` の `no-restricted-imports` で検出する +- 新規ファイル追加時はまずどのレイヤーへ属するかを決めてから配置する +- 依存方向をまたぐ必要がある場合は application層へ adapter を追加して橋渡しする