from __future__ import annotations import argparse import json import sys from importlib.util import module_from_spec, spec_from_file_location from pathlib import Path def _load_flow_module(): path = Path(__file__).resolve().parent / "playwright_product_flow.py" spec = spec_from_file_location("playwright_product_flow", path) if spec is None or spec.loader is None: raise RuntimeError(f"Could not load product flow module from {path}") module = module_from_spec(spec) sys.modules[spec.name] = module spec.loader.exec_module(module) return module def main() -> int: parser = argparse.ArgumentParser(description="Canonical Playwright audit for kink_cli product flows.") parser.add_argument( "--scenario", action="append", default=[], help="Scenario name, comma-separated scenario list, or 'all'. Defaults to all scenarios.", ) parser.add_argument("--base-url", default=None, help="App base URL. Defaults to KINK_AUDIT_BASE_URL or http://127.0.0.1:8012.") parser.add_argument("--json-out", default=None, help="Optional path to write a JSON report.") parser.add_argument("--headed", action="store_true", help="Run Playwright in headed mode.") args = parser.parse_args() flow = _load_flow_module() if args.base_url: flow.BASE_URL = args.base_url.rstrip("/") results = flow.run_selected_scenarios(args.scenario or ["all"], headless=not args.headed) payload = flow.results_to_json(results) print(payload["summary"]) if args.json_out: Path(args.json_out).write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8") return 0 if payload["ok"] else 1 if __name__ == "__main__": raise SystemExit(main())