The CI test interpreter has no PyYAML, so the new test failed to import there. load_user_config_effective is the presence-sensitive reader the runtime uses.
47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
"""A fresh install's first CLI message reaches the model exactly as typed.
|
|
|
|
The first-contact note (the profile-build offer or the plain intro) is sent by the messaging gateway and
|
|
the TUI/desktop backend. The CLI never sent one. A one-shot ``hermes chat -q`` in a fresh home, which is
|
|
how kanban workers and scripted runs start, must not gain that note or record
|
|
``onboarding.seen.profile_build_offered`` in the profile's config.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from agent.onboarding import PROFILE_BUILD_FLAG, is_seen
|
|
from hermes_cli.config_effective import load_user_config_effective
|
|
from tests.fakes.fake_llm_provider import FakeLLMServer, Text, write_hermes_home
|
|
|
|
ROOT = Path(__file__).parents[2]
|
|
PROMPT = "work kanban task t_1"
|
|
|
|
|
|
def test_first_cli_message_in_a_fresh_home_reaches_the_model_unchanged(tmp_path):
|
|
home = tmp_path / "hermes"
|
|
with FakeLLMServer([Text("done")]) as srv:
|
|
write_hermes_home(
|
|
home, srv.base_url,
|
|
extra_config="updates:\n check: false\nmodels_dev:\n url: http://127.0.0.1:9/api.json\n",
|
|
)
|
|
env = {**os.environ, "HERMES_HOME": str(home), "PYTHONUTF8": "1"}
|
|
env["PYTHONPATH"] = str(ROOT) + os.pathsep + env.get("PYTHONPATH", "")
|
|
for name in ("HERMES_GUEST_ONBOARDING", "HERMES_DESKTOP"):
|
|
env.pop(name, None)
|
|
proc = subprocess.run(
|
|
[sys.executable, "-m", "hermes_cli.main", "chat", "-q", PROMPT],
|
|
cwd=ROOT, env=env, stdin=subprocess.DEVNULL, capture_output=True,
|
|
text=True, encoding="utf-8", timeout=240, check=False,
|
|
)
|
|
requests = srv.main_requests()
|
|
|
|
assert proc.returncode == 0, proc.stderr[-3000:]
|
|
assert requests, f"the model was never called; stderr tail: {proc.stderr[-2000:]}"
|
|
users = [m["content"] for m in requests[0]["messages"] if m.get("role") == "user"]
|
|
assert users == [PROMPT]
|
|
assert not is_seen(load_user_config_effective(home / "config.yaml"), PROFILE_BUILD_FLAG)
|