docs(quick-260917-h2s): Aktenstand — Desktop-Erkennung, Beta-Hinweis, deutscher Installer; Browser-Nachweise gsh/gyd/h2s
Tessera CI/CD / Lint & Type Check (push) Successful in 47s
Tessera CI/CD / Tests (push) Successful in 1m2s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m54s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m54s

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 12:46:09 +02:00
parent 2cd4adc85b
commit 4c93555a50
2 changed files with 113 additions and 3 deletions
+4 -3
View File
@@ -7,7 +7,7 @@ status: verified
stopped_at: Completed 18-06-PLAN.md — Windows-Bedienprobe des Nutzers steht aus stopped_at: Completed 18-06-PLAN.md — Windows-Bedienprobe des Nutzers steht aus
last_updated: "2026-09-16T15:27:16.943Z" last_updated: "2026-09-16T15:27:16.943Z"
last_activity: 2026-09-17 last_activity: 2026-09-17
last_activity_desc: Quick 260917-eta — Tray „Beenden"/„Öffnen" der Desktop-App repariert (Windows-VM-Bedienprobe durch Claude); davor 260917-e15 Icon-Fix, Benchmark nach VM-Umbau last_activity_desc: Quick 260917-gsh/gyd/h2s — alle sieben Nebenbefunde der Windows-Bedienprobe + Akzentfarbe per Hex + Logo in Akzentfarbe
state_head: a777814034ee5907cb4d151669447f015841082d state_head: a777814034ee5907cb4d151669447f015841082d
progress: progress:
total_phases: 18 total_phases: 18
@@ -31,7 +31,7 @@ See: .planning/PROJECT.md (updated 2026-07-17)
Phase: 18 (desktop-client-fertigstellen) — IN PROGRESS Phase: 18 (desktop-client-fertigstellen) — IN PROGRESS
Plan: 6 of 6 (18-02 abgeschlossen) Plan: 6 of 6 (18-02 abgeschlossen)
Status: 18-02 (CI-Job desktop, Cache-Uebergabe an publish, Release-Anhaenge) fertig; 18-03 (Web-Oberflaeche), 18-04 (Client-Updatepruefung), 18-05 (Windows-Cross-Bau + Pipeline-Beweis), 18-06 (Freigabe) stehen aus Status: 18-02 (CI-Job desktop, Cache-Uebergabe an publish, Release-Anhaenge) fertig; 18-03 (Web-Oberflaeche), 18-04 (Client-Updatepruefung), 18-05 (Windows-Cross-Bau + Pipeline-Beweis), 18-06 (Freigabe) stehen aus
Last activity: 2026-09-17 - Completed quick task 260917-eta: Tray „Beenden"/„Öffnen" der Desktop-App repariert (auf Windows-VM gefunden); zuvor 260917-e15 Icon-Fix, Benchmark nach VM-Umbau Last activity: 2026-09-17 - Quick-Tasks 260917-gsh/gyd/h2s: Akzentfarbe per Hex + Logo in Akzentfarbe, Web-Robustheit (Ruecksprung, Sitzungswaechter, i18n), Desktop-Erkennung + Beta-Label + deutscher Installer — lokal im Browser bestaetigt, Push/CI/VM-Nachweis folgt
Progress: [███░░░░░░░] 33% Progress: [███░░░░░░░] 33%
@@ -435,6 +435,7 @@ Gerettet aus `.continue-here.md`. Relevant fuer die noch offenen Live-Tests.
| 260917-eta | **Desktop-Client: Tray „Beenden" beendete die App nicht; „Öffnen"/Linksklick holten minimiertes Fenster nicht zurueck.** Auf der Windows-Test-VM reproduziert (tasklist: `tessera-desktop.exe` lief nach „Beenden" weiter; Autostart-Haken im selben Menue funktionierte -> Klick kam an). Ursache: `app.run`-Handler rief bei jedem `RunEvent::ExitRequested` `api.prevent_exit()` — auch fuer `app.exit(0)` aus dem Tray. Fix: Muster `ExitRequested { code: None, api, .. }` (Tauri 2.11.3: `code` None = Nutzer-Interaktion, Some = programmatisch). Dazu `w.unminimize()` vor `show()` in „open" und im Linksklick-Handler (nach Win+D bewirkte „Öffnen" nichts). cargo check/clippy 0 Warnungen, rustfmt (9cb9d2e). Changelog 2 Stichpunkte. | 2026-09-17 | 68a69c6,9ba7456,9cb9d2e | [260917-eta-desktop-client-tray-eintrag-beenden-been](./quick/260917-eta-desktop-client-tray-eintrag-beenden-been/) | | 260917-eta | **Desktop-Client: Tray „Beenden" beendete die App nicht; „Öffnen"/Linksklick holten minimiertes Fenster nicht zurueck.** Auf der Windows-Test-VM reproduziert (tasklist: `tessera-desktop.exe` lief nach „Beenden" weiter; Autostart-Haken im selben Menue funktionierte -> Klick kam an). Ursache: `app.run`-Handler rief bei jedem `RunEvent::ExitRequested` `api.prevent_exit()` — auch fuer `app.exit(0)` aus dem Tray. Fix: Muster `ExitRequested { code: None, api, .. }` (Tauri 2.11.3: `code` None = Nutzer-Interaktion, Some = programmatisch). Dazu `w.unminimize()` vor `show()` in „open" und im Linksklick-Handler (nach Win+D bewirkte „Öffnen" nichts). cargo check/clippy 0 Warnungen, rustfmt (9cb9d2e). Changelog 2 Stichpunkte. | 2026-09-17 | 68a69c6,9ba7456,9cb9d2e | [260917-eta-desktop-client-tray-eintrag-beenden-been](./quick/260917-eta-desktop-client-tray-eintrag-beenden-been/) |
| 260917-gsh | **Akzentfarbe als Hex-Code eingebbar; Bildmarke uebernimmt die Akzentfarbe.** `normalizeHexColor()` in `lib/color.ts` (optionales `#`, 3-stellige Kurzform, Kleinschreibung; 9 Tests), Textfeld neben dem Farbwaehler mit Zwei-Wege-Sync, `aria-invalid` + Fehlertext + gesperrtes Speichern bei ungueltigem Wert (7 Komponententests), i18n `settings.account.accentColorHex/-Invalid`. Gedrehte Kachel in `LogoMark` per Inline-Style `fill: var(--primary, #ffed00)` — folgt `applyAccentColor`, Anmeldeseite bleibt gelb. Tests Web 365 -> 381 / 57 Dateien, tsc 0. | 2026-09-17 | 795c6a4,1601d97,db478e0 | [260917-gsh-akzentfarbe-in-einstellungen-konto-zusae](./quick/260917-gsh-akzentfarbe-in-einstellungen-konto-zusae/) | | 260917-gsh | **Akzentfarbe als Hex-Code eingebbar; Bildmarke uebernimmt die Akzentfarbe.** `normalizeHexColor()` in `lib/color.ts` (optionales `#`, 3-stellige Kurzform, Kleinschreibung; 9 Tests), Textfeld neben dem Farbwaehler mit Zwei-Wege-Sync, `aria-invalid` + Fehlertext + gesperrtes Speichern bei ungueltigem Wert (7 Komponententests), i18n `settings.account.accentColorHex/-Invalid`. Gedrehte Kachel in `LogoMark` per Inline-Style `fill: var(--primary, #ffed00)` — folgt `applyAccentColor`, Anmeldeseite bleibt gelb. Tests Web 365 -> 381 / 57 Dateien, tsc 0. | 2026-09-17 | 795c6a4,1601d97,db478e0 | [260917-gsh-akzentfarbe-in-einstellungen-konto-zusae](./quick/260917-gsh-akzentfarbe-in-einstellungen-konto-zusae/) |
| 260917-gyd | **Web-Robustheit: Ruecksprung nach Anmeldung, Sitzungswaechter, Widgets-Seite uebersetzt.** Middleware leitet auf `/login?next=<Pfad>` (Helfer `lib/safe-next.ts`: nur relative Pfade, kein `//`, kein `\\`, kein `/login`; Tests), Anmeldeseite springt nach Erfolg dorthin. Neue Server Action `fetchSessionState()` (authenticated/unauthenticated/unavailable): bei 401/403 oder 200 ohne Benutzer wird das Sitzungscookie geloescht und der Header leitet auf `/login?next=…` — 5xx/Netzwerkfehler bleiben still (kein Redirect bei API-Ausfall). Befund vom Testserver-DB-Reset: `/auth/me` liefert bei geloeschtem Benutzer 200 mit leerem Body. `settings/dashboard`: `common.loading` + `settings.widgets.empty` statt englischer Hartkodierung. Tests Web gruen, tsc 0. | 2026-09-17 | 4b279ea,474d170,2868ffe | [260917-gyd-web-nach-anmeldung-zurueck-zur-ursprueng](./quick/260917-gyd-web-nach-anmeldung-zurueck-zur-ursprueng/) | | 260917-gyd | **Web-Robustheit: Ruecksprung nach Anmeldung, Sitzungswaechter, Widgets-Seite uebersetzt.** Middleware leitet auf `/login?next=<Pfad>` (Helfer `lib/safe-next.ts`: nur relative Pfade, kein `//`, kein `\\`, kein `/login`; Tests), Anmeldeseite springt nach Erfolg dorthin. Neue Server Action `fetchSessionState()` (authenticated/unauthenticated/unavailable): bei 401/403 oder 200 ohne Benutzer wird das Sitzungscookie geloescht und der Header leitet auf `/login?next=…` — 5xx/Netzwerkfehler bleiben still (kein Redirect bei API-Ausfall). Befund vom Testserver-DB-Reset: `/auth/me` liefert bei geloeschtem Benutzer 200 mit leerem Body. `settings/dashboard`: `common.loading` + `settings.widgets.empty` statt englischer Hartkodierung. Tests Web gruen, tsc 0. | 2026-09-17 | 4b279ea,474d170,2868ffe | [260917-gyd-web-nach-anmeldung-zurueck-zur-ursprueng](./quick/260917-gyd-web-nach-anmeldung-zurueck-zur-ursprueng/) |
| 260917-h2s | **Desktop-Client-Erkennung, Beta-Hinweis, deutscher Installer.** Rust: `with_desktop_marker()` haengt `desktop=1` an beide Navigationen zur Server-Adresse (Store bleibt sauber); `update_labels()` — bei gleicher Version nennt Tray/Benachrichtigung „Neuen Beta-Stand {commit}“ statt „Version X“ (5 Rust-Tests). Web: Middleware setzt Cookie `tessera_desktop=1` (`withDesktopCookie` um jede Rueckgabe), `lib/desktop-client.ts` (`isDesktopClient`/`useIsDesktopClient`), `DesktopDownloadLinks` rendert im Client nichts, `DesktopContextMenuGuard` im RootLayout blockt Rechtsklick ausser in Eingabefeldern. Installer: `bundle.windows.nsis` languages German, kein Sprachwahldialog, installerIcon icon.ico, Header/Sidebar-BMP (Markengelb + Tessera-Zeichen, resvg-Quelle), installMode currentUser; Handbuecher ergaenzt. Web-Tests 417 / 63 Dateien, tsc 0. Browser: Cookie, Link-Ausblendung, Kontextmenue, Ruecksprung, 401-Waechter lokal bestaetigt; Installer/Client-Cookie nach CI auf der Windows-VM. | 2026-09-17 | 5bdabf5,d9b94bd,2cd4adc | [260917-h2s-desktop-client-web-erkennt-den-client-do](./quick/260917-h2s-desktop-client-web-erkennt-den-client-do/) |
## Deferred Items ## Deferred Items
@@ -480,4 +481,4 @@ Last session: 2026-09-17T08:20:00Z
Resumed: 2026-09-17 — Sitzung ueber /gsd-resume-work fortgesetzt (HANDOFF.json abgearbeitet und entfernt). Resumed: 2026-09-17 — Sitzung ueber /gsd-resume-work fortgesetzt (HANDOFF.json abgearbeitet und entfernt).
Stopped at: Quick 260917-eta (Tray Beenden/Öffnen) gepusht (a0e4c21), CI 244 gruen, Fix auf der Windows-Test-VM 8233 mit Paket 1.1.0-beta.a0e4c21 BESTAETIGT (tasklist ohne tessera-desktop.exe nach Beenden; Öffnen nach Win+D holt Fenster zurueck); Icon-Fix ebenfalls bestaetigt. Nichts angefangen. Alpha-DB wurde vom User am 17.09. 10:37 neu angelegt (Admin-Passwort dort unbekannt). Nebenbefunde 1-7 siehe Memory project-resume Stopped at: Quick 260917-eta (Tray Beenden/Öffnen) gepusht (a0e4c21), CI 244 gruen, Fix auf der Windows-Test-VM 8233 mit Paket 1.1.0-beta.a0e4c21 BESTAETIGT (tasklist ohne tessera-desktop.exe nach Beenden; Öffnen nach Win+D holt Fenster zurueck); Icon-Fix ebenfalls bestaetigt. Nichts angefangen. Alpha-DB wurde vom User am 17.09. 10:37 neu angelegt (Admin-Passwort dort unbekannt). Nebenbefunde 1-7 siehe Memory project-resume
Resume file: None Resume file: None
Last activity: 2026-09-17 - Completed quick task 260917-eta: Tray „Beenden"/„Öffnen" der Desktop-App repariert (auf Windows-VM gefunden); zuvor 260917-e15 Icon-Fix, Benchmark nach VM-Umbau Last activity: 2026-09-17 - Quick-Tasks 260917-gsh/gyd/h2s: Akzentfarbe per Hex + Logo in Akzentfarbe, Web-Robustheit (Ruecksprung, Sitzungswaechter, i18n), Desktop-Erkennung + Beta-Label + deutscher Installer — lokal im Browser bestaetigt, Push/CI/VM-Nachweis folgt
@@ -0,0 +1,109 @@
---
phase: quick-260917-h2s
plan: 01
subsystem: desktop-client, web-middleware
tags: [desktop, tauri, nextjs, middleware, ux]
status: complete
dependency-graph:
requires: []
provides:
- "with_desktop_marker / update_labels (apps/desktop/src-tauri/src/lib.rs)"
- "withDesktopCookie (apps/web/src/middleware.ts)"
- "isDesktopClient / useIsDesktopClient (apps/web/src/lib/desktop-client.ts)"
- "DesktopContextMenuGuard (apps/web/src/components/desktop/desktop-context-menu-guard.tsx)"
affects:
- "apps/web/src/components/desktop/desktop-download-links.tsx"
- "apps/web/src/app/layout.tsx"
- "apps/desktop/src-tauri/tauri.conf.json"
tech-stack:
added: []
patterns:
- "Cookie-basierte Client-Erkennung: Query-Parameter auf der ersten Navigation -> Middleware setzt Cookie auf jeder Antwort -> Hook liest es hydration-sicher"
key-files:
created:
- apps/web/src/lib/desktop-client.ts
- apps/web/src/lib/desktop-client.test.ts
- apps/web/src/middleware.test.ts
- apps/web/src/components/desktop/desktop-context-menu-guard.tsx
- apps/web/src/components/desktop/desktop-context-menu-guard.test.tsx
modified:
- apps/desktop/src-tauri/src/lib.rs
- apps/desktop/src-tauri/tauri.conf.json
- apps/desktop/src-tauri/icons/nsis-header.bmp
- apps/desktop/src-tauri/icons/nsis-sidebar.bmp
- apps/web/src/middleware.ts
- apps/web/src/components/desktop/desktop-download-links.tsx
- apps/web/src/components/desktop/desktop-download-links.test.tsx
- apps/web/src/app/layout.tsx
- CHANGELOG.md
- docs/anleitung-anwender.md
- docs/anleitung-entwicklung.md
decisions:
- "Beim Handbuchsatz zu Trotzdem ausführen wurde Der Grund dafür zu Der Grund für die Windows-Meldung umformuliert, weil der neu eingefuegte Satz sonst den Bezug des Pronomens verschoben haette (redaktionelle Praezisierung, kein inhaltlicher Unterschied zum Plan)."
metrics:
duration: 24min
completed: 2026-09-17
actuals:
tokens: 39000
tasks: 3
commits: 3
plan_head_before: 98fad86
---
# Phase quick-260917-h2s Plan 01: Desktop-Client-Erkennung, Beta-Label, deutscher Installer Summary
Der Desktop-Client meldet sich jetzt beim Web per Cookie an, wodurch Download-Links und das Browser-Kontextmenü in der App verschwinden; der Beta-Update-Hinweis nennt bei gleicher Version den Commit-Stand statt der verwirrenden gleichen Versionsnummer, und der Windows-Installer läuft auf Deutsch mit Tessera-Grafik und -Symbol.
## Was wurde gebaut
**Task 1 — Rust (`apps/desktop/src-tauri/src/lib.rs`, Commit `5bdabf5`):**
- `with_desktop_marker(url)` hängt `desktop=1` als Query-Paar an einen Klon der Adresse an; beide `window.navigate`-Aufrufe (`save_server_url`, Startnavigation im `setup`) nutzen sie. Der im Store gespeicherte `server_url`-Wert bleibt unverändert (Parameter geht nur in die Navigation).
- `update_labels(version_changed, version, commit)` liefert Menü-/Benachrichtigungstext: bei Versionswechsel wie bisher „Version {v} herunterladen"; bei gleicher Version (Beta-Kanal, neuer Commit) „Neuen Beta-Stand herunterladen" / „Neuer Beta-Stand {commit} verfügbar …".
- `mod tests` deckt beide Helfer ab (5 Tests); `cargo fmt --check`, `cargo check`, `cargo clippy`, `cargo test --lib` grün.
**Task 2 — Web, Tracer (Commit `d9b94bd`):**
- `withDesktopCookie` in `middleware.ts` setzt `tessera_desktop=1` (Path `/`, ein Jahr, `SameSite=lax`, ohne `HttpOnly`, `Secure` nur bei https) auf **jede** Antwort der `middleware`-Funktion, sobald `?desktop=1` anliegt — auch auf dem Frühausstieg für öffentliche Routen und auf Redirects. Die von Plan 260917-gyd zwischenzeitlich ergänzten Rückgaben (u. a. der `next`-Redirect) sind mit eingeschlossen.
- `apps/web/src/lib/desktop-client.ts`: `isDesktopClient()` liest das Cookie synchron (SSR-sicher: `false` ohne `document`); `useIsDesktopClient()` kapselt es per `useEffect`, damit Server- und erster Client-Render übereinstimmen.
- `DesktopDownloadLinks` bricht den Ladeeffekt im Desktop-Client vor dem Request ab und rendert nichts.
- `DesktopContextMenuGuard` (neu, in `layout.tsx` eingebunden) unterdrückt das WebView2-Kontextmenü außerhalb von Eingabefeldern/contenteditable-Bereichen.
- Tracer-Gate: Die komplette Kette (Anfrage mit `?desktop=1` → Cookie auf der Antwort → Hook → Komponente rendert nichts) wurde Ende-zu-Ende durch die volle Testsuite (`pnpm --filter @tessera/web exec vitest run`, 417/417 grün) und `type-check` bestätigt, bevor Task 3 begann.
**Task 3 — Installer, CHANGELOG, Handbuch (Commit `2cd4adc`):**
- `bundle.windows.nsis` in `tauri.conf.json`: `languages: ["German"]`, `displayLanguageSelector: false`, `installerIcon`, `headerImage`, `sidebarImage`, `installMode: "currentUser"`.
- Beide BMPs aus dem Scratchpad nach `icons/` kopiert (`nsis-header.bmp` 150×57, `nsis-sidebar.bmp` 164×314, beide `BMP3`).
- CHANGELOG: vier neue `Desktop-App:`-Stichpunkte (zwei unter „Geändert", zwei unter „Behoben").
- `docs/anleitung-anwender.md`: Satz zum deutschen Installationsassistenten (kein Admin nötig); Tray-Eintrag „Update herunterladen" erklärt (Beta-Text).
- `docs/anleitung-entwicklung.md`: Ort der nsis-Konfiguration und Hinweis, dass nur der CI-Bau auf Windows den echten Nachweis liefert.
## Deviations from Plan
### Auto-fixed Issues
None — plan executed exactly as written. Eine redaktionelle Umformulierung (siehe `decisions` oben) war nötig, damit ein Pronomenbezug im Handbuchsatz nicht verrutscht; inhaltlich deckt sich der Text mit der Plan-Vorgabe.
## Offene Nachweise (nicht lokal prüfbar)
Wie im Plan vorgesehen, bleibt der Beweis über die WebView2-Grenze durch den Orchestrator nach dem CI-Bau auf der Windows-VM offen:
- Cookie `tessera_desktop=1` im echten Client gesetzt (Bedienprobe)
- Keine Download-Links auf der Anmeldeseite im Client
- Kein Browser-Kontextmenü im Client, aber in Eingabefeldern erhalten
- Beta-Label „Neuen Beta-Stand herunterladen" / Benachrichtigung mit Commit-Kürzel
- Deutscher Installer mit Tessera-Kopf-/Seitenbild und -Symbol
## Verification
- `cargo fmt --check && cargo check && cargo clippy && cargo test --lib` (apps/desktop/src-tauri): grün, 5/5 Tests
- `pnpm --filter @tessera/web exec vitest run`: 417/417 Tests grün (63 Dateien)
- `pnpm --filter @tessera/web type-check`: grün
- nsis-Schema-Prüfung (node gegen `NsisConfig.properties`/`NSISInstallerMode`): OK
- `magick identify`: `nsis-header.bmp BMP3 150x57`, `nsis-sidebar.bmp BMP3 164x314`
- `git diff --name-only 98fad86 HEAD` deckt sich exakt mit `files_modified` aus dem Plan-Frontmatter; kein Docker-Build, kein `tauri build`, kein `git push`.
## Self-Check: PASSED
- FOUND: apps/desktop/src-tauri/src/lib.rs (with_desktop_marker, update_labels, mod tests)
- FOUND: apps/web/src/middleware.ts (withDesktopCookie)
- FOUND: apps/web/src/lib/desktop-client.ts
- FOUND: apps/web/src/components/desktop/desktop-context-menu-guard.tsx
- FOUND: apps/desktop/src-tauri/icons/nsis-header.bmp, nsis-sidebar.bmp
- FOUND commit 5bdabf5, d9b94bd, 2cd4adc in `git log --oneline`