From 234f87d408f244b36451e8afb5c82eb12ddde390 Mon Sep 17 00:00:00 2001 From: Lars Date: Sat, 8 Aug 2026 17:35:05 +0200 Subject: [PATCH] V2-Dev-Stand: Skala 1-10, Benefits/Concerns, DEV-Isolation und Gitea-Doku. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bündelt die Neuentwicklung in AssigmentMonitorV2 (eigene Ports/DB), die Umstellung auf numerische Bewertungen, Meeting-Checklisten, KI-Tagging und die geplante Feedback-Kaskade — als Basis für Versionsverwaltung in Gitea. Co-authored-by: Cursor --- .env.example | 16 + .vscode/extensions.json | 5 + CLAUDE.md | 70 ++- docs/DEV_ISOLATION.md | 45 ++ docs/FEEDBACK_CASCADE_PLAN.md | 280 +++++++++ docs/GITEA.md | 115 ++++ docs/HANDOVER.md | 6 +- docs/SCALE_1_TO_10.md | 100 +++ docs/preload/Feedback-Struktur-final.md | 199 ++++++ docs/preload/README.md | 23 + package-lock.json | 531 +++++++++++++++- package.json | 15 +- server/database.ts | 46 +- server/db/crud.ts | 14 +- server/db/queries/appSettings.ts | 118 +++- server/db/queries/assignmentFeedback.ts | 5 +- server/db/queries/assignmentTypes.ts | 9 +- server/db/queries/checklists.ts | 63 ++ server/db/queries/criterionSuggestions.ts | 28 + server/db/queries/feedbackStructure.ts | 444 ++++++++++++- server/db/queries/meetingCategoryRatings.ts | 47 ++ server/db/queries/meetings.ts | 18 +- server/db/tableRegistry.ts | 44 +- server/index.ts | 13 +- server/rpcModules.ts | 6 + server/scripts/preloadFeedbackStructure.ts | 13 + server/scripts/resetDevDatabase.ts | 42 ++ src/components/ScorePicker.tsx | 85 +++ src/config/constants.ts | 243 +++++-- src/db/queries/appSettings.ts | 23 + src/db/queries/assignmentFeedback.ts | 2 + src/db/queries/checklists.ts | 27 + src/db/queries/criterionSuggestions.ts | 6 + src/db/queries/feedbackStructure.ts | 90 +++ src/db/queries/index.ts | 3 + src/db/queries/meetingCategoryRatings.ts | 16 + src/db/queries/meetings.ts | 4 + src/db/rpcClient.ts | 25 +- src/db/seeds/assignmentTypes.ts | 1 + src/db/seeds/feedbackStructureFinal.json | 660 ++++++++++++++++++++ src/db/types.ts | 99 ++- src/hooks/useRatingColorBands.ts | 17 + src/pages/AiPromptConfig.tsx | 224 ++++++- src/pages/AssignmentDetail.tsx | 100 ++- src/pages/AssignmentFeedbackPage.tsx | 468 +++++++++----- src/pages/AssignmentTypeConfig.tsx | 229 ++++++- src/pages/Configuration.tsx | 21 +- src/pages/Evaluation.tsx | 21 +- src/pages/FeedbackDraftPage.tsx | 25 +- src/pages/FeedbackStructureConfig.tsx | 450 ++++++++++++- src/pages/MeetingHistory.tsx | 131 +++- src/pages/RatingScaleConfig.tsx | 144 +++++ src/pages/meeting/AssessmentTab.tsx | 128 ++-- src/pages/meeting/ChecklistTab.tsx | 157 +++++ src/pages/meeting/ConversationTab.tsx | 106 +++- src/pages/meeting/CriterionTagPicker.tsx | 39 +- src/pages/meeting/MeetingView.tsx | 500 ++++++++++++++- src/utils/aiClient.ts | 44 ++ src/utils/aiPrompt.ts | 504 +++++++++++++-- src/utils/criterionOptions.tsx | 27 + src/utils/criterionSuggestion.ts | 61 ++ src/utils/criterionSuggestionPrompt.ts | 160 +++++ src/utils/feedbackStructureImport.ts | 99 +++ src/utils/meetingCategoryScore.ts | 36 ++ src/utils/meetingExport.ts | 74 ++- src/utils/notationParser.tsx | 104 +-- src/utils/pdfExport.tsx | 613 ++++++++++++++++++ src/utils/ratingTrend.ts | 42 +- src/utils/structureExport.ts | 80 +++ tsconfig.server.json | 2 +- vite.config.ts | 67 +- 71 files changed, 7567 insertions(+), 705 deletions(-) create mode 100644 .env.example create mode 100644 .vscode/extensions.json create mode 100644 docs/DEV_ISOLATION.md create mode 100644 docs/FEEDBACK_CASCADE_PLAN.md create mode 100644 docs/GITEA.md create mode 100644 docs/SCALE_1_TO_10.md create mode 100644 docs/preload/Feedback-Struktur-final.md create mode 100644 docs/preload/README.md create mode 100644 server/db/queries/checklists.ts create mode 100644 server/db/queries/criterionSuggestions.ts create mode 100644 server/db/queries/meetingCategoryRatings.ts create mode 100644 server/scripts/preloadFeedbackStructure.ts create mode 100644 server/scripts/resetDevDatabase.ts create mode 100644 src/components/ScorePicker.tsx create mode 100644 src/db/queries/checklists.ts create mode 100644 src/db/queries/criterionSuggestions.ts create mode 100644 src/db/queries/meetingCategoryRatings.ts create mode 100644 src/db/seeds/feedbackStructureFinal.json create mode 100644 src/hooks/useRatingColorBands.ts create mode 100644 src/pages/RatingScaleConfig.tsx create mode 100644 src/pages/meeting/ChecklistTab.tsx create mode 100644 src/utils/aiClient.ts create mode 100644 src/utils/criterionOptions.tsx create mode 100644 src/utils/criterionSuggestion.ts create mode 100644 src/utils/criterionSuggestionPrompt.ts create mode 100644 src/utils/feedbackStructureImport.ts create mode 100644 src/utils/meetingCategoryScore.ts create mode 100644 src/utils/pdfExport.tsx create mode 100644 src/utils/structureExport.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..396f331 --- /dev/null +++ b/.env.example @@ -0,0 +1,16 @@ +# Assignment Monitor V2 — lokale Entwicklungs-Isolation +# Kopie nach `.env` anlegen. Diese Werte dürfen NICHT mit dem Produktivsystem +# (c:\dev\AssigmentMonitor, Ports 5173/4000) kollidieren. + +# Vite-Frontend (Produktiv: 5173) +PORT=5174 + +# Express-RPC-API (Produktiv: 4000) +API_PORT=4001 + +# Vite-Proxy-Ziel → muss zu API_PORT passen +API_URL=http://localhost:4001 + +# SQLite-Dateiname unter server/data/ (Produktiv: assignment-monitor.sqlite3) +# Nur Dateiname, kein Pfad — der Server erzwingt Ablage innerhalb dieses V2-Projekts. +SQLITE_FILENAME=assignment-monitor-v2-dev.sqlite3 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..de106ed --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "syncfusioninc.document-viewer-vscode-extensions" + ] +} \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index e5d9931..7b7304d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,6 +4,8 @@ Progressive Web App zur Live-Bewertung von Capgemini-Trainees (Institutees) wäh **Vollständige Dokumentation:** `docs/` — bei neuer Session zuerst `docs/HANDOVER.md` lesen. +**DEV-Isolation:** Dieses Repo (`AssigmentMonitorV2`) ist von Produktiv (`c:\dev\AssigmentMonitor`) getrennt — Ports **5174/4001**, DB `assignment-monitor-v2-dev.sqlite3`. Regeln: `docs/DEV_ISOLATION.md`. Produktiv-Code und -Daten niemals anfassen. + --- ## Stack @@ -36,6 +38,7 @@ src/ utils/ ratingTrend.ts ← zeitgewichteter Bewertungs-Vorschlag + Trend-Erkennung + weightedAverageScore/weightedAverageRating (genutzt von Evaluation.tsx, AssignmentFeedbackPage.tsx, AssessmentTab.tsx, AssignmentDetail.tsx) aiPrompt.ts ← Prompt-Engine für die KI-Feedback-Generierung (seit 2026-07-07): Platzhalter-Kontext pro Dimension, Rendering, Antwort-Parsing — siehe eigener Abschnitt „KI-Feedback-Generierung" unten + pdfExport.tsx ← PDF-Export (seit 2026-07-14, `@react-pdf/renderer`): Assignment-Report (Gesamtprotokoll + Feedback aller Institutees) und Einzel-Feedback-PDF pro Institutee server/ index.ts ← Express-App, ein Endpunkt POST /api/rpc database.ts ← node:sqlite-Verbindung (server/data/assignment-monitor.sqlite3), Schema aus tableRegistry.ts @@ -146,14 +149,79 @@ MeetingView liest: `const { id, meetingId: meetingIdParam } = useParams()` | Prio | Aufgabe | Datei | |---|---|---| -| M | **Selbstlernendes Tagging (Idee, noch nicht gescoped):** Zeile-zu-Kriterium-Zuordnungen sammeln und daraus beim Tippen automatische Tag-Vorschläge ableiten (ähnliche Formulierungen → gleiches Kriterium). Braucht eigene Design-Session (Ähnlichkeits-/Lernmechanik, Datenbasis, UI). | `src/pages/meeting/CriterionTagPicker.tsx` | | M | **Migration der echten Daten aussteht:** Aktuelle IndexedDB-Daten müssen noch einmalig über Config → Backup → Export (alte Version) exportiert und über Config → Backup → Import (neue, serverbasierte Version) in die SQLite-DB eingespielt werden. Siehe Datenbank-Abschnitt oben. | — | | L | Dexie/IndexedDB-Legacy-Code vollständig entfernen (`src/db/schema.ts`, `src/db/seeds/`) — aktuell bewusst nur stillgelegt, nicht gelöscht | `src/db/schema.ts`, `src/db/seeds/` | | L | Server-seitiges "Seed-if-empty" für Assignment-Typen/Feedback-Struktur (aktuell nur clientseitig vorhanden und nicht mehr wirksam) — nicht dringend, da der Backup-Import denselben Zweck erfüllt | `server/db/queries/` (neu) | | L | SQLite WASM + OPFS Migration — durch den lokalen Server-Ansatz (2026-07-04) überholt/hinfällig | `src/db/schema.ts` | +**Erledigt (2026-07-19): Live-Formulierungshilfe, Beobachter-Fokus, Meeting-Checkliste umgesetzt** (Konzept siehe Eintrag unten, dort auch die Design-Begründungen). Neue Dateien: `src/utils/criterionOptions.tsx` (aus `FeedbackStructureConfig.tsx` extrahiertes `criterionOptionGroups()`, jetzt auch von `AssignmentTypeConfig.tsx` genutzt), `server/db/queries/checklists.ts` + `src/db/queries/checklists.ts` (neues RPC-Modul `checklists`), `src/pages/meeting/ChecklistTab.tsx` (neuer dritter Meeting-Tab, nur sichtbar wenn `PhaseTemplate.hasChecklist`). `AssignmentTypeConfig.tsx` bekam pro Phase eine „Checkliste"-Checkbox + aufklappbaren Punkte-Editor (Label, Scope-Auswahl, bei `perInstitutee` optionales Kriterium-Dropdown). `deletePhaseTemplate`/`deleteAssignmentType` cascaden jetzt zusätzlich über `checklistItemDefs` (gleiches Verteidigungsprinzip wie bei `deleteFeedbackCriterionItem`). Live-Formulierungshilfe: neuer State `corpus` in `MeetingView.tsx` (einmal pro Meeting-Load geholt, nicht pro Tastendruck), debounced (~800ms) Aufruf von `findSimilarTaggedLines()` sowohl in `ConversationTab.tsx` (aktive Notiz) als auch für die allgemeinen Notizen — rein lesendes „💭 Ähnliche frühere Notizen"-Panel. Fokus-Übersicht als neue aufklappbare „📊 Fokus-Übersicht"-Box in `FeedbackStructureConfig.tsx` (Top 5 Kriterien nach `getCriterionUsageMap()`-Verwendung, inkl. `learnedPatternHints` als Kontext). Verifiziert: `npx tsc -b` fehlerfrei (dabei einen fehlenden `hasChecklist`-Wert im toten Dexie-Seed-Code `src/db/seeds/assignmentTypes.ts` nachgezogen, da dieser weiterhin vom Client-Build mitkompiliert wird); neue RPC-Endpunkte (`checklists.listChecklistItemDefsForPhaseTemplate`, `assignmentTypes.listPhaseTemplates`) direkt gegen die laufende Dev-Instanz getestet — Schema-Migration (neue Spalte `hasChecklist`, neue Tabellen `checklistItemDefs`/`checklistResponses`) griff automatisch ohne manuellen Server-Neustart. Manueller Ausfüll-Test einer Checkliste in einem echten Meeting (inkl. Prüfung, dass verknüpfte Punkte korrekt in `Assessment` landen) steht noch aus. + +**Nachtrag (2026-07-19, nach erstem echten Nutzungstest):** Drei Korrekturen an der Checkliste, nachdem sich die ursprüngliche Einschränkung in der Praxis als zu eng erwies: +1. **Kriterium-Verknüpfung jetzt für beide Scopes möglich** (vorher nur `perInstitutee`). Bei `scope: meetingWide` + verknüpft schreibt `MeetingView.tsx::saveChecklistResponse` dieselbe Bewertung/Notiz per Fan-out in `Assessment` **für jeden aktuellen Institutee gleichzeitig** — ein meeting-weiter Checkpunkt gilt für alle Beteiligten gleichermaßen. Löst das ursprüngliche Problem („`Assessment` verlangt `instituteeId`") durch Duplizieren statt durch Ausschluss. +2. **`ChecklistResponse` ist jetzt immer die Quelle für die Checkliste-UI selbst**, unabhängig von Kriterium-Verknüpfung (vorher las/schrieb die UI bei verknüpften Punkten direkt `Assessment`, was zu einem unsauberen Round-Trip führte, sobald die Notiz auch das Checklisten-Label enthalten sollte). Bei Verknüpfung spiegelt `saveChecklistResponse()` zusätzlich **einseitig** (Checkliste → Assessment, nie zurück) nach `Assessment`, inkl. komponierter Notiz `Checkliste „