From 1928922e075aee09651a07da02fd2ff652e1d50e Mon Sep 17 00:00:00 2001 From: Sebastian Frank Date: Sat, 17 Oct 2026 01:49:35 +0000 Subject: [PATCH] =?UTF-8?q?Audit=20+=20Umbau:=20Faktenfehler=20behoben,=20?= =?UTF-8?q?Server-/Admin-L=C3=BCcken=20geschlossen,=2049=20Screenshots,=20?= =?UTF-8?q?Schema-Matrix=20generiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Audit: plans/doku-audit.md (Befunde, Phasen P1-P9, Ausführungsprotokoll) + plans/audit/ (8 Detailreports) + plans/offene-issues.md - Werkzeuge: scripts/audit-docs.mjs (Links/Anker/Bilder/Tabellen), scripts/gen-schema-matrix.mjs (npm run gen:schemas) - Neue Seiten: projekt/feld-rechte, reference/rest-system, reference/schema-properties, projekt/tests, 5 Anwender-Seiten - Fehler behoben: EMBEDDING_BGE_M3_*-Env, allowSnapshots, MCP-Scopes (.read/.create/.update), meta.views, loadAll-Signatur, OpenAPI-Endpunkt, MongoDB 8, Befehlspalette - Screenshots: 9 Admin + 10 Anwender aus Mock-Projekt corporate (t1 entfernt), 49 Bilder gesamt - AGENTS.md: Sync-Behauptung richtiggestellt, Belegpflicht/UI-Namen/Screenshot-Regeln, Werkzeug-Abschnitt - Build: 71 Seiten grün, 0 tote Links, 0 kaputte Tabellen --- AGENTS.md | 39 +- astro.config.mjs | 10 + package.json | 2 +- plans/audit-report.json | 151 +++ plans/audit/01-server-features.md | 200 ++++ plans/audit/02-admin-interfaces.md | 128 +++ plans/audit/03-types-starter.md | 125 +++ plans/audit/04-legacy-docs.md | 106 +++ plans/audit/05-review-admin-reference.md | 55 ++ plans/audit/05-review-anwender-adr.md | 58 ++ plans/audit/05-review-einstieg-server.md | 68 ++ plans/audit/05-review-projekt.md | 88 ++ plans/doku-audit.md | 776 +++++++++++++++ plans/doku-ausbau.md | 27 +- plans/offene-issues.md | 37 + scripts/audit-docs.mjs | 277 ++++++ scripts/gen-schema-matrix.mjs | 417 ++++++++ scripts/sync-openapi.mjs | 30 +- scripts/sync-server-docs.mjs | 10 +- src/assets/admin/admin-aktionen.webp | Bin 0 -> 21754 bytes src/assets/admin/admin-ansichten-listen.webp | Bin 0 -> 23842 bytes src/assets/admin/admin-benutzer-rechte.webp | Bin 0 -> 57914 bytes src/assets/admin/admin-customizing.webp | Bin 0 -> 30546 bytes src/assets/admin/admin-eintrags-editor.webp | Bin 0 -> 78496 bytes src/assets/admin/admin-exporte.webp | Bin 0 -> 22354 bytes src/assets/admin/admin-ki-funktionen.webp | Bin 0 -> 45188 bytes src/assets/admin/admin-medien.webp | Bin 0 -> 58816 bytes src/assets/admin/admin-setup.webp | Bin 0 -> 52950 bytes src/assets/anwender/aktionen-formular.webp | Bin 0 -> 22572 bytes src/assets/anwender/aktionen-fortschritt.webp | Bin 0 -> 26714 bytes src/assets/anwender/backup-analyse.webp | Bin 0 -> 28672 bytes src/assets/anwender/backup-reiter.webp | Bin 0 -> 32818 bytes .../anwender/massenbearbeitung-auswahl.webp | Bin 0 -> 32364 bytes .../anwender/massenbearbeitung-vorschau.webp | Bin 0 -> 32008 bytes .../anwender/tastenkombinationen-overlay.webp | Bin 0 -> 40286 bytes src/assets/anwender/verlauf-diff.webp | Bin 0 -> 57382 bytes src/assets/anwender/verlauf-seitenleiste.webp | Bin 0 -> 90820 bytes .../anwender/verlauf-wiederherstellen.webp | Bin 0 -> 49104 bytes src/content/docs/admin/aktionen.md | 35 +- src/content/docs/admin/ansichten-listen.md | 8 +- src/content/docs/admin/benutzer-rechte.md | 34 +- src/content/docs/admin/customizing.md | 23 +- src/content/docs/admin/eintrags-editor.md | 39 +- src/content/docs/admin/exporte.md | 53 +- src/content/docs/admin/ki-funktionen.md | 19 +- src/content/docs/admin/konzept.md | 2 +- src/content/docs/admin/medien.md | 6 +- src/content/docs/admin/setup.md | 24 +- src/content/docs/anwender/aktionen.md | 61 ++ src/content/docs/anwender/anmelden.md | 2 +- .../docs/anwender/backup-einspielen.md | 63 ++ src/content/docs/anwender/benutzer-teams.md | 2 +- .../docs/anwender/eintrag-bearbeiten.md | 2 +- src/content/docs/anwender/exportieren.md | 64 +- src/content/docs/anwender/hilfe.md | 55 +- src/content/docs/anwender/ki-nutzen.md | 13 +- .../docs/anwender/lesen-suchen-filtern.md | 4 +- .../docs/anwender/massenbearbeitung.md | 67 ++ src/content/docs/anwender/medien.md | 6 +- src/content/docs/anwender/orientierung.md | 16 +- src/content/docs/anwender/seiten-bauen.md | 30 +- src/content/docs/anwender/sichern.md | 4 +- .../docs/anwender/tastenkombinationen.md | 52 + .../docs/anwender/verlauf-wiederherstellen.md | 76 ++ src/content/docs/einstieg/begriffe.md | 50 + src/content/docs/einstieg/neues-projekt.md | 36 +- src/content/docs/einstieg/schnellstart.md | 8 +- src/content/docs/einstieg/was-ist-tibi.md | 12 +- src/content/docs/index.mdx | 34 +- src/content/docs/projekt/abfragen-lesen.md | 50 +- src/content/docs/projekt/audit-backup.md | 125 ++- src/content/docs/projekt/dateien-bilder.md | 14 +- src/content/docs/projekt/deploy.md | 33 +- src/content/docs/projekt/feld-rechte.md | 87 ++ src/content/docs/projekt/felder-widgets.md | 44 +- src/content/docs/projekt/hooks-schreiben.md | 22 +- src/content/docs/projekt/jobs-actions.md | 2 +- src/content/docs/projekt/llm-nutzen.md | 4 +- src/content/docs/projekt/mcp-nutzen.md | 893 ++++++------------ src/content/docs/projekt/navigation-i18n.md | 16 +- src/content/docs/projekt/pagebuilder-dev.md | 91 +- src/content/docs/projekt/rechte-tokens.md | 52 +- .../docs/projekt/sammlungen-anlegen.md | 23 +- src/content/docs/projekt/ssr-website.md | 42 +- src/content/docs/projekt/suche.md | 43 +- src/content/docs/projekt/tests.md | 83 ++ src/content/docs/reference/fehlercodes.md | 2 +- src/content/docs/reference/hook-kontexte.md | 28 +- src/content/docs/reference/hooks-daten.md | 6 +- src/content/docs/reference/hooks-medien.md | 2 +- src/content/docs/reference/hooks-meta.md | 2 +- src/content/docs/reference/hooks-netze.md | 2 +- .../docs/reference/hooks-sicherheit.md | 2 +- src/content/docs/reference/openapi.md | 15 +- src/content/docs/reference/rest-system.md | 65 ++ .../docs/reference/schema-properties.md | 386 ++++++++ src/content/docs/reference/schemas.md | 15 +- .../docs/reference/tastatur-kurzbefehle.md | 3 +- src/content/docs/reference/token-koepfe.md | 8 +- src/content/docs/server/betrieb.md | 24 +- src/content/docs/server/konfiguration.md | 70 +- src/content/docs/server/schnittstellen.md | 10 +- src/content/docs/server/sicherheit.md | 6 +- src/content/docs/server/uebersicht.md | 26 +- 104 files changed, 4756 insertions(+), 1044 deletions(-) create mode 100644 plans/audit-report.json create mode 100644 plans/audit/01-server-features.md create mode 100644 plans/audit/02-admin-interfaces.md create mode 100644 plans/audit/03-types-starter.md create mode 100644 plans/audit/04-legacy-docs.md create mode 100644 plans/audit/05-review-admin-reference.md create mode 100644 plans/audit/05-review-anwender-adr.md create mode 100644 plans/audit/05-review-einstieg-server.md create mode 100644 plans/audit/05-review-projekt.md create mode 100644 plans/doku-audit.md create mode 100644 plans/offene-issues.md create mode 100644 scripts/audit-docs.mjs create mode 100644 scripts/gen-schema-matrix.mjs create mode 100644 src/assets/admin/admin-aktionen.webp create mode 100644 src/assets/admin/admin-ansichten-listen.webp create mode 100644 src/assets/admin/admin-benutzer-rechte.webp create mode 100644 src/assets/admin/admin-customizing.webp create mode 100644 src/assets/admin/admin-eintrags-editor.webp create mode 100644 src/assets/admin/admin-exporte.webp create mode 100644 src/assets/admin/admin-ki-funktionen.webp create mode 100644 src/assets/admin/admin-medien.webp create mode 100644 src/assets/admin/admin-setup.webp create mode 100644 src/assets/anwender/aktionen-formular.webp create mode 100644 src/assets/anwender/aktionen-fortschritt.webp create mode 100644 src/assets/anwender/backup-analyse.webp create mode 100644 src/assets/anwender/backup-reiter.webp create mode 100644 src/assets/anwender/massenbearbeitung-auswahl.webp create mode 100644 src/assets/anwender/massenbearbeitung-vorschau.webp create mode 100644 src/assets/anwender/tastenkombinationen-overlay.webp create mode 100644 src/assets/anwender/verlauf-diff.webp create mode 100644 src/assets/anwender/verlauf-seitenleiste.webp create mode 100644 src/assets/anwender/verlauf-wiederherstellen.webp create mode 100644 src/content/docs/anwender/aktionen.md create mode 100644 src/content/docs/anwender/backup-einspielen.md create mode 100644 src/content/docs/anwender/massenbearbeitung.md create mode 100644 src/content/docs/anwender/tastenkombinationen.md create mode 100644 src/content/docs/anwender/verlauf-wiederherstellen.md create mode 100644 src/content/docs/projekt/feld-rechte.md create mode 100644 src/content/docs/projekt/tests.md create mode 100644 src/content/docs/reference/rest-system.md create mode 100644 src/content/docs/reference/schema-properties.md diff --git a/AGENTS.md b/AGENTS.md index c2041a0..f1c38b9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,20 +12,25 @@ Regeln für alle Agenten, die an dieser Doku, am Tibi-Server / tibi-admin oder a - **Single Source:** Code-Nähe schlägt Doku-Kopie. Details stehen in `tibi-server/docs/` bzw. `tibi-admin-nova/docs/` (Doku-Begriff: **tibi-admin**), diese Seite rendert nur. **Code schlägt Doku:** Bestandsdoku gilt als Behauptung, Quelle ist der Code (`internal/*`, `tibi-types/schemas`, `frontend/src/lib`, Tests, Test-Pläne). - **Definition of Done:** Jede PR an `tibi-server` oder `tibi-admin-nova`, die API, Hooks, Collections, Permissions, Jobs, Realtime, LLM, Deploy oder UX ändert, aktualisiert auch die Docs — sonst ist die PR nicht fertig. +- **Belegpflicht:** Jede prüfbare Aussage trägt einen Stempel am Seitenende (ausgenommen: `index.mdx`, `adr/0000-vorlage.md`, ADRs ohne prüfbaren Inhalt und generierte Seiten wie `reference/schema-properties.md`): + `Verifiziert am <7-stelliger-hash> ()` — mehrere Quellen als Liste. Kein Hash ohne Prüfung, kein Datum ohne Prüftag. +- **UI-Namen wörtlich:** Jeder **fett** oder „zitierte" Bedienname muss wörtlich in + `../tibi-admin-nova/frontend/src/lib/i18n/locales/de.json` stehen. Findet man keinen String, beschreibt + man die Wirkung („der Knopf oben rechts") statt einen Namen zu erfinden. - **Sprache:** Deutsch, saubere Umlaute (ä ö ü ß), Du-Form, kurze Sätze. Ton: **per Du, aber professionell** — sachlich wie ein gutes Handbuch, niemals Babysprache. Keine belehrenden Binsen („wenn du nichts findest, verändere die Suche"), keine Verniedlichung („keine Angst"), keine erfundenen Floskeln. UI-Namen immer wörtlich aus `de.json` bzw. Screenshot. Anweisungen nennen den exakten Klickpfad; „Was-tun-wenn" nur für echte, am Code belegte Fälle. -## 2. Wo was hingehört — Stand: Gerüst steht, Hüllen mit Arbeitsaufträgen +## 2. Wo was hingehört — Stand: ausgebaut (keine Hüllen mehr) -Jede Hüllen-Seite enthält Abschnitt „Für spätere Agenten“ mit Quelle-der-Wahrheit (Code zuerst), Prüfschritten und Ziel-Struktur. Hüllen abarbeiten heißt: Code prüfen, Seite befüllen, `Verifiziert am ` ergänzen. +Jede Seite nennt ihre Quelle-der-Wahrheit (Code zuerst), hat einen Stempel am Ende und mindestens einen Querverweis auf verwandte Seiten. Neue Fähigkeiten bekommen genau eine Dokustelle (Tabelle unter §3 „Vollständigkeit"). | Ordner | Inhalt | Beispiel | |---|---|---| | `einstieg/` | Tutorials, Erste Schritte (Projekt-Blick) | Schnellstart, Neues Projekt, Begriffe | | `projekt/` | Projekt-Entwickler baut eigenständige Website (Sammlungen → Deploy) | Hooks, SSR, Suche | -| `server/` | **SYNC — nicht von Hand editieren**, Quelle `../tibi-server/docs/`; dazu Handseiten Betrieb | Konfiguration, Sicherheit | -| `admin/` | Teils SYNC aus `../tibi-admin-nova/docs/`, plus Handseiten | Konzept, Editor, Exporte | +| `server/` | **Handseiten** (deutsch): Server-Sicht für Projekt-Entwickler und Betreiber. Die englische Core-Referenz liegt in `../tibi-server/docs/` und wird **nicht** synchronisiert | Konfiguration, Sicherheit | +| `admin/` | Handseiten (deutsch) zur Bedienoberfläche tibi-admin, teils mit Bezug auf `../tibi-admin-nova/docs/` | Konzept, Editor, Exporte | | `anwender/` | Redakteurs-Anleitungen im Verwaltungs-Backend (Aufgaben, keine Konzepte) | Anmelden, Medien | -| `reference/` | Teils **generiert — nie von Hand** (openapi), teils Code-Stand-Tabellen | Hook-Kontexte, Token-Köpfe | +| `reference/` | Teils **generiert — nie von Hand** (openapi, schema-properties), teils Code-Stand-Tabellen | Hook-Kontexte, Token-Köpfe | | `adr/` | Architektur-Entscheide, Format siehe `adr/0000-vorlage.md` | Code-schlägt-Doku | ## 3. Neue Seite anlegen @@ -33,19 +38,29 @@ Jede Hüllen-Seite enthält Abschnitt „Für spätere Agenten“ mit Quelle-der - Datei `src/content/docs//.md` mit Frontmatter `title` + `description`. - Sidebar: jede Gruppe explizit in `astro.config.mjs` eintragen (beim Neuaufbau pro Bereich ergänzen; `autogenerate` erst nutzen, sobald der Ordner gepflegt befüllt ist). - Bilder nach `src/assets/`, max. 200 KB, deutsche Alt-Texte. -- Screenshots für Anwender-Seiten: nur Mock-Projekt `corporate` (nie `t1`), Ablauf unter `plans/t-shots-arbeitsauftrag.md`. +- Screenshots: nur Mock-Projekt `corporate` (nie `t1`), Ablauf unter `plans/t-shots-arbeitsauftrag.md`. + Anwender-Bilder nach `src/assets/anwender/`, Admin-Bilder nach `src/assets/admin/`, je ≤ 200 KB (WebP, 1440×900), deutscher Alt-Text im Markdown. Offene Motive stehen als `` in der Seite. - Vollständigkeit: neue Fähigkeit braucht genau eine Dokustelle — Tabelle in `plans/doku-ausbau.md` („Vollständigkeit") miterweitern. -## 4. Sync-Workflow +## 4. Werkzeuge und Prüfschritte ```sh -# nach jeder Änderung in tibi-server/docs oder tibi-admin-nova/docs: -npm run sync -npm run build # muss fehlerfrei durchlaufen +node scripts/audit-docs.mjs # Pflicht vor jedem Push: Frontmatter, Codeblöcke, Links, Anker, Bilder, Tabellen, Stil-Marker +npm run coverage # Coverage-Inventar (Routen, Hook-Kontexte, MCP-Tools, Schemas, Komponenten) +npm run gen:schemas # erzeugt reference/schema-properties.md aus ../tibi-types/schemas/config +npm run sync:openapi # holt die OpenAPI-Spec (braucht TIBI_NAMESPACE und laufenden tibi-server) +npm run build # muss grün durchlaufen (prüft interne Links NICHT) ``` -- `server/uebersicht.md` und `admin/konzept.md` sind Handarbeit und werden vom Sync nie überschrieben (`keep`) — Sync-Ziel für Admin ist `src/content/docs/admin/` (Repo bleibt `tibi-admin-nova`). -- Sync-Artefakte werden mitcommittet (statischer Build braucht sie). +- `scripts/audit-docs.mjs` meldet tote Links/Anker, kaputte Tabellen, fehlende Alt-Texte und offene + Platzhalter-Marker. Ergebnis **muss** „0 tote Links, 0 kaputte Tabellen" sein; verbleibende Marker + sind zu begründen. +- `scripts/gen-schema-matrix.mjs` und `reference/schema-properties.md` sind ein Paar: Seite nie von Hand + editieren, Schemas nie in der Doku nachpflegen — nur `npm run gen:schemas` laufen lassen. +- `scripts/sync-server-docs.mjs` ist **stillgelegt** (der Server-Sync erzeugte verwaiste Seiten ohne + Sidebar-Eintrag). Nicht mehr aufrufen; die Datei wird entfernt, sobald niemand sie vermisst. +- `server/uebersicht.md` und `admin/konzept.md` sind Handarbeit. +- Screenshots werden mitgeliefert (statischer Build braucht sie). ## 5. Verbote diff --git a/astro.config.mjs b/astro.config.mjs index db6188e..95d048d 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -35,6 +35,7 @@ export default defineConfig({ baseUrl: 'https://gitbase.de/cms/tibi-docs/_edit/master/', }, tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 }, + lastUpdated: true, sidebar: [ { label: 'Einstieg', @@ -62,6 +63,7 @@ export default defineConfig({ { label: 'Felder und Widgets', slug: 'projekt/felder-widgets' }, { label: 'Lesen und suchen', slug: 'projekt/abfragen-lesen' }, { label: 'Rechte und Tokens', slug: 'projekt/rechte-tokens' }, + { label: 'Feld-Rechte', slug: 'projekt/feld-rechte' }, { label: 'Hooks', slug: 'projekt/hooks-schreiben' }, { label: 'Dateien und Bilder', slug: 'projekt/dateien-bilder' }, { label: 'Navigation und Sprachen', slug: 'projekt/navigation-i18n' }, @@ -73,6 +75,7 @@ export default defineConfig({ { label: 'MCP nutzen', slug: 'projekt/mcp-nutzen' }, { label: 'Sicherung', slug: 'projekt/audit-backup' }, { label: 'Veröffentlichen', slug: 'projekt/deploy' }, + { label: 'Tests und Mock', slug: 'projekt/tests' }, ], }, { @@ -99,9 +102,14 @@ export default defineConfig({ { label: 'Einträge bearbeiten', slug: 'anwender/eintrag-bearbeiten' }, { label: 'Bilder und Dateien', slug: 'anwender/medien' }, { label: 'Seiten bauen', slug: 'anwender/seiten-bauen' }, + { label: 'Verlauf und Wiederherstellen', slug: 'anwender/verlauf-wiederherstellen' }, + { label: 'Mehrere Einträge ändern', slug: 'anwender/massenbearbeitung' }, + { label: 'Aktionen ausführen', slug: 'anwender/aktionen' }, + { label: 'Tastenkürzel', slug: 'anwender/tastenkombinationen' }, { label: 'Benutzer und Teams', slug: 'anwender/benutzer-teams' }, { label: 'Exportieren', slug: 'anwender/exportieren' }, { label: 'Sichern', slug: 'anwender/sichern' }, + { label: 'Backup einspielen', slug: 'anwender/backup-einspielen' }, { label: 'Hilfe', slug: 'anwender/hilfe' }, { label: 'KI nutzen', slug: 'anwender/ki-nutzen' }, ], @@ -111,6 +119,8 @@ export default defineConfig({ items: [ { label: 'OpenAPI', slug: 'reference/openapi' }, { label: 'Schemas', slug: 'reference/schemas' }, + { label: 'Schema-Properties', slug: 'reference/schema-properties' }, + { label: 'System-Routen', slug: 'reference/rest-system' }, { label: 'Hook-Kontexte', slug: 'reference/hook-kontexte' }, { label: 'Hook-Referenz: Daten', slug: 'reference/hooks-daten' }, { label: 'Hook-Referenz: Netze und Nachrichten', slug: 'reference/hooks-netze' }, diff --git a/package.json b/package.json index 07a9733..92bf43f 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "build": "astro build", "preview": "astro preview", "astro": "astro", - "sync": "node scripts/sync-server-docs.mjs", "sync:openapi": "node scripts/sync-openapi.mjs", + "gen:schemas": "node scripts/gen-schema-matrix.mjs", "coverage": "node scripts/coverage-inventory.mjs" }, "dependencies": { diff --git a/plans/audit-report.json b/plans/audit-report.json new file mode 100644 index 0000000..e1a45ac --- /dev/null +++ b/plans/audit-report.json @@ -0,0 +1,151 @@ +{ + "generatedAt": "2026-10-17T01:48:54.973Z", + "stats": { + "files": 70, + "byDir": { + "admin": 10, + "adr": 4, + "anwender": 16, + "einstieg": 4, + "index.mdx": 1, + "projekt": 17, + "reference": 13, + "server": 5 + }, + "components": { + "Aside": 111, + "Badge": 30, + "Steps": 92, + "TabItem": 64, + "Tabs": 28, + "Card": 11, + "CardGrid": 7, + "FileTree": 3, + "LinkCard": 19 + }, + "lacksDescription": [], + "emptyFenceLang": 0, + "proseWalls": [], + "asciiUmlauts": [ + "src/content/docs/admin/aktionen.md", + "src/content/docs/anwender/aktionen.md", + "src/content/docs/projekt/felder-widgets.md", + "src/content/docs/projekt/mcp-nutzen.md", + "src/content/docs/projekt/navigation-i18n.md", + "src/content/docs/projekt/ssr-website.md", + "src/content/docs/reference/schema-properties.md" + ], + "hollowMarkers": [ + "src/content/docs/admin/exporte.md:37 Platzhalter", + "src/content/docs/anwender/seiten-bauen.md:45 Platzhalter", + "src/content/docs/einstieg/neues-projekt.md:26 Platzhalter", + "src/content/docs/einstieg/schnellstart.md:48 noch nicht", + "src/content/docs/einstieg/schnellstart.md:21 Platzhalter", + "src/content/docs/einstieg/was-ist-tibi.md:11 Platzhalter", + "src/content/docs/projekt/deploy.md:26 Platzhalter", + "src/content/docs/reference/openapi.md:6 Platzhalter" + ], + "t1Refs": [ + "src/content/docs/admin/konzept.md", + "src/content/docs/admin/setup.md", + "src/content/docs/adr/0003-selbstlaeufer.md" + ], + "tibiAdminRefs": [ + "src/content/docs/admin/aktionen.md (2×)", + "src/content/docs/admin/ansichten-listen.md (2×)", + "src/content/docs/admin/benutzer-rechte.md (2×)", + "src/content/docs/admin/customizing.md (2×)", + "src/content/docs/admin/eintrags-editor.md (2×)", + "src/content/docs/admin/exporte.md (2×)", + "src/content/docs/admin/ki-funktionen.md (2×)", + "src/content/docs/admin/konzept.md (3×)", + "src/content/docs/admin/medien.md (2×)", + "src/content/docs/admin/setup.md (4×)", + "src/content/docs/adr/0001-starlight.md (1×)", + "src/content/docs/adr/0002-code-schlaegt-doku.md (2×)", + "src/content/docs/adr/0003-selbstlaeufer.md (1×)", + "src/content/docs/anwender/anmelden.md (5×)", + "src/content/docs/anwender/benutzer-teams.md (1×)", + "src/content/docs/anwender/exportieren.md (3×)", + "src/content/docs/anwender/ki-nutzen.md (1×)", + "src/content/docs/anwender/medien.md (1×)", + "src/content/docs/anwender/orientierung.md (2×)", + "src/content/docs/anwender/seiten-bauen.md (1×)", + "src/content/docs/anwender/sichern.md (1×)", + "src/content/docs/einstieg/begriffe.md (4×)", + "src/content/docs/einstieg/neues-projekt.md (1×)", + "src/content/docs/einstieg/schnellstart.md (1×)", + "src/content/docs/einstieg/was-ist-tibi.md (3×)", + "src/content/docs/projekt/audit-backup.md (2×)", + "src/content/docs/projekt/jobs-actions.md (1×)", + "src/content/docs/projekt/navigation-i18n.md (1×)", + "src/content/docs/projekt/pagebuilder-dev.md (1×)", + "src/content/docs/projekt/sammlungen-anlegen.md (1×)", + "src/content/docs/projekt/suche.md (2×)", + "src/content/docs/reference/tastatur-kurzbefehle.md (2×)" + ], + "fm_hero": 1, + "fm_template": 1 + }, + "sidebar": { + "count": 69, + "notInSidebar": [], + "sidebarMissing": [] + }, + "findings": [ + { + "file": "src/content/docs/admin/exporte.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": Stehen im Export-Dialog eigene Reiter **vor** dem Standard-Tab, hat das Projekt fertige Berichte in `collectio", + "line": 37 + }, + { + "file": "src/content/docs/anwender/seiten-bauen.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": Die kleine Vorschau benötigt nach der Bildauswahl einen Moment. Ein Platzhalterbild ist in dieser Phase normal", + "line": 45 + }, + { + "file": "src/content/docs/einstieg/neues-projekt.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": ## 2. Platzhalter und Starter-Reste", + "line": 26 + }, + { + "file": "src/content/docs/einstieg/schnellstart.md", + "kind": "hollow", + "msg": "Marker \"noch nicht\": - `project not found` → Projektdateien liegen da, aber das Projekt ist im laufenden tibi-server noch nicht reg", + "line": 48 + }, + { + "file": "src/content/docs/einstieg/schnellstart.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": ## 2. Platzhalter ersetzen", + "line": 21 + }, + { + "file": "src/content/docs/einstieg/was-ist-tibi.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": - **Projekt-Website (aus `tibi-svelte-starter` geklont):** eigenständige Website auf Tibi-Basis — normale klei", + "line": 11 + }, + { + "file": "src/content/docs/projekt/deploy.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": Im Starter stehen Platzhalter (`__PROJECT_NAME__`, `_CUSTOMER_ID_`, `LIVE_URL=https://www`).", + "line": 26 + }, + { + "file": "src/content/docs/reference/openapi.md", + "kind": "hollow", + "msg": "Marker \"Platzhalter\": > Stand: Platzhalter · Quelle: `GET /api/v1/_openapi/:project` — nicht von Hand editieren. Erzeugen mit `npm r", + "line": 6 + } + ], + "summary": { + "total": 8, + "byKind": { + "hollow": 8 + } + } +} \ No newline at end of file diff --git a/plans/audit/01-server-features.md b/plans/audit/01-server-features.md new file mode 100644 index 0000000..45d4a8d --- /dev/null +++ b/plans/audit/01-server-features.md @@ -0,0 +1,200 @@ +# Audit: tibi-server (Code) vs. tibi-docs (Doku) + +Stand: 2026-10-16 · Code-Commit lt. Doku `68b42785` (nicht per git verifiziert — kein git-Check in diesem Lauf). +Methode: `internal/`-Inventar + `internal/controller/setup.go` als Routen-Quelle, Hook-`RegisterPackageFunctions`-Blöcke, +MCP-`tools_*.go`, `internal/config/server.go` + `embedding_group.go`; Doku: `src/content/docs/{server,projekt,reference}/*.md`. +Jeder Code-Beleg mit `datei:zeile`. „nicht verifiziert" = im Code nicht prüfbar gefunden. + +--- + +## 1) Feature-Matrix + +Legende: **ok** = abgedeckt · **thin** = erwähnt, aber unvollständig/oberflächlich · **gap** = fehlt. + +### 1.1 Module `internal/*` + +| Modul | Code-Beleg | Dokuseite(n) | Verdikt | Was fehlt | +|---|---|---|---|---| +| `cache` (projektweiter Hook-Cache, LRU, Default `MaxEntries 10000`, `DefaultTTL 0`) | `internal/cache/cache.go:23-33` | `reference/hooks-daten.md` (cache.*), `server/konfiguration.md` (`hook.cache.*`) | thin | Defaults (10000/0) und LRU/Eviction nirgends genannt | +| `config` (Datei + Env, `Server`-Struct) | `internal/config/server.go:229-242` | `server/konfiguration.md` | thin | siehe Config-Tabelle 1.5 | +| `dbapi` (CRUD-Handler, Login, Meta) | `internal/dbapi/register.go:62-135` | (keine eigene Seite) | gap | System-CRUD-Routen (`user/project/org/team/token`), `_meta`-Routen nirgends als Referenz (nur Neben­erwähnung in `projekt/mcp-nutzen.md:408`) | +| `dbcrud` (Index-Typen inkl. TTL) | `internal/dbcrud/index.go:5-37` | — | gap | nur indirekt (Audit-TTL). Kein Dokuseiten-Eintrag nötig, aber `expireAfterSeconds`-Semantik fehlt bei der „`"0"` = ewig"-Behauptung (s. 3.5) | +| `embedding` (Registry, Gruppen, Provider-Typen) | `internal/embedding/registry.go` (Existenz), `internal/config/embedding_group.go:150+` | `server/konfiguration.md:98-107`, `projekt/suche.md:37-42`, `server/betrieb.md:57` | thin | Policies (`prefer-in-order/fastest-wins/round-robin/lowest-latency/weighted`, `embedding_group.go:44-60`), Distributions, Health-/Race-/Retry-/Bulk-Tuning (`embedding_group.go:102-190`+ Env `server.go:489-625`) fehlen komplett | +| `filecleanup` ( orphan-Dateien, `SafeRemoveAll`) | `internal/filecleanup/cleanup.go:21-149` | — | gap | keine Dokuseite; nur Starter-Upload-Seite (`projekt/dateien-bilder.md`) | +| `hook` (23 Pakete + `request`-Fn + Legacy-Aliase) | `internal/hook/context_*.go`, `internal/hook/compatibility.go:8-35` | `reference/hook-kontexte.md`, `reference/hooks-{daten,netze,sicherheit,medien,meta}.md` | ok | ein Fehler: `crypto` „(plus weitere)" (s. 3.9); Legacy-Aliase (`mail`, `template`, `file`, `fetch`, `dump`, `header`, `auth`, …) bewusst undokumentiert — ok | +| `image` (FilterParams: width/height/fit/quality/…) | `internal/hook/context_image.go:75-235` | `reference/hooks-medien.md:28-46`, `projekt/dateien-bilder.md:80` | ok | — | +| `llm` (nur Chat + Budgets; **kein** Summarizer/STT/TTS) | `internal/llm/{provider,registry,quota,openai,models}.go`, `internal/controller/llm_chat.go` | `projekt/llm-nutzen.md` | ok | — (Doku erfindet nichts; Preise explizit als „steht nirgends" markiert) | +| `mcp` (36 Tools, Guards, Dispatch) | `internal/mcp/tools_{crud,discovery,system}.go`, `internal/mcp/guards.go:22-51`, `internal/controller/mcp_handler.go:43-71` | `projekt/mcp-nutzen.md`, `server/schnittstellen.md:72-88` | ok | Zählung stimmt (10+12+14=36, s. 1.3) | +| `mock`, `testsuite`, `mgocrud.old` | Verzeichnisse vorhanden | — | ok | intern/Test-Helfer bzw. Altlast — keine Doku nötig; `mgocrud.old` ist toter Code | +| `models` (Project/Collection/Hook/Job/Action/Token/Org/Team/Audit/…) | diverse, s. unten | verteilt | thin | Feld-Level-Permissions (s. 2.3), Scope-Katalog (s. 2.4), Snapshot-Detailfelder (s. 2.5) | +| `mongocrud` | Verzeichnis vorhanden | — | ok | Treiber-Detail, keine Doku nötig | +| `rankfusion` (RRF + `score_rrf/score_sum/rank_score/hybrid`, `minmax/zscore`) | `internal/rankfusion/*.go`, `internal/controller/collection_combined_search.go:142-230` | `projekt/suche.md:65-75` | thin | Formel ok; Strategien/Normierung/`scoreWeight`/`sourceConfig` nur als „existiert" erwähnt, nicht erklärt | +| `ratelimit` (Login-Backoff + Hook-Windows) | `internal/ratelimit/*`, `internal/controller/ratelimit_middleware.go:18-57`, `internal/hook/context_ratelimit.go` | `server/sicherheit.md:46-57`, `reference/hooks-netze.md:101-190` | ok | — | +| `realtime` (In-Memory-Hub, `Subscribe/Send`, Ringpuffer) | `internal/realtime/hub.go:94-179`, `internal/models/api.go:51-523` (Hub je Projekt-API) | `server/schnittstellen.md:64-70` | thin | Kapazität „Standard 256", `LastN/MaxAge/TTL`, Drop-Policy („Alt oder Neu") im Code nicht am Hub verifiziert — nur via Hook-Kontext (`context_channel.go`) plausibel; kein Abo-Endpunkt — korrekt dokumentiert | +| `suexec` (`RunInFilesUID`, kein Schalter) | `internal/suexec/thread.go:1-50`, Nutzung `internal/models/api.go:88-490`, `internal/filecleanup/cleanup.go:53` | `server/sicherheit.md:59-67`, `projekt/jobs-actions.md:49` | ok | — | +| `utils` (`ParseSize`, `ErrorObject` …) | diverse | — | ok | intern, keine Doku nötig | +| `vectorindex` (In-Memory-Vektorindex) | `internal/vectorindex/index.go` | `projekt/suche.md` (nur als „Vektor") | thin | kein eigener Doku-Eintrag (akzeptabel, da über `search`-Blöcke bedient) | +| `version` (`GET /version`) | `internal/controller/setup.go:703-707`, `internal/version/*` | `server/schnittstellen.md:26`, `server/betrieb.md:35` | ok | — | + +### 1.2 HTTP-Routen (Quelle: `internal/controller/setup.go`) + +Gesamt unter `/api/v1`: **48** (`27 GET + 14 POST + 2 PUT + 4 DELETE + 1 OPTIONS`) + `/metrics` (Root) = **49**. +Dazu dbapi-Systemrouten: 5 Modelle (`user, project, org, team, token` je GET-Liste/GET-:id/POST/PUT-:id/DELETE-:id = 25, `register.go:90-94`), +`_meta` + `_meta/` (`register.go:100-114`), Login ×2 (in den 14 POST enthalten). + +| Methode + Pfad | Handler (setup.go) | Dokuseite(n) | Verdikt | +|---|---|---|---| +| `GET /metrics` (Root, kein `/api/v1`) | `setup.go:159` | `server/betrieb.md:32-42` | ok | +| `GET /version` | `setup.go:703` | `server/schnittstellen.md:26`, `server/betrieb.md:35` | ok | +| `POST /login`, `POST /login/impersonate` | `setup.go:728-740` (+ `models/impersonate.go:29-101`) | `server/schnittstellen.md:28`, `reference/token-koepfe.md:45` | thin | Logout-Flow (`?logout=1`), Impersonation-Chains (`impersonate.go:86-101`), Org-Scope-Regel (`impersonate.go:214-233`) fehlen | +| `GET /token/_scopes` | `setup.go:303-311` | `server/schnittstellen.md:28` | thin | Katalog-Inhalt (`token_scope_catalog.go:47-90`: System- vs. Namespace-Scopes, UND-Regel) nicht erklärt | +| `POST /llm/chat`, `GET /llm/providers` | `setup.go:321-340` | `projekt/llm-nutzen.md:12-57` | ok | +| `GET /audit` | `setup.go:743-751` | `server/schnittstellen.md:31`, `projekt/audit-backup.md:18-46` | ok | +| `GET+POST /mcp` | `setup.go:754-755`, `mcp_handler.go:43-71` | `server/schnittstellen.md:72-88`, `projekt/mcp-nutzen.md` | ok | +| `GET /admin/embedding/status`, `POST /admin/shutdown` | `setup.go:769-798` | `server/schnittstellen.md:31` | ok | +| `GET /_/:project/:collection`, `POST /_/:project/:collection` (+ `X-HTTP-Method-Override: GET`) | `setup.go:506-636` | `projekt/abfragen-lesen.md`, `server/schnittstellen.md:38-46` | ok | +| `GET /_/:project/:collection/_count`, `/_facet`, `/_queue` | `setup.go:514-535` | `projekt/abfragen-lesen.md:95-110` | ok | +| `GET+PUT+DELETE /_/:project/:collection/:id` | `setup.go:536-665` | dto. | ok | +| `GET /_/:project/:collection/:id/:field`, `…/:field/*path` | `setup.go:545-568` | `server/schnittstellen.md:42`, `projekt/dateien-bilder.md` | thin | Feld-Route ok; Datei-Route nur via MCP-`file_read`-Hinweis | +| `PUT+DELETE /_/:project/:collection` (Bulk) | `setup.go:645-673` | `server/schnittstellen.md:41` | thin | Bulk-Semantik (`Allow`+`Bulk`-Flag, `permission.go:145-182`) nicht erklärt; `collection_bulk_post.go` existiert, hat aber **keine** eigene Route (Aufrufweg nicht verifiziert) | +| `GET+POST /_/:project/_actions/:action` | `setup.go:676-690` | `projekt/jobs-actions.md:54-119` | ok | +| `GET /_openapi/:project` | `setup.go:692-701` | `server/schnittstellen.md:90-92` | thin | `reference/openapi.md` ist Platzhalter mit falscher Quelle (s. 3.3) | +| `GET /_/:project/_/assets/:name/*path` | `setup.go:497-504` | `server/schnittstellen.md:44`, `projekt/mcp-nutzen.md:81` | ok | +| `POST …/_/admin/reload` | `setup.go:372-376` | `server/betrieb.md:54`, `projekt/deploy.md:84-93` | ok | +| `POST …/_/admin/regenerate-search`, `GET …/search-worker/status`, `GET …/embedding/status` | `setup.go:378-394` | `server/betrieb.md:54-57`, `projekt/suche.md:87-90` | ok | +| Backup: `GET analyze-download`, `GET` Download, `GET download/:file`, `POST` Analyse, `POST :restoreToken`, `DELETE :restoreToken` | `setup.go:398-433`, `admin_backup*.go` | `projekt/audit-backup.md:110-133`, `server/betrieb.md:66` | thin | Restore-Token-Flow (Analyse → Token → Restore/Cleanup) nur angerissen; `checkProjectAdminAuth`-Reihenfolge (Server-Token → Projekt-Token → JWT-Admin, `admin_auth.go:20-74`) fehlt | +| Snapshots: `GET configs`, `POST configs/:name/trigger`, `GET` Liste, `GET download/:file`, `GET :id`, `DELETE :id`, `POST :id/restore`, `GET :id/download`, `GET stats`, `POST prune` (10 Routen) | `setup.go:436-495` | `projekt/audit-backup.md:60-108` (`…/snapshots…`-Sammelzeile in schnittstellen.md:57) | thin | Einzelne Routen (stats/prune/trigger/download) nicht benannt; `collections: []` = alle ok (`snapshot_config.go:144`); `mode: include/exclude`, `collectionDedup`, `permissions`-Feld (`snapshot_config.go:34-53`), `retention.maxAge/maxSizeBytes` (`snapshot_config.go:89-93`) fehlen | +| `OPTIONS /*path` (404 ohne echte Route) | `setup.go:226-230` | `server/sicherheit.md:44`, `server/schnittstellen.md` (implizit) | ok | +| System-CRUD `user/project/org/team/token` (je 5 Routen) | `dbapi/register.go:90-94` via `RegisterModel` (`setup.go:274-312`) | `reference/token-koepfe.md:31-42` (Projekt-Anlage), MCP-`user_*`-Zeilen | gap | keine REST-Referenz für User-/Org-/Team-/Token-CRUD; `token`-Collection-Felder (`scopes`, `expiresAt`, `token.go:39-76`) undokumentiert | +| `GET /_meta`, `GET /_meta/` | `dbapi/register.go:100-114` | nur Neben­erwähnung `projekt/mcp-nutzen.md:408` | gap | + +**Routen-Bilanz (gruppiert): ca. 44/49 dokumentiert, 2 gaps (System-CRUD, `_meta`), Rest thin bei Detail­feldern.** + +### 1.3 Hook-Kontexte (alle `context_*.go`) + +Pakete (23 + `request`-Funktion): `base64, bcrypt, cache, channel, charset, config, cookie, crypto, db, debug, exec, fs, http, image, json, jwt, pdf, ratelimit, request(fn: `context_request.go:12`), response, smtp, tpl, user, xml` — **alle 23 in `reference/hook-kontexte.md:36-61` + Detail­kapiteln vorhanden.** +Funktionen je Paket — Abgleich `RegisterPackageFunctions`-Blöcke gegen Referenz: + +| Paket | Code-Funktionen | Referenz | Fehlend | +|---|---|---|---| +| db (7) | find/count/create/update/delete/deleteMany/updateMany (`context_db.go:16`) | hooks-daten.md:8-112 | — | +| cache (6) | set/get/has/delete/clear/count (`context_cache.go:11`) | hooks-daten.md:114-194 | — | +| request (1) | `request()` (`context_request.go:12`) | hooks-daten.md:196-217 | — | +| response (5) | header/writeHeader/write/flush/writeSSE (`context_response.go:13`) | hooks-daten.md:219-297 | — | +| fs (8) | configDir/readFile/writeFile/stat/readDir/mkDir/remove/copy (`context_fs.go:17`) | hooks-daten.md:299-409 | — | +| http (2) | fetch/fetchStream (`context_http.go`) | hooks-netze.md:8-44 | — | +| smtp (1) | sendMail (`context_smtp.go:18`) | hooks-netze.md:46-68 | — | +| channel (2) | subscribe/send (`context_channel.go:13`) | hooks-netze.md:69-100 | — | +| ratelimit (6) | backoffCheck/backoffRecord/backoffReset/windowCheck/windowReset/windowCount (`context_ratelimit.go`) | hooks-netze.md:101-190 | — | +| jwt (2) | create/parse | hooks-sicherheit.md:8-37 | — | +| user (1) | auth → nur `{id, username, role, permissions}` (`context_user.go:26-31`) | hooks-sicherheit.md:39-55 | thin (Rückgabe­felder; keine Orgs/Teams) | +| bcrypt (2) | hash/check | hooks-sicherheit.md:56-86 | — | +| crypto (2) | **nur** sha256/md5 (`context_crypto.go:13-16`) | hooks-sicherheit.md:87-116 („plus weitere") | **1 Fehler** (s. 3.9) | +| cookie (2) | get/set | hooks-sicherheit.md:117-146 | — | +| exec (1) | command | hooks-sicherheit.md:147-163 | — | +| config (3) | namespace/project/server | hooks-sicherheit.md:164-209 | — | +| tpl (1) | execute | hooks-medien.md:8-27 | — | +| image (1) | filter | hooks-medien.md:28-46 | — | +| pdf (2) | fromHTML/cpu | hooks-medien.md:47-84 | — | +| base64 (2) | encode/decode | hooks-meta.md:8-37 | — | +| json (2) | parse/stringify | hooks-meta.md:38-67 | — | +| xml (2) | create/parse | hooks-meta.md:68-97 | — | +| charset (2) | decode/iso8859ToUtf8 | hooks-meta.md:98-127 | — | +| debug (3) | dump/sentryTraceId/sleep | hooks-meta.md:128-173 | — | +| Legacy-Aliase (26, `compatibility.go:8-35`) | readCollection, mail, template, file, fetch, dump, header, auth, … | — (bewusst) | ok | + +**Hook-Bilanz: alle 23 Pakete + alle 70 Funktionen dokumentiert; 1 Fehler (`crypto`), 1 thin (`user.auth`-Felder).** + +### 1.4 MCP-Tools (36 = 10 + 12 + 14) + +- crud (`tools_crud.go:8-104`): documents_list, document_get, documents_count, documents_facet, queue_status, document_create, document_update, document_delete, file_read, action_call — alle 10 in `projekt/mcp-nutzen.md:63-72` ✓ +- discovery (`tools_discovery.go:8-103`): projects_list, project_get, collections_list, collection_describe, actions_list, action_describe, jobs_list, openapi_get, system_meta_get, agent_guide_get, assets_list, asset_read — alle 12 in `mcp-nutzen.md:73-81` ✓ +- system (`tools_system.go:8-34`): users_list, user_get, user_create, user_update, user_delete, orgs_list, org_get, teams_list, team_get, audit_query, project_reload, regenerate_search, backup_create, snapshots_list — alle 14 in `mcp-nutzen.md:82-90` ✓ (REST-only-Badges entsprechen den `REST-only`-Descriptions im Code) +- Guards korrekt dokumentiert: PAT-only (`guards.go:22-51`), Admin-Token-Reject (`mcp_handler.go:51-56`), disabled → 404 (`mcp_handler.go:45-49`), GET-Probe (`mcp_handler.go:63-71`), Fehler­codes -32601/-32602/-32003/-32004 (`mcp_handler.go:107-127`) ✓ + +### 1.5 Config (`config.yml` + Env, Quelle `internal/config/server.go`) + +| Bereich | Code (yaml-Tag) | Doku | Verdikt | +|---|---|---|---| +| `db` (dial/prefix/logging) | `server.go:22-24` + Env `DB_DIAL(/MGO_DIAL)`, `DB_PREFIX`, `DB_LOGGING` (`server.go:276-286`) | konfiguration.md:28 | ok | +| `api` (port, jwtSecret, secureCookies, Lifetimes, upload, adminTokens) | `server.go:45-56` + Env `server.go:290-318` | konfiguration.md:29,79-83,109-124 | thin | `upload.allowedMimeTypes` (`server.go:46`) fehlt überall (gap); `secureCookies`-Default true korrekt (`server.go:61-64` ✓) | +| `mail` (host/username/password) | `server.go:97-99` + nur `MAIL_HOST` (`server.go:320`) | konfiguration.md:30 | thin | `MAIL_USERNAME/PASSWORD` existieren **nicht** — Doku nennt sie implizit als Schlüssel ohne Env; ok, aber unklar | +| `security` (allowAbsolutePaths/allowUpperPaths) | `server.go:103-104` + Env (`server.go:324-328`) | konfiguration.md:31, sicherheit.md:61-67 | ok | +| `response.error` (stack/message) | `server.go:125-130` + Env (`server.go:338-341`) | konfiguration.md:33 | ok | +| `audit` (enabled/defaultTTL/defaultLimit/maxLimit) | `server.go:171-174` + Env (`server.go:345-354`) | konfiguration.md:33, betrieb.md:44-46 | ok (TTL-Default 720h ✓ `setup.go:344`) | +| `ratelimit` (enabled/loginInitialDelay/loginMaxDelay/loginResetAfter) | `server.go:201-208` + Env (`server.go:627-639`) | konfiguration.md:34, sicherheit.md:46-57 | ok (Defaults 1s/60s/15m ✓ `server.go:203-207`; 429+Retry-After ✓) | +| `hook.cache/ratelimit` | `server.go:179-188` + Env `HOOK_*` (`server.go:642-665`) | konfiguration.md:35 | thin | Feld­namen ok; Defaults/SEMANTIK (LRU, Fenster) fehlen | +| `mcp` (enabled/route/maxResultItems/allowAdminActions) | `server.go:221-224` + Env (`server.go:668-686`) | konfiguration.md:36, schnittstellen.md:72-88 | ok | Route-Aussage korrekt: Routing hart in `setup.go:754-755`, `mcp.Route()` ungenutzt (s. 3.7) | +| `sentry` (dsn/environment/serverName/enableTracing/debug) | `server.go:108-112` (kein Env) | konfiguration.md:37, betrieb.md:36 | thin | nur `dsn` erwähnt; Rest fehlt | +| `cors` | `server.go:116-121` | konfiguration.md:38, sicherheit.md:34-44 | thin | Server-`cors` als „Basis"+feldweises Merge: globaler CORS-Block in `setup.go:141-149` ist **auskommentiert** — Merge-Logik (`CORSMap`, `api.go`-Umfeld) nicht verifiziert | +| `llm`/`embedding` Provider + Gruppen | `server.go:135-167` + Env-Muster (`server.go:359-625`) | konfiguration.md:39,85-107 | **1 Fehler**: `EMBEDDING_BGE-M3_*` (s. 3.1); Gruppen-Details fehlen (s. 1.1 embedding) | +| Go-Version-Hinweis | `go.mod` (`go 1.25.0`, Toolchain `go1.25.7` — nicht verifiziert, go.mod nicht gelesen) | konfiguration.md:41-43 | nicht verifiziert | +| Datei-Fehlstart/Panic-Regeln | `server.go:260-296` (Default 8080/tibi/Stack-an; Port `<= 0` → Panic) | konfiguration.md:19-20 | ok | + +--- + +## 2) Nicht dokumentierte Fähigkeiten (keine Dokustelle in tibi-docs) + +1. **System-CRUD per REST** (`user/project/org/team/token`, je 5 Routen, `dbapi/register.go:90-94`): nur JWT-Projekt­anlage in `reference/token-koepfe.md:31-42` angerissen; Org-/Team-/Token-CRUD, `token`-Felder (`scopes`, `expiresAt`, `token.go:39-76`) fehlen. +2. **`_meta`-Routen** (`dbapi/register.go:100-114`): nur Neben­erwähnung (`projekt/mcp-nutzen.md:408`). +3. **Feld-Level-Permissions** (`models/field_permissions.go`; Status­codes `http_status.go:53-58`): **null Treffer** in tibi-docs. Server-Doc `docs/17-field-level-permissions.md` existiert, wurde nicht übernommen. +4. **Scope-Katalog** (`models/token_scope_catalog.go:47-90`: `systemScopesFor`, UND-Regel Token×Besitzer): nur Beispiel in `server/sicherheit.md:23-28`; Katalog­logik fehlt. +5. **`upload.allowedMimeTypes`** (`config/server.go:46`): null Treffer. +6. **Snapshot-Detailfelder**: `mode: include/exclude`, `collectionDedup` (`snapshot_config.go:34-42`), `permissions` (`snapshot_config.go:53`, „Phase 2"), `retention.maxAge/maxSizeBytes` (`snapshot_config.go:89-93`), Einzel­routen (stats/prune/trigger/:id/download). +7. **Embedding-Gruppen-Tuning**: Policies/Distributions/Health/Race/Retry/Bulk (`config/embedding_group.go`, Env `server.go:489-625`); nur MEMBERS/POLICY/TIMEOUT_TOTAL erwähnt. +8. **Such­modi jenseits Starter**: `text/regex/eval/filter` (`models/collection.go:314`), `sourceConfig/scoreWeight`/Strategien im Detail, `autoRegenerate`, Search-Worker, Vector-Loader; `aggregate` fehlt in `projekt/abfragen-lesen.md` (nur MCP/SSR/Fehler­codes nennen es); Such-Debug (`controller/search_debug.go`, `search_enrichment.go`) fehlt. +9. **Ephemeral REST Tokens**: `docs/24-ephemeral-rest-tokens.md` beschreibt sie — **im Code kein Treffer** (`phemeral` nur in `docs/24*`, `tmp/diff.patch`). Entweder unverified/unge­landet oder entfernt: Doku beschreibt nicht-existente Fähigkeit. +10. **SSR als Server-Fähigkeit**: kein `ssr`-Code in `internal/` (nur Starter-Hooks + `program_async_test.go:1024` erwähnen `ssrRequestKirby`). Korrekt als Starter-Doku abgelegt, aber `server/schnittstellen.md:68` („kein fertiger Abo-Endpunkt … nur über Hooks") ist die einzige Server-Aussage — ein expliziter Satz „SSR-Bundle/Cache sind Starter-Konvention, kein Server-Feature" fehlt. +11. **Gzip-Ausnahmen** (`setup.go:151-154`: kein Gzip für `.pdf/.mp4/.jpg/.jpeg/.png` + `/metrics`): undokumentiert. +12. **NaN-Sanitizing / `_search`-Stripping** (`setup.go:814-825`): undokumentiert (intern, niedrige Priorität). +13. **Backup-Restore-Token-Lebenszyklus** (Analyse → `:restoreToken` → Restore/Cleanup, `admin_backup*.go`) und Snapshot-RAM-Begrenzung: nur angerissen. +14. **Sentry-Felder** außer `dsn`, **Hook-Cache-Defaults**, **Filecleanup**, **`bulkCreate`-Aufrufweg** (`controller/collection_bulk_post.go` ohne eigene Route — Aufruf­weg nicht verifiziert). +15. **`mgocrud.old/`**: toter Code im Repo, keine Doku nötig — aber Aufräum­kandidat. + +## 3) Falsche Doku-Aussagen (12 geprüfte Behauptungen; falsche zuerst) + +| # | Doku-Zitat (Datei:Zeile) | Code (Datei:Zeile) | Urteil | +|---|---|---|---| +| 1 | `EMBEDDING_BGE-M3_*` — „Bindestrich → Unterstrich + Großschrift: `bge-m3` → `EMBEDDING_BGE-M3_*`" (`server/konfiguration.md:21`, Beispiel `:98-105`) | `normalizeEnvKeyName`: `-` → `_`, dann UPPER (`config/server.go:246-250`): `bge-m3` → `BGE_M3`, also `EMBEDDING_BGE_M3_*` | **FALSCH** (Bindestrich bleibt im Doku-Beispiel stehen) | +| 2 | „braucht dein Token `AllowSnapshot: true`" (`projekt/audit-backup.md:107`; Tabelle `:127-128`) | Projekt-Admin-Token heißt `allowSnapshots` (plural, klein): `models/project.go:104`, Prüfung `t.AllowSnapshots` (`controller/admin_snapshot_list.go:23-40`) | **FALSCH** (Singular statt Plural; korrekt: `allowSnapshots`) | +| 3 | `reference/openapi.md` komplett: Quelle `TIBI_API_URL/openapi.json`, „Erzeugen mit `npm run sync:openapi`" | Route ist `GET /api/v1/_openapi/:project` (`controller/setup.go:692-701`, `openapi_project_get.go:12`); kein `openapi.json`, kein `sync:openapi` im Server-Code gefunden | **FALSCH** (Platzhalter, passt nicht zum Server-Generator; `server/schnittstellen.md:90-92` ist dagegen korrekt) | +| 4 | `crypto.sha256`, `crypto.md5` „(plus weitere)" (`reference/hook-kontexte.md:52`) | Nur 2 Funktionen registriert (`hook/context_crypto.go:13-16`) | **FALSCH** („weitere" existieren nicht) | +| 5 | `audit.defaultTTL: 720h` „(30 Tage, `"0"` = ewig)" (`projekt/audit-backup.md:29`) | Default 720h ✓ (`controller/setup.go:344`); **kein** `"0"`-Sonderfall gefunden (`models/auditlog.go:498-508`, `dbcrud/index.go:12-14` geben `ttl` direkt an den Index) | **UNKLAR, eher falsch** — „ewig" nicht belegt; `expireAfterSeconds: 0` liefe auf sofortigen Verfall hinaus. Nicht verifiziert, ob `mongocrud` 0 abfängt | +| 6 | `POST /api/ssr?clear=1` / `POST /api/_/admin/reload` (ohne `/v1`, ohne Namespace) (`projekt/deploy.md:90-91`) | Server-Routen sind `/api/v1/_/:project/_/admin/reload` (`setup.go:372`) und haben **keine** `ssr`-Route (kein `ssr`-Code in `internal/`) | **UNKLAR** — nur als Starter-Proxy-Pfade sinnvoll; als Server-Aussage falsch. Doku markiert sie als Proxy („Live/Staging-URL"), aber der Kontrast zur Server-Tabelle fehlt | +| 7 | „ein gesetztes `mcp.route`/`MCP_ROUTE` wird ignoriert (Routing hart in `setup.go`)" (`server/schnittstellen.md:77`, `projekt/mcp-nutzen.md:10`) | Routing fix `apiGroup.GET/POST("/mcp")` (`setup.go:754-755`); `mcp.Route()`-Helper existiert (`mcp/server.go:27-32`), wird aber im Routing nirgends verwendet (nur `MaxResultItems()` in `mcp_tools_impl.go:701-707` genutzt) | **KORREKT** | +| 8 | „`Content-Range:` **mit Doppelpunkt** — Tippfehler im Code" (`projekt/abfragen-lesen.md:34`) | `c.Header("Content-Range:", …)` (`controller/collection_get.go:32`) | **KORREKT** | +| 9 | „429 plus `Retry-After`-Header (Sekunden) … nur für Login" (`server/sicherheit.md:52-57`) | `Retry-After` + 429 (`controller/ratelimit_middleware.go:56-57`); Login-Geltung via `loginMiddleware` nur an `/login` (`setup.go:712-732`) | **KORREKT** | +| 10 | „`model` ist optional … Allowlist leer = keine Prüfung" + 403-vor-400-Reihenfolge (`projekt/llm-nutzen.md:31-57,71-86`) | Auth+Scope vor Validierung (`controller/llm_chat.go:28-57`); Allowlist-Gate, Default-Redirect, Secrets-Ausschluss (`llm_chat.go`, `setup.go:322-340`) | **KORREKT** | +| 11 | Legacy-Default: Konflikt 500/409, Validierung 400/422, Schalter `legacy.httpCodes` (`reference/fehlercodes.md:20-21,43-45`) | `http_status.go:13-58` (201/200, 204/200, 401/403, 422/400, 409/500, 403/400); Default `true` (`models/project.go:80-87`); Key `httpCodes` (`project.go:77`) | **KORREKT** | +| 12 | „CORS-Kaskade `/_actions/` → `/` → `/` → `""`" + „Projekt mergt feldweise (`merge: true/false`)" (`server/sicherheit.md:36-44`) | Kaskaden-Reihenfolge exakt so (`setup.go:193-223`); `CORSConfig.Merge` existiert (`models/project.go:107-114`); globaler Server-CORS ist auskommentiert (`setup.go:141-149`) | **KORREKT** (Merge-Semantik im Detail nicht verifiziert) | + +Weitere verifizierte Korrekt-Aussagen (Stichprobe): Port-Panic `<= 0` ✓ (`server.go:295-296`), Not-Defaults 8080/tibi/Stack ✓ (`server.go:265-268`), `secureCookies`-Default true ✓ (`server.go:61-64`), Lifetimes 60m/10h ✓ (`server.go:69-90`), Audit-TTL-Default 720h ✓, MCP-404-bei-disabled ✓ (`mcp_handler.go:45-49`), `X-Auth-Token`-PAT-Prefix `tibi_pat_` ✓ (`mcp/guards.go:51`), Bulk-`Allow`+`Bulk` ✓ (`models/permission.go:145-182`), `snapshotPath`-Default „snapshots" ✓ (`models/project.go:65-67`), `collections: []` = alle ✓ (`snapshot_config.go:144`), Admin-Auth-Reihenfolge ✓ (`admin_auth.go:20-74`), 100-MB-Body-Default ✓ (`middleware_bodysize.go:14-29`), Kaskade Server→Projekt→Collection mit Server-Cap ✓ (`middleware_bodysize.go:34-69`). + +## 4) Veraltete Doku in `tibi-server/docs/*.md` (je Datei eine Zeile) + +| Datei | Inhalt (Kurz) | Abdeckung in tibi-docs | +|---|---|---| +| 01-architecture.md | Architektur-Überblick | teilweise (keine Architektur-Seite; verstreut in `server/uebersicht.md`) | +| 02-configuration.md | Vollständige Config-Referenz | teilweise (`server/konfiguration.md`; Gruppen-Tuning/Env-Details fehlen) | +| 03-api-endpoints.md (2406 Zeilen) | Alle Endpunkte | teilweise (`server/schnittstellen.md` + Projekt­seiten; System-CRUD/`_meta` fehlen) | +| 04-collections.md | Collection-Schema/Operatoren | teilweise (`projekt/sammlungen-anlegen.md`, `abfragen-lesen.md`; aggregate/eval fehlen) | +| 05-authentication.md | Login/JWT/Impersonate | teilweise (Login/Impersonate nur Tabellen­zeilen; Logout-Flow fehlt) | +| 06-hooks.md (1717 Zeilen) | Hook-Lifecycle + Kontexte | vollständig (Lifecycle via tibi-types-Schema nicht verifiziert; Kontexte alle da) | +| 07-realtime.md | Realtime-Hub | teilweise (`server/schnittstellen.md:64-70` nur Überblick) | +| 08-file-upload-images.md | Upload/Bilder | teilweise (Starter-Sicht in `projekt/dateien-bilder.md`; `allowedMimeTypes`/Filecleanup fehlen) | +| 09-llm-integration.md | LLM/Budgets | vollständig (`projekt/llm-nutzen.md`, inkl. Verifizierungs­zeile) | +| 10-audit.md | Audit-Log | teilweise (zweistufig + TTL ok; `"0"`-Claim fraglich, s. 3.5) | +| 11-jobs.md | Jobs/Cron | vollständig (`projekt/jobs-actions.md`) | +| 12-deployment.md | Deployment/Profile | teilweise (`server/betrieb.md`, `projekt/deploy.md`; Compose-Profile Starter-seitig) | +| 13-openapi-metrics.md | OpenAPI + Metriken | teilweise (OpenAPI-Generator ok; Metrik-Labels/Referenz-`openapi.md` defekt, s. 3.3) | +| 14-security.md | Tokens/CORS/Ratelimit/Pfade | vollständig (`server/sicherheit.md` + `konfiguration.md`) | +| 15-troubleshooting.md | Fehlerbilder | teilweise (verteilt auf Fehler­tabellen; keine eigene Seite) | +| 16-cookbook.md | Rezepte | teilweise (Rezepte in Projekt­seiten verstreut) | +| 17-field-level-permissions.md | Feld-Rechte | **nicht abgedeckt** (null Treffer, s. 2.3) | +| 18-orgs-teams.md | Orgs/Teams | teilweise (nur Überblick in `projekt/rechte-tokens.md:125-142`) | +| 19-actions.md | Actions | vollständig (`projekt/jobs-actions.md:54-119`) | +| 20-referenced-read-safety.md | Lookup-Read-Safety | teilweise (`projekt/abfragen-lesen.md:89-93`, `rechte-tokens.md`) | +| 21-backup-restore.md | Backup/Restore | teilweise (Flows ok; Token-Lebens­zyklus fehlt) | +| 22-personal-access-tokens.md | PATs | teilweise (Köpfe/Scopes ok; `token`-CRUD-Felder fehlen) | +| 23-mcp.md | MCP | vollständig (`projekt/mcp-nutzen.md`, 36/36 Tools) | +| 24-ephemeral-rest-tokens.md | Ephemere REST-Tokens | **nicht abgedeckt — und im Code nicht existent** (s. 2.9); keine Übernahme, sondern Klärung nötig (implementieren oder Doku löschen) | diff --git a/plans/audit/02-admin-interfaces.md b/plans/audit/02-admin-interfaces.md new file mode 100644 index 0000000..955db2e --- /dev/null +++ b/plans/audit/02-admin-interfaces.md @@ -0,0 +1,128 @@ +# Audit 02 — Entwickler- und Anwender-Schnittstellen von tibi-admin-nova + +> Audit-Agent, keine Doku-Änderung. Stand: 2026-10-16. +> Repo: `/WM_Dev/src/gitbase.de/cms/tibi-admin-nova` (= `NOVA:` unten). +> Doku: `/WM_Dev/src/gitbase.de/cms/tibi-docs` (= `DOKU:` unten). +> Verwendete Schemata: `NOVA:tibi-types/schemas/config/*.json`, `NOVA:types/admin.d.ts`, +> `NOVA:schemas/config/*.schema.json`. Frontend: `NOVA:frontend/src/`. + +## 1) Entwickler-Schnittstellen + +Legende Verdikt: `ok` = dokumentiert und korrekt · `thin` = erwähnt, aber unvollständig/falsch verlinkt · +`gap` = fehlt in tibi-docs **und** in `NOVA:docs/`. + +| Schnittstelle | Code-Beleg | Beschreibung | Dokuseite | Verdikt | +|---|---|---|---|---| +| Collection-Schema (`name`, `permissions` Pflicht; `fields`, `indexes`, `hooks`, `projections`, `audit`, `bulk`, `cors`, `queryLimits`, `readonlyFields`, `hiddenFields`, `strictFields`, `search`) | `NOVA:tibi-types/schemas/config/collection.schema.json:1-40` (props; `required: [name, permissions]`) | Top-Level-Sammlungsdefinition | `DOKU:projekt/sammlungen-anlegen.md` (Minimal, Meta, Indizes/Suche); Referenz `DOKU:reference/schemas.md` | ok (thin für `queryLimits`, `bulk`, `cors`, `strictFields` — nur in `NOVA:docs/collection-config.md` belegt) | +| `meta.label/group/muiIcon/hide/imageUrl/designGuide` | `NOVA:tibi-types/schemas/config/collection-meta.schema.json` (props); `NOVA:types/admin.d.ts:734ff` | Anzeige-/Gruppierungs-Meta | `DOKU:projekt/sammlungen-anlegen.md:79ff` (Tabelle Meta) | ok | +| `meta.preview` (label/secondary/tertiary/image, table-Spalten, Slots, Eval, FK-Auflösung) | `NOVA:tibi-types/schemas/config/defs.schema.json` (`previewConfig`, `previewSlots`); `NOVA:frontend/src/lib/components/entry/PreviewElement.svelte:1ff`; `NOVA:frontend/src/lib/components/ui/FieldValuePreview.svelte:1ff` | Vorschau-Auflösung inkl. FK-Badges, `_lookup`, Dot-Pfade | `DOKU:admin/customizing.md:35ff` (Tabelle, Verweis `preview-resolver`); `DOKU:projekt/sammlungen-anlegen.md:79ff` | thin (Resolver-Regeln — Auto-Detection vs. strikt, Nested-Pfade `profile.name`, FK-Badge-Auflösung — nur `NOVA:docs/test-plans/39-preview-resolver.md:1ff`) | +| `meta.viewHint` (`table`/`cards`/`{media}`/`{navigation}`) | `NOVA:types/admin.d.ts:460-470`; `NOVA:frontend/src/lib/components/CollectionView.svelte:575-607` (Default-Anwendung, URL gewinnt) | Startansicht der Liste | `DOKU:admin/ansichten-listen.md:10ff`; `DOKU:projekt/sammlungen-anlegen.md:79ff` | ok | +| `meta.views` (custom views, `AdminCollectionView`) | `NOVA:types/admin.d.ts:452-458` („custom views not yet supported“); Schema `collection-meta.schema.json` enthält **kein** `views` (`additionalProperties: false`) | Eigene Listenansichten — **nicht implementiert / schema-invalid** | `DOKU:admin/customizing.md:14` behauptet fälschlich „`meta.views` (Tabelle, Karten, Kalender …)“ | gap (**Doku-Fehler**: Behauptung ohne Code-Deckung) | +| `meta.subNavigation` (filter, defaultSort, setDefault) | `NOVA:tibi-types/schemas/config/collection-meta.schema.json` (`subNavigation`); `NOVA:types/admin.d.ts:364ff` | Reiter-Filter über der Liste | `DOKU:admin/ansichten-listen.md:29ff` | ok | +| `meta.defaultSort` (field, order inkl. `MANUALLY`) | Schema `collection-meta.schema.json` (`defaultSort`); `NOVA:types/admin.d.ts:426ff` | Standard-Sortierung, inkl. manuell per Drag | `DOKU:admin/ansichten-listen.md` (Sortierung); Drag in `DOKU:admin/customizing.md:10ff` | thin (`MANUALLY`/Drag-Freigabe nicht als Config dokumentiert) | +| `meta.singleton` (enabled, key) | Schema `collection-meta.schema.json` (`singleton`) | Ein-Eintrag-Sammlung | — (grep `singleton` in `DOKU:src/content/docs` ohne Treffer) | gap | +| `meta.sections` / `meta.sidebar` (Formular-Gruppen) | Schema (`sections`, `sidebar`); Feld-Seite `meta.position: main\|sidebar:` | Formular-Layout | `DOKU:projekt/sammlungen-anlegen.md:79ff` (`sidebar`-Zeile, `position`-Beispiel); `sections` ohne Treffer | thin (`sections`-Array und `collapsible/collapsed` fehlen) | +| `meta.i18n` + `i18n.entry` (languages, languageField/groupField/clearFields/copyFields) | Schema (`i18n`); `NOVA:frontend/src/lib/stores/form-i18n-support.svelte.ts:1ff`; `I18nLanguageTabs`, `TranslationBar` | Übersetzungs-Kopplung | `DOKU:admin/eintrags-editor.md:58ff`; `DOKU:projekt/sammlungen-anlegen.md:79ff` | thin (`clearFields`/`copyFields`-Semantik nur Code) | +| `meta.pagebuilder` (defaultViewport, blockTypeField, blockRegistry.file, screenshot) | Schema (`pagebuilder`); `NOVA:frontend/src/lib/components/entry/widgets/pagebuilder/load-registry.ts:14-38`; `NOVA:types/admin.d.ts:618-669` | Pagebuilder-Anbindung pro Sammlung/Feld | `DOKU:projekt/pagebuilder-dev.md:17ff` (Registry-Vertrag) | ok | +| `cssTransform`-Präzedenz (Block > Feld > Collection, Default `true`) | `NOVA:frontend/src/lib/components/entry/widgets/pagebuilder/load-registry.ts:41-60` | CSS-Umschreibung steuern | `DOKU:projekt/pagebuilder-dev.md:59ff` | ok | +| Block-Vertrag (`render/update/destroy`, `BlockRenderContext`, `css`, `previewStyles`, `label/icon/color`) | `NOVA:frontend/src/lib/components/entry/widgets/pagebuilder/BlockMount.ts:20-60` | Eigener Block (framework-agnostisch, Shadow-DOM) | `DOKU:projekt/pagebuilder-dev.md:154ff` | ok | +| Asset-Specifier (`_/` projekt-relativ, `/_/`-Alias, `/`-absolut, `https/data/blob` untouched, `{eval}`) | `NOVA:frontend/src/lib/utils/project-asset-specifier.ts:17-50`; genutzt von `load-registry.ts:30-38` und Custom-Exports | Pfadauflösung für Registry- + Export-Skripte | `DOKU:admin/exporte.md:35ff`; `DOKU:projekt/pagebuilder-dev.md:17ff` | thin (zentrale Regel nur im Code; `{eval}`-Variante nicht dokumentiert) | +| `meta.exports` (name+file Pflicht, filename-`{date}`) | Schema (`exports`); `NOVA:types/admin.d.ts:720ff` (file-Specifier, filename) | Skript-Exporte anmelden | `DOKU:admin/exporte.md:35ff` | ok | +| Export-Skript-API (`db.find/count/loadAll`, `xlsx`, `helpers`, `progress`, `signal`, `view`, kein `$auth`, genau 1 Payload + `contentType`) | `NOVA:frontend/src/lib/utils/custom-export.types.ts:17-100`; `NOVA:docs/custom-export-script.md:12-60`; `NOVA:frontend/src/lib/components/ui/ExportDialog.svelte` | Eigene Berichte schreiben | `DOKU:admin/exporte.md:48-72` (verkürzt; verweist für Details auf Repo-Doku) + `DOKU:admin/customizing.md:51ff` | thin (vollständiges `ctx`: `db.loadAll`-Batching 500er, `selector`-vs-`select`, nur `sort[0]`, `csvCell`-Injection-Guard, Dateinamen-Sanitizing nur in `NOVA:docs/custom-export-script.md`) — Hinweis: Beispiel `DOKU:admin/exporte.md:60` ruft `loadAll({filter})` ohne Collection auf (abweichend vom Typ `loadAll(collection, opts)`) | +| `meta.query` (typisierte Zusatz-Querykeys für Hooks, MCP-validiert) | Schema (`query`, description „hooks may read ctx.request().query“) | Projekt-eigene Query-Parameter deklarieren | nur Erwähnung in `DOKU:projekt/mcp-nutzen.md` | gap (für Projektentwickler) | +| `meta.agent` (purpose/instructions/fieldHints/workflows) | Schema (`agent`); ausgespielt via MCP/REST `_meta` | Editor-/Agenten-Doku pro Sammlung | nur Erwähnung in `DOKU:projekt/mcp-nutzen.md`, `DOKU:projekt/pagebuilder-dev.md` | gap (für Projektentwickler) | +| `meta.openapi` / `collection.openapi` | Schema (`openapi` → `openapi.schema.json`) | OpenAPI-Overrides | `DOKU:reference/openapi.md`, `DOKU:server/schnittstellen.md` | ok (Server-Seite; Admin-Nutzung nicht verifiziert) | +| `permissions` (public/user + Token-Rollen, methods, filter, validProjections, readonly-/hiddenFields) | `NOVA:tibi-types/schemas/config/permissions.schema.json:1-60` | Zugriffsrechte | `DOKU:projekt/rechte-tokens.md`; `DOKU:admin/benutzer-rechte.md:47ff` | ok | +| `project.admin.tokens` (`allowReload`, `allowRegenerateSearch`, `allowBackup`, `allowSnapshots`) | `NOVA:tibi-types/schemas/config/project.schema.json` (`admin`) | Token-Fähigkeiten für Backup/Snapshots/Search-Rebuild | — (grep `allowSnapshots`/`allowBackup` in Doku ohne Treffer) | gap | +| `hooks` (get/post/put/delete/audit, `{type:javascript,file,timeout}`) | `NOVA:tibi-types/schemas/config/hooks.schema.json:1-60`; Action-`hooks` ein String oder Hooks-Objekt (`action.schema.json`) | Server-Hooks | `DOKU:projekt/hooks-schreiben.md` | ok (Server-Seite) | +| `hooksTrigger` / `exportScript` (Task-Begriffe) | — (grep im gesamten `NOVA:`-Repo ohne Treffer) | nicht verifiziert — Begriffe existieren im Code nicht | — | nicht verifiziert | +| Feld-Schema (Typen, `index`, `subFields`, `validator`, `readonly/hidden` als bool-or-eval, `strictFields`) | `NOVA:tibi-types/schemas/config/field.schema.json:1-120`; `NOVA:tibi-types/schemas/config/field-meta.schema.json` (label/widget/i18n/helperText/dependsOn/choices/foreign/downscale/imageEditor/drillDown/pageSize/preview/addElementLabel/filter/pagebuilder/schemaRef/openapi) | Felddefinition + Admin-Meta | `DOKU:projekt/felder-widgets.md`; `DOKU:projekt/sammlungen-anlegen.md`; Widget-Tabelle `DOKU:admin/customizing.md:19ff` | ok (thin für `schemaRef`, `drillDown`, `pageSize`, `containerProps`, `protected`) | +| Actions (`query`/`data`-Felder, `execution.kind/cancellable`, `output.mapping.summary/details`, `output.mapping.progress` mit index-/count-/status-/messageField + fields) | `NOVA:tibi-types/schemas/config/action.schema.json` (`actionMethodMeta`, `actionOutputProgressMapping`, `actionExecutionMeta`); `NOVA:frontend/src/lib/components/ActionView.svelte:260-271,349,378-379` (SSE → Balken) | Action definieren + Fortschritt mappen | `DOKU:admin/aktionen.md:10-77`; `DOKU:projekt/jobs-actions.md:54ff` | ok (thin: `execution.kind`/`cancellable`-Semantik nur Code) | +| Jobs (`cron`, `{type:javascript,file,timeout}`) | `NOVA:tibi-types/schemas/config/job.schema.json:1-40` | Cron-Jobs | `DOKU:projekt/jobs-actions.md:22ff` | ok | +| Assets (`name`, `path`) | `NOVA:tibi-types/schemas/config/asset.schema.json` | Projekt-Assets | nicht verifiziert | nicht verifiziert | +| KI-Proxy-Profile (`chat` + `summarizer/translation/vision`, `stt`, `tts`, Pricing) | `NOVA:config/ai-proxy.config.json:1-50`; `NOVA:schemas/config/ai-proxy-config.schema.json` (chat/stt/tts Pflichtfelder) | LLM-Provider/Modelle/Preise (Server) | `DOKU:projekt/llm-nutzen.md:59ff`; `DOKU:admin/ki-funktionen.md:107ff` (Grenzen/Kosten) | thin (Profil-Vererbung summarizer/translation/vision, `chatTemplateKwargs`, Pricing-Felder nur Code) | +| Runtime-System-Config (`frontend/assets/system.config.json`, Endpunkte, Engine-Modi `auto/api/browser/none`, TTS-Stimmen) | `NOVA:frontend/src/lib/runtime-system-config.ts:205` (`loadRuntimeSystemConfig`); `NOVA:schemas/config/system-config.schema.json` | KI-Laufzeitconfig des Admins | `DOKU:admin/setup.md:63ff` (ein Absatz); `DOKU:admin/ki-funktionen.md` | thin (Engine-Modi, Endpoint-Tabelle, Fallback-Verhalten fehlen) | +| API-Anbindung (`apiBaseURL=/api/`, `apiBaseOverride`-Store, `withApiPath/buildApiUrl` mit `_/`-Prefix) | `NOVA:frontend/src/config.ts:4`; `NOVA:frontend/src/lib/store.ts:99`; `NOVA:frontend/src/lib/api/url.ts:1-30` | Wie der Admin den Server erreicht | `DOKU:admin/setup.md:24ff,63ff` (`API_BASE`, Mock-Tabelle) | thin (`apiBaseOverride`-Laufzeit-Umschaltung, `namespace → _/`-Routing nur Code) | +| Mock-Modus (`__MOCK_MODE_DEFAULT__`, `isMockMode()`, Mock-Interceptor, Demo-Projekt `t1`) | `NOVA:esbuild.config.js:83`; `NOVA:frontend/src/lib/mock/config.ts:15-34`; `NOVA:frontend/src/index.ts:54ff` (Boot mit Mock-Interceptor) | Offline-/Demo-Betrieb | `DOKU:admin/setup.md:63ff` | thin (Umschalt-Regeln, Caching, Mock-Grenzen nur Code) | +| Boot-Sequenz (`__TIBI_BOOT_MAP__`, Stages, `tibi:boot-progress`, `__TIBI_APP_READY__`) | `NOVA:frontend/src/index.ts:14-80` | Lade-/Diagnose-Haken | — | gap (nur für Admin-Entwickler relevant; nicht verifiziert ob gewollt öffentlich) | +| Theme/i18n (`loadTheme`, `themeStore`, `setupI18n`, `locales/`) | `NOVA:frontend/src/lib/store.ts:283-300`; `NOVA:frontend/src/index.ts:2`; `NOVA:frontend/src/lib/i18n/` | Eigenes Theme/Sprachen — **lädt der Admin das?** | `DOKU:admin/setup.md`, `DOKU:admin/customizing.md` ohne Theme/i18n-Customizing | gap (kein Customizing-Pfad belegt: kein Theme-Slot, keine i18n-Override-Datei im Code gefunden) | +| Navigation/Gruppen (`group`, `muiIcon`, AdminHub, Breadcrumb, `jumpTargets`) | `NOVA:frontend/src/lib/components/AdminLayout.svelte`; `NOVA:frontend/src/lib/jumpTargets.svelte.ts`; `NOVA:frontend/src/lib/components/ui/Breadcrumb.svelte` | Admin-Navigation | `DOKU:admin/konzept.md`; `DOKU:anwender/orientierung.md` | thin (eigene Navigations-Einträge/Gruppen-Reihenfolge nur via `meta.group`, dokumentiert in `sammlungen-anlegen.md`) | +| Eigene Views/Meta-Felder/Skripte laden (Registrierung, Reihenfolge) | Registry-Loader (`load-registry.ts:14-38`, lazy + Cache pro URL); Export-Loader analog (`resolveProjectAssetSpecifier`) | Lade-Reihenfolge | `DOKU:projekt/pagebuilder-dev.md:17ff`; `DOKU:admin/exporte.md:48ff` | thin (Lazy/Cache-Verhalten, Fehler-Fallback Blueprint nur Code) | + +## 2) Fehlende Interface-Doku (Top-Liste für Projektentwickler) + +Steht weder in `DOKU:` noch in `NOVA:docs/` — jeweils mit Code-Beleg: + +1. **`meta.singleton`** — Ein-Eintrag-Sammlungen (`enabled`, `key`). Beleg: Schema `collection-meta.schema.json` (`singleton`). Doku: kein Treffer. +2. **`project.admin.tokens`-Fähigkeiten** (`allowReload`, `allowRegenerateSearch`, `allowBackup`, `allowSnapshots`) — wer Backup/Snapshot/Search-Rebuild per Token darf. Beleg: `NOVA:tibi-types/schemas/config/project.schema.json` (`admin`). Doku: kein Treffer. +3. **`meta.query`** — deklarierte Zusatz-Querykeys für Hooks (`ctx.request().query`), MCP-validiert. Beleg: Schema `collection-meta.schema.json` (`query`). Doku: nur Neben­erwähnung `DOKU:projekt/mcp-nutzen.md`. +4. **`meta.agent`** — Zweck/Workflows/Gotchas pro Sammlung für Agents (via MCP/REST `_meta`). Beleg: Schema (`agent`). Doku: nur Neben­erwähnung `mcp-nutzen.md`/`pagebuilder-dev.md`. +5. **`meta.sections`** (`group/label/collapsible/collapsed`) — zweite Formular-Gruppierung neben `sidebar`. Beleg: Schema (`sections`). Doku: kein Treffer. +6. **`meta.defaultSort.order: MANUALLY`** + Drag-Freigabe — manuelle Reihenfolge als Config. Beleg: Schema (`defaultSort` enum `ASC/DESC/MANUALLY`); `NOVA:types/admin.d.ts:426ff`. Doku: Drag nur Bedienung (`customizing.md`), nicht Config. +7. **`meta.viewHint.navigation`-Details** (`nodesField`-Default `nodes`, `declaredTrees` mit `singleton/maxLevel`) — nur angerissen (`ansichten-listen.md:21`, `sammlungen-anlegen.md`). Beleg: Schema (`viewHint.navigation`); `NOVA:types/admin.d.ts:734ff`; `NOVA:frontend/src/lib/components/entry/widgets/NavigationTreeField.svelte`. +8. **Export-`ctx` vollständig** (`db.loadAll`-Batching/Retry/`signal`, nur `sort[0]`, `selector`-vs-`select`, `csvCell`-Guard, `csvWithBom`, Dateinamen-Sanitizing, `{date}`) — nur `NOVA:docs/custom-export-script.md:12-117` + Typdatei, in `DOKU:admin/exporte.md` verkürzt **und** Beispiel mit falscher Signatur (`loadAll({filter})` ohne Collection). Beleg: `NOVA:frontend/src/lib/utils/custom-export.types.ts:17-100`. +9. **Action-`execution` (`kind`, `cancellable`) + Upload-Fortschritt** (`createByteProgressToast`, `hasInlineUploadPayload`) — Fortschritts-Balken ja, Abbruch-/Upload-Pfad nein. Beleg: Schema (`actionExecutionMeta`); `NOVA:frontend/src/lib/components/ActionView.svelte:349-379`; `upload-progress`-Util. Doku: `DOKU:admin/aktionen.md:47ff` ohne `cancellable`/`kind`. +10. **`views`-Widerspruch klären** — `DOKU:admin/customizing.md:14` verspricht `meta.views` (u. a. Kalender), aber Schema verbietet `views` (`additionalProperties: false`, `NOVA:tibi-types/schemas/config/collection-meta.schema.json`) und `NOVA:types/admin.d.ts:452-458` markiert Custom-Views als „not yet supported“. Entweder implementieren oder Doku-Zeile streichen. + +Nicht verifiziert (Begriffe existieren im Code nicht / unklar): `hooksTrigger`, `exportScript` (grep `NOVA:` ohne Treffer); `assets`-Admin-Nutzung (`asset.schema.json`: nur `name`/`path`). + +## 3) Anwender-Oberflächen-Inventar + +Routen: `NOVA:frontend/src/App.svelte:77-141`. Komponenten: `NOVA:frontend/src/lib/components/` (u. a. `admin/`, `ai/`, `entry/`, `entry/widgets/`, `ui/`). Shortcuts: `NOVA:frontend/src/lib/shortcuts.ts:22ff` (`SHORTCUTS`), Anzeige `ui/CommandPalette.svelte`, `ui/KeyboardShortcuts.svelte`. + +| UI-Bereich | Code-Beleg | Doku-Seite | Screenshot? (`DOKU:src/assets/anwender/`) | +|---|---|---|---| +| Login / Abmelden / Session-Timeout | `NOVA:frontend/src/lib/components/LoginPage.svelte`; `ui/SessionTimeoutWarning.svelte`; `lib/api/auth.ts` | `DOKU:anwender/anmelden.md`; `DOKU:anwender/hilfe.md:10ff` | ja (`anmelden-login.webp`, `anmelden-abmelden.webp`) / Timeout-Dialog **fehlt** | +| Projektübersicht / Projektwechsel | `NOVA:frontend/src/lib/components/ProjectList.svelte` (implizit via Route); `store.ts:207ff` (`navigate`) | `DOKU:anwender/orientierung.md:10ff,26ff` | ja (`orientierung-start.webp`, `orientierung-projektwechsel.webp`) | +| Globale Schnellsuche vs. Command-Palette (`Ctrl/Cmd-K`?) | `NOVA:frontend/src/lib/components/ui/CommandPalette.svelte`; `shortcuts.ts` | `DOKU:anwender/orientierung.md:58ff` (nur Schnellsuche, keine Palette) | Palette-Overlay **fehlt** (`orientierung-schnellsuche.webp` zeigt Listen-Suche) | +| Tastaturkürzel-Hilfe (`?`, `g→p`, `s`, `v`) | `NOVA:frontend/src/lib/components/ui/KeyboardShortcuts.svelte`; `shortcuts.ts:22ff` | `DOKU:reference/tastatur-kurzbefehle.md`; `DOKU:anwender/lesen-suchen-filtern.md` (?) | **fehlt** | +| Listen (Tabelle/Karten/Medien/Navigation), Suche/Filter/Sortierung/Blättern, Mehrfachauswahl, URL-State | `NOVA:frontend/src/lib/components/CollectionView.svelte`; `CollectionTable/Cards.svelte`; `ui/FilterPopover.svelte`; `ui/SortPopover.svelte`; `ui/SearchInput.svelte` | `DOKU:anwender/lesen-suchen-filtern.md`; `DOKU:admin/ansichten-listen.md:10-94` | ja (`lesen-liste/karten/filter/suche.webp`) | +| Suchindex-Hinweis (Queue/Polling) | `NOVA:frontend/src/lib/components/ui/SearchIndexBuildNotice.svelte`; `NOVA:docs/test-plans/41-search-index-status.md:1-24` | nur Server-Seite (`server/betrieb.md`, `projekt/suche.md`) | **fehlt** (Anwender sieht Banner ohne Doku) | +| Stapel-Bearbeitung (Bulk) | `NOVA:frontend/src/lib/components/BulkEditPanel.svelte` | `DOKU:admin/customizing.md` (1 Zeile); Anwender: keine | **fehlt** | +| Eintrag anlegen/bearbeiten (Widgets, Pflicht/Formate, `dependsOn`) | `NOVA:frontend/src/lib/components/EntryView.svelte`; `entry/WidgetDispatcher.svelte`; `entry/widgets/*.svelte` | `DOKU:anwender/eintrag-bearbeiten.md`; `DOKU:admin/eintrags-editor.md:10-77` | ja (`eintrag-formular/neu/gespeichert.webp`) | +| Feldsuche (`Ctrl+F`), Sprungziele (`j`), Drill-Down, Verlauf Undo/Redo, Diff-Dialog, JSON-Overlay | `NOVA:entry/FieldSearch.svelte`; `entry/DrillDownBreadcrumb.svelte`; `entry/DiffDialog.svelte`; `entry/EntryJsonOverlay.svelte`; `lib/stores/drilldown-store.ts`, `entry-history` | `DOKU:admin/eintrags-editor.md:49ff,77ff` (teilweise) | **fehlt** (kein Screenshot für Suche/Diff/JSON/Drill-Down) | +| Fremdschlüssel (Drawer, Chips, Inline-Anlage, Rückverweise) | `NOVA:entry/ForeignKeyDrawer.svelte`; `entry/widgets/ForeignKeyWidget.svelte`; `entry/InlineEntryForm.svelte`; `entry/ReferencedBy.svelte` | `DOKU:admin/eintrags-editor.md:49ff`; `DOKU:admin/customizing.md:35ff` | **fehlt** | +| Übersetzung (Sprachtabs, Übersetzungsleiste) | `NOVA:entry/I18nLanguageTabs.svelte`; `entry/TranslationBar.svelte` | `DOKU:admin/eintrags-editor.md:58ff` | **fehlt** | +| Medien (Raster, Upload+Queue, Bildeditor, Lightbox, Einbetten) | `NOVA:frontend/src/lib/components/MediaGrid.svelte`; `ui/MediaLightbox.svelte`; `entry/widgets/ImageEditor.svelte`; `FileUploadQueue.svelte` | `DOKU:anwender/medien.md`; `DOKU:admin/medien.md:10-72` | ja Raster/Upload/Editor (`medien-*.webp`); Lightbox + Queue **fehlen** | +| Dateien/Fremddateien (`foreignFile`, Fremd-Medien) | `NOVA:entry/widgets/ForeignFileWidget.svelte`; `NOVA:docs/test-plans/38-foreign-file.md:1-49` | `DOKU:admin/medien.md:50ff` (Einbetten) | **fehlt** (eigenständig) | +| Export-Dialog (generisch + Skript-Tabs, Feldauswahl, Count-Warnung) | `NOVA:frontend/src/lib/components/ui/ExportDialog.svelte`; `NOVA:docs/collection-export.md:1-60` | `DOKU:anwender/exportieren.md`; `DOKU:admin/exporte.md:10ff` | ja (`export-dialog/fertig.webp`) | +| Aktionen (Formular, SSE-Balken, Ergebnis-Mapping) | `NOVA:frontend/src/lib/components/ActionView.svelte`; `ActionProgressMapping.svelte` | `DOKU:admin/aktionen.md`; Anwender: keine eigene Seite | **fehlt** (Anwender-Seite + Screenshot) | +| KI (Chat, Zusammenfassen, Stimme/TTS, Vision, Werkzeuge, Kosten) | `NOVA:frontend/src/lib/components/ai/AiChat.svelte`; `ai/*.ts` (`aiController`, `aiTools`, `aiUIRegistry`, `aiVoiceInput`, `aiTTS`); `ui/NovaAiPill.svelte` | `DOKU:anwender/ki-nutzen.md`; `DOKU:admin/ki-funktionen.md:10-107` | ja (`ki-chat/stimme/zusammenfassen.webp`); Tool-Inspektor/Verlauf/Vision-Overlay **fehlen** | +| Seiten bauen (Pagebuilder-Editor, Overlays, Viewports, Screenshot-Pipeline) | `NOVA:entry/widgets/pagebuilder/PagebuilderWidget.svelte`; `PagebuilderOverlay.svelte`; `PagebuilderOverviewOverlay.svelte`; `PagebuilderScreenshotHost.svelte` | `DOKU:anwender/seiten-bauen.md`; `DOKU:projekt/pagebuilder-dev.md:128ff` | ja (`seiten-*.webp`, 6 Dateien) | +| Verlauf/Audit (Liste, Diff, Wiederherstellen) | `NOVA:frontend/src/lib/components/AuditView.svelte`; `AuditHistoryPanel.svelte`; `AuditSidebarHistory.svelte`; `AuditDiff.svelte`; `AuditRestoreDialog.svelte` | Anwender: keine Seite; Admin: nur implizit | **fehlt** (Seite + alle Screenshots) | +| Snapshots/Backup (Übersicht, Auslösen/SSE, Download, Restore, Import-Analyse) | `NOVA:frontend/src/lib/components/SnapshotView.svelte`; `BackupView.svelte`; `lib/api/snapshot-api.ts`; `backup-api.ts`; `NOVA:docs/test-plans/43-backup-restore.md:1-89`, `44-snapshots.md:1-89` | `DOKU:anwender/sichern.md:10-49` | ja (`sichern-uebersicht/details/statistik.webp`); Backup-Import-Dialog + Restore-Bestätigung **fehlen** | +| Benutzer/Teams/Orgs/Rollen/Tokens (AdminHub, Drawers, Chips) | `NOVA:frontend/src/lib/components/admin/AdminHub.svelte`; `UserTab/TeamTab/OrgTab.svelte`; `*DetailDrawer.svelte`; `RoleSection.svelte`; `PermissionChipsInput.svelte`; `ProjectAdminView.svelte` | `DOKU:anwender/benutzer-teams.md`; `DOKU:admin/benutzer-rechte.md:27-80` | teilweise (`benutzer-teams/profil.webp`); Drawer-Details, Token-Seite, Projekt-Admin **fehlen** | +| Stellvertretung (Button + Amber-Banner + Stopp) | `NOVA:frontend/src/lib/api/auth.ts:270-300` (`impersonate`); `NOVA:docs/test-plans/42-impersonation.md:1-47`; Banner in `AdminLayout.svelte` | `DOKU:admin/benutzer-rechte.md:81ff` | **fehlt** | +| Profilseite | `NOVA:frontend/src/lib/components/ProfilePage.svelte` (Route `/profile`, `App.svelte:114ff`) | `DOKU:anwender/benutzer-teams.md:25` | ja (`benutzer-profil.webp`) | +| Avatar/Theme-Umschalter, Toasts, Voice-Eingabe in Filtern | `NOVA:ui/ThemeToggle.svelte`; `ui/Toast.svelte`; `ui/VoiceFilterTextInput.svelte`; `ui/VoiceRecorderButton.svelte` | verstreut/keine | **fehlen** | + +UI-Bereiche **ohne** Screenshot (Namen): Tastaturkürzel-Hilfe, Command-Palette-Overlay, Suchindex-Banner, Bulk-Edit-Panel, Feldsuche/Sprungziele/Drill-Down, Diff-Dialog, JSON-Overlay, FK-Drawer/Inline-Anlage/Rückverweise, Übersetzungsleiste/Sprachtabs, Medien-Lightbox, Upload-Warteschlange, Fremddatei-Widget, Action-Ansicht (Anwender), KI-Werkzeug-Inspektor/Chat-Verlauf/Vision-Overlay, Audit-/Verlaufs-UI (komplett), Backup-Import-Dialog, Restore-Bestätigung, Admin-Drawers (Benutzer/Team/Org-Details), Token-Seite, Projekt-Admin-Ansicht, Stellvertretungs-Banner, Session-Timeout-Dialog, Theme-Umschalter, Voice-Filter-Eingabe. + +## 4) Löschkandidaten `NOVA:docs/` (je Datei eine Zeile) + +| Datei | Inhalt (kurz) | Abdeckung in tibi-docs | Urteil | +|---|---|---|---| +| `docs/collection-config.md` (2293 Zeilen) | Vollreferenz Projekt-/Collection-/Feld-/Meta-Schema inkl. Server-Optionen | teilweise (`projekt/sammlungen-anlegen.md`, `felder-widgets.md`, `reference/schemas.md`; Server-Details in `server/*`) | **muss bleiben** (einzige Vollreferenz; Auszug nach `reference/` wäre Follow-up) | +| `docs/collection-export.md` (327) | Generischer Listen-Export: Flow, Dialog, Batch-Laden, Warnschwellen | weitgehend (`admin/exporte.md:10ff`, `anwender/exportieren.md`) | teilweise → **vorerst bleiben** (Schwellenwerte/Batch-Details nur hier) | +| `docs/custom-export-script.md` (117) | `ctx`-Vertrag für Skript-Exporte (einzige Quelle für `db.loadAll`-Semantik, Payload-Regeln, Styling) | thin (`admin/exporte.md:48ff` verweist hierher) | **muss bleiben** (bis `ctx` voll in tibi-docs steht; siehe Punkt 2.8) | +| `docs/test-plans/02-navigation-routing.md` (31) | SPA-Routing, History, Breadcrumbs, Navigation-Guard | teilweise (`anwender/orientierung.md`, `admin/ansichten-listen.md:76ff`) | teilweise → bleiben (Guard-/History-Details nur hier) | +| `docs/test-plans/05-collection-view.md` | Listen-Rendering (4 View-Modi), Suche/Sort/Filter/Pagination, URL-State | weitgehend (`admin/ansichten-listen.md`, `anwender/lesen-suchen-filtern.md`) | teilweise → bleiben (Mock-Fälle, Debounce-Details) | +| `docs/test-plans/07-entry-editor-advanced.md` | Undo/Redo, Diff, Drill-Down, Feldsuche, Jump-Targets | teilweise (`admin/eintrags-editor.md`) | teilweise → bleiben | +| `docs/test-plans/11-foreign-keys.md` | FK-Widgets, Chip-Arrays, Drawer-Flow, Inline-Create, Nested-Drawers | teilweise (`admin/eintrags-editor.md:49ff`, `customizing.md:35ff`) | teilweise → bleiben | +| `docs/test-plans/16-ai-integration.md` (41) | KI-Integration (Chat/Modelle/Werkzeuge) | weitgehend (`admin/ki-funktionen.md`, `projekt/llm-nutzen.md`) | teilweise → bleiben (Mock-/Test-Spezifika) | +| `docs/test-plans/17-ai-tts.md` (24) | TTS/Stimme | weitgehend (`admin/ki-funktionen.md:52ff`) | teilweise → bleiben | +| `docs/test-plans/25-file-upload.md` (43) | Datei-Upload-Flows | teilweise (`admin/medien.md:19ff`) | teilweise → bleiben | +| `docs/test-plans/27-media-grid.md` (40) | Medien-Raster, DnD-Upload, Inline-Edit | teilweise (`admin/medien.md:10ff`) | teilweise → bleiben | +| `docs/test-plans/34-i18n-fields.md` (34) | Mehrsprachige Felder | teilweise (`admin/eintrags-editor.md:58ff`) | teilweise → bleiben | +| `docs/test-plans/35-entry-i18n.md` (54) | Eintrags-Übersetzung (Kopplung, Leiste) | teilweise (s. o.) | teilweise → bleiben | +| `docs/test-plans/36-voice-input-fields.md` (31) | Spracheingabe in Feldern | teilweise (`admin/ki-funktionen.md:52ff`) | teilweise → bleiben | +| `docs/test-plans/37-pagebuilder.md` | Pagebuilder-Vorschau, Lookup-Hydratisierung, URL-Normalisierung | weitgehend (`anwender/seiten-bauen.md`, `projekt/pagebuilder-dev.md`) | teilweise → bleiben (Mock-/URL-Edge-Cases nur hier) | +| `docs/test-plans/38-foreign-file.md` (49) | Fremddateien/-medien | teilweise (`admin/medien.md:50ff`) | teilweise → bleiben | +| `docs/test-plans/39-preview-resolver.md` | Vorschau-Regeln (Auto-Detect vs. strikt, Slot-Pfade, FK-Badges) | thin (`admin/customizing.md:35ff`) | **muss bleiben** (Regeln sonst nirgends) | +| `docs/test-plans/40-actions.md` | Action-Routen, Methoden-Tabs, SSE-Fortschritt, Disabled-States | weitgehend (`admin/aktionen.md`, `projekt/jobs-actions.md`) | teilweise → bleiben (Routing-/State-Details) | +| `docs/test-plans/41-search-index-status.md` (24) | Suchindex-Banner (Projekt/Collection, Polling) | nicht abgedeckt (nur Server-Seite `server/betrieb.md`, `projekt/suche.md`) | **muss bleiben** (einzige UI-Quelle) | +| `docs/test-plans/42-impersonation.md` (47) | Stellvertretung (Endpoint, Drawer-Button, Banner, Rollback) | teilweise (`admin/benutzer-rechte.md:81ff`) | teilweise → bleiben (Mock-Endpoint, Rollback-Details) | +| `docs/test-plans/43-backup-restore.md` (89) | Backup-Export/Import (SSE, 6 Endpunkte, Rechte) | teilweise (`anwender/sichern.md`, `projekt/audit-backup.md`) | teilweise → bleiben (API-/SSE-Details) | +| `docs/test-plans/44-snapshots.md` (89) | Snapshot-CRUD (SSE, 10 Endpunkte, ZIP, Prune) | teilweise (s. o.) | teilweise → bleiben | + +Löschkandidaten-Zählung: **0 von 21 sofort löschbar** — 3× „muss bleiben“, 18× „teilweise → vorerst bleiben“, 0× „vollständig abgedeckt“. diff --git a/plans/audit/03-types-starter.md b/plans/audit/03-types-starter.md new file mode 100644 index 0000000..db89257 --- /dev/null +++ b/plans/audit/03-types-starter.md @@ -0,0 +1,125 @@ +# Audit 03: tibi-types + tibi-svelte-starter vs. tibi-docs + +Stand: 2026-10-16. Codebasen: `tibi-types` (schemas + `index.d.ts`), `tibi-svelte-starter` (README, AGENTS, package.json, frontend/api/Docker/Env). Doku: `tibi-docs/src/content/docs` (Seiten `einstieg/*`, `projekt/*`, `reference/schemas.md`, `reference/hooks-*.md`). +Regel: Jede Aussage mit `datei:zeile` belegt; ohne Beleg steht „nicht verifiziert". + +## 1) Schema-Matrix tibi-types (16 Schemas in `schemas/config/`) + +Quelle Top-Level-Properties: per Python aus den Schema-Dateien extrahiert. Dokustand: `reference/schemas.md:10-32` listet alle 16 Schemas nur tabellarisch (Name → Datei → Pflichtfelder), beschreibt aber keine Properties im Detail; Details liegen ggf. auf Projektseiten. + +| Schema (`schemas/config/*.json`) | Top-Level-Properties | in `reference/schemas.md` beschrieben? | undokumentierte Properties (vs. schemas.md + Projektseite) | +|---|---|---|---| +| `project.schema.json` | `namespace, meta, upload, collections, jobs, actions, assets, cors, admin, hook, audit, strictFields, snapshotPath, snapshots, legacy` (`project.schema.json:99-333` für Sub-Blöcke: `agent` :102, `assets` :174, `cors` :187, `admin` :227, `hook` :262, `audit` :303, `strictFields` :312, `snapshotPath` :315, `snapshots` :319, `legacy` :333) | nur Zeile in Tabelle (`schemas.md:18`); `hook/cache/ratelimit`-Details nur in `server/konfiguration.md`, `snapshots` nur in `projekt/audit-backup.md`, `admin` nur Server-Seiten | `snapshotPath` (String, Ablagepfad Snapshots), `snapshots` (Array, Zeitplan/Retention — nur Ablauf in `audit-backup.md`, kein Feld- mapping), `legacy` (nur in `reference/fehlercodes.md` erwähnt, sonst nicht verifiziert), `strictFields` auf Projektebene (nur `fehlercodes.md`, nicht verifiziert), `cors` auf Projektebene (nur Server-Seiten `server/sicherheit.md`, `server/konfiguration.md`), `admin`-Subkeys (nur Server-Seiten) | +| `collection.schema.json` | `name, defaultLanguage, uploadPath, upload, permissions, projections, hooks, meta, imageFilter, fields, indexes, audit, bulk, cors, queryLimits, readonlyFields, hiddenFields, strictFields, search` (`collection.schema.json:17` `uploadPath`, `:63` `imageFilter`, `:103` `audit`, `:126` `bulk`, `:147` `cors`, `:187` `queryLimits`, `:201` `readonlyFields`, `:207` `hiddenFields`, `:213` `strictFields`, `:216` `search`) | nur Tabellenzeile (`schemas.md:19`); Teilabdeckung: `indexes`+`search` in `projekt/sammlungen-anlegen.md:104-150`, `imageFilter` in `projekt/dateien-bilder.md`, `audit` in `projekt/audit-backup.md`, `cors` in `projekt/jobs-actions.md` | `uploadPath` (String, veralteter Upload-Pfad neben `upload`; nicht verifiziert in Doku), `queryLimits` (`defaultLimit`/`maxLimit`; kein Treffer in Doku — nicht verifiziert), `readonlyFields`/`hiddenFields` auf Collection-Ebene (kein Treffer in Doku — nicht verifiziert), `strictFields` (nur `fehlercodes.md`, kein Konzepttext), `bulk` (`optimize.create/update/delete`; in `projekt/*` nur `bulk`-Wort in `mcp-nutzen.md`/`hooks-schreiben.md` ohne Feld-Doku), `upload.allowedMimeTypes`/`maxBodySize` (nur Server-Seite, nicht pro Collection), Index-Subkeys `dropDups/sparse/background/defaultLanguage/languageOverride` (Schema-`$defs` `indexConfig`; Doku `sammlungen-anlegen.md:106-135` zeigt nur Text/Unique-Beispiel) | +| `field.schema.json` | via `$defs.field`: `name, type, index, subFields, validator, readonly, hidden, strictFields, meta` (Typ-Enum `string…any`, `index`-Enum `single/unique/text/sparse/background`) | nur Tabellenzeile (`schemas.md:20`) | `readonly`/`hidden` als Bool-oder-eval (`BoolOrEval`, `index.d.ts:13`); Doku `felder-widgets.md`/`sammlungen-anlegen.md` enthalten kein `readonly`/`hidden` (grep ohne Treffer) — nicht verifiziert; `strictFields` auf Feldebene (nur `fehlercodes.md`); `index`-Enum-Details (`sparse/background`) ohne Doku | +| `field-list.schema.json` | Array-Items `string \| field.schema` (Datei 1:20) | nur Tabellenzeile (`schemas.md:21`) | keine Properties (Wrapper); Verwendung (String-Kurzform vs. Objekt) in `felder-widgets.md:12-32` teilweise gezeigt — abgedeckt | +| `field-meta.schema.json` | `label, widget, i18n, helperText, hideLabel, hide, protected, position, section, containerProps, defaultValue, dependsOn, inputProps, choices, foreign, downscale, imageEditor, drillDown, pageSize, preview, addElementLabel, filter, pagebuilder, schemaRef, openapi` (`field-meta.schema.json:14` `widget`, `:50` `hideLabel`, `:66` `containerProps`, `:131` `dependsOn`, `:183` `downscale`, `:198` `imageEditor`, `:229` `drillDown`, `:232` `pageSize`, `:239` `addElementLabel`, `:242` `filter`, `:303` `schemaRef`) | nur Tabellenzeile (`schemas.md:22`); Teilabdeckung in `projekt/felder-widgets.md` (Aufbau :12, Typen :33, Validatoren :60, Choices/FK :80, dependsOn :131, i18n :151) | `hideLabel` (Bool; kein Treffer — nicht verifiziert), `containerProps` (Objekt; kein Treffer), `position`/`section` (Layout; `section` nur `collection-meta`, Feld-`section` nicht verifiziert), `pageSize` (Zahl; kein Treffer), `addElementLabel` (String; kein Treffer), `imageEditor` (Konfig; kein Treffer), `schemaRef` (String-Ref; kein Treffer), `filter: true/false` als Admin-Filter-Opt-in (`field-meta.schema.json:242-246`; Doku zeigt nur `filter_public.js`-Hook, nicht das Flag), `inputProps`/`defaultValue`-Details nur angerissen | +| `collection-meta.schema.json` | `label, muiIcon, group, exports, designGuide, imageUrl, hide, singleton, subNavigation, preview, i18n, defaultSort, viewHint, sidebar, sections, openapi, query, agent` (`collection-meta.schema.json:69` `singleton`, `:84` `subNavigation`, `:211` `defaultSort`, `:231` `viewHint`, `:423` `sidebar`, `:441` `sections`, `:465` `openapi`, `:468` `query`, `:503` `agent`) | nur Tabellenzeile (`schemas.md:23`); Teilabdeckung: `sammlungen-anlegen.md:79-103` (Label/Gruppe/Icon/Vorschau), `admin/ansichten-listen.md` (`subNavigation`, `defaultSort`, `viewHint`) | `singleton` (Bool, Ein-Dokument-Collection; kein Treffer in Doku — nicht verifiziert), `sections` (Array, Editor-Sektionen; kein Treffer), `hide` auf Collection-Ebene, `exports/designGuide/imageUrl` (nicht verifiziert), `query`-Block (Meta-Abfragen; nicht verifiziert), `agent`-Block (nicht verifiziert), `openapi`-Meta (nur Tabellenzeile) | +| `permissions.schema.json` | `public, user` + `$defs.permissionSet`: `methods, filter, validProjections, readonlyFields, hiddenFields` | nur Tabellenzeile (`schemas.md:24`) | `validProjections` (String-Array; kein Treffer — nicht verifiziert), `filter` (Mongo-Filter je Permission-Set; nur `rechte-tokens.md` grob, kein Feld-Mapping — teilweise), `readonlyFields`/`hiddenFields` je Permission-Set (kein Treffer) | +| `hooks.schema.json` | `get, post, put, delete, audit` + `$defs`: `hook(type/file/timeout)`, `getHooks(handle/read/return/file)`, `postHooks(bind/validate/handle/create/return/bulkCreate/bulkReturn)`, `putHooks(bind/validate/update/return/bulkUpdate/bulkReturn)`, `deleteHooks(delete/return/bulkDelete/bulkReturn)`, `auditHooks(return)` | nur Tabellenzeile (`schemas.md:25`); Hook-Protokoll in `projekt/hooks-schreiben.md` | `bulkCreate/bulkReturn`, `bulkUpdate/bulkReturn`, `bulkDelete/bulkReturn` (Stufen im Schema, in `hooks-schreiben.md` nur `bulk`-Wort ohne Stufen-Mapping — teilweise), `bind` vs. `validate` vs. `handle`-Reihenfolge (Schema-`$defs`, Doku-Erwähnung prüfen — teilweise), `audit.return`-Hook (Schema vorhanden; Doku nur `audit-backup.md`, kein Hook-Stufen-Text) | +| `job.schema.json` | `cron, type, file, timeout, meta` | nur Tabellenzeile (`schemas.md:26`); Ablauf in `projekt/jobs-actions.md` | `timeout` (Sekunden; in `jobs-actions.md` erwähnt — abgedeckt/teilweise), `meta` (frei; nicht verifiziert) | +| `action.schema.json` | `name, meta, permissions, hooks, audit, cors` + `$defs`: `actionField`, `actionMappedField(source/name/...)`, `actionFieldSection`, `actionExecutionMeta(kind/cancellable)`, `actionOutputProgressMapping(indexField/countField/statusField/messageField/fields)`, `actionOutputMapping(summary/details/progress)`, `actionOutputMeta(title/mapping)`, `actionMethodMeta(query/data/execution/output)`, `actionMeta(label/muiIcon/description/group/hide/methods)` | nur Tabellenzeile (`schemas.md:27`); Actions in `projekt/jobs-actions.md`, Admin-Ansicht in `admin/aktionen.md` | `actionOutputMapping`/`actionOutputProgressMapping`-Felder (`indexField/countField/statusField/messageField/fields`; nur `admin/aktionen.md`-Treffer für „mapping", kein Feld-Mapping — teilweise/nicht verifiziert), `actionExecutionMeta.kind/cancellable` (nicht verifiziert), `actionMappedField.source` vs. `name` (Dot-Path vs. Legacy; nicht verifiziert), `cors`/`audit` je Action (nicht verifiziert) | +| `asset.schema.json` | `name, path` | nur Tabellenzeile (`schemas.md:28`) | keine weiteren Properties; Verwendung (`config.yml`-Assets) in `server/schnittstellen.md`/`neues-projekt.md` — abgedeckt | +| `image-filter.schema.json` | Array von Filter-Objekten (kein Top-Level-Props-Objekt) | nur Tabellenzeile (`schemas.md:29`); Anwendung in `projekt/dateien-bilder.md` | Filter-Parameter (`width/height/fit/fill/resampling/anchor/…/quality/outputType` aus `ImageFilterParams`, `index.d.ts:314-358`) sind in `dateien-bilder.md` nur als `filter`-Query-Param gezeigt, kein Parameter-Mapping — teilweise | +| `projections.schema.json` | Pattern-Key `{name: {select: {feld: 0\|1}}}` (Wrapper-Datei 1:30) | nur Tabellenzeile (`schemas.md:30`); Nutzung in `projekt/abfragen-lesen.md` | `select: null`-Variante (Schema erlaubt `object|null`; Doku nur 0/1 — teilweise) | +| `snapshot.schema.json` | `name, description, collections, includeMedia, collectionDedup, mode, retention, schedule, permissions, enabled` | nur Tabellenzeile (`schemas.md:31`); Ablauf in `projekt/audit-backup.md`, Endpunkte in `server/schnittstellen.md` | `includeMedia` (Bool), `collectionDedup` (Bool/Strategie), `mode`, `retention`, `schedule`, `permissions`, `enabled` — Feld-für-Feld-Mapping in `audit-backup.md` prüfen, per Stichprobe nur Ablauf erzählt — teilweise (genaue Abdeckung nicht verifiziert) | +| `openapi.schema.json` | `disabled, get, getOne, post, put, delete` + `$defs`: `codeSample(lang/label/source)`, `responseObject`, `operationObject(disabled/tags/summary/description/x-codeSamples/parameters/responses/security)`, `fieldOpenapi(disabled/description/example/format/enum/deprecated)` | nur Tabellenzeile (`schemas.md:32`); generierte Referenz in `reference/openapi.md` | `x-codeSamples`, `getOne`-Trennung (`get` vs. `getOne`), `fieldOpenapi.example/format/enum/deprecated` — Detail-Mapping nicht verifiziert (teilweise) | +| `defs.schema.json` | nur `$ref`-Bausteine, kein Ziel (`schemas.md:33` sagt das explizit) | abgedeckt (`schemas.md:33`) | — | + +Wichtigste undokumentierte Schema-Properties (Top-10, mit Typ/Wirkung aus Schema): + +1. `collection.queryLimits` (`collection.schema.json:187`) — Objekt `{defaultLimit, maxLimit}` (Zahlen): GET-Limits je Collection. Kein Treffer in Doku — nicht verifiziert. +2. `collection.readonlyFields` / `hiddenFields` (`collection.schema.json:201-207`) — String-Arrays: Collection-weite Schreib-/Sichtschutz-Felder. Kein Treffer in Doku — nicht verifiziert. +3. `collection.uploadPath` (`collection.schema.json:17`) — String: Legacy-Upload-Pfad neben `upload:{maxBodySize, allowedMimeTypes}`. Nicht verifiziert in Doku. +4. `collection.strictFields` + Feld-`strictFields` (`collection.schema.json:213`; Feld-`$defs`) — Bool: unbekannte Felder ablehnen. Nur `fehlercodes.md`-Treffer, kein Konzept — faktisch undokumentiert. +5. `collection-meta.singleton` (`collection-meta.schema.json:69`) — Bool: Collection auf ein Dokument begrenzen. Kein Treffer — nicht verifiziert. +6. `collection-meta.sections` (`collection-meta.schema.json:441`) — Array: Editor-Sektionen. Kein Treffer — nicht verifiziert. +7. `field-meta.hideLabel` (`field-meta.schema.json:50`) — Bool: Label im Editor verstecken. Kein Treffer — nicht verifiziert. +8. `field-meta.imageEditor` (`field-meta.schema.json:198`) — Objekt: Bildeditor-Konfig je Feld. Kein Treffer — nicht verifiziert. +9. `permissionSet.validProjections` (Schema-`$defs.permissionSet`) — String-Array: erlaubte Projections je Rolle. Kein Treffer — nicht verifiziert. +10. `action.actionOutputMapping`/`actionOutputProgressMapping` (`action.schema.json`-`$defs`) — `{summary/details/progress{indexField/countField/statusField/messageField/fields}}`: Fortschritts-/Ergebnis-Mapping von Actions. Nur „mapping"-Wort in `admin/aktionen.md`, kein Feld-Mapping — faktisch undokumentiert. + +## 2) Hook-Typen (`tibi-types/index.d.ts`, 1716 Zeilen) + +Die `reference/hooks-*.md` dokumentieren Pakete/Funktionen (`db.find` …), nicht Typen. `reference/schemas.md` listet nur Schema-Dateien. `reference/hook-kontexte.md:8-28` listet Pakete aus `internal/hook` (Server-Code), nicht `index.d.ts`-Typen. Ergebnis: fast alle globalen Typen sind als Typen undokumentiert (Verwendung teils in Beispielen, aber kein Typ-Mapping). + +| Typ (`index.d.ts`) | Zeilen | in hooks-*/schemas.md dokumentiert? | +|---|---|---| +| `CollectionDocument` | `index.d.ts:2-7` | nicht verifiziert (nirgends als Typ; implizit in Beispielen) | +| `BoolOrEval` | `index.d.ts:13` | nein — `readonly`/`hidden`-Felder selbst fehlen (s. §1) | +| `FieldImageValidator` (`minWidth/maxWidth/minHeight/maxHeight/allowNonImages/allowUnknownDimensions`) | `index.d.ts:16-29` + Schema `field.schema.json:130-142` | nein — `felder-widgets.md:60-78` kennt nur `maxFileSize/accept`, keine Bildmaß-Validatoren | +| `FieldValidator` (alle Schlüssel) | `index.d.ts:31-68` | teilweise — `felder-widgets.md:60-78` listet `required/pattern/in/minLength/maxLength/min/max/minDate/maxDate/minItems/maxItems/format/maxFileSize/minFileSize/accept/eval/allowZero`, aber **nicht** `image: FieldImageValidator` als Unterschlüssel | +| `SearchConfig` + `RrfConfig`/`SourceFusionConfig`/`VectorConfig`/`NgramConfig`/`NormalizeConfig`/`RegexConfig`/`ScoreConfig` | `index.d.ts:70-184` | teilweise — `projekt/suche.md:33-38` zeigt `autoRegenerate`, `:74` nennt `score_rrf/score_sum/rank_score/hybrid`, `minmax/zscore`, `scoreWeight`, `sourceConfig` als „existiert im Code", ohne Feld-Mapping | +| `SearchExplainSource/SearchExplanation/SearchMeta` (`qExplain`) | `index.d.ts:120-147` | nicht verifiziert (kein Treffer `qExplain`/`SearchExplanation` in Doku-Stichprobe) | +| `QueryLimitsConfig/BulkOptimizeConfig/BulkConfig` | `index.d.ts:187-209` | nein (s. §1 `queryLimits`/`bulk`) | +| `CollectionIndex` (`name/key/unique/dropDups/background/sparse/defaultLanguage/languageOverride`) | `index.d.ts:211-228` | teilweise — `sammlungen-anlegen.md:106-135` zeigt Text-/Unique-Beispiel, keine Subkey-Tabelle | +| `AuditCollectionConfig` | `index.d.ts:231-243` | teilweise — `audit-backup.md` erzählt Ablauf, kein Feld-Mapping (`enabled/actions`-Liste) | +| `UploadConfig` (`maxBodySize/allowedMimeTypes`) | `index.d.ts:245-248` | teilweise — Server-Seite ja, Collection-Ebene nein | +| `LocalizedText/ChoiceValue/ChoiceStyle/ChoiceItem` | `index.d.ts:250-272` | teilweise — `felder-widgets.md:82-110` zeigt Choices, aber kein `badgeVariant/chipVariant/badgeStyle/chipStyle`-Mapping | +| `PreviewTableColumn/PreviewSlots/PreviewConfig/EvalStringConfig/EvalHtmlConfig` | `index.d.ts:274-311` | teilweise — `sammlungen-anlegen.md:79-103` + `admin/ansichten-listen.md` zeigen Vorschau, kein Slot-Mapping (`label/secondary/tertiary/badge/image/table/select`) | +| `ImageFilterParams` | `index.d.ts:314-358` | teilweise (s. §1 `image-filter`) | +| `CollectionInfo` (inkl. `imageFilter/indexes/audit/bulk/queryLimits/readonlyFields/hiddenFields/search/strictFields`) | `index.d.ts:361-388` | nein als Typ; Felder s. §1 | +| `ActionInfo/ActionMeta/ActionMethodMeta/ActionExecutionMeta/ActionMappedField/ActionOutputProgressMapping/ActionOutputMapping/ActionOutputMeta` | `index.d.ts:391-465` | nein als Typen; Ablauf in `jobs-actions.md`/`admin/aktionen.md` | +| `MethodPermission/SimpleMethodPermission/AllowedMethodPermission/CollectionYourPermissions/ActionYourPermissions/ProjectYourPermissions/PermissionSet/ProjectionConfig` | `index.d.ts:467-521` | teilweise — `rechte-tokens.md` + `abfragen-lesen.md` (Projections) behandeln Konzepte, kein Typ-Mapping (`bulk`-Flag, `filter`, `validProjections` fehlen) | +| `CollectionFieldInfo` (`readonly/hidden/strictFields`) | `index.d.ts:523-536` | teilweise (s. Feld-§1) | +| `ApiInfo/ProjectInfo` | `index.d.ts:539-562` | nicht verifiziert als Typen | +| `AuditLogEntry` | `index.d.ts:565-611` | teilweise — `audit-backup.md` (Eintrags-Felder `userId/action/snapshot/changes` erzählt, kein Typ-Mapping) | +| `DbReadOptions` (`filter/selector/projection/offset/limit/sort/pipelineMod`) | `index.d.ts:613-627` | teilweise — `hooks-daten.md:8-113` dokumentiert `find/count/…`-Signaturen, `pipelineMod` als Option nicht verifiziert | +| `GetHookData/GetHookGetOnlyData/PostHookData/JobConfig/JobData` | `index.d.ts:629-737` | teilweise — `hooks-schreiben.md` (Stufen), `jobs-actions.md` (Jobs); `bulkReturn`-Felder (`created/ids/modified/deleted`) ohne Typ-Mapping | +| `ConfigPackage/DbPackage/SmtpPackage/FsPackage/TplPackage/HttpPackage` | `index.d.ts:738-1062` | ja (Funktionen) — `hooks-daten.md`, `hooks-netze.md`, `hooks-medien.md`, `hooks-sicherheit.md` | +| `DebugPackage/ResponsePackage/UserPackage/BcryptPackage/JwtPackage/CharsetPackage/ImagePackage/XmlPackage/CookiePackage/PdfPackage/CryptoPackage/JsonPackage/ExecPackage/Base64Package` | `index.d.ts:1064-1474` | ja (Funktionen) — `hooks-meta.md`, `hooks-medien.md`, `hooks-sicherheit.md` | +| `CachePackage/RatelimitPackage/ChannelSubscribeOptions/ChannelSubscription/ChannelPackage` (+ Rest ab `:1616`) | `index.d.ts:1481-1640` | ja (Funktionen) — `hooks-daten.md:114-195` (cache), `hooks-netze.md:69-176` (channel, ratelimit) | + +Undokumentierte Typen (als Typ-Mapping): `CollectionDocument`, `BoolOrEval`, `FieldImageValidator`, `SearchExplainSource/SearchExplanation/SearchMeta`, `QueryLimitsConfig`, `BulkOptimizeConfig/BulkConfig`, `ChoiceItem` (Varianten/Styles), `PreviewSlots/PreviewConfig`, `CollectionInfo`, `ActionInfo`-Familie (8 Interfaces), `*YourPermissions`-Familie, `ApiInfo/ProjectInfo`, `AuditLogEntry` (als Typ), `DbReadOptions.pipelineMod`. + +## 3) Felder-Widgets / Validator-Optionen vs. `projekt/felder-widgets.md` + +Widget-Enum (`field-meta.schema.json:14-25`): `text, textarea, number, checkbox, switch, select, selectArray, chipArray, date, datetime, file, image, json, richtext, html, foreignKey, foreignKeyChipArray, foreignFile, foreignMedia, pagebuilder, pageBuilder, templateProps, containerLessObject, containerLessObjectArray, color` — alle in `felder-widgets.md` + `admin/eintrags-editor.md` per grep nachweisbar (Stichprobe §-Befund: alle 20+ Treffer). Lücken: `pagebuilder` vs. `pageBuilder` (beide im Enum, Doku unterscheidet nicht — nicht verifiziert), `containerLessObject` vs. `containerLessObjectArray` (beide erwähnt, Unterschied nicht verifiziert), `image` vs. `file` vs. `foreignFile` vs. `foreignMedia` (alle erwähnt, Abgrenzung nur in `dateien-bilder.md` angerissen — teilweise). +Validatoren (`felder-widgets.md:60-78`): `required, pattern, in, minLength/maxLength, min/max, minDate/maxDate, minItems/maxItems, format(email/url/uuid/slug), maxFileSize/minFileSize, accept, eval, allowZero` — alle dokumentiert. Fehlt: `image`-Unterschlüssel (`minWidth/maxWidth/minHeight/maxHeight/allowNonImages/allowUnknownDimensions`, `field.schema.json:130-142`, `index.d.ts:16-29`) — kein Treffer in Doku außer `minWidth`-Messung in `dateien-bilder.md:93` (Medialib-Anzeige, kein Validator). Meta-Lücken (s. §1): `hideLabel, containerProps, position, pageSize, addElementLabel, imageEditor, schemaRef, filter-Flag (field-meta.schema.json:242-246), drillDown (nur pagebuilder-dev.md-Treffer), downscale (nur dateien-bilder.md-Treffer)`. + +## 4) Starter-Abgleich (`tibi-svelte-starter` → Doku) + +| Thema | Beleg (Starter) | Dokuseite | Verdikt | fehlt | +|---|---|---|---|---| +| Klonen + Platzhalter (`__PROJECT_NAME__`, `__TIBI_NAMESPACE__`, `.env`, `api/config.yml`, `.htaccess`) | `README.md:7-22`, `.env` (`PROJECT_NAME=__PROJECT_NAME__` etc.) | `einstieg/schnellstart.md:16-52`, `einstieg/neues-projekt.md:12-43` | abgedeckt | nichts | +| Token-Köpfe (`Token` vs. `X-Admin-Token` vs. `X-Auth-Token`, `ADMIN_TOKEN` in `config.yml.env`) | `AGENTS.md: Token header distinction`, `README-Checkliste` | `einstieg/schnellstart.md:85-94`, `projekt/deploy.md:95-110`, `projekt/rechte-tokens.md` | abgedeckt | nichts | +| `make docker-up`, Docker-Profile, Traefik-Routen | `Makefile`, `docker-compose-local.yml`, `AGENTS.md: Quick reference` | `schnellstart.md:53-74`, `neues-projekt.md:44-54` | teilweise | Traefik-/Router-Details, Profile (`tibi` vs. `tibi-dev`), `docker-restart-frontend`/`docker-logs` nur Starter-lokal | +| `yarn validate` / `yarn build` / `yarn build:server` (`app.server.js`, `buildInfo`) | `package.json: scripts` (`validate`, `build`, `build:server`, `dev/start/start:mock/start:ssr`), `esbuild.config*.js`, `scripts/esbuild-wrapper.js` | `schnellstart.md:75-84`, `ssr-website.md:105-121`, `deploy.md` | abgedeckt (Basis) | `start:mock`/`MOCK=1`-Modus, `esbuild-wrapper`-Flags, `buildInfo.ts`-Mechanik nur angerissen | +| SSR-Hook (`api/hooks/ssr/get_read.js`, ``, ``, Cache-Collection `ssr`) | `README.md:24-40`, `api/hooks/ssr/`, `frontend/src/ssr.ts` | `projekt/ssr-website.md` (Routen :23, Lookups :36, Blöcke :70, Bundle :105, Cache :122, Abnahme :146) | abgedeckt | SSR-Cache-Invalidierungsregeln (`PUT/DELETE` vs. `POST`, `?clear=1`) stehen nur als Code-Kommentar in `ssr-website.md:153-164` — ok, aber `ssr.yml`-Felder nicht gemappt | +| Mock-Modus (`MOCK=1`, `__MOCK__`, `frontend/mocking/*.json`, `lib/mock.ts`) | `frontend/src/lib/mock.ts:4-8`, `frontend/src/lib/api.ts:88-89`, `package.json: start:mock` | `einstieg/begriffe.md`, `einstieg/was-ist-tibi.md` (nur Wort-Treffer) | fehlt | Mock-Aktivierung, `mocking/`-Verzeichnis-Format, `__MOCK__`-Flag — kein eigenes Doku-Kapitel (nur Wort in `begriffe.md`) | +| Playwright-Tests (`tests/e2e`, `tests/api`, `test:e2e/test:api/test:visual/tour`, `global-setup.ts`) | `package.json: scripts (test/test:e2e/test:api/test:visual/tour)`, `tests/`, `playwright.config.ts` | keine (kein Treffer `playwright` in `einstieg/*`, `ssr-website.md`, `deploy.md`) | fehlt | gesamtes Test-Setup (Spec-Ordner, `global-setup`, CI ohne Playwright It. `AGENTS.md`) in Projekt-Doku nicht verziehen | +| Frontend-Struktur (`App.svelte`, `routes/`, `blocks/`, `widgets/`, `lib/api.ts`, `store.ts`, `i18n`, Tailwind, Sentry, `svelte:head`) | `frontend/src/` (`App.svelte`, `blocks/*`, `widgets/`, `lib/*`, `config.ts`, `ssr.ts`, `sentry.ts`) | `ssr-website.md` (Routen/Blöcke/i18n/Tailwind angerissen) | teilweise | `widgets/`-Katalog, `lib/`-Module (`api.ts`, `store.ts`, `navigation.ts`, `versionCheck.ts`), Sentry-Verdrahtung, `svelte:head`-Pflicht nur Checklisten-Zeile | +| API-Verzeichnis (`api/collections/*.yml`, `api/hooks/*`, `api/templates/`, `config.yml.env`, `ssr.yml`, `medialib.yml`) | `api/` (`collections/`, `hooks/`, `templates/`, `config.yml`, `config.yml.env`) | `neues-projekt.md:55-104` (Dateien vs. registriert), `sammlungen-anlegen.md`, `ssr-website.md` | teilweise | `templates/`-Verzeichnis, `config.yml.env`-Mechanik (`ADMIN_ASSET_VERSION`), `medialib.yml`-Felder nur Beispiel | +| Env/Deploy (`CODING_URL`, `LIVE_URL`/`STAGING_URL`, `ADMIN_ASSET_VERSION`, `.basic-auth-*`, CI-Skripte `scripts/ci-*.sh`, `validate-schemas.mjs` in tibi-types) | `.env`, `scripts/ci-*.sh`, `AGENTS.md: Required secrets` | `neues-projekt.md`, `deploy.md:12-110` (URL-Bild, Ablauf, Reload-Endpunkte, Token-Trennung) | teilweise | `.basic-auth-*`-Dateien, `ADMIN_ASSET_VERSION`-Mechanik, CI-Skript-Details (`ci-modify-config.sh`, `ci-upload-sourcemaps.sh`), BrowserSync-Proxy — Starter-lokal, Doku schweigt | +| `.agents/`-Wissen (BUILD_CHECKLIST, Skills, `tibi-project-setup`) | `.agents/BUILD_CHECKLIST.md`, `.agents/skills/`, `AGENTS.md` | keine Entsprechung | fehlt (bewusst?) | Build-Checklisten-Phasen und Skill-Pflege sind Starter-intern; Doku muss entscheiden, ob das Projekt-Delivery-Wissen je in `neues-projekt.md` gehört | + +Top-5 Starter-Lücken (für Projekt-Doku `schnellstart`/`neues-projekt`/`ssr-website`/`deploy`): + +1. Playwright-Test-Setup (`tests/e2e|api|visual`, `test:e2e/test:api/tour`-Skripte) — kein Doku-Kapitel. +2. Mock-Modus (`MOCK=1`/`start:mock`, `mocking/*.json`, `lib/mock.ts`) — nur Wort-Treffer. +3. `api/templates/` + `ssr.yml`-Felder + Cache-Invalidierung als Konzept (nur Code-Kommentar in `ssr-website.md:153-164`). +4. CI/Env-Mechanik (`.basic-auth-*`, `ADMIN_ASSET_VERSION`, `scripts/ci-*.sh`, `esbuild-wrapper`-Flags). +5. Frontend-`lib/`-Module + `widgets/`-Katalog + Sentry-Verdrahtung (nur angerissen). + +## 5) Löschkandidaten (Datei → Inhalt → Doku-Status) + +tibi-types: + +- `index.d.ts` (1716 Zeilen: alle Hook-Typen) → in tibi-docs **teilweise** (Funktionen ja, Typen nein) → **muss bleiben** (einzige Typquelle; Starter referenziert via `types/global.d.ts` + `tibi-types/`-Submodul lt. `AGENTS.md`). +- `schemas/config/*.json` (16 Dateien) → in tibi-docs **teilweise** (`schemas.md:10-33` listet, Details fehlen) → **muss bleiben** (einzige Form-Quelle; Doku verlinkt per `$schema`-Zeile). +- `scripts/validate-schemas.mjs` → Inhalt nicht verifiziert (nicht gelesen) → **nicht verifiziert** (vermutlich Build-Hilfe → muss bleiben). +- `demo-api/` (`config.yml`, `collections/mycol.yml`, `collections/fields|global/`, `actions/`, `hooks/`, `testfiles/`) → Doku-Beispiele nutzen Starter-`api/`, nicht `demo-api` → **teilweise/nicht abgedeckt**; vor Löschen prüfen, ob Tests/Validierung sie nutzen (nicht verifiziert) → **nicht löschen ohne Prüfung**. +- `package.json`/`tsconfig.json`/`README` (falls vorhanden) → Paket-Metadaten → **muss bleiben**. + +tibi-svelte-starter: + +- `README.md` (Setup-Checkliste :7-22, Architektur/SSR :24-40) → in tibi-docs **abgedeckt** (`schnellstart.md`, `neues-projekt.md`, `ssr-website.md`) → **muss bleiben** (Einstiegspunkt im Repo; Doku dupliziert mit Absicht für Website-Kontext). +- `AGENTS.md` (Token-Köpfe, Medialib-URL-Pattern, Constraints, Secrets, Skills-Pflege) → in tibi-docs **teilweise** (Token-Köpfe abgedeckt, Medialib-Pattern in `dateien-bilder.md`, Skill-/Constraint-Wissen nicht) → **muss bleiben** (Agenten-Arbeitsanweisung im Repo). +- `api/` (`collections/*.yml`, `hooks/ssr/*`, `templates/`, `config.yml`, `config.yml.env`) → in tibi-docs **teilweise** (Konzepte ja, Feld-Mapping nein) → **muss bleiben** (lauffähiges Beispiel). +- `frontend/src/` (App/blocks/widgets/lib/routes) → **teilweise** → **muss bleiben**. +- `.agents/` (`BUILD_CHECKLIST.md`, `STARTER_ALIGNMENT_*.md`, `skills/`) → in tibi-docs **nicht abgedeckt** → **muss bleiben** (Starter-interne Liefer-/Pflege-Doku, kein Doku-Duplikat). +- `docker-compose-*.yml`, `Dockerfile`, `Makefile`, `esbuild.config*.js`, `scripts/esbuild-wrapper.js`, `.env` → **teilweise** (Befehle ja, Details nein) → **muss bleiben**. +- `tests/` + `playwright.config.ts` + `video-tours/` → in tibi-docs **nicht abgedeckt** → **muss bleiben** (kein Ersatz in Doku). +- `tibi-types/`-Submodul + `types/global.d.ts` → Typ-Brückenkopf → **muss bleiben**. + +Zählung: 0 Dateien mit Verdikt „löschen". 2× „muss bleiben" (Typ-/Schema-Quellen), Rest „teilweise/nicht abgedeckt, muss bleiben" (lauffähige Beispiele, Tests, Ops-Dateien). Einziger Klärungsfall: `tibi-types/demo-api/` (Nutzung durch Tests/CI vor Lösch-Entscheidung prüfen — nicht verifiziert). diff --git a/plans/audit/04-legacy-docs.md b/plans/audit/04-legacy-docs.md new file mode 100644 index 0000000..7ba16a0 --- /dev/null +++ b/plans/audit/04-legacy-docs.md @@ -0,0 +1,106 @@ +# Audit 04 — Alt-Doku-Inventar vs. tibi-docs (zentrale Doku) + +> Audit-Agent, nichts geändert/gelöscht. Stand: 2026-10-16. +> Kernbefund: `tibi-docs` wurde per Commit `06c8363` („Neuaufbau: Inhalte bis auf Einstieg entfernt") neu aufgebaut — +> die 24 englischen Server-Docs + 3 Nova-Docs liegen **nicht** als Sync-Artefakte in `tibi-docs` (git-ls-files zeigt nur je 5/10 Handseiten). +> `scripts/sync-server-docs.mjs` + `AGENTS.md` („server/ = SYNC") beschreiben einen Sync, dessen Ergebnis nicht (mehr) im Repo steht — +> ein Lauf würde 24+3 Dateien als verwaiste Seiten (kein Sidebar-Eintrag in `astro.config.mjs`) einspielen. + +## 1) Datei-Inventar + +### A. `tibi-server/docs/` — alle 24 Dateien einzeln + +| Pfad | Inhalt (1 Zeile) | Ziel in tibi-docs | Bewertung | Begründung | +|---|---|---|---|---| +| `tibi-server/docs/01-architecture.md` (257 Z.) | Architektur-Überblick (Go, Module) | `server/uebersicht.md` | behalten-intern | Core-Referenz für Server-Entwicklung; tibi-docs nur Nutzer-Sicht | +| `tibi-server/docs/02-configuration.md` (705 Z.) | Server-Konfiguration (Env, YAML) | `server/konfiguration.md` | behalten-intern | Vollreferenz (705 Z.) vs. Handseite; Quelle-der-Wahrheit für Core | +| `tibi-server/docs/03-api-endpoints.md` (2406 Z.) | REST-Routen-Referenz, englisch | `server/schnittstellen.md` + `projekt/abfragen-lesen.md` | behalten-intern | Größte Datei; tibi-docs fasst nutzerorientiert zusammen, ersetzt keine Referenz | +| `tibi-server/docs/04-collections.md` (1745 Z.) | Collection-System im Detail | `projekt/sammlungen-anlegen.md`, `projekt/felder-widgets.md` | behalten-intern | Detailtiefe (1745 Z.) bleibt Core-Referenz | +| `tibi-server/docs/05-authentication.md` (602 Z.) | Auth (Login, JWT, Tokens, Impersonation) | `server/sicherheit.md` + `projekt/rechte-tokens.md` | behalten-intern | stimmen überein (`POST /api/v1/login`, Impersonation); Detail bleibt hier | +| `tibi-server/docs/06-hooks.md` (1717 Z.) | JS-Hook-Laufzeit, alle Stufen | `projekt/hooks-schreiben.md` + `reference/hook-kontexte.md` | behalten-intern | 1717 Z. Vollreferenz; tibi-docs deckt 24 Kontexte + Signaturen ab, aber kein Ersatz | +| `tibi-server/docs/07-realtime.md` (186 Z.) | SSE Pub/Sub-Channels | `server/schnittstellen.md` (Realtime-Abschnitt) | behalten-intern | kurze Referenz, intern weiter nötig | +| `tibi-server/docs/08-file-upload-images.md` (288 Z.) | Uploads + Bildfilter | `projekt/dateien-bilder.md` | behalten-intern | Core-Referenz | +| `tibi-server/docs/09-llm-integration.md` (256 Z.) | LLM-Chat-API, Budgets | `projekt/llm-nutzen.md` | behalten-intern | tibi-docs-Seite war lt. `plans/doku-ausbau.md` „Hülle" — prüfen vor Wegfall-Urteil | +| `tibi-server/docs/10-audit.md` (273 Z.) | Audit-Log (TTL, Lesen) | `projekt/audit-backup.md` | behalten-intern | Core-Referenz | +| `tibi-server/docs/11-jobs.md` (150 Z.) | Cron-Jobs | `projekt/jobs-actions.md` | behalten-intern | kurz, kein Löschgrund (Single Source) | +| `tibi-server/docs/12-deployment.md` (148 Z.) | Deployment | `projekt/deploy.md` + `server/betrieb.md` | behalten-intern | kurz, Core-Sicht | +| `tibi-server/docs/13-openapi-metrics.md` (147 Z.) | OpenAPI + Prometheus | `reference/openapi.md` + `server/betrieb.md` | behalten-intern | kurz, Core-Sicht | +| `tibi-server/docs/14-security.md` (632 Z.) | Security-Audit (englisch) | `server/sicherheit.md` | behalten-intern | Audit-Charakter (632 Z.), nicht nutzerrelevant 1:1 | +| `tibi-server/docs/15-troubleshooting.md` (228 Z.) | Troubleshooting/FAQ | `reference/fehlercodes.md` + `anwender/hilfe.md` | behalten-intern | Core-Fehlersuche vs. Anwender-Hilfe | +| `tibi-server/docs/16-cookbook.md` (682 Z.) | Collection-Config-Rezepte | `projekt/sammlungen-anlegen.md` | behalten-intern | Rezeptsammlung für Core-/Power-User | +| `tibi-server/docs/17-field-level-permissions.md` (546 Z.) | Feld-Rechte im Detail | `projekt/rechte-tokens.md` | behalten-intern | Detailreferenz | +| `tibi-server/docs/18-orgs-teams.md` (716 Z.) | Orgs & Teams | `admin/benutzer-rechte.md` + `anwender/benutzer-teams.md` | behalten-intern | 716 Z. Modell-Referenz vs. Bedienungs-Seiten | +| `tibi-server/docs/19-actions.md` (311 Z.) | Actions | `projekt/jobs-actions.md` + `admin/aktionen.md` | behalten-intern | Core-Referenz | +| `tibi-server/docs/20-referenced-read-safety.md` (70 Z.) | GET-Sichtbarkeits-Sicherheitsregel | `server/sicherheit.md` (unklar ob abgedeckt) | behalten-intern | Sicherheitsregel für Core-Entwicklung, 70 Z. | +| `tibi-server/docs/21-backup-restore.md` (530 Z.) | Backup/Restore | `projekt/audit-backup.md` | behalten-intern | inkl. Snapshots-Plan-Kontext; Core-Referenz | +| `tibi-server/docs/22-personal-access-tokens.md` (291 Z.) | Personal Access Tokens, Scopes | `projekt/rechte-tokens.md` + `reference/token-koepfe.md` | behalten-intern | Scope-Modell-Referenz | +| `tibi-server/docs/23-mcp.md` (152 Z.) | MCP-Server (Routen, Env) | `projekt/mcp-nutzen.md` (+ `server/schnittstellen.md`) | behalten-intern | **Widerspruch** zu tibi-docs, siehe §4 | +| `tibi-server/docs/24-ephemeral-rest-tokens.md` (71 Z.) | Ephemere REST-Tokens, Status PLAN | `reference/token-koepfe.md` (unklar ob abgedeckt) | behalten-intern | Plan-Status, nicht implementiert — nicht löschen, als Plan kennzeichnen | + +Fazit A: **0 Wegfall-Kandidaten** in `tibi-server/docs/`. Alle 24 = englische Core-Referenz (Single Source); tibi-docs ist deutsche Nutzer-Doku, kein Ersatz. + +### B. `tibi-admin-nova/docs/` — alle Dateien einzeln + +| Pfad | Inhalt (1 Zeile) | Ziel in tibi-docs | Bewertung | Begründung | +|---|---|---|---|---| +| `tibi-admin-nova/docs/collection-config.md` (2293 Z.) | Collection-Config-Referenz (größte Nova-Datei) | `admin/*` + `projekt/sammlungen-anlegen.md` | behalten-intern | Vollreferenz; von tibi-docs-T-ADMIN-SO als Quelle genutzt, nicht ersetzt | +| `tibi-admin-nova/docs/collection-export.md` (327 Z.) | CSV/XLSX/JSON-Export aus Listen | `admin/exporte.md` + `anwender/exportieren.md` | behalten-intern | Detail (u. a. `qm`-Param); tibi-docs fasst zusammen | +| `tibi-admin-nova/docs/custom-export-script.md` (117 Z.) | Custom-Export-Skripte (`collection.meta.exports`) | `admin/exporte.md` | behalten-intern | API-Detail (`db.loadAll`/`ctx.xlsx`); T-ADMIN-A-SO belegt Nutzung als Quelle | +| `tibi-admin-nova/docs/test-plans/` (19 Dateien, Nrn. 02,05,07,11,16,17,25,27,34–44) | Manuelle UI-Testpläne (Navigation, Editor, Upload, i18n, Pagebuilder, Backup …) | `admin/*` als Quelle, kein 1:1-Ziel | behalten-intern | Test-Artefakte, keine Nutzer-Doku; T-ADMIN-B-SO verlinkt Test-Pläne 40/42 | + +### C. Zusammengefasst je Verzeichnis + +| Verzeichnis | Inhalt | Ziel in tibi-docs | Bewertung | Begründung | +|---|---|---|---|---| +| `tibi-server/README.md` | Feature-Matrix + Tech Stack (englisch) | `server/uebersicht.md` | behalten-öffentlich | Repo-Einstieg; kein tibi-docs-Ersatz | +| `tibi-server/design/` (2 Dateien: `snapshot-plan.md`, `snapshot-review-2026-06-28.md`) | Snapshot-Architekturplan + Review | `projekt/audit-backup.md` (Ergebnis, nicht Plan) | behalten-intern | Architektur-Referenz für Core-Entwicklung | +| `tibi-server/examples/` (`mcp/curl.sh`, `testproject/*`, `testproject2/collections/*.yml`) | Lauffähige Beispiel-Configs/Skripte | keines (Code, keine Doku) | behalten-intern | Test-/Beispiel-Artefakte | +| `tibi-server/plans/` (22 Dateien: ISSUES, Backup-, MCP-, Impersonation-, Org/Team-Pläne …) | Arbeitspläne Core-Entwicklung | keines | behalten-intern | aktive/historische Arbeitspläne | +| `tibi-admin-nova/README.md` | Setup-Anleitung Nova (git-lfs, yarn) | `admin/setup.md` | behalten-intern | Entwickler-Setup des Admin-Repos | +| `tibi-admin-nova/frontend/docs/*.pdf` (4 Dateien, je 1 Seite, <1,5 KB) | `brand-guidelines`, `design-specs`, `media-kit-2026`, `validation-report` | keines bekannt | unklar | Winzig-Platzhalter-PDFs — Inhalt ungeprüft; Ersteller fragen | +| `tibi-admin-nova/plans/{open,in-progress,closed}/` (26 Dateien) | Feature-Arbeitspläne (Actions, Pagebuilder, Import/Export, Voice …) | keines | behalten-intern | Arbeitspläne, keine Doku | +| `tibi-admin-nova/plans/test-plans/{open,closed,…}` (~40 Dateien) | Manuelle Testpläne aller UI-Bereiche | als Quelle für `admin/*`, `anwender/*` | behalten-intern | Test-Artefakte; T-ADMIN-B-SO verlinkt 40/42 | +| `tibi-svelte-starter/README.md` | Starter-Setup-Checkliste + SSR-Architektur | `einstieg/neues-projekt.md`, `projekt/ssr-website.md` | behalten-öffentlich | Repo-Einstieg des Templates; als Eigen-Datei nötig | +| `tibi-svelte-starter/AGENTS.md` | Token-Header-Regel, Medialib-URL-Pattern, Constraints | `reference/token-koepfe.md` (Header), `projekt/*` (teils) | behalten-intern | Arbeitsanweisung für Agenten im Starter-Repo | +| `tibi-docs-legacy/docs/` (`begriff.md`, `probleme.md`, `servergrundlagen`, `restapi`, `tibiAI`, `server-javascript-kontext` …) | Alte deutsche TibiCMS-Doku (Docpress-Ära) | `einstieg/begriffe.md` u. a. (unklar, Volltext-Abgleich fehlt) | unklar | historisch; vor Löschung Volltext-Abgleich gegen tibi-docs nötig | +| `tibi-starter/docs/` (docpress.json, md/, …) | offenbar weitere Legacy-Doku-Kopie | keines geprüft | unklar | nur oberflächlich geprüft — Inventar fehlt | + +## 2) Wegfall-Kandidaten (konkret) + +**Keine Datei erfüllt „kann weg, weil in tibi-docs abgedeckt".** Zählung: **0 Wegfall-Kandidaten, 27 Muss-bleiben-Dateien** (24 + 3). +Stattdessen wegfall-/reparaturbedürftig auf Meta-Ebene: + +1. `tibi-docs/scripts/sync-server-docs.mjs` — Sync-Ziel (`server/01–24*.md`, `admin/collection-*.md`) steht nicht im Repo und nicht in der Sidebar (`astro.config.mjs` listet nur 5/10 Handseiten). Entweder reaktivieren (mit Sidebar-`autogenerate` + Linkpflege) oder Skript + AGENTS.md-Sync-Abschnitt als veraltet kennzeichnen. Ungenutzter Code mit falscher Doku-Behauptung. +2. `tibi-docs/AGENTS.md` §2-Tabelle („server/ = SYNC — nicht von Hand editieren") + §4-Sync-Workflow — widersprechen dem tatsächlichen Neubau-Stand (nur Handseiten, `git log 06c8363`). Korrektur fällig, kein Datei-Wegfall. +3. `tibi-docs-legacy/`, `tibi-starter/docs/`, `tibi-docs-kaputt/` — nach Volltext-Abgleich (siehe §5) Löschkandidaten auf **Repo-Ebene**, nicht Datei-Ebene. + +Sync-Abhängigkeit: nichts in `tibi-server/docs/` oder `tibi-admin-nova/docs/` darf gelöscht werden, **weil** das Sync-Skript genau diese Pfade als Quelle liest (`serverSrc`, `novaSrc` in `sync-server-docs.mjs:14–15`); Löschen dort bräche einen evtl. reaktivierten Sync. + +## 3) Muss bleiben (Begründung) + +- `tibi-server/docs/01–24` (alle): einzige vollständige englische Core-Referenz + Single Source für Reaktivierung des Syncs. +- `tibi-admin-nova/docs/*.md` (3): Config-/Export-Referenz, von tibi-docs-Autoren als Quelle benutzt (Second Opinions in `plans/doku-ausbau.md`). +- `tibi-admin-nova/docs/test-plans/` + `plans/test-plans/`: manuelle Testpläne, keine Nutzer-Doku, weiter als Test-Artefakte nötig. +- `tibi-admin-nova/plans/` + `tibi-server/plans/` + `tibi-server/design/`: Arbeits-/Architekturpläne der Core-Entwicklung. +- `tibi-server/examples/`, READMEs, `tibi-svelte-starter/{README,AGENTS}.md`: Repo-Einstiege + Agenten-Arbeitsanweisungen. + +## 4) Dubletten/Widersprüche + +1. **MCP-Route konfigurierbar vs. fest.** `tibi-server/docs/23-mcp.md:42,47` (`route: "/api/v1/mcp"`, Env `MCP_ROUTE`) vs. `tibi-docs/src/content/docs/server/schnittstellen.md:77` („fest `POST` + `GET /api/v1/mcp` — ein gesetztes `mcp.route`/`MCP_ROUTE` wird ignoriert"). Eine Seite irrt — am Code (`internal/controller/setup.go`, `internal/config/server.go`) klären. +2. **Sync-Behauptung vs. Neubau-Realität.** `tibi-docs/AGENTS.md:25–26,39–48` („server/ = SYNC", Sync-Workflow) vs. `git log 06c8363` + `git ls-files` (nur Handseiten, keine Sync-Artefakte). AGENTS.md ist veraltet. +3. **Login-Pfad-Darstellung.** `tibi-server/docs/05-authentication.md:12` (`POST /api/v1/login`) vs. `tibi-docs/.../server/schnittstellen.md:12,27` (verkürzt `/login`, Tabelle mit Präfix `/api/v1`). Inhaltlich konsistent, aber Kürzung riskiert Copy-Paste-Fehler — unklar, kein harter Widerspruch. +4. **Token-Header `Token` vs. reservierte Namen.** `tibi-svelte-starter/AGENTS.md` (Collection-API: Header-Name aus Permission-Key, typisch `Token`) vs. `tibi-docs/.../reference/token-koepfe.md:52` (reservierte Namen `x-auth-token`/`x-admin-token`/`authorization` fail-closed). Ergänzend, aber Starter-Regel „typisch `Token`" ohne Warnung vor reservierten Namen — Angleichung empfohlen. +5. **LLM-/MCP-Seiten Hüllen-Status.** `plans/doku-ausbau.md` listet `projekt/llm-nutzen` + `projekt/mcp-nutzen` als „Hülle" — falls weiterhin Hüllen, sind `09-llm-integration.md`/`23-mcp.md` die einzigen vollständigen Quellen; kein Widerspruch, aber Abhängigkeit. + +## 5) Repo-Hygiene-Funde + +| Verzeichnis | Befund | Empfehlung | +|---|---|---| +| `/WM_Dev/src/gitbase.de/cms/tibi-admin.bak/`, `tibi-admin.bak2/` (je eigenes `.git`-Repo, Woocommerce-Ära-Layout) | tote Vollkopien | archivieren/löschen nach Backup-Abgleich | +| `/WM_Dev/src/gitbase.de/cms/tibi-admin.kaputt/` (eigenes `.git`) | defekte Kopie per Namensgebung | löschen nach Backup-Abgleich | +| `/WM_Dev/src/gitbase.de/cms/tibi-server.bak/` | Server-Backup-Kopie | löschen nach Abgleich | +| `/WM_Dev/src/gitbase.de/cms/tibi-docs-kaputt/` (eigenes `.git`) | defekte Doku-Kopie | löschen nach Abgleich | +| `/WM_Dev/src/gitbase.de/cms/tibi-admin/`, `tibi-admin-dev/`, `tibi-admin-master/` (READMEs sagen alle „tibi-svelte-starter", alte Svelte-Geschichte) | alte Starter-/Admin-Varianten, unklar ob referenziert | klären, dann archivieren/löschen | +| `/WM_Dev/src/gitbase.de/cms/tibi-admin-server/` (Python `run.py`, `uploads/`) | artfremder Uploader-Dienst | prüfen, ob noch deployed; sonst archivieren | +| `/WM_Dev/src/gitbase.de/cms/tibi-starter/` vs. `tibi-svelte-starter/` | zwei Starter-Varianten parallel | eine als kanonisch erklären, andere archivieren | +| `tibi-docs-legacy/` (Docpress + `node_modules/` eingecheckt) | Legacy-Doku inkl. `node_modules/` | nach Volltext-Abgleich archivieren/löschen | diff --git a/plans/audit/05-review-admin-reference.md b/plans/audit/05-review-admin-reference.md new file mode 100644 index 0000000..4f2db3b --- /dev/null +++ b/plans/audit/05-review-admin-reference.md @@ -0,0 +1,55 @@ +# Audit: Admin- und Referenz-Doku + +- Umfang: `src/content/docs/admin/*.md` (10 Dateien, 920 Zeilen) und `src/content/docs/reference/*.md` (11 Dateien, 1434 Zeilen), jeweils vollständig gelesen. +- Datum: 2026-10-16. Code-Stand: tibi-admin-nova `2b091d89`, tibi-server `68b42785`, tibi-types `4c55f82` (aus den `Verifiziert`-Zeilen). +- Belege: `frontend/src/lib/i18n/locales/de.json` (1456 Schlüssel), `frontend/assets/system.config.json`, `config/ai-proxy.config.json`, `frontend/src/lib/**`, `tibi-server/internal/**`, `tibi-types/schemas/config/` (16 Dateien, Angabe in `schemas.md` stimmt). +- Alle internen Links (`/admin/*`, `/projekt/*`, `/reference/*`, `/anwender/anmelden/`) lösen auf existierende Dateien auf. Alle Codeblöcke sind balanciert. Keine Datei überschreitet 500 Zeilen (Maximum: `hooks-daten.md` mit 413). + +## Befunde + +| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag | +|---|---|---|---|---| +| 1 | `reference/openapi.md:1-5` | PLATZHALTER | Datei hat nur 5 Zeilen, kein `description`-Frontmatter, Inhalt nur „Stand: Platzhalter“. | `npm run sync:openapi` ausführen oder Seite bis dahin aus der Sidebar nehmen. | +| 2 | `reference/hook-kontexte.md:63-69` | PLATZHALTER | Abschnitt „Fehlende oder veraltete Einträge melden“ mit „Die Hülle nannte nur …“ ist Aufbau-Rückstand, kein Nutzer-Inhalt. | Abschnitt streichen; Rest als normale Einleitung („24 Pakete, Stand …“) formulieren. | +| 3 | `admin/ki-funktionen.md:91` | UI-TEXT | `open_collection_record` wird mit Anzeige „(Datensatz öffnen)“ zitiert, aber weder `de.json` (`admin.ai.tools.*`, 56 Schlüssel geprüft) noch `frontend/src/lib` kennen „Datensatz öffnen“. | Label im Code ergänzen oder Doku auf Tool-Namen zurückstufen wie bei `toggle_sidebar`/`drill_navigate`. | +| 4 | `admin/aktionen.md:54` + `admin/ki-funktionen.md:23` | UI-TEXT | „Kurzfassung“ als UI-Name zitiert; `de.json` kennt für `outputSummary` aber „Zusammenfassung“, „Kurzfassung“ kommt in `de.json` und `frontend/src/lib` nicht vor. | Auf „Zusammenfassung“ korrigieren oder Code-Beleg nachliefern. | +| 5 | `admin/aktionen.md:56` | UI-TEXT | Fallback-Text „keine Ausgabefelder“ in Anführungszeichen, aber weder in `de.json` noch in `frontend/src/lib` gefunden. | Exakten Code-String übernehmen oder als Beschreibung (ohne Anführungszeichen) formulieren. | +| 6 | `admin/benutzer-rechte.md:16` | UI-TEXT | „60-Sekunden-Countdown“ fett als UI-Name; Dauer 60 s stimmt (`SessionTimeoutWarning.svelte:18` `COUNTDOWN_SECONDS = 60`), aber die Zeichenkette steht nicht in `de.json`. | Fettung entfernen, beschreibend formulieren („… warnt dich 60 Sekunden vorher …“). | +| 7 | `reference/tastatur-kurzbefehle.md:39` + `admin/ki-funktionen.md:99-101` | MD-FEHLER | Gemischte Anführungszeichen: „Eintrag speichern", „Theme wechseln", „Sprache wechseln", „UI erklären" u. a. schließen mit `"` statt `"`. | Durchgehend deutsche Zeichen („…") verwenden. | +| 8 | 9 Dateien (s. Liste unten) | MD-FEHLER | Ungenutzte Starlight-Importe (nie als Komponente verwendet). | Importzeilen bereinigen. | +| 9 | `admin/benutzer-rechte.md:57` | STIL | „Platzhalter-Beispiel: `pages, media`“ — inhaltsleeres Beispiel in einer Handseite. | Reales Beispiel aus der Projekt-Meta oder streichen. | +| 10 | `reference/tastatur-kurzbefehle.md:8` | STIL | „Du musst die Maus nicht anfassen“ — flapsig, passt nicht zum sachlichen Ton aus AGENTS §1. | Streichen oder sachlich („Alle Funktionen sind per Tastatur erreichbar“). | +| 11 | `admin/ki-funktionen.md:87-101` | STRUKTUR | Eine Tabelle mit 62 Werkzeugen ist als Nachschlagewerk kaum lesbar. | Pro Gruppe eine eigene kleine Tabelle unter Zwischenüberschriften; Einleitungssatz „Labels wörtlich aus `de.json`“ einschränken (6 Tools haben dort keinen Eintrag: `open_collection_record`, `toggle_sidebar`, `open_field_search`, `drill_navigate`, `get_collection_records`, `get_collection_schema`). | +| 12 | `admin/customizing.md:23-30` ↔ `admin/eintrags-editor.md:29-43` ↔ `projekt/felder-widgets.md` | STRUKTUR | Widget-Liste steht an drei Stellen (zwei Widget-Tabellen im Admin plus Feldtypen im Projekt). | Eine kanonische Tabelle (Projekt-Seite), Admin-Seiten verlinken nur. | +| 13 | `admin/ansichten-listen.md:69-73` + `admin/eintrags-editor.md:77-92` ↔ `reference/tastatur-kurzbefehle.md` | STRUKTUR | Tastaturkürzel doppelt gepflegt (Listen-/Editor-Seiten und Referenz). | Auf den Referenz-Seiten nur die seitenrelevanten Kürzel behalten, Rest verlinken. | +| 14 | `admin/*` → `anwender/*` | STRUKTUR | Keine Admin-Seite verlinkt die Anwender-Anleitungen (nur `konzept.md` erwähnt den Bereich). | Je Seite einen Satz mit Link auf das passende Anwender-Pendant (z. B. Editor → `anwender/eintrag-bearbeiten/`). | +| 15 | `admin/ki-funktionen.md:30` | STARLIGHT | Dichte Kennzahlen-Prosa („grün < 40 %, gelb < 70 % …“) als Fließtext. | Als Tabelle (Schwelle → Farbe) oder `Badge`-Legende darstellen. | +| 16 | `admin/konzept.md:1-36` | STRUKTUR | Nur 36 Zeilen, reiner Hub ohne eigenen Inhalt — für die Zielgruppe (Admin einrichten/anpassen) ohne Mehrwert über die Links hinaus. | Entweder ausbauen (Betriebsmodell: SPA, Mock, Reverse Proxy in 2–3 Sätzen) oder mit `setup.md` zusammenführen. | +| 17 | `admin/aktionen.md:45` | PRUEFEN | Route `POST /api/v1//_actions/` nicht gegen `action_handler.go` geprüft. | Pfad und `?method=`-Parameter am Code verifizieren. | +| 18 | `admin/benutzer-rechte.md:25` | PRUEFEN | „Passwort (min. 6 Zeichen, doppelt bestätigt)“ nicht gegen `UserTab`/`UserDetailDrawer` geprüft. | Mindestlänge und Doppelbestätigung am Code belegen. | +| 19 | `reference/token-koepfe.md:29` | PRUEFEN | „Groß-/Kleinschreibung egal“ beim `Token`-Header nicht gegen `permission.go`/Header-Auswertung geprüft. | Am Code belegen oder streichen. | +| 20 | `admin/ki-funktionen.md:60-63` | PRUEFEN | STT-Details (Proxy-Modell `large-v3-turbo`, 3 s Stille, Schnipsel < ~1 KB) nur gegen `system.config.json` (Endpunkt `/api/ai/transcribe` stimmt) geprüft, nicht gegen `aiVoiceInput.ts` und `ai-proxy.config.json`. | Modellnamen und Schwellen am Code belegen. | +| 21 | `admin/setup.md:39-43` | PRUEFEN | Ports (3000/8080) und Profile (`tibi`/`tibi-dev`) nur gegen `Makefile` (Targets existieren) geprüft, nicht gegen `docker-compose-local.yml`/`.env`. | Ports und Profilnamen an Compose-Datei belegen. | + +Ungenutzte Importe zu Nr. 8: `aktionen.md` (`Card`, `CardGrid`, `FileTree`), `ansichten-listen.md` (`Steps`, `Card`, `CardGrid`), `benutzer-rechte.md` (`Card`, `CardGrid`, `FileTree`), `customizing.md` (`Steps`, `Card`, `CardGrid`, `Badge`, `FileTree`), `eintrags-editor.md` (`Card`, `CardGrid`, `Badge`), `exporte.md` (`Tabs`, `TabItem`, `Card`, `CardGrid`, `Badge`), `ki-funktionen.md` (`Card`, `CardGrid`, `Badge`, `FileTree`), `medien.md` (`Aside`, `Card`, `CardGrid`, `Badge`), `setup.md` (`Card`, `CardGrid`, `Badge`, `FileTree`). + +## Fehlende Screenshots je Admin-Seite + +Alle 9 Handseiten außer `konzept.md` enthalten einen `Screenshot-Platzhalter (T-SHOTS)`; keine Seite hat bisher ein Bild unter `src/assets/`: + +- `aktionen.md:29` — Action-Ansicht mit Methoden-Reitern, Eingabeformular und Ausführen-Knopf. +- `ansichten-listen.md:103` — Listenansicht mit Suchfeld, Filter-Popover und Paginierung. +- `benutzer-rechte.md:103` — Hub mit Benutzerliste und Detail-Drawer inkl. Rollen-Badge und Chips. +- `customizing.md:87` — Angepasste Listenansicht mit Spaltenwahl und eigenem Export-Reiter. +- `eintrags-editor.md:103` — Editor mit Formular, Seitenleiste und Übersetzungsleiste. +- `exporte.md:83` — Export-Dialog mit Formatwahl und Spaltenliste. +- `ki-funktionen.md:132` — Geöffneter KI-Chat mit Werkzeugstatus und Mikro-Knopf. +- `medien.md:81` — Medienraster mit Warteschlange und Bildeditor-Dialog. +- `setup.md:83` — Frisch gestarteter Admin mit Projektliste nach Login. + +## Unsichere Punkte + +- Nr. 17–21 oben (mit `PRUEFEN` markiert): jeweils Doku-Zitat gegen noch nicht gelesene Code-Stelle prüfen. +- Tastatur-Seite Zeile 57–61: Die Behauptung, die Overlay-Zeile `u` habe „keinen passenden Text in der Sprachdatei (Schlüssel `toggleUsers` fehlt) und keinen eigenen Handler“, ist plausibel, wurde aber nicht gegen `shortcuts.ts`/`KeyboardShortcuts.svelte` verifiziert. +- `fehlercodes.md` und `hooks-*.md` zitieren Fehler-Strings mit Datei- und Zeilenangaben aus `tibi-server`; stichprobenhaft bestätigt (`reponse.header`-Tippfehler in `context_response.go:29`, Legacy-Default in `http_status.go`, 16 Schema-Dateien), aber nicht jede einzelne Zeilennummer nachgeprüft — Zeilenangaben driften bei Code-Änderungen schnell. +- Positiv: keine `man`-Form gefunden, Umlaute durchgehend korrekt, alle Frontmatter (außer `openapi.md`) mit Titel und Beschreibung, keine toten internen Links. diff --git a/plans/audit/05-review-anwender-adr.md b/plans/audit/05-review-anwender-adr.md new file mode 100644 index 0000000..87e6183 --- /dev/null +++ b/plans/audit/05-review-anwender-adr.md @@ -0,0 +1,58 @@ +# Review: Anwender-Doku, Index und ADRs + +- Umfang: `src/content/docs/anwender/*.md` (11 Dateien), `src/content/docs/adr/*.md` (4 Dateien), `src/content/docs/index.mdx`. +- Datum: 2026-10-16. Gegenprüft mit `tibi-admin-nova` Commit `2b091d89` (existiert) und `frontend/src/lib/i18n/locales/de.json`. +- Positiv vorweg: alle 23 internen Links der Anwender-Seiten und alle 6 Karten-Links in `index.mdx` lösen auf existierende Seiten auf. Alle 30 Bilder sind je genau einmal referenziert, alle ≤ 200 KB, alle mit Alt-Text. Keine Babysprache („keine Angst" u. Ä.) gefunden; Du-Form durchgehend eingehalten (eine Ausnahme, siehe #14). + +## Befund-Tabelle + +| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag | +|---|-------------|-----------|---------------|-----------| +| 1 | orientierung.md:20 | MD-FEHLER | Alt-Text enthält Tippfehler „Brotkrumen"; UI-Begriff lautet „Navigationspfad" (`drawer.breadcrumb`, de.json:96). | Alt-Text: „Projektübersicht der Corporate Website mit Kopf, Navigationspfad und Sammlungen". | +| 2 | ki-nutzen.md:105 | MD-FEHLER | Redaktionelle Produktionsnotiz („KI-Antworten … simuliert … lief ohne sichtbares Banner durch") steht als Fließtext im Lesebereich. | Absatz entfernen oder in HTML-Kommentar wandern lassen; simulierte Stellen ersatzweise als Aside „Beispiel" kennzeichnen. | +| 3 | ki-nutzen.md:45-49 vs. :105 | FEHLER-INHALT | Schritte beschreiben Banner-Ablauf („Kontext wird zusammengefasst…" → „Kontext zusammengefasst"), Fußnote gibt zu, dass der Ablauf „ohne sichtbares Banner durchlief" und „Statusanzeigen simuliert" sind — das widerspricht dem „Geprüft an"-Vermerk. Strings selbst belegt (de.json:1028-1029). | Echte Screenshots aus Mock-Projekt aufnehmen; bis dahin Ablauf als „in der Regel" formulieren. | +| 4 | orientierung.md:58-71, hilfe.md:31 | UI-TEXT | Bereich heißt durchgehend „Schnellsuche"; UI-Name ist „Befehlspalette" (de.json:1207), Platzhalter „Befehl eingeben…" (de.json:1154). „Schnellsuche" kommt im Frontend-Code nirgends vor. | Überschrift und alle Erwähnungen in „Befehlspalette" umbenennen; „öffnet mit /" (CommandPalette.svelte:886) behalten. | +| 5 | medien.md:77 | UI-TEXT | „Bild auf Breite×Höhe verkleinert" setzt Wort-Platzhalter; Locale: „Bild auf {width}×{height} verkleinert" (de.json:79) bzw. „{count} Bilder auf {maxWidth}×{maxHeight} verkleinert" (de.json:534). | Konkretes Beispiel nennen, z. B. „Bild auf 1600×1200 verkleinert". | +| 6 | seiten-bauen.md:27 | UI-TEXT | „verfügst du über Lese-Recht" paraphrasiert; UI-Begriff ist „Nur-Lese-Modus" (de.json:1368) mit Hinweis „Du hast keine Berechtigung, diesen Eintrag zu bearbeiten." (de.json:1369). | „Nur-Lese-Modus" zitieren. | +| 7 | index.mdx:6 | TON | Tagline „wie man damit baut" nutzt man-Form (AGENTS §1 verlangt Du-Form). | „hier steht, wie du damit baust". | +| 8 | exportieren.md:24-34 | STARLIGHT | Formatwahl (CSV/XLSX/JSON) plus Array-Behandlung als Steps-Liste führt zu Fehlklicks ohne Vergleich. | `` mit je einem Tab pro Format (inkl. Aside-Hinweis aus :37-43 im JSON-Tab). | +| 9 | ki-nutzen.md:58-75 | STARLIGHT | Zwei aufeinanderfolgende ``-Blöcke (Spracheingabe vs. Vorlesen) zum selben Thema. | `` „Eingabe" / „Ausgabe" statt zweier Steps-Blöcke. | +| 10 | seiten-bauen.md:89-109 | STARLIGHT | Zwei Viewport-Bilder plus Steps ohne Zuordnung Preset ↔ Bild. | `` Desktop (1280) / Tablet (768) / Mobil (375) mit je Bild; Werte belegt (PagebuilderViewportControl.svelte:22-29). | +| 11 | hilfe.md:10-73 | STRUKTUR | Doppelungen: Anmeldung (vgl. anmelden.md:27-41), Speichern blockiert (vgl. eintrag-bearbeiten.md:68-84), Bild fehlt (vgl. medien.md). | hilfe.md auf Verweisliste kürzen („Wenn X, siehe Y Schritt Z") statt Voll-Anleitungen zu wiederholen. | +| 12 | div. (anmelden:71, eintrag:86, lesen:101, orientierung:86, medien:93, ki:101 vs. benutzer-teams:66) | STRUKTUR | Sechs Seiten schließen mit identischem Satz und Linklabel [Mehr Details], benutzer-teams.md:66 nennt dasselbe Ziel [Admin-Konzept]. | Ein Label für `/admin/konzept/` festlegen (Vorschlag: „Admin-Konzept"). | +| 13 | hilfe.md (komplett), sichern.md:49-61, medien.md:77-79, eintrag-bearbeiten.md:40-43, lesen-suchen-filtern.md:75-84, ki-nutzen.md:27-39 | STRUKTUR | Beschriebene Schritte ohne Screenshot: hilfe.md (0 Bilder bei 5 Fällen), Wiederherstellungs-Dialog, Upload-Warteschlange/KI-Beschreibung, Durchsuchen/Auswählen-Fenster, Blättern-Fußzeile, Nova-Werkzeugliste. | Je Stelle einen Shot aus Mock-Projekt `corporate` aufnehmen (AGENTS §3). | +| 14 | (alle Anwender-Seiten) | LUECKE | Verlauf/Audit-Restore im Eintrag fehlt völlig. Beleg: EntryView.svelte:41-43,212-223 (AuditHistoryPanel, AuditRestoreDialog, AuditSidebarHistory); Locale `audit.history.button` „Verlauf" (de.json:1600), `audit.restore.*` (de.json:1615-1628). | Neue Seite „Verlauf ansehen und ältere Stände übernehmen". | +| 15 | (alle Anwender-Seiten) | LUECKE | Massenbearbeitung fehlt. Beleg: CollectionView.svelte:43,258-280 (BulkEditPanel); Locale `bulk.*` (de.json:1464-1540); Befehl „Massenbearbeitung" (de.json:1181). | Neue Seite „Mehrere Einträge gleichzeitig ändern oder löschen". | +| 16 | (alle Anwender-Seiten) | LUECKE | Aktionen fehlen. Beleg: ActionView.svelte; AdminLayout.svelte:114; Locale `actions.*` mit „Ausführen" (de.json:170-213). | Neue Seite „Aktionen starten und Ergebnisse prüfen". | +| 17 | orientierung.md:58-74 | LUECKE | Befehlspalette nur als Sprungziel beschrieben; Befehle (Filter zurücksetzen, Ansicht umschalten, Sprache, siehe de.json:1153-1224) und Tastenkürzel fehlen. | Neue Seite „Befehlspalette und Tastenkürzel" (öffnet mit `/`, CommandPalette.svelte:886). | +| 18 | anmelden.md:55-65 | LUECKE | Nur harter Auto-Logout beschrieben; vorgeschalteter Warn-Dialog „Sitzung läuft ab" mit „Angemeldet bleiben"/„Jetzt abmelden" fehlt. Beleg: SessionTimeoutWarning.svelte:100-151; de.json:1439-1443. | Schritt „Warnung → Angemeldet bleiben klicken" in „Automatisches Sitzungsende" ergänzen. | +| 19 | sichern.md:10-47 | LUECKE | Nur Ansehen beschrieben; Erstellen fehlt, Backup fehlt ganz. Beleg: SnapshotView.svelte:756 (`btnTrigger` „Snapshot erstellen"); App.svelte:96 (backup-view), BackupView.svelte; Locale `backup.*` (de.json:217-285). | Seite erweitern oder neue Seite „Snapshot erstellen und Backup herunterladen". | +| 20 | exportieren.md:24-43 | LUECKE | Eigene (vordefinierte) Exporte unerwähnt. Beleg: ExportDialog.svelte:103-106 (customExports aus `collection.meta.exports`); Locale `export.custom*` (de.json:1564-1569). | Abschnitt „Vordefinierte Exporte nutzen" ergänzen. | +| 21 | benutzer-teams.md:62-64 | LUECKE | Stellvertretung erwähnt Rückkehr nicht. Beleg: `impersonationBanner.stop` „Zurück zur Administration" (de.json:898). | Satz ergänzen: „Der Support kehrt über ‚Zurück zur Administration' zurück." | +| 22 | adr/0000-vorlage.md:6-11 | ADR | Vorlage kennt kein Status-Feld; ADR 0001-0003 haben entsprechend keinen Status („angenommen"/„umgesetzt"). | Vorlage um `- **Status:**` ergänzen, bestehende ADRs nachtragen. | +| 23 | anwender/*.md (11× Fußzeile) | ADR | „Geprüft an 2b091d89 (tibi-admin-nova)" weicht von ADR-Norm „Verifiziert am \ \" (0002:8, 0003:8) und allen `server/*.md` (z. B. konfiguration.md:140) ab — Datum fehlt. | Fußzeile angleichen: „Verifiziert am 2b091d89 2026-10-16 (tibi-admin-nova)". | +| 24 | (keine Datei) | ADR | Fehlende ADRs: (a) Bereichsarchitektur der Doku (7 Bereiche aus AGENTS §2 nirgends begründet); (b) Sync-Regel (AGENTS §4: `npm run sync`, Artefakte committen — kein ADR). Screenshot-Regel steht in 0003:8. | Zwei kurze ADRs 0004 (Bereiche) und 0005 (Sync) anlegen. | +| 25 | adr/0003-selbstlaeufer.md:8 | ADR | „57 Seiten, Stand 2026-10-16" ist überholt: aktuell 61 md/mdx-Dateien unter `src/content/docs`. | Zahl aktualisieren oder Zählung streichen. | + +## Bild-Abgleich + +- Referenziert (je genau einmal, alle mit Alt-Text, alle ≤ 78 KB): anmelden-abmelden, anmelden-login, benutzer-profil, benutzer-teams, eintrag-formular, eintrag-gespeichert, eintrag-neu, export-dialog, export-fertig, ki-chat, ki-stimme, ki-zusammenfassen, lesen-filter, lesen-karten, lesen-liste, lesen-suche, medien-editor, medien-raster, medien-upload, orientierung-projektwechsel, orientierung-schnellsuche, orientierung-start, seiten-bloecke, seiten-overlay, seiten-pagebuilder, seiten-viewport-mobil, seiten-viewport-tablet, sichern-details, sichern-statistik, sichern-uebersicht (alle `.webp` unter `src/assets/anwender/`). +- Verwaist: keine. +- Doppelt referenziert: keine. +- Keine Referenz von außerhalb `anwender/` (geprüft per grep über alle docs). + +## Fehlende Anwender-Seiten + +1. „Verlauf ansehen und ältere Stände übernehmen" — Beleg: EntryView.svelte:41-43,212-223; de.json:1597-1628. +2. „Mehrere Einträge gleichzeitig ändern oder löschen" — Beleg: CollectionView.svelte:43,258-280 (BulkEditPanel); de.json:1464-1540. +3. „Aktionen starten und Ergebnisse prüfen" — Beleg: ActionView.svelte; AdminLayout.svelte:114; de.json:170-213. +4. „Befehlspalette und Tastenkürzel" — Beleg: CommandPalette.svelte:882-894; de.json:1153-1224,1250-1270. +5. „Snapshot erstellen und Backup herunterladen" (oder sichern.md erweitern) — Beleg: SnapshotView.svelte:756; App.svelte:96; BackupView.svelte; de.json:217-386. + +## Unsichere Punkte + +- eintrag-bearbeiten.md:77 „Pflichtfelder … mit Stern markiert": Stern-Markierung im Frontend-Code nicht gefunden (Validierungs-Strings „Pflichtfeld"/„Dieses Feld ist erforderlich" belegt, de.json:1323,1409). Bitte am UI verifizieren. +- anmelden.md:40 „höchstens drei Versuche": kein Limit in LoginPage.svelte gefunden; Backend nicht geprüft. Entweder Backend-Beleg nachliefern oder als unverbindliche Empfehlung umformulieren. +- sichern.md:51-64: Ob Anwender ohne Admin-Rolle den Button „Wiederherstellung starten" überhaupt sehen (Berechtigungs-Gate), ist ungeprüft. Falls nein, ist die Seite für Anwender irreführend. +- ki-nutzen.md:49 „Token-Status unter Kontext-Auslastung": beide Strings belegt (AiChat.svelte:2329,2352), Schachtelung am UI nicht verifiziert. +- Bindestrich in „Sitzung abgelaufen – bitte neu anmelden" (anmelden.md:57) nur visuell mit Locale (de.json:1438) verglichen, nicht byte-geprüft. diff --git a/plans/audit/05-review-einstieg-server.md b/plans/audit/05-review-einstieg-server.md new file mode 100644 index 0000000..c599da2 --- /dev/null +++ b/plans/audit/05-review-einstieg-server.md @@ -0,0 +1,68 @@ +# Review: Einstieg + Server + +- Umfang: `src/content/docs/einstieg/*.md` (4 Dateien), `src/content/docs/server/*.md` (5 Dateien). Alle vollständig gelesen. +- Datum: 2026-10-16. +- Geprüft gegen: `AGENTS.md` §1, `tibi-server/internal/**` (Code), `tibi-svelte-starter` (Compose, Makefile, `api/`, `scripts/`, `.env`), `tibi-admin-nova/.../de.json` (nur Stichworte), Server-HEAD `68b42785`, Starter-HEAD `e3f92ebf`. +- Regel: Nur belegte Fehler stehen als `FEHLER-INHALT`; alles andere als `PRUEFEN` am Ende. + +## Befundtabelle + +| # | Datei:Zeile | Kategorie | Befund (kurz) | Vorschlag | +|---|---|---|---|---| +| 1 | konfiguration.md:21 | FEHLER-INHALT | „`bge-m3` → `EMBEDDING_BGE-M3_*`" ist falsch. `normalizeEnvKeyName` ersetzt `-` durch `_` und uppercaset, Beleg `tibi-server/internal/config/server.go:245-251,437-439`. Korrekt wäre `EMBEDDING_BGE_M3_*`. | Beispiel korrigieren zu `EMBEDDING_BGE_M3_*`; Regel umformulieren („Bindestrich wird zu Unterstrich“). | +| 2 | konfiguration.md:99-105 | FEHLER-INHALT | Gleicher Fehler im Beispielblock: 7× `EMBEDDING_BGE-M3_*` (`TYPE`, `MODELPATH`, `DIMENSIONS`, `DOCUMENTPREFIX`, `QUERYPREFIX`). Keine dieser Variablen greift. Beleg wie #1. | Alle Prefixe zu `EMBEDDING_BGE_M3_*` ändern. | +| 3 | betrieb.md:21 | FEHLER-INHALT | „`mongo` (MongoDB 7)“ — der Starter pinnt `image: gitbase.de/server/mongo:8` (`docker-compose-local.yml`, Service `mongo`). | Auf „MongoDB 8“ ändern. | +| 4 | schnittstellen.md:62 | FEHLER-INHALT | „Alle Antworten sind gzip-komprimiert“ — falsch absolut. Ausgenommen sind `.pdf/.mp4/.jpg/.jpeg/.png` und `/metrics`. Beleg `internal/controller/setup.go:151-154`. | „Alle JSON-Antworten … (ausgenommen Mediendateien und `/metrics`)“. | +| 5 | neues-projekt.md:68,77 | MD-FEHLER | `$CODING_TIBISERVER_URL` ist nirgends definiert: nicht in Starter-`.env`, nicht in der URL-Liste in schnellstart.md:51, in keinem Script. Nur `-tibiserver`-Host, inline gebaut in `scripts/reload-local-tibi.sh:10`. Befehle so nicht kopierbar. | Variable definieren (`.env` + schnellstart.md:51) oder Befehle auf dokumentierten Host umschreiben. | +| 6 | uebersicht.md:36 | MD-FEHLER | „Verifiziert am 68b42785“ ohne Backticks; alle 4 anderen Server-Seiten nutzen `` `68b42785` ``. | Backticks ergänzen. | +| 7 | server/betrieb.md:6, konfiguration.md:6, schnittstellen.md:6, sicherheit.md:6 | MD-FEHLER | Identische 8er-Importzeile (`Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree`), davon pro Seite 3–6 ungenutzt (z. B. betrieb: `Tabs/TabItem/Card/CardGrid/FileTree` ohne Verwendung; schnittstellen: `Aside/Steps/Card/CardGrid/Badge/FileTree` ohne Verwendung). Copy-Paste-Rest. | Je Seite nur importieren, was verwendet wird. | +| 8 | server/*.md:1-4 vs einstieg/*.md:1-4 | MD-FEHLER | Frontmatter inkonsistent: Server-Seiten mit einfachen Quotes (`title: '...'`), Einstieg ohne. | Eine Form wählen (ohne Quotes, wie einstieg). | +| 9 | uebersicht.md:8-14 | MD-FEHLER | Zwei Hinweis-Stile auf einer Seite: Blockquote (`> **Handseite.** …`) plus `:::note`. | Einen Stil wählen (Repo-Konvention: `