File size: 3,544 Bytes
40c0886
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"""Command-line entry point for the unity_agent package.

Usage::

    python -m unity_agent generate --game OpenWorldCity --preset open_world_city
    python -m unity_agent list-tools
    python -m unity_agent qa examples/open_world_city

Run ``python -m unity_agent --help`` for the full list of commands.
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from unity_agent.config import Settings
from unity_agent.transport.unity_transport import UnityTransport
from unity_agent.tools.base import get_registry
from unity_agent.tools.unity_tools import GenerateCompleteGameTool, SetupUnityProjectTool


def _cmd_list_tools(args: argparse.Namespace) -> int:
    registry = get_registry()
    for name in registry.all_names():
        cls = registry.get(name)
        print(f"  {name:35s} {cls.description}")
    return 0


def _cmd_generate(args: argparse.Namespace) -> int:
    settings = Settings(
        output_dir=args.output_dir,
        product_name=args.game,
    )
    transport = UnityTransport(settings)
    tool = GenerateCompleteGameTool(settings, transport)
    result = tool.run(game_name=args.game, preset=args.preset, project_name=args.game)
    print(result.summary)
    for f in result.files:
        print(f"  {f}")
    print()
    print(transport.summary())
    return 0 if result.ok else 1


def _cmd_setup(args: argparse.Namespace) -> int:
    settings = Settings(output_dir=args.output_dir, product_name=args.project_name)
    transport = UnityTransport(settings)
    tool = SetupUnityProjectTool(settings, transport)
    result = tool.run(project_name=args.project_name)
    print(result.summary)
    for f in result.files:
        print(f"  {f}")
    return 0 if result.ok else 1


def _cmd_qa(args: argparse.Namespace) -> int:
    from unity_agent.qa import ProjectQA
    qa = ProjectQA(args.project_root)
    report = qa.run()
    print(report.summary())
    for issue in report.issues:
        print(f"  [{issue.severity.upper():7}] {issue.category:8} {issue.message}  {issue.path}")
    return 0 if report.passed else 1


def build_parser() -> argparse.ArgumentParser:
    p = argparse.ArgumentParser(prog="unity_agent", description="Unity game agent CLI.")
    sub = p.add_subparsers(dest="cmd", required=True)

    p_list = sub.add_parser("list-tools", help="List every registered tool.")
    p_list.set_defaults(func=_cmd_list_tools)

    p_gen = sub.add_parser("generate", help="Generate a complete game.")
    p_gen.add_argument("--game", default="OpenWorldCity", help="Game / project name.")
    p_gen.add_argument("--preset", default="open_world_city",
                       choices=["open_world_city", "fps_arena", "minimal"])
    p_gen.add_argument("--output-dir", default="unity_output",
                       help="Where to write the project (default: unity_output).")
    p_gen.set_defaults(func=_cmd_generate)

    p_setup = sub.add_parser("setup", help="Scaffold an empty Unity project.")
    p_setup.add_argument("--project-name", default="GeneratedGame")
    p_setup.add_argument("--output-dir", default="unity_output")
    p_setup.set_defaults(func=_cmd_setup)

    p_qa = sub.add_parser("qa", help="Run QA checks on a generated project.")
    p_qa.add_argument("project_root", help="Path to the project root.")
    p_qa.set_defaults(func=_cmd_qa)

    return p


def main(argv: list[str] | None = None) -> int:
    parser = build_parser()
    args = parser.parse_args(argv)
    return args.func(args)


if __name__ == "__main__":
    sys.exit(main())