feat(agents): 新增 mydsh 启动器 —— DeepSeek Harness CLI 包装

- launcher _BACKENDS 加 dsh:profile 透传、zstd 会话列表(session/title 或首条用户消息)、
  --resume 透传、DSH_HOME 环境变量与 expanduser
- entrypoints/cli/completion/打包/卸载全触点 + TestDsh 用例(裸跑/版本/透传/列表/缺 bin)
This commit is contained in:
Zhengshou Lai
2026-08-17 19:54:13 +08:00
parent f12cd5fcf1
commit f14c39d7c0
9 changed files with 301 additions and 7 deletions
+44
View File
@@ -9,6 +9,7 @@ from myagents.entrypoints import (
claude_cli,
codex_cli,
cursor_cli,
dsh_cli,
hermes_cli,
kimi_cli,
)
@@ -204,6 +205,49 @@ class TestMycursorEntrypoint:
assert mock_run.call_args[0][0][-2:] == ["--resume", "abc123"]
class TestMydshEntrypoint:
"""``mydsh`` standalone entrypoint."""
def test_runs_dsh(self) -> None:
runner = CliRunner()
with (
patch("myagents.launcher.shutil.which", return_value="/usr/bin/dsh"),
patch("myagents.launcher.subprocess.run") as mock_run,
):
mock_run.return_value = MagicMock(returncode=0)
result = runner.invoke(dsh_cli, [])
assert result.exit_code == 0
# dsh is a profile launcher; no default args are injected.
assert mock_run.call_args[0][0] == ["/usr/bin/dsh"]
def test_version_shows_mydsh(self) -> None:
runner = CliRunner()
result = runner.invoke(dsh_cli, ["--version"])
assert result.exit_code == 0
assert "mydsh" in result.output
def test_passthrough(self, tmp_path: Path) -> None:
"""``--resume <id>`` passes through to the native dsh CLI."""
runner = CliRunner()
with (
patch("myagents.launcher.shutil.which", return_value="/usr/bin/dsh"),
patch("myagents.launcher.subprocess.run") as mock_run,
):
mock_run.return_value = MagicMock(returncode=0)
result = runner.invoke(
dsh_cli, ["--cwd", str(tmp_path), "--resume", "abc123"]
)
assert result.exit_code == 0
assert mock_run.call_args[0][0][-2:] == ["--resume", "abc123"]
def test_missing_binary_exits_127(self) -> None:
runner = CliRunner()
with patch("myagents.launcher.shutil.which", return_value=None):
result = runner.invoke(dsh_cli, [])
assert result.exit_code == 127
assert "dsh CLI not found" in result.output
class TestTmuxOption:
"""``--tmux`` / ``-t`` wraps the backend in an attachable tmux session."""