- 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>
5.1 KiB
This is NOT the Next.js you know
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.
Craftvia — Projektregeln
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/craftvia/SPEC-CRAFTVIA.md (Rollen, Module, Abläufe, Akzeptanzkriterien) und docs/craftvia/ARCHITEKTUR.md (Datenmodell, Schnitte; wird separat geliefert). Marke: docs/craftvia/BRANDBOOK.md, Umsetzung im Code: docs/craftvia/BRANDING.md.
Eiserne Regeln
- Mandanten-Isolation: Kein DB-Zugriff an Prisma vorbei, kein Query ohne Tenant-Kontext.
Fachliche Tabellen tragen
tenant_id; Zugriff nur überdbForTenant(tenantId)(src/server/db.ts), zusätzlich Postgres RLS. Neue Tenant-Tabelle ⇒SELECT enable_tenant_rls('<tabelle>');in der Migration und Eintrag in beidenTENANT_MODELS-Listen (src/server/db.ts,src/server/backup/topology.ts) — siehe docs/craftvia/MIGRATIONS.md. - RBAC serverseitig: Jede Mutation/Query prüft Permissions am Server
(
customer:write,work_order:assign, …; Katalog insrc/server/rbac.ts). UI-Ausblenden ist nur Komfort, nie Sicherheit. - Modul-Gating: Routen eines Moduls haben ein
layout.tsxmitawait requireModule("<moduleKey>"); Server-Actions liegen insrc/server/actions/<moduleKey>/*.tsund laufen übermoduleGuard("<moduleKey>")+await guard(...).scripts/check-module-guards.tserzwingt das (prebuild). - Audit-Log: Jede schreibende Aktion erzeugt einen
AuditLog-Eintrag (before/after,writeAuditLoginsrc/server/audit.ts). - i18n: Keine hartkodierten UI-Texte — alle Strings über den Message-Katalog
(
dedefault,engepflegt). Ein File je Namespace:messages/<locale>/<namespace>.json. - DSGVO: Felder, die Personen referenzieren (
User.id), insrc/server/dsgvo/pii-fields.tseintragen.
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 16 (App Router,
src/proxy.tsstatt 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-*.tsgegen die lokale Infra; Runnernpm 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.
Rollen (Spec §4)
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
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.