cards/CLAUDE.md
Till JS d7f3b93996
Some checks are pending
CI / validate (push) Waiting to run
feat(deps): migrate Header from @mana/shared-ui@0.1.x to shared-ui-2
@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>
2026-05-09 18:27:24 +02:00

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.json ist 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 format vor jedem Commit

Architektonische Invarianten

Diese sind beschlossen. Nicht ohne explizite Diskussion antasten:

  1. 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.
  2. 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 an apps/cards/ gekoppelt war. Bei einem Restore wird der Marketplace-Code aus dem cards-decommission-base-Tag im managarten-Repo additiv re-import'd, in eigenes marketplace-pgSchema, additiv zur Study-Welt. Plan: docs/playbooks/MARKETPLACE_RESTORE.md.
  3. Eigene Postgres-DB cards im geteilten Mana-Cluster, Schema- Isolation via pgSchema('cards').
  4. 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.
  5. Keine externe SaaS, wo vermeidbar. Erlaubte Ausnahmen kommen über mana-Plattform: Stripe (mana-credits), Anthropic/OpenAI (mana-llm), Cloudflare-Tunnel (Edge-Routing).
  6. 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 (siehe mana/docs/THEMING.md); aktiviert via data-theme="forest" in app.html + @import in app.css
  • @mana/shared-ui-2 (^0.1.0 seit 2026-05-09) — Greenfield- Komponenten mit strikter 12-Token-Disziplin. Cards konsumiert heute PillTabGroup (im Header für Routen-Nav + DE/EN-Switcher). Alte @mana/shared-ui@0.1.x aus 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 Plan
  • mana/docs/FEDERATION.md — Architektur-Grundlagen
  • mana/docs/SHARE_PROTOCOL.md — Manifest- und Envelope-Schemas
  • mana/docs/MANA_AUTH_FEDERATION.md — App-Identitäts-Modell
  • mana/docs/SHARED_PACKAGES.md — Versionierungs-Disziplin
  • mana/docs/PORTS.md — Port-Allokation (cards-api: TBD, cards-web: TBD)

Wenn ein neuer Pflicht-Endpoint dazukommt

  1. app-manifest.json aktualisieren (Endpoint-Pfad, Auth-Mode)
  2. Handler in apps/api/src/routes/ schreiben
  3. Tests in apps/api/tests/ (Vitest)
  4. pnpm run validate:manifest lokal grün
  5. CI-Workflow zieht Manifest-Validation automatisch

Wenn ein neues Tool/Share/Accept dazukommt

  1. Schema in packages/cards-domain/src/schemas/ definieren (zod)
  2. JSON-Schema-Export für mana-mcp/mana-share generieren
  3. Handler im Manifest registrieren (tools[].name oder accepts[].handler)
  4. Implementierung in apps/api/src/routes/tools.ts bzw. apps/api/src/share-handlers/
  5. 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)