81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Render 1C patch preflight JSON as Markdown."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
def load_json(path: Path) -> dict[str, Any]:
|
|
return json.loads(path.read_text(encoding="utf-8-sig"))
|
|
|
|
|
|
def line(text: str = "") -> str:
|
|
return text.rstrip() + "\n"
|
|
|
|
|
|
def bullet(text: str) -> str:
|
|
return f"- {text}\n"
|
|
|
|
|
|
def render_gate(gate: dict[str, Any]) -> str:
|
|
counts = gate.get("counts") or {}
|
|
summary = ", ".join(f"{key}={value}" for key, value in counts.items())
|
|
return bullet(f"`{gate.get('name')}` passed=`{gate.get('passed')}` {summary}")
|
|
|
|
|
|
def render(data: dict[str, Any]) -> str:
|
|
out = ""
|
|
out += line("# 1C Patch Preflight")
|
|
out += line()
|
|
out += line(f"Workspace: `{data.get('workspace')}`")
|
|
out += line(f"Status: `{data.get('status')}`")
|
|
out += line(f"Passed: `{data.get('passed')}`")
|
|
out += line()
|
|
out += line("## Gates")
|
|
for gate in data.get("gates") or []:
|
|
out += render_gate(gate)
|
|
out += line()
|
|
out += line("## Diff")
|
|
diff = data.get("diff_summary") or {}
|
|
for key in ("files", "modified", "unchanged", "missing", "added_lines", "removed_lines", "hunks"):
|
|
out += bullet(f"{key}: `{diff.get(key)}`")
|
|
out += line()
|
|
out += line("## Next Actions")
|
|
for action in data.get("next_actions") or []:
|
|
out += bullet(action)
|
|
findings = []
|
|
for detail_name in ("safety", "integrity", "freshness", "semantic", "diff"):
|
|
detail = (data.get("details") or {}).get(detail_name) or {}
|
|
for finding in detail.get("findings") or []:
|
|
findings.append((detail_name, finding))
|
|
if findings:
|
|
out += line()
|
|
out += line("## Findings")
|
|
for gate, finding in findings:
|
|
out += bullet(f"`{gate}` {finding.get('severity')} `{finding.get('code')}` - {finding.get('message')}")
|
|
return out
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description="Render 1C patch preflight Markdown.")
|
|
parser.add_argument("--preflight", type=Path, required=True)
|
|
parser.add_argument("--output", type=Path)
|
|
args = parser.parse_args()
|
|
|
|
markdown = render(load_json(args.preflight))
|
|
if args.output:
|
|
args.output.parent.mkdir(parents=True, exist_ok=True)
|
|
args.output.write_text(markdown, encoding="utf-8")
|
|
print(json.dumps({"output": str(args.output)}, ensure_ascii=False))
|
|
else:
|
|
print(markdown)
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|