From f7f1a238e52076659ac67c7fd0d32a2b6c710244 Mon Sep 17 00:00:00 2001 From: Paul Nothaft Date: Tue, 11 Aug 2026 12:44:32 +0200 Subject: [PATCH] Stand nach der nativen Huelle in AGENTS.md und Plan nachziehen --- AGENTS.md | 23 +++++++++++++++++++++-- UMSETZUNGSPLAN.md | 11 +++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6e91960..98d3737 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS.md — Project state, review findings, open items, and working rules -**Last updated: 2026-08-11** (after building the app — phases 1, 2, 4–10 of `UMSETZUNGSPLAN.md`). This file is the entry point for every new agent +**Last updated: 2026-08-11** (after building the app and the native iOS hull — phases 1, 2, 4–11 of `UMSETZUNGSPLAN.md`). This file is the entry point for every new agent session: what this repo is, what is finished, what is missing, and how to work here. Detail lives in the linked documents — this file points, it does not duplicate. @@ -80,7 +80,7 @@ assets. Never mix these the other way around. | `homeassistant/` | HA panel (`panel_custom`): pyscript backend + vanilla-JS frontend | ✅ **finished, in use** — to be replaced by the app | | `testumgebung/` | Script that rebuilds a throwaway Home Assistant with the real backend | ✅ new, reproducible | | `design-system/` | React component library `@audi-dash/ui`, brand-free, feeds Claude Design | ✅ done as a kit (20 components, 1,690 lines) | -| `companion-app/` | **DataMetric360** — successor app (PWA today, Capacitor iOS/Android later, HA iframe); will **replace** the panel | ✅ **all 21 screens built and tested**; PWA works; Capacitor hull pending | +| `companion-app/` | **DataMetric360** — successor app (web, PWA, native iOS/Android via Capacitor, HA iframe); will **replace** the panel | ✅ **all 21 screens built and tested**; runs natively on iOS with real data | | `design/` | Export of the Claude Design draft for DataMetric360 | 🚧 interim and now behind the code — screens were derived from the old panel instead (owner's decision) | Root files: `dashboard-muster*.html` = original static prototype (superseded, reference only), @@ -193,6 +193,25 @@ Three defects that only surfaced by running against a real Home Assistant, not b Also: two TypeScript parameter properties in the data layer broke Node's strip-only mode, which is what the smoke scripts run on — rewritten as plain fields. +Three more that only screenshots revealed — nothing failed, the pixels were simply wrong: + +4. **The vehicle block on the home screen was invisible.** `overflow: hidden` sets a flex item's + automatic minimum size to 0, so once the page was taller than the screen, flex-shrink squashed + the block to zero height and took model name, badge and plate with it. Fixed with + `.dm-inhalt > * { flex: none }`. +5. **The model name appeared twice** — once as the badge image, once as text beside it. +6. **Filenames overflowed the gallery thumbnails.** + +And one in the backend, found by watching the log against a current Home Assistant: the odometer +screening called `urlopen` directly, which HA aborts as a blocking call since 2026.8. Every trip +stayed without a distance, visible only as a warning. Now runs through `task.executor`. + +**CORS is a real constraint for this app.** `cors_allowed_origins` did not take effect on HA +2026.8 (preflight 403 even same-origin). Two consequences, both handled: the web build is served +from Home Assistant itself (`/local/dm360/`, same origin — the planned deployment anyway), and the +native hull enables `CapacitorHttp`, which routes fetch through native HTTP where CORS does not +apply. Verify this again at commissioning if the app ever moves to a separate hostname. + **A self-written QR encoder was discarded.** It disagreed with a reference implementation on 1239 of 3249 modules — the code would have been unreadable. `homeassistant/www/dm360-qr.html` now uses a vendored MIT library served from Home Assistant itself, which satisfies the actual requirement diff --git a/UMSETZUNGSPLAN.md b/UMSETZUNGSPLAN.md index a4106af..5f83e5f 100644 --- a/UMSETZUNGSPLAN.md +++ b/UMSETZUNGSPLAN.md @@ -52,7 +52,7 @@ KI-Modell oder in einer frischen Session ohne Vorwissen abgearbeitet werden kann | 7 | Alle Screens umsetzen | 3, 6 | nein | | 8 | Audi-Assets einbauen | 7 | nein | | 9 | Tests (authentifiziert + Komponenten) | 6 | nein | -| 10 | PWA + Capacitor/iOS-Sideload | 7 | Mac mit Xcode, iPhone | +| 10 | PWA + Capacitor/iOS-Sideload | 7 | erledigt bis auf das Signieren aufs Geraet | | 11 | HA-Einbettung, Ablösung + Archivierung des Panels | 7–10 | HA-Produktivinstanz | | 12 | Externer Zugriff: Cloudflare Tunnel + Reverse Proxy | teils unabhängig | Domain/DNS, Besitzer | | 13 | FMM003: MQTT, Zertifikate, Mapping, Fahrterkennung | Hardware | **ja: FMM003 verbaut** | @@ -416,10 +416,13 @@ nicht ein Riesencommit. --- -## Phase 10 — PWA und Capacitor 🟡 STUFE 1 ERLEDIGT (2026-08-11) +## Phase 10 — PWA und Capacitor ✅ ERLEDIGT (2026-08-11) -> PWA fertig. Capacitor-Konfiguration, Secure-Storage-Adapter und die QR-Seite -> liegen bereit; die Hülle selbst braucht einen Mac mit Xcode und ein Gerät. +> PWA fertig. Native Hülle gebaut und in Betrieb: Capacitor 8 für iOS und +> Android, Build im Simulator (iPhone 17 Pro, iOS 26.4) erfolgreich, App zeigt +> echte Daten. `CapacitorHttp` umgeht die CORS-Beschränkung der WebView. +> Offen bleibt allein das Signieren aufs eigene Gerät — das braucht das +> angeschlossene iPhone und die Apple-ID des Besitzers. **Ziel:** Die App läuft auf dem iPhone. Zwei Stufen — erst PWA (sofort nutzbar), dann Capacitor (Keychain + QR-Scan).