447 lines
28 KiB
Markdown
447 lines
28 KiB
Markdown
---
|
||
phase: 18-desktop-client-fertigstellen
|
||
plan: 06
|
||
type: execute
|
||
wave: 4
|
||
depends_on: ["18-01", "18-02", "18-03", "18-04", "18-05"]
|
||
files_modified:
|
||
- docs/anleitung-anwender.md
|
||
- docs/anleitung-betrieb.md
|
||
- docs/anleitung-entwicklung.md
|
||
- docs/ci-cd-setup.md
|
||
- CHANGELOG.md
|
||
- .planning/REQUIREMENTS.md
|
||
autonomous: true
|
||
requirements: [DESK-01, DESK-02, DESK-03, DESK-04, DESK-05]
|
||
user_setup: []
|
||
|
||
estimate:
|
||
tokens: 60000
|
||
raw_tokens: 60000
|
||
tasks: 3
|
||
confidence: low
|
||
|
||
must_haves:
|
||
truths:
|
||
- "Das Anwenderhandbuch hat ein Kapitel 'Desktop-App' mit Download in Tessera, Installation (Windows mit SmartScreen-Hinweis, Linux AppImage), Erststart mit Server-Adresse, Infobereich/Schliessen/Beenden, Autostart und Update-Hinweis (D-15)."
|
||
- "Das Betriebshandbuch beschreibt den Pipeline-Job, den Cross-Bau, den Ablageort der Pakete im Abbild, die Release-Dateien, die Umgebungsvariable und die Fehlerbilder (D-15)."
|
||
- "Das Entwicklungshandbuch fuehrt apps/desktop nicht mehr als Grundgeruest und beschreibt den lokalen Bau samt Voraussetzungen (D-15)."
|
||
- "CHANGELOG 'Unveröffentlicht' -> '### Neu' traegt den Stichpunkt zur Desktop-App (D-17); REQUIREMENTS.md fuehrt DESK-01..05 mit Nachverfolgung."
|
||
- "Alle Test-Suiten (API, Web) und Typpruefungen sind gruen; der Nutzer hat den Windows-Installer auf seinem PC durchgespielt (Erfolgskriterium 3)."
|
||
artifacts:
|
||
- path: "docs/anleitung-anwender.md"
|
||
provides: "Kapitel '## Desktop-App' mit sieben Unterabschnitten"
|
||
contains: "## Desktop-App"
|
||
- path: "docs/anleitung-betrieb.md"
|
||
provides: "Kapitel '## 10. Desktop-App: Pakete und Release-Dateien'"
|
||
contains: "## 10. Desktop-App"
|
||
- path: "docs/anleitung-entwicklung.md"
|
||
provides: "Abschnitt '### Desktop-App lokal bauen'"
|
||
contains: "Desktop-App lokal bauen"
|
||
- path: "docs/ci-cd-setup.md"
|
||
provides: "Job desktop im Pipeline-Ueberblick, Fehlerbehebung fuer Cross-Bau und Cache"
|
||
contains: "desktop"
|
||
- path: "CHANGELOG.md"
|
||
provides: "Stichpunkt Desktop-App unter Unveröffentlicht/Neu"
|
||
contains: "Desktop-App für Windows und Linux"
|
||
- path: ".planning/REQUIREMENTS.md"
|
||
provides: "Kategorie DESK mit DESK-01..05 und Traceability-Zeilen"
|
||
contains: "DESK-05"
|
||
key_links:
|
||
- from: "docs/anleitung-anwender.md"
|
||
to: "apps/web/src/messages/de.json"
|
||
via: "Die im Handbuch genannten Beschriftungen entsprechen den de.json-Texten (Link- und Knopftexte, Tray-Eintraege)"
|
||
pattern: "Desktop-App herunterladen"
|
||
- from: "docs/anleitung-betrieb.md"
|
||
to: "apps/api/src/desktop/desktop.service.ts"
|
||
via: "Ablageort /app/desktop-dist und Variable DESKTOP_DIST_DIR"
|
||
pattern: "DESKTOP_DIST_DIR"
|
||
---
|
||
|
||
<objective>
|
||
Die Phase wird abgeschlossen: Handbuecher fuer Anwender, Betrieb und
|
||
Entwicklung beschreiben die Desktop-App, die Pipeline und die
|
||
Release-Dateien; CHANGELOG und REQUIREMENTS werden nachgezogen; alle Suiten
|
||
laufen; und der Nutzer prueft den Windows-Installer auf seinem PC nach
|
||
einer genauen Schrittfolge (Erfolgskriterien 3 und 4).
|
||
|
||
Purpose: D-15 und D-17 aus 18-CONTEXT.md; Nachverfolgung DESK-03/04/05.
|
||
Output: Vier Dokumente, CHANGELOG-Stichpunkt, REQUIREMENTS-Abschnitt,
|
||
gruene Gesamtlaeufe, Bedienprobe des Nutzers.
|
||
|
||
Alle Handbuchtexte in Sie-Form, mit echten Umlauten, ohne firmenspezifische
|
||
Adressen (Platzhalter `https://tessera.example.com`; die Testserver-Adresse
|
||
steht nur in der Bedienprobe fuer den Nutzer, nicht im Handbuch).
|
||
</objective>
|
||
|
||
## Artifacts this phase produces
|
||
|
||
Dieser Plan: `docs/anleitung-anwender.md` (Kapitel "Desktop-App"),
|
||
`docs/anleitung-betrieb.md` (Kapitel 10), `docs/anleitung-entwicklung.md`
|
||
(Abschnitt "Desktop-App lokal bauen", Aktualisierung Monorepo-Aufbau und
|
||
Tests), `docs/ci-cd-setup.md` (Job `desktop`, Fehlerbehebung),
|
||
`CHANGELOG.md` (Stichpunkt), `.planning/REQUIREMENTS.md` (Kategorie DESK).
|
||
Gesamtliste der Phase: siehe 18-01-PLAN.md.
|
||
|
||
<execution_context>
|
||
@$HOME/.claude/gsd-core/workflows/execute-plan.md
|
||
@$HOME/.claude/gsd-core/templates/summary.md
|
||
</execution_context>
|
||
|
||
<context>
|
||
@.planning/PROJECT.md
|
||
@.planning/ROADMAP.md
|
||
@.planning/STATE.md
|
||
@.planning/phases/18-desktop-client-fertigstellen/18-CONTEXT.md
|
||
@.planning/phases/18-desktop-client-fertigstellen/18-01-SUMMARY.md
|
||
@.planning/phases/18-desktop-client-fertigstellen/18-02-SUMMARY.md
|
||
@.planning/phases/18-desktop-client-fertigstellen/18-03-SUMMARY.md
|
||
@.planning/phases/18-desktop-client-fertigstellen/18-04-SUMMARY.md
|
||
@.planning/phases/18-desktop-client-fertigstellen/18-05-SUMMARY.md
|
||
|
||
@docs/anleitung-anwender.md
|
||
@docs/anleitung-betrieb.md
|
||
@docs/anleitung-entwicklung.md
|
||
@docs/ci-cd-setup.md
|
||
@CHANGELOG.md
|
||
@.planning/REQUIREMENTS.md
|
||
</context>
|
||
|
||
<tasks>
|
||
|
||
<task type="auto">
|
||
<name>Task 1: Anwenderhandbuch — Kapitel "Desktop-App"; CHANGELOG-Stichpunkt</name>
|
||
<files>
|
||
docs/anleitung-anwender.md,
|
||
CHANGELOG.md
|
||
</files>
|
||
<read_first>
|
||
docs/anleitung-anwender.md (Inhaltsverzeichnis Zeilen 6-22, Kapitel "Persönliche Einstellungen" ab Zeile 143 und "Einen Fehler melden" ab Zeile 160 als Stilvorlage),
|
||
CHANGELOG.md (Zeilen 1-14),
|
||
apps/web/src/messages/de.json (Bloecke `auth.desktopDownload` und `settings.desktop` aus 18-03 — Beschriftungen woertlich uebernehmen),
|
||
apps/desktop/src-tauri/src/lib.rs (Tray-Texte und Benachrichtigungstext aus 18-04),
|
||
apps/desktop/src/setup.html (Texte der Erststart-Seite aus 18-04)
|
||
</read_first>
|
||
<action>
|
||
**Kapitel einfuegen** zwischen `## Persönliche Einstellungen` und
|
||
`## Einen Fehler melden`: `## Desktop-App`, im Inhaltsverzeichnis als neuer
|
||
Punkt 8 (`[Desktop-App](#desktop-app)`), die folgenden Punkte auf 9-11
|
||
umnummerieren. Unterabschnitte (`###`) in dieser Reihenfolge, Sie-Form,
|
||
kurze Absaetze, Beschriftungen exakt wie in der Oberflaeche:
|
||
|
||
1. **Was die Desktop-App ist** — eigenes Fenster statt Browser-Tab, Symbol
|
||
im Infobereich der Taskleiste, dieselben Funktionen wie im Browser.
|
||
2. **Herunterladen** — auf der Anmeldeseite unter dem Formular
|
||
„Desktop-App herunterladen (Windows)" und „Linux-Version"; oder
|
||
angemeldet unter Einstellungen → Allgemein → Desktop-App mit Version,
|
||
Dateiname und Dateigroesse. Kein Zugang zu Gitea noetig.
|
||
3. **Installation unter Windows** — Datei `Tessera-Setup-X.Y.Z.exe`
|
||
ausfuehren; Windows-SmartScreen zeigt „Der Computer wurde durch Windows
|
||
geschützt": auf „Weitere Informationen" und dann „Trotzdem ausführen"
|
||
klicken; Grund in einem Satz (die App ist fuer den internen Gebrauch
|
||
nicht signiert, das Paket stammt aus Ihrem Tessera-Server). Danach
|
||
Startmenue-Eintrag „Tessera". Eine neuere Version wird einfach
|
||
darueber installiert; die Server-Adresse bleibt erhalten.
|
||
4. **Installation unter Linux** — `Tessera-X.Y.Z.AppImage` ausfuehrbar
|
||
machen (Dateieigenschaften oder `chmod +x`) und starten; keine
|
||
Installation noetig.
|
||
5. **Erster Start: Server-Adresse** — die Adresse, unter der Sie Tessera im
|
||
Browser oeffnen (Beispiel `https://tessera.example.com`); die App prueft
|
||
die Adresse und meldet „Tessera X.Y.Z gefunden"; bei `http` erscheint
|
||
ein Hinweis, die Verbindung ist trotzdem moeglich; danach die gewohnte
|
||
Anmeldung.
|
||
6. **Fenster, Infobereich und Beenden** — Schliessen (X) legt Tessera in
|
||
den Infobereich; Linksklick auf das Symbol oeffnet das Fenster;
|
||
Rechtsklick zeigt „Öffnen", „Update herunterladen", „Mit Windows
|
||
starten" (Haken; unter Linux „Beim Anmelden starten") und „Beenden";
|
||
nur „Beenden" beendet die App; Fenstergroesse und -position werden
|
||
gemerkt.
|
||
7. **Automatischer Start** — Haken im Menue setzen/entfernen; ab Werk aus.
|
||
8. **Neue Version** — Benachrichtigung „Neue Version X.Y.Z verfügbar" beim
|
||
Start, Menueeintrag „Version X.Y.Z herunterladen" oeffnet die Seite
|
||
Einstellungen → Desktop-App im Browser; dort herunterladen und wie oben
|
||
installieren. Kein automatisches Update.
|
||
9. **Wenn etwas nicht klappt** — drei Faelle: „Unter dieser Adresse
|
||
antwortet kein Tessera-Server" (Adresse pruefen, es ist die
|
||
Browser-Adresse, nicht eine interne API-Adresse); der Download-Link fehlt
|
||
auf der Anmeldeseite (der Server traegt noch keine Pakete — Betrieb
|
||
fragen); SmartScreen blockiert (siehe Installation).
|
||
|
||
**CHANGELOG** (`## Unveröffentlicht` → `### Neu`): als neuen Stichpunkt in
|
||
der bestehenden Liste `- Desktop-App für Windows und Linux: Download auf der
|
||
Anmeldeseite und unter Einstellungen → Desktop-App` (D-17, Wortlaut exakt).
|
||
</action>
|
||
<acceptance_criteria>
|
||
- `grep -c '^## Desktop-App$' docs/anleitung-anwender.md` ergibt 1; `grep -c '(#desktop-app)' docs/anleitung-anwender.md` ergibt 1.
|
||
- `grep -c '^### ' docs/anleitung-anwender.md` ist um 9 groesser als vorher (neun Unterabschnitte); die Ueberschriften enthalten `Herunterladen`, `Installation unter Windows`, `Installation unter Linux`, `Erster Start`, `Infobereich`, `Automatischer Start`, `Neue Version`.
|
||
- `grep -c 'Trotzdem ausführen' docs/anleitung-anwender.md` ergibt mindestens 1; `grep -c 'Desktop-App herunterladen (Windows)' docs/anleitung-anwender.md` ergibt mindestens 1; `grep -c 'Mit Windows starten' docs/anleitung-anwender.md` ergibt mindestens 1.
|
||
- `grep -c 'ctl.de\|vicolab' docs/anleitung-anwender.md` ergibt 0 im neuen Kapitel (keine firmenspezifische Adresse).
|
||
- `grep -c '^- Desktop-App für Windows und Linux: Download auf der Anmeldeseite und unter Einstellungen → Desktop-App$' CHANGELOG.md` ergibt 1, und die Zeile steht oberhalb der ersten `## 1.` Versionsueberschrift.
|
||
</acceptance_criteria>
|
||
<verify>
|
||
<automated>cd /home/vicolab/projects/tessera-ctl && grep -q '^## Desktop-App$' docs/anleitung-anwender.md && grep -q '(#desktop-app)' docs/anleitung-anwender.md && grep -q 'Trotzdem ausführen' docs/anleitung-anwender.md && grep -q 'Desktop-App herunterladen (Windows)' docs/anleitung-anwender.md && grep -q 'Mit Windows starten' docs/anleitung-anwender.md && test "$(awk '/^## Desktop-App$/{f=1;next} /^## /{f=0} f' docs/anleitung-anwender.md | grep -c '^### ')" -ge 9 && test "$(awk '/^## Desktop-App$/{f=1;next} /^## /{f=0} f' docs/anleitung-anwender.md | grep -ci 'ctl\.de\|vicolab')" = "0" && node -e "const c=require('fs').readFileSync('CHANGELOG.md','utf8');const u=c.indexOf('## Unveröffentlicht'),v=c.search(/\n## [0-9]/);const b=c.indexOf('- Desktop-App für Windows und Linux: Download auf der Anmeldeseite und unter Einstellungen → Desktop-App');if(u===-1||b===-1||b>v||b<u)process.exit(1)" && echo DOCS1-OK</automated>
|
||
<fails_when>Kapitel, Inhaltsverzeichnis-Eintrag, eine Pflichtbeschriftung oder ein Unterabschnitt fehlt, das Kapitel nennt eine Firmenadresse, oder der CHANGELOG-Stichpunkt steht nicht unter „Unveröffentlicht" — `DOCS1-OK` fehlt.</fails_when>
|
||
</verify>
|
||
<done>
|
||
Kapitel „Desktop-App" mit neun Unterabschnitten im Anwenderhandbuch samt
|
||
Inhaltsverzeichnis; CHANGELOG-Stichpunkt im Wortlaut von D-17.
|
||
</done>
|
||
</task>
|
||
|
||
<task type="auto">
|
||
<name>Task 2: Betriebshandbuch Kapitel 10, CI/CD-Runbook, Entwicklungshandbuch</name>
|
||
<files>
|
||
docs/anleitung-betrieb.md,
|
||
docs/ci-cd-setup.md,
|
||
docs/anleitung-entwicklung.md
|
||
</files>
|
||
<read_first>
|
||
docs/anleitung-betrieb.md (Inhaltsverzeichnis Zeilen 12-22, Kapitel 8 ab Zeile 343, Kapitel 9 "Eine Version freigeben" ab Zeile 430),
|
||
docs/ci-cd-setup.md (Abschnitt 4 "Pipeline-Ueberblick" ab Zeile 108, Abschnitt 6 "Fehlerbehebung" ab Zeile 211),
|
||
docs/anleitung-entwicklung.md (Zeilen 23-58 Monorepo-Aufbau, "Lokale Entwicklungsumgebung" ab Zeile 58, "Tests" ab Zeile 403),
|
||
.gitea/workflows/ci.yml (Endstand nach 18-05),
|
||
.gitea/scripts/desktop-version.sh, .gitea/scripts/desktop-collect.sh, .gitea/scripts/publish-release.sh (Kopfkommentare),
|
||
apps/api/src/desktop/desktop.service.ts (Variable DESKTOP_DIST_DIR, Vorgabepfad),
|
||
.planning/phases/18-desktop-client-fertigstellen/18-05-SUMMARY.md (Rundentabelle — reale Fehlerbilder in die Fehlerbehebung uebernehmen)
|
||
</read_first>
|
||
<action>
|
||
**`docs/anleitung-betrieb.md`** — neues `## 10. Desktop-App: Pakete und
|
||
Release-Dateien` am Ende, Inhaltsverzeichnis um Punkt 10 ergaenzen. Der
|
||
Sprachstil des Dokuments (Sie-Form, nummerierte Kapitel, `###`-Abschnitte).
|
||
Abschnitte: `### Woher die Pakete kommen` (Job `desktop` nach `test`, auf
|
||
`main` und bei Tags `v*`; Linux-AppImage und Windows-Installer per
|
||
Cross-Bau auf dem Linux-Runner in einem Job; Einzelheiten der Werkzeugkette
|
||
in `docs/ci-cd-setup.md`, Abschnitt 4); `### Wo die Pakete im Abbild
|
||
liegen` (`/app/desktop-dist/` im API-Abbild mit `manifest.json`, Dateien
|
||
`Tessera-Setup-X.Y.Z.exe` und `Tessera-X.Y.Z.AppImage`, auf Beta mit Suffix
|
||
`-beta.{commit}`; Kontrolle: `docker compose exec api ls -l /app/desktop-dist`
|
||
und `curl -s https://{ihre-adresse}/api-proxy/desktop/latest`; Ausgabe
|
||
erklaeren); `### Release-Dateien in Gitea` (bei Tags haengt die Pipeline
|
||
beide Dateien an den Release; die Datei am Release ist dieselbe wie im
|
||
Abbild — Pruefsumme `sha256` aus dem Manifest); `### Umgebungsvariablen`
|
||
(keine neue Pflichtvariable; optional `DESKTOP_DIST_DIR`, Vorgabe
|
||
`/app/desktop-dist`; Tabelle im Stil von Kapitel 3); `### Fehlerbilder`
|
||
als Tabelle Symptom → Ursache → Massnahme: Download-Link fehlt auf der
|
||
Anmeldeseite bzw. `/api-proxy/desktop/latest` liefert 404 → Abbild ohne
|
||
Pakete (Job `publish` haette abbrechen muessen; Lauf pruefen, erneut
|
||
ausrollen); Download bricht bei grossen Dateien ab → Groessengrenze des
|
||
vorgeschalteten Proxys (Nginx Proxy Manager, `client_max_body_size` bzw.
|
||
Zeitlimits); Client meldet „Unter dieser Adresse antwortet kein
|
||
Tessera-Server" → Anwender hat die API- statt der Web-Adresse eingetragen
|
||
oder `/api-proxy` ist vom Client-Rechner nicht erreichbar; Windows warnt
|
||
(SmartScreen) → erwartet, keine Signatur (Anwenderhandbuch). In Kapitel 9,
|
||
Abschnitt „Eine Version freigeben", einen Satz ergaenzen: der Tag baut auch
|
||
die Desktop-Pakete und haengt sie an den Release (Kapitel 10).
|
||
|
||
**`docs/ci-cd-setup.md`** — Abschnitt 4: aus „drei" werden „vier" Jobs;
|
||
Job `desktop` zwischen `test` und `publish` beschreiben: Bedingung (`main`
|
||
und Tags `v*`), Schritte (Rust per rustup, apt-Pakete, `cargo-xwin`,
|
||
`rustup target add x86_64-pc-windows-msvc`, Version aus dem Tag per
|
||
`desktop-version.sh` — immer rein numerisch, Grund Windows-Ressourcen;
|
||
AppImage, dann NSIS-Cross-Bau; `desktop-collect.sh` mit Manifest;
|
||
Uebergabe an `publish` per `actions/cache` mit Schluessel `desktop-dist-{sha}`
|
||
und **warum nicht** upload-artifact (auf Gitea unzuverlaessig);
|
||
Cache-Pfade und Schluessel `desktop-cargo-<Cargo.lock-Hash>`); `publish`:
|
||
Restore mit hartem Abbruch, Pruefung des Manifests, Release-Upload der
|
||
Manifest-Dateien (idempotent: vorhandene Datei gleichen Namens wird
|
||
ersetzt). Abschnitt 6 Fehlerbehebung: neue Unterabschnitte „Job desktop
|
||
schlaegt fehl" (apt-Paketname, pkg-config, openssl-sys beim Windows-Ziel →
|
||
`rustls-tls`, NSIS-Plugin-Download, Speicher → `CARGO_BUILD_JOBS`),
|
||
„publish: cache miss" (Schluessel/Cache-Server, Abschnitt 2 Runner-Config
|
||
`[cache] enabled`), „Release-Upload 413" (`GITEA_API` auf die Host-Adresse
|
||
`http://172.18.0.1:3002/api/v1` — nur, wenn der Proxy die Groesse
|
||
abweist). Reale Fehlerbilder aus 18-05-SUMMARY (Rundentabelle) hier
|
||
eintragen.
|
||
|
||
**`docs/anleitung-entwicklung.md`** — (1) Im Monorepo-Aufbau die Zeile zu
|
||
`desktop/` und den Absatz bei Zeile 39, der `apps/desktop` als blosses
|
||
Grundgeruest mit einer einzelnen `setup.html` beschreibt, ersetzen (das Wort
|
||
„Grundgerüst" darf im Dokument danach nicht mehr im Zusammenhang mit Tauri
|
||
stehen — Negativ-Tor in `<verify>`): `apps/desktop` ist der fertige
|
||
Desktop-Client (Tauri 2): `src-tauri/src/lib.rs` (Tray, Erststart-Kommandos,
|
||
Versionspruefung), `src/setup.html` (Erststart-Seite), Pakete entstehen im
|
||
CI; `packages/shared` enthaelt jetzt auch die Manifest-Typen der
|
||
Desktop-Pakete. (2) Unter „Lokale Entwicklungsumgebung" neuer Abschnitt
|
||
`### Desktop-App lokal bauen`: Voraussetzungen (Rust stable per rustup,
|
||
Ubuntu/Debian-Pakete `libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libgtk-3-dev libssl-dev patchelf`),
|
||
Befehle `sh .gitea/scripts/desktop-version.sh` (schreibt die Version des
|
||
letzten Tags — die eingecheckten Versionsdateien sind nur eine Basislinie),
|
||
`pnpm --filter @tessera/desktop exec tauri build --bundles appimage`,
|
||
Ausgabe unter `apps/desktop/src-tauri/target/release/bundle/appimage/`,
|
||
`sh .gitea/scripts/desktop-collect.sh --require linux` fuer `desktop-dist/`
|
||
(vom Git ausgeschlossen bis auf den Platzhalter), Hinweis: der
|
||
Windows-Installer wird nur im CI gebaut (`cargo-xwin`, NSIS), lokal genuegt
|
||
`cargo check`/`cargo clippy`; lokaler Docker-Stack: nach `docker compose build api`
|
||
liefert die API die Pakete unter `/desktop/latest`. (3) Unter „Tests":
|
||
`pnpm --filter @tessera/api exec vitest run src/desktop` (HTTP-Durchstich
|
||
ueber `NestFactory`, echtes Temp-Verzeichnis) und die Rust-Pruefungen
|
||
ergaenzen.
|
||
</action>
|
||
<acceptance_criteria>
|
||
- `grep -c '^## 10. Desktop-App' docs/anleitung-betrieb.md` ergibt 1; das Inhaltsverzeichnis enthaelt einen Eintrag `10.`; `grep -c 'DESKTOP_DIST_DIR' docs/anleitung-betrieb.md` ergibt mindestens 1; `grep -c '/app/desktop-dist' docs/anleitung-betrieb.md` ergibt mindestens 1; `grep -c '### Fehlerbilder' docs/anleitung-betrieb.md` ergibt 1.
|
||
- `grep -c 'vier aufeinander aufbauenden Jobs\|vier Jobs' docs/ci-cd-setup.md` ergibt mindestens 1; `grep -c 'cargo-xwin' docs/ci-cd-setup.md` ergibt mindestens 2; `grep -c 'upload-artifact' docs/ci-cd-setup.md` ergibt mindestens 1 (Begruendung, warum nicht); `grep -c 'desktop-dist-' docs/ci-cd-setup.md` ergibt mindestens 1.
|
||
- `grep -c 'Tauri-Grundgerüst' docs/anleitung-entwicklung.md` ergibt 0; `grep -c '### Desktop-App lokal bauen' docs/anleitung-entwicklung.md` ergibt 1; `grep -c 'desktop-version.sh' docs/anleitung-entwicklung.md` ergibt mindestens 1; `grep -c 'vitest run src/desktop' docs/anleitung-entwicklung.md` ergibt mindestens 1.
|
||
- Keine firmenspezifische Adresse in den neuen Abschnitten (die bestehenden Nennungen von `git.vicolab.de` im CI/CD-Runbook sind Infrastruktur und bleiben).
|
||
</acceptance_criteria>
|
||
<!-- planner-discipline-allow: Tauri-Grundgerüst -->
|
||
<verify>
|
||
<automated>cd /home/vicolab/projects/tessera-ctl && grep -q '^## 10. Desktop-App' docs/anleitung-betrieb.md && grep -q 'DESKTOP_DIST_DIR' docs/anleitung-betrieb.md && grep -q '/app/desktop-dist' docs/anleitung-betrieb.md && grep -q '### Fehlerbilder' docs/anleitung-betrieb.md && grep -Eq '^10\. \[' docs/anleitung-betrieb.md && test "$(grep -c 'cargo-xwin' docs/ci-cd-setup.md)" -ge 2 && grep -q 'desktop-dist-' docs/ci-cd-setup.md && grep -q 'upload-artifact' docs/ci-cd-setup.md && test "$(grep -c 'Tauri-Grundgerüst' docs/anleitung-entwicklung.md)" = "0" && grep -q '### Desktop-App lokal bauen' docs/anleitung-entwicklung.md && grep -q 'desktop-version.sh' docs/anleitung-entwicklung.md && grep -q 'vitest run src/desktop' docs/anleitung-entwicklung.md && echo DOCS2-OK</automated>
|
||
<fails_when>Kapitel 10, Inhaltsverzeichnis-Eintrag, Variable, Ablageort, Fehlerbilder, Cross-Bau-Beschreibung, Cache-Schluessel oder der neue Entwicklungsabschnitt fehlen, oder das Entwicklungshandbuch nennt `apps/desktop` noch als Grundgeruest — `DOCS2-OK` fehlt.</fails_when>
|
||
</verify>
|
||
<done>
|
||
Betriebshandbuch mit Kapitel 10 (Pipeline, Ablageort, Release-Dateien,
|
||
Variable, Fehlerbilder), CI/CD-Runbook mit Job `desktop` und
|
||
Fehlerbehebung, Entwicklungshandbuch mit lokalem Bau und aktualisiertem
|
||
Monorepo-Aufbau.
|
||
</done>
|
||
</task>
|
||
|
||
<task type="auto">
|
||
<name>Task 3: REQUIREMENTS nachziehen, Gesamtlaeufe, Bedienprobe des Nutzers</name>
|
||
<files>
|
||
.planning/REQUIREMENTS.md
|
||
</files>
|
||
<read_first>
|
||
.planning/REQUIREMENTS.md (Abschnitte "SRC" ab Zeile 58 als Formvorlage, "Traceability" ab Zeile 101),
|
||
.planning/ROADMAP.md (Phase 18: Requirements-Zeile und Erfolgskriterien),
|
||
.planning/phases/06-desktop-client-ci-cd/06-CONTEXT.md (Ursprung DESK-01/02)
|
||
</read_first>
|
||
<action>
|
||
**REQUIREMENTS.md.** Vor `## Future Requirements (deferred)` einen Abschnitt
|
||
`## Phase 18 — Desktop-Client fertigstellen` mit `### DESK — Desktop-Client`
|
||
und einem Einleitungssatz („Hinzugefügt 2026-09-16 — DESK-01/02 stammen aus
|
||
v1.0 (Phase 6) und werden fortgeführt; DESK-03..05 aus
|
||
`18-CONTEXT.md` abgeleitet") einfuegen. Eintraege im Stil der SRC-Zeilen:
|
||
`- [x] **DESK-01**: Tauri-basierter Desktop-Wrapper für Windows und Linux (Phase 6, fortgeführt).`;
|
||
`- [x] **DESK-02**: Die Desktop-App verbindet sich mit dem Web-Backend; die Server-Adresse wird beim ersten Start abgefragt (Phase 6, fortgeführt; D-02).`;
|
||
`- [ ] **DESK-03**: Der Installer ist in Tessera herunterladbar — Link auf der Anmeldeseite und Seite Einstellungen → Desktop-App, Auslieferung über die Tessera-API ohne Gitea-Zugang (D-01, D-10, D-12).`;
|
||
`- [ ] **DESK-04**: Ein Freigabe-Tag baut Windows-Installer und Linux-AppImage in der Pipeline und hängt beide als Dateien an den Gitea-Release (D-04..D-08).`;
|
||
`- [ ] **DESK-05**: Der Client trägt die Freigabe-Version, vergleicht sie mit `/desktop/latest` und weist mit Download-Link auf eine neuere Version hin (D-07, D-11, D-13).`
|
||
In der Traceability-Tabelle fuenf Zeilen ergaenzen: `DESK-01 | Phase 6 / 18 | Complete`,
|
||
`DESK-02 | Phase 6 / 18 | Complete`, `DESK-03 | Phase 18 | Pending`,
|
||
`DESK-04 | Phase 18 | Pending`, `DESK-05 | Phase 18 | Pending` (auf
|
||
Complete setzt sie die Verifikation der Phase). Die Coverage-Zeile um einen
|
||
Satz ergaenzen (5/5 DESK auf Phase 18 abgebildet).
|
||
|
||
**Gesamtlaeufe** (Endstand der Phase): `pnpm --filter @tessera/api exec vitest run`,
|
||
`pnpm --filter @tessera/web exec vitest run`, `pnpm --filter @tessera/api type-check`,
|
||
`pnpm --filter @tessera/web type-check`, `cargo check` in
|
||
`apps/desktop/src-tauri`. Ergebnisse (Anzahl Dateien/Tests) im SUMMARY
|
||
festhalten. `biome check` ist kein Tor (bekannter Fehler in der
|
||
Wurzel-`biome.json`, nicht anfassen).
|
||
|
||
**Bedienprobe vorbereiten:** Den Text der `<human-check>` unten als
|
||
Schrittfolge in das SUMMARY uebernehmen, damit der Nutzer sie zur Hand hat;
|
||
die Testserver-Adresse dort einsetzen (`alpha.tessera.ctl.de`, nur im
|
||
SUMMARY/Gespraech, nie im Handbuch).
|
||
</action>
|
||
<acceptance_criteria>
|
||
- `grep -c '\*\*DESK-0[1-5]\*\*' .planning/REQUIREMENTS.md` ergibt 5; `grep -c '^| DESK-0[1-5] |' .planning/REQUIREMENTS.md` ergibt 5.
|
||
- `pnpm --filter @tessera/api exec vitest run` und `pnpm --filter @tessera/web exec vitest run` melden 0 fehlgeschlagene Tests; beide Typpruefungen fehlerfrei; `cargo check` gruen.
|
||
- Der Nutzer hat die Bedienprobe (human-check) durchgefuehrt und das Ergebnis liegt vor.
|
||
</acceptance_criteria>
|
||
<verify>
|
||
<automated>cd /home/vicolab/projects/tessera-ctl && test "$(grep -c '\*\*DESK-0[1-5]\*\*' .planning/REQUIREMENTS.md)" = "5" && test "$(grep -c '^| DESK-0[1-5] |' .planning/REQUIREMENTS.md)" = "5" && echo REQ-OK</automated>
|
||
<fails_when>Weniger oder mehr als fuenf DESK-Eintraege bzw. Traceability-Zeilen — `REQ-OK` fehlt.</fails_when>
|
||
<automated>cd /home/vicolab/projects/tessera-ctl && pnpm --filter @tessera/api exec vitest run && pnpm --filter @tessera/web exec vitest run && pnpm --filter @tessera/api type-check && pnpm --filter @tessera/web type-check && (cd apps/desktop/src-tauri && cargo check 2>&1 | tail -1 | grep -q Finished) && echo ALL-GREEN</automated>
|
||
<fails_when>Eine Suite meldet "failed", tsc gibt Fehler aus, oder `cargo check` endet ohne `Finished` — `ALL-GREEN` fehlt.</fails_when>
|
||
<human-check>
|
||
Bedienprobe des Nutzers (Du-Form im Gespraech; Voraussetzung: der Testserver
|
||
laeuft auf dem Beta-Stand mit den Paketen — `docker compose pull` und
|
||
`docker compose up -d --force-recreate` machst du dort selbst; Windows-PC
|
||
mit Browser):
|
||
|
||
1. Anmeldeseite des Testservers im Browser oeffnen: Unter dem Formular
|
||
steht „Desktop-App herunterladen (Windows)", daneben „Linux-Version",
|
||
darunter „Version 1.1.0".
|
||
2. Auf den Windows-Link klicken: Es laedt `Tessera-Setup-1.1.0-beta.{kennung}.exe`
|
||
(wenige MB).
|
||
3. Datei ausfuehren. Windows zeigt die SmartScreen-Warnung: „Weitere
|
||
Informationen" → „Trotzdem ausführen". Die Installation laeuft ohne
|
||
weitere Fragen durch; Tessera startet (sonst ueber das Startmenue).
|
||
4. Erststart-Seite: dunkle Karte mit Tessera-Zeichen und gelbem Schriftzug,
|
||
Feld „Adresse Ihres Tessera-Servers". Adresse des Testservers eintragen
|
||
(`https://…`), „Verbinden": kurz „Tessera 1.1.0 gefunden – Verbindung
|
||
wird hergestellt …", dann erscheint die Tessera-Anmeldung **im
|
||
App-Fenster**.
|
||
5. Anmelden. Fenster mit X schliessen: Die App bleibt im Infobereich
|
||
(Symbol mit Tessera-Zeichen). Linksklick auf das Symbol: Fenster ist
|
||
wieder da.
|
||
6. Rechtsklick auf das Symbol: Menue „Öffnen", „Update herunterladen"
|
||
(ausgegraut, weil du die aktuelle Version hast), „Mit Windows starten"
|
||
(ohne Haken), „Beenden" — mit Umlauten.
|
||
7. „Mit Windows starten" anklicken: Haken erscheint; erneut anklicken:
|
||
Haken verschwindet.
|
||
8. „Beenden": App ist weg (auch aus dem Infobereich).
|
||
9. App erneut starten: Sie geht **direkt** zu Tessera (Adresse gemerkt),
|
||
Fenstergroesse und -position wie beim Beenden.
|
||
10. In der App: Einstellungen → Allgemein → „Desktop-App": Seite mit
|
||
„Aktuelle Version: 1.1.0", „Beta-Ausgabe, Stand {kennung}", zwei gelbe
|
||
Knoepfe „Für Windows herunterladen" / „Für Linux herunterladen", darunter
|
||
Dateiname und Groesse (z. B. „… · 101,5 MB" fuer Linux), und vier
|
||
Saetze Erklaerung.
|
||
11. Falls ein Linux-Rechner greifbar ist: AppImage herunterladen,
|
||
ausfuehrbar machen, starten — Erststart-Seite wie unter 4.
|
||
|
||
Zwei Punkte lassen sich erst beim **naechsten Freigabe-Tag** pruefen und
|
||
gehoeren in die Abnahme dieser Version, nicht in diese Phase: (a) Nach dem
|
||
Tag `v1.2.0` zeigt der installierte 1.1.0-Client beim Start die
|
||
Benachrichtigung „Neue Version 1.2.0 verfügbar …", und der Menueeintrag
|
||
heisst „Version 1.2.0 herunterladen" und oeffnet die Seite Desktop-App im
|
||
Browser. (b) Der Gitea-Release `v1.2.0` traegt `Tessera-Setup-1.2.0.exe`
|
||
und `Tessera-1.2.0.AppImage` als Dateien.
|
||
</human-check>
|
||
</verify>
|
||
<done>
|
||
REQUIREMENTS.md fuehrt DESK-01..05 mit Nachverfolgung; alle Suiten und
|
||
Typpruefungen gruen; die Bedienprobe des Nutzers ist durchgefuehrt und im
|
||
SUMMARY dokumentiert (inklusive der zwei auf den naechsten Tag vertagten
|
||
Punkte).
|
||
</done>
|
||
</task>
|
||
|
||
</tasks>
|
||
|
||
<threat_model>
|
||
## Trust Boundaries
|
||
|
||
| Boundary | Description |
|
||
|----------|-------------|
|
||
| Handbuecher -> Anwender | Anleitungen praegen das Verhalten der Anwender bei Sicherheitswarnungen (SmartScreen). |
|
||
| Testserver -> Nutzer-PC | Der Nutzer installiert ein unsigniertes Paket vom Beta-Kanal. |
|
||
|
||
## STRIDE Threat Register
|
||
|
||
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
||
|-----------|----------|-----------|----------|-------------|-----------------|
|
||
| T-18-19 | Spoofing | SmartScreen-Anleitung („Trotzdem ausführen") | low | mitigate | Das Handbuch koppelt die Anweisung an die Herkunft (Download nur aus dem eigenen Tessera-Server, Dateiname `Tessera-Setup-…`) und nennt keine allgemeine Empfehlung, Warnungen zu ignorieren. |
|
||
| T-18-20 | Information Disclosure | Handbuecher mit Server-Adressen | low | mitigate | Nur Platzhalter (`https://tessera.example.com`); die Testserver-Adresse steht ausschliesslich im SUMMARY/Gespraech. |
|
||
| T-18-SC | Tampering | Paketinstallationen | low | accept | Dieser Plan installiert kein Paket. |
|
||
</threat_model>
|
||
|
||
<verification>
|
||
1. Dokument-Kennzeichen (Kapitel, Inhaltsverzeichnis, Pflichtbegriffe) in
|
||
allen vier Dokumenten erfuellt.
|
||
2. CHANGELOG-Stichpunkt unter „Unveröffentlicht".
|
||
3. REQUIREMENTS.md mit DESK-01..05 und Traceability.
|
||
4. Gesamtlaeufe API/Web/Typpruefung/Cargo gruen.
|
||
5. Bedienprobe des Nutzers auf Windows (Schritte 1-10) bestanden; Punkte
|
||
(a) und (b) auf den naechsten Freigabe-Tag vertagt und so dokumentiert.
|
||
</verification>
|
||
|
||
<success_criteria>
|
||
- Anwender-, Betriebs- und Entwicklungshandbuch beschreiben Installation,
|
||
Erststart, Tray-Verhalten, Pipeline, Release-Dateien und
|
||
Umgebungsvariablen (Erfolgskriterium 4).
|
||
- Der installierte Client zeigt nach Eingabe der Server-Adresse die
|
||
Anmeldung und verhaelt sich im Infobereich wie beschrieben
|
||
(Erfolgskriterium 3, Bedienprobe).
|
||
- Alle Suiten gruen; CHANGELOG und REQUIREMENTS nachgezogen.
|
||
</success_criteria>
|
||
|
||
<output>
|
||
Create `.planning/phases/18-desktop-client-fertigstellen/18-06-SUMMARY.md` when done.
|
||
Im SUMMARY festhalten: Ergebnis der Bedienprobe je Schritt, die zwei
|
||
vertagten Punkte, und die Zahlen der Gesamtlaeufe.
|
||
</output>
|