53 lines
1.4 KiB
Python
53 lines
1.4 KiB
Python
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"]
|