Commit Graph
76 Commits
Author SHA1 Message Date
adminandClaude Opus 5.5 bb08bb84a8 Uebersicht: Knoten direkt bearbeiten; Editor als gemeinsamer Baustein (#24)
Build / build (push) Canceled after 0s
- ExpertEditorViewModel/ExpertEditorView aus dem Experte-Bereich ausgelagert (Feldhilfen,
  weitere Parameter, Befehlsvorschau, Sicherung vor der ersten Aenderung)
- In der Uebersicht 'Bearbeiten' fuer Interfaces, IP-Adressen, DHCP-Server und
  Firewall-/NAT-Regeln (nur mit 'Professioneller Netzwerker'); Knoten tragen Menuepfad und
  Erkennungsmerkmale, nach dem Speichern wird die Uebersicht neu geladen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:21:17 +02:00
adminandClaude Opus 5.5 cd0504d9ca Experte-Bereich: kuratierte Menues mit Feldhilfen, Werkzeuge und Pakete (#21, #62-#67)
Build / build (push) Canceled after 0s
- Dritter Bereich 'Experte' in 'Was moechtest du tun?', nur mit 'Professioneller Netzwerker'
- 50 kuratierte RouterOS-Menues mit 219 Feldhilfen, per Skript aus dem Katalog der
  Mac-Version uebersetzt (Expert/menu-catalog.json, eingebettet), plus eigener Menuepfad
- Auflisten/Bearbeiten/Anlegen/Loeschen mit Befehlsvorschau vor jeder Aenderung,
  Sicherung vor der ersten Aenderung; dynamische/Standard-Eintraege und feste Listen ohne
  Loeschen, deaktivierte ausgegraut, Zebra-Liste; Einstellungs-Menues per 'set' ohne ID
- Werkzeuge: Netzwerke isolieren (sperrt sich nicht selbst aus), Neues LAN anlegen
  (nimmt den Port aus der Bridge, Port-Konflikte, Lease-Zeit, Isolation), Port in Bridge
  einfuegen (auch WLAN; raeumt Adresse/DHCP/Pool/Netzwerk/Isolationsregeln), jeweils mit
  Plan vorab, Fortschritt und Abschluss-Uebersicht
- Pakete: Liste vom MikroTik-Server, Vormerken mit Ruecknahme bei Fehler, apply-changes,
  Speicher- und WLAN-Treiber-Warnung, automatisches Wiederverbinden
- Hotspot ohne Paket: verstaendlicher Hinweis statt roher Fehlermeldung
- Demo: Pakete, IDs fuer alle Listeneintraege (wie ein echter Router)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:16:52 +02:00
adminandClaude Opus 5.5 3666cf4ab5 Backups auf den PC laden per SFTP mit Hostkey-Bestaetigung (#8, #9)
Build / build (push) Canceled after 0s
- SSH.NET 2024.2.0 nur fuer SFTP (REST/API haben keinen Datei-Download fuer binaere Dateien)
- KnownHostsStore (TOFU, %AppData%\MikroTik-Installer\known-hosts.json): unbekannter
  Schluessel wird bestaetigt, ein geaenderter nie still akzeptiert (Mac v1.6.0)
- 'Auf PC speichern' im Backup-Bereich, Ziel = Backup-Ordner aus den Einstellungen,
  'Ordner oeffnen'; verstaendliche Meldungen bei deaktiviertem SSH-Dienst/Anmeldefehler
- Testumgebung schreibt eine Platzhalter-Datei

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:07:06 +02:00
adminandClaude Opus 5.5 69d282569c Zusammenfassung: Fortschrittsbalken mit Sicherung als eigenem Schritt und Abschluss-Uebersicht; Ports je Netz (#59, #61)
Build / build (push) Canceled after 0s
- Balken + 'Schritt n von m', Hinweis auf laengere Dauer bei schwacher Hardware,
  Liste der ausgefuehrten Schritte (auch nach einem Fehler sichtbar), Herzschlag pausiert
  waehrend des Anwendens (Mac v1.4.0/v1.3.0)
- VLAN-Zusammenfassung nennt auch bei getaggten Netzen, worueber sie erreichbar sind

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:04:48 +02:00
adminandClaude Opus 5.5 5a4e5b5b1b Assistent: Port-Konflikt-Pruefung 'Port freimachen?' im Heimnetz-Schritt (#60)
Build / build (push) Canceled after 0s
PortConflicts findet eigene IP-Adresse, DHCP-Client und DHCP-Server auf Anschluessen,
die in die Heimnetz-Bridge sollen. Ohne Zustimmung bleibt 'Weiter' gesperrt; mit
Zustimmung werden die Eintraege vor dem Einhaengen entfernt. Deutliche Warnung, wenn
die eigene Verbindung ueber die betroffene Adresse laeuft (Mac v1.0-v1.2, Mac #39).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:03:47 +02:00
adminandClaude Opus 5.5 073e9a6edf Assistent: Lease-Zeit Jahre/Tage/Stunden, vorhandenes LAN vorladen, LAN anlegen-oder-aktualisieren (#57, #58)
Build / build (push) Canceled after 0s
- LeaseTime: RouterOS-Dauern ohne Kuerzung einlesen (Mac-Bug: >1 Woche wurde 7 Tage),
  Eingabe als Jahre/Tage/Stunden in LAN und VLAN (Mac v1.11.0)
- ExistingLanReader: Bridge mit Adresse, Ports, DHCP-Server/Pool, Domain, DNS vom Router;
  der LAN-Schritt startet damit statt mit Standardwerten (Mac v1.3.0)
- LanConfigurator per RouterOsUpsert: vorhandene Bridge/Ports/Adresse/Pool/DHCP-Server/
  Netzwerk werden aktualisiert statt doppelt angelegt (sonst 'already have such name');
  Ports aus anderer Bridge werden umgehaengt, vorhandener DHCP-Server behaelt seinen Namen
- Fix: Domainname ging als 'domain-name' raus, RouterOS erwartet 'domain'
- Demo: /interface/bridge und /ip/dns ergaenzt (portbasierte VLANs brauchen die Bridge)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:02:27 +02:00
adminandClaude Opus 5.5 241f76a688 README: Stand nach Mac-Abgleich Phase 1-5
Build / build (push) Canceled after 0s
Backup & Wartung, Isolation, Einstellungen/Einfuehrung, Testumgebung im Release,
MNDP-Router-Suche, Netzwerk-Werkzeuge, Verbindungs-Robustheit; Roadmap aktualisiert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:58:25 +02:00
adminandClaude Opus 5.5 f71977a411 Geraete-Erkennung: Seriennummer anzeigen, Easter Egg nach 5 Klicks (#56)
Build / build (push) Canceled after 0s
Wie Mac found.md #36: fuenf schnelle Klicks (Pause > 1,5 s setzt zurueck) zeigen
'The Cake is a Lie!'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:57:22 +02:00
adminandClaude Opus 5.5 488a2f0a5d LAN-Scanner: Netzwerk-Werkzeuge je Geraet, Name aus Router-DNS (#23, #55)
Build / build (push) Canceled after 0s
- Ping, Traceroute und DNS-Aufloesung vom Router aus ueber die bestehende API-Verbindung
  (IRouterOsClient.RunAsync, kein SSH), Eingaben per Allow-List abgesichert
- Port-Scan von diesem PC (19 gaengige TCP-Ports, offen/geschlossen/keine Antwort);
  Zeitlimit 3 s, weil Windows ein abgelehntes SYN ~2 s lang wiederholt
- DNS-Aufloesung bevorzugt den Eintrag 'name.domain' in /ip/dns/static (Mac found.md #39.4)
- Geraete ohne Lease-Hostnamen bekommen den Namen aus dem Router-DNS (Mac v1.6.0)
- Demo: Ping/Traceroute/Resolve simuliert

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:56:41 +02:00
adminandClaude Opus 5.5 c40f2bdaf9 Verbinden: Router im Netzwerk finden per MNDP (#53)
Build / build (push) Canceled after 0s
MndpDiscovery (UDP 5678, Broadcast-Anfrage + Antworten 4 s sammeln, TLV-Parser wie
Mac v1.6.0) findet Router ueber die MAC-Adresse, auch ohne passende IP. Treffer
zeigen Name/Modell/IP/MAC; 'IP uebernehmen' fuellt die Adresse, 'MAC kopieren' mit
Hinweis auf WinBox bei Routern ohne IP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:53:33 +02:00
adminandClaude Opus 5.5 36ad3629cf Einfuehrung beim ersten Start; Fix: App startete seit dem Einstellungen-Commit ohne Hauptfenster (#51)
Build / build (push) Canceled after 0s
- IntroWindow: Darstellung, Professioneller Netzwerker, Update-Pruefung, Testumgebung;
  erscheint bis 'Fertig' oder 'Ueberspringen' (Mac v1.4.0), erneut ueber die Einstellungen
- Fix: SystemThemeWatcher.UnWatch warf im MainWindow-Konstruktor ('not yet loaded'),
  die App zeigte nur 'Unerwarteter Fehler' ohne Hauptfenster (seit 2a32034)
- Einfuehrung erst nach ContentRendered, sonst blieb das Hauptfenster unsichtbar
- Startbildschirm laedt die Grafik ausdruecklich aus der App-Assembly

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:51:44 +02:00
adminandClaude Opus 5.5 0a4221ee6e Testumgebung im Release, Start maximiert mit Startbildschirm (#49, #50)
Build / build (push) Canceled after 0s
- Demo-Geraete nicht mehr nur in Debug-Builds: Abschnitt 'Testumgebung' im
  Verbindungs-Schritt, abschaltbar in den Einstellungen (Mac v1.8.0)
- Ein simuliertes Geraet je Host fuer die App-Laufzeit, Aenderungen ueberstehen
  Wiederverbinden (z. B. simulierter Neustart)
- Hauptfenster startet maximiert, Startbildschirm ca. 2,5 s (Mac v1.7.0/v1.8.0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:46:48 +02:00
adminandClaude Opus 5.5 28ad48e519 Backups: Passwort-Verschluesselung, manuelle Sicherung ersetzt 10 Min. die automatische, Gruppierung nach Tag (#45, #46, #47)
Build / build (push) Canceled after 0s
- Mit Backup-Passwort: /system/backup/save mit password + encryption=aes-sha256,
  Dateiname mit '-enc', Schloss in der Liste, Passwort beim Zurueckspielen
- Hinweis bei unverschluesselten Backups (Mac v1.6.0)
- WizardSession.CreateSafetyBackupAsync: eine Handsicherung ersetzt 10 Minuten lang die
  automatische vor Anwenden/Restore/Werksreset (Mac v1.4.0)
- Backup-Liste nach Tag gruppiert (Mac v1.7.0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:45:02 +02:00
adminandClaude Opus 5.5 2a32034b63 Einstellungen-Fenster: Erscheinungsbild, Update-Pruefung, Professioneller Netzwerker, Testumgebung, Backup-Ordner/-Passwort (#48)
Build / build (push) Canceled after 0s
- AppSettings/AppSettingsStore (JSON unter %AppData%), Backup-Passwort im
  Anmeldeinformationsspeicher; Speicherfehler wird angezeigt statt still ignoriert
- Hell/Dunkel/Wie System, System-Watcher nur bei 'Wie System'
- Experten-Modus im Assistenten nur mit 'Professioneller Netzwerker' (Mac v1.3.0)
- Update-Pruefung beim Verbinden abschaltbar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:43:05 +02:00
adminandClaude Opus 5.5 3346129652 Backup & Wartung: Neustart, Firmware-Update, Werksreset, automatisches Wiederverbinden (#43, #44, #28)
Build / build (push) Canceled after 0s
- RouterMaintenanceService: Neustart, RouterBOARD-Firmware (upgrade + Neustart),
  Werksreset (no-defaults=no, skip-backup=no) nach eigener Sicherung
- RouterOsReconnector + WizardSession.ReconnectAsync: Retry alle 5 s mit Zaehler in der
  Sidebar, erst erfolgreich wenn das Geraet auch antwortet (Mac v1.11.1)
- Herzschlag alle 30 s bei aktivem Fenster, pausiert waehrend laengerer Aktionen
- Nach Restore und RouterOS-Update wird automatisch wieder verbunden
- RouterOsException.IsConnectionLost unterscheidet Abbruch von Ablehnung
- Demo: RouterBOARD-Profile mit aelterer Firmware

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:40:49 +02:00
adminandClaude Opus 5.5 de86a29fab Verbinden: Passwort merken, Felder nebeneinander, Link-Status-Punkt (#42, #31, #54)
Build / build (push) Canceled after 0s
- 'Passwort merken' (aus = gespeichertes Passwort wird geloescht), Fehler beim Speichern
  in der Anmeldeinformationsverwaltung wird angezeigt (Mac v1.11.4)
- Benutzername/Passwort nebeneinander, damit 'Verbindung testen' ohne Scrollen sichtbar ist
- Schnittstellenliste mit Punkt gruen/grau fuer den Link-Status (Mac v1.3.0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:22:28 +02:00
adminandClaude Opus 5.5 bd65ffbc3c Verbindung: Zeitlimit je Zugriffsart, binaere API strikt nacheinander, Trap/Done-Fix (#40, #41)
Build / build (push) Canceled after 0s
- RouterOsTimeouts: Lesen 15 s, Schreiben 30 s, Befehle (Backup/Restore/Update) 120 s,
  Verbindungstest 8 s; vorher global 8 s (Fehlalarme auf schwacher Hardware, Mac v1.3/v1.6)
- BinaryRouterOsClient: Zugriffe per SemaphoreSlim serialisiert, nach !trap wird das
  folgende !done mitgelesen (sonst las der naechste Befehl eine fremde Antwort)
- REST-Fehler nennen RouterOS' 'detail'
- IRouterOsClient.RunAsync liefert die Ausgabe eines Befehls (Basis fuer Ping/Traceroute)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:21:40 +02:00
adminandClaude Opus 5.5 49a73ceb2b Isolation: Router-Verwaltung sperren, bestehende Verbindungen kappen, Regeln kommentieren (#37, #38, #39)
Build / build (push) Canceled after 0s
Isolierte VLANs erreichten WebFig/SSH/API des Routers (Mac #41). Neuer Baustein
NetworkIsolation: Forward-Drop in beide Richtungen mit Kommentar, Input nur DNS/DHCP,
Connection-Tracking des isolierten Netzes leeren. DuplicateRuleGuard ignoriert den
Kommentar, damit aeltere Regeln nicht doppelt entstehen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:19:16 +02:00
adminandClaude Opus 5.5 cf53841d0e Plan: Windows-Version auf Stand der Mac-Version v1.11.4 bringen
Build / build (push) Canceled after 0s
Arbeitspakete P1-P41 mit Gitea-Issues (#37-#69, Milestone M-Mac-Abgleich-v1.11),
ohne App-Store-/Verkaufsthemen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:17:48 +02:00
adminandClaude Sonnet 5 09cd5c31fc Session-Handoff: LAN-Scanner, Backup-Verwaltung, Sidebar-Umbau
Build / build (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:48:00 +02:00
adminandClaude Sonnet 5 12ce7bea84 Bekannte Router nicht mehr im Hauptfenster doppeln, nur noch in der Sidebar
Build / build (push) Canceled after 0s
Nutzer-Feedback: Seit dem Sidebar-Umbau gab es "Bekannte Router" doppelt —
als vollständige Bearbeitungsliste im Verbindungs-Schritt (Hauptfenster) und
als Kurzauswahl in der Sidebar. Der Verbindungs-Schritt zeigt jetzt nur noch
das Formular für ein neues, unbekanntes Gerät.

Rückfrage zur Konsequenz: Bearbeiten (Name/Standort) und Entfernen gab es
bisher nur in der jetzt entfernten Liste. Auf Nutzerwunsch zieht "Entfernen"
kompakt in die Sidebar (kleines Papierkorb-Symbol neben jedem Eintrag);
Umbenennen entfällt bewusst — der Name kommt weiterhin automatisch vom
Gerätemodell.

Aufgeräumt: UseSavedRouterCommand (kein eigenes Kommando mehr nötig, nur noch
intern von ConnectToSavedRouterAsync genutzt) und SavedRouterEntry.ToSavedRouter
(war ausschließlich für die jetzt entfernte Bearbeiten-Persistenz da) entfernt.

Core-Suite unverändert grün (138 Tests). Nicht-destruktiver Smoke-Test
bestätigt, dass die Sidebar weiterhin alle bekannten Router korrekt lädt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:37:53 +02:00
adminandClaude Sonnet 5 e3e3c71452 Demo-Zugang: zwei weitere virtuelle Testgeräte für die manuelle UI-Prüfung
Build / build (push) Canceled after 0s
Bisher gab es nur ein einzelnes simuliertes Testgerät (127.127.127.127,
"CHR (Simulator)"). Um Funktionen wie "Bekannte Router" oder den Sidebar-
Umbau mit mehreren, klar unterscheidbaren Einträgen ausprobieren zu können,
ohne echte zweite/dritte Hardware zu brauchen, unterstützt DemoRouterOsClient
jetzt mehrere Profile (DemoDeviceProfile): zusätzlich 127.127.127.128
("Büro-Router", hAP ac2, RouterBOARD) und 127.127.127.129 ("Keller-Switch",
CRS326-24G-2S+, RouterBOARD) — alle mit denselben Zugangsdaten (admin/admin).

Jedes Profil bekommt dynamisch eine zu sich selbst passende Demo-Backup-Datei
in "Backup verwalten" (statt nur das ursprüngliche CHR-Profil). Die simulierte
"/system/routerboard"-Antwort unterscheidet jetzt zwischen "kein RouterBOARD"
(wie beim ursprünglichen CHR-Profil, unverändertes Verhalten) und "echtes
RouterBOARD" (neue Profile, meldet Modell zusätzlich über routerboard.model).

8 neue Unit-Tests, bestehende 132 unverändert grün. Die beiden neuen Router
wurden testweise bereits verbunden und erscheinen jetzt unter "Bekannte
Router" (lokale Datei, unabhängig vom Git-Repository).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:31:50 +02:00
adminandClaude Sonnet 5 3010688b12 Sidebar: dauerhafte Verbindungs-Karte mit Kurzauswahl bekannter Router (#36)
Build / build (push) Canceled after 0s
Nutzer-Wunsch "Optik-Renew": Sidebar zeigt jetzt unabhängig vom aktuellen
Schritt eine Verbindungs-Karte statt nur Logo + Schritt-Liste.

- Nicht verbunden: kompakte Liste bekannter Router (Name + Host/Benutzername),
  ein Klick verbindet direkt und springt bei Erfolg automatisch weiter
  (ConnectionStepViewModel.ConnectToSavedRouterCommand kombiniert
  UseSavedRouter+TestConnectionAsync; MainViewModel.QuickConnectCommand ruft
  das auf und geht bei Erfolg per GoNextCommand weiter).
- Verbunden: grüner Punkt + Gerätename/-modell (MainViewModel.
  ConnectedDeviceLabel — fällt auf den Host zurück, bis die Geräte-Erkennung
  gelaufen ist) + "Wechseln"-Button (trennt Verbindung, setzt session.Device
  zurück, springt zum Verbindungs-Schritt).

Manuelle Formular-Eingabe für neue Geräte bleibt bewusst auf der
Verbindungs-Schritt-Seite — passt nicht kompakt in die schmale Sidebar.

Als eigener Entwurf umgesetzt (kein Referenz-Screenshot vorgegeben), im
bestehenden WPF-UI/Fluent-Stil. WPF-Smoke-Test für ConnectedDeviceLabel-
Übergänge und den Wechseln-Ablauf; QuickConnect selbst per Code-Review
verifiziert (dünner Wrapper um bereits getestete Pfade, im Scratch-Harness
nicht end-to-end testbar wegen internem WindowsCredentialStore-Zugriffs).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:15:53 +02:00
adminandClaude Sonnet 5 cc949b54df Sidebar: Schritt-Übersicht scrollbar machen (#35)
Build / build (push) Canceled after 0s
Nutzer-Feedback: Der letzte Schritt "RouterOS-Update" war in der Sidebar nicht
sichtbar. Ursache: die Schritt-Liste steckte in einem einfachen StackPanel
ohne ScrollViewer — mit inzwischen 13 Schritten (nach Ergänzung von "Was
möchtest du tun?" und "Backup verwalten") überschritten die unteren Einträge
bei kleineren Fensterhöhen den sichtbaren Bereich, ohne dass sich dorthin
scrollen ließ.

Logo-Kopfzeile bleibt fix (Grid-Row Auto), darunter ScrollViewer mit
VerticalScrollBarVisibility=Auto um die Schritt-Liste (Grid-Row *).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:06:19 +02:00
adminandClaude Sonnet 5 0728817fbc Backup: vierstufiger Kompatibilitäts-Abgleich + eigenständiger Bereich (#33, #34)
Build / build (push) Canceled after 0s
#33 — Architektur als dritte Prüfstufe: RouterBackupService bettet zusätzlich
RouterDevice.Architecture in den Backup-Dateinamen ein (Modell_Architektur_
Seriennummer). BackupRestoreService.CheckCompatibility liefert jetzt vier
Stufen statt zwei: Match, SameModelDifferentDevice (gleiches Modell+Architektur,
bekannt andere Seriennummer — gelb markiert, nur mit ausdrücklicher "auf eigene
Gefahr"-Bestätigung wiederherstellbar), Mismatch (anderes Modell/andere
Architektur — weiterhin hart blockiert) und Unknown. Ältere Backups ohne
eingebettete Architektur/Seriennummer fallen weiterhin auf den Modell-Abgleich
zurück.

#34 — Backup-Bereich aus dem Interview gelöst: neuer Schritt "Was möchtest du
tun?" (AreaSelectionStepViewModel) direkt nach der Verbindung, setzt
WizardSession.SelectedArea (AppArea-Enum). Bei "Backup verwalten" überspringen
alle Konfigurations-/Analyse-Schritte per ShouldSkip, direkt zum neuen
BackupManagementStepViewModel — liest das Gerät eigenständig aus (unabhängig
von DeviceOverviewStepViewModel) und bündelt Auflisten/Erstellen/
Wiederherstellen. Die alte "Backup wiederherstellen"-Option in der Moduswahl
sowie WizardSession.IsRestoreBackupMode wurden entfernt (kein Parallel-
Mechanismus zur neuen Navigation) — SummaryStepViewModel ist wieder rein für
die geplanten Assistent-Änderungen zuständig. Der ShouldSkip-basierte Ansatz
deckt sich bewusst mit dem für M-Experte (#21) vorgesehenen Bedarf an
Navigation außerhalb der linearen Schritt-Kette.

17 neue/angepasste Unit-Tests (Core: 132 gesamt), WPF-Smoke-Test über die
komplette MainViewModel-Navigation (Connect → Bereich wählen → Backup
verwalten direkt erreicht, alle vier Kompatibilitäts-Stufen, Rückwärts-
Navigation) sowie Regressionscheck des normalen Assistenten-Pfads.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 20:59:16 +02:00
adminandClaude Sonnet 5 036c02c78f Backup-Wiederherstellen: eigenständigen "Neues Backup erstellen"-Button ergänzen (#27)
Build / build (push) Canceled after 0s
Nutzer-Feedback: bisher gab es nur automatische Backups direkt vor dem Anwenden
bzw. vor einem Restore, aber keine Möglichkeit, unabhängig davon auf Knopfdruck
eine Sicherung anzulegen (z. B. vor eigenen Änderungen direkt in WinBox).

Neuer Button im "Backup wiederherstellen"-Bildschirm ruft denselben
RouterBackupService wie die automatischen Backups auf (inkl. Modell-/
Seriennummer-Einbettung) und lädt die Backup-Liste danach neu, damit die neue
Datei sofort erscheint. DemoRouterOsClient simuliert "/system/backup/save"
jetzt auch tatsächlich als neuen Dateieintrag, damit sich das im Demo-Zugang
end-to-end durchklicken lässt.

Neuer Unit-Test für den Demo-Client, WPF-Smoke-Test für den kompletten
Erstellen-und-sofort-in-der-Liste-sehen-Ablauf.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 20:08:31 +02:00
adminandClaude Sonnet 5 915c2fb91a Backup-Restore: Seriennummer als vorrangige Geräte-Prüfung vor Modell (#27)
Build / build (push) Canceled after 0s
Nutzer-Feedback: reiner Modell-Abgleich ließe ein baugleiches, aber physisch
anderes Gerät (gleiches Modell, andere Seriennummer) fälschlich als passend
durch. RouterBackupService bettet die Seriennummer jetzt zusätzlich zum Modell
in den Dateinamen ein (getrennt per "_", ein Zeichen, das die Sanitisierung nie
erzeugt und die Trennung beim Zurücklesen eindeutig hält).

BackupRestoreService.CheckCompatibility bündelt die Prüf-Priorität (Seriennummer
vor Modell vor "unbekannt") an einer Stelle, die sowohl RestoreAsync zum
Blockieren als auch die neue BackupSelectionItemViewModel zur Anzeige nutzen —
UI und tatsächliche Durchsetzung können so nicht auseinanderlaufen. Modell bleibt
Fallback für ältere Backups ohne eingebettete Seriennummer oder Geräte, die keine
liefern (z. B. virtuelle Testgeräte).

10 neue Unit-Tests, WPF-Smoke-Test für alle vier Kompatibilitäts-Zustände
(exakter Treffer, gleiches Modell/andere Seriennummer, anderes Modell, unbekannt)
sowie Regressionscheck der gesamten Core-Suite (125 Tests).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 20:02:57 +02:00
adminandClaude Sonnet 5 96fe0acd69 Backup-Wiederherstellung mit Modell-Abgleich (M-Backup-Wartung, #27)
Build / build (push) Canceled after 0s
Neue Option "Backup wiederherstellen" im Moduswahl-Schritt (WizardMode-Enum ersetzt
das bisherige reine IsExpertMode-bool-Radiobutton-Paar; EnumToBooleanConverter für
mehr als zwei sich ausschließende Optionen). Überspringt WAN/LAN/VLAN/WLAN/Firewall
per ShouldSkip und zeigt in der Zusammenfassung die auf dem Gerät vorhandenen
.backup-Dateien zur Auswahl statt der geplanten Änderungen.

RouterOS prüft beim Zurückspielen selbst nicht, ob ein Backup zum verbundenen Gerät
passt. Da .backup-Dateiinhalte ohne SFTP (v1.3, noch offen) nicht lesbar sind, macht
RouterBackupService das Gerätemodell stattdessen Teil des Dateinamens (eigene
Backups); BackupRestoreService parst es beim Auflisten zurück und blockiert bei
erkanntem Mismatch ohne Override-Möglichkeit. Unbekannte Backups (z. B. aus WinBox)
brauchen eine explizite Bestätigung per Checkbox. Vor dem Zurückspielen wird wie
beim normalen Anwenden zusätzlich eine Sicherung des aktuellen Zustands erstellt.

11 neue Unit-Tests, WPF-Smoke-Test für alle drei Modell-Zustände sowie
Regressionscheck des normalen (Nicht-Restore-)Modus.

Folge-Issue #32 angelegt: exaktes Verhalten von "/system/backup/load" (Dateiname-
Format, Reboot/Verbindungsabbruch, Passwort-Parameter) gegen echtes Gerät verifizieren.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 19:55:03 +02:00
adminandClaude Sonnet 5 2c2fae73eb LAN-Scanner: Rückgängig-Zustand nach Entfernen der festen Lease erklären
Build / build (push) Canceled after 0s
Nutzer-Feedback: Nach "Feste IP zuweisen" → "Rückgängig machen" wirkte die Zeile wie
kaputt (Button einfach ausgegraut, Status nur "Kein DHCP-Lease"). Technischer Hintergrund
bestätigt: RouterOS kennt kein "wieder dynamisch machen", UndoStaticAsync entfernt den
Lease-Eintrag komplett — das Gerät merkt das aber nicht sofort, sondern hält seine IP
client-seitig, bis es sich neu meldet (Renewal-Timer oder Trennen/Neuverbinden). Die Zeile
zeigt das jetzt explizit ("Feste IP entfernt" + erklärender Hinweistext/Tooltip statt
kommentarlosem Ausgrauen). Zusätzlich: immer sichtbarer "Aktualisieren"-Button, um nach
einem Trennen/Neuverbinden ohne Schritt-Wechsel neu zu scannen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 19:15:15 +02:00
adminandClaude Sonnet 5 84f5ab21db LAN-Scanner: Geräte-Übersicht je Anschluss mit fester IP-Zuweisung (M-Geräte, #22)
Build / build (push) Canceled after 0s
Neuer Wizard-Schritt "Geräte im Netzwerk" nach der IST-Zustand-Analyse: LanScanService
(Core) führt DHCP-Leases, ARP-Tabelle und Bridge-Host-Tabelle per MAC-Adresse zusammen
und gruppiert nach physischem Anschluss (aus der Bridge-Host-Tabelle, nicht aus
ARP/Lease, da deren "interface"-Feld bei gebrückten Setups nur die Bridge zeigt).
Erlaubt, eine DHCP-Lease per Klick fest zuzuweisen (RouterOS "Make Static") oder das
wieder rückgängig zu machen. Rein informativ bis auf diese eine Aktion.

Folge-Issue #30 angelegt: ob RouterOS für "make-static" wirklich ".id" statt "numbers"
erwartet, ist bislang unverifiziert (nur gegen den Demo-Client getestet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 19:03:05 +02:00
adminandClaude Sonnet 5 b7af5175dd Bekannte Router: gespeicherte Verbindungen im Verbindungs-Schritt
Build / build (push) Successful in 37s
Nach erfolgreicher Verbindung wird Host/Benutzername/Modellname lokal
gemerkt (SavedRoutersStore, JSON unter %AppData%), mit editierbarem
Namen und Standort-Feld. Das Passwort liegt separat im Windows-
Anmeldeinformationsspeicher (WindowsCredentialStore, P/Invoke auf
advapi32.dll) statt im Klartext -- bewusst in App statt Core, da Core
plattformneutral bleibt.

Da viele MikroTik-Geraete werksseitig dieselbe Standardadresse nutzen
(192.168.88.1/admin), waere Host+Benutzername allein nicht eindeutig:
RouterDevice liest jetzt zusaetzlich die Seriennummer aus
(/system/routerboard), SavedRoutersStore legt bei Host+Benutzername-
Treffer mit unterschiedlicher Seriennummer einen eigenen Eintrag an
statt den bestehenden zu ueberschreiben. Ansatz 1:1 von der parallel
entwickelten Mac-Version uebernommen (dort M26/M27), vom Nutzer live
bestaetigt.

README zusaetzlich um den auf dem mac-version-merge-Branch liegen
gebliebenen Ablaufplan/M-*-Milestone-Katalog ergaenzt, der bisher nicht
in main uebernommen war, und auf den aktuellen Stand gebracht (v1.2,
CI/CD, M-Bekannte-Router als abgeschlossen markiert).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 21:08:01 +02:00
adminandClaude Sonnet 5 6514eaef86 README: CI/CD-Milestone als abgeschlossen dokumentieren
Build / build (push) Successful in 34s
Selbstgehosteter Windows-Runner registriert und verbunden, Workflow
erfolgreich scharf getestet (Run #26). Neuer Abschnitt erklaert den
User-Modus-Runner ohne Docker und warum kein setup-dotnet-Schritt noetig
ist (fehlende Schreibrechte nach "C:\Program Files\dotnet").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 20:48:35 +02:00
adminandClaude Sonnet 5 e0136f6ef2 CI: setup-dotnet-Schritt entfernen (fehlende Schreibrechte im User-Modus)
Build / build (push) Successful in 36s
Der selbstgehostete Runner laeuft bewusst im User-Modus (kein Admin).
actions/setup-dotnet@v4 versucht aber, eine eigene SDK-Kopie nach
"C:\Program Files\dotnet" zu installieren, wofuer die Schreibrechte
fehlen -- erster Testlauf (#25) ist deshalb dort fehlgeschlagen. Das
.NET 8 SDK ist auf dem Runner-Rechner ohnehin schon installiert, der
Schritt war nur fuer gehostete/leere Runner noetig.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 20:47:05 +02:00
adminandClaude Sonnet 5 9860e16bb0 CI: runs-on auf selbstgehosteten Windows-Runner umgestellt
Build / build (push) Failing after 15s
Runner "danielpc-windows" (host-Modus, kein Docker) auf diesem Windows-
Rechner registriert und mit dem Repo verbunden (Issue #10). Label von
ubuntu-latest auf windows-latest umgestellt, damit der Workflow ihn
tatsaechlich trifft (Issue #11) -- passt ausserdem besser zum Windows-
exe-Build-Ziel als ein Linux-Runner.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 20:45:30 +02:00
adminandClaude Sonnet 5 8cc8f1cbb3 Live-Eingabevalidierung (v1.2) + Firewall/NAT-Idempotenz-Fix (#19)
Build / build (push) Canceled after 0s
Echte Formatpruefung (IP/CIDR/Praefix/Adressbereiche/Portbereiche) statt
reiner Nicht-leer-Pruefung in WAN, LAN, VLAN und Firewall, mit sofortiger
roter Fehlermeldung je Feld/Zeile statt stillem Blockieren von "Weiter".
Neuer NetworkValidation-Baustein in Core (24 Tests). Behebt nebenbei einen
echten Absturzpfad: LanConfigurator/VlanConfigurator riefen IPAddress.Parse
bisher ungeprueft bei jedem Tastendruck auf.

Zusaetzlich Issue #19 behoben: Firewall-/NAT-Regeln ohne eindeutiges
Identitaetsfeld duplizierten sich bei wiederholtem Wizard-Lauf gegen
dasselbe Geraet. Neuer DuplicateRuleGuard-Baustein holt den Ist-Zustand
einmal pro Wizard-Lauf (nicht pro Regel, um Selbst-Kollisionen innerhalb
desselben Laufs zu vermeiden) und ueberspringt bereits vorhandene Regeln.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 20:38:54 +02:00
adminandClaude Sonnet 5 5761f2737d VLAN: Anschlüsse portbasiert (untagged) zuordnen
Build / build (push) Canceled after 0s
Im Experten-Modus lässt sich jedes VLAN wahlweise fest einem oder
mehreren Anschlüssen zuordnen, statt nur über einen VLAN-fähigen
Switch/Access Point (getaggt) erreichbar zu sein. Aktiviert dafür
Bridge-VLAN-Filterung erst als letzten Schritt (nachdem alle PVID-
und Bridge-VLAN-Tabellen-Einträge stehen), um keine Verbindung
während der Einrichtung zu kappen, und schützt die zugeordneten
Anschlüsse per frame-types/ingress-filtering vor VLAN-Hopping.
Ein Anschluss kann nur einem Netzwerk zugeordnet sein; Konflikte
blockieren "Weiter" mit einer Fehlermeldung statt die Auswahl
stillschweigend zu ändern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 06:35:05 +02:00
adminandClaude Sonnet 5 549f4a90cb Session-Handoff: Experten-Modus & IST-Zustand-Analyse
Build / build (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:44:50 +02:00
adminandClaude Sonnet 5 3c68f06a78 README: Milestone "IST-Zustand-Analyse" als abgeschlossen markieren
Build / build (push) Canceled after 0s
Kernfunktion ist umgesetzt und vom Nutzer beim Live-Test bestaetigt.
Roadmap-Tabelle um Status-Spalte erweitert; offen bleiben optisches
Feintuning und die Route-zu-Interface-Verifizierung gegen ein echtes
Geraet. Zugehoerige Gitea-Issues #12-#16 geschlossen, neues Issue #18 fuer
das offene Feintuning angelegt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:41:36 +02:00
adminandClaude Sonnet 5 78d26061c6 README: Spalten-Layout (links nach rechts) statt Bänder dokumentieren
Build / build (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:39:06 +02:00
adminandClaude Sonnet 5 c05f7986d7 Kategorien-Layout von untereinander auf nebeneinander umgestellt
Build / build (push) Canceled after 0s
Kategorien (Internet / Netzwerk-Schnittstellen / IP-Adressen / DHCP-Server
/ Firewall-Regeln) sind jetzt Spalten von links nach rechts statt Baendern
untereinander - auf Nutzer-Feedback nach dem Live-Test. Jede Spalte
stapelt ihre Knoten vertikal, sortiert nach Baum-Tiefe/Eltern-Knoten,
damit zusammengehoerige Knoten (z.B. eine Bridge und ihre Ports) nahe
beieinander stehen.

Per headless-Harness verifiziert: fuenf saubere Spalten (X=0/280/560/
840/1120), keine Ueberlappungen. Regulaerer Build/Test/Smoke-Test gruen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:38:49 +02:00
adminandClaude Sonnet 5 42d30873f9 Fix: Absturz ohne Fehlermeldung beim Wechsel zu "Vorhandene Netzwerke"
Build / build (push) Canceled after 0s
Ursache gefunden per headless-Reproduktion (WPF-Layout ausserhalb des
sichtbaren Fensters angestossen, da keine Klick-Automatisierung fuer
native Fenster verfuegbar ist): TopologyBandHeaderViewModel.Location war
eine rein schreibgeschuetzte Property. Nodifys ItemContainer.Location ist
aber standardmaessig TwoWay gebunden (damit Drag&Drop den Knoten
zurueckschreiben kann) - beim ersten Layout-Durchlauf warf das eine
InvalidOperationException auf dem UI-Thread, die mangels
DispatcherUnhandledException-Handler den Prozess sofort und ohne jede
Meldung beendete.

Fix: Location bekommt einen (ungenutzten) Setter. Zusaetzlich als
Sicherheitsnetz einen globalen DispatcherUnhandledException-Handler
ergaenzt, der kuenftige unerwartete Fehler als Meldung anzeigt statt den
Prozess stumm zu beenden.

Verifiziert per Konsolen-Harness (WPF-Layout ohne sichtbares Fenster):
View-Konstruktion, Layout-Durchlauf und simulierter Knoten-Klick laufen
jetzt fehlerfrei durch. Ausserdem regulaerer Build/Test/Smoke-Test grün.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:33:57 +02:00
adminandClaude Sonnet 5 6eabd5e100 README: Kategorien-Layout und Firewall-Regeln in IST-Zustand-Analyse dokumentieren
Build / build (push) Canceled after 0s
Aktualisiert die Beschreibung des dritten Wizard-Schritts, das Architektur-
Flowdiagramm (neue RouterOS-Endpunkte, Band-Layout, Teilbaum-Hervorhebung
statt reiner Pfad-Hervorhebung) auf den aktuellen Code-Stand.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:27:29 +02:00
adminandClaude Sonnet 5 49b17623ab IST-Zustand-Analyse: Firewall-Regeln, Kategorien-Layout, Highlight-Fix
Build / build (push) Canceled after 0s
Auf Nutzer-Feedback aus dem Live-Test:

- Klick auf einen zentralen Knoten (z.B. WAN oder eine Bridge) hob bisher
  nur den Weg nach oben zum Internet-Knoten hervor. Jetzt wird der
  komplette verbundene Teilbaum hervorgehoben (Vorfahren UND Nachfahren) -
  ein Klick auf eine Bridge zeigt jetzt wirklich alle angeschlossenen
  Geraete/Netzwerke.
- Layout war zu eng, Kasten-Inhalte abgeschnitten: Knoten verbreitert
  (180->220px), mehr Zeilen-/Spaltenabstand, Label-Text umbricht jetzt
  statt mit "..." abgeschnitten zu werden.
- Grafik nach Kategorien gruppiert (Internet / Netzwerk-Schnittstellen /
  IP-Adressen / DHCP-Server / Firewall-Regeln) mit Beschriftung je Band,
  statt eines reinen Tiefen-Layouts. Kategorie-Label sind eigene, nicht
  anklickbare Eintraege im selben Nodify-Item-Raum wie die Knoten, damit
  sie beim Pan/Zoom exakt mitwandern statt als Overlay zu driften.
- Neu: Firewall-/NAT-Regeln, die an eine konkrete IP gebunden sind
  (Portfreigaben ueber /ip/firewall/nat, Filter-Regeln mit dst-/
  src-address), werden als eigene Knoten unter der IP-Adresse eingehaengt,
  deren Subnetz die gebundene Adresse enthaelt. Allgemeine, nicht
  adressgebundene Basisregeln (z.B. "drop new from WAN") bleiben bewusst
  aussen vor, sonst waere die Grafik von Standard-Boilerplate ueberflutet.

2 neue Core-Tests fuer die Firewall-Zuordnung (56 insgesamt, alle gruen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:26:49 +02:00
adminandClaude Sonnet 5 669e653cf4 README: IST-Zustand-Analyse dokumentieren
Build / build (push) Canceled after 0s
Schritt-Liste um "Vorhandene Netzwerke" erweitert (jetzt 11 Schritte),
neuen Abschnitt zur Funktion ergänzt, Architektur-Diagramm um den neuen
Schritt und ein Nodify/NetworkAnalysisService-Flowdiagramm erweitert,
Nodify in "Verwendete Bibliotheken" aufgenommen und die Roadmap-Tabelle
um den neuen Milestone ergänzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:47:19 +02:00
adminandClaude Sonnet 5 6b90a4d836 IST-Zustand-Analyse: bestehende Netzwerke auf Bestandsgeräten visualisieren
Build / build (push) Canceled after 0s
Neuer Wizard-Schritt "Vorhandene Netzwerke" direkt nach der Geräte-
Erkennung. Liest per NetworkAnalysisService (Core) aus, welche Bridges,
VLANs, IP-Adressen, DHCP-Server, Routen und WLANs auf dem Gerät bereits
existieren, und stellt sie als anklickbare Grafik dar (Nodify). Klick auf
einen Knoten hebt die Eltern-Kette bis zum synthetischen "Internet"-Knoten
hervor (Hops/Pfad). Rein informativ, verändert nichts am Gerät und fließt
nicht in die vom Assistenten geplante Soll-Konfiguration ein.

Core liefert reine Fakten (Records in Analysis/), die App-Schicht baut
daraus Knoten/Kanten mit deterministischem Spalten-Layout. Jeder RouterOS-
Endpunkt ist einzeln fehlertolerant (fehlendes Paket, z.B. kein WLAN,
bricht die Analyse nicht ab). Route-zu-Interface-Zuordnung ist best-effort
(gateway-status-Format ist RouterOS-versionsabhängig) — als bekannte
Einschränkung dokumentiert.

Ursprünglich geplant war, den Schritt bei werksneuen Geräten per
ShouldSkip automatisch zu überspringen. Das erwies sich als architektonisch
nicht möglich: die Wizard-Navigation prüft ShouldSkip, bevor
OnActivatedAsync für den Zielschritt läuft, das Analyse-Ergebnis steht zu
dem Zeitpunkt also noch nicht fest. Stattdessen zeigt der Schritt bei
leerem Ergebnis einen kurzen Hinweistext statt einer leeren Grafik.

Demo-Client um Beispieldaten erweitert, damit sich der Schritt über den
Testzugang (127.127.127.127) durchklicken lässt. 9 neue Core-Tests für
NetworkAnalysisService (54 insgesamt, alle grün).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:46:18 +02:00
adminandClaude Sonnet 5 1de73d6693 README: Experten-Modus dokumentieren
Build / build (push) Canceled after 0s
Schritt-Liste um "Modus wählen" erweitert (jetzt 10 Schritte), neuen
Abschnitt mit den Experten-Feldern je Bereich ergänzt, sowie Architektur-
und Datenstruktur-Diagramme (WizardSession.IsExpertMode, erweiterte
Settings-Records, WirelessSecurityMode) auf den aktuellen Code-Stand
gebracht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:15:16 +02:00
adminandClaude Sonnet 5 e58480d2ae Experten-Modus hinzufügen: erweiterte RouterOS-Optionen in WAN/LAN/VLAN/WLAN/Firewall
Build / build (push) Canceled after 0s
Neuer Wizard-Schritt "Modus wählen" nach der Geräte-Erkennung, mit dem
zwischen dem geführten Assistenten und einem Experten-Modus gewählt werden
kann. Im Experten-Modus zeigen die bestehenden Schritte zusätzliche,
technischere Felder (DHCP-Feinsteuerung, MTU, WPA3, Portbereiche,
IP-Sperrlisten, VLAN-Isolation u.a.), die im Laien-Modus verborgen bleiben.
Alle neuen Settings-Felder sind optional mit Defaults, die das bisherige
Verhalten unverändert lassen (45 Tests grün, 7 davon neu für die
Experten-Felder).

Zusätzlich zwei beim Live-Testen gefundene Bugs behoben: der letzte Schritt
zeigte einen dauerhaft ausgegrauten "Weiter"-Button statt eines
"Beenden"-Buttons, und die Texte im neuen Moduswahl-Schritt wurden
abgeschnitten (horizontales StackPanel gab TextBlocks unbegrenzte Breite
zum Messen, dadurch griff TextWrapping nicht — behoben durch Grid mit
fester Spaltenbreite).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:14:04 +02:00
adminandClaude Sonnet 5 831f610753 Session-Handoff: Lizenz, Markenrechte und GitHub-Release-Workflow
Build / build (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 19:38:13 +02:00
adminandClaude Sonnet 5 4e80998135 VirusTotal-Badge in README ergänzen
Build / build (push) Canceled after 0s
Statisches Badge (kein Live-Wert, VirusTotal bietet dafür keine
Badge-API) neben dem MIT-Badge, verlinkt auf die Releases-Seite, wo bei
jedem Release der aktuelle Scan-Link in den Notizen steht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 13:26:43 +02:00
adminandClaude Sonnet 5 0a8f8b3f9b Test-Projekt auf net8.0-windows umstellen, CA1416-Warnungen beheben
Build / build (push) Canceled after 0s
SummaryPdfExporter.Export ist [SupportedOSPlatform("windows")], aber das
Test-Projekt zielte auf net8.0 (ohne OS-Angabe). Der Plattform-Analyzer
kannte den Windows-Kontext dadurch nicht und meldete an jeder Aufrufstelle
in SummaryPdfExporterTests.cs eine CA1416-Warnung - so in den Annotationen
des ersten GitHub-Actions-Laufs aufgefallen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 13:24:33 +02:00