Strategie-B-Ausnahme: parse.ts (Anki-Format-Parser via JSZip + sql.js)
und AnkiImport.svelte (UI-Stages) sind aus mana-monorepo portiert,
mit Source-Comment-Header dokumentiert. Anki-Format ist standalone
Parser-Logik, kein Architektur-Schmuggel.
Neuer server-authoritative import.ts schreibt direkt gegen die
cards-api ($lib/api/decks + cards) — keine Stores, keine Dexie.
Anki "::"-Hierarchie wird zu " / "-Strings flach. Fallback-Deck
"Anki-Import" für Karten ohne explizites Deck. Cloze-Karten kommen
first-class durch (Sub-Index pro Cluster, Sprint 8a/8b).
Phase-8-MVP-Scope: Bilder + Audio werden gedroppt (Option A) — der
sanitizeAnkiHtml entfernt <img> und [sound:…] ersatzlos. Späterer
Media-Pfad (lokaler Cards-Upload oder mana-media nach Phase 2) ist
additiv.
Neue Route /import + Top-Nav-Link. Hermetic Vitest (5 Cases): baut
zur Laufzeit ein Mini-.apkg via sql.js + JSZip und prüft den
Parser-Output (basic, basic-reverse, cloze, sanitize, dedupe auf
Note-Ebene). svelte-check 0 errors, prod-Build sauber.
sql-wasm.wasm liegt in static/ (660kB) — fix für sql.js 1.14.1, vom
Browser einmal geladen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Study-View hat jetzt Cloze-Branch in promptMarkdown/answerMarkdown.
Aktiver Cluster wird im Prompt zu […], in der Answer fett markiert,
restliche Cluster sind expanded. Optionales `extra`-Feld wird unter
der Answer angehängt (Anki-kompatibel).
Render-Helpers (clusterIdForSubIndex, renderClozePrompt,
renderClozeAnswer) leben in @cards/domain (Phase 8a) und sind dort
12-fach getestet — die Svelte-Komponente bleibt dünn.
E2E-Smoke gegen lokale DB: Cloze-Card mit zwei Clustern
({{c1::Frankreich}} {{c2::Paris}}) erzeugt 2 Reviews (sub_index 0+1).
Type-check + svelte-check 0 errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>