Fruehjahrsputz: WinForms-Altlast entfernt, Dokumentation nachgezogen

Die Avalonia-Portierung ist abgeschlossen, damit ist die in ClawdDotNet.slnx
angekuendigte Aufgabe "WinForms-Oberflaeche entfernen" faellig. Der Stand
davor liegt unter dem Tag vor-fruehjahrsputz-2026-08.

Entfernt (56 Dateien, seit dem Herausloesen der Anwendungsschicht nicht mehr
Teil des Builds): ClawdDotNet.csproj, Program.cs, sieben frm_*-Formulare,
UI/, Models/, EmbeddedUI/, Properties/, Resources/, Services/, das alte
Anwendungssymbol und Deploy-Build.ps1 (ersetzt durch deploy/publish.py).
Dazu configs/*.json - Beispielkonfigurationen aus der Zeit vor dem
Instanzverzeichnis, auf die nur noch die alten Prompts verwiesen.

Die vier Entwicklungs-Prompts der Anfangszeit ziehen nach docs/archiv/ um,
mit README, das ihren Stand einordnet. Eine Regel darin gilt weiter - die
Pflichtfelder fetchedAt/dataAsOf/source der Internet-Tools -, deshalb
Archiv statt Loeschen; der WebSearch-Plan verweist auf den neuen Pfad.

Toter Code
- PlaceholderPageViewModel samt Ansicht: Es gibt keinen Platzhalter-Bereich
  mehr, seit alle neun Seiten portiert sind.
- Snappier als direkter Paketverweis: MongoDB.Driver loest es ohnehin auf
  dieselbe Fassung auf, der Verweis hob nichts an.

Zwei Fehler, die dabei sichtbar wurden
- Die taegliche Sicherung lief ins Leere. Die Oberflaeche bot sie an und
  schrieb Uhrzeit, Zielordner und Anzahl in die Einstellungen, aber der
  BackupScheduler wurde nirgends erzeugt. Jetzt am AppHost verdrahtet und
  in den geordneten Abbau aufgenommen.
- SettingsPageViewModel hielt die vier Sicherungs-Einstellungen doppelt.
  Aus der Ansicht waren sie laengst verschwunden, gelesen und beim
  Speichern zurueckgeschrieben wurden sie weiter: Wer die Uhrzeit auf der
  Sicherungs-Seite aenderte und danach die Einstellungen speicherte, bekam
  den alten Wert zurueck.

Pakete: keine bekannten Sicherheitsluecken mehr
- SQLitePCLRaw.bundle_e_sqlite3 auf 2.1.13 angehoben. Microsoft.Data.Sqlite
  bringt 2.1.11 mit, darin steckt GHSA-2m69-gcr7-jv3q (NU1903, hoch).
- SharpCompress bleibt als direkter Verweis stehen. Beim Aufraeumen erst
  als ungenutzt entfernt - dabei kam die von MongoDB.Driver gezogene
  Fassung 0.30.1 mit GHSA-6c8g-7p36-r338 zurueck. Der Verweis ist eine
  Anhebung, kein Ballast; das steht jetzt als Kommentar dabei.

Dokumentation
- Roadmap mit Statusblock: A1 und A3 erledigt, A2 nur zur Haelfte - Gate,
  Policy und Dienst greifen, aber keine Ansicht ruft ApproveAsync auf, ein
  gestagter Aufruf liegt unbeantwortet. Das ist jetzt Punkt 1 der Reihung.
  Rocket.Chat steht und kollidiert mit A5 (Matrix) - Entscheidung faellig.
- Avalonia-Portierungsleitfaden -> Oberflaechen-Leitfaden: kein Auftrag mehr,
  sondern Beschreibung des Stands.
- Bestandsaufnahme und Linux-Analyse als datierte Befunde gekennzeichnet;
  der teure Teil der Linux-Analyse (8.900 Zeilen WinForms) ist hinfaellig.
- Verweise auf frm_*, WebView2 und ClawdDotNet.csproj in den lebenden
  Dokumenten richtiggestellt.

Build fehlerfrei, 585 Tests gruen (6 uebersprungen).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-23 12:26:14 +02:00
co-authored by Claude Opus 5
parent 33d95a6c3f
commit 2853541629
79 changed files with 186 additions and 18381 deletions
+17
View File
@@ -67,6 +67,13 @@ public sealed class AppHost : IAsyncDisposable
public TelegramClientManager? TelegramClient { get; private init; }
public OpenRouterStatusService? Status { get; private init; }
/// <summary>
/// Die taegliche Sicherung. Immer gesetzt — ob sie etwas tut, entscheidet
/// <c>AutoBackupEnabled</c> bei jedem Durchlauf neu, damit eine Aenderung in den
/// Einstellungen ohne Neustart greift.
/// </summary>
public BackupScheduler? Backups { get; private set; }
/// <summary>
/// Anbindung ans Deploymentcenter (Heartbeat, Fehler-Stream, Bugtracker, Updates).
/// Null, wenn Adresse oder Token fehlen.
@@ -211,6 +218,16 @@ public sealed class AppHost : IAsyncDisposable
await host.ConnectTelegramAsync(callbacks, logger);
await host.StartDeploymentcenterAsync(loggerFactory, ct);
// Die Oberflaeche bietet die taegliche Sicherung an und schreibt Uhrzeit und
// Zielordner in die Einstellungen — gestartet wurde der Takt dazu bisher nicht,
// die Einstellung lief also ins Leere.
host.Backups = new BackupScheduler(
instancePath, instance.InstanceName, settings,
loggerFactory.CreateLogger("ClawdDotNet.Backup"));
host.Backups.Start();
host._shutdown.Add(host.Backups.DisposeAsync);
return new StartupResult(host, null);
}
@@ -13,6 +13,13 @@
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.8" />
<!-- Kein Aufruf im Code: Microsoft.Data.Sqlite bringt das Buendel selbst mit, aber
in 2.1.11 - und darin steckt die SQLite-Fassung mit GHSA-2m69-gcr7-jv3q
(NU1903, hoch). Der direkte Verweis hebt core, provider und die native
Bibliothek gemeinsam auf 2.1.13 an; einzeln angehoben liefen die drei
auseinander. Faellt weg, sobald Microsoft.Data.Sqlite selbst nachzieht. -->
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.13" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.8" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" />
@@ -340,12 +340,3 @@ public abstract partial class PageViewModel(string title) : ViewModelBase
{
public string Title { get; } = title;
}
/// <summary>
/// Platzhalter, solange ein Bereich noch nicht portiert ist.
/// </summary>
public sealed partial class PlaceholderPageViewModel(string title, string note)
: PageViewModel(title)
{
public string Note { get; } = note;
}
@@ -37,19 +37,12 @@ public sealed partial class SettingsPageViewModel : PageViewModel
[ObservableProperty]
private int _statusCheckIntervalSeconds = 60;
// ─── Backup ───
[ObservableProperty]
private string _backupDirectory = "";
[ObservableProperty]
private bool _autoBackupEnabled;
[ObservableProperty]
private string _autoBackupTime = "03:00";
[ObservableProperty]
private int _backupKeepCount = 14;
// Die Sicherungs-Einstellungen (Zielordner, Uhrzeit, Anzahl) stehen bewusst
// NICHT hier, sondern allein auf der Sicherungs-Seite. Sie lagen frueher
// doppelt vor: Die Felder waren aus der Ansicht bereits verschwunden, wurden
// aber weiter beim Start gelesen und beim Speichern zurueckgeschrieben - wer
// die Uhrzeit auf der Sicherungs-Seite aenderte und danach hier speicherte,
// bekam den alten Wert zurueck.
// ─── Deploymentcenter ───
[ObservableProperty]
private string _deploymentcenterUrl = "https://dc.mhdf.de";
@@ -123,10 +116,6 @@ public sealed partial class SettingsPageViewModel : PageViewModel
LogRefreshIntervalMs = s.LogRefreshIntervalMs;
OpenRouterBaseUrl = s.OpenRouterBaseUrl;
StatusCheckIntervalSeconds = s.StatusCheckIntervalSeconds;
BackupDirectory = s.BackupDirectory;
AutoBackupEnabled = s.AutoBackupEnabled;
AutoBackupTime = s.AutoBackupTime;
BackupKeepCount = s.BackupKeepCount;
DeploymentcenterUrl = s.DeploymentcenterUrl;
DeploymentcenterToken = s.DeploymentcenterToken;
DeploymentcenterEnvironment = s.DeploymentcenterEnvironment;
@@ -155,10 +144,6 @@ public sealed partial class SettingsPageViewModel : PageViewModel
s.LogRefreshIntervalMs = LogRefreshIntervalMs;
s.OpenRouterBaseUrl = OpenRouterBaseUrl.Trim();
s.StatusCheckIntervalSeconds = StatusCheckIntervalSeconds;
s.BackupDirectory = BackupDirectory.Trim();
s.AutoBackupEnabled = AutoBackupEnabled;
s.AutoBackupTime = AutoBackupTime.Trim();
s.BackupKeepCount = BackupKeepCount;
s.DeploymentcenterUrl = DeploymentcenterUrl.Trim();
s.DeploymentcenterToken = DeploymentcenterToken.Trim();
s.DeploymentcenterEnvironment = DeploymentcenterEnvironment.Trim();
@@ -1,19 +0,0 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:ClawdDotNet.Desktop.ViewModels"
mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="400"
x:Class="ClawdDotNet.Desktop.Views.PlaceholderPageView"
x:DataType="vm:PlaceholderPageViewModel">
<Border Classes="card" Margin="16" VerticalAlignment="Top">
<StackPanel Spacing="6">
<TextBlock Classes="heading" Text="{Binding Title}" />
<TextBlock Classes="caption" Text="{Binding Note}" TextWrapping="Wrap" />
<TextBlock Classes="caption" Margin="0,8,0,0"
Text="Dieser Bereich ist noch nicht portiert." />
</StackPanel>
</Border>
</UserControl>
@@ -1,8 +0,0 @@
using Avalonia.Controls;
namespace ClawdDotNet.Desktop.Views;
public partial class PlaceholderPageView : UserControl
{
public PlaceholderPageView() => InitializeComponent();
}
@@ -11,8 +11,16 @@
<PackageReference Include="Npgsql" Version="10.0.2" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="7.0.1" />
<PackageReference Include="MongoDB.Driver" Version="3.8.1" />
<!-- Kein Aufruf im Code, trotzdem noetig: MongoDB.Driver zieht SharpCompress in
0.30.1 herein, und diese Fassung hat eine bekannte Luecke (NU1902,
GHSA-6c8g-7p36-r338). Der direkte Verweis hebt sie an. Beim Aufraeumen am
2026-08-23 einmal entfernt und sofort wieder eingesetzt: Ohne ihn meldet
die Pruefung auf verwundbare Pakete das alte Paket zurueck.
Snappier stand daneben und ist ersatzlos entfallen: Der Treiber loest es
ohnehin auf dieselbe Fassung 1.3.1 auf, der Verweis hob also nichts an. -->
<PackageReference Include="SharpCompress" Version="0.48.0" />
<PackageReference Include="Snappier" Version="1.3.1" />
</ItemGroup>
<ItemGroup>