mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-09 08:21:50 +00:00
fix(cli): tolerate stale dashboard --tui from old desktop shells
Older Hermes desktop app shells (<= 0.15.x) spawn the backend as
`hermes dashboard --no-open --tui --host ... --port ...`. The --tui flag
was removed from the dashboard subcommand in cae6b5486 (embedded chat is
always on now).
When a user's CLI updates past that commit but their desktop app binary
has not, argparse hard-errored with 'unrecognized arguments: --tui' and
exit(2). The backend died before becoming ready and the desktop GUI showed
only 'Hermes couldn't start' with no actionable cause — a confusing brick
for anyone whose app and CLI versions drift apart across an update.
Add a hidden, deprecated, accepted-and-ignored --tui flag to the dashboard
subparser so an old app shell + new CLI degrades gracefully. Hidden from
--help via argparse.SUPPRESS so we don't re-advertise a removed feature.
Safe to delete once the floor app version is well past 0.16.0.
Adds tests/hermes_cli/test_dashboard_tui_backcompat.py pinning: the flag
parses without error, stays hidden from --help, and the modern (no --tui)
invocation is unaffected.
This commit is contained in:
parent
7cf7300a07
commit
2820d87ea5
2 changed files with 97 additions and 0 deletions
|
|
@ -15738,6 +15738,21 @@ Examples:
|
|||
action="store_true",
|
||||
help="List running hermes dashboard processes and exit",
|
||||
)
|
||||
# Backward-compat shim: older Hermes desktop app shells (<= 0.15.x) spawn the
|
||||
# backend as `hermes dashboard --no-open --tui --host ... --port ...`. The
|
||||
# `--tui` flag was removed from this subcommand in cae6b5486 (embedded chat is
|
||||
# always on now). When a user's CLI updates past that commit but their desktop
|
||||
# app binary has not, argparse used to hard-error with "unrecognized arguments:
|
||||
# --tui" and exit(2) — the backend died before becoming ready and the GUI just
|
||||
# showed "Hermes couldn't start" with no actionable cause. Accept and silently
|
||||
# ignore the flag so an old app + new CLI degrades gracefully instead of
|
||||
# bricking. Hidden from --help; safe to delete once the floor app version is
|
||||
# well past 0.16.0.
|
||||
dashboard_parser.add_argument(
|
||||
"--tui",
|
||||
action="store_true",
|
||||
help=argparse.SUPPRESS,
|
||||
)
|
||||
dashboard_parser.set_defaults(func=cmd_dashboard)
|
||||
|
||||
# `hermes dashboard register` — register a self-hosted dashboard OAuth
|
||||
|
|
|
|||
82
tests/hermes_cli/test_dashboard_tui_backcompat.py
Normal file
82
tests/hermes_cli/test_dashboard_tui_backcompat.py
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
"""Regression test: `hermes dashboard --tui` must not hard-crash.
|
||||
|
||||
Older Hermes desktop app shells (<= 0.15.x) spawn the backend as::
|
||||
|
||||
hermes dashboard --no-open --tui --host 127.0.0.1 --port <PORT>
|
||||
|
||||
The ``--tui`` flag was removed from the ``dashboard`` subcommand in cae6b5486
|
||||
(embedded chat is always on now). When a user's CLI updates past that commit
|
||||
but their desktop app binary has not, argparse used to reject the unknown flag
|
||||
with ``error: unrecognized arguments: --tui`` and ``exit(2)`` — the backend
|
||||
died before it became ready and the desktop GUI showed only "Hermes couldn't
|
||||
start" with no actionable cause.
|
||||
|
||||
The fix adds a hidden, deprecated, accepted-and-ignored ``--tui`` flag to the
|
||||
dashboard subparser so an old app shell + new CLI degrades gracefully instead
|
||||
of bricking. These tests pin that contract.
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
REPO_ROOT = os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
|
||||
)
|
||||
|
||||
|
||||
def _run_cli(args, timeout=60):
|
||||
"""Invoke the real hermes_cli.main parser in a subprocess.
|
||||
|
||||
Uses ``--status`` so the dashboard command exits immediately after parsing
|
||||
(it scans the process table and returns) instead of starting a server.
|
||||
Returns the CompletedProcess.
|
||||
"""
|
||||
env = dict(os.environ)
|
||||
env["PYTHONPATH"] = REPO_ROOT + os.pathsep + env.get("PYTHONPATH", "")
|
||||
return subprocess.run(
|
||||
[sys.executable, "-m", "hermes_cli.main", *args],
|
||||
cwd=REPO_ROOT,
|
||||
env=env,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout,
|
||||
)
|
||||
|
||||
|
||||
def test_dashboard_tui_flag_is_accepted_not_rejected():
|
||||
"""The exact argv an old desktop app sends must parse without argparse error."""
|
||||
result = _run_cli(
|
||||
["dashboard", "--no-open", "--tui", "--host", "127.0.0.1",
|
||||
"--port", "39997", "--status"]
|
||||
)
|
||||
combined = (result.stdout or "") + (result.stderr or "")
|
||||
# The pre-fix failure signature.
|
||||
assert "unrecognized arguments" not in combined, combined
|
||||
assert "--tui" not in (result.stderr or ""), result.stderr
|
||||
# argparse usage errors exit 2; the parse itself must not be that error.
|
||||
assert result.returncode != 2, combined
|
||||
|
||||
|
||||
def test_dashboard_tui_flag_is_hidden_from_help():
|
||||
"""The deprecated shim must not re-advertise a removed feature in --help."""
|
||||
result = _run_cli(["dashboard", "--help"])
|
||||
combined = (result.stdout or "") + (result.stderr or "")
|
||||
assert result.returncode == 0, combined
|
||||
assert "--tui" not in combined, (
|
||||
"dashboard --tui is a deprecated back-compat shim and must stay "
|
||||
"hidden via argparse.SUPPRESS:\n" + combined
|
||||
)
|
||||
|
||||
|
||||
def test_dashboard_without_tui_still_parses():
|
||||
"""Sanity: the modern (no --tui) invocation is unaffected by the shim."""
|
||||
result = _run_cli(
|
||||
["dashboard", "--no-open", "--host", "127.0.0.1",
|
||||
"--port", "39996", "--status"]
|
||||
)
|
||||
combined = (result.stdout or "") + (result.stderr or "")
|
||||
assert "unrecognized arguments" not in combined, combined
|
||||
assert result.returncode != 2, combined
|
||||
Loading…
Add table
Add a link
Reference in a new issue