From e284240f3c56f74add42728b379a63f4c99723a2 Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 15 May 2026 22:21:39 +0200 Subject: [PATCH] =?UTF-8?q?devlog:=201=20Tag=20geschrieben=20(v0.1.0?= =?UTF-8?q?=E2=80=93v0.5.0=20Sprint)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ManaAuthUI-Initialsprint mit 5 Versions-Schritten in einer Session. spieler.md + macher.md hand-curated. Co-Authored-By: Claude Opus 4.7 (1M context) --- devlog/2026-05-13/data.json | 126 +++++++++++++++++++++++++++++++++++ devlog/2026-05-13/macher.md | 79 ++++++++++++++++++++++ devlog/2026-05-13/spieler.md | 35 ++++++++++ 3 files changed, 240 insertions(+) create mode 100644 devlog/2026-05-13/data.json create mode 100644 devlog/2026-05-13/macher.md create mode 100644 devlog/2026-05-13/spieler.md diff --git a/devlog/2026-05-13/data.json b/devlog/2026-05-13/data.json new file mode 100644 index 0000000..81727ad --- /dev/null +++ b/devlog/2026-05-13/data.json @@ -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 + } +} diff --git a/devlog/2026-05-13/macher.md b/devlog/2026-05-13/macher.md new file mode 100644 index 0000000..9042a76 --- /dev/null +++ b/devlog/2026-05-13/macher.md @@ -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. diff --git a/devlog/2026-05-13/spieler.md b/devlog/2026-05-13/spieler.md new file mode 100644 index 0000000..10ed6e2 --- /dev/null +++ b/devlog/2026-05-13/spieler.md @@ -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.