76 lines
2.1 KiB
Python
76 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Minimal owner-report consumer.
|
|
|
|
Reads a pending owner report markdown file with simple front-matter-like key/value
|
|
lines and emits normalized JSON to stdout.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
|
|
OWNER_REPORT_ROOT = Path.home() / ".clawteam" / "owner-reports"
|
|
PENDING_DIR = OWNER_REPORT_ROOT / "pending"
|
|
|
|
|
|
def parse_pending_report(path: Path) -> dict:
|
|
raw = path.read_text(encoding="utf-8")
|
|
data: dict[str, str] = {}
|
|
for line in raw.splitlines():
|
|
line = line.strip()
|
|
if not line or ":" not in line:
|
|
continue
|
|
key, value = line.split(":", 1)
|
|
data[key.strip()] = value.strip()
|
|
|
|
return {
|
|
"ok": True,
|
|
"path": str(path),
|
|
"filename": path.name,
|
|
"report_id": data.get("report_id") or path.stem,
|
|
"team": data.get("team"),
|
|
"source": data.get("source"),
|
|
"report_kind": data.get("report_kind") or "checkpoint",
|
|
"created_at": data.get("created_at"),
|
|
"message": _unquote(data.get("message", "")),
|
|
"raw": data,
|
|
}
|
|
|
|
|
|
def _unquote(value: str) -> str:
|
|
value = value.strip()
|
|
if len(value) >= 2 and value[0] == '"' and value[-1] == '"':
|
|
return value[1:-1]
|
|
return value
|
|
|
|
|
|
def resolve_input(name_or_path: str) -> Path:
|
|
p = Path(name_or_path).expanduser()
|
|
if p.exists():
|
|
return p
|
|
candidate = PENDING_DIR / name_or_path
|
|
if candidate.exists():
|
|
return candidate
|
|
if not candidate.suffix:
|
|
md_candidate = candidate.with_suffix(".md")
|
|
if md_candidate.exists():
|
|
return md_candidate
|
|
raise FileNotFoundError(f"pending report not found: {name_or_path}")
|
|
|
|
|
|
def main() -> int:
|
|
ap = argparse.ArgumentParser(description="Emit JSON for a pending owner report")
|
|
ap.add_argument("report", help="Pending report path, filename, or report_id")
|
|
args = ap.parse_args()
|
|
|
|
path = resolve_input(args.report)
|
|
payload = parse_pending_report(path)
|
|
print(json.dumps(payload, ensure_ascii=False, indent=2))
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|