from __future__ import annotations from pathlib import Path from typing import Any def project_root() -> Path: return Path(__file__).resolve().parents[2] def resolve_path(path_value: str | Path | None, base: Path | None = None) -> Path | None: if path_value in (None, ""): return None path = Path(path_value).expanduser() if path.is_absolute(): return path return (base or project_root()).joinpath(path).resolve() def ensure_dir(path: str | Path) -> Path: resolved = Path(path) resolved.mkdir(parents=True, exist_ok=True) return resolved def as_posix_str(path: str | Path) -> str: return Path(path).resolve().as_posix() def configured_path(config: dict[str, Any], key: str) -> Path: value = config.get("paths", {}).get(key) resolved = resolve_path(value, project_root()) if resolved is None: raise ValueError(f"Missing required path config: paths.{key}") return resolved