Phase 0+1: Repo-Skelett für Cards-Greenfield

Strategie B (beschlossen 2026-05-08): Cards wird als eigenständige
föderierte App neu gebaut, ohne Code-Übernahme aus mana-monorepo.

Skelett enthält:
- apps/api: Hono+Bun mit /healthz, /version, Manifest-Endpoint, leere
  pgSchema('cards'), Drizzle-Config, erstem Vitest
- apps/web: SvelteKit 2 + Svelte 5 (runes), Vite auf 3082
- packages/cards-domain: Pure-TS, CardType-Discriminated-Union,
  SubIndex-Granularität für Reviews, Future-CardType-Set vorbereitet
- infrastructure/docker-compose.yml: Postgres 16 auf 5435
- app-manifest.json: v1.0.0, Verein-owned, beta-tier
- .github/workflows/ci.yml
- docs/LESSONS_FROM_MANA_MONOREPO.md (Read-Day-Output, 15 Lehren)

Pre-Flight für Phase 2 (Auth-Föderation): DNS cardecky.mana.how,
GitHub-Repo mana-ev/cards, Cards-App-Registrierung in mana-auth,
NPM_AUTH_TOKEN für Verdaccio.

Plan: mana/docs/playbooks/CARDS_GREENFIELD.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till 2026-05-08 14:08:41 +02:00
commit 8605b1b517
37 changed files with 1197 additions and 0 deletions

13
apps/web/src/app.d.ts vendored Normal file
View file

@ -0,0 +1,13 @@
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
export {};

13
apps/web/src/app.html Normal file
View file

@ -0,0 +1,13 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Cards — Karteikarten-App des Vereins mana e.V." />
<title>Cards</title>
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

View file

@ -0,0 +1,6 @@
// Re-exports for $lib/...
//
// Phase 4: api-clients, auth, components, stores, i18n.
// Heute: Stub.
export const APP_NAME = 'cards';

View file

@ -0,0 +1,20 @@
<script lang="ts">
let { children } = $props();
</script>
<main>
{@render children?.()}
</main>
<style>
main {
font-family:
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
sans-serif;
max-width: 64rem;
margin: 0 auto;
padding: 2rem 1rem;
}
</style>

View file

@ -0,0 +1,16 @@
<script lang="ts">
// Phase-0-Skelett. Sobald Auth-Föderation steht (Phase 2),
// redirected diese Seite zu /(app) für eingeloggte User
// und zu auth.mana.how/login für anonyme.
</script>
<h1>Cards</h1>
<p>
Karteikarten-App des Vereins <strong>mana e.V.</strong>
— Phase 0, Repo-Skelett.
</p>
<p>
Plan: <a href="https://github.com/mana-ev/mana/blob/main/docs/playbooks/CARDS_GREENFIELD.md">
CARDS_GREENFIELD.md
</a>
</p>