From 9da10b3252d1a5df3eaf3d9ee5c6f5b9724ceef6 Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 8 May 2026 17:46:33 +0200 Subject: [PATCH] Phase 8d: STATUS.md auf Phase-8-Stand aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TL;DR-Summary auf 11 Commits / 92 Tests / Cloze + Anki-Import verschoben. Phasen-Tabelle: 8 ✅ mit 92 Tests grün. Architektur- Subtilitäten ergänzt (#6 Cloze-N-Reviews, #7 Strategie-B-Ausnahme für Anki-Parser, #8 Media-Drop, #9 sql-wasm.wasm-Pflege; alte #6 Decommission rutscht auf #10). MVP-Card-Type-Set in Punkt 6 der festgenagelten Architektur-Entscheidungen aktualisiert. Subtilität #2 (SubIndex-Granularität) verweist jetzt auf #6 für die text- abhängige Cloze-Variante. "Was als Nächstes ansteht"-Empfehlung neu sortiert: Card-Edit-Page + Pre-Flight-Abräumen (Verdaccio-Token liegt vor) statt Anki-Import auf Platz 1. Co-Authored-By: Claude Opus 4.7 (1M context) --- STATUS.md | 98 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 20 deletions(-) diff --git a/STATUS.md b/STATUS.md index a11bf38..8ecfc28 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,6 +1,6 @@ # Cards — Projekt-Status & Onboarding -**Letztes Update:** 2026-05-08 +**Letztes Update:** 2026-05-08 (Phase 8) **Wenn du gerade neu bist (Mensch oder KI):** dieses Dokument soll dir in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen. @@ -10,14 +10,18 @@ in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen. - **Cards** ist die föderierte Spaced-Repetition-App des Vereins **mana e.V.** Strategie-B-Greenfield (beschlossen 2026-05-08): kein - Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut. -- **6 saubere Commits** auf `main`. Type-check 4/4 grün, **70 Tests - grün**, lokaler E2E-Smoke-Test (Postgres → API → Frontend → Föderations- - Endpunkte) durch. -- **Phasen 0, 1, 3, 4, 5 sind durch** und verifiziert. Phase 2 (Auth- - Föderation) ist auf user-side Pre-Flight blockiert. + Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut — + mit einer dokumentierten Ausnahme für den Anki-Format-Parser + (Phase 8c, standalone Parser-Logik). +- **11 saubere Commits** auf `main`. Type-check 4/4 grün, **92 Tests + grün** (41 Domain + 46 API + 5 Web), lokaler E2E-Smoke (Postgres → + API → Frontend → Föderations-Endpunkte → Cloze-Card mit 2-Cluster- + Sub-Index) durch. +- **Phasen 0, 1, 3, 4, 5, 8 sind durch** und verifiziert. Phase 2 + (Auth-Föderation) ist auf user-side Pre-Flight blockiert. - Cards läuft lokal, ist im Browser benutzbar, hat alle Föderations- - Endpoints aus dem `app-manifest.json` implementiert. + Endpoints aus dem `app-manifest.json` implementiert. Anki-Decks + können importiert werden (Cloze first-class). ``` ┌─────────────────────────────────┐ @@ -53,8 +57,9 @@ Diese stehen — nicht ohne explizite Diskussion antasten: 4. **Föderations-Endpoints als Pflicht** — alle aus `app-manifest.json` implementiert (siehe Phase 5 unten). 5. **Encryption initial AUS.** Nachrüstbar via mana-auth-MK. -6. **MVP-Card-Types nur `basic` + `basic-reverse`.** Schema vorbereitet - auf full-set (cloze, type-in, image-occlusion, audio, multiple-choice). +6. **MVP-Card-Types `basic` + `basic-reverse` + `cloze`** (Cloze in + Phase 8 ergänzt). Schema vorbereitet auf full-set (type-in, + image-occlusion, audio, multiple-choice). Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/playbooks/CARDS_GREENFIELD.md) (im Plattform-Repo, weil er Verein-übergreifend gilt). @@ -73,7 +78,7 @@ Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/pl | 5 | Föderations-Endpunkte (share, tools, search, dsgvo) | ✅ | 70 Tests grün, E2E-Smoke (Quote→Inbox→Search→DSGVO-Roundtrip) | | 6 | Subscriptions/Credits via mana-credits | ⏸ offen | autonom möglich | | 7 | AI/MCP-Integration | ⏸ offen | braucht laufende mana-mcp | -| 8 | Anki-Import (.apkg-Parser + mana-media-Upload) | ⏸ offen | autonom möglich, ~5–7 Tage | +| 8 | Anki-Import (.apkg-Parser, Cloze-Support) | ✅ | 92 Tests grün, /import-Route benutzbar, Cloze als 3. MVP-Card-Type. Media + Editor-UI bewusst out-of-scope | | 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y) | ⏸ offen | breite Polish-Phase | | 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config | | 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 | @@ -216,6 +221,10 @@ Volle Konventionen: [`CLAUDE.md`](CLAUDE.md) ## Git-Historie ``` +2ca09fe Phase 8c: Anki-Import via portiertem Parser +0b609c4 Phase 8b: Cloze-Render im Study-View +553a78d Phase 8a: Cloze als MVP-Card-Type, Cluster-Counter +2bed282 docs: STATUS.md als Single Source of Truth für Cards-Onboarding 0328caa Phase 5: Föderations-Endpunkte — Cards ist föderierter Peer 89a7a92 Phase 4: Frontend-Core MVP — Decks, Cards, Study mit FSRS-Loop e3b3a2b docs: SMOKE_TEST.md — verifizierter E2E-Lauf gegen lokale Postgres @@ -249,7 +258,9 @@ sub_index 1 = back→front). Cloze hat 1 Review pro Cluster-Index. Beim Card-Insert werden alle initialen Reviews in **einer Transaktion** mit angelegt — siehe `apps/api/src/routes/cards.ts` POST-Handler. -`subIndexCount(type)` in `@cards/domain` ist die Single Source of Truth. +`subIndexCount(type)` in `@cards/domain` ist die SoT für statische +Typen. Für Cloze siehe Subtilität #6 — `subIndexCountForCloze(text)` ist +die SoT, weil die Anzahl text-abhängig ist. ### 3. Lokales Protocol-Mirror @@ -280,7 +291,50 @@ Swap auf mana-auth: - Web: `@mana/shared-auth`-Login-Flow gegen `auth.mana.how` - Beide aus Verdaccio (= NPM_AUTH_TOKEN-blockiert) -### 6. Cards-Modul in mana-monorepo wird nach Live-Gang **gelöscht** +### 6. Cloze-Karten haben N Reviews — sub_index pro Cluster + +`subIndexCount('cloze')` wirft bewusst, weil die Anzahl text-abhängig +ist. Caller müssen `subIndexCountForCloze(text)` aus `@cards/domain` +nutzen. Cluster werden nach numerischer ID aufsteigend sortiert +(`{{c1::…}}` = sub_index 0, `{{c2::…}}` = 1, …). Der Card-POST-Handler +lehnt `type=cloze` ohne mindestens ein Cluster mit 422 ab — eine Cloze +ohne `{{cN::…}}`-Markup ist sinnlos. + +Render-Helpers (`renderClozePrompt` / `renderClozeAnswer`) leben in +`@cards/domain/src/cloze.ts`, sind 12-fach unit-getestet und werden +vom Study-View dünn konsumiert. Hint-Markup (`{{c1::answer::hint}}`) +wird MVP-stumm gedroppt — Hint-Anzeige ist Phase-9-Polish. + +### 7. Anki-Parser ist eine bewusste Strategie-B-Ausnahme + +`apps/web/src/lib/anki/parse.ts` und `lib/components/AnkiImport.svelte` +sind aus mana-monorepo portiert. Kennzeichnung im Header-Kommentar. +Begründung: Anki-Format-Logik ist standalone Parser-Code (jszip + +sql.js), kein Architektur-Schmuggel — die Kopie spart 2-3 Tage +Re-Implementierung bei null Strategy-Risiko. + +`import.ts` wurde NICHT portiert: das Original schreibt gegen Dexie- +Stores und bricht damit Architektur-Invariante #1 (server-authoritative +MVP). Die neue Version ist von Hand geschrieben und nutzt direkt +`$lib/api/{decks,cards}` über HTTP. + +### 8. Media-Refs werden beim Anki-Import gedroppt (Phase 8 MVP) + +`sanitizeAnkiHtml` strippt `` und `[sound:…]`-Markup ersatzlos. +Späterer Media-Pfad ist additiv — entweder ein lokaler +`POST /api/v1/media/upload` in cards-api oder gegen Plattform-`mana-media` +nach Phase 2. Die Filename→ZIP-Map liegt im `ParsedAnki.mediaByFilename` +weiterhin bereit, sie wird aktuell nur für die Preview-Anzeige +("X Medien werden nicht übernommen") genutzt. + +### 9. sql-wasm.wasm liegt unter apps/web/static/ + +660kB Build-Asset. Wird vom Browser einmal geladen (initSqlJs cache +in parse.ts). Bei Update von `sql.js` muss die Datei neu kopiert +werden: `cp apps/web/node_modules/sql.js/dist/sql-wasm.wasm +apps/web/static/sql-wasm.wasm`. + +### 10. Cards-Modul in mana-monorepo wird nach Live-Gang **gelöscht** Strategie-B-Konsequenz: nach `cardecky.mana.how` live + 2 Wochen Test folgt ein Decommission-PR in mana-monorepo, der `apps/mana/.../modules/cards/`, @@ -311,13 +365,17 @@ diskutiert worden. In Reihenfolge meiner Empfehlung: -1. **Phase 8 (Anki-Import)** — autonom, klar abgegrenzte Funktionalität, - ~5–7 Tage. Brauchbar als Migrations-Hilfe für künftige User. -2. **Card-Edit-Page + Inbox-Banner im Frontend** — 1–2 Tage Polish. -3. **Pre-Flight aktiv abräumen** — Mana-Plattform-Stack + mana-auth - live, dann Cards als App registrieren (Phase 2). -4. **Phase 6 (Subscriptions)** — braucht laufende mana-credits. -5. **Phase 9 (Polish)** — Settings, Account, DSGVO-UI, Statistik, i18n. +1. **Card-Edit-Page + Inbox-Banner im Frontend** — 1–2 Tage Polish. + Schließt die augenfälligste UI-Lücke (Karten kann man anlegen aber + nicht editieren). Cloze-Editor wäre sinnvoll mitzuziehen. +2. **Pre-Flight aktiv abräumen** — Mana-Plattform-Stack + mana-auth + live, dann Cards als App registrieren (Phase 2). NPM_AUTH_TOKEN + für Verdaccio liegt laut Memory bereits vor — der Protocol-Mirror- + Swap auf `@mana/shared-share-protocol` ist eine 1-2h-Arbeit. +3. **Phase 6 (Subscriptions)** — braucht laufende mana-credits. +4. **Phase 9 (Polish)** — Settings, Account, DSGVO-UI, Statistik, + i18n, Hint-Anzeige bei Cloze, Media-Upload für Anki-Import + (additiv zu Phase 8c). Was nicht autonom geht: Phase 2 (Auth-Föderation), Phase 7 (mana-mcp- Live), Phase 10 (Mac-Mini-Deploy) — alle hängen an Pre-Flight-Items.