Dokument-Status: Überblick (verweist auf drei Einzel-Lastenhefte)
Erstellt: 2026-03-31
Aktualisiert: 2026-03-31 — in drei Einzel-Lastenhefte aufgeteilt
Betrifft: InventarViewerApp/, CtrlWorkerServiceApp/, CtrlWorkerServiceCmdlet/
Voraussetzung: dotnet test InventarWorkerService.sln muss vor Beginn vollständig grün sein.
Dieses Dokument dient als Überblick und Einstiegspunkt. Die drei Einzel-Lastenhefte enthalten die vollständigen Anforderungen, API-Mappings und Abnahmekriterien für jeweils eine Komponente:
| PR | Komponente | Dokument | Umfang |
|---|---|---|---|
| PR A |
Elmish-Abhängigkeit entfernen (Vorbedingung für PR D) | Lastenheft_TG_Elmish_Entscheidung.md | Terminal.Gui.Elmish-Referenz aus CtrlWorkerServiceApp.csproj entfernen — 1 Zeile, kein Funktionsverlust |
| PR B | InventarViewerApp | Lastenheft_TG_Migration_InventarViewerApp.md | 6 Dateien, MainLoop.Invoke() (kritischste Stelle) |
| PR C | CtrlWorkerServiceCmdlet | Lastenheft_TG_Migration_CtrlWorkerServiceCmdlet.md | 1 Datei, PSCmdlet-Kontext, Mehrfach-Init-Test |
| PR D | CtrlWorkerServiceApp | Lastenheft_TG_Migration_CtrlWorkerServiceApp.md | 1 Datei, einfachste Komponente (nach PR A) |
PR A ist Pflicht-Vorbedingung für PR D: Solange
Terminal.Gui.Elmishreferenziert ist, kann Terminal.Gui inCtrlWorkerServiceAppnicht auf 2.x angehoben werden (Paket-Inkompatibilität). PR B und PR C sind von PR A unabhängig und können parallel oder zuerst gestartet werden.
Drei TUI-Komponenten nutzen Terminal.Gui 1.19.0 (statische API).
Zusammen umfassen sie 8 Dateien mit Terminal.Gui-Code und
13 statische Application.*-Aufrufe.
| Projekt | Terminal.Gui-Dateien | Besonderheit |
|---|---|---|
| InventarViewerApp | 6 | Application.MainLoop.Invoke() (Thread-sicher) |
| CtrlWorkerServiceApp | 1 | Terminal.Gui.Elmish Abhängigkeit (ungeklärt) |
| CtrlWorkerServiceCmdlet | 1 | PSCmdlet — TUI eingebettet in PowerShell |
CtrlWorkerServiceApp.csproj enthält:
<PackageReference Include="Terminal.Gui.Elmish" Version="2.2.1140" />Terminal.Gui.Elmish 2.2.x ist ausschließlich für Terminal.Gui 1.x entwickelt und mit 2.x inkompatibel.
Code-Analyse: Kein Elmish-Code im Projekt gefunden (keine Program.mkProgram-,
ElmishApp.*- oder Program.run-Aufrufe). Die Abhängigkeit ist im Code
nicht aktiv genutzt — sie wurde vermutlich für eine geplante, nie umgesetzte
Elmish-Architektur hinzugefügt.
→ Entscheidung vor Beginn der Migration erforderlich (R-TG-IWS-02).
| Datei | Stellen |
|---|---|
TuiApp.cs |
Application.Init(), Application.Run(), Application.Shutdown() |
UI/MainWindow.cs |
Application.Run(dialog) ×2, Application.RequestStop(), Application.MainLoop.Invoke() ×5, Application.Top |
UI/SettingsDialog.cs |
Application.RequestStop() ×2 |
UI/HardwareView.cs |
Terminal.Gui-Typen (keine Application.*-Aufrufe) |
UI/SoftwareView.cs |
Terminal.Gui-Typen (keine Application.*-Aufrufe) |
UI/StatusView.cs |
Terminal.Gui-Typen (keine Application.*-Aufrufe) |
Kritisch: Application.MainLoop.Invoke(action) — dieses Muster wird in
MainWindow.cs fünfmal verwendet, um UI-Updates thread-sicher aus
Hintergrundthreads auszuführen. In v2 ist Application.MainLoop entfernt;
Ersatz: Application.Invoke(action).
| Datei | Stellen |
|---|---|
Program.cs |
Application.Init(), Application.Top, Application.RequestStop() ×2, Application.Run(), Application.Shutdown() |
| Datei | Stellen |
|---|---|
InvokeWorkerServiceControlCmdlet.cs |
Application.Init(), Application.RequestStop() ×2, Application.Run(), Application.Shutdown() |
In InventarViewerApp.csproj, CtrlWorkerServiceApp.csproj und
CtrlWorkerServiceCmdlet.csproj die PackageReference aktualisieren:
<PackageReference Include="Terminal.Gui" Version="2.0.0" />Vor dem ersten Migrations-PR ist zu entscheiden:
- Empfehlung (bevorzugt):
Terminal.Gui.Elmish-Referenz ausCtrlWorkerServiceApp.csprojentfernen, da kein aktiver Elmish-Code im Projekt vorhanden ist. Die Abhängigkeit war ungenutztes Planungs-Artefakt. - Alternative: Wenn Elmish-Architektur für CtrlWorkerServiceApp in einem
künftigen PR umgesetzt werden soll, auf einen kompatiblen Nachfolger warten
(zum Stand dieses Lastenhefte existiert kein offizieller
Terminal.Gui.Elmish-Port für v2.x).
Diese Entscheidung ist im zugehörigen PR-Text zu dokumentieren.
InventarViewerApp/UI/MainWindow.cs nutzt fünfmal das Muster:
// v1.x — entfernt in v2:
Application.MainLoop.Invoke(() => { /* UI-Update */ });Ersatz in v2:
// v2.x:
Application.Invoke(() => { /* UI-Update */ });Alle 5 Vorkommen sind zu ersetzen. Dies ist die einzige echte Breaking-Change-Stelle in InventarViewerApp.
Application.Top (statische Eigenschaft, v1.x-Stil) wird in drei Stellen
(MainWindow.cs, CtrlWorkerServiceApp/Program.cs, CtrlWorkerServiceCmdlet) genutzt.
In v2 ist Application.Top noch vorhanden, aber das empfohlene Muster ist,
die Toplevel-Instanz explizit zu erstellen und zu übergeben:
// v2-Empfehlung:
Application.Init();
var top = new Toplevel();
// ... top befüllen ...
Application.Run(top);
Application.Shutdown();Alle Key.CtrlMask | Key.X-Ausdrücke müssen auf v2-Syntax umgestellt werden.
Bekannte Stellen:
| Datei | Alt | Neu |
|---|---|---|
MainWindow.cs |
Key.CtrlMask | Key.ShiftMask | Key.Q |
Key.Ctrl + Key.Shift + Key.Q |
MainWindow.cs |
Key.CtrlMask | Key.B |
Key.Ctrl + Key.B |
MainWindow.cs |
Key.CtrlMask | Key.ShiftMask | Key.W |
Key.Ctrl + Key.Shift + Key.W |
new StatusItem(Key.CtrlMask | Key.B, ...) → v2-StatusItem-Konstruktor prüfen,
da die v2-Signatur abweichen kann.
CtrlWorkerServiceApp und CtrlWorkerServiceCmdlet nutzen:
// v1.x:
ColorScheme = Colors.Base;
ColorScheme = Colors.Menu;In v2 lautet der Zugriff:
// v2.x:
ColorScheme = Colors.ColorSchemes["Base"];
ColorScheme = Colors.ColorSchemes["Menu"];Das InvokeWorkerServiceControlCmdlet bettet Application.Init/Run/Shutdown
direkt in einem PSCmdlet-Aufruf ein. Nach der Migration muss verifiziert werden,
dass Terminal.Gui 2.x korrekt im PowerShell-Prozesskontext startet und beendet.
Testprozedur:
Import-Module ./CtrlWorkerServiceCmdlet/bin/Release/net10.0/CtrlWorkerServiceCmdlet.dll
Invoke-WorkerServiceControl -Tui
# Erwartung: TUI startet, kann per Keyboard beendet werden, kein Absturzdotnet test InventarWorkerService.sln --collect:"XPlat Code Coverage" \
--results-directory ./TestResultsCoverage-Ziel: ≥ 70% (Minimum), ≥ 80% (Ziel).
Terminal.Gui 2.x bietet FakeDriver für Headless-Tests. Aktuell gibt es
keine TUI-Tests in InventarWorkerService. Nach der Migration sollen
FakeDriver-basierte Tests für die kritischsten UI-Pfade ergänzt werden:
mindestens CSV-Import-Dialog, Settings-Dialog und Quit-Shortcut.
Dies ist kein Pflichtziel des Migrations-PRs, sondern ein Folge-PR.
- PR A — Elmish-Entscheidung:
CtrlWorkerServiceApp.csproj: Elmish-Abhängigkeit entfernen (minimaler, sicherer Schritt, kein Funktionsverlust). - PR B — InventarViewerApp: Die komplexeste Komponente zuerst — enthält
MainLoop.Invoke()-Stellen und die meisten TUI-Dateien. - PR C — CtrlWorkerServiceCmdlet: PSCmdlet mit TUI — nach InventarViewerApp, weil dieselben Patterns gelten.
- PR D — CtrlWorkerServiceApp: Einfachste Komponente (1 Datei), nach Elmish-Klärung.
- Migration von
InventarWorkerService(REST API) oderHarvesterWorkerService(kein TUI) ServiceStatusReaderApp(verwendet kein Terminal.Gui)- Neue Features oder Datenbankschicht
| ID | Kriterium |
|---|---|
| AK-TG-IWS-01 | Alle drei .csproj-Dateien referenzieren Terminal.Gui ≥ 2.0.0 |
| AK-TG-IWS-02 | Terminal.Gui.Elmish-Abhängigkeit entfernt oder Entscheidung dokumentiert |
| AK-TG-IWS-03 | Application.MainLoop.Invoke() durch Application.Invoke() ersetzt (5 Stellen) |
| AK-TG-IWS-04 | Application.Top durch explizite Toplevel-Instanz ersetzt |
| AK-TG-IWS-05 | Alle Key.CtrlMask-Ausdrücke durch v2-Syntax ersetzt |
| AK-TG-IWS-06 | Colors.Base / Colors.Menu durch Colors.ColorSchemes[...] ersetzt |
| AK-TG-IWS-07 | Invoke-WorkerServiceControl -Tui startet und beendet sauber |
| AK-TG-IWS-08 | dotnet test InventarWorkerService.sln vollständig grün; Coverage ≥ 70% |
Dieser Abschnitt wird während der Umsetzung mit Commit-URLs und Zeitstempeln befüllt.
Deutsch: Dieses Lastenheft zeigt, dass eine Bibliotheks-Migration in einem
gewachsenen System mehr als ein Versions-Bump ist. Die Application.MainLoop.Invoke()-
Stellen sind ein Beispiel für Thread-Synchronisierung in TUI-Anwendungen —
ein wichtiges Konzept, das auch in anderen Frameworks (WPF, Avalonia) in ähnlicher
Form auftritt. Die Elmish-Abhängigkeit zeigt, wie ungenutzter Code (dead dependency)
Migrationen erschweren kann.
English: This requirements document shows that a library migration in a grown system
involves more than a version bump. The Application.MainLoop.Invoke() occurrences
illustrate thread synchronisation in TUI applications — an important concept that
appears in similar forms in other frameworks (WPF, Avalonia). The Elmish dependency
shows how unused code (dead dependency) can complicate migrations.