From 3c839861e7773c1162574f79e8ba8486630e5fd3 Mon Sep 17 00:00:00 2001 From: team3 Date: Wed, 17 Jun 2026 23:17:52 +0200 Subject: [PATCH] update --- backend/guide.py | 23 ++--- frontend/src/App.vue | 7 -- frontend/src/components/BausteinFokus.vue | 4 +- frontend/src/components/SubbausteinView.vue | 105 -------------------- frontend/src/components/TopicDetail.vue | 4 +- templates/Prompt/Guide-Sections-Fix.md | 10 +- templates/Prompt/Guide-Writer.md | 34 +++---- 7 files changed, 28 insertions(+), 159 deletions(-) delete mode 100644 frontend/src/components/SubbausteinView.vue diff --git a/backend/guide.py b/backend/guide.py index 6595834..a4c29a5 100644 --- a/backend/guide.py +++ b/backend/guide.py @@ -63,13 +63,6 @@ def _load_subbausteine(topic: str) -> dict[str, list[dict]]: return out -def _section_markup(sec: dict) -> str: - """Section-Text mit Sub-Markern (für Lese-Check/Fix), damit die Struktur erhalten bleibt.""" - if not sec.get("subs"): - return sec["md"] - return "\n\n".join(f"\n{s['md']}" for s in sec["subs"]) - - def _zuteilung_subs(chunk: list[dict], entries: dict[int, str], subs_by_titel: dict[str, list[dict]]) -> str: """Wie _zuteilung_text, aber listet pro Baustein seine Subbausteine mit Stufe.""" lines: list[str] = [] @@ -654,11 +647,11 @@ async def _generate_sections( chunk_nums = [[num for ch in chunk for num in ch["nums"] if num in by_num] for chunk in chunks] def sections_text(nums: list[int]) -> str: - return "\n\n".join(f"SECTION: {_titel(entries[num])}\n{_section_markup(by_num[num])}" for num in nums) + return "\n\n".join(f"SECTION: {_titel(entries[num])}\n{by_num[num]['md']}" for num in nums) def auftraege_text(nums: list[int], probleme: dict[int, str]) -> str: return "\n\n".join( - f"SECTION: {_titel(entries[num])}\nPROBLEM: {probleme[num]}\nAKTUELLER INHALT:\n{_section_markup(by_num[num])}" + f"SECTION: {_titel(entries[num])}\nPROBLEM: {probleme[num]}\nAKTUELLER INHALT:\n{by_num[num]['md']}" for num in nums ) @@ -740,16 +733,12 @@ async def _generate_sections( scope = [[num for num in nums if num in ersetzt] for nums in chunk_nums] await _set_progress(guide_id, "Setze zusammen…") - def _section(num: int) -> dict: - sec = by_num[num] - d = {"num": num, "title": _titel(entries[num]), "md": sec["md"]} - if sec.get("subs"): - d["subbausteine"] = [{"stufe": s["stufe"], "titel": s["titel"], "md": s["md"]} for s in sec["subs"]] - return d - chapters: list[dict] = [] for ch in plan: - sections = [_section(num) for num in ch["nums"] if num in by_num] + sections = [ + {"num": num, "title": _titel(entries[num]), "md": by_num[num]["md"]} + for num in ch["nums"] if num in by_num + ] if sections: chapters.append({"title": ch["title"], "sections": sections}) geplant = {num for ch in plan for num in ch["nums"]} diff --git a/frontend/src/App.vue b/frontend/src/App.vue index bf266ac..5c6ad7e 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -440,10 +440,6 @@ onMounted(async () => { --warning-soft: #fef3c7; --warning-border: #fbbf24; --danger: #991b1b; - /* Subbaustein-Stufen als Ampel (Schwierigkeit), bewusst NICHT die Stand-Farben. */ - --stufe-einfach: #22c55e; - --stufe-mittel: #f59e0b; - --stufe-schwer: #ef4444; --code-bg: #1e2a3a; --code-fg: #e6e6e6; --shadow: rgba(0, 0, 0, 0.12); @@ -472,9 +468,6 @@ html.dark { --warning-soft: #3a2c0a; --warning-border: #a06a12; --danger: #f87171; - --stufe-einfach: #22c55e; - --stufe-mittel: #f59e0b; - --stufe-schwer: #ef4444; --shadow: rgba(0, 0, 0, 0.5); } diff --git a/frontend/src/components/BausteinFokus.vue b/frontend/src/components/BausteinFokus.vue index 7488dfd..7cf0e77 100644 --- a/frontend/src/components/BausteinFokus.vue +++ b/frontend/src/components/BausteinFokus.vue @@ -1,6 +1,5 @@ - - - - diff --git a/frontend/src/components/TopicDetail.vue b/frontend/src/components/TopicDetail.vue index 7ad926e..45a1da9 100644 --- a/frontend/src/components/TopicDetail.vue +++ b/frontend/src/components/TopicDetail.vue @@ -5,7 +5,6 @@ import { renderMarkdown } from '../markdown.js' import { useChat } from '../composables/useChat.js' import BausteinPanel from './BausteinPanel.vue' import BausteinFokus from './BausteinFokus.vue' -import SubbausteinView from './SubbausteinView.vue' const props = defineProps({ previewGuide: { type: Object, default: null }, @@ -200,8 +199,7 @@ function extractContext() { ✓✓ Verstanden ✓ Absolviert -
- +
`-Marker (Subbausteine), BEHALTE diese Struktur bei: gib pro Subbaustein wieder den Marker und darunter den überarbeiteten Text. Stufe und Subbaustein-Titel exakt übernehmen, keine Subbausteine entfernen oder hinzufügen. - -Schreibe NUR die Datei {out_path} in GENAU diesem Format — für JEDE beanstandete Section ein section-Marker (Titel EXAKT wie oben), darunter der vollständige neue Markdown-Body (mit den ``-Markern, falls die Section welche hatte): +Schreibe NUR die Datei {out_path} in GENAU diesem Format — für JEDE beanstandete Section ein section-Marker (Titel EXAKT wie oben), darunter der vollständige neue Markdown-Body: - -Überarbeiteter Text zu diesem Teilpunkt… +Erklärung (Einordnung → Wie/Warum) laut SECTION-SPEZIFIKATION… + +### Beispiel +(Beispiel im themengerechten Format laut SECTION-SPEZIFIKATION: Codeblock NUR bei Code-Themen, sonst Beispielsätze oder Mini-Szenario) Die Marker-Zeilen exakt so schreiben. Kein Text außerhalb der Sections. {extra} diff --git a/templates/Prompt/Guide-Writer.md b/templates/Prompt/Guide-Writer.md index 01e47e3..72a90d9 100644 --- a/templates/Prompt/Guide-Writer.md +++ b/templates/Prompt/Guide-Writer.md @@ -1,40 +1,36 @@ Schreibe Sections für einen Lern-Guide zum Thema "{topic}" (Format: {format_name}). -Dir zugeteilt sind folgende Kapitel und Bausteine — verbindlich: jede zugeteilte Section muss vorkommen, keine zusätzlichen erfinden. Unter jedem Baustein stehen seine SUBBAUSTEINE mit Stufe (`[einfach]`, `[mittel]`, `[schwer]`): +Dir zugeteilt sind folgende Kapitel und Bausteine — verbindlich: jede zugeteilte Section muss vorkommen, keine zusätzlichen erfinden. Unter jedem Baustein stehen seine SUBBAUSTEINE mit Stufe (`[einfach]`/`[mittel]`/`[schwer]`): {zuteilung} {facts} Das Format ({format_name}) beeinflusst NICHT, wie ein Baustein geschrieben wird — nur, wie viele Bausteine das Thema abdecken. Derselbe Baustein bekommt in MiniGuide, Guide und FullGuide denselben Text. -SUBBAUSTEINE — so schreibst du: -- Pro zugeteiltem Subbaustein schreibst du EINEN kurzen, eigenständigen Abschnitt. Ein Subbaustein = ein Teilpunkt. -- Jeder Subbaustein-Abschnitt steht für sich: allein verständlich, ohne die anderen gelesen zu haben. Ein Anfänger darf später nur die `[einfach]`-Abschnitte sehen — die müssen für sich Sinn ergeben. -- Die Stufe steuert die Tiefe: `[einfach]` = Grundlage, knapp und sofort verständlich. `[mittel]` = ein Detail/eine Variante. `[schwer]` = Sonderfall/Tücke. -- So lang wie nötig, so kurz wie möglich: 1–4 Sätze je Subbaustein. Ein Beispiel NUR, wo es wirklich hilft (Format laut Spezifikation). -- Ein Baustein mit vielen Subbausteinen wird dadurch lang, einer mit wenigen kurz — das ist gewollt. +SO SCHREIBST DU einen Baustein — EIN zusammenhängender Text, kein Stichwort-Stakkato: +- Schreibe pro Baustein EINEN fließenden Lern-Text laut SECTION-SPEZIFIKATION (Einordnung → Erklärung → Beispiel). Ein roter Faden, mit Übergängen. +- Die Subbausteine sind deine INHALTS-CHECKLISTE, keine Überschriften: webe sie in den Fließtext ein. Behandle jeden, aber als Teil eines Ganzen — nicht als isolierten Mini-Absatz. +- Reihenfolge: erst die `[einfach]`-Punkte (das Fundament), dann `[mittel]` (Details/Varianten), zuletzt `[schwer]` (Sonderfälle/Tücken — knapp, als fortgeschrittener Hinweis). +- Tiefe folgt der Zahl der Subbausteine: ein Baustein mit vielen Subbausteinen wird ein langer, gehaltvoller Text; einer mit wenigen bleibt kurz. Das ist gewollt. +- KEIN festes Längen-Limit. So lang wie nötig, damit ein Anfänger es ohne Vorwissen versteht. Lieber ein Satz mehr und klar. +- Beispiel großzügig einsetzen, wo es hilft — bei Code-/Tool-Themen fast immer ein kurzes Code-Snippet (Format laut Spezifikation). GEPRÜFTE INHALTE je Baustein — das ist verbindlich, was gelehrt werden muss: {inhalte} -Nutze diese Inhalte. Erfinde nichts dazu, lass nichts Wesentliches weg. Verteile sie auf die Subbausteine. Lehre simpel: kurze Sätze, Listen für Aufzählungen, ein Anfänger versteht es sofort. +Nutze diese Inhalte. Erfinde nichts dazu, lass nichts Wesentliches weg. Lehre simpel: kurze Sätze, Listen für Aufzählungen, ein Anfänger versteht es sofort. -SECTION-SPEZIFIKATION (gilt je Subbaustein-Abschnitt): +SECTION-SPEZIFIKATION (gilt je Baustein): {spec} -Schreibe NUR die Datei {out_path} in GENAU diesem Format — pro Kapitel ein kapitel-Marker, pro Baustein ein section-Marker (Titel EXAKT aus der Zuteilung), darunter PRO Subbaustein ein sub-Marker `` und dann der Markdown-Body dieses Subbausteins: +Schreibe NUR die Datei {out_path} in GENAU diesem Format — pro Kapitel ein kapitel-Marker, pro Baustein ein section-Marker (Titel EXAKT aus der Zuteilung), darunter der zusammenhängende Markdown-Body: - -Kurzer, eigenständiger Text zu diesem Teilpunkt… +Erklärung (Einordnung → Wie/Warum) laut SECTION-SPEZIFIKATION… - -Kurzer Text… +### Beispiel +(Beispiel im themengerechten Format laut SECTION-SPEZIFIKATION: Codeblock NUR bei Code-Themen, sonst Beispielsätze oder Mini-Szenario) -Regeln für die Marker: -- `stufe` ist genau eines von: einfach, mittel, schwer (aus der Zuteilung übernehmen). -- Der Subbaustein-Titel nach `|` EXAKT aus der Zuteilung. -- Hat ein Baustein in der Zuteilung KEINE Subbausteine, schreibe direkt unter den section-Marker einen normalen Section-Body (ohne sub-Marker). -- Kein Text außerhalb der Marker, kein Dokument-Titel, kein Inhaltsverzeichnis. +Die Marker-Zeilen exakt so schreiben. Kein Text außerhalb der Sections, kein Dokument-Titel, kein Inhaltsverzeichnis. {extra}