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