cli.py
Language Python4.1 KB80 lines
"""Command-line entry point: one subcommand per pipeline stage."""from __future__ import annotationsimport argparsefrom .audit import cmd_outreach_audit, cmd_outreach_pull_listfrom .baseline import cmd_seed_baselinefrom .census import cmd_reconcile_deals, cmd_refresh_xmlfrom .classify import cmd_classify, cmd_verifyfrom .history import cmd_ingestfrom .roster_workbook import cmd_refresh_workbookfrom .route import cmd_routefrom .stubs import cmd_write_stubsdef main():p = argparse.ArgumentParser(description="Weekly Partner Client Pipeline: one subcommand per stage.")sub = p.add_subparsers(dest="cmd", required=True)s = sub.add_parser("seed-baseline", help="one-time baseline load from the roster workbook")s.add_argument("--sheet", required=True, help="xlsx or csv")s.add_argument("--tab", help="tab name inside an xlsx workbook (default: active tab)")s.add_argument("--as-of", help="date the sheet's totals run through (YYYY-MM-DD): required to write")s.add_argument("--map", action="append", help='override a column: --map "ltv=Total Spend"')s.add_argument("--dry-run", action="store_true", help="show mapping + sample rows, write nothing")s.add_argument("--force", action="store_true", help="replace existing baselines")s.set_defaults(func=cmd_seed_baseline)i = sub.add_parser("ingest", help="merge raw orders.fetch page dump(s) into the history")i.add_argument("--orders", required=True, nargs="+", help="one or more raw JSON page files")i.set_defaults(func=cmd_ingest)c = sub.add_parser("classify", help="compute lifetime metrics from history, classify, export")c.set_defaults(func=cmd_classify)v = sub.add_parser("verify", help="no-shrink guardrail vs previous run (exit 2 on flags)")v.set_defaults(func=cmd_verify)w = sub.add_parser("write-stubs", help="Stage E: create/upgrade stubs (guarded)")w.add_argument("--plan", required=True, help="the .plan.json produced by classify")w.set_defaults(func=cmd_write_stubs)x = sub.add_parser("refresh-xml", help="Stage F: stamp last_modified in XML map (guarded)")x.add_argument("--plan", required=True, help="the .plan.json produced by classify")x.set_defaults(func=cmd_refresh_xml)rd = sub.add_parser("reconcile-deals",help="absorb a Bitrix deals-pull JSON into census blocks + stubs (guarded)")rd.add_argument("--deals", required=True, nargs="+",help="deals JSON file(s): {\"deals\":[{deal_id,cat,stage,title,created}]}")rd.set_defaults(func=cmd_reconcile_deals)rt = sub.add_parser("route",help="compute weekly outreach candidate lists (read-only; artifacts to 05-Outputs)")rt.set_defaults(func=cmd_route)wbk = sub.add_parser("refresh-workbook",help="Stage F2: regenerate the Drive-swap workbook from the latest updated copy (guarded)")wbk.add_argument("--plan", required=True, help="the .plan.json produced by classify")wbk.add_argument("--base", help="base workbook to carry human columns from ""(default: latest 05-Outputs/partner-runs/Complete-Partner-Clients-List_updated-*.xlsx)")wbk.set_defaults(func=cmd_refresh_workbook)opl = sub.add_parser("outreach-pull-list",help="Stage F5a: list the deals whose stage history must be re-pulled this week")opl.add_argument("--deals", required=True, nargs="+",help="weekly enumeration JSON for cats 24/26/36/16")opl.set_defaults(func=cmd_outreach_pull_list)oa = sub.add_parser("outreach-audit",help="Stage F5b: build the per-pipeline outreach audit workbook (read-only)")oa.add_argument("--deals", required=True, nargs="+",help="enumeration JSON where re-pulled deals also carry a \"history\" array")oa.add_argument("--workbook", help="Drive-swap workbook to resolve Plinth identity from ""(default: latest Complete-Partner-Clients-List_updated-*.xlsx)")oa.set_defaults(func=cmd_outreach_audit)args = p.parse_args()args.func(args)