from __future__ import annotations import os from pathlib import Path from dotenv import load_dotenv PROJECT_ROOT = Path(__file__).resolve().parent PROJECT_ENV_FILE = PROJECT_ROOT / ".env" _RUNTIME_PATH_DEFAULTS = { "CONTEXT_DIR": Path("data/contexts"), "SKETCH_DIR": Path("data/sketches"), "LOG_DIR": Path("agent_logs"), } def _workspace_runtime_path(path_value: str | Path) -> str: """Resolve runtime output paths into the project workspace.""" path = Path(path_value).expanduser() if path.is_absolute(): return str(path) parts = path.parts if parts and parts[0] == "workspace": return str((PROJECT_ROOT / path).resolve()) return str((PROJECT_ROOT / "workspace" / path).resolve()) def _normalize_runtime_path_env() -> None: """Keep runtime data, sketch, and log directories out of the repository root.""" for env_name, default_relative_path in _RUNTIME_PATH_DEFAULTS.items(): raw_value = os.getenv(env_name) os.environ[env_name] = _workspace_runtime_path( raw_value if raw_value else default_relative_path ) def load_project_env() -> None: """Load the project .env before importing libraries that snapshot env at import time.""" load_dotenv(PROJECT_ENV_FILE, override=False) _normalize_runtime_path_env() load_project_env() __all__ = ["load_project_env", "PROJECT_ROOT", "PROJECT_ENV_FILE"]