Fundament: Doku, Testanpassungen, Restbereinigung

- AGENTS.md und README.md auf Craftvia umgeschrieben (Regeln, Andockpunkte,
  Stack mit Garage, tsx-Tests, Gate, Demo-Logins)
- ISMS-Dokumente entfernt (SPEC, Prototypen, Lane-Prompts, Übergaben, Konzepte
  Incidents/Framework); Fundament-Doku (Deploy, Sicherheit, Backup, Identity) bleibt
- Fundament-Tests an Craftvia-Rollen/Branding angepasst, Resttreffer
  certvia/isms in Skripten und Kommentaren bereinigt

Gate: prisma generate, migrate status, tsc, lint, build, 22/22 Testskripte grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 11:44:58 +02:00
co-authored by Claude Opus 5
parent ba7d6ac3ed
commit 1701db0a62
20 changed files with 131 additions and 73 deletions
+68 -19
View File
@@ -4,37 +4,86 @@
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
<!-- END:nextjs-agent-rules -->
# ISMS-Tool — Projektregeln
# Craftvia — Projektregeln
Multi-Tenant-SaaS für Informationssicherheits-Managementsysteme (ISO/IEC 27001:2022, TISAX/VDA-ISA 6.0).
Mandantenfähige Einsatz-PWA für Handwerks- und Montagebetriebe: Kunden, Objekte, Teams,
Aufträge (inkl. PDF-Import), mobile Einsatzbearbeitung, Berichte, Notdienst, Dokumente,
KI-Assistent „Lotse".
**Maßgebliche Spezifikation: [docs/SPEC.md](docs/SPEC.md)** — Architektur, Datenmodell, Module, Rollen, Akzeptanzkriterien. UI-Referenz: [docs/ISMS-Prototyp-GEFIM.html](docs/ISMS-Prototyp-GEFIM.html) (Orientierung für Navigation/Layout; fachlich gilt die Spec, die über das Mockup hinausgeht).
**Maßgebliche Spezifikation: [docs/craftvia/SPEC-CRAFTVIA.md](docs/craftvia/SPEC-CRAFTVIA.md)**
(Rollen, Module, Abläufe, Akzeptanzkriterien) und
**[docs/craftvia/ARCHITEKTUR.md](docs/craftvia/ARCHITEKTUR.md)** (Datenmodell, Schnitte; wird
separat geliefert). Marke: [docs/craftvia/BRANDBOOK.md](docs/craftvia/BRANDBOOK.md), Umsetzung
im Code: [docs/craftvia/BRANDING.md](docs/craftvia/BRANDING.md).
## Eiserne Regeln
1. **Mandanten-Isolation:** Kein DB-Zugriff an Prisma vorbei, kein Query ohne Tenant-Kontext. Fachliche Tabellen tragen `tenant_id`; Zugriff nur über den Tenant-Guard (`src/server/db.ts`), zusätzlich Postgres RLS.
2. **RBAC serverseitig:** Jede Mutation/Query prüft Permissions am Server (`asset:read`, `risk:write`, …). UI-Ausblenden ist nur Komfort, nie Sicherheit.
3. **Audit-Log:** Jede schreibende Aktion erzeugt einen `AuditLog`-Eintrag (before/after).
4. **i18n:** Keine hartkodierten UI-Texte — alle Strings über den Message-Katalog (`de` default, `en` vorbereitet).
5. **Lizenz:** Keine ISO-Normtexte oder VDA-ISA-Kataloginhalte einchecken — nur Control-Referenzen/Titel; VDA-ISA-Inhalte kommen per Kunden-Import (`ISA6-EN.xlsx`).
1. **Mandanten-Isolation:** Kein DB-Zugriff an Prisma vorbei, kein Query ohne Tenant-Kontext.
Fachliche Tabellen tragen `tenant_id`; Zugriff nur über `dbForTenant(tenantId)`
(`src/server/db.ts`), zusätzlich Postgres RLS. Neue Tenant-Tabelle ⇒
`SELECT enable_tenant_rls('<tabelle>');` in der Migration **und** Eintrag in beiden
`TENANT_MODELS`-Listen (`src/server/db.ts`, `src/server/backup/topology.ts`) — siehe
[docs/craftvia/MIGRATIONS.md](docs/craftvia/MIGRATIONS.md).
2. **RBAC serverseitig:** Jede Mutation/Query prüft Permissions am Server
(`customer:write`, `work_order:assign`, …; Katalog in `src/server/rbac.ts`). UI-Ausblenden
ist nur Komfort, nie Sicherheit.
3. **Modul-Gating:** Routen eines Moduls haben ein `layout.tsx` mit
`await requireModule("<moduleKey>")`; Server-Actions liegen in
`src/server/actions/<moduleKey>/*.ts` und laufen über `moduleGuard("<moduleKey>")` +
`await guard(...)`. `scripts/check-module-guards.ts` erzwingt das (prebuild).
4. **Audit-Log:** Jede schreibende Aktion erzeugt einen `AuditLog`-Eintrag (before/after,
`writeAuditLog` in `src/server/audit.ts`).
5. **i18n:** Keine hartkodierten UI-Texte — alle Strings über den Message-Katalog
(`de` default, `en` gepflegt). Ein File je Namespace: `messages/<locale>/<namespace>.json`.
6. **DSGVO:** Felder, die Personen referenzieren (`User.id`), in
`src/server/dsgvo/pii-fields.ts` eintragen.
## Andockpunkte für Fachmodule
| Was | Wo |
|---|---|
| Modul-Keys | `src/lib/modules.ts` (`customers`, `sites`, `teams`, `work_orders`, `imports`, `field`, `reports`, `emergency`, `documents`, `notifications`, `lotse`) |
| Sidebar (Backoffice) | `src/lib/nav.ts` (Modul + Permission-Filter) |
| Routen-Platzhalter | `src/app/(app)/<route>/{layout,page}.tsx` — Lane ersetzt `page.tsx` |
| Server-Actions | `src/server/actions/<moduleKey>/*.ts` |
| Rollen/Permissions | `src/server/rbac.ts` (danach `scripts/sync-role-permissions.ts`) |
| Texte | `messages/de/<namespace>.json` + `messages/en/<namespace>.json` |
| Benachrichtigungen | `notifyUser()` in `src/server/mail/notifications.ts` |
| Dateien | `src/server/storage/*` (Keys mit Präfix `<tenantId>/`), Download `/files/<key>` |
| KI | `src/server/ai/client.ts` |
| Provisionierung neuer Mandanten | `src/server/provision.ts` |
## Stack & Konventionen
- Next.js (App Router) + TypeScript, Tailwind CSS 4, shadcn/ui, dnd-kit, Recharts.
- Prisma + PostgreSQL 16 (pgvector), BullMQ + Redis (Worker), MinIO (S3), Auth.js (Credentials, Argon2id).
- Tests: Vitest (Unit), Playwright (E2E). `npm run lint` und `npm run build` müssen vor jedem Commit grün sein.
- Sprache: UI und Fachbegriffe Deutsch; Code (Bezeichner, Kommentare) Englisch.
- Next.js 16 (App Router, `src/proxy.ts` statt Middleware) + TypeScript, Tailwind CSS 4,
shadcn/ui (Base UI), lucide-react, next-intl.
- Prisma 7 (`prisma.config.ts`, Adapter `@prisma/adapter-pg`) + PostgreSQL 16 (pgvector),
BullMQ + Redis (Mail-/Backup-Worker), **Garage** (S3-kompatibel) als Objektspeicher,
Auth.js v5 (Credentials, Argon2id + Pepper, TOTP/WebAuthn, getrennte Plattform-Auth).
- Tests: tsx-Skripte `scripts/test-*.ts` gegen die lokale Infra; Runner `npm run test`.
- Qualitäts-Gate vor jedem Commit: `npm run gate`
(= `prisma generate && tsc --noEmit && lint && build && test`).
- Sprache: UI und Fachbegriffe Deutsch; Code (Bezeichner) Englisch, Kommentare Deutsch
oder Englisch.
## Offene Härtungspunkte (Iteration 8)
## Rollen (Spec §4)
- RLS scharfschalten: App-Verbindung auf DB-Rolle `isms_app` umstellen und `app.tenant_id` pro Transaktion setzen (Policies existieren bereits, siehe Migration `row_level_security`).
- TOTP-2FA (Schema-Feld `mfa_secret` ist vorbereitet).
- Rollenänderungen wirken erst beim nächsten Login (Permissions liegen im JWT).
`tenant-admin` (Mandantenadministrator), `backoffice`, `team-lead` (Teamleiter),
`technician` (Monteur). Plattform-Administratoren sind ein getrennter Store
(`/platform/login`) ohne Zugriff auf Mandanten-Fachdaten. Rechte liegen im JWT und wirken
für Lesepfade nach erneutem Login; Mutationen prüfen autoritativ gegen die DB (`moduleGuard`).
## Entwicklung
```bash
docker compose up -d postgres redis minio # Infrastruktur
npx prisma migrate dev # Migrationen
npm run dev # App auf :3000
docker compose up -d postgres redis garage # Infrastruktur (+ --profile dev für mailhog)
GARAGE_ADMIN_URL=http://localhost:3903 npx tsx scripts/garage-provision.ts # Bucket/Key (einmalig)
npx prisma migrate deploy && npx prisma db seed # Schema + Demo-Daten
npm run dev # App auf :3000
npm run gate # vollständiges Qualitäts-Gate
```
Demo-Logins (Passwort `Demo1234!` bzw. `SEED_PASSWORD`): `admin@demo.example`,
`backoffice@demo.example`, `teamleiter@demo.example`, `monteur@demo.example`
(Mandant „Musterbau Haustechnik GmbH"), `admin2@demo.example` (`demo2`),
`multi@demo.example` (beide Mandanten), Plattform: `platform@demo.example`.