Releases: christianmueller1970-oss/DXSpiderAdmin
Releases · christianmueller1970-oss/DXSpiderAdmin
Release list
DXSpiderAdmin 0.3
Added
- Automatische Updates über Sparkle 2: Die App prüft selbst auf neue Versionen und
installiert sie auf Wunsch; zusätzlich Menüpunkt «Nach Updates suchen …».
Update-Liste (appcast.xml) und DMGs kommen direkt aus dem öffentlichen GitHub-Repo. scripts/publish-release.sh: Tag, GitHub-Release mit DMG und Release-Notes, danach
Veröffentlichung der Update-Liste.build-dmg.shsigniert die DMG zusätzlich für Sparkle.- MIT-Lizenz.
DXSpiderAdmin 0.2
Changed (Oberfläche aufgefrischt)
- Globaler Status in der Sidebar: Node, Verbindungszustand und Modus-Pille
(Read-only / Schreiben) sind in jedem Bereich sichtbar; Klick führt zur Verbindung.
„User & Nodes“ zeigt die Zahl verbundener User als Badge. - Einheitliche Bausteine (
DesignKit.swift): ein Modus-Hinweis mit „Freischalten …“-Link
statt drei unterschiedlicher Read-only-Leisten, „Nicht verbunden“-Platzhalter mit Sprung
zur Verbindung, Karten-Stil und eine gemeinsame Konsole. - Konsole: Terminal-Fläche mit eingefärbten Zeilen (gesendet, Fehler, gesperrt, Erfolg),
scrollt automatisch ans Ende; auf der Verbindungsseite mit Eingabezeile und Schnellbefehlen. - Verbindung: Kopfkarte mit Node, Endpunkt, Status und grossem Verbinden-/Trennen-Knopf.
- Command Builder: Bereiche (Registrierung, Sperrlisten, Abfragen, Frei) per
Segment-Umschalter statt einer langen Liste; kurze Labels mit Platzhaltern. - User & Nodes / Sperrlisten: Tabellen mit Spalten, Zählern und Leer-Zuständen
(laden, keine Treffer, leer). - Filter-Editor: Bänder als Chips, Befehlsvorschau als Code-Zeile.
- Info & Diagnose: farbige Kachel-Symbole, Schnellzugriff als Chips, Ausgabe im Konsolen-Look.
Added
- Bereich „Info & Diagnose": Status-Kacheln (Uptime, User, Nodes, Version, Node-Zeit) aus
show/cluster+show/version+show/time, dazu ein gruppiertes Dropdown über den
read-only Abfrage-Katalog mit Argumentfeld, Dry-Run-Vorschau, Schnellzugriff-Buttons und
eigener Ausgabe samt „Kopieren" / „Sichern …" (Textdatei mit Kopfzeile). NodeQuery(Core): datengetriebener Katalog von 37 read-only Abfragen in fünf Gruppen —
jede live gegen HB9HJI-2 verifiziert (DXSpider v1.55 build 823, 13-Aug-2026). Enthält
Argumenttyp, Validierung, Vorgabewert und Hilfetext; die UI rendert sich daraus, neue
Abfragen sind ein Katalogeintrag. NeuerDXCommand-Case.query, als read-only eingestuft.NodeStatus+NodeStatusParser(Core): liest Nodes/User/Uptime/Version/Zeit feldweise,
damit abweichende Formulierungen nur den betroffenen Wert kosten statt den ganzen Status.docs/NodeQueries.md: der vollständige Verifikationsbefund inkl. der Befehle, die dieser
Build nicht kennt (show/ping,show/configuration/users,show/files,show/qrz…).- 17 neue Unit-Tests (gesamt 77, grün).
- App-Build-Nummer auf 4 erhöht (
CURRENT_PROJECT_VERSION), damit sich ein Testbuild in
der Sidebar-Fusszeile von der v0.1-DMG unterscheiden lässt. scripts/uisnapshot.sh+ Startargument-uiSmokeTest <bereich>(optional
-uiSmokeQuery <id>): startet eine eigene Instanz im Demo-Backend und fotografiert deren
Fenster. Damit werden Layout-Fehler sichtbar, die kein Compiler und kein Unit-Test findet.
Fixed (Info & Diagnose, Layout)
- Ausgabe blieb leer, obwohl die Zeilenzahl im Kopf stimmte: Der Text forderte in einem
waagrecht scrollendenScrollViewmaxWidth: .infinityan, was das Layout ungültig macht.
Die Ausgabe scrollt jetzt nur senkrecht (wie die Konsole im Command Builder); breite
Tabellen brechen dadurch um, sind aber sichtbar. - Status-Kacheln wurden nie gezeichnet: ein
LazyVGridmeldet in einem nicht-scrollenden
VStackkeine Höhe. Fünf feste Kacheln brauchen kein Lazy-Layout →HStack. - Inhalt lag unter der Titelleiste, mitsamt verschobener Sidebar: Unter einer macOS-Toolbar
bekommt nur scrollender Inhalt den korrekten Safe-Area-Abstand. Kacheln, Abfrage-Leiste und
Ausgabe-Kopf sind jetzt angehefteter Section-Header eines ScrollView und bleiben beim
Scrollen stehen. - Kacheln blieben leer, wenn der Bereich schon offen war, bevor die Verbindung stand —
der Refresh hängt jetzt am Verbindungsstatus (task(id:)) statt nur am Erscheinen.
Fixed
- Versions-Irrtum aufgeklärt (
docs/NodeVersion.md):show/versionmeldet auf HB9HJI-2
v1.55 (build 823), installiert ist aber v1.57 build 46. Bei einer Git-Installation
leitet DXSpider die Nummer ausgit describeab — jüngster Tag (1.55) plus die 823
Commits danach. Der Node ist aktuell (HEAD =origin/mojo), nicht veraltet.NodeStatus
führt die Git-Herkunft jetzt mit, die Version-Kachel zeigt sie samt Tooltip-Erklärung. NodeStatusParsererkennt auch die Schreibweisebuild: 686, die Nodes ohne Git-Repo
verwenden.
Added (früher)
- Projekt-Setup (M0): Repository,
README.md,CHANGELOG.md,.gitignore. - Konzeptdokument V4 (
docs/Konzeptdokument.md): Architektur SSH +console.pl,
Sicherheits-/Datenschutzgrundsätze, UI-Struktur, Roadmap M0–M5. - Swift Package
DXSpiderCore(Gerüst): Modelle (PrivilegeLevel,ClusterUser,
ClusterNode),ConnectionState, Command-Builder (DXCommand),SysopChannel-Protokoll,
vorläufigerShowUsersParsersowie erste Unit-Tests. - M1 (Verbindungs-Layer, testbares Fundament):
PromptDetector(Prompt-Erkennung als
Trennsignal),ResponseAccumulator(kontinuierliches Puffern → vollständige Antwort),
ChannelMode(Read-only-Default + Guard gegen destruktive Befehle),CommandAuditLog
(AuditEntry/AuditSink/InMemoryAuditLog— jede gesendete Zeile, auch blockierte) und
InMemorySysopChannel(vollständig testbarer Referenz-Kanal).SysopChannelumstate
erweitert. 12 neue Unit-Tests (gesamt 20, grün). - M1 (echter SSH-Kanal):
SSHConnectionConfig(nicht-geheime Verbindungsdaten + testbarer
ssh-Argument-Builder,BatchMode=yesfür Key-only) undProcessSysopChannel— startet
/usr/bin/ssh -tt … console.plals Subprozess, liest stdout kontinuierlich asynchron über
ResponseAccumulator/PromptDetector, setztChannelMode-Guard + Audit + Timeouts durch,
beendet den Prozess sauber. Key-Auth bleibt vollständig beim System (ssh-agent/~/.ssh).
5 neue Unit-Tests (gesamt 25, grün). - M1 (App-Target): Xcode-Projekt
App/DXSpiderAdmin.xcodeproj(macOS 26, SwiftUI,
Synchronized-Groups-Format, lokales Package../Core). Erste UI nach Konzeptdokument §6
„Verbindung":DXSpiderAdminApp,ContentView(Sidebar Verbindung/User), MVVM-
ConnectionViewModel(@Observable, Demo- & SSH-Backend, Read-only-Schalter, Status,
Audit-Log) undConnectionView(Node-Felder, Konsole, manuelles Befehls-Senden,
Status-Badge). Demo-Backend macht die App ohne Server bedienbar. Baut grün via
xcodebuild(ad-hoc-signiert, lauffähig). - M1 (Settings & Audit-Persistenz, schließt M1 ab):
AppSettings/SettingsStorelädt &
speichert die nicht-geheimen Verbindungsdaten als~/Documents/DXSpiderAdmin/settings.json
(Verzeichnis injizierbar, testbar);FileAuditLog(AuditSink →audit.log) und
CompositeAuditSink(Fan-out In-Memory + Datei). App lädt Settings beim Start, sichert sie
beim SSH-Verbinden bzw. per Button und schreibt jede Befehlszeile zusätzlich in die
Audit-Datei. 5 neue Unit-Tests (gesamt 30, grün). - M2 (User- & Node-Verwaltung, MVP): geteiltes
Callsign-Util,ShowNodesParser
(tolerant,show/nodes→[ClusterNode]mit Verbindungs-Heuristik) undRateLimiter
(Mindest-Abstand zwischen Befehlen, deterministisch testbar). App:ManagementViewmit
User-/Node-Listen, Suchfilter (searchable), Privilege-Menü und „Station trennen" — alle
destruktiven Aktionen nur im Schreibmodus und mit Bestätigungsdialog.ConnectionViewModel
umusers/nodes, Filter,refreshAll/refreshUsers/refreshNodesund einen
rate-limitiertendispatch-Pfad erweitert. 3 neue Unit-Tests (gesamt 33, grün). - M3 (Command Builder):
DXCommandumunsetRegister(Register-Toggle) erweitert.
App:CommandBuilderViewmit Eingabemasken für Registrierung (set/register/
unset/register), read-only-Abfragen (show/configuration,show/route <call>) und
freier Eingabe — jeweils mit Dry-Run-Preview des exakt erzeugten Befehls (§2),
Bestätigung für destruktive Aktionen, Rufzeichen-Validierung und geteilter Konsolen-
Ausgabe. Neuer Sidebar-Eintrag „Command Builder". 2 neue Unit-Tests (gesamt 35, grün). - M4 (Visueller Filter-Editor):
SpotFilter(Core) komponiert die DXSpider-Filterregel aus
Aktion (accept/reject), Slot, Bändern (HF/VHF/UHF →on …), Spotter (by) und Origin —
inkl.command/clearCommandund Token-Parser; die (laut §10 noch zu verifizierende)
Syntax liegt damit an einer getesteten Stelle. App:FilterEditorViewmit Band-Checkboxen,
Stationsfeldern, Live-Befehls-Vorschau und Anwenden/Leeren (destruktiv → Bestätigung).
Neuer Sidebar-Eintrag „Filter-Editor". 6 neue Unit-Tests (gesamt 41, grün). - M5 (Polish & Distribution): Hardened Runtime im Release aktiviert (Signatur trägt das
runtime-Flag), App-Sandbox bewusst AUS (ssh-Subprozess), Vertriebsweg Developer ID.
Asset-Katalog (AppIcon-Slot +AccentColor) verdrahtet; App-Versionsanzeige in der
Sidebar. Distributions-Dokudocs/Distribution.md, Notarisierungs-Skriptscripts/notarize.sh
undscripts/ExportOptions.example.plist. Konzeptdokument-Roadmap (§7) auf M0–M4 ✅ /
M5 ⏳ aktualisiert, Sandbox-Frage (§9/§10) entschieden. - Live-Test-Vorbereitung: read-only-CLI
dxspider-capture(Executable im Swift Package),
das viaProcessSysopChannelverbindet und echteshow/*-Ausgaben als Fixtures nach
~/Documents/DXSpiderAdmin/fixtures/schreibt (Konfiguration aussettings.jsonoder
Flags). Anleitungdocs/LiveTest.md. Dient der Verifikation/Verfeinerung der Parser (§10). - Live-Test gegen HB9HJI-2 durchgeführt (Befund in
docs/NodeProtocol.md):console.plist
eine Curses-TUI und als zeilenbasierter Kanal ungeeignet. Der saubere Transport ist der
DXSpider-Console-Socket (127.0.0.1:27754): zeilenbasiertes Protokoll mit Attach
A<call>|…, BefehlI<call>|…und Antworten<sort><call>|<zeile>(D=Ausgabe inkl.
bestätigtem Prompt-Format,X=Spot-Broadcast,Z=Ende). Sysop-Rechte ohne Challenge.
→ Transport-Layer wird darauf umgestellt (nächster Schritt);PromptDetectorpasst bereits. - `ConsoleSocketChannel...