cards-native/PLAN.md
Till JS f664a00b64 v0.2.0 — Phase β-1 Decks lesen
Deck-Liste mit Web-Parität: alle eigenen Decks aus cardecky-api,
Card-/Due-Counts pro Deck (Web-Pattern: separate Calls), Pull-to-
Refresh, Offline-Read via SwiftData, Inbox-Banner für Marketplace-
Forks.

- Deck-Codable-DTO mit snake_case-CodingKeys (DeckCategory,
  DeckVisibility, FsrsSettings)
- ISO8601-Date-Decoder mit Fractional-Seconds-Toleranz
- CardsAPI.listDecks() + cardCount() + dueCount()
- CachedDeck SwiftData-Model mit lastFetchedAt
- DeckListStore (API + Cache, paralleles Counts-Fetching via TaskGroup)
- DeckListView mit forest-Theme, deck.color-Streifen, Inbox-Banner
- AccountView mit Sign-out
- DashboardView durch DeckListView ersetzt
- 6 Unit-Tests + 1 UI-Test grün

Phasen-Plan: mana/docs/playbooks/CARDS_NATIVE_GREENFIELD.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 00:06:28 +02:00

3.3 KiB

Plan — cards-native (SwiftUI Universal)

Stand: 2026-05-13 — Phasen β-0 + β-1 abgeschlossen. Repo lebt auf Forgejo, Login funktioniert, Deck-Liste mit Card-/Due-Counts + Offline-SwiftData-Cache + Pull-to-Refresh + Inbox-Banner für Marketplace-Forks. 6 Unit-Tests + 1 UI-Test grün.

SOT: ../mana/docs/playbooks/CARDS_NATIVE_GREENFIELD.md. Dieses File ist die App-lokale Status-Spur, das Greenfield-Doc hat die ganze Architektur-Begründung.

Aktueller Stand

β-0 — Setup (2026-05-12, Tag v0.1.0)

  • Repo-Skelett unter git.mana.how/till/cards-native
  • project.yml mit Bundle-ID ev.mana.cards, ManaSwiftCore via path: ../mana-swift-core
  • AppConfig als ManaAppConfig-Provider:
    • Auth: https://auth.mana.how
    • API: https://cardecky-api.mana.how
    • Keychain-Service: ev.mana.cards
  • CardsTheme.swift mit forest-Werten (lokal nachgebaut aus mana/packages/themes/src/variants/forest.css)
  • LoginView (Email/PW gegen mana-auth)
  • 3 Unit-Tests (AppConfig)

β-1 — Decks lesen (2026-05-13, Tag v0.2.0)

  • Deck-Codable-DTO mit snake_case-CodingKeys, plus DeckCategory, DeckVisibility, FsrsSettings
  • ISO8601-Date-Decoder mit Fractional-Seconds-Toleranz
  • CardsAPI.listDecks(), cardCount(deckId:), dueCount(deckId:)
  • CachedDeck als SwiftData-Model mit lastFetchedAt (Offline-Read)
  • DeckListStore orchestriert API + Cache, paralleles Counts-Fetching via TaskGroup
  • DeckListView mit Pull-to-Refresh, Card/Due-Counts, deck.color-Streifen, Inbox-Banner für Marketplace-Forks
  • AccountView mit Sign-out-Button
  • iOS-Simulator-Build + Tests grün (6 Unit-Tests, 1 UI-Test)

Phasen (Detail in Greenfield-Plan)

Phase Status Inhalt
β-0 2026-05-12 Setup, Login, API-Probe
β-1 2026-05-13 Decks lesen, SwiftData-Cache, Pull-to-Refresh
β-2 Study-Loop, Offline-Grade-Queue, Endurance-Test
β-3 Card-/Deck-Editor (basic, cloze, typing, multiple-choice)
β-4 Media, image-occlusion (PencilKit), audio-front
β-5 Marketplace, Universal-Links
β-6 Native-Polish (Widgets, Notifications, Share-Extension)
β-7 App-Store-Submission

Nächste Schritte für β-2

Aus Greenfield-Plan-Sektion "Phase β-2 — Study-Loop":

  1. Card-DTO + Review-DTO aus cards/apps/api/src/lib/dto.ts
  2. CardsAPI.dueCards(deckId:) → fetcht /reviews/due + zugehörige /cards/:id-Details für die Karten-Inhalte
  3. StudySessionView mit CardRenderer-switch (basic + basic-reverse
    • cloze; cloze-Rendering kommt vom Server via renderClozePrompt)
  4. Flip-Animation, Rating-Bar (again | hard | good | easy)
  5. POST /api/v1/reviews/:cardId/:subIndex/grade mit Haptic-Feedback
  6. PendingGrade SwiftData-Model als Offline-Queue, Drain bei Reconnect
  7. Endurance-Test auf realem Gerät (200+ Karten, Flugmodus zwischendurch)

Erfolgskriterium: 50 Karten am Stück im Simulator durchgraden, Web zeigt nach Refresh die gleichen Reviews-States.

Cross-Refs

  • ../mana/docs/playbooks/CARDS_NATIVE_GREENFIELD.md — Greenfield-Plan SOT
  • ../mana/docs/MANA_SWIFT.md — Plattform-SOT
  • ../cards/CLAUDE.md — Cards-Repo
  • ../cards/STATUS.md — Web-Phasenstand (Referenz)
  • ../mana-swift-core/CLAUDE.md — ManaCore-Konventionen
  • CLAUDE.md — Repo-Konventionen