diff --git a/.claude/docs/PROJECT_STATUS.md b/.claude/docs/PROJECT_STATUS.md new file mode 100644 index 0000000..12b7b3d --- /dev/null +++ b/.claude/docs/PROJECT_STATUS.md @@ -0,0 +1,218 @@ +# Shinkan Jinkendo - Projekt-Status + +**Stand:** 2026-04-27 +**Version:** 0.4.0 +**Branch:** develop +**Letzter Commit:** e8eba57 + +--- + +## Executive Summary + +**Aktueller Meilenstein:** MediaWiki Import - Skills Complete ✅ + +**Letzte Änderungen:** +- ✅ Migration 022: Skills-Schema komplett (skill_main_categories, focus_areas, level_definitions) +- ✅ Migration 023: 69 Skills importiert mit vollständiger Kategorisierung +- ✅ Duplikat-Bereinigung und Fokusbereich-Zuordnung (karate/universal) +- ✅ Scripts erstellt (parse_matrix.py, generate_migration_023_direct.py) + +**Nächste Schritte:** +1. Test: Übungs-Import mit neuen Skills +2. Optional: Level-Definitionen (1-5) aus Matrix extrahieren +3. Admin-UI für Skill-Kategorien (CRUD) +4. Deployment nach Prod vorbereiten + +--- + +## Deployed Migrations (Dev: 023, Prod: TBD) + +| Migration | Beschreibung | Dev | Prod | +|-----------|--------------|-----|------| +| 001-017 | Initial Schema + Exercise System | ✅ | ✅ | +| 018 | Wiki Import Tracking | ✅ | ✅ | +| 019 | Exercises Optional Fields | ✅ | ✅ | +| 020 | Exercise Skills UNIQUE Constraint | ✅ | 🔲 | +| 021 | ~~Import Skills from Matrix~~ (DEPRECATED) | ⚠️ | ❌ | +| **022** | **Skills Schema Complete** | ✅ | 🔲 | +| **023** | **Skills Complete Import (69 Skills)** | ✅ | 🔲 | + +--- + +## Aktuelle Datenbank-Stats (Dev) + +``` +Skills: 69 (32 KARATE + 37 ALLGEMEINE) +Skill Main Categories: 2 (KARATE Fähigkeiten, ALLGEMEINE sportliche Fähigkeiten) +Skill Categories: 9 (Kihon, Kumite, Kata, Selbstverteidigung, Koordination, ...) +Übungen (MediaWiki): 221 (importiert, mit Skill-Zuordnungen) +Focus Areas: 5 +Style Directions: 15 +Target Groups: 12 +``` + +--- + +## Feature-Status + +### ✅ Deployed Features (Dev) + +**Kern-System:** +- [x] Auth & Profile Management +- [x] Organisation (Clubs, Divisions, Groups) +- [x] Kataloge (Focus Areas, Styles, Target Groups - M:N) + +**Übungen:** +- [x] CRUD (Create, Read, Update, Delete) +- [x] M:N Beziehungen (Focus Areas, Styles, Target Groups, Skills) +- [x] Varianten & Medien +- [x] Suche & Filter (erweitert) +- [x] Exercise Blocks (Bausteine) +- [x] Saved Searches + +**MediaWiki Import:** +- [x] Import-Tracking (wiki_import_log, wiki_import_references) +- [x] Übungs-Import via API (221 Übungen) +- [x] Skills via Migration 023 (69 Skills mit Kategorisierung) +- [x] Duplikat-Erkennung +- [x] Reimport-Flag + +**Skills-System:** +- [x] Hierarchisches Schema (Haupt-/Unterkategorien) +- [x] Fokusbereich-Zuordnung (karate/universal) +- [x] Exercise-Skill Assignments mit Levels (1-5) +- [x] Level-Definitionen-Schema (noch nicht gefüllt) + +**Admin-UI:** +- [x] Focus Areas, Styles, Target Groups CRUD +- [x] Hierarchie-View (Tree) +- [x] M:N Zuordnungen (Checkbox-Matrix) +- [x] MediaWiki Import-UI +- [x] Import-Log-Ansicht + +### 🔲 In Arbeit + +**Skills:** +- [ ] Admin-UI für Skill-Kategorien (CRUD) +- [ ] Level-Definitionen aus Matrix extrahieren (optional) +- [ ] Skills-Beschreibungen aus Wiki importieren +- [ ] Skill-Filter in Übungssuche + +**Training Planning:** +- [ ] Training Units (CRUD) +- [ ] Exercise Assignment zu Units +- [ ] Kalender-View + +**Frontend:** +- [ ] Responsive Design (Mobile) +- [ ] Dark Mode +- [ ] Offline-Modus (PWA) + +### 📋 Geplant (Backlog) + +**KI-Features:** +- [ ] Trainingsplan-Generator (basierend auf Fähigkeiten-Level) +- [ ] Übungs-Empfehlungen +- [ ] Reifegradmodelle (automatische Bewertung) + +**Import/Export:** +- [ ] Trainingsmethoden-Import aus Wiki +- [ ] Bulk-Export (Excel/PDF) +- [ ] Import aus anderen Systemen + +**Kollaboration:** +- [ ] Übungs-Review-Workflow +- [ ] Kommentare & Bewertungen +- [ ] Teilen & Favoriten + +--- + +## Technische Schulden + +| Bereich | Issue | Priorität | +|---------|-------|-----------| +| Skills | Migration 021 löschen (faulty) | Niedrig | +| Import | Reimport-Flag-Bug (wird manchmal als false gespeichert) | Mittel | +| Import | DNS-Fehler sporadisch (temporär, retry hilft) | Niedrig | +| DB | 9 Duplikate in DB bereinigen (aus Migration 021) | Niedrig | + +--- + +## Lessons Learned (Session 2026-04-27) + +**✅ Funktioniert gut:** +- Direkte SQL-Generierung aus Matrix (ohne CSV-Zwischenschritt) +- UTF-8 Encoding explizit setzen (sys.stdout.reconfigure) +- Duplikat-Bereinigung nach fachlicher Logik (nicht automatisch) +- Verifikation-Queries direkt in Migration einbauen + +**❌ Vermeiden:** +- CSV als Zwischenschritt (Encoding-Probleme) +- Automatisches Parsing ohne manuelle Duplikat-Prüfung +- Fehlende Schema-Erweiterung vor Daten-Import +- Unvollständige "Schnellschuss"-Migrationen (wie 021) + +**📚 Best Practices:** +- Schema VOR Daten importieren +- Cleanup VOR Insert (DELETE old data) +- Verifikation NACH Insert (count, Verteilung) +- Produktionsreifer Import: Vollständig oder gar nicht + +--- + +## Deployment-Status + +### Dev-System (192.168.2.49:8098/3098) + +``` +Branch: develop +Migrations: 023 (latest) +Skills: 69 ✅ +Übungen: 221 ✅ +Status: Stabil, bereit für Testing +``` + +### Prod-System (TBD) + +``` +Branch: main +Migrations: 019 (veraltet) +Skills: 0 +Übungen: 0 +Status: Wartet auf Migration 020-023 Deployment +``` + +**Deployment-Plan:** +1. ✅ Dev-Testing abgeschlossen (Migration 022+023) +2. 🔲 Test: Übungs-Import mit neuen Skills +3. 🔲 Code-Review + QA +4. 🔲 Prod-Deployment (Migration 020-023) +5. 🔲 Daten-Import auf Prod (Übungen + Skills) +6. 🔲 Smoke-Tests auf Prod + +--- + +## Dokumentation-Status + +| Dokument | Pfad | Stand | Status | +|----------|------|-------|--------| +| Database Schema | `technical/DATABASE_SCHEMA.md` | 2026-04-27 | ✅ Aktuell | +| Domain Model | `functional/DOMAIN_MODEL.md` | 2026-04-27 | ✅ Aktuell | +| MediaWiki Import Spec | `technical/MEDIAWIKI_IMPORT_SPEC.md` | 2026-04-27 | ✅ Aktuell | +| Session Handover | `.claude/handover/session-2026-04-27-skills-complete.md` | 2026-04-27 | ✅ Komplett | +| API Reference | `technical/EXERCISES_API_SPEC.md` | 2026-04-24 | ⚠️ Veraltet | +| Frontend Routing | `technical/EXERCISES_FRONTEND_ROUTING.md` | 2026-04-23 | ⚠️ Veraltet | + +--- + +## Team & Kontakte + +**Entwicklung:** Claude Code +**Product Owner:** Lars +**Git Repository:** http://192.168.2.144:3000/Lars/shinkan-jinkendo +**Wiki (Datenquelle):** https://karatetrainer.net + +--- + +**Letzte Aktualisierung:** 2026-04-27 +**Nächstes Review:** Nach Prod-Deployment diff --git a/.claude/docs/functional/DOMAIN_MODEL.md b/.claude/docs/functional/DOMAIN_MODEL.md index e690c4c..b5a17bc 100644 --- a/.claude/docs/functional/DOMAIN_MODEL.md +++ b/.claude/docs/functional/DOMAIN_MODEL.md @@ -1,8 +1,8 @@ # Shinkan Jinkendo - Fachliches Domänenmodell -**Version:** 0.3.4 -**Stand:** 2026-04-23 (Migration 009: Target Groups M:N Refactoring) -**Basis:** `shinkan_anforderungsdokument_entwurf.md` +**Version:** 0.4.0 +**Stand:** 2026-04-27 (Migration 023: Skills Complete Import) +**Basis:** `shinkan_anforderungsdokument_entwurf.md` + Fähigkeitsmatrix --- @@ -27,6 +27,27 @@ Dieses Dokument beschreibt die **fachliche Datenstruktur** von Shinkan Jinkendo. **Konsequenz:** Ein globaler Katalog, aber kontextabhängige Ausprägung über Reifegradmodelle. +**🆕 Hierarchische Struktur (ab Migration 022):** +``` +Haupt-Kategorie (KARATE / ALLGEMEINE) + └─ Unter-Kategorie (Kihon, Kumite, Kondition, etc.) + └─ Fähigkeit + └─ Level-Definitionen (1-5) +``` + +**🆕 Fokusbereich-Zuordnung (ab Migration 022):** +- **Karate-spezifisch** (`focus_areas: ["karate"]`) + - Beispiele: Kata Ablauf, Kihon, Bunkai, Dachi Waza + - Nur relevant für Karate-Training + +- **Universal** (`focus_areas: ["universal"]`) + - Beispiele: Maximalkraft, Konzentration, Deeskalation, Flexibilität + - Relevant für ALLE Trainingsbereiche (Karate, Selbstverteidigung, Gewaltschutz) + +**Später möglich:** Mehrfachzuordnung +- `["karate", "selbstverteidigung"]` - Fähigkeit in beiden Bereichen relevant +- `["karate", "gewaltschutz"]` - etc. + ### 2. Mehrfachzuordnung von Übungen (§10.7) **Prinzip:** Eine Übung kann mehreren Bereichen GLEICHZEITIG zugeordnet sein. @@ -188,6 +209,161 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo --- +## Fähigkeiten-Domäne (§8.3, erweitert ab Migration 022+023) + +### Fähigkeiten-Hierarchie + +**🆕 3-Ebenen-Struktur (ab Migration 022):** + +``` +Haupt-Kategorie (2 Stück) +├─ KARATE Fähigkeiten +│ ├─ Kihon (Unterkategorie) +│ │ ├─ Dachi Waza (Fähigkeit, Level 1-5) +│ │ ├─ Uke Waza +│ │ └─ ... +│ ├─ Kumite +│ ├─ Kata +│ └─ Selbstverteidigung +│ +└─ ALLGEMEINE sportliche Fähigkeiten + ├─ Koordination (Unterkategorie) + │ ├─ Orientierung (Fähigkeit, Level 1-5) + │ └─ ... + ├─ Kondition + ├─ Kognition + ├─ Soziale Fähigkeiten + └─ Psychische Fähigkeiten +``` + +### Haupt-Kategorien + +**1. KARATE Fähigkeiten** (`focus_areas: ["karate"]`) +- **Anzahl:** 32 Skills +- **Bedeutung:** Karate-spezifische Techniken und Fähigkeiten +- **Verwendung:** Nur für Karate-Training relevant +- **Unterkategorien:** Kihon, Kumite, Kata, Selbstverteidigung + +**2. ALLGEMEINE sportliche Fähigkeiten** (`focus_areas: ["universal"]`) +- **Anzahl:** 37 Skills +- **Bedeutung:** Universelle sportliche und mentale Fähigkeiten +- **Verwendung:** Für ALLE Trainingsbereiche einsetzbar +- **Unterkategorien:** Koordination, Kondition, Kognition, Soziale Fähigkeiten, Psychische Fähigkeiten + +### Unterkategorien + +#### KARATE Fähigkeiten + +**Kihon (Grundtechniken) - 10 Skills:** +- Dachi Waza (Standtechniken) +- Uke Waza (Blocktechniken) +- Zuki Waza (Stoßtechniken) +- Uchi Waza (Schlagtechniken) +- Geri Waza (Tritttechniken) +- Nage Waza (Wurftechniken) +- Nukite Waza (Fingerstichtechniken) +- Ken Waza (Fausttechniken) +- Hüfteinsatz +- Kime (Fokussierung) + +**Kumite (Kampf) - 10 Skills:** +- Beinarbeit +- Distanzkontrolle +- Angriff +- Abwehr Konter +- Präzision +- Antizipation +- Timing +- Taktik +- Fokus +- Mentale Stärke + +**Kata (Formen) - 8 Skills:** +- Technik Kombination +- Kata Ablauf +- Bunkai (Anwendung) +- Oyo (Variation) +- Henka (Veränderung) +- Kakushi (Versteckte Techniken) +- Kata Atmung +- Kata Rhythmus + +**Selbstverteidigung - 4 Skills:** +- Gefahrenbewustsein +- Selbstbehauptung +- Selbstschutz +- Gefahrenabwehr + +#### ALLGEMEINE sportliche Fähigkeiten + +**Koordination - 7 Skills:** +- Orientierung +- Differenzierung +- Kopplung +- Gleichgewicht +- Rhythmisierung +- Reaktion +- Umstellung + +**Kondition - 15 Skills:** +- Kraftfähigkeiten: Maximalkraft, Schnellkraft, Reaktivkraft, Kraftausdauer, Muskelaufbau +- Schnelligkeitsfähigkeiten: Reaktionsschnelligkeit, Bewegungsschnelligkeit, Handlungsschnelligkeit, Schnelligkeitsausdauer +- Ausdauerfähigkeiten: Grundlagenausdauer, Aerobe Ausdauer, Anaerobe Ausdauer +- Regenerationsfähigkeiten: Regenerationsfähigkeit, Ermüdungswiderstandsfähigkeit +- Beweglichkeit: Flexibilität + +**Kognition - 5 Skills:** +- Aufmerksamkeit +- Wahrnehmung +- Urteilsvermögen +- Merkfähigkeit +- Lernfähigkeit + +**Psychische Fähigkeiten - 6 Skills:** +- Selbstvertrauen +- Konzentration +- Emotionale Kontrolle +- Motivation +- Stressresistenz +- Stressregulation + +**Soziale Fähigkeiten - 4 Skills:** +- Deeskalation +- Selbstdisziplin +- Toleranz +- Fairness + +### Level-Definitionen (Reifegradmodell) + +**Konzept:** Jede Fähigkeit hat 5 Stufen mit konkreten Beschreibungen. + +**Struktur (noch nicht vollständig implementiert):** +- **Level 1:** Einsteiger - Grundlegende Ausführung +- **Level 2:** Grundlagen - Kontrollierte Ausführung +- **Level 3:** Aufbau - Sichere Anwendung +- **Level 4:** Fortgeschritten - Variable Anwendung +- **Level 5:** Experte - Meisterhafte Beherrschung + +**Beispiel (Dachi Waza - Standtechniken):** +- Level 1: Stabiler Stand mit Schwerpunkt und richtiger Ausrichtung +- Level 2: Korrekter Stand mit guter Balance in verschiedenen Positionen +- Level 3: Fließender Wechsel zwischen Ständen mit Kontrolle +- Level 4: Dynamische Stand-Variationen unter Belastung +- Level 5: Perfekte Stand-Technik in allen Kampfsituationen + +**Datenbankstruktur:** +```sql +skill_level_definitions ( + skill_id, + level (1-5), + description (Text aus Fähigkeitsmatrix) +) +``` + +**Status:** Schema vorhanden (Migration 022), Daten noch nicht importiert (optional für spätere Phase). + +--- + ## Übungs-Zuordnungslogik (§10) ### Primäre vs. Sekundäre Zuordnung @@ -223,19 +399,23 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo **Beispiel:** "Kumite-Drill" **Hauptfähigkeiten:** -- Distanzgefühl (Intensität: hoch) -- Timing (Intensität: hoch) +- Distanzkontrolle (Kumite, target_level: 3, intensity: hoch) +- Timing (Kumite, target_level: 3, intensity: hoch) **Nebenfähigkeiten:** -- Beinarbeit (Intensität: mittel) -- Reaktionsfähigkeit (Intensität: mittel) +- Beinarbeit (Kumite, target_level: 2, intensity: mittel) +- Reaktion (Koordination, target_level: 2, intensity: mittel) **Attribute pro Fähigkeitsbezug:** - is_primary (Haupt- oder Nebenfähigkeit) - intensity (niedrig/mittel/hoch) -- development_contribution (Entwicklungsbeitrag) -- required_level (Voraussetzung) -- target_level (Ziel-Level) +- required_level (Voraussetzung, 1-5) +- target_level (Ziel-Level, 1-5) + +**🆕 Fokusbereich-Filterung:** +- Bei Übungen mit Fokusbereich "Karate" sollten primär KARATE-Fähigkeiten zugeordnet werden +- ALLGEMEINE Fähigkeiten können als Nebenfähigkeiten hinzugefügt werden +- Bei universellen Übungen (Selbstverteidigung, Gewaltschutz) bevorzugt ALLGEMEINE Fähigkeiten ### Trainingscharakter (§10.7) @@ -314,12 +494,45 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo - Offiziell (Standardinhalte) **Zusätzlich:** Thematische Einschränkungen -- Karate-Inhalte +- Karate-Inhalte (nur Übungen mit `focus_areas: ["karate"]`) - Selbstverteidigungs-Inhalte - Gewaltschutz-Inhalte --- +## MediaWiki Import (ab Migration 018) + +### Import-Typen + +**1. Übungen** (`import_type: exercise`) +- Quelle: https://karatetrainer.net `Kategorie:Übungen` +- Import-Modus: Vollständig mit Skill-Zuordnungen +- Status: ✅ Produktiv (221 Übungen importiert) + +**2. Fähigkeiten** (`import_type: skill`) +- Quelle: https://karatetrainer.net `Kategorie:Fähigkeitsbeschreibung` +- Import-Modus: DEPRECATED - Nutze Migration 023 stattdessen +- Status: ⚠️ Migration 021 fehlerhaft, ersetzt durch Migration 023 + +**3. Trainingsmethoden** (`import_type: method`) +- Quelle: https://karatetrainer.net `Kategorie:Methodenbeschreibung` +- Import-Modus: Vollständig +- Status: 🔲 Noch nicht implementiert + +### Import-Tracking + +**Duplikat-Erkennung:** +- Über `wiki_import_references` Tabelle +- Verknüpfung `wiki_page_id` → `local_id` +- Reimport aktualisiert bestehende Einträge + +**Import-Metadaten:** +- `import_source = 'mediawiki'` +- `import_id` = Wiki-Seitentitel +- `wiki_page_id` = MediaWiki interne Page-ID + +--- + ## Admin-Workflows ### Fokusbereich anlegen @@ -344,7 +557,7 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo - Ziel-Fokusbereich existiert - Keine Namenskonflikte 5. System aktualisiert: - - `training_styles.focus_area_id` + - `style_directions.focus_area_id` - Alle abhängigen Zielgruppen bleiben erhalten 6. System loggt Änderung 7. Erfolg-Meldung @@ -358,7 +571,7 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo 2. Klickt "Löschen" 3. System prüft Abhängigkeiten: ```sql - SELECT COUNT(*) FROM training_styles WHERE focus_area_id = :id + SELECT COUNT(*) FROM style_directions WHERE focus_area_id = :id SELECT COUNT(*) FROM exercise_focus_areas WHERE focus_area_id = :id ``` 4. **Falls verwendet:** @@ -396,15 +609,15 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo ## Nächste Schritte -- [ ] Hierarchie-UI Wireframes erstellen -- [ ] Admin-CRUD-Endpoints spezifizieren -- [ ] Cascade-Logik detaillieren -- [ ] Umrouten-Workflows implementieren -- [ ] Migration 008 Entwurf finalisieren -- [ ] Tests für alle Admin-Operationen +- [ ] Level-Definitionen aus Fähigkeitsmatrix extrahieren (optional) +- [ ] Skills-Beschreibungen aus Wiki importieren (Migration 024) +- [ ] Admin-UI für Fähigkeiten-Kategorien (CRUD) +- [ ] Skill-Filter in Übungssuche integrieren +- [ ] Reifegradmodelle definieren (Kombination Fokusbereich + Stil + Zielgruppe) +- [ ] KI-Unterstützung für Trainingsplanung (basierend auf Fähigkeiten-Level) --- -**Letzte Aktualisierung:** 2026-04-23 +**Letzte Aktualisierung:** 2026-04-27 **Verantwortlich:** Claude Code **Review:** Pending diff --git a/.claude/docs/technical/DATABASE_SCHEMA.md b/.claude/docs/technical/DATABASE_SCHEMA.md index df77f88..f87cfba 100644 --- a/.claude/docs/technical/DATABASE_SCHEMA.md +++ b/.claude/docs/technical/DATABASE_SCHEMA.md @@ -1,8 +1,8 @@ # Shinkan Jinkendo - Datenbank-Schema (Technisch) -**Version:** 0.3.4 -**Stand:** 2026-04-23 -**Aktuell deployed:** Migration 009 (Target Groups M:N Refactoring) +**Version:** 0.4.0 +**Stand:** 2026-04-27 +**Aktuell deployed:** Migration 023 (Skills Complete Import) --- @@ -26,55 +26,140 @@ Dieses Dokument beschreibt die **technische Datenbankstruktur** von Shinkan Jink | 006 | 2026-04-21 | Training Planning | ✅ Deployed | | 007 | 2026-04-22 | Exercise Catalogs (idempotent) | ✅ Deployed | | 008 | 2026-04-23 | M:N Exercise Relations + Hierarchical Catalogs | ✅ Deployed | -| 009 | 2026-04-23 | **Target Groups M:N Refactoring** (BREAKING) | ✅ Deployed | +| 009 | 2026-04-23 | Target Groups M:N Refactoring (BREAKING) | ✅ Deployed | +| 010 | 2026-04-23 | Rename training_styles to style_directions | ✅ Deployed | +| 011 | 2026-04-23 | Create Training Types | ✅ Deployed | +| 012 | 2026-04-23 | Exercise Training Characters + Trainer Contexts | ✅ Deployed | +| 013 | 2026-04-23 | Training Types Focus Area | ✅ Deployed | +| 014 | 2026-04-24 | Variant Progression Search Legacy | ✅ Deployed | +| 016 | 2026-04-24 | Saved Searches | ✅ Deployed | +| 017 | 2026-04-24 | Exercise Blocks | ✅ Deployed | +| 018 | 2026-04-24 | Wiki Import Tracking | ✅ Deployed | +| 019 | 2026-04-24 | Exercises Optional Fields (goal/execution nullable) | ✅ Deployed | +| 020 | 2026-04-27 | Exercise Skills UNIQUE Constraint | ✅ Deployed | +| 021 | 2026-04-27 | ~~Import Skills from Matrix~~ (DEPRECATED) | ⚠️ Faulty | +| **022** | **2026-04-27** | **Skills Schema Complete (BREAKING)** | ✅ Deployed | +| **023** | **2026-04-27** | **Skills Complete Import (69 Skills)** | ✅ Deployed | --- -## Migration 009: Target Groups M:N Refactoring (BREAKING CHANGE) +## Migration 022: Skills Schema Complete (BREAKING CHANGE) -**Problem:** Zielgruppen waren hierarchisch an Trainingsstile gebunden (1:N via FK `training_style_id`). -**Lösung:** M:N Beziehung über Junction-Tabelle `training_style_target_groups`. +**Problem:** Skills hatten keine Kategorisierung (Haupt-/Unterkategorie, Fokusbereich). +**Lösung:** Vollständiges hierarchisches Schema für produktionsreifen Import. -**Änderungen:** -- ❌ **Entfernt:** `target_groups.training_style_id` (FK constraint + column) -- ✅ **Neu:** `training_style_target_groups` Junction-Tabelle -- ✅ **Migriert:** Alte Zuordnungen zu M:N (alle mit `is_primary = true`) -- ✅ **Architektur:** Eine Zielgruppe kann mehreren Stilen zugeordnet sein - -**Neue Struktur:** +**Neue Tabellen:** ```sql --- Global unabhängige Zielgruppen (KEINE training_style_id mehr) -target_groups ( - id, name, description, min_age, max_age, - sort_order, status, created_at, updated_at +-- Haupt-Kategorien (KARATE / ALLGEMEINE) +skill_main_categories ( + id SERIAL PRIMARY KEY, + name VARCHAR(200) UNIQUE NOT NULL, -- "KARATE Fähigkeiten" / "ALLGEMEINE sportliche Fähigkeiten" + slug VARCHAR(50) UNIQUE NOT NULL, -- "karate" / "allgemeine" + description TEXT, + sort_order INT, + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() ) --- M:N Junction-Tabelle -training_style_target_groups ( +-- Level-Definitionen (1-5 Beschreibungen aus Fähigkeitsmatrix) +skill_level_definitions ( id SERIAL PRIMARY KEY, - training_style_id INT REFERENCES training_styles(id) ON DELETE CASCADE, - target_group_id INT REFERENCES target_groups(id) ON DELETE CASCADE, - is_primary BOOLEAN DEFAULT false, + skill_id INT NOT NULL REFERENCES skills(id) ON DELETE CASCADE, + level INT NOT NULL CHECK (level BETWEEN 1 AND 5), + description TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW(), - UNIQUE(training_style_id, target_group_id) + updated_at TIMESTAMP DEFAULT NOW(), + UNIQUE (skill_id, level) ) ``` -**Backend API:** 5 neue Endpoints: -- `GET /api/training-style-target-groups` (Liste mit Filtern + Enrichment) -- `POST /api/training-style-target-groups` (Upsert-Logik) -- `PUT /api/training-style-target-groups/{id}` (is_primary Flag) -- `DELETE /api/training-style-target-groups/{id}` -- `GET /api/training-styles/hierarchy` (Hierarchische Struktur für Tree-View) +**Erweiterte Tabellen:** +```sql +-- skill_categories erweitert +ALTER TABLE skill_categories ADD COLUMN slug VARCHAR(50); +ALTER TABLE skill_categories ADD COLUMN main_category_id INT REFERENCES skill_main_categories(id); +ALTER TABLE skill_categories ADD CONSTRAINT skill_categories_slug_unique UNIQUE (slug); -**Frontend:** -- Admin-UI Tab "Hierarchie" (Tree-View: Fokusbereich → Stil → Zielgruppen) -- Admin-UI Tab "Zuordnungen" (Checkbox-Matrix für M:N) -- Tab "Zielgruppen" überarbeitet (global, ohne training_style_id Dropdown) +-- skills erweitert +ALTER TABLE skills ADD COLUMN main_category_id INT REFERENCES skill_main_categories(id); +ALTER TABLE skills ADD COLUMN focus_areas JSONB DEFAULT '[]'::jsonb; +``` + +**Indizes:** +- `idx_skills_main_category_id` +- `idx_skills_category_id` +- `idx_skill_categories_main_category_id` +- `idx_skill_level_definitions_skill_id` + +**Struktur:** +``` +skill_main_categories (Hauptkategorie) + └─ skill_categories (Unterkategorie) + └─ skills (Fähigkeit) + └─ skill_level_definitions (Level 1-5 Beschreibungen) +``` --- -## Kern-Entitäten (Stand Migration 007) +## Migration 023: Skills Complete Import + +**Quelle:** Fähigkeitsmatrix (https://karatetrainer.net/index.php?title=Fähigkeitsmatrix) + +**Importiert:** +- **69 Skills** mit vollständiger Kategorisierung +- **2 Haupt-Kategorien:** KARATE Fähigkeiten, ALLGEMEINE sportliche Fähigkeiten +- **9 Unterkategorien:** Kihon, Kumite, Kata, Selbstverteidigung, Koordination, Kondition, Kognition, Soziale Fähigkeiten, Psychische Fähigkeiten + +**Skills-Verteilung:** +``` +KARATE Fähigkeiten (32 Skills, focus_areas: ["karate"]): +├─ Kata (8): Technik Kombination, Kata Ablauf, Bunkai, Oyo, Henka, Kakushi, Kata Atmung, Kata Rhythmus +├─ Kihon (10): Dachi Waza, Uke Waza, Zuki Waza, Uchi Waza, Geri Waza, Nage Waza, Nukite Waza, Ken Waza, Hüfteinsatz, Kime +├─ Kumite (10): Beinarbeit, Distanzkontrolle, Angriff, Abwehr Konter, Präzision, Antizipation, Timing, Taktik, Fokus, Mentale Stärke +└─ Selbstverteidigung (4): Gefahrenbewustsein, Selbstbehauptung, Selbstschutz, Gefahrenabwehr + +ALLGEMEINE sportliche Fähigkeiten (37 Skills, focus_areas: ["universal"]): +├─ Kognition (5): Aufmerksamkeit, Wahrnehmung, Urteilsvermögen, Merkfähigkeit, Lernfähigkeit +├─ Kondition (15): Maximalkraft, Schnellkraft, Reaktivkraft, Kraftausdauer, Muskelaufbau, +│ Reaktionsschnelligkeit, Bewegungsschnelligkeit, Handlungsschnelligkeit, +│ Schnelligkeitsausdauer, Grundlagenausdauer, Aerobe Ausdauer, Anaerobe Ausdauer, +│ Regenerationsfähigkeit, Ermüdungswiderstandsfähigkeit, Flexibilität +├─ Koordination (7): Orientierung, Differenzierung, Kopplung, Gleichgewicht, Rhythmisierung, Reaktion, Umstellung +├─ Psychische Fähigkeiten (6): Selbstvertrauen, Konzentration, Emotionale Kontrolle, Motivation, Stressresistenz, Stressregulation +└─ Soziale Fähigkeiten (4): Deeskalation, Selbstdisziplin, Toleranz, Fairness +``` + +**Duplikat-Handling:** +Einige Skills kommen in der Matrix doppelt vor (Kumite + Kondition/Koordination): +- **Behalten in Kondition:** Anaerobe Ausdauer, Bewegungsschnelligkeit, Flexibilität, Reaktionsschnelligkeit, Schnelligkeitsausdauer (konditionelle Primärfähigkeiten) +- **Behalten in Kumite:** Antizipation, Timing (kampfspezifisch) + +**Cleanup:** +- DELETE FROM exercise_skills (M:N Beziehungen) +- DELETE FROM skills (alte Daten) +- DELETE FROM skill_categories +- DELETE FROM skill_main_categories + +**Verifikation:** +```sql +-- Sollte 69 ergeben +SELECT COUNT(*) FROM skills; + +-- Zeigt Verteilung +SELECT + mc.name AS hauptkategorie, + sc.name AS unterkategorie, + COUNT(s.id) AS anzahl_skills +FROM skills s +JOIN skill_categories sc ON s.category_id = sc.id +JOIN skill_main_categories mc ON s.main_category_id = mc.id +GROUP BY mc.name, sc.name, mc.sort_order, sc.sort_order +ORDER BY mc.sort_order, sc.sort_order; +``` + +--- + +## Kern-Entitäten ### Auth & Profile @@ -91,29 +176,91 @@ divisions (id, club_id, name, description, ...) training_groups (id, division_id, name, description, focus_area, level, ...) ``` -### Kataloge (Einfache FK-Struktur - zu refactoren) +### Kataloge -**ACHTUNG:** Aktuell 1:1 Beziehungen - fachlich inkorrekt! +#### Fokusbereiche & Stile (M:N mit Zielgruppen) ```sql focus_areas (id, name, abbreviation, description, color, icon, ...) -training_styles (id, name, abbreviation, description, parent_style_id, ...) -training_characters (id, name, description, ...) -skill_categories (id, name, description, parent_category_id, ...) +style_directions (id, focus_area_id, name, abbreviation, description, parent_style_id, ...) +target_groups (id, name, description, min_age, max_age, ...) -- Global, NICHT gebunden an Stil +training_style_target_groups (style_direction_id, target_group_id, is_primary) -- M:N Junction ``` -### Übungen (Aktuell - zu refactoren) +#### Fähigkeiten (Hierarchisches Schema ab Migration 022) + +```sql +-- Haupt-Kategorien (2: KARATE, ALLGEMEINE) +skill_main_categories ( + id, name, slug, description, sort_order, created_at, updated_at +) + +-- Unterkategorien (9: Kihon, Kumite, Kata, Selbstverteidigung, Koordination, Kondition, ...) +skill_categories ( + id, name, slug, description, sort_order, + main_category_id REFERENCES skill_main_categories(id), + parent_category_id, -- Optional: Hierarchie + created_at, updated_at +) + +-- Fähigkeiten (69 Skills) +skills ( + id, name, description, + category_id REFERENCES skill_categories(id), + main_category_id REFERENCES skill_main_categories(id), + focus_areas JSONB, -- ["karate"] oder ["universal"] + created_at, updated_at +) + +-- Level-Definitionen (optional, noch nicht gefüllt) +skill_level_definitions ( + id, skill_id, level, description, + created_at, updated_at, + UNIQUE (skill_id, level) +) +``` + +**Focus Areas Bedeutung:** +- `["karate"]` - Skill ist spezifisch für Karate (z.B. Kata Ablauf, Kihon) +- `["universal"]` - Skill ist universell einsetzbar (z.B. Maximalkraft, Konzentration, Deeskalation) +- Später möglich: `["karate", "selbstverteidigung"]` - Mehrfachzuordnung + +#### Trainingscharakter + +```sql +training_characters (id, name, description, ...) +trainer_contexts (id, name, description, ...) -- Neue Dimension (Migration 012) +``` + +### Übungen (M:N Beziehungen ab Migration 008) ```sql exercises ( id, title, summary, goal, execution, preparation, trainer_notes, - focus_area_id, -- ❌ 1:1 - sollte M:N sein - training_style_id, -- ❌ 1:1 - sollte M:N sein - training_character_id, -- ❌ 1:1 - sollte M:N sein - visibility, status, created_by, club_id, ... + duration_min, duration_max, + group_size_min, group_size_max, + equipment JSONB, + visibility, status, created_by, club_id, + import_source, import_id, wiki_page_id, -- MediaWiki Import (Migration 018) + created_at, updated_at ) -exercise_skills (exercise_id, skill_id, is_primary, intensity, ...) +-- M:N Beziehungen +exercise_focus_areas (exercise_id, focus_area_id, is_primary) +exercise_style_directions (exercise_id, style_direction_id, is_primary) +exercise_target_groups (exercise_id, target_group_id, is_primary) +exercise_age_groups (exercise_id, age_group) -- Enum: Minis, Kinder, Schüler, Teenager, Erwachsene + +-- Fähigkeiten-Zuordnung (mit Level) +exercise_skills ( + exercise_id, skill_id, + is_primary, intensity, + required_level INT, -- Voraussetzung (1-5) + target_level INT, -- Ziel (1-5) + UNIQUE (exercise_id, skill_id) -- Migration 020 +) + +-- Varianten & Medien exercise_variants (id, exercise_id, name, description, ...) exercise_media (id, exercise_id, type, url, title, description, ...) ``` @@ -123,119 +270,77 @@ exercise_media (id, exercise_id, type, url, title, description, ...) ```sql training_units (id, group_id, date, title, description, ...) training_unit_exercises (training_unit_id, exercise_id, sort_order, ...) +exercise_blocks (id, name, description, created_by, club_id, ...) -- Migration 017 +``` + +### MediaWiki Import (Migration 018) + +```sql +wiki_import_log ( + id, category, import_type, import_status, + items_total, items_imported, items_skipped, items_failed, + error_log JSONB, + started_at, finished_at, + imported_by +) + +wiki_import_references ( + id, wiki_page_id, entity_type, local_id, + created_at, updated_at +) +``` + +**Import-Typen:** +- `exercise` - Übungen aus `Kategorie:Übungen` +- `skill` - Fähigkeiten aus `Kategorie:Fähigkeitsbeschreibung` (veraltet, nutze Migration 023) +- `method` - Trainingsmethoden aus `Kategorie:Methodenbeschreibung` + +--- + +## Indizes + +### Performance-Indizes + +```sql +-- Hierarchie-Lookups +CREATE INDEX idx_style_directions_focus_area ON style_directions(focus_area_id); +CREATE INDEX idx_skill_categories_main_category ON skill_categories(main_category_id); +CREATE INDEX idx_skills_category ON skills(category_id); +CREATE INDEX idx_skills_main_category ON skills(main_category_id); + +-- M:N Joins +CREATE INDEX idx_exercise_focus_areas_exercise ON exercise_focus_areas(exercise_id); +CREATE INDEX idx_exercise_focus_areas_focus ON exercise_focus_areas(focus_area_id); +CREATE INDEX idx_exercise_style_directions_exercise ON exercise_style_directions(exercise_id); +CREATE INDEX idx_exercise_style_directions_style ON exercise_style_directions(style_direction_id); +CREATE INDEX idx_exercise_target_groups_exercise ON exercise_target_groups(exercise_id); +CREATE INDEX idx_exercise_target_groups_target ON exercise_target_groups(target_group_id); +CREATE INDEX idx_exercise_skills_exercise ON exercise_skills(exercise_id); +CREATE INDEX idx_exercise_skills_skill ON exercise_skills(skill_id); + +-- Import-Tracking +CREATE INDEX idx_wiki_import_references_wiki_page ON wiki_import_references(wiki_page_id); +CREATE INDEX idx_wiki_import_references_entity ON wiki_import_references(entity_type, local_id); ``` --- -## Geplante Änderungen (Migration 008) - -### Hierarchische Katalog-Struktur - -**Fachliche Anforderung (§8.1 Anforderungsdokument):** -``` -Fokusbereich → Stil → Zielgruppe -``` - -**Neue Struktur:** - -```sql --- Level 1: Fokusbereiche (Root) -focus_areas ( - id SERIAL PRIMARY KEY, - name VARCHAR(100) UNIQUE NOT NULL, - abbreviation VARCHAR(20), - description TEXT, - color VARCHAR(20), - icon VARCHAR(50), - sort_order INT, - status VARCHAR(50) DEFAULT 'active' -) - --- Level 2: Trainingsstile (untergeordnet zu Fokusbereich) -training_styles ( - id SERIAL PRIMARY KEY, - focus_area_id INT REFERENCES focus_areas(id), -- Hierarchie-Link - name VARCHAR(100) NOT NULL, - abbreviation VARCHAR(20), - description TEXT, - parent_style_id INT REFERENCES training_styles(id), -- Optional: Sub-Stile - sort_order INT, - status VARCHAR(50) DEFAULT 'active' -) - --- Level 3: Zielgruppen (untergeordnet zu Stil) -target_groups ( - id SERIAL PRIMARY KEY, - training_style_id INT REFERENCES training_styles(id), -- Hierarchie-Link - name VARCHAR(100) NOT NULL, - description TEXT, - min_age INT, - max_age INT, - sort_order INT, - status VARCHAR(50) DEFAULT 'active' -) -``` - -### M:N Übungs-Zuordnungen - -```sql --- Übung → Fokusbereiche (M:N) -exercise_focus_areas ( - id SERIAL PRIMARY KEY, - exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE, - focus_area_id INT REFERENCES focus_areas(id), - is_primary BOOLEAN DEFAULT false, - UNIQUE(exercise_id, focus_area_id) -) - --- Übung → Stile (M:N) -exercise_styles ( - id SERIAL PRIMARY KEY, - exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE, - training_style_id INT REFERENCES training_styles(id), - is_primary BOOLEAN DEFAULT false, - UNIQUE(exercise_id, training_style_id) -) - --- Übung → Zielgruppen (M:N) -exercise_target_groups ( - id SERIAL PRIMARY KEY, - exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE, - target_group_id INT REFERENCES target_groups(id), - is_primary BOOLEAN DEFAULT false, - UNIQUE(exercise_id, target_group_id) -) - --- Übung → Altersgruppen (M:N - separate Dimension) -exercise_age_groups ( - id SERIAL PRIMARY KEY, - exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE, - age_group VARCHAR(50) NOT NULL, -- 'Minis', 'Kinder', 'Schüler', 'Teenager', 'Erwachsene' - UNIQUE(exercise_id, age_group) -) -``` - ---- - -## Kaskadier-Regeln (Geplant) +## Kaskadier-Regeln ### Fokusbereich löschen **Verhalten:** `RESTRICT` (Löschen verweigern wenn verwendet) -**Alternativen:** -1. **Umrouten:** Alle abhängigen Stile auf neuen Fokusbereich setzen -2. **Archivieren:** Status auf 'archived' setzen statt löschen - -**Implementierung:** +**Prüfung:** ```sql --- Prüfung vor Löschen: -SELECT COUNT(*) FROM training_styles WHERE focus_area_id = :id +SELECT COUNT(*) FROM style_directions WHERE focus_area_id = :id SELECT COUNT(*) FROM exercise_focus_areas WHERE focus_area_id = :id - --- Falls verwendet → HTTP 409 Conflict mit Hinweis ``` +**Alternativen:** +1. Umrouten: Alle abhängigen Stile auf neuen Fokusbereich setzen +2. Archivieren: Status auf 'archived' setzen statt löschen + ### Stil löschen **Verhalten:** `RESTRICT` wenn Zielgruppen oder Übungen zugeordnet @@ -243,63 +348,41 @@ SELECT COUNT(*) FROM exercise_focus_areas WHERE focus_area_id = :id **Umrouten-Workflow:** 1. Admin wählt Ziel-Stil 2. System aktualisiert: - - `target_groups.training_style_id` - - `exercise_styles.training_style_id` + - `training_style_target_groups.style_direction_id` + - `exercise_style_directions.style_direction_id` 3. Löschen erlaubt ### Zielgruppe löschen **Verhalten:** `SET NULL` oder `CASCADE` in `exercise_target_groups` ---- - -## Indizes (Geplant) - +**Prüfung:** ```sql --- Hierarchie-Lookups -CREATE INDEX idx_training_styles_focus_area ON training_styles(focus_area_id); -CREATE INDEX idx_target_groups_style ON target_groups(training_style_id); - --- M:N Joins -CREATE INDEX idx_exercise_focus_areas_exercise ON exercise_focus_areas(exercise_id); -CREATE INDEX idx_exercise_focus_areas_focus ON exercise_focus_areas(focus_area_id); -CREATE INDEX idx_exercise_styles_exercise ON exercise_styles(exercise_id); -CREATE INDEX idx_exercise_styles_style ON exercise_styles(training_style_id); -CREATE INDEX idx_exercise_target_groups_exercise ON exercise_target_groups(exercise_id); -CREATE INDEX idx_exercise_target_groups_target ON exercise_target_groups(target_group_id); +SELECT COUNT(*) FROM training_style_target_groups WHERE target_group_id = :id +SELECT COUNT(*) FROM exercise_target_groups WHERE target_group_id = :id ``` ---- +### Skill löschen -## Deprecation-Pfad (Migration 008) +**Verhalten:** `CASCADE` zu `skill_level_definitions`, `RESTRICT` wenn in `exercise_skills` -**Legacy-Spalten in `exercises`:** +**Prüfung:** ```sql --- Werden in Migration 008 deprecated: -exercises.focus_area_id → Migriert zu exercise_focus_areas (is_primary=true) -exercises.training_style_id → Migriert zu exercise_styles (is_primary=true) -exercises.training_character_id → Bleibt vorerst (separate Dimension) - --- Spalten bleiben zur Rückwärtskompatibilität, aber: --- 1. Daten migriert --- 2. Neue Übungen nutzen M:N-Tabellen --- 3. API liefert enriched data aus M:N --- 4. Später: Spalten droppen nach Stabilisierung +SELECT COUNT(*) FROM exercise_skills WHERE skill_id = :id ``` --- ## Nächste Schritte -- [ ] Migration 008 Entwurf erstellen -- [ ] Migrations-Strategie für Altdaten dokumentieren -- [ ] Admin-UI für Baum-Verwaltung planen -- [ ] API-Endpoints für hierarchische Navigation -- [ ] Cascade-Logik implementieren -- [ ] Tests für Löschen/Umrouten +- [ ] Level-Definitionen aus Fähigkeitsmatrix extrahieren (optional) +- [ ] Skills-Import testen mit Übungs-Import +- [ ] Migration 024: Skills-Beschreibungen aus Wiki importieren +- [ ] Admin-UI für Skill-Kategorien (CRUD) +- [ ] Skill-Filter in Übungssuche integrieren --- -**Letzte Aktualisierung:** 2026-04-23 +**Letzte Aktualisierung:** 2026-04-27 **Verantwortlich:** Claude Code **Review:** Pending diff --git a/.claude/docs/technical/MEDIAWIKI_IMPORT_SPEC.md b/.claude/docs/technical/MEDIAWIKI_IMPORT_SPEC.md index 2afd7f2..1118b58 100644 --- a/.claude/docs/technical/MEDIAWIKI_IMPORT_SPEC.md +++ b/.claude/docs/technical/MEDIAWIKI_IMPORT_SPEC.md @@ -1,8 +1,8 @@ # MediaWiki Import Specification -**Version:** 1.0 -**Datum:** 2026-04-24 -**Status:** DRAFT - Ready for Review +**Version:** 1.1 +**Datum:** 2026-04-27 +**Status:** DEPLOYED - Skills via Migration, Exercises via API **Autor:** Claude Code --- @@ -19,6 +19,11 @@ **Import-Tracking:** Jeder Import wird geloggt, Duplikate werden via `wiki_page_title` erkannt und nicht doppelt angelegt. +**⚠️ WICHTIG - Skills-Import (ab 2026-04-27):** +Skills werden NICHT mehr über die API importiert, sondern über **Migration 023** +(vollständiger Import aus Fähigkeitsmatrix mit Kategorisierung). +Siehe `.claude/handover/session-2026-04-27-skills-complete.md` für Details. + --- ## 2. MediaWiki API-Zugriff @@ -88,23 +93,42 @@ GET /api.php?action=browsebysubject&subject=Übungsname&format=json | `CapabilityLevel` | `exercise_skills` (target_level) | Integer → Named Level (1=einsteiger…5=experte) | | `Schlüsselworte` | — | Keywords (für zukünftige Tag-Funktion) | -### 3.3 Skill-Level-Mapping (CapabilityLevel → Stufen) +### 3.3 Skill-Level-Mapping (CapabilityLevel → INTEGER) -| Wiki-Wert | Shinkan-Stufe | -|-----------|---------------| -| 1 | einsteiger | -| 2 | grundlagen | -| 3 | aufbau | -| 4 | fortgeschritten | -| 5 | experte | +**🆕 ÄNDERUNG (2026-04-27):** `target_level` ist jetzt INTEGER (1-5), nicht mehr String. + +| Wiki-Wert | Shinkan DB-Wert | Bedeutung | +|-----------|-----------------|-----------| +| "1" | 1 (INTEGER) | Einsteiger | +| "2" | 2 (INTEGER) | Grundlagen | +| "3" | 3 (INTEGER) | Aufbau | +| "4" | 4 (INTEGER) | Fortgeschritten | +| "5" | 5 (INTEGER) | Experte | + +**Implementierung:** `smw_mapper.py` Zeile 271-299 `build_skill_assignments()` +konvertiert String → INTEGER via `int(level_str.strip())`. ### 3.4 Kategorien (karatetrainer.net) -| Import-Typ | Wiki-Kategorie | -|------------|---------------| -| exercises | `Übungen` | -| skills | `Fähigkeitsbeschreibung` | -| methods | `Methodenbeschreibung` | +| Import-Typ | Wiki-Kategorie | Status | Import-Methode | +|------------|---------------|--------|----------------| +| exercises | `Übungen` | ✅ Produktiv | API (`/api/import-wiki/execute`) | +| skills | `Fähigkeitsbeschreibung` | ⚠️ DEPRECATED | ~~API~~ → **Migration 023** | +| methods | `Methodenbeschreibung` | 🔲 Geplant | API (noch nicht implementiert) | + +**⚠️ Skills-Import-Änderung (2026-04-27):** + +Skills werden NICHT mehr über `import_type: skill` importiert, sondern über: +- **Migration 022:** Schema-Erweiterung (skill_main_categories, focus_areas, level_definitions) +- **Migration 023:** Vollständiger Import (69 Skills mit Kategorisierung aus Fähigkeitsmatrix) + +**Grund:** API-Import lieferte nur skill_name, aber KEINE Kategorisierung +(Haupt-/Unterkategorie, Fokusbereich). Migration 023 importiert alle Skills +mit vollständiger Metadaten-Struktur. + +**Quelle:** https://karatetrainer.net/index.php?title=Fähigkeitsmatrix + +**Details:** `.claude/handover/session-2026-04-27-skills-complete.md` **Unbekannte Katalog-Werte:** Warnmeldung im Import-Log, Übung wird ohne diese Zuordnung importiert (kein Abbruch).