mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-27 14:17:10 -04:00
Centralize Docker / CI e2e test helpers so per-command suites can be declarative and future commands (install, wrap, ...) can reuse the same shim/PATH/assertion primitives without duplicating infrastructure. The harness provides: * Case dataclass describing one test as argv + shims + expected exit / stdout / stderr / files / custom callbacks * make_shim() factory producing cross-platform executable shims (.sh on POSIX, .cmd on Windows) with noop / fail / record-args behaviors * with_clean_path() context manager that isolates PATH to a minimal known-good value plus any extras supplied by the case * agent_settings_path() locator mirroring headroom.cli.init so tests can assert the right file was written without touching private init state * run_cases() for independent cases and run_case_sequence() for cases that must share scratch state (e.g. manifest-merge scenarios) Shell / PowerShell shim-creation scripts are also shipped for CI steps that need to drop a shim without spinning up Python first. No behavior change in this commit - pure infrastructure. The init suite and new subcommand suites consume the harness in follow-up commits. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""Per-agent settings-file locators for e2e assertions.
|
|
|
|
These paths mirror the logic in ``headroom.cli.init`` so e2e tests can
|
|
verify that the right file was written without importing private init
|
|
helpers.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Literal
|
|
|
|
Agent = Literal["claude", "codex", "copilot", "openclaw"]
|
|
Scope = Literal["user", "local"]
|
|
|
|
|
|
def agent_settings_path(agent: Agent, *, scope: Scope, home: Path, project: Path) -> Path:
|
|
"""Return the file that ``headroom init`` should have written for ``agent``.
|
|
|
|
``home`` is the test's simulated HOME directory and ``project`` is the cwd
|
|
used when invoking ``headroom init``. For global (``-g``) invocations only
|
|
``home`` matters; for local invocations only ``project`` matters.
|
|
"""
|
|
|
|
home = Path(home)
|
|
project = Path(project)
|
|
|
|
if agent == "claude":
|
|
if scope == "user":
|
|
return home / ".claude" / "settings.json"
|
|
return project / ".claude" / "settings.local.json"
|
|
|
|
if agent == "codex":
|
|
if scope == "user":
|
|
return home / ".codex" / "config.toml"
|
|
return project / ".codex" / "config.toml"
|
|
|
|
if agent == "copilot":
|
|
# Copilot init requires -g; no local scope.
|
|
return home / ".copilot" / "config.json"
|
|
|
|
if agent == "openclaw":
|
|
# OpenClaw init is delegated to `headroom wrap openclaw`; it writes
|
|
# the openclaw json under $HOME.
|
|
return home / ".openclaw" / "openclaw.json"
|
|
|
|
raise ValueError(f"Unknown agent: {agent!r}")
|