# CLAUDE.md – FamilyPlanner Digitaler Familienplaner (PWA) auf .NET 10 + Aspire 13. Anforderungen: `docs/ARCHITECTURE.md`, Fortschritt: `docs/ROADMAP.md`, Entscheidungen: `docs/adr/`. ## Befehle ```bash dotnet build FamilyPlanner.slnx # muss ohne Warnungen bauen (TreatWarningsAsErrors) dotnet test --solution FamilyPlanner.slnx # alle Tests (Microsoft.Testing.Platform); Integrationstests brauchen Docker dotnet test --project tests/FamilyPlanner.UnitTests # schnell, ohne Docker dotnet test --project tests/FamilyPlanner.Web.Tests # bUnit dotnet test --project tests/FamilyPlanner.IntegrationTests # Aspire + SQL-Server-Container (~1–2 min) aspire run # bzw. dotnet run --project src/FamilyPlanner.AppHost aspire publish -o artifacts/compose # Docker-Compose aus dem App-Modell (Aspire-CLI >= 13.6) # ohne passende CLI: dotnet run --project src/FamilyPlanner.AppHost --no-launch-profile -- --operation publish --step publish --output-path ../../artifacts/compose # Neue EF-Migration (aus dem Repo-Root; Tool über dotnet-tools.json: `dotnet tool restore`) dotnet ef migrations add -p src/FamilyPlanner.Infrastructure -s src/FamilyPlanner.MigrationService -o Persistence/Migrations # Produktiv-Stack lokal bauen/starten cd deploy && cp .env.example .env && docker compose up -d --build ``` Wichtig: Wenn der AppHost läuft, sind die DLLs von Api/Web gesperrt → vor `dotnet build`/Tests beenden. Die Integrationstests starten einen eigenen, flüchtigen SQL-Container; der Dev-AppHost nutzt das Volume `familyplanner-sql-data`. Lokaler Seed-Admin (AppHost-Parameter, siehe `src/FamilyPlanner.AppHost/appsettings.Development.json`): `admin` / `Admin123!ChangeMe` – Passwortwechsel beim ersten Login. ## Struktur * `src/FamilyPlanner.Domain` – Entities, Rollen (`Roles`), Policies (`Policies`), reine Logik. Keine Abhängigkeiten auf EF/ASP.NET. * `src/FamilyPlanner.Infrastructure` – `AppDbContext` (Identity), Konfigurationen unter `Persistence/Configurations`, Migrations unter `Persistence/Migrations`, Seeding. * `src/FamilyPlanner.Api` – Minimal APIs als Vertical Slices unter `Features//`; jeder Slice hat eine `MapEndpoints`-Erweiterung. * `src/FamilyPlanner.Shared` – DTOs (records) für Api und Client. * `src/FamilyPlanner.Web` – BFF: statische WASM-Auslieferung + YARP (`/api`, `/hubs`, `/ics` → Api). * `src/FamilyPlanner.Web.Client` – Blazor WASM + MudBlazor. Seiten unter `Pages/`, API-Clients unter `Services/`. * `src/FamilyPlanner.MigrationService` – migriert + seedet, beendet sich. ## Konventionen * UI-Texte auf **Deutsch**; Code, Bezeichner und Commit-Typen auf Englisch. * Commits: Conventional Commits (`feat:`, `fix:`, `docs:`, `test:`, `chore:`, `refactor:`, `ci:`). * Alle Zeiten in UTC speichern (`DateTimeOffset`/UTC), Anzeige in Europe/Berlin. `TimeProvider` injizieren statt `DateTime.UtcNow`. * Neue Entitäten erben von `AuditableEntity`; löschbare implementieren `ISoftDeletable`; Einkauf/Aufgaben/Termine bekommen `RowVersion`. * Berechtigungen immer serverseitig, nie nur im UI: fachliche Endpunkte mit `.RequirePermission(Permission.X)` (Matrix in `Domain/Authorization/Permissions.cs`, ADR-0008). Bei `AccessLevel.Restricted` muss der Slice objektbezogen prüfen (z. B. „nur eigene“) – dafür Tests schreiben. Matrix-Änderungen in `PermissionMatrixTests` nachziehen. * Administrative Aktionen schreiben ins Audit-Log (`IAuditLogger`), ohne Passwörter/PINs. * Request-DTOs mit Validatoren in `FamilyPlanner.Shared` (FluentValidation) – Api validiert per `.Validate()`, der Client nutzt dieselben Validatoren. * Schreibende Requests vom Client tragen `X-Requested-With: FamilyPlanner` (wird vom `HttpClient`-Handler im Client gesetzt, siehe ADR-0006). * Validierung mit FluentValidation im jeweiligen Slice. * Pakete nur über `Directory.Packages.props` (keine Versionen in `.csproj`), nur stabile Versionen. * Keine Secrets im Repo: User Secrets / Aspire-Parameter lokal, `.env` in Docker. * Nach jeder Roadmap-Phase: Build, Tests, Aspire-Start prüfen, Roadmap abhaken, committen.