"""Command-line entry points (CLAUDE.md ยง4.1). Usage: python -m intraday_fragility.cli probe-data python -m intraday_fragility.cli download --start 1992-01 --end 2026-03 [--dry-run] [--shard k/n] python -m intraday_fragility.cli verify-download python -m intraday_fragility.cli audit-raw """ from __future__ import annotations import argparse import json import sys def cmd_probe(args: argparse.Namespace) -> int: from huggingface_hub import HfApi from . import paths cfg = paths.base_config()["dataset"] info = HfApi().dataset_info(cfg["id"], revision=cfg["revision"], files_metadata=True) pq = [s for s in info.siblings if s.rfilename.endswith(".parquet")] print(json.dumps({ "dataset": cfg["id"], "revision": cfg["revision"], "n_parquet": len(pq), "total_gb": round(sum(s.size or 0 for s in pq) / 1e9, 2), "first": min(s.rfilename for s in pq), "last": max(s.rfilename for s in pq), }, indent=1)) return 0 def cmd_download(args: argparse.Namespace) -> int: from .download import download download(args.start, args.end, dry_run=args.dry_run, shard=args.shard) return 0 def cmd_verify(args: argparse.Namespace) -> int: from .download import verify return 0 if verify(args.start, args.end) else 1 def cmd_audit_raw(args: argparse.Namespace) -> int: from . import paths from .manifest import Manifest from .schema import file_audit_summary, validate_schema man = Manifest(paths.get("manifests") / "raw_files.json") failures = 0 for rec in sorted(man.records.values(), key=lambda r: (r.year, r.month)): if rec.status != "complete": continue p = paths.repo_root() / rec.local_path problems = validate_schema(p) if problems: print(f"{rec.remote_path}: SCHEMA PROBLEMS {problems}", file=sys.stderr) failures += 1 continue summary = file_audit_summary(p) for k, v in summary.items(): if hasattr(rec, k): setattr(rec, k, v) man.upsert(rec) man.save() man.export_tabular() print(f"audit complete; {failures} schema failures") return 1 if failures else 0 def main() -> int: ap = argparse.ArgumentParser(prog="ifrag") sub = ap.add_subparsers(dest="cmd", required=True) sub.add_parser("probe-data").set_defaults(fn=cmd_probe) d = sub.add_parser("download") d.add_argument("--start", default="1992-01") d.add_argument("--end", default="2026-03") d.add_argument("--dry-run", action="store_true") d.add_argument("--shard", default=None, help="k/n node sharding") d.set_defaults(fn=cmd_download) v = sub.add_parser("verify-download") v.add_argument("--start", default="1992-01") v.add_argument("--end", default="2026-03") v.set_defaults(fn=cmd_verify) sub.add_parser("audit-raw").set_defaults(fn=cmd_audit_raw) args = ap.parse_args() return args.fn(args) if __name__ == "__main__": raise SystemExit(main())