108 lines
4.4 KiB
Python
108 lines
4.4 KiB
Python
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 .flow import install_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']}")
|
|
if "status" in payload:
|
|
print(f"Status: {payload['status']}")
|
|
if "clientConfig" in payload:
|
|
print("Client configuration:")
|
|
print(json.dumps(payload["clientConfig"], ensure_ascii=False, indent=2))
|
|
|
|
|
|
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)
|
|
|
|
install = subparsers.add_parser("install", help="Run the complete guided local installation flow.")
|
|
install.add_argument("--api-base-url", required=True)
|
|
install.add_argument("--env-name", default=DEFAULT_ENV_NAME)
|
|
install.add_argument("--enable-writes", action="store_true")
|
|
install.add_argument("--json", action="store_true", dest="as_json")
|
|
|
|
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 == "install":
|
|
payload = install_project(
|
|
args.project_root,
|
|
args.api_base_url,
|
|
env_name=args.env_name,
|
|
enable_writes=args.enable_writes,
|
|
)
|
|
_print_result(payload, as_json=args.as_json)
|
|
return 0 if payload["ok"] else 1
|
|
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}")
|