test(opencode): add adapter contract, TUI readiness, and lifecycle integration tests
This commit is contained in:
@@ -1225,3 +1225,54 @@ def test_comp_reconcile_drift_b_populates_workspace_and_server(mam_sandbox, mock
|
||||
assert s["herdr_workspace"] != ""
|
||||
assert s["herdr_workspace"] != "-"
|
||||
|
||||
|
||||
def test_comp_opencode_create_and_reconcile_and_stop(mam_sandbox, mock_herdr, mock_agents):
|
||||
"""Verify create_session -> reconcile drift-C materialization -> stop flow for opencode."""
|
||||
create_script = mam_sandbox / ".agents" / "skills" / "multi-agent-mux-create" / "scripts" / "create_session.sh"
|
||||
res = subprocess.run([
|
||||
"bash", str(create_script),
|
||||
"--workspace", str(mam_sandbox),
|
||||
"--agent", "opencode",
|
||||
"--role", "creator"
|
||||
], capture_output=True, text=True, cwd=str(mam_sandbox))
|
||||
assert res.returncode == 0, res.stderr
|
||||
|
||||
yaml_path = mam_sandbox / ".mam" / "agent-sessions.yaml"
|
||||
import yaml
|
||||
with open(yaml_path) as f:
|
||||
data = yaml.safe_load(f)
|
||||
sessions = data.get("herdr_sessions", [])
|
||||
assert len(sessions) == 1
|
||||
s = sessions[0]
|
||||
session_name = s["name"]
|
||||
assert s["status"] == "running"
|
||||
assert s["opencode_session_id_own"] is None
|
||||
assert s["session_id_source"] == "pending-discovery"
|
||||
|
||||
# Run reconcile.sh to trigger drift-C materialization
|
||||
reconcile_script = mam_sandbox / ".agents" / "skills" / "multi-agent-mux-monitor" / "scripts" / "reconcile.sh"
|
||||
res_rec = subprocess.run(["bash", str(reconcile_script), "--once", "--emit-diff"], capture_output=True, text=True, cwd=str(mam_sandbox), env={**os.environ, "WORKSPACE_ROOT": str(mam_sandbox)})
|
||||
assert res_rec.returncode == 0, res_rec.stderr
|
||||
|
||||
with open(yaml_path) as f:
|
||||
data_after = yaml.safe_load(f)
|
||||
s_after = [x for x in data_after.get("herdr_sessions", []) if x.get("name") == session_name][0]
|
||||
assert s_after.get("opencode_session_id_own") is not None
|
||||
assert s_after.get("last_visible_status") in ("pinned", "resume_verified")
|
||||
|
||||
# Stop session
|
||||
stop_script = mam_sandbox / ".agents" / "skills" / "multi-agent-mux-stop" / "scripts" / "stop_session.sh"
|
||||
res_stop = subprocess.run([
|
||||
"bash", str(stop_script),
|
||||
"--session", session_name,
|
||||
"--agent", "opencode"
|
||||
], capture_output=True, text=True, cwd=str(mam_sandbox))
|
||||
assert res_stop.returncode == 0, res_stop.stderr
|
||||
|
||||
with open(yaml_path) as f:
|
||||
data_stopped = yaml.safe_load(f)
|
||||
s_stopped = [x for x in data_stopped.get("herdr_sessions", []) if x.get("name") == session_name][0]
|
||||
assert s_stopped["status"] == "stopped"
|
||||
assert s_stopped["resumable"] is True
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user