from __future__ import annotations import os import sys from dataclasses import dataclass, field from pathlib import Path from typing import Callable def _default_logger(msg: str) -> None: print(msg) def _default_err_logger(msg: str) -> None: print(msg, file=sys.stderr) @dataclass(slots=True) class KnoeContext: """Small shared context object for Stage 1 ops modules.""" project_root: Path cfg_path: Path | None = None mode: str = "dev" namespace: str = "default" service_namespace: str = "default" env: dict[str, str] = field(default_factory=lambda: dict(os.environ)) logger: Callable[[str], None] = _default_logger err_logger: Callable[[str], None] = _default_err_logger