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
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
#include "HAL/PlatformFileManager.h"
|
|
20
20
|
#include "HAL/PlatformFile.h"
|
|
21
21
|
#include "Modules/ModuleManager.h"
|
|
22
|
+
#include "AssetRegistry/AssetRegistryModule.h"
|
|
23
|
+
#include "AssetRegistry/ARFilter.h"
|
|
22
24
|
#if PLATFORM_WINDOWS
|
|
23
25
|
#include "ILiveCodingModule.h"
|
|
24
26
|
#endif
|
|
@@ -27,6 +29,96 @@
|
|
|
27
29
|
#include "Dom/JsonObject.h"
|
|
28
30
|
#include "Dom/JsonValue.h"
|
|
29
31
|
|
|
32
|
+
namespace
|
|
33
|
+
{
|
|
34
|
+
static FString MCPDataValidationResultToString(const EDataValidationResult Result)
|
|
35
|
+
{
|
|
36
|
+
switch (Result)
|
|
37
|
+
{
|
|
38
|
+
case EDataValidationResult::Valid:
|
|
39
|
+
return TEXT("valid");
|
|
40
|
+
case EDataValidationResult::Invalid:
|
|
41
|
+
return TEXT("invalid");
|
|
42
|
+
case EDataValidationResult::NotValidated:
|
|
43
|
+
default:
|
|
44
|
+
return TEXT("notValidated");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static TArray<TSharedPtr<FJsonValue>> MCPValidationTextArray(const TArray<FText>& Texts)
|
|
49
|
+
{
|
|
50
|
+
TArray<TSharedPtr<FJsonValue>> Values;
|
|
51
|
+
Values.Reserve(Texts.Num());
|
|
52
|
+
for (const FText& Text : Texts)
|
|
53
|
+
{
|
|
54
|
+
Values.Add(MakeShared<FJsonValueString>(Text.ToString()));
|
|
55
|
+
}
|
|
56
|
+
return Values;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static TArray<TSharedPtr<FJsonValue>> MCPValidationMessageArray(const TArray<TSharedRef<FTokenizedMessage>>& Messages)
|
|
60
|
+
{
|
|
61
|
+
TArray<TSharedPtr<FJsonValue>> Values;
|
|
62
|
+
Values.Reserve(Messages.Num());
|
|
63
|
+
for (const TSharedRef<FTokenizedMessage>& Message : Messages)
|
|
64
|
+
{
|
|
65
|
+
Values.Add(MakeShared<FJsonValueString>(Message->ToText().ToString()));
|
|
66
|
+
}
|
|
67
|
+
return Values;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static bool MCPResolveExplicitValidationAsset(
|
|
71
|
+
IAssetRegistry& AssetRegistry,
|
|
72
|
+
const FString& RequestedPath,
|
|
73
|
+
FAssetData& OutAsset,
|
|
74
|
+
FString& OutError)
|
|
75
|
+
{
|
|
76
|
+
const FString TrimmedPath = RequestedPath.TrimStartAndEnd();
|
|
77
|
+
if (TrimmedPath.IsEmpty())
|
|
78
|
+
{
|
|
79
|
+
OutError = TEXT("asset path is empty");
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (TrimmedPath.Contains(TEXT(".")) || TrimmedPath.Contains(TEXT(":")))
|
|
84
|
+
{
|
|
85
|
+
OutAsset = AssetRegistry.GetAssetByObjectPath(FSoftObjectPath(TrimmedPath));
|
|
86
|
+
if (!OutAsset.IsValid())
|
|
87
|
+
{
|
|
88
|
+
OutError = FString::Printf(TEXT("asset object path was not found: %s"), *TrimmedPath);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
TArray<FAssetData> PackageAssets;
|
|
95
|
+
AssetRegistry.GetAssetsByPackageName(FName(*TrimmedPath), PackageAssets);
|
|
96
|
+
PackageAssets.Sort([](const FAssetData& A, const FAssetData& B)
|
|
97
|
+
{
|
|
98
|
+
return A.GetObjectPathString() < B.GetObjectPathString();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
if (PackageAssets.Num() == 0)
|
|
102
|
+
{
|
|
103
|
+
OutError = FString::Printf(TEXT("asset package path was not found: %s"), *TrimmedPath);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
if (PackageAssets.Num() != 1)
|
|
107
|
+
{
|
|
108
|
+
OutError = FString::Printf(TEXT("asset package path is ambiguous (%d assets): %s"), PackageAssets.Num(), *TrimmedPath);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
OutAsset = PackageAssets[0];
|
|
113
|
+
if (!OutAsset.IsValid())
|
|
114
|
+
{
|
|
115
|
+
OutError = FString::Printf(TEXT("asset package path resolved to invalid asset data: %s"), *TrimmedPath);
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
30
122
|
TSharedPtr<FJsonValue> FEditorHandlers::BuildLighting(const TSharedPtr<FJsonObject>& Params)
|
|
31
123
|
{
|
|
32
124
|
REQUIRE_EDITOR_WORLD(World);
|
|
@@ -83,46 +175,177 @@ TSharedPtr<FJsonValue> FEditorHandlers::BuildAll(const TSharedPtr<FJsonObject>&
|
|
|
83
175
|
|
|
84
176
|
TSharedPtr<FJsonValue> FEditorHandlers::ValidateAssets(const TSharedPtr<FJsonObject>& Params)
|
|
85
177
|
{
|
|
86
|
-
|
|
178
|
+
if (!GEditor)
|
|
179
|
+
{
|
|
180
|
+
return MCPError(TEXT("Editor not available"));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
UEditorValidatorSubsystem* ValidatorSubsystem = GEditor->GetEditorSubsystem<UEditorValidatorSubsystem>();
|
|
184
|
+
if (!ValidatorSubsystem)
|
|
185
|
+
{
|
|
186
|
+
return MCPError(TEXT("EditorValidatorSubsystem is not available"));
|
|
187
|
+
}
|
|
87
188
|
|
|
88
|
-
|
|
89
|
-
|
|
189
|
+
const bool bHasAssetPaths = Params->HasField(TEXT("assetPaths"));
|
|
190
|
+
const bool bHasAssetPath = Params->HasField(TEXT("assetPath"));
|
|
191
|
+
const bool bHasDirectory = Params->HasField(TEXT("directory"));
|
|
192
|
+
if ((bHasAssetPaths || bHasAssetPath) && bHasDirectory)
|
|
193
|
+
{
|
|
194
|
+
return MCPError(TEXT("Specify either assetPaths/assetPath or directory, not both"));
|
|
195
|
+
}
|
|
196
|
+
if (bHasAssetPaths && bHasAssetPath)
|
|
197
|
+
{
|
|
198
|
+
return MCPError(TEXT("Specify only one of assetPaths or assetPath"));
|
|
199
|
+
}
|
|
90
200
|
|
|
91
|
-
|
|
201
|
+
FAssetRegistryModule* AssetRegistryModule = FModuleManager::LoadModulePtr<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
|
202
|
+
if (!AssetRegistryModule || !AssetRegistryModule->IsValid())
|
|
92
203
|
{
|
|
93
|
-
|
|
94
|
-
|
|
204
|
+
return MCPError(TEXT("AssetRegistry is not available"));
|
|
205
|
+
}
|
|
206
|
+
IAssetRegistry* AssetRegistry = AssetRegistryModule->TryGet();
|
|
207
|
+
if (!AssetRegistry)
|
|
208
|
+
{
|
|
209
|
+
return MCPError(TEXT("AssetRegistry is shutting down"));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
TArray<FAssetData> AssetDataList;
|
|
213
|
+
FString SelectionMode;
|
|
214
|
+
FString Selection;
|
|
215
|
+
if (bHasAssetPaths || bHasAssetPath)
|
|
216
|
+
{
|
|
217
|
+
TArray<FString> RequestedPaths;
|
|
218
|
+
if (bHasAssetPaths)
|
|
95
219
|
{
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
);
|
|
220
|
+
const TArray<TSharedPtr<FJsonValue>>* PathValues = nullptr;
|
|
221
|
+
if (!Params->TryGetArrayField(TEXT("assetPaths"), PathValues) || !PathValues || PathValues->Num() == 0)
|
|
222
|
+
{
|
|
223
|
+
return MCPError(TEXT("assetPaths must be a non-empty array of exact asset paths"));
|
|
224
|
+
}
|
|
225
|
+
RequestedPaths.Reserve(PathValues->Num());
|
|
226
|
+
for (const TSharedPtr<FJsonValue>& PathValue : *PathValues)
|
|
227
|
+
{
|
|
228
|
+
FString RequestedPath;
|
|
229
|
+
if (!PathValue.IsValid() || !PathValue->TryGetString(RequestedPath) || RequestedPath.TrimStartAndEnd().IsEmpty())
|
|
230
|
+
{
|
|
231
|
+
return MCPError(TEXT("Every assetPaths entry must be a non-empty string"));
|
|
232
|
+
}
|
|
233
|
+
RequestedPaths.Add(RequestedPath);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else
|
|
237
|
+
{
|
|
238
|
+
FString RequestedPath;
|
|
239
|
+
if (!Params->TryGetStringField(TEXT("assetPath"), RequestedPath) || RequestedPath.TrimStartAndEnd().IsEmpty())
|
|
240
|
+
{
|
|
241
|
+
return MCPError(TEXT("assetPath must be a non-empty exact package or object path"));
|
|
242
|
+
}
|
|
243
|
+
RequestedPaths.Add(RequestedPath);
|
|
102
244
|
}
|
|
103
245
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
246
|
+
TSet<FString> SeenObjectPaths;
|
|
247
|
+
for (const FString& RequestedPath : RequestedPaths)
|
|
248
|
+
{
|
|
249
|
+
FAssetData ResolvedAsset;
|
|
250
|
+
FString ResolveError;
|
|
251
|
+
if (!MCPResolveExplicitValidationAsset(*AssetRegistry, RequestedPath, ResolvedAsset, ResolveError))
|
|
252
|
+
{
|
|
253
|
+
return MCPError(ResolveError);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const FString ObjectPath = ResolvedAsset.GetObjectPathString();
|
|
257
|
+
if (!SeenObjectPaths.Contains(ObjectPath))
|
|
258
|
+
{
|
|
259
|
+
SeenObjectPaths.Add(ObjectPath);
|
|
260
|
+
AssetDataList.Add(ResolvedAsset);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
SelectionMode = TEXT("explicit");
|
|
264
|
+
Selection = FString::Join(RequestedPaths, TEXT(","));
|
|
108
265
|
}
|
|
109
266
|
else
|
|
110
267
|
{
|
|
111
|
-
|
|
112
|
-
if (
|
|
268
|
+
const FString Directory = OptionalString(Params, TEXT("directory"), TEXT("/Game/")).TrimStartAndEnd();
|
|
269
|
+
if (Directory.IsEmpty() || !Directory.StartsWith(TEXT("/")))
|
|
113
270
|
{
|
|
114
|
-
|
|
115
|
-
GEditor->GetEditorWorldContext().World(),
|
|
116
|
-
TEXT("DataValidation.ValidateAssets"),
|
|
117
|
-
nullptr
|
|
118
|
-
);
|
|
271
|
+
return MCPError(TEXT("directory must be a non-empty package path such as /Game/"));
|
|
119
272
|
}
|
|
120
273
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
274
|
+
FARFilter Filter;
|
|
275
|
+
Filter.PackagePaths.Add(FName(*Directory));
|
|
276
|
+
Filter.bRecursivePaths = true;
|
|
277
|
+
if (!AssetRegistry->GetAssets(Filter, AssetDataList))
|
|
278
|
+
{
|
|
279
|
+
return MCPError(FString::Printf(TEXT("AssetRegistry could not enumerate directory: %s"), *Directory));
|
|
280
|
+
}
|
|
281
|
+
SelectionMode = TEXT("directory");
|
|
282
|
+
Selection = Directory;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
AssetDataList.Sort([](const FAssetData& A, const FAssetData& B)
|
|
286
|
+
{
|
|
287
|
+
return A.GetObjectPathString() < B.GetObjectPathString();
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
FValidateAssetsSettings Settings;
|
|
291
|
+
Settings.ValidationUsecase = IsRunningCommandlet() ? EDataValidationUsecase::Commandlet : EDataValidationUsecase::Manual;
|
|
292
|
+
Settings.bCollectPerAssetDetails = true;
|
|
293
|
+
Settings.bShowIfNoFailures = false;
|
|
294
|
+
Settings.bSilent = true;
|
|
295
|
+
FValidateAssetsResults ValidationResults;
|
|
296
|
+
ValidatorSubsystem->ValidateAssetsWithSettings(AssetDataList, Settings, ValidationResults);
|
|
297
|
+
|
|
298
|
+
auto Result = MCPSuccess();
|
|
299
|
+
Result->SetStringField(TEXT("selectionMode"), SelectionMode);
|
|
300
|
+
Result->SetStringField(TEXT("selection"), Selection);
|
|
301
|
+
if (SelectionMode == TEXT("directory"))
|
|
302
|
+
{
|
|
303
|
+
// Preserve the legacy response field for { directory: ... } callers.
|
|
304
|
+
Result->SetStringField(TEXT("directory"), Selection);
|
|
125
305
|
}
|
|
306
|
+
Result->SetStringField(TEXT("validationUsecase"), Settings.ValidationUsecase == EDataValidationUsecase::Commandlet ? TEXT("commandlet") : TEXT("manual"));
|
|
307
|
+
Result->SetNumberField(TEXT("requested"), ValidationResults.NumRequested);
|
|
308
|
+
Result->SetNumberField(TEXT("checked"), ValidationResults.NumChecked);
|
|
309
|
+
Result->SetNumberField(TEXT("valid"), ValidationResults.NumValid);
|
|
310
|
+
Result->SetNumberField(TEXT("invalid"), ValidationResults.NumInvalid);
|
|
311
|
+
Result->SetNumberField(TEXT("skipped"), ValidationResults.NumSkipped);
|
|
312
|
+
Result->SetNumberField(TEXT("warnings"), ValidationResults.NumWarnings);
|
|
313
|
+
Result->SetNumberField(TEXT("unableToValidate"), ValidationResults.NumUnableToValidate);
|
|
314
|
+
Result->SetNumberField(TEXT("externalObjects"), ValidationResults.NumExternalObjects);
|
|
315
|
+
Result->SetBoolField(TEXT("assetLimitReached"), ValidationResults.bAssetLimitReached);
|
|
316
|
+
const FString OverallResult = ValidationResults.NumInvalid > 0
|
|
317
|
+
? TEXT("invalid")
|
|
318
|
+
: (ValidationResults.NumUnableToValidate > 0 || ValidationResults.NumRequested == 0 || ValidationResults.NumChecked == 0
|
|
319
|
+
? TEXT("notValidated")
|
|
320
|
+
: (ValidationResults.NumWarnings > 0 ? TEXT("warning") : TEXT("valid")));
|
|
321
|
+
Result->SetStringField(TEXT("result"), OverallResult);
|
|
322
|
+
|
|
323
|
+
TArray<FString> DetailKeys;
|
|
324
|
+
ValidationResults.AssetsDetails.GetKeys(DetailKeys);
|
|
325
|
+
DetailKeys.Sort();
|
|
326
|
+
TArray<TSharedPtr<FJsonValue>> DetailsArray;
|
|
327
|
+
DetailsArray.Reserve(DetailKeys.Num());
|
|
328
|
+
for (const FString& DetailKey : DetailKeys)
|
|
329
|
+
{
|
|
330
|
+
const FValidateAssetsDetails* Details = ValidationResults.AssetsDetails.Find(DetailKey);
|
|
331
|
+
if (!Details)
|
|
332
|
+
{
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
auto DetailObject = MakeShared<FJsonObject>();
|
|
336
|
+
DetailObject->SetStringField(TEXT("objectPath"), DetailKey);
|
|
337
|
+
DetailObject->SetStringField(TEXT("packageName"), Details->PackageName.ToString());
|
|
338
|
+
DetailObject->SetStringField(TEXT("assetName"), Details->AssetName.ToString());
|
|
339
|
+
DetailObject->SetStringField(TEXT("result"), MCPDataValidationResultToString(Details->Result));
|
|
340
|
+
DetailObject->SetArrayField(TEXT("errors"), MCPValidationTextArray(Details->ValidationErrors));
|
|
341
|
+
DetailObject->SetArrayField(TEXT("warnings"), MCPValidationTextArray(Details->ValidationWarnings));
|
|
342
|
+
DetailObject->SetArrayField(TEXT("messages"), MCPValidationMessageArray(Details->ValidationMessages));
|
|
343
|
+
DetailsArray.Add(MakeShared<FJsonValueObject>(DetailObject));
|
|
344
|
+
}
|
|
345
|
+
Result->SetArrayField(TEXT("assets"), DetailsArray);
|
|
346
|
+
Result->SetArrayField(TEXT("validatorMessages"), MCPValidationMessageArray(ValidationResults.ValidatorMessages));
|
|
347
|
+
Result->SetStringField(TEXT("message"), FString::Printf(TEXT("Validated %d assets"), ValidationResults.NumRequested));
|
|
348
|
+
return MCPResult(Result);
|
|
126
349
|
}
|
|
127
350
|
|
|
128
351
|
|