Basis: Certvia dev@a48c5fb als Fundament für Craftvia
CI / build-and-check (push) Canceled after 0s
CI / audit (push) Canceled after 0s
CI / sbom (push) Canceled after 0s

Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation
und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 11:05:39 +02:00
co-authored by Claude Opus 5
commit c8e6f30a27
720 changed files with 140143 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
# Kickoff-Prompt — Lane Betreiber-Konsole-UX + i18n (certvia)
> Diesem Prompt einem Entwickler/Claude-Code-Agenten geben. Bootstrapt in certvia + diese Lane.
```text
Du übernimmst die Lane „Betreiber-Konsole-UX + vollständige i18n" am Produkt „certvia" (ISMS-Tool,
Multi-Tenant Next.js-16 / Prisma-7 / Postgres+RLS / Auth.js-v5). Repo: ~/Projects/ISMS-Tool, Branch `dev`.
WICHTIG: certvia ist strikt getrennt von jedem anderen Produkt (insb. „visitvia"). Nichts vermischen.
BRANCH/CHECKOUT:
Arbeits-Branch: `lane-ui-i18n` (KEIN `feature/`-Prefix — origin-Namespace-Konflikt).
git fetch origin && git checkout dev && git checkout -b lane-ui-i18n.
Remotes: origin = https://git.certvia.de/msolarczek/certvia.git · local-gitea (intern).
1) PFLICHTLEKTÜRE:
- docs/HANDOVER-DEV.md, docs/SPEC.md, docs/STAND-dev-branch.md
- docs/KONZEPT-ui-i18n.md ← dein Fahrplan (Bugfix 1+2, Ergänzungen A/B)
2) AUFTRAG:
BUGFIX 1 — Betreiber-Konsole (src/app/(platform)/admin/[id]/page.tsx):
- Module → Popup (searchParam `?modules=1`, <Modal>); Benutzer → Popup (`?users=1`).
Muster existiert bereits auf der Seite (?new/?edit/?audit) — analog kapseln.
- Hauptfenster stattdessen: Stammdaten (aus TenantSettings) + Hauptkontakt sichtbar.
Offene Kleinentscheidung: Hauptkontakt = neue Felder in TenantSettings vs. Ableitung aus
tenant-admin — mit PM klären.
BUGFIX 2 — Vollständige UI-Sprache + per-Mitarbeiter-Umschaltung:
- BEFUND: messages/en.json existiert (~95%), aber src/i18n/request.ts ist HART auf "de"
(Zeile 8). TenantSettings.locale steuert nur die Richtlinien-Import-Sprache, NICHT die UI.
- Neu: Identity.uiLocale (de|en, Default de) — persönliche Präferenz, folgt der Person.
- request.ts liest uiLocale der aktiven Session-Identity (Fallback de).
- Umschalter im Nutzer-Menü (Header/Profil) → Server-Action setUiLocale → speichern + reload.
- messages/en.json auf 100% prüfen/auffüllen; hartkodierte deutsche Strings in Komponenten
aufspüren und in den Katalog überführen.
ERGÄNZUNG A — Login: Organisationsfeld (`tenant`) aus src/app/login/page.tsx ENTFERNEN
(nach Option C überflüssig; Mandant kommt über /select-tenant). login-ticket-Signaturen entschlacken.
3) VERBINDLICHE REGELN:
- UI-Sprache (Identity.uiLocale, Person) und Vorlagen-Import-Sprache (TenantSettings.locale,
Inhalt) sind ZWEI getrennte Achsen — nicht vermischen.
- Popups über das bestehende searchParam/<Modal>-Muster, KEINE neue Modal-Infrastruktur.
- Stammdaten haben EINE Quelle (TenantSettings) — keine Doppelpflege einführen.
- RLS/Datenpfade unverändert; das ist eine reine UI-/Präferenz-Lane.
4) ARBEITSWEISE:
- Gate vor JEDEM Merge: tsc · lint · build · ALLE scripts/test-*.ts.
- UI-Verifikation im Browser: Betreiber-Popups (Module/Benutzer), Sprachumschaltung DE↔EN
(Menü + Beschreibungen wechseln), Login ohne Organisationsfeld, /select-tenant unverändert.
- DevOps: lane-ui-i18n → git merge --no-ff nach dev → Gate grün → Push auf BEIDE Remotes →
STAND pflegen.
5) NICHT TUN: keine Änderung am Auth-Kern/an /select-tenant-Logik; Identity.uiLocale nur als
Präferenzfeld ergänzen (keine Auth-Semantik).
Erste Schritte: (a) Pflichtlektüre + Fragen (v.a. Hauptkontakt-Feld), (b) PR-Plan je Bugfix
(Migration Identity.uiLocale, request.ts, Menü-Switcher; Popup-Umbau admin/[id]), (c) umsetzen.
Warte nach (a)/(b).
```