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
@@ -7,6 +7,9 @@
7
7
  #include "EdGraph/EdGraphPin.h"
8
8
  #include "Engine/SimpleConstructionScript.h"
9
9
  #include "Engine/SCS_Node.h"
10
+ #include "Animation/Skeleton.h"
11
+ #include "Engine/SkeletalMesh.h"
12
+ #include "ReferenceSkeleton.h"
10
13
 
11
14
  // ── Structural extraction helpers ────────────────────────────────────────────
12
15
  namespace
@@ -91,6 +94,68 @@ namespace
91
94
  for (const FString& S : In) Out.Add(MakeShared<FJsonValueString>(S));
92
95
  return Out;
93
96
  }
97
+
98
+ struct FVirtualBoneDiffRecord
99
+ {
100
+ FName Name;
101
+ FName Source;
102
+ FName Target;
103
+
104
+ bool operator==(const FVirtualBoneDiffRecord& Other) const
105
+ {
106
+ return Name == Other.Name && Source == Other.Source && Target == Other.Target;
107
+ }
108
+ };
109
+
110
+ bool VirtualBoneRecordLess(const FVirtualBoneDiffRecord& A, const FVirtualBoneDiffRecord& B)
111
+ {
112
+ if (A.Name != B.Name) return A.Name.ToString() < B.Name.ToString();
113
+ if (A.Source != B.Source) return A.Source.ToString() < B.Source.ToString();
114
+ return A.Target.ToString() < B.Target.ToString();
115
+ }
116
+
117
+ TArray<FVirtualBoneDiffRecord> CollectVirtualBones(const USkeleton* Skeleton)
118
+ {
119
+ TArray<FVirtualBoneDiffRecord> Out;
120
+ if (!Skeleton)
121
+ {
122
+ return Out;
123
+ }
124
+ Out.Reserve(Skeleton->GetVirtualBones().Num());
125
+ for (const FVirtualBone& Bone : Skeleton->GetVirtualBones())
126
+ {
127
+ Out.Add({
128
+ Bone.VirtualBoneName,
129
+ Bone.SourceBoneName,
130
+ Bone.TargetBoneName
131
+ });
132
+ }
133
+ Out.Sort(VirtualBoneRecordLess);
134
+ return Out;
135
+ }
136
+
137
+ TArray<TSharedPtr<FJsonValue>> VirtualBonesToJson(const TArray<FVirtualBoneDiffRecord>& In)
138
+ {
139
+ TArray<TSharedPtr<FJsonValue>> Out;
140
+ Out.Reserve(In.Num());
141
+ for (const FVirtualBoneDiffRecord& Bone : In)
142
+ {
143
+ TSharedPtr<FJsonObject> Obj = MakeShared<FJsonObject>();
144
+ Obj->SetStringField(TEXT("name"), Bone.Name.ToString());
145
+ Obj->SetStringField(TEXT("sourceBone"), Bone.Source.ToString());
146
+ Obj->SetStringField(TEXT("targetBone"), Bone.Target.ToString());
147
+ Out.Add(MakeShared<FJsonValueObject>(Obj));
148
+ }
149
+ return Out;
150
+ }
151
+
152
+ FName RawParentName(const TArray<FMeshBoneInfo>& Bones, int32 BoneIndex)
153
+ {
154
+ const int32 ParentIndex = Bones[BoneIndex].ParentIndex;
155
+ if (ParentIndex == INDEX_NONE) return NAME_None;
156
+ if (Bones.IsValidIndex(ParentIndex)) return Bones[ParentIndex].Name;
157
+ return FName(*FString::Printf(TEXT("<invalid:%d>"), ParentIndex));
158
+ }
94
159
  }
95
160
 
96
161
  void FDiffHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
@@ -309,6 +374,187 @@ TSharedPtr<FJsonValue> FDiffHandlers::DiffBlueprint(const TSharedPtr<FJsonObject
309
374
  return MCPResult(Result);
310
375
  }
311
376
 
377
+ TSharedPtr<FJsonValue> FDiffHandlers::DiffSkeleton(const TSharedPtr<FJsonObject>& Params)
378
+ {
379
+ FString PathA;
380
+ if (TSharedPtr<FJsonValue> Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), PathA)) return Err;
381
+ FString PathB;
382
+ if (TSharedPtr<FJsonValue> Err = RequireString(Params, TEXT("otherPath"), PathB)) return Err;
383
+
384
+ UObject* AssetA = LoadAssetByPath<UObject>(PathA);
385
+ if (!AssetA) return MCPError(FString::Printf(TEXT("Asset not found: %s"), *PathA));
386
+ const bool bSkeletonAssets = AssetA->GetClass() == USkeleton::StaticClass();
387
+ const bool bSkeletalMeshAssets = AssetA->GetClass() == USkeletalMesh::StaticClass();
388
+ if (!bSkeletonAssets && !bSkeletalMeshAssets)
389
+ {
390
+ return MCPError(FString::Printf(
391
+ TEXT("Asset at '%s' must be exactly a Skeleton or SkeletalMesh; found '%s'"),
392
+ *PathA, *AssetA->GetClass()->GetName()));
393
+ }
394
+
395
+ UObject* AssetB = LoadAssetByPath<UObject>(PathB);
396
+ if (!AssetB) return MCPError(FString::Printf(TEXT("Asset not found: %s"), *PathB));
397
+ if (AssetB->GetClass() != AssetA->GetClass())
398
+ {
399
+ return MCPError(FString::Printf(
400
+ TEXT("Asset at '%s' must be exactly a %s to match the first asset; found '%s'"),
401
+ *PathB, *AssetA->GetClass()->GetName(), *AssetB->GetClass()->GetName()));
402
+ }
403
+
404
+ const USkeleton* SkeletonAssetA = bSkeletonAssets ? CastChecked<USkeleton>(AssetA) : nullptr;
405
+ const USkeleton* SkeletonAssetB = bSkeletonAssets ? CastChecked<USkeleton>(AssetB) : nullptr;
406
+ const USkeletalMesh* SkeletalMeshA = bSkeletalMeshAssets ? CastChecked<USkeletalMesh>(AssetA) : nullptr;
407
+ const USkeletalMesh* SkeletalMeshB = bSkeletalMeshAssets ? CastChecked<USkeletalMesh>(AssetB) : nullptr;
408
+ const FReferenceSkeleton& ReferenceA = bSkeletonAssets
409
+ ? SkeletonAssetA->GetReferenceSkeleton()
410
+ : SkeletalMeshA->GetRefSkeleton();
411
+ const FReferenceSkeleton& ReferenceB = bSkeletonAssets
412
+ ? SkeletonAssetB->GetReferenceSkeleton()
413
+ : SkeletalMeshB->GetRefSkeleton();
414
+ const USkeleton* PolicySkeletonA = bSkeletonAssets ? SkeletonAssetA : SkeletalMeshA->GetSkeleton();
415
+ const USkeleton* PolicySkeletonB = bSkeletonAssets ? SkeletonAssetB : SkeletalMeshB->GetSkeleton();
416
+ const TArray<FMeshBoneInfo>& RawA = ReferenceA.GetRawRefBoneInfo();
417
+ const TArray<FMeshBoneInfo>& RawB = ReferenceB.GetRawRefBoneInfo();
418
+
419
+ TMap<FName, FName> ParentByBoneA;
420
+ TMap<FName, FName> ParentByBoneB;
421
+ TMap<FName, int32> IndexByBoneA;
422
+ TMap<FName, int32> IndexByBoneB;
423
+ for (int32 Index = 0; Index < RawA.Num(); ++Index)
424
+ {
425
+ ParentByBoneA.Add(RawA[Index].Name, RawParentName(RawA, Index));
426
+ IndexByBoneA.Add(RawA[Index].Name, Index);
427
+ }
428
+ for (int32 Index = 0; Index < RawB.Num(); ++Index)
429
+ {
430
+ ParentByBoneB.Add(RawB[Index].Name, RawParentName(RawB, Index));
431
+ IndexByBoneB.Add(RawB[Index].Name, Index);
432
+ }
433
+
434
+ TArray<FString> RawBonesAdded;
435
+ TArray<FString> RawBonesRemoved;
436
+ TArray<FName> SharedRawBones;
437
+ for (const TPair<FName, FName>& Bone : ParentByBoneB)
438
+ {
439
+ if (!ParentByBoneA.Contains(Bone.Key)) RawBonesAdded.Add(Bone.Key.ToString());
440
+ }
441
+ for (const TPair<FName, FName>& Bone : ParentByBoneA)
442
+ {
443
+ if (ParentByBoneB.Contains(Bone.Key)) SharedRawBones.Add(Bone.Key);
444
+ else RawBonesRemoved.Add(Bone.Key.ToString());
445
+ }
446
+ RawBonesAdded.Sort();
447
+ RawBonesRemoved.Sort();
448
+ SharedRawBones.Sort([](const FName& Left, const FName& Right)
449
+ {
450
+ return Left.ToString() < Right.ToString();
451
+ });
452
+
453
+ TArray<TSharedPtr<FJsonValue>> Reparented;
454
+ TArray<TSharedPtr<FJsonValue>> RawBoneIndexChanges;
455
+ bool bSharedParentsMatch = true;
456
+ for (const FName& BoneName : SharedRawBones)
457
+ {
458
+ const FName ParentA = ParentByBoneA.FindChecked(BoneName);
459
+ const FName ParentB = ParentByBoneB.FindChecked(BoneName);
460
+ if (ParentA != ParentB)
461
+ {
462
+ bSharedParentsMatch = false;
463
+ TSharedPtr<FJsonObject> Delta = MakeShared<FJsonObject>();
464
+ Delta->SetStringField(TEXT("bone"), BoneName.ToString());
465
+ Delta->SetStringField(TEXT("fromParent"), ParentA.ToString());
466
+ Delta->SetStringField(TEXT("toParent"), ParentB.ToString());
467
+ Reparented.Add(MakeShared<FJsonValueObject>(Delta));
468
+ }
469
+
470
+ const int32 IndexA = IndexByBoneA.FindChecked(BoneName);
471
+ const int32 IndexB = IndexByBoneB.FindChecked(BoneName);
472
+ if (IndexA != IndexB)
473
+ {
474
+ TSharedPtr<FJsonObject> Delta = MakeShared<FJsonObject>();
475
+ Delta->SetStringField(TEXT("bone"), BoneName.ToString());
476
+ Delta->SetNumberField(TEXT("fromIndex"), IndexA);
477
+ Delta->SetNumberField(TEXT("toIndex"), IndexB);
478
+ RawBoneIndexChanges.Add(MakeShared<FJsonValueObject>(Delta));
479
+ }
480
+ }
481
+
482
+ const TArray<FVirtualBoneDiffRecord> VirtualA = CollectVirtualBones(PolicySkeletonA);
483
+ const TArray<FVirtualBoneDiffRecord> VirtualB = CollectVirtualBones(PolicySkeletonB);
484
+ TArray<FVirtualBoneDiffRecord> VirtualBonesAdded;
485
+ TArray<FVirtualBoneDiffRecord> VirtualBonesRemoved;
486
+ for (const FVirtualBoneDiffRecord& Bone : VirtualB)
487
+ {
488
+ if (!VirtualA.Contains(Bone)) VirtualBonesAdded.Add(Bone);
489
+ }
490
+ for (const FVirtualBoneDiffRecord& Bone : VirtualA)
491
+ {
492
+ if (!VirtualB.Contains(Bone)) VirtualBonesRemoved.Add(Bone);
493
+ }
494
+ VirtualBonesAdded.Sort(VirtualBoneRecordLess);
495
+ VirtualBonesRemoved.Sort(VirtualBoneRecordLess);
496
+
497
+ const bool bSameRawRoot = RawA.Num() > 0
498
+ && RawB.Num() > 0
499
+ && RawA[0].ParentIndex == INDEX_NONE
500
+ && RawB[0].ParentIndex == INDEX_NONE
501
+ && RawA[0].Name == RawB[0].Name;
502
+ const bool bHierarchyCompatible = bSameRawRoot && bSharedParentsMatch;
503
+ const bool bEditorCompatible = PolicySkeletonA
504
+ && PolicySkeletonB
505
+ && (PolicySkeletonA == PolicySkeletonB
506
+ || PolicySkeletonA->IsCompatibleForEditor(PolicySkeletonB)
507
+ || PolicySkeletonB->IsCompatibleForEditor(PolicySkeletonA));
508
+ const int32 ChangeCount = RawBonesAdded.Num()
509
+ + RawBonesRemoved.Num()
510
+ + Reparented.Num()
511
+ + RawBoneIndexChanges.Num()
512
+ + VirtualBonesAdded.Num()
513
+ + VirtualBonesRemoved.Num();
514
+
515
+ TSharedPtr<FJsonObject> Result = MCPSuccess();
516
+ const FString AssetType = bSkeletonAssets ? TEXT("Skeleton") : TEXT("SkeletalMesh");
517
+ Result->SetStringField(TEXT("assetType"), AssetType);
518
+ Result->SetStringField(TEXT("from"), PathA);
519
+ Result->SetStringField(TEXT("to"), PathB);
520
+ Result->SetNumberField(TEXT("boneCountFrom"), ReferenceA.GetNum());
521
+ Result->SetNumberField(TEXT("boneCountTo"), ReferenceB.GetNum());
522
+ Result->SetNumberField(TEXT("rawBoneCountFrom"), RawA.Num());
523
+ Result->SetNumberField(TEXT("rawBoneCountTo"), RawB.Num());
524
+ Result->SetNumberField(TEXT("virtualBoneCountFrom"), VirtualA.Num());
525
+ Result->SetNumberField(TEXT("virtualBoneCountTo"), VirtualB.Num());
526
+ Result->SetStringField(TEXT("virtualBoneSourceFrom"), GetPathNameSafe(PolicySkeletonA));
527
+ Result->SetStringField(TEXT("virtualBoneSourceTo"), GetPathNameSafe(PolicySkeletonB));
528
+ Result->SetNumberField(TEXT("sharedRawBoneCount"), SharedRawBones.Num());
529
+ Result->SetArrayField(TEXT("rawBonesAdded"), StringsToJson(RawBonesAdded));
530
+ Result->SetArrayField(TEXT("rawBonesRemoved"), StringsToJson(RawBonesRemoved));
531
+ Result->SetArrayField(TEXT("reparented"), Reparented);
532
+ Result->SetArrayField(TEXT("rawBoneIndexChanges"), RawBoneIndexChanges);
533
+ Result->SetArrayField(TEXT("virtualBonesAdded"), VirtualBonesToJson(VirtualBonesAdded));
534
+ Result->SetArrayField(TEXT("virtualBonesRemoved"), VirtualBonesToJson(VirtualBonesRemoved));
535
+ Result->SetBoolField(TEXT("editorCompatible"), bEditorCompatible);
536
+ Result->SetBoolField(TEXT("hierarchyCompatible"), bHierarchyCompatible);
537
+ Result->SetBoolField(TEXT("referencePoseCompared"), false);
538
+ Result->SetBoolField(TEXT("exportNamesCompared"), false);
539
+ Result->SetStringField(
540
+ TEXT("structureScope"),
541
+ TEXT("raw bone names, parent names, raw indices, and declared virtual bones; excludes reference-pose transforms and export names"));
542
+ Result->SetNumberField(TEXT("changeCount"), ChangeCount);
543
+ Result->SetBoolField(TEXT("structurallyIdentical"), ChangeCount == 0);
544
+ Result->SetBoolField(TEXT("identical"), ChangeCount == 0);
545
+ Result->SetStringField(TEXT("summary"), ChangeCount == 0
546
+ ? FString::Printf(
547
+ TEXT("%s structures are identical: %d final, %d raw, %d declared virtual"),
548
+ *AssetType, ReferenceA.GetNum(), RawA.Num(), VirtualA.Num())
549
+ : FString::Printf(
550
+ TEXT("%s delta: %d change(s), final %d -> %d, raw %d -> %d, declared virtual %d -> %d"),
551
+ *AssetType, ChangeCount,
552
+ ReferenceA.GetNum(), ReferenceB.GetNum(),
553
+ RawA.Num(), RawB.Num(), VirtualA.Num(), VirtualB.Num()));
554
+
555
+ return MCPResult(Result);
556
+ }
557
+
312
558
  TSharedPtr<FJsonValue> FDiffHandlers::DiffAsset(const TSharedPtr<FJsonObject>& Params)
313
559
  {
314
560
  FString PathA;
@@ -320,8 +566,13 @@ TSharedPtr<FJsonValue> FDiffHandlers::DiffAsset(const TSharedPtr<FJsonObject>& P
320
566
  {
321
567
  return DiffBlueprint(Params);
322
568
  }
569
+ if (Asset->GetClass() == USkeleton::StaticClass()
570
+ || Asset->GetClass() == USkeletalMesh::StaticClass())
571
+ {
572
+ return DiffSkeleton(Params);
573
+ }
323
574
  return MCPError(FString::Printf(
324
- TEXT("Diffing '%s' assets is not supported yet. Blueprint diffing is available now; StateTree and other graph assets are staged follow-ups."),
575
+ TEXT("Diffing '%s' assets is not supported yet. Blueprint, Skeleton, and SkeletalMesh diffing are available now; StateTree and other graph assets are staged follow-ups."),
325
576
  *Asset->GetClass()->GetName()));
326
577
  }
327
578
  return MCPError(FString::Printf(TEXT("Asset not found: %s"), *PathA));
@@ -30,7 +30,15 @@ private:
30
30
  // otherPath (compare/B). Reports changes as A -> B.
31
31
  static TSharedPtr<FJsonValue> DiffBlueprint(const TSharedPtr<FJsonObject>& Params);
32
32
 
33
- // Type-routing entry point. Blueprints delegate to DiffBlueprint; other
34
- // asset classes return a clear "not yet supported" until their phase lands.
33
+ // Diff two exact USkeleton or USkeletalMesh assets without emitting full
34
+ // bone dumps. Compares raw bone names, parent names, raw indices, and
35
+ // declared virtual-bone records. Reference-pose transforms, export names,
36
+ // sockets, retarget sources, and other metadata are outside this structural
37
+ // diff. Both inputs must have the same exact asset class.
38
+ static TSharedPtr<FJsonValue> DiffSkeleton(const TSharedPtr<FJsonObject>& Params);
39
+
40
+ // Type-routing entry point. Blueprints, Skeletons, and SkeletalMeshes
41
+ // delegate to their respective semantic diff handlers; unsupported classes
42
+ // fail clearly.
35
43
  static TSharedPtr<FJsonValue> DiffAsset(const TSharedPtr<FJsonObject>& Params);
36
44
  };