KoogleApp/CLAUDE.md

89 lines
3.1 KiB
Markdown

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Build & Test Commands
```bash
# Build solution
dotnet build KoogleApp.sln
# Run the application
dotnet run --project KoogleApp/KoogleApp.csproj
# Run all tests
dotnet test
# Run specific test class
dotnet test --filter "FullyQualifiedName~Koogle.Tests.ReducerTests.ThrowPanelStateTests"
# Run specific test method
dotnet test --filter "FullyQualifiedName~Koogle.Tests.GameTraining.GameTrainingServiceTest.ServiceWorksCorrectly"
```
## Entity Framework Migrations
```bash
# Create migration
dotnet ef migrations add <MigrationName> --project ./KoogleApp/KoogleApp.csproj
# Update database (Development)
dotnet ef --startup-project ./KoogleApp/KoogleApp.csproj --project ./KoogleApp/KoogleApp.csproj database update -- Development
```
## Architecture Overview
This is a **Blazor Server** application (.NET 9) for tracking a 9-pin bowling (Kegeln) game. It uses:
- **Fluxor** for state management (Redux pattern)
- **MudBlazor** for UI components
- **SignalR** for real-time synchronization between clients
- **Entity Framework Core** with SQL Server
### Fluxor Store Structure (`Store/`)
The state is organized into feature slices following the Redux pattern:
- **`Store/Game/`** - Core game state management
- `ThrowPanel/` - Pin states (9 pins), throw counter, throw mode (Reposition/Decrease)
- `Participants/` - Active players and turn order
- `Setup/` - Game configuration state
- `UndoRedo/` - History management for game actions
- `Menus/` - Game-specific menu actions
- `ThrowTimer/` - Timer state for throws
- **`Store/Player/`** - Player management (CRUD)
- **`Store/DayFeature/`** - Day/session management
- **`Store/ModelFeature/`** - Shared model state
Each feature contains: `State.cs`, `Actions.cs`, `Reducers.cs`, `Effects.cs`, `Selectors.cs`
### Game Plugin System (`Games/`)
Games are implemented as plugins via `IKnownGame` interface:
- `IKnownGame` - Defines game metadata and component types
- `IGameService` - Handles game logic (throws, player progression)
- `IGameSetupModel` / `IGameModel` / `IGameState` - Data contracts with JSON serialization support
Current implementations:
- `Games/Training/` - Training mode
- `Games/Shit/` - "Shit" game variant
To add a new game:
1. Create folder in `Games/` with `IKnownGame` implementation
2. Create setup component (Razor), board component, and `IGameService` implementation
3. Add JSON type discriminator to `IGameState` and `IGameSetupModel` interfaces
### Key Models
- `ThrowPanelState` - Contains 9 pin states (`PinStatus`: Standing/Fallen/Disabled), throw mode, throw counter
- `GameProgress` - Tracks state transitions during a throw (before/after states)
- `ParticipantsState` - Player order and turn tracking
### Real-time Sync
`SharedModelHub` (SignalR) broadcasts state changes between connected clients. `HubConnectionService` manages client-side connections.
### Services Registration
`Services/ServiceExtension.cs` contains DI registration:
- `AddDbServices()` - Database and Identity
- `AddAppServices()` - Fluxor, repositories, game services (auto-discovered via reflection)