"""Weekly retro entrypoint (AGENTIC-WP-0010 T03). python -m session_memory.retro [--window-days 7] [--since D] [--until D] [--publish] [--json] Builds the windowed top-3-per-repo retro over the captured sessions, writes a local JSON + markdown report, and (with ``--publish``) posts it to the hub as the ``coding_retro`` read model that activity-core's weekly schedule consumes. """ from __future__ import annotations import argparse import json import os from ..core.store import Store from ..curate.catalog import Catalog from ..ingest import _expand, load_config from .build import weekly_retro from .publish import publish_to_hub, render_markdown, write_local def run_retro(config: dict, *, window_days=None, since=None, until=None): s = config.get("store", {}) store = Store(_expand(s["db_path"]), _expand(s["blob_dir"])) digests = store.list_digests() store.close() cur = config.get("curate", {}) catalog = Catalog(_expand(cur.get("catalog_dir", "session_memory/catalog"))) rcfg = config.get("retro", {}) return weekly_retro(digests, catalog, since=since, until=until, window_days=window_days or rcfg.get("window_days", 7)) def main(argv=None) -> int: here = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ap = argparse.ArgumentParser(description="Build (and optionally publish) the weekly coding retro.") ap.add_argument("--config", default=os.path.join(here, "config.toml")) ap.add_argument("--window-days", type=int, default=None) ap.add_argument("--since", default=None) ap.add_argument("--until", default=None) ap.add_argument("--publish", action="store_true", help="post to the hub coding_retro read model") ap.add_argument("--json", action="store_true") args = ap.parse_args(argv) config = load_config(args.config) report = run_retro(config, window_days=args.window_days, since=args.since, until=args.until) rcfg = config.get("retro", {}) write_local(report, _expand(rcfg.get("report_json", "session_memory/retro/last_retro.json")), _expand(rcfg.get("report_md", "session_memory/retro/last_retro.md"))) published = None if args.publish: published = publish_to_hub(report, base_url=rcfg.get("hub_url", "http://127.0.0.1:8000")) if args.json: print(json.dumps({"report": report, "published": published}, indent=2)) else: print(render_markdown(report)) if args.publish: print(f"\npublished to hub: {published}") return 0 if __name__ == "__main__": raise SystemExit(main())