Commit Graph
60 Commits
Author SHA1 Message Date
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
adminandClaude Sonnet 5 c8558e7724 GitHub-Release bei erneutem Lauf sauber neu erstellen statt aktualisieren
Build / build (push) Canceled after 0s
append_body kollidierte mit generate_release_notes bei einem bereits
bestehenden Release unter demselben Tag: die automatisch generierten
Notizen überschrieben unseren VirusTotal-Link vollständig. Ein evtl.
vorhandenes Release wird jetzt vor dem Erstellen entfernt, damit der
dokumentierte "body wird den Auto-Notizen vorangestellt"-Fall greift.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 13:15:56 +02:00
adminandClaude Sonnet 5 2c72f8d9ac VirusTotal-Scan-Link manuell in Release-Notizen einfügen
Build / build (push) Canceled after 0s
update_release_body der crazy-max/ghaction-virustotal-Action griff nicht,
da sie nur reagiert, wenn der Workflow selbst durch das Event
"release: published" ausgelöst wurde - hier läuft er aber bei einem
Tag-Push, und das Release wird im selben Lauf erst danach erzeugt.
Scannt jetzt zuerst, extrahiert den Analyse-Link aus der Action-Ausgabe
und übergibt ihn als body an softprops/action-gh-release.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 13:12:07 +02:00
adminandClaude Sonnet 5 96ffdb0b24 CI-Tests in Debug statt Release ausführen
Build / build (push) Canceled after 0s
Der Demo-Verbindungszugang (127.127.127.127), den ein Test nutzt, ist per
#if DEBUG nur in Debug-Builds vorhanden. Mit --configuration Release lief
der Test stattdessen in einen echten (nie erfolgreichen) Verbindungsversuch
und Timeout - so im ersten GitHub-Actions-Release-Lauf aufgefallen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 13:08:16 +02:00
adminandClaude Sonnet 5 47d89a8ab9 MIT-Lizenz, Markenrechts-Hinweis und GitHub-Actions-Release-Workflow ergänzen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-12 12:58:37 +02:00
adminandClaude Sonnet 5 869fb51e25 Session-Handoff für die Fortsetzung in künftigen Sitzungen
Build / build (push) Canceled after 0s
Hält den aktuellen Stand nach Abschluss aller 8 geplanten Phasen fest:
Entscheidungen mit Begründung, Code-Struktur, bekannte Stolperfallen
und offene Punkte — allen voran ein noch unbestätigter kompletter
Durchlauf inkl. "Jetzt einrichten" gegen ein echtes Gerät.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 22:22:31 +02:00
adminandClaude Sonnet 5 9af83394f4 App-Icon und README.md
Build / build (push) Canceled after 0s
Eigenes, neutrales Netzwerk-Symbol (Mittelknoten mit vier Satelliten,
MikroTik-Grün) als app.ico — programmatisch erzeugt, bewusst kein
MikroTik-Logo, um keine Markenrechte zu verletzen. Als Resource statt
Content eingebunden, damit es beim Single-File-Publish mit in der exe
landet statt als separate Datei danebenzuliegen. Eingebunden als:
- ApplicationIcon (Datei-Icon in Explorer/Taskleiste/Alt-Tab)
- Window.Icon
- WPF-UI-TitleBar-Icon (Titelleiste)
- Sidebar-Branding (ersetzt den bisherigen grünen Punkt)

README.md für Gitea: was der Assistent einrichtet, Screenshot,
Hinweise für Nutzer (portabel, keine Installation) und Entwickler
(Bauen/Testen, Release-Build, interner Testzugang, Projektstruktur,
verwendete Bibliotheken).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 22:12:31 +02:00
adminandClaude Sonnet 5 761d4012c9 Nur deutsche/englische Sprachpakete in den Release-Build aufnehmen
Build / build (push) Canceled after 0s
SatelliteResourceLanguages=de;en beschränkt die mitgelieferten
Sprachpakete der .NET-Laufzeit und Abhängigkeiten (übersetzte
Systemmeldungen, nicht unsere eigenen UI-Texte — die App hat ohnehin
nur deutsche Texte) auf Deutsch/Englisch. Vorher wurden ~20 weitere
Sprachordner (ja, ru, zh-Hans, ...) ungenutzt mitgeschleppt.

Ungepackt: 170 MB -> 155 MB. Komprimierte Single-File-exe: 71,7 MB ->
67 MB. Reines Build-Einstellungs-Flag ohne Code- oder Trimming-Risiko
(im Gegensatz zu PublishTrimmed, das bei WPF-Apps wegen der starken
Reflection-Nutzung unzuverlässig sein kann und deshalb bewusst nicht
aktiviert wurde).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 22:06:21 +02:00
adminandClaude Sonnet 5 4f19a22f08 Lokales Build-Skript als Alternative zu Gitea Actions
Build / build (push) Canceled after 0s
Kein Runner auf der Gitea-Instanz konfiguriert — build-release.ps1
kapselt den dotnet-publish-Befehl aus dem letzten Commit als
Ein-Zeiler-Aufruf (.\build-release.ps1), meldet Erfolg/Misserfolg und
zeigt Pfad + Größe der fertigen exe. Der Gitea-Actions-Workflow bleibt
bestehen, falls später doch ein Runner eingerichtet wird.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 22:00:23 +02:00
adminandClaude Sonnet 5 6a816b1dc6 Gitea-Actions-Workflow für automatisierte Windows-Builds
Build / build (push) Canceled after 0s
Baut bei jedem Push auf main (und manuell auslösbar) automatisch:
Tests ausführen, dann die self-contained Single-File-exe für win-x64
veröffentlichen und als Build-Artefakt bereitstellen.

runs-on: ubuntu-latest, da der vorhandene Runner Linux-basiert ist —
das self-contained Publishing für win-x64 funktioniert dank der
plattformunabhängig über NuGet beziehbaren Windows-Desktop-
Referenz-/Runtime-Pakete auch von einem Linux-Build-Host aus
(offizieller .NET-Anwendungsfall für genau solche CI-Pipelines),
auch wenn die exe dort natürlich nicht ausgeführt werden kann.

Runner-Label ist als Platzhalter zu verstehen — falls der eigene
Runner unter einem anderen Namen registriert ist, muss "runs-on"
entsprechend angepasst werden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:57:08 +02:00
adminandClaude Sonnet 5 4c247582e9 Distribution: eigenständige Single-File-.exe für Windows
MikrotikInstaller.App.csproj bekommt Produkt-Metadaten (Name, Version,
Beschreibung) und Publish-Vorgaben, die greifen, sobald ein
RuntimeIdentifier angegeben wird: self-contained (keine separate
.NET-Installation beim Nutzer nötig), eine einzelne komprimierte .exe
statt eines Ordners voller DLLs, Debug-Symbole eingebettet statt als
separate .pdb-Datei daneben (MikrotikInstaller.Core.csproj ebenso).
Ausgabename umbenannt auf "MikroTik-Installer.exe".

Build/Test:
  dotnet publish src/MikrotikInstaller.App/MikrotikInstaller.App.csproj -c Release -r win-x64

Ergebnis: eine einzelne ~72-MB-exe unter
src/MikrotikInstaller.App/bin/Release/net8.0-windows/win-x64/publish/
— läuft eigenständig ohne Installation, verifiziert per UI-Automation
(App startet, komplette Sidebar/Navigation funktioniert). Der
Debug-Simulator-Zugang (127.127.127.127/admin/admin) ist im
Release-Build wie vorgesehen nicht erreichbar (#if DEBUG greift).

Ein fertiger Installer (Inno Setup) bleibt bewusst eine spätere
Ausbaustufe — die portable Einzeldatei ist der MVP-Verteilweg.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:51:30 +02:00
adminandClaude Sonnet 5 b9f632fb16 Fix: WLAN-Schritt ließ sich nicht überspringen, wenn WLAN nur deaktiviert war
ShouldSkip übersprang den WLAN-Schritt bisher nur bei Geräten ganz
ohne WLAN-Hardware. Ein Gerät mit vorhandener, aber deaktivierter
WLAN-Schnittstelle (z. B. weil es hier rein als Switch dient) hat
zu Recht "WLAN-fähig" gemeldet — der Schritt blieb aber Pflicht und
verlangte SSID/Passwort, obwohl der Nutzer gar kein WLAN einrichten
wollte.

Neue Checkbox "Kein WLAN einrichten" macht den Schritt explizit
überspringbar: aktiviert, wird "Weiter" ohne SSID/Passwort freigegeben,
die übrigen Felder werden deaktiviert, und es werden keine
WLAN-Änderungen in die Zusammenfassung/Anwendung übernommen.

Neuer InverseBooleanConverter für die IsEnabled-Bindung (die bisherige
Idee, den Visibility-Konverter dafür zu missbrauchen, wäre ein
Typfehler gewesen — Visibility lässt sich nicht in bool/double
konvertieren).

Per UI-Automation verifiziert: Checkbox aktiviert, Felder werden
deaktiviert, "Weiter" wird ohne Eingaben aktiv.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:47:20 +02:00
adminandClaude Sonnet 5 f12e46dceb Neuer optionaler Schritt 9: RouterOS-Update prüfen und starten
RouterOsUpdateService nutzt RouterOS' eigene Update-Funktion
(/system/package/update/check-for-updates + /print), inklusive Polling
bis der Status nicht mehr "Checking..." ist. Schlägt die Prüfung fehl
(z. B. weil das Gerät noch keinen Internetzugang hat), wird das als
"nicht geprüft werden konnte" behandelt statt als Fehler.

Zeitlicher Ablauf wie gewünscht: Die Prüfung wird zuerst im Hintergrund
in der Geräte-Erkennung versucht (Schritt 2) — funktioniert nur, wenn
das Gerät zu diesem Zeitpunkt schon Internetzugang hat. Nach
erfolgreichem Anwenden (Schritt 8, wenn WAN eingerichtet wurde) wird
sie automatisch wiederholt. Beide Läufe blockieren die Navigation
nicht (Fire-and-forget im Hintergrund).

Neuer Schritt 9 "RouterOS-Update" zeigt das Ergebnis: nicht geprüft
werden konnte (mit "Erneut prüfen"), bereits aktuell, oder eine neuere
Version verfügbar — dann mit deutlicher Warnung vor dem automatischen
Neustart und einer Pflicht-Checkbox, bevor "Jetzt aktualisieren"
aktiv wird. Komplett optional, keine Pflicht zum Abschluss des
Assistenten.

Zusammenfassungs-Schritt lässt "Weiter" jetzt erst nach erfolgreichem
Anwenden zu (vorher automatisch gesperrt, weil er der letzte Schritt
war — das ist er jetzt nicht mehr).

Simulator-Zugang liefert jetzt eine simulierte verfügbare Version
(7.15.2 → 7.16.1), damit sich auch dieser Schritt gefahrlos
durchspielen lässt.

Per UI-Automation den kompletten Assistenten durchgeklickt: "nicht
geprüft werden konnte"-Zustand (echtes Simulator-Verhalten ohne
Update-Endpunkte) und "Update verfügbar"-Zustand beide verifiziert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:39:05 +02:00
adminandClaude Sonnet 5 4e403d60f3 Fix: Tooltip-Texte blieben leer
ToolTip-Inhalte hängen nicht im normalen visuellen Baum der Seite,
sondern werden erst beim Anzeigen separat verbunden — eine direkte
ElementName-Bindung im ToolTip-Inhalt (wie zuvor verwendet) läuft
daher ins Leere und bleibt leer, ohne einen Fehler zu werfen.

Fix nach dem dafür vorgesehenen WPF-Muster: Der Text wird als Tag auf
das sichtbare SymbolIcon gebunden (das steht im normalen Baum, dort
funktioniert ElementName), der ToolTip-Inhalt liest ihn anschließend
über PlacementTarget.Tag zurück.

Per UI-Automation mit echter, schrittweiser Mausbewegung verifiziert:
Tooltip zeigt jetzt den vollständigen, umbrochenen Erklärtext an.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:22:46 +02:00
adminandClaude Sonnet 5 4a9aec7634 Laientaugliche Tooltips für alle Fachbegriffe im Interview
Neues wiederverwendbares Steuerelement InfoHint: ein kleines
"?"-Symbol, das per Hover eine kurze, einfache Erklärung zeigt —
ohne die Formulare optisch zu überladen (nur bei tatsächlich
erklärungsbedürftigen Begriffen, nicht bei Selbstverständlichem wie
"Benutzername" oder "Passwort").

Fachbegriffe jetzt erklärt in allen Schritten:
- Verbindung: IP-Adresse/Hostname, verschlüsselte Verbindung
- Geräte-Erkennung: RouterOS, Architektur, Netzwerkschnittstellen
- Internet-Zugang: Schnittstelle, DHCP, Präfix, Gateway
- Heimnetzwerk: Bridge/interner Name, Router-Adresse, Präfix,
  Adressbereich, DNS-Server
- VLANs: VLAN-ID, Router-Adresse
- WLAN: Schnittstelle, SSID
- Firewall: Portfreigabe, Protokoll, Port von außen/am Gerät

Per UI-Automation den kompletten Assistenten erneut durchgeklickt:
alle Schritte rendern weiterhin korrekt, Info-Symbole erscheinen an
den richtigen Stellen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:16:29 +02:00
adminandClaude Sonnet 5 de71671b55 PDF-Export der Zusammenfassung inkl. WLAN-QR-Code
SummaryPdfExporter (PdfSharp, MIT-lizenziert) druckt die Einrichtung
als einseitiges PDF: Internet-Zugang, Heimnetzwerk, VLANs und Firewall
mit den konkreten technischen Daten (IP-Bereiche, Anschlüsse, DNS) in
der linken Spalte, WLAN-Name und -Passwort groß hervorgehoben in der
rechten Spalte — zum Aufbewahren/Ausdrucken, nicht zum vereinfachten
Vorlesen wie die Bildschirm-Zusammenfassung.

Nice-to-have umgesetzt: WifiQrCodeGenerator (QRCoder, MIT-lizenziert)
erzeugt einen QR-Code im Standard-WIFI:-Format, den Handys direkt als
"WLAN beitreten" erkennen. QR-Erzeugung schlägt niemals das gesamte
PDF fehl — bei Problemen (z. B. Sonderzeichen) wird sie einfach
ausgelassen.

Zwei PdfSharp-6-Besonderheiten gelöst:
- Schriftauflösung: PDFsharp 6 löst Schriften nicht mehr automatisch
  über GDI auf. WindowsSegoeUiFontResolver liest Segoe UI direkt aus
  dem Windows-Schriftartenordner (keine Schriftdatei wird mitgeliefert
  — Microsoft-Lizenz).
- Von QRCoder erzeugte PNGs wurden von PDFsharps PNG-Decoder abgelehnt;
  über GDI+ (ohnehin transitive Abhängigkeit von QRCoder) nach BMP
  normalisiert, das zuverlässig gelesen wird.

Neuer "Als PDF speichern"-Button im Zusammenfassungs-Schritt (vor und
nach dem Anwenden verfügbar) öffnet einen Speichern-Dialog und zeigt
Erfolg/Fehler direkt im Assistenten an.

Per UI-Automation und Sichtprüfung des erzeugten PDFs verifiziert:
korrektes einseitiges Layout, lesbarer QR-Code, alle Daten vorhanden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 21:08:29 +02:00
adminandClaude Sonnet 5 feafba2274 Laientaugliche, gruppierte Zusammenfassung statt technischer Befehlsliste
Die Zusammenfassung zeigte bisher jede einzelne RouterOS-Aktion als
flache Liste (z. B. "IP-Adressbereich 192.168.88.10-192.168.88.254
für Geräte in deinem Netzwerk reservieren", "DHCP-Server auf
„bridge-lan" aktivieren, ...) — für Laien kaum verständlich und rein
technisch sortiert.

Jeder Configurator (Wan/Lan/Vlan/Wireless/Firewall) bekommt jetzt
zusätzlich BuildFriendlySummary(...): 1-2 kurze, verständliche Sätze
ohne RouterOS-Fachbegriffe, getrennt von den technischen
ConfigurationAction-Beschreibungen (die weiterhin als Fortschrittstext
beim tatsächlichen Anwenden dienen).

WizardSession hält jetzt zusätzlich die rohen Einstellungsobjekte
jedes Schritts (WanSettings, LanSettings, VlanDefinitions,
WirelessSettings, FirewallSettings), damit der Zusammenfassungs-Schritt
daraus bauen kann, was tatsächlich passiert ist — nicht wie.

Die Zusammenfassung zeigt jetzt pro Themenbereich eine eigene Karte
(Internet-Zugang, Heimnetzwerk, optional VLANs, optional WLAN,
Firewall) mit Symbol, Titel und kurzen Stichpunkten; leere Bereiche
(z. B. keine VLANs eingerichtet) werden gar nicht erst angezeigt.

Unit-Tests prüfen u. a., dass die Klartext-Sätze keine RouterOS-Begriffe
wie "NAT" enthalten und dass das WLAN-Passwort nicht in der Anzeige
landet.

Per UI-Automation verifiziert: vier klar getrennte, grün akzentuierte
Karten mit verständlichen Stichpunkten statt einer technischen Liste.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 20:56:12 +02:00