diff --git a/backend/version.py b/backend/version.py index 2dfe63c..9a1a661 100644 --- a/backend/version.py +++ b/backend/version.py @@ -1,7 +1,7 @@ # Shinkan Jinkendo Version Information -APP_VERSION = "0.8.165" -BUILD_DATE = "2026-05-31" +APP_VERSION = "0.8.166" +BUILD_DATE = "2026-05-22" DB_SCHEMA_VERSION = "20260531071" MODULE_VERSIONS = { @@ -27,7 +27,7 @@ MODULE_VERSIONS = { "skills": "0.1.1", # DB 065 karate_relevance + relevance_level; CRUD unterstützt Felder "skill_profiles": "1.0.0", # Phase 3: gewichtetes Fähigkeiten-Profil + skill-discovery/suggestions "methods": "0.1.0", - "exercises": "2.32.0", # KI Anleitung: exercise_instruction_rewrite, include_instructions API + UI + "exercises": "2.33.0", # KI Schnellanlage: Suche+Anlage kombiniert; Rich-Text-Editor; Übungsliste KI-Schalter "training_units": "0.4.0", # POST .../publish-to-framework: Ablauf aus geplanter Einheit → Rahmen-Slot-Blueprint "training_programs": "0.1.0", "planning": "0.15.0", # Vorlagen: Strukturvorschau, Bearbeiten inkl. Split-Sessions + Beschreibung @@ -42,6 +42,14 @@ MODULE_VERSIONS = { } CHANGELOG = [ + { + "version": "0.8.166", + "date": "2026-05-22", + "changes": [ + "KI Schnellanlage: Suche und Anlage kombiniert (Picker + Übungsliste); Suchstring → Titel/Skizze; Rich-Text-Entwurf bearbeitbar vor Speichern.", + "Übungsliste: Schalter „KI-Anlage“ für direkten Einstieg ohne leere Trefferliste.", + ], + }, { "version": "0.8.165", "date": "2026-05-31", diff --git a/docs/HANDOVER.md b/docs/HANDOVER.md index 8d31294..38485c8 100644 --- a/docs/HANDOVER.md +++ b/docs/HANDOVER.md @@ -1,7 +1,7 @@ # Shinkan Jinkendo – Entwicklungsstand & Handover **Stand:** 2026-05-31 -**App-Version / DB-Schema:** App **`0.8.163`** (KI Anleitung `exercise_instruction_rewrite`); DB **`20260531071`** — maßgeblich **`backend/version.py`**. +**App-Version / DB-Schema:** App **`0.8.166`** (KI Schnellanlage Suche+Anlage); DB **`20260531071`** — maßgeblich **`backend/version.py`**. Diese Datei ist die **Einstiegs-Doku für neue Chat-Sessions**: Anforderungen im Detail stehen in `.claude/docs/` (siehe unten); hier der **implementierte Stand**, **Medien-Meilenstein** und **sinnvolle nächste Schritte**. @@ -89,7 +89,7 @@ Das Schema ist gegenüber dem Code zurück: Migration **`022_skills_schema_compl - **Varianten:** Speichern in der **Aktionsleiste** persistiert zuerst geänderte Varianten (`persistPendingVariantChanges`), dann Übungs-Stammdaten; „Variante anlegen“ als `type="button"` ohne verschachteltes Formular (`createVariantFromDraft`) - **Governance (Übungen):** Owner = `created_by`; Bearbeiten = Ersteller, Plattform-Admin oder `can_plan_in_club` bei `visibility=club`; Löschen `club` = nur `club_admin`; Details **`FEATURES_DELIVERED_2026-Q2.md`** §16, **`EXERCISES_API_SPEC.md`** Permissions -### 2.8 KI Assistenz Übungen & Skill-Katalog-Retrieval (Stand **0.8.163**) +### 2.8 KI Assistenz Übungen & Skill-Katalog-Retrieval (Stand **0.8.166**) - **Zielarchitektur (Pflicht fuer Erweiterungen):** `.claude/docs/technical/AI_PROMPT_TARGET_ARCHITECTURE.md` — Kontext-Arten, Composition, Einbindung Planung/Rahmen; Phasenplan P0–P4. - **Doku:** Umsetzung `.claude/docs/working/AI_EXERCISE_IMPLEMENTATION_PLAN.md`; Profil-/JSON-Konzept `.claude/docs/working/AI_SKILL_RETRIEVAL_PROFILES_SPEC.md`; Ist-Prompt/UI **`AI_PROMPT_SYSTEM_SPEC.md`**; API-Felder **`KI_FEATURES_SPEC.md`** §5.2 @@ -99,7 +99,8 @@ Das Schema ist gegenüber dem Code zurück: Migration **`022_skills_schema_compl - **API:** `POST /api/exercises/ai/suggest` — **`include_instructions`**, Body **`preparation`**, **`trainer_notes`**; Response **`instructions.fields`**; **`POST …/ai/regenerate`** mit **`instructions`** in `regenerate` - **Pflege:** Superadmin **`/admin/ai-prompts`**, **`/admin/ai-skill-retrieval`** - **Diagnose:** **`SHINKAN_AI_DEBUG=1`** — Logs `shinkan.exercise_ai`, `shinkan.openrouter` -- **Frontend:** Tab **Anleitung** — **„KI: Anleitung überarbeiten“**; Vorschau-Dialog pro Feld; Kurzfassung/Fähigkeiten unverändert (**`ExerciseFormPageRoot.jsx`**) +- **Frontend Formular:** Tab **Anleitung** — **„KI: Anleitung überarbeiten“**; Vorschau-Dialog pro Feld (**`ExerciseFormPageRoot.jsx`**) +- **Frontend Schnellanlage:** **`ExercisePickerModal`** (Planung/Rahmen) — Volltextsuche; bei keinem Treffer **„Mit KI anlegen“** (Suchstring → Titel/Skizze); Entwurf im **Rich-Text-Dialog** bearbeiten, dann speichern & übernehmen. **`ExercisesListPageRoot`** — gleiches Muster + Schalter **„KI-Anlage“** in der Suchleiste. --- diff --git a/frontend/src/components/ExerciseAiQuickCreateOffer.jsx b/frontend/src/components/ExerciseAiQuickCreateOffer.jsx new file mode 100644 index 0000000..ed03333 --- /dev/null +++ b/frontend/src/components/ExerciseAiQuickCreateOffer.jsx @@ -0,0 +1,118 @@ +import React from 'react' + +/** + * Inline-Angebot: aus Suchstring neue Übung per KI anlegen (Fokusbereich + optional Titel/Skizze). + */ +export default function ExerciseAiQuickCreateOffer({ + searchLabel, + title, + onTitleChange, + sketch, + onSketchChange, + focusAreaId, + onFocusAreaChange, + focusAreas = [], + catalogsReady = true, + busy = false, + error = '', + onRunAi, + showSketchField = false, + hint, +}) { + const canRun = + !busy && + (title || '').trim().length >= 3 && + (sketch || '').trim().length > 0 && + focusAreaId + + return ( +
+ {hint || + (searchLabel + ? `Für „${searchLabel}“ lässt sich eine neue Übung mit KI vorschlagen — Texte danach bearbeiten und speichern.` + : 'Neue Übung mit KI vorschlagen — Texte danach bearbeiten und speichern.')} +
+ ++ Ausgangstext: {(sketch || '').trim().slice(0, 160)} + {(sketch || '').trim().length > 160 ? '…' : ''} +
+ )} + + {error ? ( +{error}
+ ) : null} + +{hint}
- {p.hasInstructionChoices ? ( -- Zuerst prüft die Suche die Bibliothek (Titel + Skizze). Passt eine Übung, direkt - übernehmen. Sonst erzeugt die KI einen Vorschlag — Anleitung, Kurzbeschreibung, Fähigkeiten — den du - im Dialog prüfst, bevor gespeichert wird. -
-- Titel oder Skizze (mind. 3 Zeichen) — dann erscheinen Treffer. -
- ) : quickLibraryLoading ? ( -Suche läuft…
- ) : quickLibraryHits.length === 0 ? ( -- Keine Treffer — unten KI-Vorschlag erzeugen. -
- ) : ( -{quickAiError}
- ) : null} -Keine Treffer.
+ showQuickCreateOffer ? ( ++ {debouncedSearch.length >= 3 + ? 'Keine Treffer.' + : 'Suchbegriff eingeben (mind. 3 Zeichen) …'} +
+ ) ) : ( <>@@ -948,13 +794,14 @@ export default function ExercisePickerModal({
Keine Übungen gefunden.
++ {debouncedSearch.length >= 3 + ? 'Keine Übungen gefunden.' + : 'Keine Übungen gefunden — Suchbegriff eingeben oder Filter anpassen.'} +