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:
parent
117538f77a
commit
e284240f3c
3 changed files with 240 additions and 0 deletions
126
devlog/2026-05-13/data.json
Normal file
126
devlog/2026-05-13/data.json
Normal 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
|
||||
}
|
||||
}
|
||||
79
devlog/2026-05-13/macher.md
Normal file
79
devlog/2026-05-13/macher.md
Normal 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.
|
||||
35
devlog/2026-05-13/spieler.md
Normal file
35
devlog/2026-05-13/spieler.md
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue