devlog: 1 Tag geschrieben (v0.1.0–v0.5.0 Sprint)

ManaAuthUI-Initialsprint mit 5 Versions-Schritten in einer Session.
spieler.md + macher.md hand-curated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-15 22:21:39 +02:00
parent 117538f77a
commit e284240f3c
3 changed files with 240 additions and 0 deletions

126
devlog/2026-05-13/data.json Normal file
View file

@ -0,0 +1,126 @@
{
"date": "2026-05-13",
"day_number": 1,
"weekday": "Mittwoch",
"commits": 5,
"authors": [
{
"name": "Till JS",
"count": 5
}
],
"additions": 4247,
"deletions": 4,
"net_lines": 4243,
"files_changed": 39,
"new_files": 0,
"deleted_files": 0,
"session": {
"first_commit_at": "2026-05-13T17:22:42.000Z",
"last_commit_at": "2026-05-13T23:08:41.000Z",
"total_span_minutes": 346,
"active_minutes": 48,
"pauses": [
{
"from": "19:22",
"to": "22:16",
"minutes": 174
},
{
"from": "22:16",
"to": "00:20",
"minutes": 124
}
],
"longest_focus_minutes": 48
},
"top_dirs": [
{
"path": "CHANGELOG.md",
"pct": 11
},
{
"path": "Sources/ManaAuthUI/TwoFactor",
"pct": 11
},
{
"path": "Sources/ManaAuthUI/Login",
"pct": 9
},
{
"path": "Sources/ManaAuthUI/Reset",
"pct": 9
},
{
"path": "Sources/ManaAuthUI/Account",
"pct": 6
}
],
"top_extensions": [
{
"ext": ".swift",
"count": 38
},
{
"ext": ".md",
"count": 7
},
{
"ext": ".gitignore",
"count": 2
}
],
"tags": [],
"commits_list": [
{
"hash": "0a2cb34",
"short": "v0.1.0 — initialer Sprint, vollständige Auth-Reise als SwiftUI",
"type": null,
"scope": null,
"additions": 2614,
"deletions": 0,
"timestamp": "2026-05-13T19:22:42+02:00"
},
{
"hash": "6417b4c",
"short": "v0.2.0 — ManaAuthGate für Action-Level-Login-Eskalation",
"type": null,
"scope": null,
"additions": 357,
"deletions": 0,
"timestamp": "2026-05-13T22:16:27+02:00"
},
{
"hash": "c155556",
"short": "v0.3.0 — ManaTwoFactorChallengeView",
"type": null,
"scope": null,
"additions": 348,
"deletions": 4,
"timestamp": "2026-05-14T00:20:30+02:00"
},
{
"hash": "dc8e5a4",
"short": "v0.4.0 — ManaTwoFactorEnrollView + ManaTwoFactorDisableView",
"type": null,
"scope": null,
"additions": 595,
"deletions": 0,
"timestamp": "2026-05-14T00:39:03+02:00"
},
{
"hash": "117538f",
"short": "v0.5.0 — ManaTwoFactorAccountRow + ManaBackupCodeRegenerateView",
"type": null,
"scope": null,
"additions": 333,
"deletions": 0,
"timestamp": "2026-05-14T01:08:41+02:00"
}
],
"review_state": "auto",
"llm": {
"model": null,
"generated_at": null
}
}

View file

@ -0,0 +1,79 @@
---
date: 2026-05-13
day: 1
view: macher
weekday: Mittwoch
commits: 5
review: written
---
# Mittwoch, 2026-05-13 — Tag 1 (Macher-Sicht)
Initialer Sprint des Pakets. Aus drei fast-byte-identischen
`LoginView.swift`-Files in cards-native, manaspur-native und
memoro-native wird ein gemeinsames Swift-Package — plus das, was
bisher gar nicht da war: Sign-Up, E-Mail-Verifikation, Passwort-Reset,
Account-Management. Und 2FA, weil die Lücke beim Aufräumen sichtbar
wurde.
## Stats
5 Commits, +4 247 / 4 LoC, 39 Files. Sessionspanne 17:22 → 01:08,
~48 aktive Minuten in einem Durchstich. Bei +4 243 netto ist das
v0.1.0 mit allem Anhang, nicht „aktive Tipparbeit" — die Inhalte
flossen aus den drei App-Repos zusammen.
## Versionsschritte des Tages
- **v0.1.0** — vollständige Auth-Reise als SwiftUI: Login, Sign-Up,
Email-Verify-Gate, Forgot-/Reset-Password, Change-Email,
Change-Password, Delete-Account. ViewModels strikt getrennt von
Views, jeder Flow eigene `@Observable`-State-Maschine.
- **v0.2.0**`ManaAuthGate`, der „bitte-erst-einloggen"-Wrapper
für Action-Level-Eskalation. Cards/Manaspur/Memoro brauchen das
pro Aktion, nicht pro Screen.
- **v0.3.0**`ManaTwoFactorChallengeView` für den Login-Step,
wenn der Server 2FA verlangt.
- **v0.4.0**`ManaTwoFactorEnrollView` (QR-Code + Verify) und
`ManaTwoFactorDisableView` (Passwort-Bestätigung).
- **v0.5.0**`ManaTwoFactorAccountRow` für den Account-Tab und
`ManaBackupCodeRegenerateView`.
Fünf Tags in einer Session ist viel — der Schnitt war pro
Feature-Komplex, damit Consumer-Apps gezielt minor-bumpen können
ohne 2FA mitzunehmen, das sie noch nicht zeigen.
## Architektur-Entscheidungen
- **Pure SwiftUI, keine UI-Lib** — gleiche Regel wie `ManaCore`.
Senkt Drift-Risiko zwischen Vereins-Apps.
- **App injiziert `ManaBrandConfig`** — Pakets-Sources kennen keinen
App-Namen, keine Farben. `forest`/`mana`/künftige Themes leben in
der konsumierenden App, bis Token-Theme-Variants kommen.
- **ViewModel-zuerst-Pattern.** Tests gehen gegen ViewModels via
URLProtocol-Mock, Views sind dünn und ungetestet — das passt zum
Swift-Test-Realismus auf macOS-CI.
- **Account-Löschung ist Pflicht** (App-Store-Guideline 5.1.1(v));
`ManaDeleteAccountView` ist Bestandteil jedes Sign-Up-Anbieters.
- **2FA-Flow läuft komplett über `ManaCore` v1.2.0** (Guest-Mode +
Refresh-Resilience), keine eigenen API-Wrapper in UI.
## Trade-offs
- 4 243 netto Zeilen für „v0.1.0 + v0.5.0 in einer Session" — das
hat nur funktioniert, weil drei Source-Repos schon Login-Code in
ähnlicher Form hatten. Hätten wir Sign-Up parallel in drei Apps
gebaut, wäre der Tag dreimal so lang.
- Sprache deutsch im Public-API. Lokalisierungs-Refactor später,
wenn EN-Bedarf real wird; jetzt würde die Indirection bremsen.
- 2FA UI ist da, aber Server-seitig fehlt der Endpoint in
`mana-auth` noch in mancher Form — die Views laufen daher
zunächst gegen Stub-Antworten.
## Offene Punkte
- ManaTokens-Theme-Variants → erst dann `ManaBrandConfig` ersetzen.
- Snapshot-Tests für Views fehlen; ViewModel-Tests laufen.
- Localizable.xcstrings (EN) noch nicht angelegt — kommt mit der
ersten konkreten EN-Anforderung.
- Cross-App-Probelauf: 2FA-Enroll von cards-native gegen Production
noch nicht durchgespielt.

View file

@ -0,0 +1,35 @@
---
date: 2026-05-13
day: 1
view: spieler
weekday: Mittwoch
commits: 5
review: written
---
# Mittwoch, 2026-05-13 — Tag 1
Drei Apps hatten bisher fast identische Login-Bildschirme, Sign-Up
fehlte komplett, und „Account löschen" konnte nirgendwo richtig
gezeigt werden. Heute ist daraus ein gemeinsamer Bausatz geworden —
**ManaAuthUI**.
## Was sich für dich ändert (in Cards, Manaspur, Memoro)
- Sign-In, Registrierung, „Passwort vergessen?" und E-Mail-Verifikation
sehen jetzt überall gleich aus und führen sauber von einem Schritt
zum nächsten. Wenn du eine App schon kennst, kennst du die andere.
- **Zwei-Faktor-Schutz für deinen Account** ist nun durchgängig
möglich. Du kannst ihn einschalten (über eine Authenticator-App),
Backup-Codes neu erzeugen und ihn wieder ausschalten — vorausgesetzt,
du bestätigst kurz mit Passwort.
- **Account-Löschung** ist überall erreichbar, mit klarem
Bestätigungs-Schritt. Kein Kleingedrucktes, kein versteckter Pfad.
- Wer mitten in einer Aktion plötzlich gefragt wird „bitte erst noch
einloggen", bekommt das jetzt als sanfte Eskalation, nicht als harten
Rauswurf.
## Hintergrund
Diese Sachen waren bisher pro App gebaut — mit Unterschieden, die
keinem Menschen helfen. Ab jetzt: eine gemeinsame Tür für alle
Vereins-Apps. Was du in einer App lernst, hilft dir in der nächsten.