- Add myhermes entrypoint and myagents hermes subcommand - Hermes sessions read from global SQLite store (~/.hermes/state.db) - Default args: --yolo - Update README, AGENTS.md, Makefile, pyproject.toml - Add tests for hermes subcommand, passthrough, and session listing
142 lines
5.5 KiB
Python
142 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][-2:] == ["--resume", "abc123"]
|