@mana/shared-ui-2@0.1.0 wurde heute publiziert. Cards' einziger shared-ui-Konsument war PillTabGroup im Header (Routen-Nav + DE/EN-Switcher). Drop-in-Migration: - apps/web/package.json: @mana/shared-ui + @mana/shared-icons raus (letzteres war nur shared-ui-Transitive, in Cards-Code nirgends direkt importiert), @mana/shared-ui-2 ^0.1.0 rein. - Header.svelte: Import wechselt von @mana/shared-ui auf @mana/shared-ui-2. primaryColor-Prop entfernt — shared-ui-2 PillTabGroup nutzt --color-primary direkt aus dem 12-Token-Set. Bridge-Aliase in app.css bleiben — Cards' Eigen-Komponenten (Header-Logo, Modals, Marketplace, Routen) nutzen historisch --color-card, --color-popover, --color-accent etc. Diese Tokens existieren im 12-Token-Mana-Set NICHT, aber die Aliase mappen sie weiter aufs 12er-Set. Aliase-Kommentar präzisiert: nicht mehr für shared-ui@0.1.x (raus), sondern für Cards-eigenen Code, bis Cards in eigenem Refactor-Sprint auf das 12er-Vokabular umzieht. Type-check-Pipeline schrumpft drastisch: von 3994 Files (mit shared-ui@0.1.x's 176 Quellfiles + transitive) auf 439 Files (nur Cards + shared-ui-2's kleinerer Surface). Build sauber, weniger JS im Output-Bundle. Cards ist damit die erste Vereins-App, die operativ auf shared-ui-2 läuft — End-to-End-Beweis dass das System trägt. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.9 KiB
CLAUDE.md — cards repo
Guidance for Claude Code when working in this repository.
Wenn du gerade neu bist: lies zuerst
STATUS.md— dort steht der aktuelle Phasen-Stand, was schon läuft, was offen ist, und wie du lokal verifizierst. Dieses CLAUDE.md ist nur die Konventions- und Architektur-Referenz; der Status lebt in STATUS.md, damit er nicht zwischen mehreren Dateien drifted.
Was dieses Repo ist
Cards — eigenständige föderierte Spaced-Repetition-App des Vereins mana e.V. Greenfield-Build (Strategie B, beschlossen 2026-05-08). Cards ist eine Peer-App im mana-Ökosystem: redet über mana-share/-mcp/-search/-events/-credits mit Memoro, Who und der Mana-Successor-App, hat aber eigene DB, eigenes Frontend, eigene Deployment-Pipeline.
HTTP/JWT ┌──────────────┐
mana e.V. ◄─────────────── │ cards/ │ Postgres `cards`
Plattform │ (this repo) │ cardecky.mana.how
(auth/credits/share/etc.) └──────────────┘
Status
Phase 0 — Repo-Skeleton. Vollständiger Plan in
mana/docs/playbooks/CARDS_GREENFIELD.md (im Plattform-Repo).
Nächste konkrete Schritte: Read-Day, dann Phase 1 (Auth-Föderation).
Konventionen
- pnpm 9.15.x, Node 20+, Turborepo 2.x
- Tabs für Indent, single quotes, 100-col Prettier
(
.prettierrc.jsonist die Source of Truth) - Stack: SvelteKit 2 + Svelte 5 (runes-only) für Web,
Hono + Bun + Drizzle für API, Postgres mit
pgSchema('cards') - Drizzle 0.38 / drizzle-kit 0.30 / zod 3 — bewusst gleich wie
mana-Plattform; Migration auf 0.45/0.31/zod-4 läuft mit Plattform-
Migrations-Pfad mit (
mana/docs/MIGRATION_DRIZZLE_ZOD.md) - JWT-Validation lokal via JWKS-Cache (5 min), niemals Live-Call zu mana-auth pro Request
- Service-to-Service-Calls via
X-Service-Key(CARDS_APP_SERVICE_KEY) oder mana-auth-issued Bearer-Tokens - Tests: Vitest für Unit/Integration, Playwright für e2e
- Formatierung:
pnpm run formatvor jedem Commit
Architektonische Invarianten
Diese sind beschlossen. Nicht ohne explizite Diskussion antasten:
- Server-authoritative MVP. Keine Dexie, keine IndexedDB, keine eigene Sync-Engine. Frontend = HTTP-Client zu cards-api. Local-First später via mana-sync-Federation, nicht durch eigenen Stack.
- Kein Code aus mana-monorepo kopiert — für die Study-/FSRS-/Sync-
Schicht. Diese Architektur (Server-authoritative, kein Dexie, neue
Type-Hierarchie) ist sauber neu ab Tag 0. Ausnahme: Marketplace-
Restore. Der ehemalige
services/cards-server/aus mana-monorepo war nie auf der Strategie-B-Verbots-Liste — er wurde am 2026-05-08 nur mit-rausgerissen, weil er anapps/cards/gekoppelt war. Bei einem Restore wird der Marketplace-Code aus demcards-decommission-base-Tag im managarten-Repo additiv re-import'd, in eigenesmarketplace-pgSchema, additiv zur Study-Welt. Plan:docs/playbooks/MARKETPLACE_RESTORE.md. - Eigene Postgres-DB
cardsim geteilten Mana-Cluster, Schema- Isolation viapgSchema('cards'). - Föderation über
@mana/shared-app-tpl. Pflicht-Endpoints (/.well-known/mana-app.json,/healthz,/api/v1/share/receive,/api/v1/tools/:name,/api/v1/search,/api/v1/dsgvo/...) kommen aus dem geteilten Boilerplate. - Keine externe SaaS, wo vermeidbar. Erlaubte Ausnahmen kommen über mana-Plattform: Stripe (mana-credits), Anthropic/OpenAI (mana-llm), Cloudflare-Tunnel (Edge-Routing).
- Encryption initial AUS. Nachrüstbar, wenn sensibles Feld auftaucht.
Repo-Struktur
cards/
├── apps/
│ ├── web/ SvelteKit-Frontend (cardecky.mana.how)
│ └── api/ Hono+Bun-Backend
├── packages/
│ └── cards-domain/ Pure-TS: FSRS, Card-Types, Schemas, Anki-Parser
├── infrastructure/ docker-compose, tunnel-config
├── docs/ DOMAIN.md, ANKI_IMPORT.md, LESSONS_FROM_MANA_MONOREPO.md, …
├── app-manifest.json Source of Truth für Föderation
└── .github/workflows/ ci.yml, deploy.yml
@mana/* Konsumation
Cards zieht alle Shared-Pakete aus Verdaccio (pkg.mana.how):
@mana/shared-share-protocol— Manifest, Envelope-Schemas@mana/shared-app-tpl— Pflicht-Endpoint-Boilerplate@mana/shared-hono— Auth-Middleware, Health-Routes, Error-Handler@mana/shared-auth— Client-SDK für Login-Flow@mana/shared-types— Common Types@mana/shared-icons,@mana/shared-i18n,@mana/shared-theme,@mana/shared-tailwind— UI-Building-Blocks (kein Code-Duplikat aus mana-monorepo)@mana/themes(^0.1.0) —forest-Variant aus 12-Token-System (siehemana/docs/THEMING.md); aktiviert viadata-theme="forest"inapp.html+@importinapp.css@mana/shared-ui-2(^0.1.0seit 2026-05-09) — Greenfield- Komponenten mit strikter 12-Token-Disziplin. Cards konsumiert heutePillTabGroup(im Header für Routen-Nav + DE/EN-Switcher). Alte@mana/shared-ui@0.1.xaus den deps entfernt; Cards-Eigen- Komponenten (Modals, Marketplace-Cards etc.) bleiben bis weiterer Refactor-Sprint app-lokal.
Alle als reguläre dependencies. Versions-Disziplin ist Klasse-A
(siehe mana/docs/SHARED_PACKAGES.md).
Wichtige Cross-Repo-Doks
mana/docs/playbooks/CARDS_GREENFIELD.md— der vollständige Planmana/docs/FEDERATION.md— Architektur-Grundlagenmana/docs/SHARE_PROTOCOL.md— Manifest- und Envelope-Schemasmana/docs/MANA_AUTH_FEDERATION.md— App-Identitäts-Modellmana/docs/SHARED_PACKAGES.md— Versionierungs-Disziplinmana/docs/PORTS.md— Port-Allokation (cards-api: TBD, cards-web: TBD)
Wenn ein neuer Pflicht-Endpoint dazukommt
app-manifest.jsonaktualisieren (Endpoint-Pfad, Auth-Mode)- Handler in
apps/api/src/routes/schreiben - Tests in
apps/api/tests/(Vitest) pnpm run validate:manifestlokal grün- CI-Workflow zieht Manifest-Validation automatisch
Wenn ein neues Tool/Share/Accept dazukommt
- Schema in
packages/cards-domain/src/schemas/definieren (zod) - JSON-Schema-Export für mana-mcp/mana-share generieren
- Handler im Manifest registrieren (
tools[].nameoderaccepts[].handler) - Implementierung in
apps/api/src/routes/tools.tsbzw.apps/api/src/share-handlers/ - Test-Coverage: zod-parse + Handler-Logic getrennt
Lokal entwickeln
pnpm install # @mana/* aus pkg.mana.how holen
pnpm docker:up # Lokales Postgres
pnpm db:push # Drizzle-Schema aktualisieren
pnpm dev # api + web parallel
Voraussetzungen:
- mana-Plattform-Stack lokal laufend (mana-auth, optional die Föderations-Services für E2E-Tests)
- Verdaccio-Token in
~/.npmrc(npm login --registry=https://pkg.mana.how)