feat: MCP-Tools für Fach-/Kompetenzverwaltung + Kompetenzzuordnung zu Lessons (Nutzer-Nachtrag)

Neue CompetencyTools.cs: create/update/delete_subject, create/update/delete_competency_domain,
add/update/remove_competency_item, get_subjects, get_competency_catalog. delete_subject und
delete_competency_domain als weitere Destructive-Ausnahmen neben delete_lesson (kein Papierkorb).

Lesson bekommt ein neues Competencies-Feld (analog zu Unit.Competencies) sowie
add_lesson_competency/remove_lesson_competency in LessonPlanTools.cs.

ICompetencyDomainRepository um GetBySubject() erweitert, um den Katalog eines Fachs ohne
bekannte Klassenstufe abzufragen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-12 20:01:23 +02:00
co-authored by Claude Sonnet 5
parent 19aa302487
commit 3f8813df51
13 changed files with 671 additions and 21 deletions
+33
View File
@@ -2723,6 +2723,39 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`:
[McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (belegt den
`[CallerMemberName]`-Mechanismus ohne echtes UI).
- [x] **4.5.33** Fach-/Kompetenzkatalog-Verwaltung + Kompetenzzuordnung zu Einzelstunden über MCP
(2026-09-12, Nutzer-Nachtrag): Nutzer möchte einem KI-Agenten die volle Verwaltung der
Fächer (`Subject`) und des Kompetenzkatalogs (`CompetencyDomain`/`CompetencyItem`, siehe
Kompetenzen-Tab in den Einstellungen, Kapitel 8) überlassen — anlegen, ändern, löschen, "einfach
alles was dazugehört" — sowie das Zuordnen von Kompetenzcodes zu einzelnen Stunden.
- Neue [CompetencyTools.cs](LehrerApp.Desktop/Services/Mcp/Tools/CompetencyTools.cs):
`get_subjects`/`get_competency_catalog` (Read), `create_subject`/`update_subject`/
`create_competency_domain`/`update_competency_domain`/`add_competency_item`/
`update_competency_item`/`remove_competency_item` (Write, je mit Bestätigung), sowie
`delete_subject`/`delete_competency_domain` als **weitere, gezielte Ausnahmen** von der
"v1 ohne Lösch-Tools"-Regel neben `delete_lesson` (4.5.31) — beide Repositories löschen
endgültig ohne Papierkorb, deshalb `Destructive = true` und Aufnahme in
`McpToolScope.AllowedDestructiveWriteTools` statt der normalen Write-Liste.
`delete_subject` nutzt die bereits bestehende Verwendungsprüfung in
`SubjectRepository.Delete` (schlägt fehl, wenn noch eine Lerngruppe oder ein
Kompetenzkatalog das Fach referenziert) — keine neue Validierung nötig.
- `ICompetencyDomainRepository` um `GetBySubject(Guid)` erweitert (alle Klassenstufen eines
Fachs), da bisher jede Katalog-Abfrage im gesamten Code eine bekannte `gradeLevel` verlangte
(`GetBySubjectAndGrade`) — für `get_competency_catalog` ohne Klassenstufen-Filter fehlte
diese Möglichkeit. `CompetencyDomainRepository`/`FakeCompetencyDomains` entsprechend ergänzt.
- **Kompetenzzuordnung zu Lessons:** `Lesson` bekommt ein neues Feld `Competencies`
(`List<string>`, analog zu `Unit.Competencies`) sowie zwei neue Tools in
[LessonPlanTools.cs](LehrerApp.Desktop/Services/Mcp/Tools/LessonPlanTools.cs):
`add_lesson_competency`/`remove_lesson_competency`. Bewusst granular statt eines
"set_lesson_competencies", das die ganze Liste ersetzt — dieselbe Race-Condition-Überlegung
wie bei den Verlaufsplan-Phasen (4.5.28). Bewusst auf **Stundenebene**, nicht je Phase — die
in TODO.md 4.5.8 beschriebene feinere Zuordnung je Verlaufsplan-Phase bleibt offen und ist
von dieser Änderung unabhängig; `Lesson.Competencies` ist ein eigenständiges, gröberes Feld.
- `FakeSubjects` (Tests) von No-Op-Stub auf echtes In-Memory-CRUD (inkl. Namens-Dubletten-Prüfung
analog zu `SubjectRepository.Save`) umgestellt, da bisher kein Test tatsächlich über MCP
schrieb und ein reiner No-Op genügte.
- 16 neue Tests in [McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (jetzt 57).
**Wichtige Abweichung von der ursprünglichen Planung (5.2):** Vor der Umsetzung zeigte sich,
dass 5.2 wie ursprünglich beschrieben eine zweite, parallele Fehlzeiten-Erfassung neben dem
bereits bestehenden Anwesenheits-Tracking aus Kapitel 3 (`ParticipationEntry.Attendance`,