Tag 1: initiale Extraktion aus memoro-native. Tag 2: Reifung zu v1.5.0 (Account-Lifecycle, Guest-Mode + Refresh-Resilience, 2FA, ProfileInfo). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
83 lines
3.4 KiB
Markdown
83 lines
3.4 KiB
Markdown
---
|
||
date: 2026-05-12
|
||
day: 1
|
||
view: macher
|
||
weekday: Dienstag
|
||
commits: 1
|
||
review: written
|
||
---
|
||
# Dienstag, 2026-05-12 — Tag 1 (Macher-Sicht)
|
||
|
||
**v1.0.0 — initiale Extraktion aus memoro-native.** Swift-Package
|
||
mit zwei Library-Products: `ManaCore` (Auth + Transport) und
|
||
`ManaTokens` (Vereins-Designwerte aus `mana/docs/THEMING.md`).
|
||
|
||
## Stats
|
||
|
||
1 Commit, +1 151 / −0 LoC, 23 Files. 17× `.swift`. Top-Dirs:
|
||
`Sources/ManaCore/Auth` (22 %), `Sources/ManaTokens/Colors` (13 %),
|
||
`Sources/ManaTokens/Spacing` (9 %).
|
||
|
||
## Was im Initial-Commit drin ist
|
||
|
||
- **ManaCore.Auth** — `AuthClient` (Login + Refresh gegen
|
||
`/api/v1/auth/login` und `/api/v1/auth/refresh`),
|
||
`KeychainStorage` für Access/Refresh-Token-Persistenz, JWT-Decode
|
||
+ Expiry-Check, 401-Retry-Loop in `Transport`.
|
||
- **ManaCore.Transport** — URLSession-Wrapper, protocol-injected
|
||
für Tests, automatisches Refresh-on-401.
|
||
- **ManaTokens** — Vereins-Farben (`mana`, `forest`, demnächst
|
||
weitere Themes), Spacing-Skala, Typography-Konstanten. Spiegelt
|
||
`mana/docs/THEMING.md` 1:1.
|
||
- **Verpackung**: `Package.swift` mit Swift 6.0, iOS 18 / macOS 15,
|
||
Strict Concurrency komplett.
|
||
|
||
## Architektur-Entscheidungen
|
||
|
||
- **Genau zwei Library-Products.** `ManaCore` + `ManaTokens`. UI-
|
||
Komponenten (`ManaUI`) entstehen in einem separaten Repo
|
||
(`mana-swift-ui`, Phase ε). Hier nicht.
|
||
- **Keine externen Dependencies.** Nur Foundation, Security, OSLog,
|
||
Combine. Begründung Compliance + Build-Stabilität. Kein Alamofire,
|
||
kein Sentry.
|
||
- **Public API ist `Sendable`.** Swift-6-Concurrency strikt; jeder
|
||
Cross-Actor-Type annotiert.
|
||
- **App injiziert ihre Config.** `authBaseURL`, `keychainService`,
|
||
`keychainAccessGroup` kommen vom Caller. ManaCore hat keine
|
||
Hardcoded-App-Konstanten außer den mana-auth-Endpoint-Pfaden
|
||
(`/api/v1/auth/login`, `/api/v1/auth/refresh`).
|
||
- **OSLog statt print/Sentry.** ManaCore loggt unter Subsystem
|
||
`ev.mana.core`. Apps haben ihr eigenes Subsystem.
|
||
- **Tests gegen reine Logik**, nicht echtes Netzwerk. URLSession
|
||
über Protokoll-Injection mockbar.
|
||
- **Keine app-spezifischen Annahmen.** ManaCore weiß nichts über
|
||
Memos, Decks, Meals. Wenn das Paket „etwas für Memoro" lernen
|
||
will, gehört es zurück in memoro-native.
|
||
|
||
## Trade-offs
|
||
|
||
- **Wortwörtliche Extraktion**, keine spekulative Verallgemeinerung.
|
||
Die `AuthClient`-API ist die alte memoro-Variante; falls neue
|
||
Apps andere Bedürfnisse haben, lieber additiv erweitern als
|
||
vorab abstrahieren.
|
||
- **+1 151 LoC in einem Commit** ist groß, aber sauber: das war
|
||
ein Move-Commit, kein Feature-Commit. Hätte man auf Auth/
|
||
Transport/Tokens splitten können — pragmatisch zusammen, weil
|
||
alle drei aus demselben Source-Repo kamen.
|
||
- **Initiale Versions-Politik strikt Semver.** Patch-Bugfix,
|
||
Minor-additiv, Major-breaking. Pflege-Politik: letzte zwei
|
||
Major-Versionen.
|
||
|
||
## Offene Punkte
|
||
|
||
- **`mana-swift-ui`-Repo** existiert noch nicht — UI-Komponenten
|
||
bleiben pro App, bis Phase ε in einem dritten Repo extrahiert
|
||
wird (kam morgen, siehe `mana-swift-ui` Tag 1).
|
||
- **2FA-Endpoint-Spezifikation** im AuthClient fehlt — Memoro hatte
|
||
noch kein 2FA. Wenn die UI-Schicht 2FA bekommt, muss ManaCore
|
||
nachziehen.
|
||
- **Refresh-Token-Rotation** (`mana-auth` hat dafür einen Endpoint)
|
||
ist in AuthClient noch nicht. Patch-Bump-Kandidat.
|
||
- **Theme-Variants** in ManaTokens noch hartcodiert auf `mana` und
|
||
`forest`. Die im THEMING.md beschriebenen weiteren Themes
|
||
(`spruce`, `cardecky`, …) folgen.
|