diff --git a/scripts/cycle_retro.py b/scripts/cycle_retro.py index 77ba9fd..ddfc4c5 100644 --- a/scripts/cycle_retro.py +++ b/scripts/cycle_retro.py @@ -54,6 +54,7 @@ REPO_ROOT = Path(__file__).resolve().parent.parent RETRO_FILE = REPO_ROOT / ".loop" / "retro" / "cycles.jsonl" SUMMARY_FILE = REPO_ROOT / ".loop" / "retro" / "summary.json" EPOCH_COUNTER_FILE = REPO_ROOT / ".loop" / "retro" / ".epoch_counter" +CYCLE_RESULT_FILE = REPO_ROOT / ".loop" / "cycle_result.json" # How many recent entries to include in rolling summary SUMMARY_WINDOW = 50 @@ -246,9 +247,37 @@ def update_summary() -> None: SUMMARY_FILE.write_text(json.dumps(summary, indent=2) + "\n") +def _load_cycle_result() -> dict: + """Read .loop/cycle_result.json if it exists; return empty dict on failure.""" + if not CYCLE_RESULT_FILE.exists(): + return {} + try: + raw = CYCLE_RESULT_FILE.read_text().strip() + # Strip hermes fence markers (```json ... ```) if present + if raw.startswith("```"): + lines = raw.splitlines() + lines = [l for l in lines if not l.startswith("```")] + raw = "\n".join(lines) + return json.loads(raw) + except (json.JSONDecodeError, OSError): + return {} + + def main() -> None: args = parse_args() + # Backfill from cycle_result.json when CLI args have defaults + cr = _load_cycle_result() + if cr: + if args.issue is None and cr.get("issue"): + args.issue = int(cr["issue"]) + if args.type == "unknown" and cr.get("type"): + args.type = cr["type"] + if args.tests_passed == 0 and cr.get("tests_passed"): + args.tests_passed = int(cr["tests_passed"]) + if not args.notes and cr.get("notes"): + args.notes = cr["notes"] + # Auto-detect issue from branch when not explicitly provided if args.issue is None: args.issue = detect_issue_from_branch()