diff --git a/STATUS.md b/STATUS.md index f520360..c2475ab 100644 --- a/STATUS.md +++ b/STATUS.md @@ -13,10 +13,10 @@ in 5 Minuten den vollen Kontext geben. Lies es vor allem anderen. 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). -- **22 saubere Commits** auf `main`. Type-check 4/4 grün, **105 Tests - grün** (51 Domain + 49 API + 5 Web), lokaler E2E-Smoke (Postgres → - API → Frontend → Föderations-Endpunkte → Cloze-Card mit Hint → - /stats → /me/export → /cards/hashes) durch. +- **24 saubere Commits** auf `main`. Type-check 4/4 grün, **129 Tests + grün** (66 Domain + 56 API + 7 Web), lokaler E2E-Smoke (Postgres → + API → MinIO → Frontend → Cloze + Image-Occlusion + Anki-Import mit + Media → /stats → /me/export → /cards/hashes) durch. - **Phasen 0, 1, 3, 4, 5, 8 vollständig durch.** **Phase 9 Polish- Welle teilweise** (Card-Edit, Cloze-Editor, Inbox-Banner, Account- /DSGVO-Self-Service, Statistik-Dashboard) — i18n + Image-Occlusion @@ -67,9 +67,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 `basic` + `basic-reverse` + `cloze`** (Cloze in - Phase 8 ergänzt). Schema vorbereitet auf full-set (type-in, - image-occlusion, audio, multiple-choice). +6. **MVP-Card-Types `basic` + `basic-reverse` + `cloze` + + `image-occlusion`** (Cloze Phase 8, Image-Occlusion Phase 9l). + Schema vorbereitet auf type-in, 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). @@ -89,7 +89,7 @@ Vollständiger Plan: [`mana/docs/playbooks/CARDS_GREENFIELD.md`](../mana/docs/pl | 6 | Subscriptions/Credits via mana-credits | ⏸ offen | autonom möglich | | 7 | AI/MCP-Integration | ⏸ offen | braucht laufende mana-mcp | | 8 | Anki-Import (.apkg-Parser, Cloze-Support) | ✅ | 92 Tests grün, /import-Route benutzbar, Cloze als 3. MVP-Card-Type | -| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y) | 🟡 weit | Card-Edit + Cloze-Editor + Inbox-Banner + Account/DSGVO + Statistik + Pre-Flight-Swap + i18n DE/EN + A11y-Pass + Cloze-Hint-Anzeige + Anki-Re-Import-Dedupe durch (9a–9j). Verbleibend: Image-Occlusion, manueller Cloze-Hint-Editor-Help-UI, Media-Upload für Anki-Import | +| 9 | Polish (DSGVO-UI, Settings, Account, Statistik, i18n, A11y, Media, Image-Occlusion) | 🟡 weit | Card-Edit + Cloze-Editor + Inbox-Banner + Account/DSGVO + Statistik + Pre-Flight-Swap + i18n DE/EN + A11y-Pass + Cloze-Hint-Anzeige + Anki-Re-Import-Dedupe + MinIO-Media-Upload + Image-Occlusion durch (9a–9l). Verbleibend: type-in, audio, multiple-choice (Schema vorbereitet) | | 10 | Production-Deploy (Mac Mini, Cloudflare-Tunnel) | ⏸ offen | braucht DNS + Tunnel-Config | | 11 | Decommission Cards-Modul aus mana-monorepo | ⏸ offen | erst nach Phase 10 | @@ -105,9 +105,10 @@ Legende: ✅ erledigt + verifiziert · 🚧 blockiert · ⏸ noch nicht begonnen cd /Users/till/Documents/Code/cards # 1. Dependencies (idempotent) -pnpm install +NPM_AUTH_TOKEN= pnpm install -# 2. Postgres-Container (auf :5435, kollidiert nicht mit Mana-Plattform-:5432) +# 2. Postgres + MinIO-Container (Postgres :5435, MinIO :9100/:9101 — +# kollidiert nicht mit Plattform-:5432/:9000/:9001) pnpm docker:up # 3. Drizzle-Schema pushen @@ -231,6 +232,9 @@ Volle Konventionen: [`CLAUDE.md`](CLAUDE.md) ## Git-Historie ``` +39b1791 Phase 9l: Image-Occlusion als 4. MVP-CardType +c9eb0a6 Phase 9k: Media-Upload via MinIO-Container +e7ae93d docs: STATUS.md auf Phase-9-Welle-2-Stand 593d447 Phase 9j: Anki-Re-Import-Dedupe via content_hash 4b451f1 Phase 9i: Cloze-Hint-Anzeige fd86d96 Phase 9h: A11y-Pass @@ -371,6 +375,38 @@ 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`. +### 11. MinIO-Media-Storage (Sprint 9k) + +`cards-minio`-Container im `infrastructure/docker-compose.yml` auf +9100/9101 (Plattform-MinIO ist 9000/9001 — wir bleiben isoliert). +`apps/api/src/services/storage.ts` ist ein dünner Wrapper um den +`minio`-Client; `ensureBucket()` ist idempotent. ObjectKey-Format +`/.` ermöglicht Bucket-Prefix-Sweep beim +DSGVO-Delete (kein S3-Cascade). + +Konfiguration via `CARDS_S3_*`-env-Vars; Default lokaler Container. +Phase-10-Prod kann gegen denselben Container auf dem Mac Mini laufen +(eigener Bucket) oder gegen Plattform-MinIO. Keine Code-Änderung, +nur env. + +### 12. Image-Occlusion (Sprint 9l) + +Field-Schema: `image_ref` zeigt auf eine `media_files.id` (Sprint 9k +Storage), `mask_regions` ist ein JSON-Array mit Schema: +`{ id, x, y, w, h, label? }`, alle Coords 0..1 relativ. +`subIndexCount('image-occlusion')` wirft analog zu cloze; Card-POST +nutzt `maskRegionCount(mask_regions)`. + +Editor (`ImageOcclusionEditor.svelte`): SVG-Overlay über ``, +Drag-to-create für Masken, Mindestgröße 2% damit Klicks gefiltert +werden. Touch-tauglich via Pointer-Events. Mask-Liste mit Inline- +Label-Edit + Delete. + +Study-View (`ImageOcclusionView.svelte`): aktive Maske ist im Prompt +opake schwarz, im Reveal transparent grün mit Label-Text-Overlay +(SVG-Text mit stroke-Outline gegen Bild-Hintergründe). Andere Masken +bleiben dezent gelb-durchsichtig als Lern-Hinweis. + ### 10. content_hash auf cards (Sprint 9j) Jede neue Karte bekommt einen SHA-256-`content_hash` über @@ -423,23 +459,25 @@ In Reihenfolge meiner Empfehlung: `mana-ev/cards`, mana-auth-App-Reg (Service-Key + Public-Key), mana-share-Manifest-Reg. Hängt an User-Aktion + laufender Plattform. -2. **Media-Upload für Anki-Import** (Sprint-Kandidat 15) — lokaler - `POST /api/v1/media/upload`-Endpoint mit MinIO oder Disk; - Anki-Importer reicht die Filename→URL-Map durch sanitizeAnkiHtml. - Open: Storage-Backend-Wahl (MinIO vs. lokal). 1–2 Tage. -3. **Phase 6 (Subscriptions)** — braucht laufende mana-credits + +2. **Phase 6 (Subscriptions)** — braucht laufende mana-credits + Phase 2 Auth-Föderation. -4. **Phase 7 (AI/MCP)** — braucht laufende mana-mcp. -5. **Phase 10 (Production-Deploy)** — Mac Mini + Cloudflare-Tunnel, - nach allen Pre-Flight-Items. -6. **content_hash-Backfill** — Pre-Phase-9j-Karten haben null +3. **Phase 7 (AI/MCP)** — braucht laufende mana-mcp. +4. **Phase 10 (Production-Deploy)** — Mac Mini + Cloudflare-Tunnel + (cardecky.mana.how + cards-api.mana.how) + MinIO-Bucket + (eigener Container oder Plattform), nach allen Pre-Flight-Items. +5. **content_hash-Backfill** — Pre-Phase-9j-Karten haben null content_hash; ein einmaliges Skript würde sie nachziehen, sodass Re-Import-Dedupe lückenlos funktioniert. Phase 10-Polish, sobald Live-User da sind. +6. **Weitere CardTypes** — type-in, audio, multiple-choice sind + im Future-Schema vorbereitet, kommen wenn der User-Wunsch klar + ist. +7. **Image-Occlusion-Polish** — Resize/Move existierender Masken + (aktuell: nur Draw + Delete), Mask-Reorder, Mehrere Masken in + einem Cluster (mehrere als ein Review). Was nicht autonom geht: Phase 2, 6, 7, 10 — alle hängen an Pre-Flight -oder Plattform-Diensten. Phase 9 ist breit ausgebaut; Image-Occlusion -und Image-Occlusion-Editor wären die nächsten autonomen Polish-Items. +oder Plattform-Diensten. Phase 9 ist sehr breit ausgebaut. ---