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:
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user