- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환 - Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용 - pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관) - worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md) - D:\Rhino-MCP 경로 참조를 새 위치로 치환 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
32 lines
1.3 KiB
Python
32 lines
1.3 KiB
Python
"""CLI: write the review report draft (.md + .pdf + report_check.json) for a pier run folder.
|
|
|
|
usage: python make_report.py <pier data dir> [<run dir>] [--author 이름]
|
|
run dir defaults to <pier data dir>/runs/current. Gates whose recorded inputs hash differs from the current
|
|
params/expected are reported as void (same rule as the web app).
|
|
"""
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
APP = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(APP))
|
|
sys.path.insert(0, str(APP / "web"))
|
|
from engine import report_files # noqa: E402
|
|
from engine.pipeline import gate_ids # noqa: E402
|
|
import store # noqa: E402
|
|
|
|
if __name__ == "__main__":
|
|
ap = argparse.ArgumentParser()
|
|
ap.add_argument("pier")
|
|
ap.add_argument("run", nargs="?")
|
|
ap.add_argument("--author", default="")
|
|
a = ap.parse_args()
|
|
pier = Path(a.pier).resolve()
|
|
run = Path(a.run).resolve() if a.run else pier / "runs" / "current"
|
|
cur = store.sha([store.rjson(pier / "params.json"), store.rjson(pier / "expected.json")])
|
|
stale = {g for g in gate_ids()
|
|
if (rep := store.rjson(run / f"{g}_gate.json")) and rep.get("inputs_sha") not in (None, cur)}
|
|
out = report_files.write(pier, run, a.author, stale)
|
|
print(out["md"], "\n", out["pdf"], "\n", out["check"])
|
|
sys.exit(0 if out["check"]["ok"] else 1)
|