"""Tests for the /plan CLI slash command.""" from unittest.mock import MagicMock, patch from agent.skill_commands import scan_skill_commands from cli import HermesCLI def _make_cli(): cli_obj = HermesCLI.__new__(HermesCLI) cli_obj.config = {} cli_obj.console = MagicMock() cli_obj.agent = None cli_obj.conversation_history = [] cli_obj.session_id = "sess-123" cli_obj._pending_input = MagicMock() return cli_obj def _make_plan_skill(skills_dir): skill_dir = skills_dir / "plan" skill_dir.mkdir(parents=True, exist_ok=True) (skill_dir / "SKILL.md").write_text( """--- name: plan description: Plan mode skill. --- # Plan Use the current conversation context when no explicit instruction is provided. Save plans under the active workspace's .hermes/plans directory. """ ) class TestCLIPlanCommand: def test_plan_command_queues_plan_skill_message(self, tmp_path, monkeypatch): cli_obj = _make_cli() with patch("tools.skills_tool.SKILLS_DIR", tmp_path): _make_plan_skill(tmp_path) scan_skill_commands() result = cli_obj.process_command("/plan Add OAuth login") assert result is True cli_obj._pending_input.put.assert_called_once() queued = cli_obj._pending_input.put.call_args[0][0] assert "Plan mode skill" in queued assert "Add OAuth login" in queued assert ".hermes/plans" in queued assert str(tmp_path / "plans") not in queued assert "active workspace/backend cwd" in queued assert "Runtime note:" in queued def test_plan_without_args_uses_skill_context_guidance(self, tmp_path, monkeypatch): cli_obj = _make_cli() with patch("tools.skills_tool.SKILLS_DIR", tmp_path): _make_plan_skill(tmp_path) scan_skill_commands() cli_obj.process_command("/plan") queued = cli_obj._pending_input.put.call_args[0][0] assert "current conversation context" in queued assert ".hermes/plans/" in queued assert "conversation-plan.md" in queued