From 0318a3492eba786acad3dadfb16a5514643dfa31 Mon Sep 17 00:00:00 2001 From: Cameron Will Date: Tue, 19 May 2026 16:11:50 -0400 Subject: [PATCH 1/4] fix: Replace hallucinated repeater admin commands with real ones The quick command buttons (status, ver, neighbors, help, log) were guesses that don't match actual MeshCore repeater firmware commands. Replaced with the set from the official app: neighbors, telemetry, reboot, ver. Co-Authored-By: Claude Opus 4.6 --- src/meshcore_console/mock/data.py | 42 ++++++---------------- src/meshcore_console/ui_gtk/views/admin.py | 2 +- tests/integration/test_repeater_admin.py | 2 +- uv.lock | 2 +- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/meshcore_console/mock/data.py b/src/meshcore_console/mock/data.py index f80ab93..ff4f865 100644 --- a/src/meshcore_console/mock/data.py +++ b/src/meshcore_console/mock/data.py @@ -38,44 +38,22 @@ MOCK_CLI_RESPONSES: dict[str, str] = { - "status": ( - "Uptime: 3d 14h 22m\n" - "Connected clients: 7\n" - "Packets forwarded: 12,847\n" - "Frequency: 910.525 MHz\n" - "TX Power: 20 dBm\n" - "SF: 10 BW: 250 kHz CR: 4/5" - ), "ver": "MeshCore Repeater v1.12.3\nBoard: Heltec V3\nBuild: 2025-04-10", "neighbors": ( "Neighbors (3):\n" - " Alice -67 dBm SNR 8.5 direct\n" - " Bob -82 dBm SNR 3.2 2 hops\n" - " Charlie -91 dBm SNR -1.0 3 hops" + " Alice -67 dBm SNR 8.5 0 hops\n" + " Bob -82 dBm SNR 3.2 0 hops\n" + " Charlie -91 dBm SNR -1.0 0 hops" ), - "help": ( - "Available commands:\n" - " status Show repeater status\n" - " ver Firmware version\n" - " neighbors Connected peers\n" - " reboot Reboot repeater\n" - " advert Send advertisement\n" - " clock Show device time\n" - " set Configure parameters\n" - " get Query parameters\n" - " log View packet log" + "telemetry": ( + "Battery: 3.82V (74%)\n" + "Temperature: 32.1 C\n" + "Humidity: 58%\n" + "Uptime: 3d 14h 22m\n" + "TX Power: 20 dBm\n" + "Packets forwarded: 12,847" ), - "clock": "Device time: 2025-04-15 14:32:07 UTC\nUptime: 3d 14h 22m", - "advert": "Advertisement sent (flood)", "reboot": "Rebooting in 3 seconds...", - "log": ( - "Recent packets (last 5):\n" - " 14:31:52 ADVERT Alice -67 dBm\n" - " 14:31:48 GRP_TXT #test -73 dBm\n" - " 14:31:45 TXT_MSG Bob -82 dBm\n" - " 14:31:40 ACK Charlie -91 dBm\n" - " 14:31:38 ADVERT Diana -78 dBm" - ), } diff --git a/src/meshcore_console/ui_gtk/views/admin.py b/src/meshcore_console/ui_gtk/views/admin.py index ee70a91..90c2a02 100644 --- a/src/meshcore_console/ui_gtk/views/admin.py +++ b/src/meshcore_console/ui_gtk/views/admin.py @@ -196,7 +196,7 @@ def _build_console_tab(self) -> Gtk.Box: quick_row.set_margin_end(8) quick_row.set_margin_top(8) quick_row.set_margin_bottom(4) - for cmd in ("status", "ver", "neighbors", "help", "log"): + for cmd in ("neighbors", "telemetry", "reboot", "ver"): btn = Gtk.Button.new_with_label(cmd) btn.add_css_class("quick-cmd-btn") btn.connect("clicked", self._on_quick_cmd, cmd) diff --git a/tests/integration/test_repeater_admin.py b/tests/integration/test_repeater_admin.py index d6add7d..e0b5169 100644 --- a/tests/integration/test_repeater_admin.py +++ b/tests/integration/test_repeater_admin.py @@ -48,7 +48,7 @@ def test_list_logged_in_repeaters() -> None: def test_send_command() -> None: client = MockMeshcoreClient() client.login_to_repeater("repeater-1", "admin123") - result = client.send_repeater_command("repeater-1", "status") + result = client.send_repeater_command("repeater-1", "ver") assert result["success"] is True assert "response_text" in result diff --git a/uv.lock b/uv.lock index de0ae92..b600edf 100644 --- a/uv.lock +++ b/uv.lock @@ -530,7 +530,7 @@ wheels = [ [[package]] name = "meshcore-uconsole" -version = "1.10.0" +version = "1.11.0" source = { editable = "." } dependencies = [ { name = "gpsdclient" }, From e23a568ac28b5d56a437644bfa36291c3b84107c Mon Sep 17 00:00:00 2001 From: Cameron Will Date: Tue, 19 May 2026 16:59:58 -0400 Subject: [PATCH 2/4] fix: Replace telemetry button with get repeat (telemetry is not a CLI command) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MeshCore repeater firmware doesn't accept "telemetry" as a CLI text command — the official app uses binary protocol requests for that. Replaced with "get repeat" which maps to the official app's Repeat Settings feature and is a valid firmware CLI command. Co-Authored-By: Claude Opus 4.6 --- src/meshcore_console/mock/data.py | 9 +-------- src/meshcore_console/ui_gtk/views/admin.py | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/meshcore_console/mock/data.py b/src/meshcore_console/mock/data.py index ff4f865..f234f40 100644 --- a/src/meshcore_console/mock/data.py +++ b/src/meshcore_console/mock/data.py @@ -45,14 +45,7 @@ " Bob -82 dBm SNR 3.2 0 hops\n" " Charlie -91 dBm SNR -1.0 0 hops" ), - "telemetry": ( - "Battery: 3.82V (74%)\n" - "Temperature: 32.1 C\n" - "Humidity: 58%\n" - "Uptime: 3d 14h 22m\n" - "TX Power: 20 dBm\n" - "Packets forwarded: 12,847" - ), + "get repeat": "repeat: ON", "reboot": "Rebooting in 3 seconds...", } diff --git a/src/meshcore_console/ui_gtk/views/admin.py b/src/meshcore_console/ui_gtk/views/admin.py index 90c2a02..bcc3983 100644 --- a/src/meshcore_console/ui_gtk/views/admin.py +++ b/src/meshcore_console/ui_gtk/views/admin.py @@ -196,7 +196,7 @@ def _build_console_tab(self) -> Gtk.Box: quick_row.set_margin_end(8) quick_row.set_margin_top(8) quick_row.set_margin_bottom(4) - for cmd in ("neighbors", "telemetry", "reboot", "ver"): + for cmd in ("neighbors", "get repeat", "reboot", "ver"): btn = Gtk.Button.new_with_label(cmd) btn.add_css_class("quick-cmd-btn") btn.connect("clicked", self._on_quick_cmd, cmd) From 489c149b48e1a1e49ac16dcd6f61240c31f1d91c Mon Sep 17 00:00:00 2001 From: Cameron Will Date: Mon, 25 May 2026 19:26:25 -0400 Subject: [PATCH 3/4] fix: Match multi-word commands in mock CLI response lookup The mock client only looked up the first token of a repeater command, so multi-word keys like "get repeat" in MOCK_CLI_RESPONSES never matched. Co-Authored-By: Claude Opus 4.6 --- src/meshcore_console/mock/client.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/meshcore_console/mock/client.py b/src/meshcore_console/mock/client.py index 9ab8008..8e0594f 100644 --- a/src/meshcore_console/mock/client.py +++ b/src/meshcore_console/mock/client.py @@ -325,8 +325,9 @@ def logout_from_repeater(self, peer_name: str) -> None: self._append_event({"type": EventType.REPEATER_LOGOUT, "data": {"peer_name": peer_name}}) def send_repeater_command(self, peer_name: str, command: str) -> dict: - cmd_key = command.strip().split()[0].lower() if command.strip() else "" - response_text = MOCK_CLI_RESPONSES.get(cmd_key, f"OK: {command}") + stripped = command.strip().lower() + cmd_key = stripped.split()[0] if stripped else "" + response_text = MOCK_CLI_RESPONSES.get(stripped) or MOCK_CLI_RESPONSES.get(cmd_key, f"OK: {command}") self._append_event( { "type": EventType.REPEATER_COMMAND_RESPONSE, From 41feb2c80ea083b29987ce4077a6f480e830d843 Mon Sep 17 00:00:00 2001 From: Cameron Will Date: Mon, 25 May 2026 19:35:23 -0400 Subject: [PATCH 4/4] style: Fix ruff formatting in mock client Co-Authored-By: Claude Opus 4.6 --- src/meshcore_console/mock/client.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/meshcore_console/mock/client.py b/src/meshcore_console/mock/client.py index 8e0594f..ff0c742 100644 --- a/src/meshcore_console/mock/client.py +++ b/src/meshcore_console/mock/client.py @@ -327,7 +327,9 @@ def logout_from_repeater(self, peer_name: str) -> None: def send_repeater_command(self, peer_name: str, command: str) -> dict: stripped = command.strip().lower() cmd_key = stripped.split()[0] if stripped else "" - response_text = MOCK_CLI_RESPONSES.get(stripped) or MOCK_CLI_RESPONSES.get(cmd_key, f"OK: {command}") + response_text = MOCK_CLI_RESPONSES.get(stripped) or MOCK_CLI_RESPONSES.get( + cmd_key, f"OK: {command}" + ) self._append_event( { "type": EventType.REPEATER_COMMAND_RESPONSE,