1from __future__ import annotations2import os, yaml3from pathlib import Path4from .provenance import ROOT, expand56def load(name: str) -> dict:7 with open(ROOT / "config" / f"{name}.yaml") as f:8 return yaml.safe_load(f)910def corpus_root() -> Path:11 env = os.environ.get("JOF250_CORPUS_ROOT")12 return expand(env or load("corpus")["corpus_root"])1314def derived_dir() -> Path:15 d = ROOT / load("corpus")["derived_dir"]; d.mkdir(parents=True, exist_ok=True); return d1617def manifests_dir() -> Path:18 d = ROOT / load("corpus")["manifests_dir"]; d.mkdir(parents=True, exist_ok=True); return d1920def api_key() -> str | None:21 """Read key from env or from a key file (never printed)."""22 if os.environ.get("ANTHROPIC_API_KEY"): return os.environ["ANTHROPIC_API_KEY"]23 env_file = ROOT / ".env"24 kf = os.environ.get("JOF250_ANTHROPIC_KEY_FILE")25 if env_file.exists():26 for line in env_file.read_text().splitlines():27 if line.startswith("JOF250_ANTHROPIC_KEY_FILE="): kf = line.split("=",1)[1].strip()28 if line.startswith("ANTHROPIC_API_KEY="): return line.split("=",1)[1].strip()29 if kf and expand(kf).exists():30 for line in expand(kf).read_text().splitlines():31 if line.startswith("ANTHROPIC_API_KEY="): return line.split("=",1)[1].strip()32 return None33