ue-mcp 1.2.3 → 1.3.0

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 (255) hide show
  1. package/README.md +4 -3
  2. package/dist/action-class.js +56 -3
  3. package/dist/action-class.js.map +1 -1
  4. package/dist/bridge-timeouts.d.ts +64 -0
  5. package/dist/bridge-timeouts.js +118 -0
  6. package/dist/bridge-timeouts.js.map +1 -0
  7. package/dist/bridge.js +10 -2
  8. package/dist/bridge.js.map +1 -1
  9. package/dist/editor-control.d.ts +72 -5
  10. package/dist/editor-control.js +164 -140
  11. package/dist/editor-control.js.map +1 -1
  12. package/dist/editor-target.d.ts +55 -1
  13. package/dist/editor-target.js +107 -10
  14. package/dist/editor-target.js.map +1 -1
  15. package/dist/engine-observer.d.ts +59 -5
  16. package/dist/engine-observer.js +249 -29
  17. package/dist/engine-observer.js.map +1 -1
  18. package/dist/engine-root.d.ts +91 -0
  19. package/dist/engine-root.js +448 -0
  20. package/dist/engine-root.js.map +1 -0
  21. package/dist/epic-enrich.js +16 -1
  22. package/dist/epic-enrich.js.map +1 -1
  23. package/dist/feedback-cli.js +4 -0
  24. package/dist/feedback-cli.js.map +1 -1
  25. package/dist/feedback-deferred.d.ts +9 -0
  26. package/dist/feedback-deferred.js +2 -0
  27. package/dist/feedback-deferred.js.map +1 -1
  28. package/dist/feedback-fallback.d.ts +99 -0
  29. package/dist/feedback-fallback.js +173 -0
  30. package/dist/feedback-fallback.js.map +1 -0
  31. package/dist/flow/write-methods.js +20 -0
  32. package/dist/flow/write-methods.js.map +1 -1
  33. package/dist/index.js +41 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/lean-context.js +8 -3
  36. package/dist/lean-context.js.map +1 -1
  37. package/dist/locking.js +11 -2
  38. package/dist/locking.js.map +1 -1
  39. package/dist/plugin/loader.d.ts +4 -0
  40. package/dist/plugin/loader.js +22 -8
  41. package/dist/plugin/loader.js.map +1 -1
  42. package/dist/plugin/manifest.d.ts +72 -52
  43. package/dist/plugin/manifest.js +118 -21
  44. package/dist/plugin/manifest.js.map +1 -1
  45. package/dist/plugin-cli.js +16 -3
  46. package/dist/plugin-cli.js.map +1 -1
  47. package/dist/project.d.ts +11 -0
  48. package/dist/project.js +23 -2
  49. package/dist/project.js.map +1 -1
  50. package/dist/python-gate.d.ts +95 -0
  51. package/dist/python-gate.js +175 -0
  52. package/dist/python-gate.js.map +1 -0
  53. package/dist/tool-counts.json +16 -16
  54. package/dist/tools/animation.js +288 -24
  55. package/dist/tools/animation.js.map +1 -1
  56. package/dist/tools/asset.js +79 -14
  57. package/dist/tools/asset.js.map +1 -1
  58. package/dist/tools/audio.js +59 -5
  59. package/dist/tools/audio.js.map +1 -1
  60. package/dist/tools/blueprint.js +29 -12
  61. package/dist/tools/blueprint.js.map +1 -1
  62. package/dist/tools/chooser.js +4 -1
  63. package/dist/tools/chooser.js.map +1 -1
  64. package/dist/tools/editor.js +81 -43
  65. package/dist/tools/editor.js.map +1 -1
  66. package/dist/tools/feedback.js +214 -48
  67. package/dist/tools/feedback.js.map +1 -1
  68. package/dist/tools/foliage.js +27 -1
  69. package/dist/tools/foliage.js.map +1 -1
  70. package/dist/tools/gameplay.js +38 -11
  71. package/dist/tools/gameplay.js.map +1 -1
  72. package/dist/tools/gas.js +17 -5
  73. package/dist/tools/gas.js.map +1 -1
  74. package/dist/tools/landscape.js +22 -7
  75. package/dist/tools/landscape.js.map +1 -1
  76. package/dist/tools/level.js +322 -51
  77. package/dist/tools/level.js.map +1 -1
  78. package/dist/tools/material.js +10 -4
  79. package/dist/tools/material.js.map +1 -1
  80. package/dist/tools/niagara.js +3 -2
  81. package/dist/tools/niagara.js.map +1 -1
  82. package/dist/tools/pcg.js +6 -5
  83. package/dist/tools/pcg.js.map +1 -1
  84. package/dist/tools/plugins.js +2 -0
  85. package/dist/tools/plugins.js.map +1 -1
  86. package/dist/tools/project.js +47 -20
  87. package/dist/tools/project.js.map +1 -1
  88. package/dist/types.d.ts +24 -0
  89. package/dist/types.js +46 -3
  90. package/dist/types.js.map +1 -1
  91. package/dist/ue-mcp.default.yml +493 -125
  92. package/package.json +2 -2
  93. package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
  94. package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
  95. package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
  96. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
  97. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
  98. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
  99. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
  100. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
  101. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
  102. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
  103. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
  104. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
  105. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
  106. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
  107. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
  108. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
  109. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
  110. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
  111. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
  112. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
  113. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
  114. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
  115. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
  116. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
  117. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
  118. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
  119. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
  120. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
  121. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
  122. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
  123. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
  124. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
  125. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
  126. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
  127. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
  128. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
  129. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
  130. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
  131. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
  132. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
  133. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
  134. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
  135. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
  136. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
  137. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
  138. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
  139. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
  140. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
  141. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
  142. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
  143. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
  144. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
  145. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
  146. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
  147. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
  148. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
  149. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
  150. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
  151. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
  152. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
  153. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
  154. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
  155. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
  156. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
  157. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
  158. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
  159. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
  160. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
  161. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
  162. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
  163. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
  164. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
  165. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
  166. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
  167. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
  168. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
  169. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
  170. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
  171. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
  172. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
  173. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
  174. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
  175. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
  176. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
  177. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
  178. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
  179. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
  180. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
  181. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
  182. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
  183. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
  184. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
  185. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
  186. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
  187. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
  188. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
  189. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
  190. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
  191. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
  192. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
  193. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
  194. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
  195. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
  196. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
  197. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
  198. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
  199. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
  200. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
  201. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
  202. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
  203. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
  204. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
  205. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
  206. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
  207. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
  208. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
  209. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
  210. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
  211. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
  212. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
  213. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
  214. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
  215. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
  216. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
  217. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
  218. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
  219. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
  220. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
  221. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
  222. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
  223. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
  224. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
  225. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
  226. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
  227. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
  228. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
  229. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
  230. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
  231. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
  232. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
  233. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
  234. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
  235. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
  236. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
  237. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
  238. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
  239. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
  240. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
  241. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
  242. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
  243. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
  244. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
  245. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
  246. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
  247. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
  248. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
  249. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
  250. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
  251. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
  252. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
  253. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
  254. package/skills/ue-mcp-animation/SKILL.md +154 -0
  255. package/skills/ue-mcp-blueprint/SKILL.md +71 -0
@@ -0,0 +1,235 @@
1
+ // Coverage for asset(create_subobject) (#975).
2
+ //
3
+ // The two failures the issue is about are both about survival, not creation:
4
+ // a fresh object with nothing referencing it was collected inside roughly one
5
+ // bridge call, and a plugin class had to be nameable by /Script path because
6
+ // the Python `unreal` module does not expose it. Both are asserted here, along
7
+ // with the preflight that stops a bad property from creating a half-configured
8
+ // object.
9
+ //
10
+ // The test writes nowhere near the attached project. run_automation_tests
11
+ // dispatches every EditorContext/EngineFilter test in the process against
12
+ // whatever project the bridge happens to be attached to, so this registers its
13
+ // own mount point over a fresh directory in the system temp area, does the whole
14
+ // exercise there, then unmounts and deletes it.
15
+
16
+ #if WITH_DEV_AUTOMATION_TESTS
17
+
18
+ #include "HandlerRegistry.h"
19
+ #include "HandlerUtils.h"
20
+ #include "Handlers/AssetHandlers.h"
21
+
22
+ #include "Dom/JsonObject.h"
23
+ #include "Dom/JsonValue.h"
24
+ #include "Engine/DataTable.h"
25
+ #include "HAL/FileManager.h"
26
+ #include "HAL/PlatformProcess.h"
27
+ #include "Misc/AutomationTest.h"
28
+ #include "Misc/Guid.h"
29
+ #include "Misc/PackageName.h"
30
+ #include "Misc/Paths.h"
31
+ #include "UObject/Package.h"
32
+ #include "UObject/PerPlatformProperties.h"
33
+
34
+ namespace
35
+ {
36
+ const TCHAR* const MCPSubobjectTestRoot = TEXT("/UEMCPSubobjectTest/");
37
+
38
+ /** Mount a private content root for the duration of the test and take it
39
+ * back down again, so no assertion here can touch a user's content. */
40
+ struct FScopedSubobjectTestMount
41
+ {
42
+ FString RootPath;
43
+ FString ContentPath;
44
+
45
+ FScopedSubobjectTestMount()
46
+ : RootPath(MCPSubobjectTestRoot)
47
+ , ContentPath(FPaths::Combine(
48
+ FPaths::ConvertRelativePathToFull(FString(FPlatformProcess::UserTempDir())),
49
+ FString(TEXT("UEMCPSubobjectTest")),
50
+ FGuid::NewGuid().ToString(EGuidFormats::Digits)))
51
+ {
52
+ IFileManager::Get().MakeDirectory(*ContentPath, /*Tree=*/true);
53
+ FPackageName::RegisterMountPoint(RootPath, ContentPath);
54
+ }
55
+
56
+ ~FScopedSubobjectTestMount()
57
+ {
58
+ FPackageName::UnRegisterMountPoint(RootPath, ContentPath);
59
+ IFileManager::Get().DeleteDirectory(*ContentPath, /*RequireExists=*/false, /*Tree=*/true);
60
+ }
61
+
62
+ FScopedSubobjectTestMount(const FScopedSubobjectTestMount&) = delete;
63
+ FScopedSubobjectTestMount& operator=(const FScopedSubobjectTestMount&) = delete;
64
+ };
65
+
66
+ TSharedPtr<FJsonObject> SubobjectResponseObject(const TSharedPtr<FJsonValue>& Response)
67
+ {
68
+ return (Response.IsValid() && Response->Type == EJson::Object)
69
+ ? Response->AsObject()
70
+ : TSharedPtr<FJsonObject>();
71
+ }
72
+
73
+ bool SubobjectResponseBool(const TSharedPtr<FJsonValue>& Response, const TCHAR* Field, bool bDefault = false)
74
+ {
75
+ const TSharedPtr<FJsonObject> Obj = SubobjectResponseObject(Response);
76
+ if (!Obj.IsValid()) return bDefault;
77
+ bool bValue = bDefault;
78
+ Obj->TryGetBoolField(Field, bValue);
79
+ return bValue;
80
+ }
81
+
82
+ FString SubobjectResponseString(const TSharedPtr<FJsonValue>& Response, const TCHAR* Field)
83
+ {
84
+ const TSharedPtr<FJsonObject> Obj = SubobjectResponseObject(Response);
85
+ if (!Obj.IsValid()) return FString();
86
+ FString Value;
87
+ Obj->TryGetStringField(Field, Value);
88
+ return Value;
89
+ }
90
+ }
91
+
92
+ IMPLEMENT_SIMPLE_AUTOMATION_TEST(
93
+ FMCPCreateSubobjectTest,
94
+ "UE.MCP.Asset.CreateSubobject.SurvivesCollectionAndReachesThePackage",
95
+ EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
96
+
97
+ bool FMCPCreateSubobjectTest::RunTest(const FString& Parameters)
98
+ {
99
+ const FScopedSubobjectTestMount Mount;
100
+
101
+ const FString PackageName = FString(MCPSubobjectTestRoot) + TEXT("DA_SubobjectOwner");
102
+ UPackage* Package = CreatePackage(*PackageName);
103
+ if (!TestNotNull(TEXT("owner package created"), Package)) return false;
104
+
105
+ UDataTable* Owner = NewObject<UDataTable>(
106
+ Package, FName(TEXT("DA_SubobjectOwner")), RF_Public | RF_Standalone);
107
+ if (!TestNotNull(TEXT("owner asset created"), Owner))
108
+ {
109
+ Package->SetDirtyFlag(false);
110
+ return false;
111
+ }
112
+ Owner->RowStruct = FPerPlatformInt::StaticStruct();
113
+ const FGCRootScope KeepOwnerAlive(Owner);
114
+
115
+ FMCPHandlerRegistry Registry;
116
+ FAssetHandlers::RegisterHandlers(Registry);
117
+ if (!TestTrue(TEXT("create_subobject is registered"), Registry.HasHandler(TEXT("create_subobject"))))
118
+ {
119
+ Package->SetDirtyFlag(false);
120
+ return false;
121
+ }
122
+
123
+ // A component class named by its /Script object path: the two things
124
+ // create_asset_by_class could not do (#975).
125
+ {
126
+ TSharedPtr<FJsonObject> Params = MakeShared<FJsonObject>();
127
+ Params->SetStringField(TEXT("assetPath"), PackageName);
128
+ Params->SetStringField(TEXT("className"), TEXT("/Script/Engine.StaticMeshComponent"));
129
+ Params->SetStringField(TEXT("name"), TEXT("PayloadEntry"));
130
+
131
+ const TSharedPtr<FJsonValue> Response = Registry.ExecuteHandler(TEXT("create_subobject"), Params);
132
+ TestTrue(FString::Printf(TEXT("the subobject was created (%s)"),
133
+ *SubobjectResponseString(Response, TEXT("error"))),
134
+ SubobjectResponseBool(Response, TEXT("success")));
135
+ TestTrue(TEXT("the response reports it as newly created"),
136
+ SubobjectResponseBool(Response, TEXT("created")));
137
+ TestEqual(TEXT("the response names the resolved class"),
138
+ SubobjectResponseString(Response, TEXT("className")), FString(TEXT("StaticMeshComponent")));
139
+
140
+ const FString ObjectPath = SubobjectResponseString(Response, TEXT("objectPath"));
141
+ TestFalse(TEXT("the response returns an object path to use in later writes"), ObjectPath.IsEmpty());
142
+
143
+ UObject* Created = StaticFindObjectFast(
144
+ UObject::StaticClass(), Owner, FName(TEXT("PayloadEntry")));
145
+ if (!TestNotNull(TEXT("the subobject is owned by the asset"), Created))
146
+ {
147
+ Package->SetDirtyFlag(false);
148
+ return false;
149
+ }
150
+ TestEqual(TEXT("the reported object path is the subobject's own"),
151
+ ObjectPath, Created->GetPathName());
152
+ TestTrue(TEXT("the subobject lives in the owner's package"),
153
+ Created->GetOutermost() == Package);
154
+
155
+ // The heart of the issue: an object nothing references must survive a
156
+ // collection, because the caller cannot reference it until the next
157
+ // call. RF_Standalone is what carries it across.
158
+ TestTrue(TEXT("the subobject is standalone, so nothing collects it before it is referenced"),
159
+ Created->HasAnyFlags(RF_Standalone));
160
+ const TWeakObjectPtr<UObject> WeakCreated(Created);
161
+ CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS);
162
+ TestTrue(TEXT("the subobject survives a garbage collection with nothing referencing it"),
163
+ WeakCreated.IsValid());
164
+ TestTrue(TEXT("the subobject is still resolvable by path after a collection"),
165
+ MCPLoadAssetObject(ObjectPath) != nullptr);
166
+ }
167
+
168
+ // Replaying the same call reuses the object rather than creating a second.
169
+ {
170
+ TSharedPtr<FJsonObject> Params = MakeShared<FJsonObject>();
171
+ Params->SetStringField(TEXT("assetPath"), PackageName);
172
+ Params->SetStringField(TEXT("className"), TEXT("/Script/Engine.StaticMeshComponent"));
173
+ Params->SetStringField(TEXT("name"), TEXT("PayloadEntry"));
174
+
175
+ const TSharedPtr<FJsonValue> Response = Registry.ExecuteHandler(TEXT("create_subobject"), Params);
176
+ TestTrue(TEXT("a replay succeeds"), SubobjectResponseBool(Response, TEXT("success")));
177
+ TestTrue(TEXT("a replay reports the subobject as already existing"),
178
+ SubobjectResponseBool(Response, TEXT("existed")));
179
+ TestFalse(TEXT("a replay creates nothing"),
180
+ SubobjectResponseBool(Response, TEXT("created"), true));
181
+ }
182
+
183
+ // A property that cannot apply rejects the call before anything is created.
184
+ {
185
+ TSharedPtr<FJsonObject> BadProperties = MakeShared<FJsonObject>();
186
+ BadProperties->SetStringField(TEXT("NoSuchPropertyOnThisClass"), TEXT("x"));
187
+
188
+ TSharedPtr<FJsonObject> Params = MakeShared<FJsonObject>();
189
+ Params->SetStringField(TEXT("assetPath"), PackageName);
190
+ Params->SetStringField(TEXT("className"), TEXT("/Script/Engine.StaticMeshComponent"));
191
+ Params->SetStringField(TEXT("name"), TEXT("NeverCreated"));
192
+ Params->SetObjectField(TEXT("properties"), BadProperties);
193
+
194
+ const TSharedPtr<FJsonValue> Response = Registry.ExecuteHandler(TEXT("create_subobject"), Params);
195
+ TestFalse(TEXT("a bad property fails the call"),
196
+ SubobjectResponseBool(Response, TEXT("success"), true));
197
+ TestEqual(TEXT("the failure names the preflight"),
198
+ SubobjectResponseString(Response, TEXT("reason")), FString(TEXT("property_preflight_failed")));
199
+ TestNull(TEXT("nothing was created for the rejected call"),
200
+ StaticFindObjectFast(UObject::StaticClass(), Owner, FName(TEXT("NeverCreated"))));
201
+ }
202
+
203
+ // An Actor class is refused rather than constructed outside a level.
204
+ {
205
+ TSharedPtr<FJsonObject> Params = MakeShared<FJsonObject>();
206
+ Params->SetStringField(TEXT("assetPath"), PackageName);
207
+ Params->SetStringField(TEXT("className"), TEXT("/Script/Engine.StaticMeshActor"));
208
+ Params->SetStringField(TEXT("name"), TEXT("NotAnActor"));
209
+
210
+ const TSharedPtr<FJsonValue> Response = Registry.ExecuteHandler(TEXT("create_subobject"), Params);
211
+ TestFalse(TEXT("an Actor class is refused"),
212
+ SubobjectResponseBool(Response, TEXT("success"), true));
213
+ TestEqual(TEXT("the refusal says why"),
214
+ SubobjectResponseString(Response, TEXT("reason")), FString(TEXT("actor_class")));
215
+ }
216
+
217
+ // A protected mount is refused before anything is resolved.
218
+ {
219
+ TSharedPtr<FJsonObject> Params = MakeShared<FJsonObject>();
220
+ Params->SetStringField(TEXT("assetPath"), TEXT("/Engine/EngineMaterials/DefaultMaterial"));
221
+ Params->SetStringField(TEXT("className"), TEXT("/Script/Engine.StaticMeshComponent"));
222
+ Params->SetStringField(TEXT("name"), TEXT("NeverCreated"));
223
+
224
+ const TSharedPtr<FJsonValue> Response = Registry.ExecuteHandler(TEXT("create_subobject"), Params);
225
+ TestFalse(TEXT("a protected mount is refused"),
226
+ SubobjectResponseBool(Response, TEXT("success"), true));
227
+ }
228
+
229
+ // Leave nothing dirty behind: a later editor(save_dirty) would otherwise
230
+ // find this package and try to flush it through an unmounted root.
231
+ Package->SetDirtyFlag(false);
232
+ return true;
233
+ }
234
+
235
+ #endif
@@ -0,0 +1,72 @@
1
+ #if WITH_DEV_AUTOMATION_TESTS
2
+
3
+ #include "Misc/AutomationTest.h"
4
+ #include "Misc/ScopeExit.h"
5
+
6
+ /**
7
+ * The invariant run_automation_tests depends on to stop taking the editor down.
8
+ *
9
+ * #993: FAutomationTestFramework::StopTest asserts LatentCommands.IsEmpty()
10
+ * inside InternalStopTest, and the handler called it unconditionally after a
11
+ * drain loop bounded by a fixed iteration count. A CQTest test that starts
12
+ * multi-client PIE still had commands queued at that point, so the assert fired
13
+ * and terminated the editor; the caller saw a WebSocket close 1006 instead of a
14
+ * test result.
15
+ *
16
+ * The handler now asks IsLatentCommandQueueEmpty() and, when the answer is no,
17
+ * clears the queue with DequeueAllCommands() and reports the test as abandoned
18
+ * rather than stopping it mid-queue. Both halves of that are asserted here:
19
+ * that the framework really does report a queued command, and that dequeuing
20
+ * really does restore the precondition StopTest requires.
21
+ */
22
+ class FMCPNeverCompletingLatentCommand : public IAutomationLatentCommand
23
+ {
24
+ public:
25
+ virtual bool Update() override
26
+ {
27
+ // The shape of a latent command waiting on something that only engine
28
+ // frames can deliver: it never completes from inside a handler that
29
+ // holds the game thread.
30
+ return false;
31
+ }
32
+ };
33
+
34
+ IMPLEMENT_SIMPLE_AUTOMATION_TEST(
35
+ FMCPAutomationLatentQueueTest,
36
+ "UE.MCP.Bridge.Automation.LatentQueueGuard",
37
+ EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
38
+
39
+ bool FMCPAutomationLatentQueueTest::RunTest(const FString& Parameters)
40
+ {
41
+ FAutomationTestFramework& Framework = FAutomationTestFramework::Get();
42
+
43
+ // Whatever happens below, this test must not be the thing that leaves a
44
+ // command queued: its own StopTest would then hit the same assert.
45
+ ON_SCOPE_EXIT
46
+ {
47
+ FAutomationTestFramework::Get().DequeueAllCommands();
48
+ };
49
+
50
+ TestTrue(TEXT("nothing is queued before the test enqueues anything"),
51
+ Framework.IsLatentCommandQueueEmpty());
52
+
53
+ Framework.EnqueueLatentCommand(MakeShared<FMCPNeverCompletingLatentCommand>());
54
+ TestFalse(TEXT("a queued latent command is visible to the guard"),
55
+ Framework.IsLatentCommandQueueEmpty());
56
+
57
+ // Draining does not help: this is the command that cannot finish, which is
58
+ // exactly the case the handler has to survive rather than assert on.
59
+ Framework.ExecuteLatentCommands();
60
+ TestFalse(TEXT("a command that never completes stays queued through a drain"),
61
+ Framework.IsLatentCommandQueueEmpty());
62
+
63
+ // And the recovery. This is the only reason StopTest is reachable at all
64
+ // once a test has outstanding latent work.
65
+ Framework.DequeueAllCommands();
66
+ TestTrue(TEXT("dequeuing restores the precondition StopTest asserts on"),
67
+ Framework.IsLatentCommandQueueEmpty());
68
+
69
+ return true;
70
+ }
71
+
72
+ #endif