| """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()) |
|
|