refactor(big-bang): cards → wordeck im gesamten Code-Layer
Some checks are pending
CI / validate (push) Waiting to run

Phase 2 des cards→wordeck Big-Bang-Rebrand:

- 4 package.json: @cards/* → @wordeck/*
- packages/cards-domain/ → packages/wordeck-domain/
- 41+12 Files: from '@cards/domain' → '@wordeck/domain'
- pgSchema('cards') → pgSchema('wordeck') (Drizzle-Schema)
- 17 Files: process.env.CARDS_* → process.env.WORDECK_*
- docker-compose Service-Names: cards-* → wordeck-*
- docker-compose Volume: /Volumes/ManaData/cards → wordeck
- env-vars in compose: CARDS_DB_PASSWORD/_API_VERSION/_DSGVO_SERVICE_KEY etc. → WORDECK_*
- Log-Prefixes + Error-Strings + manifest-id 'cards' → 'wordeck'
- CORS-Origin cardecky.mana.how → wordeck.com
- .env.production.example umbenannt + S3-Key entfernt (kein MinIO mehr)

Type-Check 0 Errors in api+domain+web, 51/51 Domain-Tests grün.

DB-Rename + Container/Volume-Rename auf mana-server folgen in nächstem
Commit nach Verzeichnis-Rename.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-17 22:39:42 +02:00
parent c77100e85a
commit 372832d266
90 changed files with 213 additions and 3716 deletions

View file

@ -6,7 +6,7 @@
## TL;DR
- **Domain-Library separieren** (`@cards/domain`, framework-agnostic)
- **Domain-Library separieren** (`@wordeck/domain`, framework-agnostic)
- **Card-Type als discriminated union** mit `fields: Record<string,string>` + `subIndex`-Granularität
- **FSRS via `ts-fsrs` v5.3.2** in dünnem Adapter, Reviews bleiben PLAINTEXT
- **Markdown-Editor**, kein Rich-Text/WYSIWYG
@ -24,7 +24,7 @@ mana-monorepo hat `packages/cards-core/` mit Pure-TS:
- Keine Dexie-, Sync-, oder UI-Abhängigkeiten
- Konsumiert von App-UI-Modul UND von `services/cards-server`
**Bei uns:** `packages/cards-domain/` analog. Bewusst kein `@cards/core` (Name-Konflikt), sondern `@cards/domain`. Steht.
**Bei uns:** `packages/cards-domain/` analog. Bewusst kein `@cards/core` (Name-Konflikt), sondern `@wordeck/domain`. Steht.
## 2. Card-Type-Modell
@ -154,7 +154,7 @@ mana-monorepos `(app)/cards/`-Routen:
mana-monorepo nutzt `@mana/shared-privacy` mit `VisibilityLevel = 'private' | 'space' | 'public'`. Bei Änderungen wird `visibilityChangedAt` + `visibilityChangedBy` getrackt.
**Bei uns:** Gleiches Enum als TypeScript-Type in `@cards/domain`. Audit-Felder optional ab Phase 9 (DSGVO-Polish).
**Bei uns:** Gleiches Enum als TypeScript-Type in `@wordeck/domain`. Audit-Felder optional ab Phase 9 (DSGVO-Polish).
## 13. Tests mit fake-indexeddb
@ -185,7 +185,7 @@ mana-monorepos Marketplace hat content-hash auf jeder Karte + jedem Deck-Version
## 5 Kern-Entscheidungen für unser Greenfield
1. **`@cards/domain` als Pure-TS-Workspace-Package** — keine Framework-Bindings
1. **`@wordeck/domain` als Pure-TS-Workspace-Package** — keine Framework-Bindings
2. **Card-Type discriminated union mit `fields`-Slot + `subIndex`-Granularität** — auch wenn MVP nur basic-Karten hat
3. **`ts-fsrs` v5.3.2 hinter dünnem Adapter** — Reviews plaintext, indiziert auf `due`
4. **Cloze als Token-Parser, wenn implementiert** — Anki-kompatible Syntax

View file

@ -103,7 +103,7 @@ export class PullRequestService {
}
private deckUrl(slug: string): string {
const base = process.env.CARDS_WEB_URL || 'https://cardecky.mana.how';
const base = process.env.WORDECK_WEB_URL || 'https://cardecky.mana.how';
return `${base}/d/${slug}`;
}

View file

@ -160,13 +160,13 @@ mit drei Anpassungen:
echte mana-auth-Login-Flow ausgerollt ist (siehe `STATUS.md`),
weicht der Stub für `@mana/shared-auth`.
### 5. Hash-Implementierung: bestehende `@cards/domain` benutzen
### 5. Hash-Implementierung: bestehende `@wordeck/domain` benutzen
Alter `cards-server/src/lib/hash.ts`: eigenständige SHA-256-Implementierung.
Greenfield: `cardContentHash` in `@cards/domain` (Web-Crypto, deterministisch).
Greenfield: `cardContentHash` in `@wordeck/domain` (Web-Crypto, deterministisch).
Beim Restore: `lib/hash.ts` **nicht** mit-übernehmen, sondern
Marketplace-Code auf `cardContentHash` aus `@cards/domain` umbiegen.
Marketplace-Code auf `cardContentHash` aus `@wordeck/domain` umbiegen.
Eine Hash-Definition für die ganze App.
### 6. mana-Service-Calls: identische Pattern
@ -304,9 +304,9 @@ sofort umsetzbar mit dem bestehenden Skill.
(`mana/docs/MIGRATION_DRIZZLE_ZOD.md`). Marketplace-Schema kommt mit
Drizzle 0.38 — sollte mit upgradeen, idealerweise atomar.
- **Karten-Hash-Konsistenz zwischen Greenfield und Marketplace.**
Greenfield-`@cards/domain` `cardContentHash` ist die SoT. Marketplace-
Greenfield-`@wordeck/domain` `cardContentHash` ist die SoT. Marketplace-
`deck_cards.content_hash` muss mit demselben Algorithmus berechnet
werden — sonst funktioniert Smart-Merge nicht. Beim R2-Port-Pass
testen, dass `cardContentHash({type,fields})` aus `@cards/domain`
testen, dass `cardContentHash({type,fields})` aus `@wordeck/domain`
byte-identisch ist mit dem alten `cards-server/src/lib/hash.ts`. Wenn
nicht: alten Code anpassen, nicht `@cards/domain` brechen.
nicht: alten Code anpassen, nicht `@wordeck/domain` brechen.