Phase 8d: STATUS.md auf Phase-8-Stand aktualisiert
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) <noreply@anthropic.com>
This commit is contained in:
parent
2ca09fe0c3
commit
9da10b3252
1 changed files with 78 additions and 20 deletions
98
STATUS.md
98
STATUS.md
|
|
@ -1,6 +1,6 @@
|
||||||
# Cards — Projekt-Status & Onboarding
|
# 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
|
**Wenn du gerade neu bist (Mensch oder KI):** dieses Dokument soll dir
|
||||||
in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen.
|
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
|
- **Cards** ist die föderierte Spaced-Repetition-App des Vereins
|
||||||
**mana e.V.** Strategie-B-Greenfield (beschlossen 2026-05-08): kein
|
**mana e.V.** Strategie-B-Greenfield (beschlossen 2026-05-08): kein
|
||||||
Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut.
|
Code-Übernahme aus dem alten `mana-monorepo`, sauber neu gebaut —
|
||||||
- **6 saubere Commits** auf `main`. Type-check 4/4 grün, **70 Tests
|
mit einer dokumentierten Ausnahme für den Anki-Format-Parser
|
||||||
grün**, lokaler E2E-Smoke-Test (Postgres → API → Frontend → Föderations-
|
(Phase 8c, standalone Parser-Logik).
|
||||||
Endpunkte) durch.
|
- **11 saubere Commits** auf `main`. Type-check 4/4 grün, **92 Tests
|
||||||
- **Phasen 0, 1, 3, 4, 5 sind durch** und verifiziert. Phase 2 (Auth-
|
grün** (41 Domain + 46 API + 5 Web), lokaler E2E-Smoke (Postgres →
|
||||||
Föderation) ist auf user-side Pre-Flight blockiert.
|
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-
|
- 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`
|
4. **Föderations-Endpoints als Pflicht** — alle aus `app-manifest.json`
|
||||||
implementiert (siehe Phase 5 unten).
|
implementiert (siehe Phase 5 unten).
|
||||||
5. **Encryption initial AUS.** Nachrüstbar via mana-auth-MK.
|
5. **Encryption initial AUS.** Nachrüstbar via mana-auth-MK.
|
||||||
6. **MVP-Card-Types nur `basic` + `basic-reverse`.** Schema vorbereitet
|
6. **MVP-Card-Types `basic` + `basic-reverse` + `cloze`** (Cloze in
|
||||||
auf full-set (cloze, type-in, image-occlusion, audio, multiple-choice).
|
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)
|
Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/playbooks/CARDS_GREENFIELD.md)
|
||||||
(im Plattform-Repo, weil er Verein-übergreifend gilt).
|
(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) |
|
| 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 |
|
| 6 | Subscriptions/Credits via mana-credits | ⏸ offen | autonom möglich |
|
||||||
| 7 | AI/MCP-Integration | ⏸ offen | braucht laufende mana-mcp |
|
| 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 |
|
| 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 |
|
| 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config |
|
||||||
| 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 |
|
| 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 |
|
||||||
|
|
@ -216,6 +221,10 @@ Volle Konventionen: [`CLAUDE.md`](CLAUDE.md)
|
||||||
## Git-Historie
|
## 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
|
0328caa Phase 5: Föderations-Endpunkte — Cards ist föderierter Peer
|
||||||
89a7a92 Phase 4: Frontend-Core MVP — Decks, Cards, Study mit FSRS-Loop
|
89a7a92 Phase 4: Frontend-Core MVP — Decks, Cards, Study mit FSRS-Loop
|
||||||
e3b3a2b docs: SMOKE_TEST.md — verifizierter E2E-Lauf gegen lokale Postgres
|
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**
|
Beim Card-Insert werden alle initialen Reviews in **einer Transaktion**
|
||||||
mit angelegt — siehe `apps/api/src/routes/cards.ts` POST-Handler.
|
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
|
### 3. Lokales Protocol-Mirror
|
||||||
|
|
||||||
|
|
@ -280,7 +291,50 @@ Swap auf mana-auth:
|
||||||
- Web: `@mana/shared-auth`-Login-Flow gegen `auth.mana.how`
|
- Web: `@mana/shared-auth`-Login-Flow gegen `auth.mana.how`
|
||||||
- Beide aus Verdaccio (= NPM_AUTH_TOKEN-blockiert)
|
- 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 `<img>` 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
|
Strategie-B-Konsequenz: nach `cardecky.mana.how` live + 2 Wochen Test
|
||||||
folgt ein Decommission-PR in mana-monorepo, der `apps/mana/.../modules/cards/`,
|
folgt ein Decommission-PR in mana-monorepo, der `apps/mana/.../modules/cards/`,
|
||||||
|
|
@ -311,13 +365,17 @@ diskutiert worden.
|
||||||
|
|
||||||
In Reihenfolge meiner Empfehlung:
|
In Reihenfolge meiner Empfehlung:
|
||||||
|
|
||||||
1. **Phase 8 (Anki-Import)** — autonom, klar abgegrenzte Funktionalität,
|
1. **Card-Edit-Page + Inbox-Banner im Frontend** — 1–2 Tage Polish.
|
||||||
~5–7 Tage. Brauchbar als Migrations-Hilfe für künftige User.
|
Schließt die augenfälligste UI-Lücke (Karten kann man anlegen aber
|
||||||
2. **Card-Edit-Page + Inbox-Banner im Frontend** — 1–2 Tage Polish.
|
nicht editieren). Cloze-Editor wäre sinnvoll mitzuziehen.
|
||||||
3. **Pre-Flight aktiv abräumen** — Mana-Plattform-Stack + mana-auth
|
2. **Pre-Flight aktiv abräumen** — Mana-Plattform-Stack + mana-auth
|
||||||
live, dann Cards als App registrieren (Phase 2).
|
live, dann Cards als App registrieren (Phase 2). NPM_AUTH_TOKEN
|
||||||
4. **Phase 6 (Subscriptions)** — braucht laufende mana-credits.
|
für Verdaccio liegt laut Memory bereits vor — der Protocol-Mirror-
|
||||||
5. **Phase 9 (Polish)** — Settings, Account, DSGVO-UI, Statistik, i18n.
|
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-
|
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.
|
Live), Phase 10 (Mac-Mini-Deploy) — alle hängen an Pre-Flight-Items.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue