2026-02-24 22:01:48 +01:00
2026-02-25 11:15:35 +01:00
2026-02-25 11:15:35 +01:00
2026-02-24 22:01:48 +01:00
2026-02-24 21:30:22 +01:00

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
  • UX.md: frontend UX and interaction design specification (pre-implementation baseline)

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:
    pwsh ./scripts/ci-local.ps1
    
  2. Start the backend:
    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:
    dotnet test RpgRoller.Tests/RpgRoller.Tests.csproj --collect:"XPlat Code Coverage" --settings RpgRoller.Tests/coverlet.runsettings
    
  • Coverage gate:
    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
Description
No description provided
Readme 6.4 MiB
Languages
C# 76.8%
HTML 9.2%
JavaScript 8%
CSS 4%
PowerShell 1.5%
Other 0.5%