from __future__ import annotations import json from datetime import datetime, timezone from pathlib import Path from typing import Any def utc_now_iso() -> str: return datetime.now(timezone.utc).replace(microsecond=0).isoformat() def read_json(path: Path) -> dict[str, Any]: return json.loads(path.read_text(encoding="utf-8")) def write_json(path: Path, data: dict[str, Any]) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text( json.dumps( data, ensure_ascii=False, indent=2, default=lambda value: value.isoformat() if isinstance(value, datetime) else str(value), ) + "\n", encoding="utf-8", )