Commit Graph

975 Commits

Author SHA1 Message Date
schalli b023d6f726 docs: Favoriten-Sortierung und Symbol-Ersatzweg im CHANGELOG und Anwenderhandbuch; Nachtraege zur Mandantenbindung
- CHANGELOG.md: je ein Stichpunkt unter Neu (Sortierpfeile) und Behoben
  (Symbol trotz Zertifikatsfehler/interner Adresse)
- docs/anleitung-anwender.md: Tabellenzeile „Favoriten" nennt die Pfeile
  und den Browser-Ersatzweg fuer das Symbol
- docs/mandantentrennung-zugriffsklassifikation.md: Nachtrag zu
  favoriteLink — reorder() laeuft ueber withTenantTransaction() ohne
  Benutzerdimension in der Sitzung, Stand bleibt gebunden
- prisma-tenant.extension.ts: Kopfkommentar-Nachtrag, favorites.service.ts
  (reorder) ist der erste Nutzer-CRUD-Aufrufer von withTenantTransaction()
  — nur Kommentartext, Funktionscode unveraendert (prisma-tenant.extension.spec.ts
  und rls-access-inventory.spec.ts weiterhin gruen)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:41:28 +02:00
schalli b18ac25ccc feat(web): Favoriten-Widget — Symbol-Ersatzweg aus dem Browser, Sortierpfeile im Bearbeitungsmodus
- FavoriteIcon (favorites-widget.tsx): dreistufiger Ersatzweg proxy ->
  direct -> none; Buchstaben-Platzhalter liegt immer darunter. Direktbild
  nur bei http/https-URL (getDirectFaviconSrc), referrerPolicy
  no-referrer, kein Drittanbieter-Favicon-Dienst. key={iconUrl|url}
  setzt die Stufe bei Aenderung zurueck; kein style.display-Hack mehr
- handleMove + Sortierpfeile im Bearbeitungsmodus (nur bei nicht-inline-
  Bearbeitung): optimistische Neuberechnung, PUT /favorites/order ueber
  reorderFavorites; erster/letzter Eintrag deaktiviert; Fehler ->
  Neuladen mit Fehlermeldung
- favorites-api.ts: reorderFavorites(widgetId, ids)
- de.json/en.json: widgets.favorites.moveUpButton/moveDownButton
- 5 neue Widget-Tests (Ersatzbild-Kette, Nicht-http-URL, Pfeilzustand,
  Klick, Fehlerpfad); 11 bestehende unveraendert gruen; volle Web-Suite
  64 Dateien/429 Tests und type-check gruen

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:40:09 +02:00
schalli 2a562d0b14 feat(api): Favoriten — Symbol trotz Zertifikatsfehler holen, Reihenfolge per PUT /favorites/order speichern
- icon-discovery.service.ts: undicis eigenes fetch mit Modul-Singleton
  LENIENT_TLS_AGENT (Agent({ connect: { rejectUnauthorized: false } }))
  als dispatcher in fetchWithRedirectGuard, der einzigen Ausgangsstelle
  fuer HTML-Ermittlung und Icon-Byte-Holen; SSRF-Schutz unveraendert
- undici 7.28.0 (bereits im Lockfile aufgeloest) als direkte Abhaengigkeit
  von @tessera/api via pnpm add --offline
- PUT /favorites/order (ReorderFavoritesDto) vor den :id-Routen;
  FavoritesService.reorder() setzt position=index fuer die Favoriten
  eines Widgets in EINER withTenantTransaction, userId+widgetId in jeder
  Bedingung (zweites Netz), eine BadRequestException fuer alle
  Abweichungen (T-JDD-06)
- getIcon: X-Content-Type-Options nosniff + restriktive CSP (T-JDD-02)
- 10 neue Tests (3 Dispatcher, 7 reorder); volle API-Suite 68 Dateien/
  1101 Tests und type-check gruen

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:36:03 +02:00
schalli e7633e15de docs: CI-Desktop-Bau nur bei geaendertem Desktop-Stand — Betriebshandbuch, CI-Runbook, Entwicklungsanleitung, CHANGELOG
- anleitung-betrieb.md Kap. 10: neuer Unterabschnitt "Wann gebaut wird und
  wann Pakete uebernommen werden", Job-Dauer-Satz und Fehlerbilder-Tabelle
  ergaenzt
- ci-cd-setup.md Abschnitt 4: Absatz zum Ueberspringen bei unveraendertem
  Desktop; Abschnitt 6: neuer Fehlerbehebungs-Eintrag
- anleitung-entwicklung.md: Absatz zum CI-Ueberspringen bei "Desktop-App
  lokal bauen"
- CHANGELOG.md: ein Stichpunkt unter Unveroeffentlicht/Geaendert

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:28:54 +02:00
schalli 8c4aaa51fa ci: Job desktop ueberspringt den Bau, wenn der Desktop-Stand unveraendert ist — Pakete aus dem Zwischenspeicher
- Neues Skript .gitea/scripts/desktop-stamp.sh (Unterbefehle stamp/check):
  Stempel aus Version + letztem Commit an den Desktop-Pfaden, Pruefung eines
  restaurierten desktop-dist/ gegen Manifest, Kanal, Groesse und sha256
- ci.yml Job desktop: stamp -> actions/cache/restore (Stempel-Schluessel,
  nur main) -> check -> 13 Bau-Schritte mit if: steps.reuse.outputs.reuse,
  Stempel-Save vor unveraenderter Uebergabe an publish; quality/test/publish
  und on: unveraendert (js-yaml-Tiefenvergleich gegen 38c1400)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:26:49 +02:00
schalli 29db4c01c0 docs: CHANGELOG — Bildmarke übernimmt die Akzentfarbe als Ganzes
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:19:55 +02:00
schalli ecff144449 feat(brand): ganzes T der Bildmarke übernimmt die Akzentfarbe – Kacheln als abgeleiteter dunklerer Ton
- BRAND_OLIVE_MIX (54 %, #363636) und BRAND_OLIVE_FILL in brand.ts, Kalibrierung kommentiert
- vier achsenparallele Kacheln in tessera-logo.tsx: Inline-Style BRAND_OLIVE_FILL, festes Oliv-Attribut als Rückfall
- brand.test.ts (neu): rechnet Kalibrierung, Neutralität und Grenzfälle aus denselben Konstanten nach
- tessera-logo.test.tsx: Kacheltest auf Token-Fuellung (1x) und abgeleitete Fuellung (4x) umgestellt

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:18:58 +02:00
schalli 38c14005c6 docs: Aktenstand — Quick-Task-Zeile Freigabe 1.2.0, Tabellenzeile 260914-ebg repariert
Tessera CI/CD / Lint & Type Check (push) Successful in 47s
Tessera CI/CD / Tests (push) Successful in 1m9s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 5m34s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m56s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 13:49:03 +02:00
schalli 29565831d1 docs: Aktenstand — Freigabe 1.2.0, Release-Upload ueber internen Weg
Tessera CI/CD / Lint & Type Check (push) Successful in 48s
Tessera CI/CD / Tests (push) Successful in 1m13s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m57s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m56s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 13:48:31 +02:00
schalli 507556f158 fix(ci): Release-Anhaenge nie ueber die oeffentliche Gitea-Adresse hochladen
Tessera CI/CD / Lint & Type Check (push) Successful in 49s
Tessera CI/CD / Tests (push) Successful in 1m8s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m57s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m9s
publish-release.sh ignoriert GITHUB_API_URL/GITHUB_SERVER_URL (git.vicolab.de
hinter dem Proxy bricht grosse Uploads ab -- Release 1.2.0 blieb dadurch
zunaechst ohne Anhaenge). Im CI wird das Host-Gateway des Job-Containers aus
/proc/net/route ermittelt und Gitea direkt auf Port 3002 angesprochen, lokal
localhost:3002; GITEA_API bleibt als Override. Gateway-Weg aus Job-Netz
gegen die Gitea-API verifiziert; Anhaenge fuer v1.2.0 vom Host nachgetragen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 13:48:17 +02:00
schalli f7f406a5b6 docs: Version 1.2.0 freigegeben — Unveröffentlicht -> 1.2.0 (2026-09-17), neuer leerer Abschnitt Unveröffentlicht
Tessera CI/CD / Build & Publish Images (push) Failing after 4m7s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m55s
Tessera CI/CD / Lint & Type Check (push) Successful in 44s
Tessera CI/CD / Tests (push) Successful in 1m7s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
v1.2.0
2026-09-17 13:20:51 +02:00
schalli c411cb2fc3 docs: Aktenstand — Quick 260917-gsh/gyd/h2s auf der Windows-Test-VM bestaetigt (CI 246, Paket 4c93555)
Tessera CI/CD / Lint & Type Check (push) Successful in 47s
Tessera CI/CD / Tests (push) Successful in 1m4s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m53s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m56s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 13:08:36 +02:00
schalli 4c93555a50 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>
2026-09-17 12:46:09 +02:00
schalli 2cd4adc85b feat(desktop): Windows-Installer auf Deutsch mit Tessera-Grafik und -Symbol; CHANGELOG, Handbuch
- bundle.windows.nsis in tauri.conf.json: Deutsch ohne Sprachauswahl,
  Tessera-Icon, Kopf-/Seitenbild, currentUser (kein Admin noetig)
- icons/nsis-header.bmp (150x57), icons/nsis-sidebar.bmp (164x314) ergaenzt
- CHANGELOG: vier neue Desktop-App-Stichpunkte (Beta-Hinweis, Installer,
  Download-Links, Kontextmenue)
- anleitung-anwender.md: Installationsassistent-Satz, Tray-Eintrag erklaert
- anleitung-entwicklung.md: Ort der nsis-Konfiguration, Pruefweg per CI
- Schema-Pruefung (node) und cargo check gruen

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:39:25 +02:00
schalli d9b94bd259 feat(web): Desktop-Client per Cookie erkennen — Download-Links und Browser-Kontextmenü in der App aus
- withDesktopCookie in middleware.ts setzt tessera_desktop=1 auf JEDER
  Antwort (Fruehausstieg, Redirects, next()), wenn ?desktop=1 anliegt
- desktop-client.ts: isDesktopClient() liest das Cookie, useIsDesktopClient()
  kapselt es hydration-sicher per useEffect
- DesktopDownloadLinks fragt /desktop/latest im Desktop-Client gar nicht
  erst an und rendert nichts
- DesktopContextMenuGuard unterdrueckt das WebView2-Kontextmenue ausserhalb
  von Eingabefeldern/contenteditable, in layout.tsx eingebunden
- middleware.test.ts (neu), desktop-client.test.ts (neu),
  desktop-context-menu-guard.test.tsx (neu), Test 4 in
  desktop-download-links.test.tsx — alle 417 Web-Tests und type-check gruen

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:38:13 +02:00
schalli 5bdabf558b feat(desktop): Client meldet sich per desktop=1, Beta-Hinweis nennt den Stand
- with_desktop_marker haengt desktop=1 an beide Navigationen (save_server_url,
  Startnavigation im setup); der Store-Wert server_url bleibt ohne Parameter
- update_labels liefert Menue-/Benachrichtigungstext: bei Versionswechsel wie
  bisher, bei gleicher Version (Beta-Kanal) nennt der Text den Commit-Stempel
- mod tests deckt beide Helfer ab (fmt/check/clippy/test --lib gruen)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:35:20 +02:00
schalli 98fad866bf docs(quick): Aktenstand 260917-gyd (Web-Robustheit) + Plan 260917-h2s (Desktop-Erkennung, Beta-Label, deutscher Installer)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:31:56 +02:00
schalli 2868ffee20 feat(quick-260917-gyd): Widgets-Seite uebersetzt, CHANGELOG ergaenzt
- settings/dashboard/page.tsx: Lade-/Leerhinweis ueber i18n (common.loading, settings.widgets.empty) statt hartkodiertem Englisch
- de.json/en.json: neuer Schluessel settings.widgets.empty (additiv)
- CHANGELOG.md: drei Stichpunkte unter Behoben (Ruecksprung nach Anmeldung, Abmeldung bei toter Sitzung, Uebersetzung Widgets-Seite)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:30:19 +02:00
schalli 474d17082b feat(quick-260917-gyd): Sitzungswaechter erkennt tote Sitzung, Header leitet ab
- auth-actions.ts: fetchSessionState() unterscheidet tote Sitzung (401/403/leere 200-Antwort, Cookie wird geloescht) von API-Ausfall (5xx/Netzwerkfehler/Nicht-JSON, unavailable ohne Redirect); fetchCurrentUser bleibt unveraendert
- header.tsx: Waechter im useEffect leitet bei toter Sitzung per Vollnavigation auf /login?next=… um, bleibt bei API-Ausfall still

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:28:38 +02:00
schalli 4b279eac70 feat(quick-260917-gyd): Ruecksprung nach Anmeldung auf urspruenglich angeforderte Seite
- safe-next.ts: buildNextParam()/sanitizeNextPath() als reine, getestete Funktionen (Open-Redirect-Schutz)
- middleware.ts: haengt next-Parameter an beide Login-Umleitungen (fehlendes Cookie, ungueltige Signatur)
- login/page.tsx: springt nach erfolgreicher Anmeldung auf den bereinigten next-Wert

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:26:14 +02:00
schalli 4778824c73 docs(quick-260917-gyd): Plan — Ruecksprung nach Anmeldung, Sitzungswaechter bei toter API-Sitzung, Widgets-Seite uebersetzt
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:23:49 +02:00
schalli 7929f843ec docs(quick-260917-gsh): Aktenstand — Akzentfarbe als Hex-Code, Bildmarke in Akzentfarbe
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:19:03 +02:00
schalli db478e078a docs: CHANGELOG — Hex-Eingabe der Akzentfarbe, Bildmarke in Akzentfarbe
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:16:18 +02:00
schalli 1601d97f62 feat(brand): gedrehte Kachel der Bildmarke übernimmt die Akzentfarbe
- LogoMark: gedrehte Signalkachel per Inline-Style fill: var(--primary, BRAND_YELLOW) statt festem fill-Attribut
- folgt damit der persoenlichen Akzentfarbe (applyAccentColor in auth-store.ts) in Kopfzeile, Seitenleiste und leerem Dashboard; ohne Nutzer (Anmeldeseite) gilt der CSS-Standard Markengelb
- brand.ts: Kommentar zu BRAND_YELLOW als Rueckfallwert ergaenzt
- tessera-logo.test.tsx: Kacheltest auf Inline-Style-Fuellung umgeschrieben (jsdom haelt var() in style.fill)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:15:33 +02:00
schalli 795c6a492c feat(settings): Akzentfarbe zusätzlich als Hex-Code eingebbar
- normalizeHexColor() (apps/web/src/lib/color.ts) normalisiert Hex-Eingaben (fuehrendes # optional, 3-stellige Kurzform, Gross-/Kleinschreibung, Leerraum)
- Kontoformular: Hex-Textfeld neben dem Farbwaehler, beide bidirektional synchron, ersetzt den reinen Anzeige-Span
- Ungueltiger Text: aria-invalid + roter Rand + Fehlertext, "Farbe speichern" gesperrt; Zuruecksetzen setzt beides auf #ffed00
- i18n: settings.account.accentColorHex/accentColorHexInvalid in de.json und en.json
- Unit-Tests: color.test.ts (9 Faelle), account-settings-form.test.tsx (7 Faelle)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:14:43 +02:00
schalli f6eda20fcb docs(quick-260917-gsh): Plan — Akzentfarbe als Hex-Code eingebbar, Bildmarke uebernimmt Akzentfarbe 2026-09-17 12:12:18 +02:00
schalli 13ce596bea docs: Aktenstand — Tray-Fix auf der Windows-Test-VM bestaetigt (CI 244, Paket a0e4c21)
Tessera CI/CD / Lint & Type Check (push) Successful in 47s
Tessera CI/CD / Tests (push) Successful in 59s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m30s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m48s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 11:10:55 +02:00
schalli a0e4c2103f docs(quick-260917-eta): Aktenstand — Tray „Beenden"/„Öffnen" der Desktop-App repariert, Windows-VM-Bedienprobe
Tessera CI/CD / Lint & Type Check (push) Successful in 49s
Tessera CI/CD / Tests (push) Successful in 1m3s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 5m3s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m54s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:49:40 +02:00
schalli 9cb9d2e340 style(desktop): rustfmt-Umbruch des ExitRequested-Musters
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:49:19 +02:00
schalli 26714bd964 docs(quick-260917-eta): Plan — Idempotenz-Hinweise, Fix und CHANGELOG liegen bereits als 68a69c6/9ba7456 vor
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:48:42 +02:00
schalli f3d6b97ece docs(quick-260917-eta): Plan — Desktop-Client Tray: „Beenden“ beendet (ExitRequested nur bei code None verhindern), „Öffnen“/Linksklick per unminimize zurückholen, CHANGELOG
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:47:47 +02:00
schalli 9ba7456785 docs: CHANGELOG – Tray „Beenden“/„Öffnen“ der Desktop-App unter Unveröffentlicht/Behoben
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:47:29 +02:00
schalli 68a69c67fe fix(desktop): Tray „Beenden“ beendet die App (ExitRequested nur bei code None verhindern); „Öffnen“/Linksklick holen minimiertes Fenster per unminimize zurück
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:47:08 +02:00
schalli 280aab6cf0 docs(quick-260917-e15): Aktenstand — Desktop-Client-Icon (T statt "1"), Benchmark nach VM-Umbau, HANDOFF abgearbeitet
Tessera CI/CD / Lint & Type Check (push) Successful in 51s
Tessera CI/CD / Tests (push) Successful in 1m4s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 5m6s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m8s
- STATE.md: Quick-Task-Zeile 260917-e15, Session Continuity, Last activity
- HANDOFF.json entfernt (einmaliges Uebergabe-Artefakt, in dieser Sitzung abgearbeitet)
- config.json: git.allow_default_branch_commits = true — Projekt committet
  per branching_strategy "none" direkt auf main; ohne den Schalter blockiert
  der Pre-Commit-Guard des Executors jeden Quick-Task
- SUMMARY des Quick-Tasks

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:17:43 +02:00
schalli 6bb92dcdc0 docs: CHANGELOG – Desktop-Symbol-Korrektur unter Unveröffentlicht
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:15:00 +02:00
schalli 16564f4d1c fix(desktop): App-Icon-Satz mit resvg (tauri icon) neu erzeugt – gedrehte gelbe Kachel wieder vorhanden, T statt 1
- Die fuenf Icon-Dateien in apps/desktop/src-tauri/icons/ durch einen mit
  der Tauri-CLI (tauri icon, Renderer resvg) erzeugten Satz ersetzt
- ImageMagick/MSVG hatte die gedrehte gelbe Kachel (transform rotate(12 51 21))
  aus apps/web/src/app/icon.svg nicht gerendert, dadurch zeigte das Symbol
  eine "1" statt des Tessera-T
- tauri.conf.json, Web-Code und Rust-Code unveraendert

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:14:35 +02:00
schalli c1c3130dfe docs(quick-260917-e15): Plan — Desktop-Client-Icon: Satz mit resvg (tauri icon) statt ImageMagick-MSVG neu erzeugen, gedrehte gelbe Kachel zurueck (T statt 1)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:11:58 +02:00
schalli 10a69ae8a6 wip: Phase 18 abgeschlossen, Uebergabe vor Neustart der VM — Benchmark-Wiederholung als naechster Schritt
Tessera CI/CD / Lint & Type Check (push) Failing after 14m45s
Tessera CI/CD / Tests (push) Has been skipped
Tessera CI/CD / Desktop-Pakete bauen (push) Has been skipped
Tessera CI/CD / Build & Publish Images (push) Has been skipped
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 09:40:05 +02:00
schalli 626f60ea9c docs(18): Phase 18 abgeschlossen — Windows-Bedienprobe bestanden, Verifikation passed, DESK-01..05 erledigt; Release-Anhang/Update-Hinweis beim naechsten Tag
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 09:38:35 +02:00
schalli 03fd85ad3e docs: Aktenstand — Schnellkorrektur Desktop-Startseite + Bau-Parallelitaet
Tessera CI/CD / Lint & Type Check (push) Successful in 49s
Tessera CI/CD / Tests (push) Successful in 58s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 5m26s
Tessera CI/CD / Build & Publish Images (push) Successful in 2m59s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 09:19:28 +02:00
schalli b6d90136d1 fix(desktop): Hauptfenster startet mit setup.html statt fehlender index.html; Rust-Bau in der Pipeline auf 4 Prozesse begrenzt
Bedienprobe des Users: Installer und Start liefen, dann schwarzes Fenster
"asset not found: index.html". Das Fenster "main" hatte keine Startseite,
Tauri nimmt dann index.html; die Erststart-Seite heisst setup.html (Altlast
aus Phase 6, in keinem echten Paket sichtbar geworden). CARGO_BUILD_JOBS=4,
weil 8 parallele rustc-Prozesse den gemeinsam genutzten Runner-Host (15 GB)
an die Speichergrenze brachten; Betriebshandbuch Kap. 10 ergaenzt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 09:19:19 +02:00
schalli 5afe2a4bc9 docs(18): Verifikation (human_needed, 8/10) und Bedienprobe als UAT persistiert; Aktenstand
Tessera CI/CD / Lint & Type Check (push) Successful in 48s
Tessera CI/CD / Tests (push) Successful in 1m3s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 4m54s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m5s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 18:12:40 +02:00
schalli 72e488eea4 fix(desktop): Commit-Stempel aus TESSERA_COMMIT (Pipeline) statt nur git rev-parse; build.rs laeuft bei Aenderung neu
Mit dem Cargo-Zwischenspeicher wuerde ein einmal einkompilierter Stempel
sonst veralten und der Beta-Update-Hinweis dauerhaft erscheinen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:43:48 +02:00
schalli b42ba7ede5 docs(18): Protokoll der Review-Korrekturen
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:43:04 +02:00
schalli 3accc174b4 docs(18): Review-Befunde behoben
Alle vier Critical/Warning-Befunde aus 18-REVIEW.md sind behoben (CR-01
0d5c80f, WR-01 1b2f803, WR-02 579e24b, WR-03 a8964f1); die beiden Info-Befunde
bleiben laut Auftrag unbearbeitet (dokumentiert als uebersprungen). Status auf
clean gesetzt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:42:40 +02:00
schalli 579e24b81a fix(desktop): Beta-Update-Hinweis auch bei gleicher Version aber neuerem Commit anzeigen (WR-02)
desktop-collect.sh vergibt fuer den Beta-Kanal (main) jedem Commit dieselbe
X.Y.Z-Version aus dem letzten Freigabe-Tag (D-07) -- der bisherige Vergleich
nur ueber `version` liess Nutzer zwischen zwei Tags nie eine neuere
Beta-Version sehen, obwohl manifest.json ein neues `commit`-Feld traegt.
build.rs bettet jetzt per `git rev-parse --short=7 HEAD` denselben
Commit-Stempel, den desktop-collect.sh fuer manifest.json schreibt, als
APP_COMMIT zur Kompilierzeit ein; lib.rs vergleicht bei channel == "beta"
zusaetzlich den Commit. Fuer den Live-Kanal bleibt es beim reinen
Versionsvergleich, D-07 (X.Y.Z in tauri.conf.json/Cargo.toml) bleibt
unveraendert. cargo check + cargo clippy -- -D warnings sind sauber.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:40:52 +02:00
schalli 1b2f803c3e fix(desktop): Tauri-CSP auf tatsaechlichen Bedarf von setup.html verengen (WR-01)
Die CSP erlaubte 'unsafe-eval' und Wildcard-Quellen (connect-src/img-src/
font-src/style-src *), obwohl setup.html -- die einzige lokale Seite der App --
kein eval() nutzt, keine externen Schriften/Bilder laedt und ausschliesslich
ueber die Tauri-IPC-Bruecke (window.__TAURI__.core.invoke) mit dem Rust-Teil
spricht. Diese CSP gilt nur fuer vom App-eigenen Protokoll ausgelieferte
Seiten; nach save_server_url() navigiert das Hauptfenster auf die
Server-Adresse, und diese Navigation wird von der CSP der Zielseite selbst
bestimmt, nicht mehr von dieser Konfiguration. Verengt auf
default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self'
'unsafe-inline'; img-src 'self' data:; connect-src 'self'.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:39:51 +02:00
schalli 0d5c80fbbf fix(18): dot-only Manifest-Dateinamen ("."/"..") in getPackage() ablehnen (CR-01)
Die Zeichen-Whitelist /^[A-Za-z0-9._-]+$/ liess Namen wie ".." durch, weil
Punkt und Bindestrich erlaubte Zeichen sind -- path.join(desktopDistDir, '..')
loest aber in den Elternordner auf und unterlaeuft genau die Verteidigung in
der Tiefe (T-18-02), die diese Zeile laut Kommentar herstellen soll. Jetzt
werden "." und ".." explizit abgelehnt UND der aufgeloeste Pfad zusaetzlich
gegen desktopDistDir geprueft (haelt auch kuenftige Varianten ab, falls die
Whitelist anderswo wiederverwendet wird). Neue Testfaelle fuer manifest-Eintraege
namens "..", "." und "../manifest.json".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:39:29 +02:00
schalli a8964f1a23 fix(18): Manifest-Eintraege in getManifest() auf gueltige Form pruefen (WR-03)
Ein kaputter Plattform-Eintrag (z. B. fehlendes name-Feld oder ungueltiger
sha256) fiel bisher erst spaeter unbemerkt durch -- entry.name === undefined
wurde zu "undefined" gecoerct und als Dateiname gesucht. getManifest()
prueft jetzt jeden vorhandenen Plattform-Eintrag (name: string, size: number,
sha256: 64-stelliger Hex-String) und behandelt ein kaputtes Manifest wie ein
fehlendes (404 + Warn-Log), statt die kaputte Form durchzureichen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:38:50 +02:00
schalli 65efdf6ab7 docs(18): Code-Review — 1 kritisch, 3 Warnungen, 2 Hinweise
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:34:15 +02:00