gms-mcp 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. gms_mcp-0.0.1/LICENSE +22 -0
  2. gms_mcp-0.0.1/MANIFEST.in +12 -0
  3. gms_mcp-0.0.1/PKG-INFO +571 -0
  4. gms_mcp-0.0.1/README.md +536 -0
  5. gms_mcp-0.0.1/hooks/hooks.json +50 -0
  6. gms_mcp-0.0.1/hooks/notify-errors.sh +19 -0
  7. gms_mcp-0.0.1/hooks/session-start.sh +22 -0
  8. gms_mcp-0.0.1/pyproject.toml +91 -0
  9. gms_mcp-0.0.1/setup.cfg +4 -0
  10. gms_mcp-0.0.1/setup.py +93 -0
  11. gms_mcp-0.0.1/skills/gms-mcp/SKILL.md +120 -0
  12. gms_mcp-0.0.1/skills/gms-mcp/reference/asset-types.md +129 -0
  13. gms_mcp-0.0.1/skills/gms-mcp/reference/doc-commands.md +167 -0
  14. gms_mcp-0.0.1/skills/gms-mcp/reference/event-types.md +119 -0
  15. gms_mcp-0.0.1/skills/gms-mcp/reference/maintenance-commands.md +133 -0
  16. gms_mcp-0.0.1/skills/gms-mcp/reference/room-commands.md +150 -0
  17. gms_mcp-0.0.1/skills/gms-mcp/reference/runtime-options.md +131 -0
  18. gms_mcp-0.0.1/skills/gms-mcp/reference/symbol-commands.md +148 -0
  19. gms_mcp-0.0.1/skills/gms-mcp/reference/workflow-commands.md +138 -0
  20. gms_mcp-0.0.1/skills/gms-mcp/workflows/analyze-logic.md +71 -0
  21. gms_mcp-0.0.1/skills/gms-mcp/workflows/check-health.md +72 -0
  22. gms_mcp-0.0.1/skills/gms-mcp/workflows/check-quality.md +69 -0
  23. gms_mcp-0.0.1/skills/gms-mcp/workflows/cleanup-project.md +152 -0
  24. gms_mcp-0.0.1/skills/gms-mcp/workflows/debug-live.md +82 -0
  25. gms_mcp-0.0.1/skills/gms-mcp/workflows/duplicate-asset.md +71 -0
  26. gms_mcp-0.0.1/skills/gms-mcp/workflows/find-code.md +184 -0
  27. gms_mcp-0.0.1/skills/gms-mcp/workflows/generate-jsdoc.md +91 -0
  28. gms_mcp-0.0.1/skills/gms-mcp/workflows/lookup-docs.md +165 -0
  29. gms_mcp-0.0.1/skills/gms-mcp/workflows/manage-events.md +128 -0
  30. gms_mcp-0.0.1/skills/gms-mcp/workflows/orchestrate-macro.md +83 -0
  31. gms_mcp-0.0.1/skills/gms-mcp/workflows/pre-commit.md +67 -0
  32. gms_mcp-0.0.1/skills/gms-mcp/workflows/run-game.md +172 -0
  33. gms_mcp-0.0.1/skills/gms-mcp/workflows/safe-delete.md +51 -0
  34. gms_mcp-0.0.1/skills/gms-mcp/workflows/setup-object.md +85 -0
  35. gms_mcp-0.0.1/skills/gms-mcp/workflows/setup-room.md +103 -0
  36. gms_mcp-0.0.1/skills/gms-mcp/workflows/setup-script.md +94 -0
  37. gms_mcp-0.0.1/skills/gms-mcp/workflows/smart-refactor.md +72 -0
  38. gms_mcp-0.0.1/skills/gms-mcp/workflows/update-art.md +58 -0
  39. gms_mcp-0.0.1/src/gms_helpers/__init__.py +24 -0
  40. gms_mcp-0.0.1/src/gms_helpers/__main__.py +6 -0
  41. gms_mcp-0.0.1/src/gms_helpers/agent_setup.py +192 -0
  42. gms_mcp-0.0.1/src/gms_helpers/asset_cli/__init__.py +73 -0
  43. gms_mcp-0.0.1/src/gms_helpers/asset_cli/context.py +90 -0
  44. gms_mcp-0.0.1/src/gms_helpers/asset_cli/create.py +307 -0
  45. gms_mcp-0.0.1/src/gms_helpers/asset_cli/delete.py +164 -0
  46. gms_mcp-0.0.1/src/gms_helpers/asset_cli/maintenance.py +523 -0
  47. gms_mcp-0.0.1/src/gms_helpers/asset_cli/parser.py +415 -0
  48. gms_mcp-0.0.1/src/gms_helpers/asset_creation_flow.py +79 -0
  49. gms_mcp-0.0.1/src/gms_helpers/asset_helper.py +121 -0
  50. gms_mcp-0.0.1/src/gms_helpers/asset_types/__init__.py +23 -0
  51. gms_mcp-0.0.1/src/gms_helpers/asset_types/code.py +160 -0
  52. gms_mcp-0.0.1/src/gms_helpers/asset_types/media.py +433 -0
  53. gms_mcp-0.0.1/src/gms_helpers/asset_types/naming.py +7 -0
  54. gms_mcp-0.0.1/src/gms_helpers/asset_types/project.py +337 -0
  55. gms_mcp-0.0.1/src/gms_helpers/asset_types/registry.py +23 -0
  56. gms_mcp-0.0.1/src/gms_helpers/asset_types/visual.py +482 -0
  57. gms_mcp-0.0.1/src/gms_helpers/assets.py +41 -0
  58. gms_mcp-0.0.1/src/gms_helpers/auto_maintenance.py +328 -0
  59. gms_mcp-0.0.1/src/gms_helpers/base_asset.py +102 -0
  60. gms_mcp-0.0.1/src/gms_helpers/bridge_installer.py +1019 -0
  61. gms_mcp-0.0.1/src/gms_helpers/bridge_server.py +529 -0
  62. gms_mcp-0.0.1/src/gms_helpers/bundle_assets.py +24 -0
  63. gms_mcp-0.0.1/src/gms_helpers/cli.py +7 -0
  64. gms_mcp-0.0.1/src/gms_helpers/commands/__init__.py +57 -0
  65. gms_mcp-0.0.1/src/gms_helpers/commands/asset_commands.py +122 -0
  66. gms_mcp-0.0.1/src/gms_helpers/commands/diagnostics_commands.py +58 -0
  67. gms_mcp-0.0.1/src/gms_helpers/commands/doc_commands.py +226 -0
  68. gms_mcp-0.0.1/src/gms_helpers/commands/event_commands.py +115 -0
  69. gms_mcp-0.0.1/src/gms_helpers/commands/maintenance_commands.py +149 -0
  70. gms_mcp-0.0.1/src/gms_helpers/commands/room_commands.py +149 -0
  71. gms_mcp-0.0.1/src/gms_helpers/commands/runner_commands.py +225 -0
  72. gms_mcp-0.0.1/src/gms_helpers/commands/skills_commands.py +219 -0
  73. gms_mcp-0.0.1/src/gms_helpers/commands/sprite_commands.py +84 -0
  74. gms_mcp-0.0.1/src/gms_helpers/commands/symbol_commands.py +281 -0
  75. gms_mcp-0.0.1/src/gms_helpers/commands/telemetry_commands.py +83 -0
  76. gms_mcp-0.0.1/src/gms_helpers/commands/texture_group_commands.py +296 -0
  77. gms_mcp-0.0.1/src/gms_helpers/commands/workflow_commands.py +162 -0
  78. gms_mcp-0.0.1/src/gms_helpers/config.py +32 -0
  79. gms_mcp-0.0.1/src/gms_helpers/diagnostics.py +39 -0
  80. gms_mcp-0.0.1/src/gms_helpers/event_helper.py +353 -0
  81. gms_mcp-0.0.1/src/gms_helpers/event_model.py +259 -0
  82. gms_mcp-0.0.1/src/gms_helpers/exceptions.py +71 -0
  83. gms_mcp-0.0.1/src/gms_helpers/gamemaker_machine_lock.py +244 -0
  84. gms_mcp-0.0.1/src/gms_helpers/gml_docs/__init__.py +34 -0
  85. gms_mcp-0.0.1/src/gms_helpers/gml_docs/cache.py +224 -0
  86. gms_mcp-0.0.1/src/gms_helpers/gml_docs/fetcher.py +467 -0
  87. gms_mcp-0.0.1/src/gms_helpers/gml_docs/search.py +266 -0
  88. gms_mcp-0.0.1/src/gms_helpers/gml_index/__init__.py +20 -0
  89. gms_mcp-0.0.1/src/gms_helpers/gml_index/index.py +476 -0
  90. gms_mcp-0.0.1/src/gms_helpers/gml_index/scanner.py +270 -0
  91. gms_mcp-0.0.1/src/gms_helpers/gml_index/symbols.py +88 -0
  92. gms_mcp-0.0.1/src/gms_helpers/gms.py +1492 -0
  93. gms_mcp-0.0.1/src/gms_helpers/health.py +201 -0
  94. gms_mcp-0.0.1/src/gms_helpers/install.py +160 -0
  95. gms_mcp-0.0.1/src/gms_helpers/introspection.py +731 -0
  96. gms_mcp-0.0.1/src/gms_helpers/maintenance/__init__.py +26 -0
  97. gms_mcp-0.0.1/src/gms_helpers/maintenance/audit/__init__.py +19 -0
  98. gms_mcp-0.0.1/src/gms_helpers/maintenance/audit/reference_collector.py +521 -0
  99. gms_mcp-0.0.1/src/gms_helpers/maintenance/clean_unused_assets.py +136 -0
  100. gms_mcp-0.0.1/src/gms_helpers/maintenance/event_sync.py +361 -0
  101. gms_mcp-0.0.1/src/gms_helpers/maintenance/lint.py +332 -0
  102. gms_mcp-0.0.1/src/gms_helpers/maintenance/normalize_names.py +203 -0
  103. gms_mcp-0.0.1/src/gms_helpers/maintenance/orphan_cleanup.py +277 -0
  104. gms_mcp-0.0.1/src/gms_helpers/maintenance/orphans.py +208 -0
  105. gms_mcp-0.0.1/src/gms_helpers/maintenance/path_utils.py +137 -0
  106. gms_mcp-0.0.1/src/gms_helpers/maintenance/prune.py +173 -0
  107. gms_mcp-0.0.1/src/gms_helpers/maintenance/static_search.py +339 -0
  108. gms_mcp-0.0.1/src/gms_helpers/maintenance/tidy_json.py +94 -0
  109. gms_mcp-0.0.1/src/gms_helpers/maintenance/trash/__init__.py +81 -0
  110. gms_mcp-0.0.1/src/gms_helpers/maintenance/validate_paths.py +327 -0
  111. gms_mcp-0.0.1/src/gms_helpers/naming_config.py +464 -0
  112. gms_mcp-0.0.1/src/gms_helpers/path_safety.py +72 -0
  113. gms_mcp-0.0.1/src/gms_helpers/reference_scanner.py +1016 -0
  114. gms_mcp-0.0.1/src/gms_helpers/results.py +271 -0
  115. gms_mcp-0.0.1/src/gms_helpers/room_helper.py +260 -0
  116. gms_mcp-0.0.1/src/gms_helpers/room_instance_helper.py +437 -0
  117. gms_mcp-0.0.1/src/gms_helpers/room_layer_helper.py +346 -0
  118. gms_mcp-0.0.1/src/gms_helpers/run_session.py +368 -0
  119. gms_mcp-0.0.1/src/gms_helpers/runner.py +123 -0
  120. gms_mcp-0.0.1/src/gms_helpers/runner_process.py +118 -0
  121. gms_mcp-0.0.1/src/gms_helpers/runner_support/__init__.py +1 -0
  122. gms_mcp-0.0.1/src/gms_helpers/runner_support/artifacts.py +97 -0
  123. gms_mcp-0.0.1/src/gms_helpers/runner_support/discovery.py +192 -0
  124. gms_mcp-0.0.1/src/gms_helpers/runner_support/execution.py +502 -0
  125. gms_mcp-0.0.1/src/gms_helpers/runner_support/igor.py +422 -0
  126. gms_mcp-0.0.1/src/gms_helpers/runner_support/macos.py +642 -0
  127. gms_mcp-0.0.1/src/gms_helpers/runner_support/targets.py +80 -0
  128. gms_mcp-0.0.1/src/gms_helpers/runtime_manager.py +262 -0
  129. gms_mcp-0.0.1/src/gms_helpers/sprite_frames.py +265 -0
  130. gms_mcp-0.0.1/src/gms_helpers/sprite_import.py +280 -0
  131. gms_mcp-0.0.1/src/gms_helpers/synthetic_project.py +130 -0
  132. gms_mcp-0.0.1/src/gms_helpers/texture_group/__init__.py +40 -0
  133. gms_mcp-0.0.1/src/gms_helpers/texture_group/mutations.py +505 -0
  134. gms_mcp-0.0.1/src/gms_helpers/texture_group/project.py +74 -0
  135. gms_mcp-0.0.1/src/gms_helpers/texture_group/refs.py +243 -0
  136. gms_mcp-0.0.1/src/gms_helpers/texture_group/scan.py +191 -0
  137. gms_mcp-0.0.1/src/gms_helpers/texture_groups.py +45 -0
  138. gms_mcp-0.0.1/src/gms_helpers/transactions.py +1584 -0
  139. gms_mcp-0.0.1/src/gms_helpers/utils.py +870 -0
  140. gms_mcp-0.0.1/src/gms_helpers/workflow.py +1137 -0
  141. gms_mcp-0.0.1/src/gms_mcp/__init__.py +3 -0
  142. gms_mcp-0.0.1/src/gms_mcp/__main__.py +6 -0
  143. gms_mcp-0.0.1/src/gms_mcp/bootstrap_server.py +84 -0
  144. gms_mcp-0.0.1/src/gms_mcp/cli.py +52 -0
  145. gms_mcp-0.0.1/src/gms_mcp/client_registry.py +153 -0
  146. gms_mcp-0.0.1/src/gms_mcp/doctor.py +92 -0
  147. gms_mcp-0.0.1/src/gms_mcp/doctor_checks.py +491 -0
  148. gms_mcp-0.0.1/src/gms_mcp/execution_policy.py +92 -0
  149. gms_mcp-0.0.1/src/gms_mcp/gamemaker_mcp_server.py +706 -0
  150. gms_mcp-0.0.1/src/gms_mcp/install.py +829 -0
  151. gms_mcp-0.0.1/src/gms_mcp/install_support/__init__.py +1 -0
  152. gms_mcp-0.0.1/src/gms_mcp/install_support/client_configs.py +922 -0
  153. gms_mcp-0.0.1/src/gms_mcp/install_support/common.py +586 -0
  154. gms_mcp-0.0.1/src/gms_mcp/install_support/flow.py +495 -0
  155. gms_mcp-0.0.1/src/gms_mcp/install_support/naming.py +43 -0
  156. gms_mcp-0.0.1/src/gms_mcp/install_support/project.py +92 -0
  157. gms_mcp-0.0.1/src/gms_mcp/project_detection.py +110 -0
  158. gms_mcp-0.0.1/src/gms_mcp/server/__init__.py +5 -0
  159. gms_mcp-0.0.1/src/gms_mcp/server/debug.py +125 -0
  160. gms_mcp-0.0.1/src/gms_mcp/server/destructive_policy.py +92 -0
  161. gms_mcp-0.0.1/src/gms_mcp/server/direct.py +267 -0
  162. gms_mcp-0.0.1/src/gms_mcp/server/direct_worker.py +202 -0
  163. gms_mcp-0.0.1/src/gms_mcp/server/dispatch.py +229 -0
  164. gms_mcp-0.0.1/src/gms_mcp/server/dry_run_policy.py +42 -0
  165. gms_mcp-0.0.1/src/gms_mcp/server/log_paths.py +66 -0
  166. gms_mcp-0.0.1/src/gms_mcp/server/macos_runner_timeout.py +84 -0
  167. gms_mcp-0.0.1/src/gms_mcp/server/mcp_types.py +10 -0
  168. gms_mcp-0.0.1/src/gms_mcp/server/output.py +54 -0
  169. gms_mcp-0.0.1/src/gms_mcp/server/platform.py +13 -0
  170. gms_mcp-0.0.1/src/gms_mcp/server/project.py +167 -0
  171. gms_mcp-0.0.1/src/gms_mcp/server/register_all.py +77 -0
  172. gms_mcp-0.0.1/src/gms_mcp/server/resources.py +73 -0
  173. gms_mcp-0.0.1/src/gms_mcp/server/results.py +219 -0
  174. gms_mcp-0.0.1/src/gms_mcp/server/subprocess_runner.py +668 -0
  175. gms_mcp-0.0.1/src/gms_mcp/server/tools/__init__.py +5 -0
  176. gms_mcp-0.0.1/src/gms_mcp/server/tools/asset_creation.py +901 -0
  177. gms_mcp-0.0.1/src/gms_mcp/server/tools/bridge.py +397 -0
  178. gms_mcp-0.0.1/src/gms_mcp/server/tools/capabilities.py +36 -0
  179. gms_mcp-0.0.1/src/gms_mcp/server/tools/code_intel.py +196 -0
  180. gms_mcp-0.0.1/src/gms_mcp/server/tools/docs.py +117 -0
  181. gms_mcp-0.0.1/src/gms_mcp/server/tools/events.py +212 -0
  182. gms_mcp-0.0.1/src/gms_mcp/server/tools/introspection.py +139 -0
  183. gms_mcp-0.0.1/src/gms_mcp/server/tools/maintenance.py +470 -0
  184. gms_mcp-0.0.1/src/gms_mcp/server/tools/project_health.py +103 -0
  185. gms_mcp-0.0.1/src/gms_mcp/server/tools/rooms.py +350 -0
  186. gms_mcp-0.0.1/src/gms_mcp/server/tools/runner.py +358 -0
  187. gms_mcp-0.0.1/src/gms_mcp/server/tools/runtime.py +100 -0
  188. gms_mcp-0.0.1/src/gms_mcp/server/tools/texture_groups.py +275 -0
  189. gms_mcp-0.0.1/src/gms_mcp/server/tools/verification.py +46 -0
  190. gms_mcp-0.0.1/src/gms_mcp/server/tools/workflow.py +373 -0
  191. gms_mcp-0.0.1/src/gms_mcp/server/validation.py +909 -0
  192. gms_mcp-0.0.1/src/gms_mcp/server/verification_policy.py +240 -0
  193. gms_mcp-0.0.1/src/gms_mcp/star_cta.py +106 -0
  194. gms_mcp-0.0.1/src/gms_mcp/telemetry.py +618 -0
  195. gms_mcp-0.0.1/src/gms_mcp/telemetry_runtime.py +20 -0
  196. gms_mcp-0.0.1/src/gms_mcp/update_notifier.py +381 -0
  197. gms_mcp-0.0.1/src/gms_mcp/update_status.py +71 -0
  198. gms_mcp-0.0.1/src/gms_mcp.egg-info/SOURCES.txt +195 -0
gms_mcp-0.0.1/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ampersand Game Studios
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,12 @@
1
+ global-exclude *
2
+
3
+ include LICENSE
4
+ include README.md
5
+ include pyproject.toml
6
+ include setup.py
7
+ include MANIFEST.in
8
+
9
+ recursive-include src/gms_helpers *.py
10
+ recursive-include src/gms_mcp *.py
11
+ recursive-include skills/gms-mcp *.md
12
+ recursive-include hooks *.json *.sh
gms_mcp-0.0.1/PKG-INFO ADDED
@@ -0,0 +1,571 @@
1
+ Metadata-Version: 2.4
2
+ Name: gms-mcp
3
+ Version: 0.0.1
4
+ Summary: GameMaker CLI + MCP server toolset
5
+ Author: Ampersand Game Studios
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Ampersand-Game-Studios/gms-mcp
8
+ Project-URL: Repository, https://github.com/Ampersand-Game-Studios/gms-mcp
9
+ Project-URL: Issues, https://github.com/Ampersand-Game-Studios/gms-mcp/issues
10
+ Keywords: gamemaker,mcp,cursor,cli,tools
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: mcp<2,>=1.26
21
+ Requires-Dist: colorama<1,>=0.4.6
22
+ Requires-Dist: tomli<3,>=2; python_version < "3.11"
23
+ Provides-Extra: dev
24
+ Requires-Dist: build<2,>=1; extra == "dev"
25
+ Requires-Dist: packaging<27,>=25; extra == "dev"
26
+ Requires-Dist: pytest<10,>=9; extra == "dev"
27
+ Requires-Dist: pytest-cov<8,>=7; extra == "dev"
28
+ Requires-Dist: Pillow<13,>=10; extra == "dev"
29
+ Requires-Dist: ruff<1,>=0.9; extra == "dev"
30
+ Requires-Dist: pyright<2,>=1.1.390; extra == "dev"
31
+ Requires-Dist: tomli<3,>=2; extra == "dev"
32
+ Provides-Extra: import
33
+ Requires-Dist: Pillow<13,>=10; extra == "import"
34
+ Dynamic: license-file
35
+
36
+ # GameMaker MCP Tools
37
+ [![CI](https://github.com/Ampersand-Game-Studios/gms-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Ampersand-Game-Studios/gms-mcp/actions/workflows/ci.yml)
38
+ [![GitHub stars](https://img.shields.io/github/stars/Ampersand-Game-Studios/gms-mcp?label=GitHub%20stars)](https://github.com/Ampersand-Game-Studios/gms-mcp/stargazers)
39
+
40
+ ## Project Features
41
+
42
+ - `gms`: a Python CLI for GameMaker project operations (asset creation, maintenance, runner, etc).
43
+ - `gms-mcp`: an MCP server that exposes the same operations as MCP tools (Cursor is the primary example client).
44
+ - **TCP Bridge (optional)**: live, bidirectional game communication (commands + log capture) via `gm_bridge_install`, `gm_run_command`, and `gm_run_logs`. Bridge lifecycle logging stays off the MCP stdio transport so `gm_run(..., enable_bridge=true)` does not corrupt JSON-RPC. See `documentation/BRIDGE.md`.
45
+ - **Reliability-First Architecture**: Custom exception hierarchy, typed result objects, and an execution policy manager replace monolithic exit calls and raw dictionaries. Legacy helper results are normalized into structured `success`/`ok`/`message`/`error` payloads for consistent tool integration and optimized performance (Fast assets, Resilient runner).
46
+ - **Health & Diagnostics**: `gm_mcp_health` provides a one-click diagnostic tool to verify the local GameMaker environment. `gm_diagnostics` provides structured, machine-readable project diagnostics (JSON, naming, orphans, references) compatible with IDE problem panels.
47
+ - **Imported Template Cleanup**: `gms maintenance normalize-names` / `gm_maintenance_normalize_names` plans naming-convention renames, and applies them only when explicitly requested.
48
+ - **Runtime Management**: `gm_runtime_list`, `gm_runtime_pin`, and `gm_runtime_verify` allow precise control over builds and execution. Unpinned projects prefer the runtime family recorded by their IDE version, then the newest stable runtime; LTS2026 installs are identified as LTS.
49
+ - **Cross-Platform Runner Defaults**: `gm_run` / `gm_compile` now default to the host OS target platform (`macOS`, `Linux`, or `Windows`) when not explicitly provided.
50
+ - **macOS Local Runner Behavior**: local `gm_run` / `gm_compile` use Igor's run-based path for IDE-equivalent validation without Developer ID packaging. Launches wait for existing IDE or MCP Igor activity, snapshot all runner PIDs, and attach a unique inherited ownership marker so cleanup can distinguish owned path-bearing and bare Download runners from user processes. Packaged temp-output runs still resolve `.app` bundles via `Contents/MacOS/` when `PackageZip` is used.
51
+ - **GML Symbol Indexing & Code Intelligence**: `gm_build_index`, `gm_find_definition`, `gm_find_references`, and `gm_list_symbols` provide deep, fast, and filtered code analysis (definitions and cross-file references).
52
+ - **Introspection**: complete project inspection with support for all asset types (including extensions and datafiles).
53
+ - **MCP Resources**: addressable project index and asset graph for high-performance agent context loading.
54
+ - `gms-mcp-init`: generates shareable MCP config files for a workspace. Now auto-detects environment variables like `GMS_MCP_GMS_PATH` to include in the generated config.
55
+ - **Privacy-Safe Telemetry (opt-in)**: `gms`, `gms-mcp-init`, and MCP usage can send anonymous usage metadata only after explicit consent.
56
+
57
+ The MCP server starts with a curated core toolset. Enable optional domains with `GMS_MCP_TOOLSETS=assets,events,rooms` or use `GMS_MCP_TOOLSETS=all`; `gm_capabilities` reports the active profile and available domains.
58
+
59
+ ## Install (recommended: pipx)
60
+
61
+ ```bash
62
+ pipx install gms-mcp
63
+ ```
64
+
65
+ If `gms-mcp` is useful, consider starring the repo on GitHub. Stars help other GameMaker users find it.
66
+
67
+ PowerShell equivalent:
68
+
69
+ ```powershell
70
+ pipx install gms-mcp
71
+ ```
72
+
73
+ ## Claude Code Plugin
74
+
75
+ For Claude Code users, install the plugin for the best experience:
76
+
77
+ ```
78
+ /install-plugin github:Ampersand-Game-Studios/gms-mcp
79
+ ```
80
+
81
+ This provides:
82
+ - **Skills**: 19 workflow guides + 8 reference docs
83
+ - **Hooks**: Once-daily update reminders and error notifications
84
+ - **MCP Server**: Auto-configured via uvx (no pip install needed)
85
+
86
+ ### For Other Tools (Cursor, VSCode, OpenClaw, etc.)
87
+
88
+ ```bash
89
+ pip install gms-mcp
90
+ gms-mcp doctor # quick package + project-detection + update check
91
+ gms-mcp doctor --project # project-aware environment check
92
+ gms-mcp doctor --full # add runtime selection + bridge status
93
+ gms-mcp-init --cursor # or --vscode, --windsurf, --openclaw, etc.
94
+ ```
95
+
96
+ For skill packs, OpenClaw users can install to user or workspace scope:
97
+
98
+ ```bash
99
+ gms skills install --openclaw # user scope: ~/.openclaw/skills/
100
+ gms skills install --openclaw --project # workspace scope: ./skills/
101
+ ```
102
+
103
+ Note: `.openclaw/openclaw.json` is for settings. Workspace skills are loaded from `./skills/`.
104
+
105
+ ### For Codex
106
+
107
+ ```bash
108
+ gms-mcp-init --codex
109
+ ```
110
+
111
+ This writes a workspace `.codex/mcp.toml` file and prints the `codex mcp add` registration command.
112
+
113
+ Global config mode writes directly to `~/.codex/config.toml` (merging server entries).
114
+
115
+ Use the printed command directly, or copy `.codex/mcp.toml` content into the `[mcp_servers]` section of your `~/.codex/config.toml`.
116
+
117
+ Codex helpers:
118
+ - `gms-mcp-init --codex-check` prints detected Codex config paths and active server entry, with secret-like values redacted.
119
+ - `gms-mcp-init --codex-check-json` prints the same check output in machine-readable JSON, with secret-like values redacted.
120
+ - `gms-mcp-init --codex-dry-run-only` prints final merged payloads for workspace + global Codex config without writing files.
121
+ - `gms-mcp-init --codex-app-setup` runs one-shot Codex app setup: writes workspace config, previews global merge, then prints check + readiness summary.
122
+
123
+ ## Telemetry
124
+
125
+ Telemetry is `default off`.
126
+
127
+ - Consent is user-scoped in `~/.gms-mcp/telemetry.json`
128
+ - Interactive `gms` and `gms-mcp-init` runs can prompt once for consent
129
+ - MCP server startup never prompts on stdio
130
+ - By default telemetry excludes file paths, command arguments, stdout/stderr, project names, usernames, emails, hostnames, and persistent IDs
131
+
132
+ CLI controls:
133
+
134
+ ```bash
135
+ gms telemetry status
136
+ gms telemetry enable
137
+ gms telemetry enable --with-install-id
138
+ gms telemetry disable
139
+ gms telemetry flush
140
+ gms telemetry clear
141
+ ```
142
+
143
+ Runtime overrides:
144
+
145
+ ```bash
146
+ gms --telemetry=off maintenance auto
147
+ gms-mcp-init --telemetry=on --cursor
148
+ GMS_MCP_TELEMETRY=off gms asset create script my_script
149
+ ```
150
+
151
+ ## Imported Template Cleanup
152
+
153
+ GameMaker's blank template may create assets like `room1` that violate stricter project naming rules. Keep lint strict, then normalize imported/template assets explicitly:
154
+
155
+ ```bash
156
+ gms maintenance normalize-names
157
+ gms maintenance normalize-names --fix
158
+ gms maintenance normalize-names --asset-type room --fix
159
+ ```
160
+
161
+ The command uses the project's `.gms-mcp.json` naming config, defaults to dry-run, detects collisions, and performs real renames through the same reference-aware workflow as `gms workflow rename`.
162
+
163
+ Dev/test endpoint override:
164
+
165
+ ```bash
166
+ GMS_MCP_TELEMETRY_ENDPOINT=https://localhost:8787/v1/events gms telemetry flush
167
+ ```
168
+
169
+ ## Local Development Setup
170
+
171
+ If you are working on the `gms-mcp` codebase itself, follow these steps to set up a local development environment:
172
+
173
+ 1. **Clone and install in editable mode**:
174
+ ```bash
175
+ git checkout dev
176
+ uv sync --frozen --all-extras --python 3.12
177
+ ```
178
+ `gms-mcp` requires Python `3.10+`; we recommend Python `3.12` for local development.
179
+
180
+ 2. **Run the full local test suite**:
181
+ ```bash
182
+ uv run --frozen pytest -q
183
+ ```
184
+
185
+ 3. **Initialize local and global MCP servers for testing**:
186
+ We recommend setting up two separate MCP server configurations in Cursor to test your changes:
187
+
188
+ * **Global (`gms-global`)**: For general use across all your GameMaker projects.
189
+ * **Local (`gms-local`)**: Specifically for testing your current changes to the server.
190
+
191
+ Run these commands from the project root (zsh/bash):
192
+ ```bash
193
+ # Global setup (names it 'gms-global' in Cursor)
194
+ gms-mcp-init --cursor-global --server-name gms-global --mode python-module --python python3 --non-interactive
195
+
196
+ # Local setup (names it 'gms-local' in Cursor)
197
+ gms-mcp-init --cursor --server-name gms-local --mode python-module --python python3 --non-interactive
198
+ ```
199
+
200
+ PowerShell equivalent:
201
+
202
+ ```powershell
203
+ # Global setup (names it 'gms-global' in Cursor)
204
+ gms-mcp-init --cursor-global --server-name gms-global --mode python-module --python python --non-interactive
205
+
206
+ # Local setup (names it 'gms-local' in Cursor)
207
+ gms-mcp-init --cursor --server-name gms-local --mode python-module --python python --non-interactive
208
+ ```
209
+
210
+ 4. **Verify in Cursor**:
211
+ Go to **Cursor Settings > Features > MCP** to see your new servers. You may need to click "Reload" or restart Cursor to see changes.
212
+
213
+ ## Publishing (maintainers)
214
+
215
+ Publishing is chained to successful push-triggered CI on `dev`, `pre-release`, or `main`. It also requires passing real GameMaker 2024 and 2026 LTS certification artifacts from that exact CI run; skipped or missing certification blocks PyPI publication.
216
+
217
+ The `GAMEMAKER_ACCESS_KEY` secret belongs in the branch-restricted `gamemaker-ci` environment, not at repository scope. Maintainers can safely validate it with the CI workflow's `run_real_gamemaker_smoke` manual input: manually dispatched CI can run the licensed smoke matrix but cannot trigger publication.
218
+
219
+ Built package archives are checked against a public-file allowlist before publication. Development tests, plans, service operations, CI configuration, and local reports are excluded from PyPI artifacts.
220
+
221
+ ## CI Coverage
222
+
223
+ - Core CI runs on Ubuntu and Windows across Python `3.10`-`3.13` from the committed `uv.lock`.
224
+ - Runner/session regression tests also run on macOS across Python `3.11`-`3.13`, including a mockless smoke test that builds a real `.app` bundle structure and validates executable path resolution.
225
+ - Core CI also runs a deterministic MCP tool smoke subset against a generated minimal GameMaker project fixture.
226
+
227
+ ### Quality Reports
228
+
229
+ Quality reports are generated during CI and published as `quality-reports-*` artifacts.
230
+
231
+ The reporting pipeline is subprocess-aware: CLI tests that launch `python -m gms_helpers.gms`
232
+ or other child processes now contribute to the final coverage artifacts instead of silently
233
+ dropping out of `coverage.xml`.
234
+
235
+ - `TEST_COVERAGE_REPORT.md`
236
+ - `MCP_TOOL_VALIDATION_REPORT.md`
237
+ - `mcp_tool_smoke_report.json`
238
+ - `coverage.xml`
239
+ - `pytest_results.xml`
240
+ - `quality_summary.json`
241
+
242
+ You can regenerate these locally with:
243
+
244
+ ```bash
245
+ uv sync --frozen --all-extras
246
+ GMS_MCP_TOOLSETS=all uv run --frozen python scripts/run_mcp_tool_smoke.py \
247
+ --init-minimal-base \
248
+ --base-project build/mcp-smoke/base-project \
249
+ --work-root build/mcp-smoke/work \
250
+ --output build/reports/mcp_tool_smoke_report.json
251
+ uv run --frozen python scripts/generate_quality_reports.py
252
+ ```
253
+
254
+ The MCP smoke uses a generated portable fixture and does not claim real compile/run coverage. The separate version-authored GameMaker fixtures provide that evidence. Release CI compiles those neutral fixtures on disposable Linux, Windows, and macOS runners. The generator enforces 85% overall coverage, 50% per-module coverage, runtime/source MCP registration parity, and reports executed MCP smoke calls separately from static test-source references.
255
+
256
+ Run both supported real GameMaker fixtures before promotion, for example:
257
+
258
+ ```bash
259
+ uv run --frozen python scripts/run_real_gamemaker_smoke.py \
260
+ --fixture-name gm-2024 \
261
+ --expected-runtime-version 2024.14.4.268 \
262
+ --required
263
+
264
+ uv run --frozen python scripts/run_real_gamemaker_smoke.py \
265
+ --fixture-name gm-2026-lts \
266
+ --expected-runtime-version 2026.0.0.23 \
267
+ --required
268
+ ```
269
+
270
+ ## Use with a GameMaker project (multi-project friendly)
271
+
272
+ Run this inside each GameMaker project workspace (or repo) to generate config:
273
+
274
+ ```bash
275
+ gms-mcp-init --cursor
276
+ ```
277
+
278
+ This writes `.cursor/mcp.json` and attempts to auto-detect the `.yyp` location to set `GM_PROJECT_ROOT`.
279
+
280
+ Each MCP server process pins that detected project when it starts. Tool calls cannot switch the server to a sibling
281
+ project, traverse above the project, or follow a project symlink to files elsewhere on the host. Run a separate MCP
282
+ server entry for each project you want to expose. Sprite PNG inputs must also live inside that pinned project.
283
+
284
+ The pinned project is the server's approved data boundary, not a private area hidden from the connected MCP client.
285
+ Tools intentionally return asset metadata and source context from that project, so only pin a project whose contents
286
+ you are willing to send to the connected AI client or provider.
287
+
288
+ For a one-time setup that works across many projects, write Cursor's global config instead:
289
+
290
+ ```bash
291
+ gms-mcp-init --cursor-global
292
+ ```
293
+
294
+ Generate a Codex config from the current workspace:
295
+
296
+ ```bash
297
+ gms-mcp-init --codex
298
+ ```
299
+
300
+ Workspace Codex config stores `GM_PROJECT_ROOT` relative to the repository (`.` or a subdirectory such as
301
+ `gamemaker`) so `.codex/mcp.toml` can be committed without publishing a username or machine-specific path.
302
+ Project roots outside the workspace are rejected instead of being written as absolute paths.
303
+
304
+ Generate a global Codex entry in `~/.codex/config.toml`:
305
+
306
+ ```bash
307
+ gms-mcp-init --codex-global
308
+ ```
309
+
310
+ Global mode merges with existing entries so it is safe to keep multiple MCP servers in the same file.
311
+ It deliberately omits `GM_PROJECT_ROOT`, so each server pins the GameMaker project resolved from its own startup
312
+ workspace.
313
+
314
+ Inspect current Codex config resolution:
315
+
316
+ ```bash
317
+ gms-mcp-init --codex-check
318
+ ```
319
+
320
+ Human and JSON check output redact secret-like env, header, and credential argument values before printing.
321
+
322
+ Preview the redacted target Codex entries for local + global without writing. Existing unrelated
323
+ configuration is omitted, secret values are redacted, and machine-specific paths are replaced:
324
+
325
+ ```bash
326
+ gms-mcp-init --codex-dry-run-only
327
+ ```
328
+
329
+ Print Codex check output as JSON (useful for app automation):
330
+
331
+ ```bash
332
+ gms-mcp-init --codex-check-json
333
+ ```
334
+
335
+ One-shot Codex app setup (recommended for new workspaces):
336
+
337
+ ```bash
338
+ gms-mcp-init --codex-app-setup
339
+ ```
340
+
341
+ ### Codex App Quickstart
342
+
343
+ 1. Run `gms-mcp-init --codex-app-setup` in your GameMaker workspace.
344
+ 2. Confirm the output says `Ready for Codex app: yes`.
345
+ 3. If needed, run `gms-mcp-init --codex-check-json` and verify `active.scope` is `workspace`.
346
+ 4. Use `gms-mcp-init --codex-dry-run-only` before changing global config to preview merged TOML safely.
347
+
348
+ ## Canonical Client Workflow
349
+
350
+ All clients now support the same canonical action surface:
351
+
352
+ ```bash
353
+ gms-mcp-init \
354
+ --client <cursor|codex|claude-code|claude-desktop|antigravity|gemini|vscode|windsurf|openclaw|generic> \
355
+ --scope <workspace|global> \
356
+ --action <setup|check|check-json|app-setup>
357
+ ```
358
+
359
+ Optional:
360
+ - `--config-path /custom/path` to override default config location
361
+ - `--safe-profile` to enforce conservative env defaults
362
+
363
+ Examples:
364
+
365
+ ```bash
366
+ # Cursor setup + readiness check
367
+ gms-mcp-init --client cursor --scope workspace --action app-setup
368
+
369
+ # Codex machine-readable readiness
370
+ gms-mcp-init --client codex --scope workspace --action check-json
371
+
372
+ # Claude Desktop global plugin sync
373
+ gms-mcp-init --client claude-desktop --scope global --action setup
374
+
375
+ # Gemini alias (Antigravity path)
376
+ gms-mcp-init --client gemini --scope global --action app-setup
377
+
378
+ # OpenClaw app setup + workspace skills install
379
+ gms-mcp-init --client openclaw --scope workspace --action app-setup \
380
+ --openclaw-install-skills --openclaw-skills-project
381
+ ```
382
+
383
+ For parity status and supported defaults, see `documentation/CLIENT_SUPPORT_MATRIX.md`.
384
+
385
+ Generate example configs for other MCP-capable clients:
386
+
387
+ ```bash
388
+ gms-mcp-init --vscode --windsurf --antigravity --openclaw
389
+ ```
390
+
391
+ Set up Antigravity global config (recommended):
392
+
393
+ ```bash
394
+ gms-mcp-init --antigravity-setup
395
+ ```
396
+
397
+ This merges into `~/.gemini/antigravity/mcp_config.json`, writes atomically, creates a timestamped backup on overwrite, and enables a conservative safety profile by default:
398
+ - `GMS_MCP_ENABLE_DIRECT=0`
399
+ - `GMS_MCP_REQUIRE_DRY_RUN=1`
400
+
401
+ Check Antigravity readiness:
402
+
403
+ ```bash
404
+ gms-mcp-init --antigravity-check
405
+ ```
406
+
407
+ Print Antigravity check output as JSON:
408
+
409
+ ```bash
410
+ gms-mcp-init --antigravity-check-json
411
+ ```
412
+
413
+ Antigravity check output also redacts secret-like env, header, and credential argument values before printing.
414
+
415
+ One-shot Antigravity app setup:
416
+
417
+ ```bash
418
+ gms-mcp-init --antigravity-app-setup
419
+ ```
420
+
421
+ Use a custom Antigravity config path:
422
+
423
+ ```bash
424
+ gms-mcp-init --antigravity-setup --antigravity-config-path /path/to/mcp_config.json
425
+ ```
426
+
427
+ Opt in to the conservative safety profile for Antigravity example configs too:
428
+
429
+ ```bash
430
+ gms-mcp-init --antigravity --safe-profile
431
+ ```
432
+
433
+ When `GMS_MCP_REQUIRE_DRY_RUN=1` is set, you can allow specific destructive tools with:
434
+
435
+ ```bash
436
+ export GMS_MCP_REQUIRE_DRY_RUN_ALLOWLIST=gm_safe_delete
437
+ ```
438
+
439
+ Or generate everything at once:
440
+
441
+ ```bash
442
+ gms-mcp-init --all
443
+ ```
444
+
445
+ ## Monorepos / multiple `.yyp`
446
+
447
+ If multiple `.yyp` projects are detected in a workspace:
448
+ - `gms-mcp-init` will warn and (when interactive) prompt you to pick one.
449
+ - In non-interactive environments, it defaults `GM_PROJECT_ROOT` to `${workspaceFolder}` (safe).
450
+
451
+ Force a specific project root:
452
+
453
+ ```bash
454
+ gms-mcp-init --cursor --gm-project-root path/to/project
455
+ ```
456
+
457
+ Preview output without writing files:
458
+
459
+ ```bash
460
+ gms-mcp-init --cursor --dry-run
461
+ ```
462
+
463
+ ## Code Intelligence & Introspection
464
+
465
+ The MCP server provides comprehensive project analysis capabilities:
466
+
467
+ ### GML Symbol Indexing (`gm_build_index`)
468
+ Build a high-performance index of all functions, enums, macros, and global variables in the project. This is required for advanced code intelligence tools.
469
+
470
+ ### Symbol Definition (`gm_find_definition`)
471
+ Find the exact location and docstrings for any GML symbol in your project.
472
+
473
+ ### Find References (`gm_find_references`)
474
+ Search for all usages of a specific function or variable across your entire codebase.
475
+
476
+ ### List Symbols (`gm_list_symbols`)
477
+ List all project symbols with filtering by type, name substring, or file path.
478
+
479
+ ### Asset Listing (`gm_list_assets`)
480
+ List all assets in your project, optionally filtered by type:
481
+ - **Supported types**: script, object, sprite, room, sound, font, shader, path, timeline, tileset, animcurve, sequence, note, folder, **particlesystem**, **extension**, **includedfile** (datafiles)
482
+
483
+ ### Asset Reading (`gm_read_asset`)
484
+ Read the complete `.yy` JSON metadata for any asset by name or path.
485
+
486
+ ### Reference Search (`gm_search_references`)
487
+ Search for patterns across project files with:
488
+ - **Scopes**: `all`, `gml`, `yy`, `scripts`, `objects`, `extensions`, `datafiles`
489
+ - **Modes**: literal string or regex
490
+ - **Options**: case sensitivity, max results
491
+
492
+ ### Asset Graph (`gm_get_asset_graph`)
493
+ Build a dependency graph of assets with two modes:
494
+ - **Shallow (fast)**: Parses `.yy` files for structural references (parent objects, sprites, etc.)
495
+ - **Deep (complete)**: Also scans all GML code for runtime references like `instance_create`, `sprite_index`, `audio_play_sound`, etc.
496
+
497
+ ### Texture Groups (`gm_texture_group_*`)
498
+ Create, inspect, and edit `.yyp` `TextureGroups`, plus bulk-assign assets (sprites/fonts/tilesets/etc) via `textureGroupId`.
499
+
500
+ Read-only tools:
501
+ - `gm_texture_group_list`: list texture groups + available configs (desktop/android/ios/etc)
502
+ - `gm_texture_group_read`: read a single texture group entry
503
+ - `gm_texture_group_members`: list assets in a group (top-level + ConfigValues overrides)
504
+ - `gm_texture_group_scan`: report missing groups referenced + mismatches (top-level vs config override)
505
+
506
+ Destructive tools (all support `dry_run=true`):
507
+ - `gm_texture_group_create`: clone an existing template group (default: `Default`)
508
+ - `gm_texture_group_update`: patch fields on a group (optionally per config via `ConfigValues`)
509
+ - `gm_texture_group_rename`: rename a group and rewrite asset references
510
+ - `gm_texture_group_delete`: blocks by default if referenced unless `reassign_to` is provided
511
+ - `gm_texture_group_assign`: bulk-assign assets by explicit list or filters
512
+
513
+ Config scope defaults:
514
+ - Assignment updates an asset's top-level `textureGroupId` **only when it is a dict** (null is left as-is).
515
+ - If `configs` is omitted, assignment updates only **existing** `ConfigValues` entries; pass `configs=[...]` to create explicit overrides.
516
+
517
+ ### MCP Resources
518
+ Pre-built, cacheable project data for agents:
519
+ - `gms://project/index`: Complete project structure (assets, folders, room order, configs, audio/texture groups, IDE version)
520
+ - `gms://project/asset-graph`: Asset dependency graph
521
+ - `gms://system/updates`: Returns a human-readable message if a newer version of `gms-mcp` is available on PyPI or GitHub.
522
+
523
+ ### Update Notifier
524
+ Shared update status is available through the MCP surfaces below, and supported client hooks can surface a once-daily reminder:
525
+ - **CLI**: `gms-mcp doctor` is the standard local diagnostics command. `gms-mcp doctor --notify` remains the update-only startup hook path.
526
+ - **Tool**: `gm_check_updates` returns structured update info.
527
+ - **Auto-check**: `gm_project_info` includes a cached `updates` field.
528
+ - **Resource**: `gms://system/updates` provides a quick text status.
529
+ - Plain `pip` installs are not guaranteed a proactive reminder unless the client setup includes the bundled startup hook.
530
+
531
+ Common doctor entry points:
532
+ - `gms-mcp doctor`: quick package/update/project-detection check.
533
+ - `gms-mcp doctor --project`: adds environment, runtime, license, and dependency checks.
534
+ - `gms-mcp doctor --full`: adds runtime selection and bridge status.
535
+ - `gms-mcp doctor --client codex|claude`: validates active client config for the current workspace.
536
+ - `gms-mcp doctor --project-root /path/to/project`: targets an explicit GameMaker project directory.
537
+ - `gms-mcp doctor --client codex --server-name gms-app`: validates a non-default MCP server entry name.
538
+ - `gms-mcp doctor --json`: emits a stable JSON report with `overall_status`, `exit_code`, and `checks`.
539
+
540
+ Automatic MCP diagnostic logs are stored outside GameMaker projects under
541
+ `~/.gms-mcp/logs/<opaque-project-id>/`. The directory name is a one-way hash of the project path,
542
+ and private directory/file permissions are applied where the operating system supports them.
543
+
544
+ ### Runtime Management
545
+ Runtime list/pin/verify operations are exposed as MCP tools:
546
+ - `gm_runtime_list`
547
+ - `gm_runtime_pin`
548
+ - `gm_runtime_unpin`
549
+ - `gm_runtime_verify`
550
+
551
+ The plain `gms` CLI has runner commands (`gms run compile`, `gms run start`, `gms run stop`, `gms run status`), but does not expose separate runtime-management subcommands.
552
+
553
+ Runner runtime labels:
554
+ - `VM` and `GMS2 VM` map to Igor VM builds.
555
+ - `YYC` and `GMS2 YYC` map to Igor YYC builds.
556
+ - `GMRT` and `GMRT VM` are recognized and rejected with a clear error until GameMaker documents the Igor command-line syntax for GMRT targets.
557
+
558
+ Igor cache/temp paths are isolated by project and runtime. Confirmed pre-compile `System.AccessViolationException` runtime aborts clear that disposable state and retry up to three times; source compiler failures and post-compile exits are never retried. Igor child processes default to one reported .NET processor to avoid the 2026 LTS serializer/compiler race reproduced on macOS; set `GMS_MCP_IGOR_PROCESSOR_COUNT` to an integer from 1 to 256 to opt into more compiler parallelism.
559
+
560
+ On macOS, runner commands wait up to 30 seconds for any existing Igor build/run—including GameMaker IDE activity—to finish, then fail clearly instead of overlapping it. Set `GMS_MCP_IGOR_IDLE_WAIT_SECONDS` to a non-negative number of seconds; `0` enables immediate fail-fast behavior. Owned launches snapshot all existing `Mac_Runner` processes, recheck for a concurrent IDE Igor immediately after launch, and persist exact process identities plus an unguessable environment marker inherited through LaunchServices. Normal cleanup plus hard MCP/direct-CLI timeout cleanup can therefore remove newly spawned owned project-temp, bare Download, and log-tail helpers without touching pre-existing, concurrent user, or unrelated runners.
561
+
562
+ ## CLI usage
563
+
564
+ Run from a project directory (or pass `--project-root`):
565
+
566
+ ```bash
567
+ gms --version
568
+ gms --project-root . asset create script my_function --parent-path "folders/Scripts.yy"
569
+ gms --project-root . texture-groups list
570
+ gms --project-root . texture-groups assign game --type sprite --folder-prefix sprites/ --dry-run
571
+ ```