"""Tests for the CLI `/reasoning full` / `/reasoning clamp` recap toggle. The post-response "Reasoning" recap box clamps long thinking to the first 10 lines. `/reasoning full` opts into uncapped display (Taelin's "show all thinking tokens" ask); `/reasoning clamp` restores the 10-line collapse. These assert the toggle sets the instance flag, persists to config.yaml, and that the clamp gate honours the flag. """ import hermes_yaml as yaml from hermes_cli.cli_commands_mixin import CLICommandsMixin class _Stub(CLICommandsMixin): """Minimal carrier for the attributes `_handle_reasoning_command` reads.""" def __init__(self): self.reasoning_config = None self.show_reasoning = True self.reasoning_full = False self.agent = None def _current_reasoning_callback(self): return None def _seed_config(tmp_path, monkeypatch): hh = tmp_path / ".hermes" hh.mkdir() (hh / "config.yaml").write_text("display:\n show_reasoning: true\n") monkeypatch.setenv("HERMES_HOME", str(hh)) # cli captures _hermes_home at import; force it to the temp home. import cli monkeypatch.setattr(cli, "_hermes_home", hh, raising=False) return hh def test_reasoning_full_sets_and_persists(tmp_path, monkeypatch): hh = _seed_config(tmp_path, monkeypatch) s = _Stub() s._handle_reasoning_command("/reasoning full") assert s.reasoning_full is True saved = yaml.safe_load((hh / "config.yaml").read_text()) assert saved["display"]["reasoning_full"] is True