from __future__ import annotations from .auth import connect_with_personal_key from .common import ( DEFAULT_ENV_NAME, Any, InstallerError, Path, Sequence, argparse, json, ) from .diagnostics import doctor_project from .project import inspect_project, prepare_project, render_client_config, set_config_env def _print_result(payload: dict[str, Any], *, as_json: bool) -> None: if as_json: print(json.dumps(payload, ensure_ascii=False, indent=2)) return print(f"Overall: {'ready' if payload.get('ok') else 'action required'}") if "projectRoot" in payload: print(f"Project root: {payload['projectRoot']}") for check in payload.get("checks", []): marker = "PASS" if check["ok"] else ("FAIL" if check["required"] else "INFO") print(f"[{marker}] {check['name']}: {check['detail']}") def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="Prepare and inspect an agent-guided NocoBase CRM MCP installation.") parser.add_argument("--project-root", type=Path, default=None) subparsers = parser.add_subparsers(dest="command", required=True) for name in ("inspect", "prepare", "doctor"): command = subparsers.add_parser(name) command.add_argument("--json", action="store_true", dest="as_json") set_env = subparsers.add_parser("set-env") set_env.add_argument("env_name") set_env.add_argument("--json", action="store_true", dest="as_json") connect_key = subparsers.add_parser("connect-key") connect_key.add_argument("--api-base-url", required=True) connect_key.add_argument("--env-name", default=DEFAULT_ENV_NAME) connect_key.add_argument("--json", action="store_true", dest="as_json") client_config = subparsers.add_parser("client-config") client_config.add_argument("--enable-writes", action="store_true") return parser def main(argv: Sequence[str] | None = None) -> int: parser = build_parser() args = parser.parse_args(argv) try: if args.command == "inspect": payload = inspect_project(args.project_root) _print_result(payload, as_json=args.as_json) return 0 if payload["ok"] else 1 if args.command == "prepare": payload = prepare_project(args.project_root) _print_result(payload, as_json=args.as_json) return 0 if args.command == "set-env": payload = set_config_env(args.project_root, args.env_name) _print_result(payload, as_json=args.as_json) return 0 if args.command == "connect-key": payload = connect_with_personal_key( args.project_root, args.api_base_url, env_name=args.env_name, ) _print_result(payload, as_json=args.as_json) return 0 if args.command == "client-config": print(json.dumps(render_client_config(args.project_root, enable_writes=args.enable_writes), indent=2)) return 0 if args.command == "doctor": payload = doctor_project(args.project_root) _print_result(payload, as_json=args.as_json) return 0 if payload["ok"] else 1 except InstallerError as error: print(json.dumps({"ok": False, "error": {"code": "install_step_failed", "message": str(error)}})) return 1 raise AssertionError(f"Unhandled command: {args.command}")