Skip to content

Releases: christianmueller1970-oss/DXSpiderAdmin

DXSpiderAdmin 0.3

Choose a tag to compare

@christianmueller1970-oss christianmueller1970-oss released this 01 Oct 17:47

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.sh signiert die DMG zusätzlich für Sparkle.
  • MIT-Lizenz.

DXSpiderAdmin 0.2

Choose a tag to compare

@christianmueller1970-oss christianmueller1970-oss released this 01 Oct 17:35

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. Neuer DXCommand-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 scrollenden ScrollView maxWidth: .infinity an, 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 LazyVGrid meldet in einem nicht-scrollenden
    VStack keine 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/version meldet auf HB9HJI-2
    v1.55 (build 823), installiert ist aber v1.57 build 46. Bei einer Git-Installation
    leitet DXSpider die Nummer aus git describe ab — 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.
  • NodeStatusParser erkennt auch die Schreibweise build: 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äufiger ShowUsersParser sowie 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). SysopChannel um state
    erweitert. 12 neue Unit-Tests (gesamt 20, grün).
  • M1 (echter SSH-Kanal): SSHConnectionConfig (nicht-geheime Verbindungsdaten + testbarer
    ssh-Argument-Builder, BatchMode=yes für Key-only) und ProcessSysopChannel — startet
    /usr/bin/ssh -tt … console.pl als Subprozess, liest stdout kontinuierlich asynchron über
    ResponseAccumulator/PromptDetector, setzt ChannelMode-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) und ConnectionView (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/SettingsStore lä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) und RateLimiter
    (Mindest-Abstand zwischen Befehlen, deterministisch testbar). App: ManagementView mit
    User-/Node-Listen, Suchfilter (searchable), Privilege-Menü und „Station trennen" — alle
    destruktiven Aktionen nur im Schreibmodus und mit Bestätigungsdialog. ConnectionViewModel
    um users/nodes, Filter, refreshAll/refreshUsers/refreshNodes und einen
    rate-limitierten dispatch-Pfad erweitert. 3 neue Unit-Tests (gesamt 33, grün).
  • M3 (Command Builder): DXCommand um unsetRegister (Register-Toggle) erweitert.
    App: CommandBuilderView mit 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/clearCommand und Token-Parser; die (laut §10 noch zu verifizierende)
    Syntax liegt damit an einer getesteten Stelle. App: FilterEditorView mit 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-Doku docs/Distribution.md, Notarisierungs-Skript scripts/notarize.sh
    und scripts/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 via ProcessSysopChannel verbindet und echte show/*-Ausgaben als Fixtures nach
    ~/Documents/DXSpiderAdmin/fixtures/ schreibt (Konfiguration aus settings.json oder
    Flags). Anleitung docs/LiveTest.md. Dient der Verifikation/Verfeinerung der Parser (§10).
  • Live-Test gegen HB9HJI-2 durchgeführt (Befund in docs/NodeProtocol.md): console.pl ist
    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>|…, Befehl I<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); PromptDetector passt bereits.
  • `ConsoleSocketChannel...
Read more