ue-mcp 1.2.4 → 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 (243) 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/lean-context.js +8 -3
  34. package/dist/lean-context.js.map +1 -1
  35. package/dist/locking.js +11 -2
  36. package/dist/locking.js.map +1 -1
  37. package/dist/project.d.ts +11 -0
  38. package/dist/project.js +23 -2
  39. package/dist/project.js.map +1 -1
  40. package/dist/python-gate.d.ts +95 -0
  41. package/dist/python-gate.js +175 -0
  42. package/dist/python-gate.js.map +1 -0
  43. package/dist/tool-counts.json +16 -16
  44. package/dist/tools/animation.js +288 -24
  45. package/dist/tools/animation.js.map +1 -1
  46. package/dist/tools/asset.js +79 -14
  47. package/dist/tools/asset.js.map +1 -1
  48. package/dist/tools/audio.js +59 -5
  49. package/dist/tools/audio.js.map +1 -1
  50. package/dist/tools/blueprint.js +29 -12
  51. package/dist/tools/blueprint.js.map +1 -1
  52. package/dist/tools/chooser.js +4 -1
  53. package/dist/tools/chooser.js.map +1 -1
  54. package/dist/tools/editor.js +81 -43
  55. package/dist/tools/editor.js.map +1 -1
  56. package/dist/tools/feedback.js +214 -48
  57. package/dist/tools/feedback.js.map +1 -1
  58. package/dist/tools/foliage.js +27 -1
  59. package/dist/tools/foliage.js.map +1 -1
  60. package/dist/tools/gameplay.js +38 -11
  61. package/dist/tools/gameplay.js.map +1 -1
  62. package/dist/tools/gas.js +17 -5
  63. package/dist/tools/gas.js.map +1 -1
  64. package/dist/tools/landscape.js +22 -7
  65. package/dist/tools/landscape.js.map +1 -1
  66. package/dist/tools/level.js +322 -51
  67. package/dist/tools/level.js.map +1 -1
  68. package/dist/tools/material.js +10 -4
  69. package/dist/tools/material.js.map +1 -1
  70. package/dist/tools/niagara.js +3 -2
  71. package/dist/tools/niagara.js.map +1 -1
  72. package/dist/tools/pcg.js +6 -5
  73. package/dist/tools/pcg.js.map +1 -1
  74. package/dist/tools/project.js +47 -20
  75. package/dist/tools/project.js.map +1 -1
  76. package/dist/types.d.ts +21 -0
  77. package/dist/types.js +46 -3
  78. package/dist/types.js.map +1 -1
  79. package/dist/ue-mcp.default.yml +493 -125
  80. package/package.json +2 -2
  81. package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
  82. package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
  83. package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
  84. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
  85. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
  86. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
  87. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
  88. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
  89. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
  90. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
  91. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
  92. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
  93. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
  94. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
  95. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
  96. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
  97. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
  98. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
  99. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
  100. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
  101. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
  102. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
  103. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
  104. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
  105. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
  106. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
  107. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
  108. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
  109. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
  110. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
  111. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
  112. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
  113. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
  114. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
  115. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
  116. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
  117. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
  118. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
  119. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
  120. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
  121. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
  122. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
  123. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
  124. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
  125. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
  126. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
  127. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
  128. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
  129. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
  130. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
  131. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
  132. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
  133. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
  134. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
  135. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
  136. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
  137. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
  138. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
  139. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
  140. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
  141. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
  142. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
  143. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
  144. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
  145. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
  146. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
  147. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
  148. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
  149. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
  150. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
  151. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
  152. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
  153. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
  154. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
  155. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
  156. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
  157. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
  158. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
  159. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
  160. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
  161. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
  162. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
  163. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
  164. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
  165. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
  166. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
  167. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
  168. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
  169. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
  170. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
  171. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
  172. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
  173. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
  174. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
  175. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
  176. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
  177. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
  178. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
  179. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
  180. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
  181. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
  182. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
  183. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
  184. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
  185. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
  186. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
  187. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
  188. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
  189. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
  190. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
  191. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
  192. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
  193. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
  194. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
  195. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
  196. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
  197. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
  198. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
  199. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
  200. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
  201. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
  202. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
  203. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
  204. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
  205. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
  206. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
  207. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
  208. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
  209. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
  210. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
  211. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
  212. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
  213. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
  214. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
  215. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
  216. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
  217. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
  218. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
  219. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
  220. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
  221. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
  222. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
  223. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
  224. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
  225. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
  226. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
  227. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
  228. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
  229. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
  230. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
  231. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
  232. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
  233. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
  234. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
  235. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
  236. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
  237. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
  238. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
  239. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
  240. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
  241. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
  242. package/skills/ue-mcp-animation/SKILL.md +154 -0
  243. 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
  };