Hermes -r/--resume requires a session id and has no -c shorthand, so bare 'myhermes -r' failed with an argparse error. Translate myagents-style flags like the codex backend: - bare -r/--resume -> 'hermes sessions browse' (interactive picker) - -r/--resume <id> -> '--resume <id> --no-restore-cwd' - -c/--continue/--last -> '--continue --no-restore-cwd' --no-restore-cwd keeps resumed sessions in the launch cwd, matching myclaude semantics instead of jumping to the session's original cwd.
146 lines
5.5 KiB
Python
146 lines
5.5 KiB
Python
"""Tests for standalone myclaude / mykimi / mycodex / myhermes entrypoints."""
|
|
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from click.testing import CliRunner
|
|
|
|
from myagents.entrypoints import claude_cli, codex_cli, hermes_cli, kimi_cli
|
|
|
|
|
|
class TestMyclaudeEntrypoint:
|
|
"""``myclaude`` standalone entrypoint."""
|
|
|
|
def test_runs_claude(self) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/claude"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(claude_cli, [])
|
|
assert result.exit_code == 0
|
|
assert mock_run.call_args[0][0] == [
|
|
"/usr/bin/claude",
|
|
"--dangerously-skip-permissions",
|
|
]
|
|
|
|
def test_version_shows_myclaude(self) -> None:
|
|
runner = CliRunner()
|
|
result = runner.invoke(claude_cli, ["--version"])
|
|
assert result.exit_code == 0
|
|
assert "myclaude" in result.output
|
|
|
|
def test_passthrough(self, tmp_path: Path) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/claude"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(claude_cli, ["--cwd", str(tmp_path), "--resume"])
|
|
assert result.exit_code == 0
|
|
assert "--resume" in mock_run.call_args[0][0]
|
|
|
|
|
|
class TestMykimiEntrypoint:
|
|
"""``mykimi`` standalone entrypoint."""
|
|
|
|
def test_runs_kimi(self) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/kimi"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(kimi_cli, [])
|
|
assert result.exit_code == 0
|
|
assert mock_run.call_args[0][0] == ["/usr/bin/kimi"]
|
|
|
|
def test_version_shows_mykimi(self) -> None:
|
|
runner = CliRunner()
|
|
result = runner.invoke(kimi_cli, ["--version"])
|
|
assert result.exit_code == 0
|
|
assert "mykimi" in result.output
|
|
|
|
def test_passthrough(self, tmp_path: Path) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/kimi"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(kimi_cli, ["--cwd", str(tmp_path), "--resume"])
|
|
assert result.exit_code == 0
|
|
assert "--resume" in mock_run.call_args[0][0]
|
|
|
|
|
|
class TestMycodexEntrypoint:
|
|
"""``mycodex`` standalone entrypoint."""
|
|
|
|
def test_runs_codex(self) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/codex"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(codex_cli, [])
|
|
assert result.exit_code == 0
|
|
assert mock_run.call_args[0][0] == ["/usr/bin/codex", "--dangerously-bypass-approvals-and-sandbox"]
|
|
|
|
def test_version_shows_mycodex(self) -> None:
|
|
runner = CliRunner()
|
|
result = runner.invoke(codex_cli, ["--version"])
|
|
assert result.exit_code == 0
|
|
assert "mycodex" in result.output
|
|
|
|
def test_passthrough(self, tmp_path: Path) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/codex"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(codex_cli, ["--cwd", str(tmp_path), "-r", "abc123"])
|
|
assert result.exit_code == 0
|
|
assert mock_run.call_args[0][0] == ["/usr/bin/codex", "--dangerously-bypass-approvals-and-sandbox", "resume", "abc123"]
|
|
|
|
|
|
class TestMyhermesEntrypoint:
|
|
"""``myhermes`` standalone entrypoint."""
|
|
|
|
def test_runs_hermes(self) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/hermes"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(hermes_cli, [])
|
|
assert result.exit_code == 0
|
|
assert mock_run.call_args[0][0] == ["/usr/bin/hermes", "--yolo"]
|
|
|
|
def test_version_shows_myhermes(self) -> None:
|
|
runner = CliRunner()
|
|
result = runner.invoke(hermes_cli, ["--version"])
|
|
assert result.exit_code == 0
|
|
assert "myhermes" in result.output
|
|
|
|
def test_passthrough(self, tmp_path: Path) -> None:
|
|
runner = CliRunner()
|
|
with (
|
|
patch("myagents.launcher.shutil.which", return_value="/usr/bin/hermes"),
|
|
patch("myagents.launcher.subprocess.run") as mock_run,
|
|
):
|
|
mock_run.return_value = MagicMock(returncode=0)
|
|
result = runner.invoke(
|
|
hermes_cli, ["--cwd", str(tmp_path), "--resume", "abc123"]
|
|
)
|
|
assert result.exit_code == 0
|
|
assert mock_run.call_args[0][0][-3:] == [
|
|
"--resume",
|
|
"abc123",
|
|
"--no-restore-cwd",
|
|
]
|