Add plan.md and CLAUDE.md
Architecture decisions with rationale (plan.md) and repo-specific build/run commands plus style rules (CLAUDE.md). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
8b172e2c3c
commit
2298051bf4
2 files changed
+496
No files matched your search
@@ -0,0 +1,66 @@
|
||||
# CLAUDE.md
|
||||
|
||||
Website des Elternbeirats der IGMH. Blazor Web App mit statischem
|
||||
Server-Side-Rendering, .NET 10. Läuft als Container auf Unraid hinter dem Nginx
|
||||
Proxy Manager.
|
||||
|
||||
Architekturentscheidungen und deren Begründung: `plan.md`. Dort nachlesen, bevor
|
||||
eine davon in Frage gestellt wird.
|
||||
|
||||
## Wann welches Dokument
|
||||
|
||||
| Thema | Datei |
|
||||
|---|---|
|
||||
| Warum SSR statt WASM, warum keine DB, offene Punkte, Meilensteine | `plan.md` |
|
||||
| Unraid, compose, NPM-Proxy-Host, Registry, Rollback | `docs/deployment.md` |
|
||||
| Strato, DynDNS, Mail-Records | `docs/dns.md` |
|
||||
| Inhalte anlegen und ändern | `docs/inhalte-pflegen.md` |
|
||||
| Impressum, Datenschutz, Fotos | `docs/recht.md` |
|
||||
|
||||
## Kommandos
|
||||
|
||||
```bash
|
||||
dotnet run --project Elternbeirat.Web # lokal, Content-Reload per FileSystemWatcher
|
||||
dotnet test # Smoke-Tests: jede Route liefert 200
|
||||
docker compose build && docker compose up -d
|
||||
```
|
||||
|
||||
Es gibt keine Datenbank, keine Migrationen, kein Seeding. Ein `git clone` ist der
|
||||
vollständige Stand.
|
||||
|
||||
## Nicht offensichtlich
|
||||
|
||||
- **Inhalte liegen im Image**, nicht in einem Volume. Jede Textänderung braucht
|
||||
Commit und Rebuild. Das ist Absicht (`plan.md`, AE-3) — nicht „vereinfachen".
|
||||
- **Kein `UseHttpsRedirection()`, kein `UseHsts()`.** NPM terminiert TLS; beides
|
||||
erzeugt hinter dem Proxy eine Redirect-Schleife. `UseForwardedHeaders` mit
|
||||
geleerten `KnownNetworks`/`KnownProxies` ist korrekt so, weil der Container kein
|
||||
Port-Mapping hat und nur über NPM erreichbar ist.
|
||||
- **Das chiseled-Runtime-Image hat keine Shell.** `HEALTHCHECK` mit `curl` oder
|
||||
`sh` schlägt dort fehl.
|
||||
- Neue Seite = Markdown in `Content/seiten/`. Neuer Termin = Eintrag in
|
||||
`Content/termine.yml`. In beiden Fällen wird **kein** `.razor` angefasst.
|
||||
- Slugs ohne Umlaute (`ueber-uns`, nicht `über-uns`).
|
||||
|
||||
## Regeln
|
||||
|
||||
- **Statisches SSR ist der Default.** Kein `@rendermode` ohne konkreten Anlass,
|
||||
und wenn, dann an genau der einen Komponente — nie global.
|
||||
- **Keine externen Ressourcen.** Keine CDN-Skripte, keine Google Fonts, keine
|
||||
Maps- oder Video-Embeds. Schriften werden selbst ausgeliefert. Grund ist
|
||||
Datenschutz, nicht Geschmack (`docs/recht.md`).
|
||||
- **Keine Datenbank, kein EF Core, kein ORM.** Inhalte sind Dateien.
|
||||
- **Inhalte gehören nach `Content/`**, nicht als Markup in Komponenten.
|
||||
- Kein CMS, kein Login, keine Benutzerkonten.
|
||||
- UI-Texte auf Deutsch, ohne Anglizismen. `Termine`, nicht `Events`.
|
||||
- Neue NuGet-Abhängigkeiten vorher begründen. Bestand: `Markdig`, `YamlDotNet`.
|
||||
|
||||
## Stil
|
||||
|
||||
- Nullable aktiviert, `ImplicitUsings` an, File-scoped Namespaces.
|
||||
- Services über DI, als Singleton registriert (Inhalte werden beim Start
|
||||
eingelesen und gecacht).
|
||||
- Öffentliche Typen und Methoden der `Services` bekommen XML-Doc, Razor-Markup
|
||||
nicht.
|
||||
- Fachbegriffe im Code auf Deutsch, wenn sie Domänenbegriffe sind
|
||||
(`Termin`, `Protokoll`, `Beitrag`) — Framework-Begriffe bleiben englisch.
|
||||
Reference in new issue
Block a user