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.
- package/README.md +4 -3
- package/dist/action-class.js +56 -3
- package/dist/action-class.js.map +1 -1
- package/dist/bridge-timeouts.d.ts +64 -0
- package/dist/bridge-timeouts.js +118 -0
- package/dist/bridge-timeouts.js.map +1 -0
- package/dist/bridge.js +10 -2
- package/dist/bridge.js.map +1 -1
- package/dist/editor-control.d.ts +72 -5
- package/dist/editor-control.js +164 -140
- package/dist/editor-control.js.map +1 -1
- package/dist/editor-target.d.ts +55 -1
- package/dist/editor-target.js +107 -10
- package/dist/editor-target.js.map +1 -1
- package/dist/engine-observer.d.ts +59 -5
- package/dist/engine-observer.js +249 -29
- package/dist/engine-observer.js.map +1 -1
- package/dist/engine-root.d.ts +91 -0
- package/dist/engine-root.js +448 -0
- package/dist/engine-root.js.map +1 -0
- package/dist/epic-enrich.js +16 -1
- package/dist/epic-enrich.js.map +1 -1
- package/dist/feedback-cli.js +4 -0
- package/dist/feedback-cli.js.map +1 -1
- package/dist/feedback-deferred.d.ts +9 -0
- package/dist/feedback-deferred.js +2 -0
- package/dist/feedback-deferred.js.map +1 -1
- package/dist/feedback-fallback.d.ts +99 -0
- package/dist/feedback-fallback.js +173 -0
- package/dist/feedback-fallback.js.map +1 -0
- package/dist/flow/write-methods.js +20 -0
- package/dist/flow/write-methods.js.map +1 -1
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/lean-context.js +8 -3
- package/dist/lean-context.js.map +1 -1
- package/dist/locking.js +11 -2
- package/dist/locking.js.map +1 -1
- package/dist/plugin/loader.d.ts +4 -0
- package/dist/plugin/loader.js +22 -8
- package/dist/plugin/loader.js.map +1 -1
- package/dist/plugin/manifest.d.ts +72 -52
- package/dist/plugin/manifest.js +118 -21
- package/dist/plugin/manifest.js.map +1 -1
- package/dist/plugin-cli.js +16 -3
- package/dist/plugin-cli.js.map +1 -1
- package/dist/project.d.ts +11 -0
- package/dist/project.js +23 -2
- package/dist/project.js.map +1 -1
- package/dist/python-gate.d.ts +95 -0
- package/dist/python-gate.js +175 -0
- package/dist/python-gate.js.map +1 -0
- package/dist/tool-counts.json +16 -16
- package/dist/tools/animation.js +288 -24
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/asset.js +79 -14
- package/dist/tools/asset.js.map +1 -1
- package/dist/tools/audio.js +59 -5
- package/dist/tools/audio.js.map +1 -1
- package/dist/tools/blueprint.js +29 -12
- package/dist/tools/blueprint.js.map +1 -1
- package/dist/tools/chooser.js +4 -1
- package/dist/tools/chooser.js.map +1 -1
- package/dist/tools/editor.js +81 -43
- package/dist/tools/editor.js.map +1 -1
- package/dist/tools/feedback.js +214 -48
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/foliage.js +27 -1
- package/dist/tools/foliage.js.map +1 -1
- package/dist/tools/gameplay.js +38 -11
- package/dist/tools/gameplay.js.map +1 -1
- package/dist/tools/gas.js +17 -5
- package/dist/tools/gas.js.map +1 -1
- package/dist/tools/landscape.js +22 -7
- package/dist/tools/landscape.js.map +1 -1
- package/dist/tools/level.js +322 -51
- package/dist/tools/level.js.map +1 -1
- package/dist/tools/material.js +10 -4
- package/dist/tools/material.js.map +1 -1
- package/dist/tools/niagara.js +3 -2
- package/dist/tools/niagara.js.map +1 -1
- package/dist/tools/pcg.js +6 -5
- package/dist/tools/pcg.js.map +1 -1
- package/dist/tools/plugins.js +2 -0
- package/dist/tools/plugins.js.map +1 -1
- package/dist/tools/project.js +47 -20
- package/dist/tools/project.js.map +1 -1
- package/dist/types.d.ts +24 -0
- package/dist/types.js +46 -3
- package/dist/types.js.map +1 -1
- package/dist/ue-mcp.default.yml +493 -125
- package/package.json +2 -2
- package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
- package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
- package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
- package/skills/ue-mcp-animation/SKILL.md +154 -0
- 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
|