soft-ue-cli 1.3.2__tar.gz → 1.4.0__tar.gz

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 (132) hide show
  1. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/PKG-INFO +1 -1
  2. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/pyproject.toml +1 -1
  3. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/__init__.py +1 -1
  4. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/__main__.py +55 -4
  5. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/SoftUEBridgeModule.cpp +2 -0
  6. soft_ue_cli-1.4.0/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetPropertyTool.cpp +123 -0
  7. soft_ue_cli-1.4.0/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetPropertyTool.h +17 -0
  8. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/QueryLevelTool.cpp +109 -5
  9. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/QueryLevelTool.h +4 -1
  10. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/DeleteAssetTool.cpp +46 -1
  11. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Blueprint/QueryBlueprintGraphTool.cpp +54 -1
  12. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddGraphNodeTool.cpp +84 -16
  13. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/CreateAssetTool.cpp +26 -3
  14. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/ModifyInterfaceTool.cpp +55 -0
  15. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddGraphNodeTool.h +3 -2
  16. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/.gitignore +0 -0
  17. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/LICENSE +0 -0
  18. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/client.py +0 -0
  19. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/discovery.py +0 -0
  20. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/github.py +0 -0
  21. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/SoftUEBridge.uplugin +0 -0
  22. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Protocol/BridgeTypes.cpp +0 -0
  23. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Server/BridgeServer.cpp +0 -0
  24. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Subsystem/SoftUEBridgeSubsystem.cpp +0 -0
  25. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/BridgeToolBase.cpp +0 -0
  26. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/BridgeToolRegistry.cpp +0 -0
  27. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/BridgeToolResult.cpp +0 -0
  28. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CallFunctionTool.cpp +0 -0
  29. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CallFunctionTool.h +0 -0
  30. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CaptureViewportTool.cpp +0 -0
  31. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CaptureViewportTool.h +0 -0
  32. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/ConsoleVarTool.cpp +0 -0
  33. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/ConsoleVarTool.h +0 -0
  34. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetLogsTool.cpp +0 -0
  35. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetLogsTool.h +0 -0
  36. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SetPropertyTool.cpp +0 -0
  37. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SetPropertyTool.h +0 -0
  38. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SpawnActorTool.cpp +0 -0
  39. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SpawnActorTool.h +0 -0
  40. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/TriggerInputTool.cpp +0 -0
  41. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/TriggerInputTool.h +0 -0
  42. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Protocol/BridgeTypes.h +0 -0
  43. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Server/BridgeServer.h +0 -0
  44. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/SoftUEBridgeModule.h +0 -0
  45. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Subsystem/SoftUEBridgeSubsystem.h +0 -0
  46. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Tools/BridgeToolBase.h +0 -0
  47. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Tools/BridgeToolRegistry.h +0 -0
  48. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Tools/BridgeToolResult.h +0 -0
  49. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/SoftUEBridge.Build.cs +0 -0
  50. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/SoftUEBridgeEditorModule.cpp +0 -0
  51. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Analysis/ClassHierarchyTool.cpp +0 -0
  52. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/GetAssetDiffTool.cpp +0 -0
  53. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/GetAssetPreviewTool.cpp +0 -0
  54. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/OpenAssetTool.cpp +0 -0
  55. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/QueryAssetTool.cpp +0 -0
  56. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Blueprint/QueryBlueprintTool.cpp +0 -0
  57. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Build/BuildAndRelaunchTool.cpp +0 -0
  58. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Build/TriggerLiveCodingTool.cpp +0 -0
  59. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Editor/CaptureScreenshotTool.cpp +0 -0
  60. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Material/QueryMaterialTool.cpp +0 -0
  61. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/PIE/PieSessionTool.cpp +0 -0
  62. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Performance/InsightsAnalyzeTool.cpp +0 -0
  63. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Performance/InsightsCaptureTool.cpp +0 -0
  64. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Performance/InsightsListTracesTool.cpp +0 -0
  65. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Project/ProjectInfoTool.cpp +0 -0
  66. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/References/FindReferencesTool.cpp +0 -0
  67. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Scripting/RunPythonScriptTool.cpp +0 -0
  68. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/AddStateTreeStateTool.cpp +0 -0
  69. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/AddStateTreeTaskTool.cpp +0 -0
  70. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/AddStateTreeTransitionTool.cpp +0 -0
  71. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/QueryStateTreeTool.cpp +0 -0
  72. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/RemoveStateTreeStateTool.cpp +0 -0
  73. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/InspectRuntimeWidgetsTool.cpp +0 -0
  74. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/WidgetBlueprintTool.cpp +0 -0
  75. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/WidgetToolUtils.cpp +0 -0
  76. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/WidgetToolUtils.h +0 -0
  77. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddComponentTool.cpp +0 -0
  78. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddDataTableRowTool.cpp +0 -0
  79. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddWidgetTool.cpp +0 -0
  80. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/ConnectGraphPinsTool.cpp +0 -0
  81. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/DisconnectGraphPinTool.cpp +0 -0
  82. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/RemoveGraphNodeTool.cpp +0 -0
  83. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/SetNodePositionTool.cpp +0 -0
  84. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/SetPropertyTool.cpp +0 -0
  85. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/SpawnActorTool.cpp +0 -0
  86. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/UI/BridgeToolbarExtension.cpp +0 -0
  87. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Utils/BridgeAssetModifier.cpp +0 -0
  88. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Utils/BridgeGraphLayoutUtil.cpp +0 -0
  89. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Utils/BridgePropertySerializer.cpp +0 -0
  90. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/SoftUEBridgeEditorModule.h +0 -0
  91. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Analysis/ClassHierarchyTool.h +0 -0
  92. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/DeleteAssetTool.h +0 -0
  93. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/GetAssetDiffTool.h +0 -0
  94. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/GetAssetPreviewTool.h +0 -0
  95. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/OpenAssetTool.h +0 -0
  96. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/QueryAssetTool.h +0 -0
  97. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Blueprint/QueryBlueprintGraphTool.h +0 -0
  98. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Blueprint/QueryBlueprintTool.h +0 -0
  99. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Build/BuildAndRelaunchTool.h +0 -0
  100. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Build/TriggerLiveCodingTool.h +0 -0
  101. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Editor/CaptureScreenshotTool.h +0 -0
  102. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Material/QueryMaterialTool.h +0 -0
  103. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/PIE/PieSessionTool.h +0 -0
  104. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Performance/InsightsAnalyzeTool.h +0 -0
  105. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Performance/InsightsCaptureTool.h +0 -0
  106. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Performance/InsightsListTracesTool.h +0 -0
  107. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Project/ProjectInfoTool.h +0 -0
  108. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/References/FindReferencesTool.h +0 -0
  109. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Scripting/RunPythonScriptTool.h +0 -0
  110. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/AddStateTreeStateTool.h +0 -0
  111. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/AddStateTreeTaskTool.h +0 -0
  112. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/AddStateTreeTransitionTool.h +0 -0
  113. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/QueryStateTreeTool.h +0 -0
  114. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/RemoveStateTreeStateTool.h +0 -0
  115. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Widget/InspectRuntimeWidgetsTool.h +0 -0
  116. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Widget/WidgetBlueprintTool.h +0 -0
  117. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddComponentTool.h +0 -0
  118. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddDataTableRowTool.h +0 -0
  119. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddWidgetTool.h +0 -0
  120. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/ConnectGraphPinsTool.h +0 -0
  121. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/CreateAssetTool.h +0 -0
  122. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/DisconnectGraphPinTool.h +0 -0
  123. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/EditorSetPropertyTool.h +0 -0
  124. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/EditorSpawnActorTool.h +0 -0
  125. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/ModifyInterfaceTool.h +0 -0
  126. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/RemoveGraphNodeTool.h +0 -0
  127. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/SetNodePositionTool.h +0 -0
  128. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/UI/BridgeToolbarExtension.h +0 -0
  129. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Utils/BridgeAssetModifier.h +0 -0
  130. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Utils/BridgeGraphLayoutUtil.h +0 -0
  131. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Utils/BridgePropertySerializer.h +0 -0
  132. {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/SoftUEBridgeEditor.Build.cs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soft-ue-cli
3
- Version: 1.3.2
3
+ Version: 1.4.0
4
4
  Summary: CLI tool for controlling Unreal Engine via soft-ue-bridge plugin
5
5
  Project-URL: Homepage, https://github.com/softdaddy-o/soft-ue-cli
6
6
  Project-URL: Repository, https://github.com/softdaddy-o/soft-ue-cli
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soft-ue-cli"
7
- version = "1.3.2"
7
+ version = "1.4.0"
8
8
  description = "CLI tool for controlling Unreal Engine via soft-ue-bridge plugin"
9
9
  requires-python = ">=3.10"
10
10
  dependencies = [
@@ -1,3 +1,3 @@
1
1
  """soft-ue-cli — CLI interface to the SoftUEBridge UE plugin."""
2
2
 
3
- __version__ = "1.3.2"
3
+ __version__ = "1.4.0"
@@ -67,6 +67,10 @@ def cmd_query_level(args: argparse.Namespace) -> None:
67
67
  arguments["tag_filter"] = args.tag
68
68
  if args.components:
69
69
  arguments["include_components"] = True
70
+ if args.include_properties or args.property_filter:
71
+ arguments["include_properties"] = True
72
+ if args.property_filter:
73
+ arguments["property_filter"] = args.property_filter
70
74
  _print_json(call_tool("query-level", arguments))
71
75
 
72
76
 
@@ -93,6 +97,18 @@ def cmd_set_property(args: argparse.Namespace) -> None:
93
97
  )
94
98
 
95
99
 
100
+ def cmd_get_property(args: argparse.Namespace) -> None:
101
+ _print_json(
102
+ call_tool(
103
+ "get-property",
104
+ {
105
+ "actor_name": args.actor_name,
106
+ "property_name": args.property_name,
107
+ },
108
+ )
109
+ )
110
+
111
+
96
112
  def cmd_get_logs(args: argparse.Namespace) -> None:
97
113
  arguments: dict = {"lines": args.lines}
98
114
  if args.filter:
@@ -802,6 +818,8 @@ def cmd_create_asset(args: argparse.Namespace) -> None:
802
818
  }
803
819
  if args.parent_class:
804
820
  arguments["parent_class"] = args.parent_class
821
+ if args.skeleton:
822
+ arguments["skeleton"] = args.skeleton
805
823
  if args.row_struct:
806
824
  arguments["row_struct"] = args.row_struct
807
825
  _print_json(call_tool("create-asset", arguments))
@@ -1095,14 +1113,16 @@ def build_parser() -> argparse.ArgumentParser:
1095
1113
  description=(
1096
1114
  "Returns a JSON array of actors in the current game world.\n"
1097
1115
  "Each actor entry includes: name, class, location, rotation, scale, tags.\n"
1098
- "Use --components to also include the actor's component list.\n\n"
1116
+ "Use --components to also include the actor's component list.\n"
1117
+ "Use --include-properties to inspect actor and component property values.\n\n"
1099
1118
  "All filters are combined (AND logic). Wildcards (*) are supported in --search and --actor-name.\n\n"
1100
1119
  "EXAMPLES:\n"
1101
1120
  " List all actors: soft-ue-cli query-level\n"
1102
1121
  " Find all lights: soft-ue-cli query-level --class-filter PointLight\n"
1103
1122
  " Find actor by name: soft-ue-cli query-level --actor-name BP_Hero\n"
1104
1123
  ' Wildcard search: soft-ue-cli query-level --search "Enemy*"\n'
1105
- " Tagged actors with components: soft-ue-cli query-level --tag hostile --components"
1124
+ " Tagged actors with components: soft-ue-cli query-level --tag hostile --components\n"
1125
+ " Actor with health properties: soft-ue-cli query-level --actor-name BP_Hero --include-properties --property-filter '*Health*'"
1106
1126
  ),
1107
1127
  formatter_class=argparse.RawDescriptionHelpFormatter,
1108
1128
  )
@@ -1113,6 +1133,14 @@ def build_parser() -> argparse.ArgumentParser:
1113
1133
  p_ql.add_argument("--search", metavar="TEXT", help="Search actor names/labels (supports * wildcard)")
1114
1134
  p_ql.add_argument("--tag", metavar="TAG", help="Only return actors with this gameplay tag")
1115
1135
  p_ql.add_argument("--components", action="store_true", help="Include component list for each actor")
1136
+ p_ql.add_argument(
1137
+ "--include-properties", action="store_true",
1138
+ help="Include actor and component properties (automatically enables --components)",
1139
+ )
1140
+ p_ql.add_argument(
1141
+ "--property-filter", metavar="PATTERN",
1142
+ help="Filter properties by name (wildcards supported, e.g., '*Health*'). Requires --include-properties.",
1143
+ )
1116
1144
  p_ql.add_argument("--limit", type=int, default=100, metavar="N", help="Max actors to return (default: 100)")
1117
1145
  p_ql.set_defaults(func=cmd_query_level)
1118
1146
 
@@ -1159,6 +1187,26 @@ def build_parser() -> argparse.ArgumentParser:
1159
1187
  p_sp.add_argument("value", help="New value as a string (UE reflection converts the type)")
1160
1188
  p_sp.set_defaults(func=cmd_set_property)
1161
1189
 
1190
+ # get-property (runtime actors)
1191
+ p_gp = sub.add_parser(
1192
+ "get-property",
1193
+ help="Get a property value from a runtime actor or component using UE reflection.",
1194
+ description=(
1195
+ "Reads a UPROPERTY value from the named actor via UE's reflection system.\n"
1196
+ "For component properties, use dot notation: ComponentName.PropertyName\n\n"
1197
+ "Returns the property value as a string along with its type.\n\n"
1198
+ "EXAMPLES:\n"
1199
+ " Actor property: soft-ue-cli get-property PointLight_0 Intensity\n"
1200
+ " Component property: soft-ue-cli get-property BP_Hero LightComponent.Intensity\n"
1201
+ " Boolean: soft-ue-cli get-property BP_Enemy bIsHostile\n"
1202
+ " Vector: soft-ue-cli get-property BP_Hero RelativeScale3D"
1203
+ ),
1204
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1205
+ )
1206
+ p_gp.add_argument("actor_name", help="Actor name or label as shown in query-level output")
1207
+ p_gp.add_argument("property_name", help="Property name, or ComponentName.PropertyName for component properties")
1208
+ p_gp.set_defaults(func=cmd_get_property)
1209
+
1162
1210
  # get-logs
1163
1211
  p_gl = sub.add_parser(
1164
1212
  "get-logs",
@@ -2110,13 +2158,15 @@ def build_parser() -> argparse.ArgumentParser:
2110
2158
  "EXAMPLES:\n"
2111
2159
  " soft-ue-cli create-asset /Game/Blueprints/BP_NewActor Blueprint --parent-class Actor\n"
2112
2160
  " soft-ue-cli create-asset /Game/Materials/M_NewMat Material\n"
2113
- " soft-ue-cli create-asset /Game/Data/DT_Items DataTable --row-struct /Game/Structs/S_Item"
2161
+ " soft-ue-cli create-asset /Game/Data/DT_Items DataTable --row-struct /Game/Structs/S_Item\n"
2162
+ " soft-ue-cli create-asset /Game/Anim/ABP_Hero AnimBlueprint --skeleton /Game/Characters/SK_Mannequin"
2114
2163
  ),
2115
2164
  formatter_class=argparse.RawDescriptionHelpFormatter,
2116
2165
  )
2117
2166
  p_cas.add_argument("asset_path", help="Full asset path including name (e.g. /Game/Blueprints/BP_NewActor)")
2118
2167
  p_cas.add_argument("asset_class", help="Asset class (e.g. Blueprint, Material, DataTable, WidgetBlueprint)")
2119
2168
  p_cas.add_argument("--parent-class", metavar="CLASS", help="Parent class for Blueprints (e.g. Actor, Character)")
2169
+ p_cas.add_argument("--skeleton", metavar="PATH", help="Skeleton asset path for AnimBlueprint (e.g. /Game/Characters/SK_Mannequin)")
2120
2170
  p_cas.add_argument("--row-struct", metavar="PATH", help="Row struct path for DataTables")
2121
2171
  p_cas.set_defaults(func=cmd_create_asset)
2122
2172
 
@@ -2126,10 +2176,11 @@ def build_parser() -> argparse.ArgumentParser:
2126
2176
 
2127
2177
  p_k = sub.add_parser(
2128
2178
  "query-ue-knowledge",
2129
- help="Query UE knowledge base (coming soon).",
2179
+ help="Query the knowledge server for UE API docs and tutorials.",
2130
2180
  description="Coming soon. Follow https://github.com/softdaddy-o/soft-ue-cli for updates.",
2131
2181
  formatter_class=argparse.RawDescriptionHelpFormatter,
2132
2182
  )
2183
+ p_k.add_argument("query", nargs="?", default=None, help="Natural language question about UE API or behavior")
2133
2184
  p_k.set_defaults(func=cmd_knowledge)
2134
2185
 
2135
2186
  # -------------------------------------------------------------------------
@@ -9,6 +9,7 @@
9
9
  #include "Tools/ConsoleVarTool.h"
10
10
  #include "Tools/SpawnActorTool.h"
11
11
  #include "Tools/SetPropertyTool.h"
12
+ #include "Tools/GetPropertyTool.h"
12
13
  #include "Tools/TriggerInputTool.h"
13
14
 
14
15
  DEFINE_LOG_CATEGORY(LogSoftUEBridge);
@@ -25,6 +26,7 @@ void FSoftUEBridgeModule::StartupModule()
25
26
  Registry.RegisterToolClass<USetConsoleVarTool>();
26
27
  Registry.RegisterToolClass<USpawnActorTool>();
27
28
  Registry.RegisterToolClass<USetPropertyTool>();
29
+ Registry.RegisterToolClass<UGetPropertyTool>();
28
30
  Registry.RegisterToolClass<UTriggerInputTool>();
29
31
 
30
32
  UE_LOG(LogSoftUEBridge, Log, TEXT("Registered %d runtime bridge tools"), Registry.GetToolCount());
@@ -0,0 +1,123 @@
1
+ // Copyright soft-ue-expert. All Rights Reserved.
2
+
3
+ #include "Tools/GetPropertyTool.h"
4
+ #include "Tools/BridgeToolRegistry.h"
5
+ #include "SoftUEBridgeModule.h"
6
+ #include "Engine/World.h"
7
+ #include "GameFramework/Actor.h"
8
+ #include "Components/ActorComponent.h"
9
+ #include "EngineUtils.h"
10
+ #include "UObject/UnrealType.h"
11
+
12
+ #if !WITH_EDITOR
13
+ REGISTER_BRIDGE_TOOL(UGetPropertyTool)
14
+ #endif
15
+
16
+ FString UGetPropertyTool::GetToolDescription() const
17
+ {
18
+ return TEXT("Get a property value from an actor or its component using reflection. "
19
+ "Use dot notation for component properties: 'ComponentName.PropertyName'.");
20
+ }
21
+
22
+ TMap<FString, FBridgeSchemaProperty> UGetPropertyTool::GetInputSchema() const
23
+ {
24
+ TMap<FString, FBridgeSchemaProperty> S;
25
+
26
+ auto Prop = [](const FString& Type, const FString& Desc, bool bReq = false) {
27
+ FBridgeSchemaProperty P;
28
+ P.Type = Type; P.Description = Desc; P.bRequired = bReq;
29
+ return P;
30
+ };
31
+
32
+ S.Add(TEXT("actor_name"), Prop(TEXT("string"), TEXT("Actor name or label"), true));
33
+ S.Add(TEXT("property_name"), Prop(TEXT("string"), TEXT("Property name, or 'Component.Property' for component properties"), true));
34
+ S.Add(TEXT("world"), Prop(TEXT("string"), TEXT("World context: 'editor' (editor scene), 'pie' (Play-In-Editor), 'game' (packaged build only). Omit to use the first available world.")));
35
+
36
+ return S;
37
+ }
38
+
39
+ FBridgeToolResult UGetPropertyTool::Execute(const TSharedPtr<FJsonObject>& Args, const FBridgeToolContext& Ctx)
40
+ {
41
+ const FString ActorName = GetStringArgOrDefault(Args, TEXT("actor_name"));
42
+ const FString PropertyName = GetStringArgOrDefault(Args, TEXT("property_name"));
43
+
44
+ UWorld* World = FindWorldByType(GetStringArgOrDefault(Args, TEXT("world")));
45
+ if (!World)
46
+ {
47
+ return FBridgeToolResult::Error(TEXT("No world available. Specify 'world': 'editor', 'pie', or 'game'."));
48
+ }
49
+
50
+ // Find actor
51
+ AActor* Actor = nullptr;
52
+ for (TActorIterator<AActor> It(World); It; ++It)
53
+ {
54
+ AActor* A = *It;
55
+ if (!A) continue;
56
+ if (MatchesWildcard(A->GetName(), ActorName) || MatchesWildcard(GetActorLabelSafe(A), ActorName))
57
+ {
58
+ Actor = A;
59
+ break;
60
+ }
61
+ }
62
+ if (!Actor)
63
+ {
64
+ return FBridgeToolResult::Error(FString::Printf(TEXT("Actor '%s' not found"), *ActorName));
65
+ }
66
+
67
+ // Resolve target object (actor or component via dot notation)
68
+ UObject* TargetObject = Actor;
69
+ FString PropKey = PropertyName;
70
+
71
+ int32 DotIdx;
72
+ if (PropertyName.FindChar(TEXT('.'), DotIdx))
73
+ {
74
+ const FString CompName = PropertyName.Left(DotIdx);
75
+ PropKey = PropertyName.Mid(DotIdx + 1);
76
+
77
+ TArray<UActorComponent*> Components;
78
+ Actor->GetComponents(Components);
79
+ for (UActorComponent* C : Components)
80
+ {
81
+ if (C && C->GetName().Equals(CompName, ESearchCase::IgnoreCase))
82
+ {
83
+ TargetObject = C;
84
+ break;
85
+ }
86
+ }
87
+
88
+ if (TargetObject == Actor)
89
+ {
90
+ return FBridgeToolResult::Error(
91
+ FString::Printf(TEXT("Component '%s' not found on '%s'"), *CompName, *ActorName));
92
+ }
93
+ }
94
+
95
+ // Find and read the property
96
+ for (TFieldIterator<FProperty> PropIt(TargetObject->GetClass()); PropIt; ++PropIt)
97
+ {
98
+ FProperty* Prop = *PropIt;
99
+ if (!Prop) continue;
100
+ if (!Prop->GetName().Equals(PropKey, ESearchCase::IgnoreCase)) continue;
101
+
102
+ void* ValuePtr = Prop->ContainerPtrToValuePtr<void>(TargetObject);
103
+ if (!ValuePtr)
104
+ {
105
+ return FBridgeToolResult::Error(TEXT("Failed to get property pointer"));
106
+ }
107
+
108
+ FString ExportedValue;
109
+ Prop->ExportText_Direct(ExportedValue, ValuePtr, ValuePtr, TargetObject, PPF_None);
110
+
111
+ TSharedPtr<FJsonObject> Result = MakeShareable(new FJsonObject);
112
+ Result->SetStringField(TEXT("actor"), Actor->GetName());
113
+ Result->SetStringField(TEXT("property"), PropertyName);
114
+ Result->SetStringField(TEXT("value"), ExportedValue);
115
+ Result->SetStringField(TEXT("type"), Prop->GetCPPType());
116
+
117
+ UE_LOG(LogSoftUEBridge, Log, TEXT("get-property: %s.%s = %s"), *ActorName, *PropertyName, *ExportedValue);
118
+ return FBridgeToolResult::Json(Result);
119
+ }
120
+
121
+ return FBridgeToolResult::Error(
122
+ FString::Printf(TEXT("Property '%s' not found on %s"), *PropKey, *TargetObject->GetClass()->GetName()));
123
+ }
@@ -0,0 +1,17 @@
1
+ // Copyright soft-ue-expert. All Rights Reserved.
2
+
3
+ #pragma once
4
+ #include "Tools/BridgeToolBase.h"
5
+ #include "GetPropertyTool.generated.h"
6
+
7
+ UCLASS()
8
+ class UGetPropertyTool : public UBridgeToolBase
9
+ {
10
+ GENERATED_BODY()
11
+ public:
12
+ virtual FString GetToolName() const override { return TEXT("get-property"); }
13
+ virtual FString GetToolDescription() const override;
14
+ virtual TMap<FString, FBridgeSchemaProperty> GetInputSchema() const override;
15
+ virtual TArray<FString> GetRequiredParams() const override { return {TEXT("actor_name"), TEXT("property_name")}; }
16
+ virtual FBridgeToolResult Execute(const TSharedPtr<FJsonObject>& Args, const FBridgeToolContext& Ctx) override;
17
+ };
@@ -7,6 +7,7 @@
7
7
  #include "GameFramework/Actor.h"
8
8
  #include "Components/ActorComponent.h"
9
9
  #include "EngineUtils.h"
10
+ #include "UObject/UnrealType.h"
10
11
 
11
12
  #if !WITH_EDITOR
12
13
  REGISTER_BRIDGE_TOOL(UQueryLevelTool)
@@ -16,7 +17,8 @@ FString UQueryLevelTool::GetToolDescription() const
16
17
  {
17
18
  return TEXT("List and inspect actors in the current game world. "
18
19
  "Optionally filter by class, tag, or name pattern. "
19
- "Use actor_name to get detailed info about a specific actor.");
20
+ "Use actor_name to get detailed info about a specific actor. "
21
+ "Use include_properties to inspect actor and component property values.");
20
22
  }
21
23
 
22
24
  TMap<FString, FBridgeSchemaProperty> UQueryLevelTool::GetInputSchema() const
@@ -37,6 +39,8 @@ TMap<FString, FBridgeSchemaProperty> UQueryLevelTool::GetInputSchema() const
37
39
  S.Add(TEXT("include_components"),Prop(TEXT("boolean"), TEXT("Include component list (default: false)")));
38
40
  S.Add(TEXT("include_transform"), Prop(TEXT("boolean"), TEXT("Include transforms (default: true)")));
39
41
  S.Add(TEXT("include_hidden"), Prop(TEXT("boolean"), TEXT("Include hidden actors (default: false)")));
42
+ S.Add(TEXT("include_properties"),Prop(TEXT("boolean"), TEXT("Include actor and component properties (default: false). Automatically enables component inclusion.")));
43
+ S.Add(TEXT("property_filter"), Prop(TEXT("string"), TEXT("Filter properties by name (wildcards supported, e.g., '*Health*'). Only used when include_properties is true.")));
40
44
  S.Add(TEXT("limit"), Prop(TEXT("integer"), TEXT("Max results (default: 100)")));
41
45
  S.Add(TEXT("world"), Prop(TEXT("string"), TEXT("World context: 'editor' (editor scene), 'pie' (Play-In-Editor), 'game' (packaged build only). Omit to use the first available world.")));
42
46
 
@@ -55,9 +59,11 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
55
59
  const FString ClassFilter = GetStringArgOrDefault(Args, TEXT("class_filter"));
56
60
  const FString TagFilter = GetStringArgOrDefault(Args, TEXT("tag_filter"));
57
61
  const FString SearchFilter = GetStringArgOrDefault(Args, TEXT("search"));
58
- const bool bComponents = GetBoolArgOrDefault(Args, TEXT("include_components"), false);
62
+ const bool bProperties = GetBoolArgOrDefault(Args, TEXT("include_properties"), false);
63
+ const bool bComponents = GetBoolArgOrDefault(Args, TEXT("include_components"), false) || bProperties;
59
64
  const bool bTransform = GetBoolArgOrDefault(Args, TEXT("include_transform"), true);
60
65
  const bool bHidden = GetBoolArgOrDefault(Args, TEXT("include_hidden"), false);
66
+ const FString PropertyFilter = GetStringArgOrDefault(Args, TEXT("property_filter"));
61
67
  const int32 Limit = GetIntArgOrDefault(Args, TEXT("limit"), 100);
62
68
 
63
69
  // Detail mode: find one specific actor
@@ -70,7 +76,7 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
70
76
  if (MatchesWildcard(Actor->GetName(), ActorName) ||
71
77
  MatchesWildcard(GetActorLabelSafe(Actor), ActorName))
72
78
  {
73
- return FBridgeToolResult::Json(ActorToJson(Actor, true, true));
79
+ return FBridgeToolResult::Json(ActorToJson(Actor, true, true, bProperties, PropertyFilter));
74
80
  }
75
81
  }
76
82
  return FBridgeToolResult::Error(FString::Printf(TEXT("Actor '%s' not found"), *ActorName));
@@ -108,7 +114,7 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
108
114
 
109
115
  if (ActorsArr.Num() >= Limit) { bLimitReached = true; break; }
110
116
 
111
- TSharedPtr<FJsonObject> ActorJson = ActorToJson(Actor, bComponents, bTransform);
117
+ TSharedPtr<FJsonObject> ActorJson = ActorToJson(Actor, bComponents, bTransform, bProperties, PropertyFilter);
112
118
  ActorsArr.Add(MakeShareable(new FJsonValueObject(ActorJson)));
113
119
  }
114
120
 
@@ -121,7 +127,7 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
121
127
  return FBridgeToolResult::Json(Result);
122
128
  }
123
129
 
124
- TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bComponents, bool bTransform) const
130
+ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bComponents, bool bTransform, bool bProperties, const FString& PropertyFilter) const
125
131
  {
126
132
  TSharedPtr<FJsonObject> J = MakeShareable(new FJsonObject);
127
133
  J->SetStringField(TEXT("name"), Actor->GetName());
@@ -144,6 +150,12 @@ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bCompon
144
150
  J->SetArrayField(TEXT("tags"), Tags);
145
151
  }
146
152
 
153
+ // Actor-level properties
154
+ if (bProperties)
155
+ {
156
+ J->SetArrayField(TEXT("properties"), CollectProperties(Actor, PropertyFilter));
157
+ }
158
+
147
159
  if (bComponents)
148
160
  {
149
161
  TArray<TSharedPtr<FJsonValue>> Comps;
@@ -156,6 +168,13 @@ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bCompon
156
168
  CJ->SetStringField(TEXT("name"), C->GetName());
157
169
  CJ->SetStringField(TEXT("class"), C->GetClass()->GetName());
158
170
  CJ->SetBoolField(TEXT("is_active"), C->IsActive());
171
+
172
+ // Component-level properties
173
+ if (bProperties)
174
+ {
175
+ CJ->SetArrayField(TEXT("properties"), CollectProperties(C, PropertyFilter));
176
+ }
177
+
159
178
  Comps.Add(MakeShareable(new FJsonValueObject(CJ)));
160
179
  }
161
180
  J->SetArrayField(TEXT("components"), Comps);
@@ -164,6 +183,31 @@ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bCompon
164
183
  return J;
165
184
  }
166
185
 
186
+ TArray<TSharedPtr<FJsonValue>> UQueryLevelTool::CollectProperties(UObject* Object, const FString& PropertyFilter) const
187
+ {
188
+ TArray<TSharedPtr<FJsonValue>> PropsArr;
189
+ for (TFieldIterator<FProperty> PropIt(Object->GetClass()); PropIt; ++PropIt)
190
+ {
191
+ FProperty* Prop = *PropIt;
192
+ if (!Prop) continue;
193
+
194
+ if (!PropertyFilter.IsEmpty() && !MatchesWildcard(Prop->GetName(), PropertyFilter))
195
+ {
196
+ continue;
197
+ }
198
+
199
+ void* ValuePtr = Prop->ContainerPtrToValuePtr<void>(Object);
200
+ if (!ValuePtr) continue;
201
+
202
+ TSharedPtr<FJsonObject> PropJson = PropertyToJson(Prop, ValuePtr, Object);
203
+ if (PropJson.IsValid())
204
+ {
205
+ PropsArr.Add(MakeShareable(new FJsonValueObject(PropJson)));
206
+ }
207
+ }
208
+ return PropsArr;
209
+ }
210
+
167
211
  TSharedPtr<FJsonObject> UQueryLevelTool::TransformToJson(const FTransform& T) const
168
212
  {
169
213
  auto Vec3 = [](const FVector& V) {
@@ -186,3 +230,63 @@ TSharedPtr<FJsonObject> UQueryLevelTool::TransformToJson(const FTransform& T) co
186
230
  J->SetObjectField(TEXT("scale"), Vec3(T.GetScale3D()));
187
231
  return J;
188
232
  }
233
+
234
+ TSharedPtr<FJsonObject> UQueryLevelTool::PropertyToJson(FProperty* Property, void* Container, UObject* Owner) const
235
+ {
236
+ if (!Property || !Container)
237
+ {
238
+ return nullptr;
239
+ }
240
+
241
+ TSharedPtr<FJsonObject> PropJson = MakeShareable(new FJsonObject);
242
+
243
+ PropJson->SetStringField(TEXT("name"), Property->GetName());
244
+ PropJson->SetStringField(TEXT("type"), GetPropertyTypeString(Property));
245
+
246
+ FString Value;
247
+ Property->ExportText_Direct(Value, Container, Container, Owner, PPF_None);
248
+ PropJson->SetStringField(TEXT("value"), Value);
249
+
250
+ return PropJson;
251
+ }
252
+
253
+ FString UQueryLevelTool::GetPropertyTypeString(FProperty* Property) const
254
+ {
255
+ if (!Property)
256
+ {
257
+ return TEXT("unknown");
258
+ }
259
+
260
+ if (Property->IsA<FBoolProperty>()) return TEXT("bool");
261
+ if (Property->IsA<FIntProperty>()) return TEXT("int32");
262
+ if (Property->IsA<FFloatProperty>()) return TEXT("float");
263
+ if (Property->IsA<FNameProperty>()) return TEXT("FName");
264
+ if (Property->IsA<FStrProperty>()) return TEXT("FString");
265
+ if (Property->IsA<FTextProperty>()) return TEXT("FText");
266
+
267
+ if (FObjectProperty* ObjectProp = CastField<FObjectProperty>(Property))
268
+ {
269
+ if (ObjectProp->PropertyClass)
270
+ {
271
+ return FString::Printf(TEXT("TObjectPtr<%s>"), *ObjectProp->PropertyClass->GetName());
272
+ }
273
+ return TEXT("TObjectPtr<UObject>");
274
+ }
275
+
276
+ if (FStructProperty* StructProp = CastField<FStructProperty>(Property))
277
+ {
278
+ if (StructProp->Struct)
279
+ {
280
+ return StructProp->Struct->GetName();
281
+ }
282
+ return TEXT("struct");
283
+ }
284
+
285
+ if (FArrayProperty* ArrayProp = CastField<FArrayProperty>(Property))
286
+ {
287
+ FString InnerType = GetPropertyTypeString(ArrayProp->Inner);
288
+ return FString::Printf(TEXT("TArray<%s>"), *InnerType);
289
+ }
290
+
291
+ return Property->GetClass()->GetName();
292
+ }
@@ -15,6 +15,9 @@ public:
15
15
  virtual FBridgeToolResult Execute(const TSharedPtr<FJsonObject>& Args, const FBridgeToolContext& Ctx) override;
16
16
 
17
17
  private:
18
- TSharedPtr<FJsonObject> ActorToJson(AActor* Actor, bool bComponents, bool bTransform) const;
18
+ TSharedPtr<FJsonObject> ActorToJson(AActor* Actor, bool bComponents, bool bTransform, bool bProperties = false, const FString& PropertyFilter = TEXT("")) const;
19
19
  TSharedPtr<FJsonObject> TransformToJson(const FTransform& T) const;
20
+ TArray<TSharedPtr<FJsonValue>> CollectProperties(UObject* Object, const FString& PropertyFilter) const;
21
+ TSharedPtr<FJsonObject> PropertyToJson(FProperty* Property, void* Container, UObject* Owner) const;
22
+ FString GetPropertyTypeString(FProperty* Property) const;
20
23
  };
@@ -1,10 +1,12 @@
1
1
  // Copyright softdaddy-o 2024. All Rights Reserved.
2
2
 
3
3
  #include "Tools/Asset/DeleteAssetTool.h"
4
+ #include "Utils/BridgeAssetModifier.h"
4
5
  #include "SoftUEBridgeEditorModule.h"
5
6
  #include "Engine/Blueprint.h"
6
7
  #include "UObject/UObjectGlobals.h"
7
8
  #include "EditorAssetLibrary.h"
9
+ #include "AssetRegistry/AssetRegistryModule.h"
8
10
 
9
11
  FString UDeleteAssetTool::GetToolDescription() const
10
12
  {
@@ -40,7 +42,50 @@ FBridgeToolResult UDeleteAssetTool::Execute(
40
42
  UObject* Asset = UEditorAssetLibrary::LoadAsset(AssetPath);
41
43
  if (!Asset)
42
44
  {
43
- return FBridgeToolResult::Error(FString::Printf(TEXT("Asset not found: %s"), *AssetPath));
45
+ // Check for phantom asset: registry has entry but LoadAsset fails
46
+ if (FBridgeAssetModifier::AssetExists(AssetPath))
47
+ {
48
+ UE_LOG(LogSoftUEBridgeEditor, Warning, TEXT("delete-asset: Phantom asset detected at %s (registry entry but not loadable). Cleaning up."), *AssetPath);
49
+
50
+ // Force rescan and retry load
51
+ FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
52
+ TArray<FString> ScanPaths = { FPackageName::GetLongPackagePath(AssetPath) };
53
+ AssetRegistryModule.Get().ScanPathsSynchronous(ScanPaths, /*bForceRescan=*/true);
54
+ Asset = UEditorAssetLibrary::LoadAsset(AssetPath);
55
+
56
+ if (!Asset)
57
+ {
58
+ // Still can't load — remove the stale registry entry by rescanning
59
+ // Delete the on-disk package file if it exists
60
+ FString PackageFilename;
61
+ if (FPackageName::DoesPackageExist(AssetPath, &PackageFilename))
62
+ {
63
+ if (IFileManager::Get().Delete(*PackageFilename))
64
+ {
65
+ UE_LOG(LogSoftUEBridgeEditor, Log, TEXT("delete-asset: Deleted orphan package file: %s"), *PackageFilename);
66
+ }
67
+ else
68
+ {
69
+ UE_LOG(LogSoftUEBridgeEditor, Warning, TEXT("delete-asset: Failed to delete orphan package file: %s"), *PackageFilename);
70
+ }
71
+ }
72
+
73
+ // Rescan to purge the registry entry
74
+ AssetRegistryModule.Get().ScanPathsSynchronous(ScanPaths, /*bForceRescan=*/true);
75
+
76
+ TSharedPtr<FJsonObject> Result = MakeShareable(new FJsonObject);
77
+ Result->SetStringField(TEXT("asset_path"), AssetPath);
78
+ Result->SetBoolField(TEXT("success"), true);
79
+ Result->SetStringField(TEXT("message"), FString::Printf(TEXT("Phantom asset cleaned up: %s"), *AssetPath));
80
+ Result->SetBoolField(TEXT("was_phantom"), true);
81
+ return FBridgeToolResult::Json(Result);
82
+ }
83
+ // Rescan fixed the load — fall through to normal deletion
84
+ }
85
+ else
86
+ {
87
+ return FBridgeToolResult::Error(FString::Printf(TEXT("Asset not found: %s"), *AssetPath));
88
+ }
44
89
  }
45
90
 
46
91
  bool bIsBlueprint = Asset->IsA<UBlueprint>();
@@ -74,7 +74,7 @@ TMap<FString, FBridgeSchemaProperty> UQueryBlueprintGraphTool::GetInputSchema()
74
74
 
75
75
  FBridgeSchemaProperty GraphType;
76
76
  GraphType.Type = TEXT("string");
77
- GraphType.Description = TEXT("Filter by graph type: 'event', 'function', 'macro', or for AnimBlueprints: 'anim_graph', 'state_machine', 'state', 'transition', 'blend_stack'");
77
+ GraphType.Description = TEXT("Filter by graph type: 'event', 'function', 'macro', 'interface', or for AnimBlueprints: 'anim_graph', 'state_machine', 'state', 'transition', 'blend_stack'");
78
78
  GraphType.bRequired = false;
79
79
  Schema.Add(TEXT("graph_type"), GraphType);
80
80
 
@@ -291,6 +291,25 @@ FBridgeToolResult UQueryBlueprintGraphTool::Execute(
291
291
  }
292
292
  }
293
293
 
294
+ // Interface implementation graphs
295
+ if (GraphTypeFilter.IsEmpty() || GraphTypeFilter == TEXT("interface"))
296
+ {
297
+ for (const FBPInterfaceDescription& InterfaceDesc : Blueprint->ImplementedInterfaces)
298
+ {
299
+ if (!InterfaceDesc.Interface) continue;
300
+ for (UEdGraph* Graph : InterfaceDesc.Graphs)
301
+ {
302
+ if (!Graph) continue;
303
+ if (!GraphNameFilter.IsEmpty() && Graph->GetName() != GraphNameFilter) continue;
304
+ TSharedPtr<FJsonObject> GraphJson = GraphToJson(Graph, TEXT("interface"), SerializeOptions, SearchFilter);
305
+ if (GraphJson.IsValid())
306
+ {
307
+ GraphsArray.Add(MakeShareable(new FJsonValueObject(GraphJson)));
308
+ }
309
+ }
310
+ }
311
+ }
312
+
294
313
  // Animation Blueprint specific graphs
295
314
  if (bIsAnimBlueprint)
296
315
  {
@@ -501,6 +520,25 @@ UEdGraphNode* UQueryBlueprintGraphTool::FindNodeByGuid(UBlueprint* Blueprint, co
501
520
  }
502
521
  }
503
522
 
523
+ // Search interface implementation graphs
524
+ for (const FBPInterfaceDescription& InterfaceDesc : Blueprint->ImplementedInterfaces)
525
+ {
526
+ if (!InterfaceDesc.Interface) continue;
527
+ for (UEdGraph* Graph : InterfaceDesc.Graphs)
528
+ {
529
+ if (!Graph) continue;
530
+ for (UEdGraphNode* Node : Graph->Nodes)
531
+ {
532
+ if (Node && Node->NodeGuid == NodeGuid)
533
+ {
534
+ OutGraphName = Graph->GetName();
535
+ OutGraphType = TEXT("interface");
536
+ return Node;
537
+ }
538
+ }
539
+ }
540
+ }
541
+
504
542
  return nullptr;
505
543
  }
506
544
 
@@ -567,6 +605,21 @@ UEdGraph* UQueryBlueprintGraphTool::FindGraphByName(UBlueprint* Blueprint, const
567
605
  }
568
606
  }
569
607
 
608
+ // Search interface implementation graphs
609
+ for (const FBPInterfaceDescription& InterfaceDesc : Blueprint->ImplementedInterfaces)
610
+ {
611
+ if (!InterfaceDesc.Interface) continue;
612
+ for (UEdGraph* Graph : InterfaceDesc.Graphs)
613
+ {
614
+ if (!Graph) continue;
615
+ if (Graph->GetName().Equals(CallableName, ESearchCase::IgnoreCase))
616
+ {
617
+ OutGraphType = TEXT("interface");
618
+ return Graph;
619
+ }
620
+ }
621
+ }
622
+
570
623
  return nullptr;
571
624
  }
572
625