102 Commits
Author SHA1 Message Date
KayandClaude Sonnet 5 bad6328c8f Release v1.1.0
SemVer Minor - seit v1.0.0: Firewall-Isolation-Connection-Flush
(neue Fähigkeit, bugs.md #7), 3 Alert-Dismiss-Bugfixes (M34),
wizard_flow-Diagramm-Korrektur, 20 Gitea-Issues für alle bisherigen
Funde. Build + alle 103 Unit-Tests grün.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
v1.1.0
2026-09-17 21:35:29 +02:00
KayandClaude Sonnet 5 dcb9d9e03c bugs.md #7: Isolation kappt jetzt auch bereits bestehende Verbindungen
Bisher wirkten die neuen Firewall-Isolationsregeln nur auf neue
Verbindungen - eine bereits offene Verbindung zwischen zwei gerade
isolierten Netzen lief unbeeinflusst weiter (Standard-Verhalten jeder
stateful Firewall). Neue SSHTransport.flushConnections/
ConnectionService.flushConnections entfernen per /ip firewall
connection remove [find where (src-address in A) and (dst-address in
B)] bereits getrackte Verbindungen zwischen isolierten Netzpaaren,
aufgerufen direkt nach den Firewall-Befehlen in SetupViewModel.apply().

FirewallConfig.NetworkSegment um networkAddress (CIDR) erweitert,
Paar-Logik in eine wiederverwendbare isolatedNetworkPairs-Property
extrahiert. networkA/networkB werden vor der SSH-Interpolation als
reine CIDR-Notation validiert (dieselbe Vorsicht wie bei der zuvor
gefixten CLI-Injection).

Ehrlicher Verifikationsstand dokumentiert statt Überclaiming: die
kombinierte remove-Bedingung ließ sich mangels zweier echter
Testnetze nicht end-to-end beweisen - ein erster scheinbarer Erfolg
stellte sich als Messfehler heraus (natürlicher ICMP-Conntrack-Timeout,
nicht der remove-Befehl selbst). Details in bugs.md #7.

Build + alle 103 Unit-Tests grün (1 neuer Regressionstest).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:30:51 +02:00
KayandClaude Sonnet 5 06ddd837f1 Docs: found.md/bugs.md-Einträge mit Gitea-Issues verlinkt
Alle 20 granularen Funde aus found.md (#1-10) und bugs.md (#1-10) als
einzelne Gitea-Issues angelegt (#3-22): 19 direkt geschlossen (Status
laut Doku "fixed"), 1 offen gelassen (bugs.md #7, Firewall-Isolation-
Beobachtung, bewusst ohne automatischen Fix). Jeder Markdown-Eintrag
verweist jetzt per Link auf sein Gitea-Issue.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:11:22 +02:00
KayandClaude Sonnet 5 4810b7df63 Fix 3 nicht funktionierende Alert-Dismiss-Buttons (M34)
README-Milestone-Nachcheck (Port-Konflikt-Prüfung/"Fertig"-Button)
deckte drei eigenständige Bugs derselben Klasse auf: Cancel/OK-Buttons
bei ReviewApplyViews Apply-Fehler-Alert, ConnectViews
Zertifikat-Alert und ConnectViews SSH-Hostkey-Alert taten nichts oder
zu wenig - der jeweilige Verbindungs-/Fehlerzustand blieb hängen,
der Dialog konnte nicht sauber verlassen werden.

Neue ConnectionService.cancelPendingTrustConfirmation() und
SetupViewModel.dismissApplyError(), alle drei Alerts korrekt
verdrahtet (Button-Action + Bindings-Setter fuer Tap-Outside/Esc).
Totes dismissPendingSSHTrust() entfernt. 1 neuer Regressionstest,
alle 102 Unit-Tests gruen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 21:04:01 +02:00
KayandClaude Sonnet 5 510e750b3c Manual: wizard_flow-Diagramm zeigt jetzt Einfach/Experte-Verzweigung
Diagramm-Gegencheck aller 5 Mermaid-Diagramme gegen aktuellen Code:
architecture/connect_trust/backup_restore/focus_mode stimmen exakt.
wizard_flow zeigte den Wizard als reine lineare Kette inkl. VLAN-Schritt
und verschwieg die M9-Verzweigung (VLAN-Schritt wird im Einfach-Modus
übersprungen, Firewall-Grundschutz dort fest an statt Toggle). Diagramm
korrigiert, PNG/PDF/App-HTML (DE+EN) über build-manual.py neu generiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 18:43:34 +02:00
KayandClaude Sonnet 5 bace9fe3b2 gitignore: Release-Artifacts/ ausschließen
Gebaute .app/.zip für Gitea-Release-Uploads gehört nicht ins Repo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 18:36:57 +02:00
KayandClaude Sonnet 5 57c3134161 Release v1.0.0
Erste getaggte Version. SemVer (MAJOR.MINOR.PATCH), ab hier laufende
Nummerierung. Stand: 33 Meilensteine (M1-M33), Setup-Wizard, Experte-Tab,
Übersicht, Geräte, Sicherungen, Settings, Handbuch (DE/EN), automatisches
Wiederverbinden - alles live gegen echte Hardware verifiziert. Aktuellster
Durchgang: dreifacher Tester-/Sicherheits-Deep-Dive (bugs.md), inkl. live
exploitierter und live gefixter RouterOS-CLI-Injection.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
v1.0.0
2026-09-17 18:27:50 +02:00
KayandClaude Sonnet 5 1b5dc781b9 Docs: M33 (dreifacher Tester-/Sicherheits-Deep-Dive) in README/HANDOFF/CHATLOG
README-Milestone-Tabelle, Sicherheits-Absatz, HANDOFF-Abschnitt und
Chatlog-Nacherzählung für den kompletten Bugjagd-Bogen (bugs.md)
nachgezogen - Race Condition, RouterOS-CLI-Injection (live exploitiert
+gefixt), Parser-Datenverlust, TOFU-Härtung u.a.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 18:22:15 +02:00
KayandClaude Sonnet 5 aad2ccb7d4 Härtung: REST-Query-Injection-Parität + TOFU-Fingerprint-Fallback
Dritter, sicherheitsfokussierter Deep-Dive-Durchgang ("maximale Sicherheit"):

- RestTransport.fetchFieldValues hatte dieselbe ungeschützte
  String-Interpolation wie das SSH-Pendant aus dem vorigen Fix, nur als
  URL-Query statt CLI-Zeile - beim ersten Fix übersehen. Jetzt
  RFC-3986-konform percent-encoded.
- CertificateFingerprint.sha256 fiel bei Extraktionsfehlern auf einen
  festen String "unbekannt" zurück statt echtem Fingerabdruck -
  theoretisches TOFU-Pinning-Bypass-Fenster (zwei verschiedene,
  extraktions-fehlschlagende Zertifikate hätten sich denselben
  "Fingerabdruck" geteilt). Rückgabetyp optional, Extraktionsfehler
  führt jetzt zu hartem Verbindungsabbruch statt Trust-Dialog.

Beide Fixes defensiv/gehärtet, nicht live exploitiert. Zugangsdaten-
Speicherung (Keychain) und BackupServices eigene Escaping-Logik
gegengeprüft - bereits korrekt. Build + alle 101 Unit-Tests grün.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 18:14:44 +02:00
KayandClaude Sonnet 5 800b48406b Fix live exploitierte RouterOS-CLI-Injection + Parser-Datenverlust
Deep-Dive-Gegencheck mit echtem Exploit-Nachweis gegen den Testrouter:

- RouterOSCommand.cliLine quotete Werte nur bei Leerzeichen und escapte
  eingebettete Anführungszeichen nie. Ein Kommentar wie test" ; :log
  warning "X schloss das Quoting vorzeitig und ließ RouterOS den Rest
  als zweiten Befehl ausführen. Live exploitiert (injizierter
  script,warning-Log-Eintrag) und live als behoben bestätigt. Betraf
  jede Schreiboperation über SSH - auf dem aktuellen Testrouter ist
  www-ssl deaktiviert, REST also unerreichbar, der Bug war aktiv.
- RouterOSCliParser.keyValues nahm an, print terse quote mehrwortige
  Werte - live an zwei Menüs widerlegt (RouterOS 7.24.4 quotet dort
  nichts). Trunkierte jeden mehrwortigen Wert beim ersten Leerzeichen.
  Fix: Token-Scan statt Regex.
- SSHTransport.fetchFieldValues defensiv gegen dieselbe Injection-Klasse
  gehärtet (aktuell nur hartkodiert aufgerufen, aber generische API).

2 neue Regressionstests, alle 101 Unit-Tests grün. Details in bugs.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 18:08:34 +02:00
KayandClaude Sonnet 5 3b84d31ec6 Fix 4 Bugs aus systematischem Tester-Durchgang (bugs.md)
Race Condition bei LAN-Port-Konflikt-Prüfung (Generation-Zähler), Firewall-Titel
widersprach sich im Einfach-Modus, 2 fehlende EN-Übersetzungen, Health-Check-
Herzschlag ignorierte laufende Wizard-/Experte-Schreibvorgänge. Außerdem M7/M9
im README/HANDOFF auf fertig aktualisiert (Modusschalter+Experte-Zweig liefen
bereits über die Multi-LAN/WLAN-Live-Tests).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:53:58 +02:00
KayandClaude Sonnet 5 123e46973a Docs: M7 Verbindungsabbruch-mitten-im-Apply per Code-Review geklärt
SetupViewModel.apply() fängt einen Fehler mitten in der Befehlsschleife
sauber per do/catch ab (kein Absturz/Hänger), applyLog zeigt den
Fortschritt bis zum Abbruch. Kein Code geändert, nur README-Status.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:36:23 +02:00
KayandClaude Sonnet 5 25401cde78 M32: Automatisches Wiederverbinden nach Verbindungsabbruch
ConnectionService: Herzschlag-Task (alle 10s /system identity) erkennt
einen Verbindungsverlust während der Sitzung; bei Ausfall Retry-Schleife
(REST->SSH, alle 5s, unbegrenzt bis Erfolg oder manuellem "Trennen").
state bleibt bewusst .connected währenddessen, damit andere Tabs nicht
auf "Nicht verbunden" umspringen — isReconnecting/reconnectAttemptCount/
secondsUntilNextReconnectAttempt treiben einen Banner im Verbinden-Tab
mit Versuchszähler + Countdown.

Live bestätigt, zusätzlich beim echten Firmware-Update-Neustart erneut
gegengetestet. README/Manual (DE+EN) aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:32:31 +02:00
KayandClaude Sonnet 5 3a26f50800 M31: Handbuch in der App (Textanker, DE+EN)
"?"-Hilfe-Buttons in allen 6 Haupt-Tabs, allen 6 Wizard-Schritten und
allen 45 Experte-Menüs öffnen ein Handbuch-Fenster (WKWebView) und
springen per Textanker direkt zur passenden Manual-Stelle.

build-manual.py generalisiert auf beliebig viele Sprachen (LANGUAGES-
Dict) statt hart DE/EN. Manual.en.md: komplette Handübersetzung aller
Fließtext-Kapitel. Kapitel 5 (Experte-Referenz) wird pro Sprache
automatisch übersetzt, indem L10n.swifts eigenes App-Übersetzungs-
Dictionary wiederverwendet wird (714 Einträge geparst) statt einer
zweiten, separat gepflegten Übersetzung.

Live bestätigt (DE und EN).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 17:15:29 +02:00
KayandClaude Sonnet 5 e582728040 Zebra-Streifen für Tabellenansichten (found.md #8)
TableZebra-Helper (AppKit NSColor.alternatingContentBackgroundColors)
angewendet auf: LAN-Scanner-Geräte/Rohfelder/Port-Scan, Experte-
Eintragsliste + "Weitere Parameter"-Grid, Bekannte Router + Interface-
Liste (Verbinden), Sicherungsliste, Review/Apply-Log, Übersicht-
Knotendetails.

Root Cause für "keine Änderung erkennbar": .formStyle(.grouped) malt
einen eigenen blickdichten Hintergrund über Section-Zeilen, der
.listRowBackground verdeckt — .scrollContentBackground(.hidden) ergänzt.

Live bestätigt ("passt").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:22:26 +02:00
KayandClaude Sonnet 5 2848205660 Docs: LAN-Scanner Sparkline/Refreshrate live bestätigt
Kein Code geändert, nur found.md Status aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:02:18 +02:00
KayandClaude Sonnet 5 a5853b6bf1 Docs: Bonding (M10) erstmals gegen echte Hardware verifiziert
hAP lite, ether3+ether4, mode=active-backup: bond1 korrekt angelegt
und laufend. App meldete beim zweiten Anlege-Versuch einen Fehler
(Exit-Code 126, kein Klartext), Router-Zustand zeigte aber Erfolg —
vermutlich kurz abgerissene SSH-Verbindung durch Interface-
Neuinitialisierung, dokumentiert statt weiterverfolgt. Kein Code
geändert, nur HANDOFF/CHATLOG.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:57:06 +02:00
KayandClaude Sonnet 5 2852eaec2c Docs: WLAN-Schritt (M5/M10) erstmals gegen echte Hardware verifiziert
hAP lite (erstes Testgerät mit WLAN-Chip): Sicherheitsprofil-Anlage +
SSID/Passwort-Set liefen durch, Smartphone verband sich erfolgreich.
Kein Code geändert, nur offene Punkte in HANDOFF/README/CHATLOG geschlossen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:35:58 +02:00
KayandClaude Sonnet 5 a2c2be0730 Übersicht: Spaltenüberschriften auch im Fokus-Popup
focusPanel nutzte dieselbe Spalten-Layout-Logik wie das Hauptdiagramm,
hatte aber nie deren Header-Zeile (Interfaces/IP-Adressen/...) übernommen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:23:40 +02:00
KayandClaude Sonnet 5 6f29bbcb2b M30: Experte-Tab Mode-Taste-Menü + SSH-Trust-/REST-Fixes
Neues Schema für /system routerboard mode-button (enabled/on-event/
hold-time), live gegen echte Hardware verifiziert.

Dabei drei echte Bugs gefunden und gefixt:
- SSH-Trust-Dead-End beim ersten Experte-Tab-Schreiben (Backup-vor-
  Schreiben-Pfad hatte keinen Weg, den Trust-Dialog auszulösen) —
  ConnectionService.noteUntrustedSSHHostKey
- RouterOSFieldSchema.clearable: optionale Felder senden nie mehr
  einen expliziten Leer-Wert, wenn das RouterOS ablehnt
- RouterOSMenuSchema.writesRequireSSH + ConnectionService.applyViaSSH:
  für Menüs ohne REST-Anbindung (bewiesen per direktem SSH-Test) wird
  zwingend eine dedizierte SSH-Verbindung genutzt statt REST

Live Ende-zu-Ende bestätigt: Skript anlegen, Mode-Taste zuweisen,
Tastendruck löst Skript korrekt aus.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:14:31 +02:00
KayandClaude Sonnet 5 221b914b05 M29: App-Einstellungen (Settings-Fenster ⌘,)
Neues natives macOS-Settings-Fenster mit Sprache, Auto-Update-Check,
Farbschema (Standard/Kontrastreich), echter Textgrößen-Skalierung,
Bedienelement-Größe und LAN-Scanner-Refreshraten/Sparkline-Einstellungen.

- AppPreferences.swift: zentrale AppStorage-Keys, ColorTheme/AppTextSize/
  UIDensity
- SettingsView.swift: 3-Tab-Settings-Scene
- .environment(\.dynamicTypeSize) erwies sich auf macOS als wirkungslos
  (per ImageRenderer-Snapshot bewiesen) — durch eigenen appFontScale-
  Mechanismus ersetzt, ~110 .font(...)-Aufrufe app-weit umgestellt
- Farbschema auf Wunsch auch auf Experte-Tab-Sidebar ausgeweitet
- Docs aktualisiert: README/HANDOFF/CHATLOG/Manual.md+PDF, found.md

Live bestätigt nach mehreren Nachbesserungsrunden ("passt, lassen wir so").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 13:38:22 +02:00
KayandClaude Sonnet 5 53a2931239 LAN-Scanner: Sparkline breiter/schnelleres Fenster, Traffic in MB/s
TrafficSparkline-Breite 50pt→200pt, Zeitfenster 10s→30s, Poll-Intervall
3s→0,1s. Traffic-Anzeige von auto-skaliertem kbps/Mbps/Gbps auf festes
MB/s umgestellt. Alles per Nutzeranfrage iterativ angepasst, noch nicht
live gegen echten Router getestet (siehe found.md Fund 4). Manual.md +
Manual.pdf mit aktualisiert (build-manual.py). Fund 5 (App-Settings/
Preferences-Bereich) als offene Feature-Idee in found.md notiert, noch
nicht umgesetzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 22:30:22 +02:00
KayandClaude Sonnet 5 e2ffcaa250 Manual.md komplett neu: hochdetaillierte Referenz + PDF + Build-Pipeline
Manual.md ersetzt das bisherige kurze bilinguale Handbuch durch eine
hochpräzise Anleitung: Kapitel 0-4/6-7 zitieren die tatsächlichen
Tooltip-/Hilfetexte der App wörtlich (aus ConnectView, den
Einrichten-Wizard-Schritten, DevicesView, BackupListView, OverviewView),
Kapitel 5 (Experte-Feldreferenz, 44 Menüs/173 Felder) ist automatisiert
aus RouterOSSchemaCatalog.swift geparst statt von Hand übertragen, kann
also nie vom tatsächlichen App-Verhalten abweichen. Fünf
Mermaid-Diagramme (Architektur, Verbindungs-/Vertrauens-Ablauf,
Wizard-Schrittfolge, Fokus-Modus-Zustände, Sicherung/Wiederherstellung)
als Quelle unter Manual-assets/diagrams/*.mmd, vorgerendert nach PNG.
Echte App-Screenshots sind nicht möglich (keine macOS-UI-Automatisierung
verfügbar) — im Manual selbst offen benannt statt stillschweigend
ausgelassen.

Neues build-manual.py regeneriert die Experte-Referenztabellen
(zwischen festen Markern in Manual.md, Handschrift-Kapitel bleiben
unberührt), rendert geänderte Diagramme neu und exportiert Manual.pdf
über Markdown→HTML→headless Chrome print-to-pdf. README.md verweist auf
beides. Künftig bei jeder Manual-Aktualisierung erneut laufen lassen,
damit PDF und Referenztabellen nicht vom Quellcode abdriften.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 22:06:50 +02:00
KayandClaude Sonnet 5 c9671b017c M28: Übersicht Fokus-Modus + einheitliches Close-Button-Layout
Klick auf einen Knoten in der Übersicht öffnet jetzt ein schwebendes
Popup mit der kompletten verbundenen Kette (neu OverviewGraph.
connectedChain, volle transitive Hülle unabhängig vom Knotentyp,
bewusst getrennt von der bestehenden highlightedNodeIDs), sauber im
selben Spalten-Layout neu angeordnet, Rest des Diagramms abgedunkelt.
Nicht-modales Overlay statt .sheet, damit die rechte Seitenleiste
währenddessen bedienbar bleibt (Knoten direkt aus dem Popup heraus
bearbeitbar). Popup-Größe passt sich automatisch dem Inhalt an, keine
Scrollbalken.

Der dabei entstandene Close-Button-Header (Titel + Spacer + X, fest
oben, Divider direkt darunter) wurde auf alle vier Popup-Formulare der
App vereinheitlicht: Experte-Bearbeiten-Sheet und die drei
Devices-Sheets (Rohdaten, Netzwerk-Test, Port-Scan) — dort ersetzt er
jeweils den bisherigen einzelnen "Schließen"-Button unten.

Mehrere Design-Iterationen live mit dem User durchgespielt (Trennlinie
im Canvas → separates Panel → Popup → .sheet → non-modales Overlay),
finale Version live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 21:46:39 +02:00
KayandClaude Sonnet 5 684e1c184a Bug 39: "Weitere Parameter"-Liste im Experte-Sheet zweispaltig + lesbarer
Bei Menüs mit vielen ungekuratierten RouterOS-Feldern (z.B. "Alle
Interfaces (generisch)", Ethernet-Ports mit 30+ Extra-Parametern) war
das Edit-Sheet eine lange Einspalten-Liste mit viel Scrollen. Jetzt
echte Grid-Spalten für Parameter/Wert (statt TextField(titleKey:) mit
fest eingeblendetem Zeilenlabel, das auf macOS Platz frisst), einmalige
Kopfzeile, Sheet-Breite 420→900, horizontale Trennlinie pro Zeile,
Abstand zum "Parameter hinzufügen"-Button. Betrifft jedes Menü mit
ungekuratierten Feldern, nicht nur Interfaces. Live gegen echten
Router bestätigt (mehrere Nachbesserungsrunden anhand Screenshots).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 20:06:45 +02:00
Kay 0875d7c3a4 Merge branch 'main' of 192.168.178.222:kay/RouterOS 2026-09-16 19:44:15 +02:00
KayandClaude Sonnet 5 be04fc2fc0 Bug 38: NTP-Zeitserver-Feld korrigiert (HTTP 400)
/system/ntp/client hat in RouterOS 7.x kein "servers"-Feld — die Server
liegen in einer eigenen Liste /system ntp client servers. Schema in
RouterOSSchemaCatalog.swift aufgeteilt (Singleton enabled/mode + neue
Listen-Menü-Schema mit Feld "address"), zusätzlich "enabled" auf
"disabled" korrigiert (RouterOS-Konvention für Listen-Einträge).
Live gegen echten Router bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 19:43:59 +02:00
kay 47557760f8 Merge pull request 'Windows-Version.md aktualisiert' (#2) from Daniel/RouterOS:daniel-patch-2 into main
Reviewed-on: #2
2026-09-16 19:28:31 +02:00
Daniel 7fb7e721b9 Windows-Version.md aktualisiert 2026-09-16 19:27:51 +02:00
kay b8a39033d6 Windows-Version.md hinzugefügt 2026-09-16 19:27:00 +02:00
KayandClaude Sonnet 5 adb3a661ab Doku: README/Manual an Bug-37-Fix angepasst
M7-Status in README aktualisiert (REST-Schreibpfad + Hostkey-Trust
jetzt live verifiziert). Manual.md korrigiert: seit Bug 37 kann bei
REST-Verbindungen zusätzlich zum Zertifikat auch der SSH-Host-Schlüssel
zur Bestätigung erscheinen, nicht mehr nur eines von beiden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 16:28:10 +02:00
KayandClaude Sonnet 5 3034d8b874 Bug 37: SSH-Hostkey-Trust bei REST-Verbindungen proaktiv etablieren
Dedizierte SSH-Dienste (BackupService u.a.) sind der erste echte
SSH-Kontakt zu einem per REST verbundenen Router und trafen dort auf
einen unbestätigten Hostkey ohne Trust-UI (nur ReviewApplyView/
ExpertMenuDetailView-Fehlertext, kein Bestätigungsweg). Fix: nach
jedem erfolgreichen REST-Connect prüft ConnectionService den
SSH-Hostkey einmalig im Hintergrund und zeigt bei Bedarf denselben
Trust-Dialog wie der SSH-Fallback, ohne die aktive REST-Verbindung neu
aufzubauen. Live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 16:23:33 +02:00
KayandClaude Sonnet 5 9de9311bee M26+M27: Seriennummer bei Bekannte Router, Schlüsselbund-Trennung, terse-Fallback verallgemeinert
M26: SavedRouter bekommt ein optionales serialNumber-Feld. Zwei
physisch verschiedene Router mit identischem Host+Benutzername
(Werks-Adresse) blieben bisher ein gemeinsamer "Bekannte Router"-
Eintrag; recordSuccessfulConnection matcht jetzt zusätzlich nach
Seriennummer, mit sauberer Migration bestehender Einträge ohne
Seriennummer. Drei neue Tests.

M27, beim Live-Test von M26 gefunden:
- Passwort-Anzeige-Button (Augen-Symbol) im Verbinden-Tab
- Bug 35: KeychainService speicherte Passwörter nur nach
  "username@host" — beide Router teilten sich denselben
  Schlüsselbund-Eintrag trotz getrennter SavedRouter-Einträge. Fix:
  optionaler serialNumber-Parameter qualifiziert den Account-Key,
  mit Fallback auf den alten Key für bereits gespeicherte Passwörter.
- Bug 36: neuer Router zeigte keine Routerboard-Infos/Seriennummer —
  derselbe Root Cause wie der zuvor gemeldete "Jetzt prüfen"-Fehler:
  /system routerboard und /system package update scheitern auf diesem
  Router mit "expected end of command" statt dem bisher einzig
  abgefangenen "bad parameter terse". SSHTransport.fetchMenuItems
  erkennt jetzt beide Formulierungen.

Alles live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:02:27 +02:00
KayandClaude Sonnet 5 8a5df3338a M25: Einrichten-Wizard-Politur + SSH-Trust-Persistenz endlich verifiziert
- WAN-Schritt: fehlenden "Zurück"-Button ergänzt (beide Modi)
- "Abbrechen"/"Jetzt sichern" prominent gemacht (wie "Neu scannen")
- LAN-/VLAN-Schritt: Adressfelder starten leer, nur Format-Beispiel im
  Feld sichtbar statt vorbelegter Werte. VlanStepView bekam dafür eine
  Validierungssperre auf "Weiter" (fehlte bisher, war ok solange
  Defaults immer gültig waren). Zwei Tests entsprechend angepasst.
- SSH-Host-Key-Trust aus M24 hatte sich entgegen der Live-Bestätigung
  nie tatsächlich persistiert (defaults read zeigte leeren Schlüssel,
  Ursache ungeklärt) — betraf BackupServices dedizierte SSH-Verbindung
  beim ersten Experte-Tab-Schreibversuch pro Sitzung. Erneut über den
  bestehenden Trust-Dialog bestätigt, diesmal per defaults read
  verifiziert statt nur der UI-Bestätigung vertraut.

Alles live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:41:47 +02:00
KayandClaude Sonnet 5 086393d379 Manual.md: drei fehlende, bereits live bestätigte Features ergänzt
Vollständiger Review (DE+EN) auf Nutzerwunsch. Gefunden und ergänzt:
REST-Zertifikat-Dialog (bisher nur SSH-Host-Schlüssel dokumentiert,
obwohl REST seit M22 der bevorzugte Pfad ist), "Abbrechen"-Button im
Einrichten-Wizard, einklappbare Kategorien im Experte-Tab (M23). Dazu
Icon-Farbbedeutung beim LAN-Scanner-Traffic-Monitor ergänzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 11:54:11 +02:00
KayandClaude Sonnet 5 69c4a03024 LAN-Scanner: veraltete Rechtsklick-Hinweise durch Aktionen-Button ersetzt
Der Aktionen-Button (M24) ersetzte den Rechtsklick im Code, aber ein
App-eigener Warnhinweis (Feste-IP-Bestätigung) und README.md/Manual.md
(DE+EN) verwiesen weiterhin auf Rechtsklick. Gefunden durch Nutzer-
Hinweis nach Prüfung auf Gitea.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 11:51:42 +02:00
KayandClaude Sonnet 5 4cc30a2016 M24: LAN-Scanner Aktionen-Button, Traffic-Monitor+Sparkline, ARP-Fix
- Rechtsklick-Kontextmenü ersetzt durch sichtbaren "Aktionen"-Button
  je Geräte-Zeile (bisher nicht diskoverbar)
- Live-Traffic pro Port (↓/↑, wiederverwendet InterfaceTrafficMonitor)
  plus kleines Sparkline-Liniendiagramm der letzten 10 Sekunden
  (Swift Charts, neuer TrafficSample-Typ)
- Bug 34: ARP-Tabelle kann mehrere Zeilen für dieselbe MAC halten
  (reachable + stale/failed) — Auflösung bevorzugte bisher blind die
  zuletzt gesehene Zeile statt die erreichbare. Zwei Regressionstests.
- Nebenbefund: dedizierte SSH-Dienste (Backup/NetworkTools/Traffic/
  Update/FactoryReset) haben keinen eigenen Bestätigungspfad für einen
  neuen SSH-Host-Key, scheitern still solange REST verbindet — als
  offener Punkt dokumentiert.

Alles live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 11:46:01 +02:00
KayandClaude Sonnet 5 567feed93a M23: Experte-Tab-Sektionsüberschriften prominenter + einklappbar
Section-Header größer/fett mit adaptivem accentColor-Hintergrund statt
macOS' winzigem Kapitälchen-Default. Einklappbar per eigenem Chevron
(immer sichtbar, nicht macOS' Hover-only-Sidebar-Dreieck) statt
Section(isExpanded:), da SwiftUI dessen natives Disclosure-Verhalten
nicht anpassen lässt. Startet standardmäßig komplett zugeklappt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 11:03:39 +02:00
KayandClaude Sonnet 5 a0e7e53f22 M7: REST-Transport erstmals live verifiziert, vier Bugs gefunden+gefixt
Erstmaliger REST-Schreibtest gegen echte Hardware (www-ssl vorher auf
jedem Testgerät aus, Pfad lief nur gegen Mocks). Vier Bugs gefunden:

- baseURL fehlte trailing slash, relative URL-Auflösung warf "/rest"
  aus jedem Pfad (404, fiel still auf SSH zurück statt Zertifikat-
  Dialog zu zeigen)
- .add nutzte POST statt PUT (RouterOS' REST-API erwartet PUT für neue
  Einträge)
- RouterOS sendet Cache-Control: max-age=31536000 auf jede REST-
  Antwort, URLSession cachte dadurch die erste (leere) GET-Antwort für
  den Rest der App-Laufzeit
- Löschen aktualisierte die Experte-Tab-Liste nicht in-place (SwiftUI-
  Render-Problem, kein Datenfehler) — Anlegen/Bearbeiten laufen über
  ein Sheet, dessen Schließen automatisch neu rendert, Löschen über
  ein confirmationDialog ohne Remount

Anlegen/Bearbeiten (inkl. Feld-Leeren)/Löschen live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 10:51:55 +02:00
KayandClaude Sonnet 5 0237b3afbe Dauer-Editor auf Keepalive/Scheduler-Intervall/Netwatch-Intervall ausgerollt
WireGuard-Peer "Keepalive", Scheduler "Intervall" und Netwatch
"Prüf-Intervall" nutzen jetzt RouterOSFieldSchema.Kind.duration statt
Freitext. Netwatch-Default von "00:00:10" auf "10s" umgestellt, da
DurationFieldEditor.parse nur das Suffix-Format versteht, kein
HH:MM:SS. Vorher live geprüft, dass RouterOS das Suffix-Format bei
allen drei Feldern akzeptiert. Live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 10:03:35 +02:00
KayandClaude Sonnet 5 8bebef78fd HANDOFF.md: fetchMenuItems-Singleton-Fallback (Bug 20) nachgeprüft
Live an 12 Singleton-Menüs getestet — alle melden konsistent "bad
parameter terse (line 1 column N)", vom bestehenden Substring-Check
abgedeckt. Keine dritte, unbehandelte Fehlerform gefunden. Nebenbefund:
/system health ist kein Singleton, liefert echte Liste über terse.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 09:41:24 +02:00
KayandClaude Sonnet 5 d3685bb8d4 HANDOFF.md: Übersicht-Interface-Highlight visuell bestätigt
Interface-Klick hebt live im Diagramm die komplette zusammenhängende
Kette hervor (inkl. zwei Hops entfernter Knoten), Pool/Adresse bleiben
bei der 1-Hop-Regel. War bisher nur per Unit-Test abgesichert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 09:39:01 +02:00
KayandClaude Sonnet 5 f34fc0587a Einrichten-Tab: "Abbrechen"-Button ergänzt
Vorher kein Weg aus dem Wizard außer schrittweise "Zurück" bis zu
Modus. Zentral als Toolbar-Button in SetupView (nicht pro Schritt
dupliziert), mit Bestätigungsdialog gegen Datenverlust, deaktiviert
während eines laufenden Apply. SetupViewModel.finish() in gemeinsame
resetToInitialState() plus benannte finish()/cancel()-Wrapper
aufgeteilt. Live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 09:34:03 +02:00
KayandClaude Sonnet 5 0b557b55e9 Firewall-NAT/Filter-Regeln beim Wizard-Apply idempotent machen
Wiederholter Wizard-Lauf gegen einen bereits konfigurierten Router hat
bisher jedes Mal dieselben NAT-/Filter-Regeln erneut angelegt (RouterOS
lehnt Duplikate hier nicht ab). SetupViewModel.apply holt jetzt einmalig
eine Live-Momentaufnahme der bestehenden Regeln und überspringt geplante
.add-Befehle mit identischem Argument-Set (ohne das rein schreibseitige
place-before). Live bestätigt: zweimaliger Wizard-Lauf, Regelanzahl
blieb beim zweiten Mal unverändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 09:29:21 +02:00
KayandClaude Sonnet 5 e18eb2f714 HANDOFF.md: .id-Positions-Überlagerung live nachgeprüft (Bug 15)
Live-Vergleich :put [Pfad find] vs. print terse bei /ip address,
/ip route, /ip dhcp-server lease — Reihenfolge stimmte in allen drei
Fällen überein, kein erneuter Fehlgriff reproduzierbar. Entkräftet
Bug 15 nicht (RouterOS dokumentiert die Stabilität nirgends);
Timing-Race bei dynamischen Menüs (Lease-Tabelle) als Arbeitshypothese
festgehalten, echte Behebung bleibt offen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:48:47 +02:00
KayandClaude Sonnet 5 16706d5c6b M21: Zweisprachigkeit (DE/EN) auf alle fünf Tabs ausgerollt
Einrichten-Wizard (alle sieben Schritte), Übersicht, LAN-Scanner,
Sicherungen laufen jetzt über L10n.t statt fester deutscher
String-Literale — Experte- und Verbinden-Tab waren bereits vorher
umgestellt (M16/M17). Model-Layer-Strings werden am Verwendungsort
gewrappt, ViewModel-generierte Laufzeitstrings (Fehlermeldungen,
CLI-Zeilen, Log) bleiben bewusst unübersetzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:31:08 +02:00
KayandClaude Sonnet 5 04325e3bbd M20: LAN-Scanner umbenannt + Netzwerk-Tools (Ping/Traceroute/DNS/Port-Scan)
Tab "Geräte" -> "LAN-Scanner", Refresh-Button "Neu scannen" + prominenter
Stil. Neues Netzwerk-Tools-Menü: Ping/Traceroute/DNS-Auflösung über
NetworkToolsService (eigene SSH-Verbindung, wie Backup/InterfaceTraffic-
Monitor), mit Zeichen-Validierung gegen Command-Injection ueber einen
boeswilligen DHCP-Hostnamen. Port-Scan laeuft direkt von diesem Mac ueber
Network.framework (RouterOS hat kein eingebautes Portscan-Tool) - dabei
einen echten NWConnection-Bug gefunden (verweigerte Verbindung meldet sich
ueber .waiting, nicht .failed) und per Unit-Test gegen einen Loopback-Port
aufgedeckt und gefixt.

Zusaetzlich: Warnhinweis bei "Feste IP zuweisen" erklaert jetzt den
Rueckweg. DE/EN-Umschalter zeigt Landesflaggen statt Text.

92 Tests gruen. HANDOFF.md/README.md (inkl. Mermaid-Diagramm)/Manual.md/
CHATLOG.md aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
2026-09-15 22:41:23 +02:00
KayandClaude Sonnet 5 b5933fa44b README: Mermaid-Architekturdiagramm um M17/M18 ergänzt
Dedizierte SSH-Verbindung für InterfaceTrafficMonitor, lokaler
SavedRoutersStore-Pfad (UserDefaults, kein Router-Zugriff).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
2026-09-15 21:43:51 +02:00
KayandClaude Sonnet 5 31607b7270 M17-M19: Bekannte Router, Live-Traffic-Anzeige, Übersicht-Animation+Drag
M17: "Bekannte Router" im Verbinden-Tab (SavedRouter/SavedRoutersStore),
Standort-Freitextfeld, Scroll-Cap ab 4 Einträgen. Bugfix: Umbenennen-
TextField steckte in einem sich selbst deaktivierenden Button.

M18: Live-Traffic-Punkt an Interfaces (InterfaceTrafficMonitor, eigene
SSH-Verbindung, monitor-traffic-Polling). Dabei zwei reale CLI-Parser-Bugs
gefunden und gefixt: running/disabled-Flags werden als Buchstaben vor dem
ersten Feld codiert, nicht als key=value; monitor-traffic liefert
"50.7kbps" statt einer reinen Zahl.

M19: Übersicht-Tab — animierte Flussrichtung auf allen Verbindungslinien
(TimelineView+dashPhase), frei verschiebbare Knoten mit Live-folgenden
Linien, Zurücksetzen-Button.

Zusätzlich (noch nicht live getestet, nur Build+Unit-Tests grün):
LAN-Port-Konflikt-Prüfung im Einrichten-Assistenten mit doppelter
Sicherheitsbestätigung, "Fertig"-Button nach erfolgreichem Anwenden.

82 Tests grün. HANDOFF.md/README.md/Manual.md/CHATLOG.md aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
2026-09-15 21:40:46 +02:00
KayandClaude Sonnet 5 9b26677dc2 Übersicht: Interface-Klick hebt transitiv alle zusammenhängenden Linien hervor
OverviewGraph.highlightedNodeIDs(startingAt:) macht für Interface-Knoten
eine BFS über alle Kanten statt nur 1-Hop-Matching, damit z.B. "DHCP-Server
-> Pool" oder "IP-Adresse -> DHCP-Netzwerk" mit sichtbar werden. Andere
Knotentypen bleiben unverändert bei 1-Hop. Logik isoliert unit-getestet
(GUI selbst nicht automatisiert klickbar). 61 Tests grün.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
2026-09-15 19:58:05 +02:00