# RpgRoller Fresh full-stack starter scaffold: - `RpgRoller/`: ASP.NET Core backend + static frontend output (`wwwroot`) - `RpgRoller/frontend/`: TypeScript frontend source - `RpgRoller.Tests/`: xUnit integration-heavy test project - `RpgRoller.sln`: solution used by local CI script Test layout: - `RpgRoller.Tests/Api/`: API integration tests grouped by feature concern - `RpgRoller.Tests/Services/`: service-level tests grouped by domain concern - `RpgRoller.Tests/Support/`: shared test harnesses/builders/helpers ## Code Organization Backend: - `RpgRoller/Program.cs`: thin app bootstrap only - `RpgRoller/Hosting/`: service registration + startup initialization - `RpgRoller/Api/`: endpoint mapping modules and auth/session filter helpers - `RpgRoller/Services/`: game workflows with explicit method parameters (no API DTO dependencies) Frontend: - `RpgRoller/frontend/app.ts`: orchestration entrypoint - `RpgRoller/frontend/app/`: split modules (`dom`, `state`, `loaders`, `render`, `events`, `actions`) - `RpgRoller/frontend/generated/`: generated API client source - `RpgRoller/wwwroot/`: compiled browser assets Backend state persistence: - EF Core with SQLite (`Microsoft.EntityFrameworkCore.Sqlite`) - Development DB: `RpgRoller/App_Data/rpgroller.development.db` - Default DB: `RpgRoller/App_Data/rpgroller.db` - Database schema is created automatically on startup (`EnsureCreated`) - Runtime state is loaded once at startup into memory and written back to SQLite on successful state changes ## Prerequisites - .NET SDK 10.0+ - Node.js 22+ and npm - PowerShell 7+ ## Local Development 1. Run the local CI parity script: ```powershell pwsh ./scripts/ci-local.ps1 ``` 2. Start the backend: ```powershell dotnet run --project RpgRoller/RpgRoller.csproj ``` 3. Open `http://localhost:5000` (or the port shown in the console). To use a custom SQLite database path, set `ConnectionStrings__RpgRoller`. ## Frontend Tooling - OpenAPI contract: `openapi/RpgRoller.json` - TypeScript build output config: `tsconfig.frontend.json` - API client generation + frontend compile: `npm run generate:api-client` - Frontend lint checks: `npm run lint` - Frontend format checks: `npm run format:check` ## Test and Coverage - Tests: ```powershell dotnet test RpgRoller.Tests/RpgRoller.Tests.csproj --collect:"XPlat Code Coverage" --settings RpgRoller.Tests/coverlet.runsettings ``` - Coverage gate: ```powershell pwsh ./scripts/check-coverage.ps1 -MinLineRate 0.90 -MinBranchRate 0.70 ``` - Coverage collector scope: - `RpgRoller.Tests/coverlet.runsettings` now measures the full backend assembly (`RpgRoller`), not only service namespace files. ## Implemented Backend Scope - Auth: register, login, logout, current user context - Session cookie: `HttpOnly`, `SameSite=Strict`, `Secure` when served over HTTPS - Rulesets: d6 and dnd5e validation rules - Campaigns: create/list/read - Characters: create/update/activate/current-campaign list - Skills: create/update with ruleset-aware dice expression validation - Rolls: public/private skill rolls with append-only campaign log - State stream: SSE endpoint for campaign version updates ## Implemented Frontend Scope - TypeScript-driven UI for: - registration, login, logout - campaign creation and selection - character creation and activation - skill creation and editing - public/private rolling and campaign log viewing - SSE-backed live refresh for selected campaign state/log