All notable changes to soft-ue-cli will be documented in this file.
- Added optional
--anim-map OLD=NEWsupport toanim retarget blueprintso duplicated AnimBlueprints can repoint AnimSequence, BlendSpace, montage, and PoseSearchDatabase references along with bone-name remaps. - Added
anim pose-search database-repointto repoint PoseSearchDatabase schema references and nested animation asset references, with optional best-effort reindexing. - Added
asset repoint-referencesto walk nested reflected UObject properties and replace matching hard or soft asset references in arbitrary assets such as DataAssets. - Added
asset skeletal-socket createandasset skeletal-socket removefor creating, updating, and removing mesh-owned SkeletalMesh sockets, including socket and bone names that are read-only through Unreal Python.
anim retarget blueprintnow repoints duplicated AnimBlueprint generated-class references stored in chooser contexts, K2 nodes, and class-typed bindings.anim pose-search database-repointnow traverses nested animation asset entries inside PoseSearchDatabase instanced structs and invokes database reindexing after mutation.
- Added
anim retarget blueprintto duplicate an AnimBlueprint onto a target skeleton and remap authoredFBoneReferencebone names using explicit bone maps. - Added
anim pose-search inspectandanim pose-search remapto read PoseSearchSchema skeleton/channel bone references and remap sampled bone names for renamed skeleton migrations.
- Added
metasound inspectfor read-only MetaSound Source/Patch graph inspection, including interface inputs/outputs, nodes, edges, and input defaults. - Added
anim retarget repoint-referencesto safely batch-repoint AnimSequence references in AnimMontage and BlendSpace assets, with optional target skeleton assignment, checkout, and save support.
- Added a bridge-backed animation repointing path so agents can avoid editor hangs caused by raw Python dependency/internal property traversal on AnimMontage assets.
- Removed the old flat public CLI command names for UMG, capture, Mutable, StateTree, animation, asset, and Blueprint workflows. Use the canonical command families such as
umg designer apply,capture viewport,mutable graph add-node,asset inspect-file, andblueprint graph inspect. commands --include-removednow lists removed flat commands as migration metadata with acanonical_commandtarget instead of keeping duplicate public parser entries alive.- MCP schema generation now exposes canonical command-family leaf tools and routes client-side canonical handlers through the same argparse command implementations.
- MCP schema generation now accepts native JSON arrays for
batch-call, handlesexec-console-commandcommand strings cleanly, and exposes bridge-only config tools. - Refreshed the README around the current command taxonomy direction, 120+ command/tool count, token-aware capture formatting, optional plugin diagnostics, UMG workflows, and how soft-ue-cli complements UE 5.8's first-party MCP work.
- Updated packaged skills and the
test-toolssmoke workflow to use canonical CLI commands. - Documented UE 5.7 support and Development/DebugGame cooked build support as primary differences from UE 5.8's first-party MCP endpoint.
call-function --actor-name ... --function-name ...no longer collides with the legacy positional argument destinations.- Added metadata/docs guards so future releases keep
README.mdhooked into package metadata and avoid stale public tool-count claims.
- PyPI package metadata now uses
README.mdas the project description, so the published project page reflects the current command taxonomy documentation.
- New
commandsdiscovery command exposes command taxonomy, compatibility replacements, bridge/editor/PIE requirements, and optional Unreal plugin metadata in human and JSON formats. - New canonical
umgcommand family groups UMG designer, navigation, preview, verification, layout, and workflow commands while keeping existing one-off UMG commands as compatibility wrappers. - New
umg-preview-create,umg-preview-replace,umg-preview-remove, andumg-preview-listbridge tools manage tool-owned runtime preview widgets with handles and structured preview summaries. - New canonical
capturecommand family addscapture viewportandcapture screenshot --source ...while keeping existing capture commands as compatibility wrappers. - New canonical
mutable,statetree,anim,asset, andblueprintcommand families route to the existing flat commands while marking the old names as compatibility wrappers in command metadata. - Bridge tools can now return a structured
plugin_unavailableJSON contract for optional Unreal plugin requirements.
test-toolsnow smoke-tests command metadata discovery and the canonical UMG, capture, Mutable, StateTree, animation, asset, and Blueprint command surfaces.
- New
apply-widget-treecommand and bridge tool build or replace a WidgetBlueprint Designer tree from a declarative JSON spec, with common UMG widgets, slot layout, styling primitives, optional compile/save, and anauthor-umg-designerskill for drafting editable specs from UI concepts. - New
wire-widget-navigationcommand and bridge tool validate named Widget Blueprint buttons, switchers, and target widgets while returning a parent-class binding contract for C++ or Blueprint parent implementation. - New
verify-umg-workflowcommand and bridge tool validate UMG screens in PIE by creating or finding widgets, checking expected names/text, broadcasting button clicks, and asserting switcher or visibility outcomes. - New
author-umg-workflowskill chains UMG Designer authoring, stable widget-name navigation contracts, PIE interaction verification, and optional screenshot capture into one LLM workflow. capture-viewportandcapture-screenshotnow support output resizing with--scale,--width, and--height, plus--color-mode color|grayscale|monochrome.- File capture cleanup is now opt-in with
--cleanup-previous, so sequential viewport captures are preserved by default. author-umg-designernow requires a concept geometry and visual-fidelity pass with bounding boxes, opacity/z-order notes, and screenshot comparison guidance.query-levelandget-propertynow accept--world editor|pie|gameso PIE-world actors can be inspected directly.build-and-relaunchnow accepts--startup-marker-timeoutand defaults the detached worker startup wait to 30 seconds on Windows.inspect-uasset --sections propertiesanddiff-uasset --sections propertiesnow expose tagged property payloads for Skeleton and SkeletalMesh assets.- New
extract-umg-layoutandcompare-umg-layoutcommands normalize designer/runtime UMG geometry and compare layout artifacts offline. - New
umg-layoutcommand family standardizes concept-image, Figma/Stitch, designer, and runtime layout extraction, geometry/pixel comparison, subset matching, ignore masks, and apply-widget-tree spec fitting. query-blueprint-graphcan now recursively inspect nested AnimBlueprint graphs with--recursive/--all-graphs, includegraph_pathon serialized nodes, and filter node classes with--node-class.inspect-anim-instancenow supports static AnimBlueprint topology inspection with--asset-path, including topology and sync-group sections without requiring a live actor.- New
inspect-sync-markers,compare-sync-markers,add-sync-marker, andremove-sync-markercommands and bridge tools inspect and edit AuthoredSyncMarkers on AnimSequence assets. build-and-relaunchcan now run an offline fallback build path when the editor bridge is unavailable, with explicit--project,--editor-exe,--build-bat, and--no-offline-fallbackcontrols.
inspect-runtime-widgetsnow descends throughUUserWidgetwidget trees and content widgets, so named runtime children can be found for UMG verification workflows.build-and-relaunch --waitnow reads UTF-8 BOM status JSON explicitly, avoiding Windows ANSI locale decode crashes after successful builds.trigger-input move-to --target -X,Y,Znow accepts negative coordinates without requiring the--target=-X,Y,Zform.build-and-relaunchnow resolves engine build paths to absolute paths and verifies the detached worker creates a startup marker before closing the editor.wire-widget-navigationnow fails fast while PIE is active by default; use--allow-pieonly when mutating WidgetBlueprint assets during PIE is intentional.trigger-input keynow routes key events through the PlayerController input path, andtrigger-input actioncan inject active Enhanced Input actions byUInputActionname.verify-umg-workflowtracks tool-created preview widgets with a lifecycle policy so repeated checks can replace or remove prior previews safely, andpie-session stopremoves those previews before shutdown by default.wire-widget-navigationnow also fails fast while the editor is saving or garbage collecting; use--allow-busyonly when the mutation is intentional.- PIE screenshot capture now returns structured fallback diagnostics, including
capture_failure_kind,safe_mode, andfallback_command, instead of opaque failed capture results. - CLI bridge calls now fall back from a stale
SOFT_UE_BRIDGE_PORTeven when the endpoint responds but is not a SoftUEBridge server. - UMG layout comparison can now operate as a key-region subset diff so decorative actual widgets do not fail concept-matching reports.
build-and-relaunch --waitcan now complete recovery builds after the editor is already closed by discovering build tools from the project file and EngineAssociation.
- Deferred newly added AnimBlueprint state-machine bridge tool registration until editor UCLASS metadata is ready, preventing silent missing tools after rebuild/restart.
- Bridge tool registration now logs an error when a null tool class is passed instead of silently skipping it.
- Bridge health now includes process identity fields (
pid,started_at,bridge_instance_id) so automation can distinguish an old session from a fresh editor restart.
- New
add-anim-state-machine,add-anim-state, andadd-anim-transitioncommands and bridge tools create AnimBlueprint state-machine graphs, states, transitions, and transition rule graphs programmatically.
add-graph-node AnimGraphNode_StateMachinenow initializes the inner state-machine graph instead of leaving the node in the "Error: No Graph" state.build-and-relaunch --waitnow respectsSOFT_UE_BRIDGE_TIMEOUT, supports explicit build/relaunch timeout overrides, and reportsworker_failed_to_startpromptly if the detached worker never starts.capture-viewportis now registered during runtime module startup instead of through static DLL-load registration, avoiding Windows module initialization failures.- Bridge module reload cleanup no longer shadows the registry singleton name, removing a C4458 build warning.
- New
wait-for-readycommand, withawait-bridgealias, polls the bridge health probe until it is ready and can optionally launch a.uprojectfirst - New
create-co-from-speccommand and bridge tool build a CustomizableObject graph from a JSON node/edge specification compile-conow supports--gather-referencesfor the editor's Compile and Gather References mode when availablequery-blueprint-graph --include-anim-propsnow exposes AnimGraph wrapper cache properties, property bindings, fast-path metadata, and linked SaveCachedPose detailsquery-asset --patternis now an alias for name-pattern asset searches
set-node-positionnow supports CustomizableObject graph nodes in addition to Material, Blueprint, and AnimBlueprint graphscompile-blueprintnow returns structured compiler diagnostics with severity, message, and error/warning counts
- SoftUEBridge runtime config tools are now registered during module startup, avoiding editor-launch
ERROR_DLL_INIT_FAILEDfailures add-widgetnow supports single-childContentWidgetparents such as Border and rejects already-filled content parents before attachmentcapture-screenshot windownow avoids the unsafe full-window Slate screenshot path while PIE hasbDisableWorldRenderingset and falls back to viewport capturebuild-and-relaunch --waitnow follows staged worker progress, waits for a terminal status instead of treating the first status file as final, and reports the last stage plus log paths on timeouttrigger-live-codingnow returns anunsupported_changestatus with full-build recovery guidance when Unreal cancels Live Coding compilation- AnimGraph SaveCachedPose cache-name edits now update the wrapper and inner anim node consistently
- New
reload-bridge-modulecommand and bridge tool reload the bridge editor module from the rebuilt DLL on disk without a full editor restart - New
wire-customizable-object-slot-from-tablecommand and bridge tool create a NodeTable -> Material -> ComponentMesh slot chain in one call build-and-relaunch --waitcan now detect Unreal startup recovery prompts and apply, ask for, or remember recover/skip/manual handlingtrigger-live-codingnow supports--moduleand--pluginscope filters so unrelated reflected header edits do not block bridge-only Live Coding attempts
capture-screenshotnow validates captured image dimensions and pixel count before compression to avoid editor crashes from invalid buffers- Normal CLI bridge reconnects can now handle visible Unreal startup recovery prompts using a remembered or interactive choice
- New
regenerate-co-node-pinscommand andregenerate-customizable-object-node-pinsbridge tool regenerate pins for one Mutable/CustomizableObject graph node and return the refreshed pin list - New
remove-co-nodecommand and bridge tool remove CustomizableObject graph nodes by GUID, path, name, or title connect-co-pinsnow auto-regenerates missing source or target node pins once by default before failing; pass--no-auto-regenerateto keep the old strict lookup behavior- Mutable parameter inspection now includes runtime enum option metadata when available
compile-conow prefers reflected asset compile APIs with compile-parameter configuration before falling back to editor function library compilation- CustomizableObject NodeTable property edits now follow the editor details-panel change sequence and refresh dynamic pins after table/structure changes
- CustomizableObject property pin fallback now supports object reference defaults, enabling asset links such as mesh/object pin values
add-datatable-rownow forwardsrow_dataas a JSON object and deserializes row fields individually
- UE 5.7 plugin builds no longer hit the ambiguous
SetIntPropertyValueoverload in Mutable runtime introspection connect-co-pinsdistinguishes node-not-found errors from pin-not-found-after-regenerate errors
- New Mutable/CustomizableObject edit commands:
add-co-node,add-co-parameter,add-co-mesh-option,set-co-base-mesh,add-co-group-child,set-co-node-property,connect-co-pins, andcompile-co - New bridge-backed CustomizableObject graph edit tools for adding nodes, setting node properties, connecting pins, and compiling assets
- Bridge health diagnostics now include registered tool names and loaded module paths to make missing-tool and stale-plugin issues easier to diagnose
- Unknown bridge tool errors now report the requested tool, registered tool count, registered names, loaded module paths, bridge version, and recovery guidance
- MCP schemas now preserve native JSON object types for command parameters such as CustomizableObject node properties
- CLI export: restored the public
inspect-customizable-object-graph,inspect-mutable-parameters, andinspect-mutable-diagnosticscommand wrappers so the packaged CLI matches the documented Mutable inspection surface
- new
inspect-customizable-object-graphcommand returns machine-readable graph, node, pin, and edge data for Mutable/CustomizableObject assets - new
inspect-mutable-parameterscommand derives structured Mutable parameter metadata such as groups, defaults, options, tags, and related graph links - new
inspect-mutable-diagnosticscommand reports Mutable plugin availability plus best-effort capability and runtime diagnostics for a target asset
- plugin build:
AssetIntrospectionUtils.cppnow compiles against UE 5.7 by includingUserDefinedStructEditorData.hwhen available and passing a compatible parent object toExportText_Direct
- Mutable inspection commands are implemented without a hard compile-time Mutable dependency, so projects without the plugin return structured unavailable/limited results instead of failing to compile
- plugin build:
GetLogsTool.cppno longer depends onMisc/LexicalConversion.h, avoiding a UE-version-specific include failure during plugin compilation
- README now includes a project-origin note and a public-development status note explaining that future work may continue privately while the published code remains available as a prototype/reference
- new
exec-console-commandcommand executes arbitrary UE console commands directly in editor, PIE, or game worlds without requiring a Python wrapper script - new
inspect-pawn-possessioncommand returns structured controller/pawn possession state, AI auto-possession settings, and visibility data for runtime debugging - new
validate-class-pathcommand verifies whether a soft class path exists, loads, resolves to aUClass, and reports its parent hierarchy - new
request-gameplay-taghelper resolves a registered gameplay tag name and returns validity plus export text - new
reload-gameplay-tagshelper reloads GameplayTags settings and refreshes the in-memory tag tables - new
release-asset-lockbest-effort command closes asset editors and forces GC to reduce editor-side file-handle conflicts during VCS workflows
get-logsnow supports server-side--contains, cursor/timestamp-based--since, and--tail-followpolling for targeted runtime log inspectionrun-python-script --world pie,exec-console-command, andinspect-pawn-possessionnow fail fast with a structuredPIE_NOT_RUNNINGerror unless PIE is already running or auto-start is requestedtrigger-live-codingnow warns before dispatch when git reports changed reflected header files that are likely to make Live Coding cancel
build-and-relaunchnow launches its detached Windows build worker through PowerShell in a way that survives editor shutdown, writes fresh status/log artifacts for--wait, and actually runs the requested build before optional relaunch- Plugin: SoftUEBridge no longer calls
StartAllListeners()every 10 seconds while idle; listener revival now happens only on PIE start/stop lifecycle hooks, preventing repeatedLogHttpServerModulespam in UE 5.7 editor sessions
- removed the extra yellow
Support this projectREADME badge from the public badge strip to keep the header more compact while preserving the existing support links below
- SoftUEBridge's editor-only dependency plugins are now limited to Editor targets in the plugin descriptor, preventing Python/editor scripting/StateTree editor dependencies from being enabled for packaged game targets
- refreshed the public README badge strip to highlight AI agent support, shipped skills, tool count, MCP mode, and direct support links without implying the package is tied to a single client
run-python-scriptCLI tests now assert the shippedscript_pathdispatch behavior used by--nameand--script-path, keeping the release smoke suite aligned with the actual bridge request payloads
query-asset --asset-path /Game/...world inspection now builds cleanly on UE 5.7 by switching toFSoftObjectPathasset lookups and including the concreteAGameModeBasedefinition needed byWorldSettings.DefaultGameMode
query-asset --asset-path /Game/...now exposesworld_settings.default_game_modeand related map metadata forUWorldassets, so test maps can be checked offline forWorldSettingsoverrides- new
plan-test-infrastructureandsetup-test-infrastructureskills centralize project-specific test-map/module convention work under theauthor-testworkflow
run-python-script --script-pathnow executes files as files again instead of flattening them into inline source, preserving__file__,__future__imports, and normal quoting/docstring behaviorrun-python-scriptnow rejects editor map-loading APIs such asEditorLoadingAndSavingUtils.load_map()andEditorLevelLibrary.load_level()before execution to avoid tearing down the active Python contextinspect-anim-instancenow populatesslotsfrom active montage slot tracks instead of always returning an empty arrayset-asset-propertyproperty-path traversal now descends intoInstancedStructpayloads, enabling nested edits for assets such as ChooserTables- authoring skill templates now use
EAutomationTestFlags::EditorContextand explicitly avoid bareGetWorld()calls from generated Automation Spec bodies for UE 5.7 compatibility
- offline External Actor tagged property parsing now resolves combined
FNamereferences in property headers, so fields such asDataLayerAssetsno longer fall back toinvalid_name_*when the upper 32-bit name number is populated
inspect-uasset --sections propertiesanddiff-uasset --sections propertiesnow expose and diff External Actor tagged UPROPERTY payloads offline, including common scalar, object, array, and struct values when parsable- README architecture and testing docs now use text diagrams and explicitly show the split between bridge-backed exploration flows and offline/local capabilities
- test authoring skills now target committed C++ Automation Spec outputs; CLI + bridge + Python workflows are documented as exploration inputs rather than the final regression artifact
run-testskill has been removed; execution guidance now belongs with the generated C++ test workflow rather than a generic skill
run-python-script --script-pathnow resolves the file locally before dispatch, avoiding bridge-side path misinterpretationrun-python-scriptnow supports explicit world targeting and injects world helpers for editor/PIE/game executioninspect-widget-blueprintnow surfaces referenced Input Mapping Context bindings and resolved keys for Input Action references- SoftUEBridge now defaults to Unreal's
DeveloperToolmodule type so Shipping builds exclude it by default query-materialno longer risks an unboundedGetInput()iteration when inspecting material graphs
rewind-start,rewind-stop,rewind-statuscommands to control UE Rewind Debugger recording sessions with channel and actor filteringrewind-list-tracks,rewind-overview,rewind-snapshotcommands for LLM-driven animation debugging — list recorded actors, get track-level summaries, and drill down to animation state at a specific time or framerewind-savecommand to persist in-memory recordings to.utracefilesinspect-uasset/diff-uassetnow support non-Blueprint assets (AnimSequence, PoseSearchDatabase, DataTable, etc.) via a generic export/import summary fallbackinspect-uassetnow extracts actor label/class/path, GUID, folder, runtime grid, tags, and data-layer hints from External Actor.uassetpackages for offline history reviewinspect-uasset --sections propertiesanddiff-uasset --sections propertiesnow expose and diff External Actor tagged UPROPERTY payloads offline, including common scalar, object, array, and struct values when parsable
pie-tickno longer crashes with a re-entrant TaskGraph assertion when UMassEntityEditorSubsystem (or anyFTickableEditorObjectthat waits on game-thread tasks) is active. World ticks are now deferred through FTSTicker and driven by the engine's normal Slate tick loop instead of running directly inside the bridge server's AsyncTask handler.
- Rewind Debugger commands require the Animation Insights (GameplayInsights) plugin to be enabled in Edit > Plugins. Error messages guide users to enable it when not active.
- README architecture docs now use text diagrams and explicitly show which commands bypass the bridge and operate on local files offline.
batch-callcommand for composing multiple bridge tool invocations into one in-process batch requestpie-tickcommand for deterministic PIE stepping by frame countinspect-anim-instancecommand for one-shot snapshots of live anim state machines, montages, and blend weightsrun-python-scriptbridge helper import support viafrom soft_ue_bridge import callreplay-changesskill for Git and Perforce binary-asset conflict recovery using manualbase/local/remoteextraction plus offline.uassetinspection
call-functionnow supports class-targeted invocation flows including class default object and transient-instance execution, plus batch JSON inputtest-toolsnow exercises the new automation surface forbatch-call,pie-tick,inspect-anim-instance, and transientcall-functionreplay-changesis now documented as a CLI skill workflow instead of a dedicated command
call-functionlatent-function rejection now uses a portableLatentActionInfostruct-name check across engine versionsinspect-anim-instanceresolves state machine descriptors more reliably and avoids engine-version-specific transition query breakage during bridge builds- public CLI export sync now hard-fails if embargoed private names appear in examples, docs, tests, prompts, or code
query-enumcommand for UserDefinedEnum introspection: authored names, display names, tooltips, and numeric valuesquery-structcommand for UserDefinedStruct introspection: authored member names, defaults, metadata, and reflected type infoblueprint-to-cppskill now starts with dependency-first planning guidance, including enum/struct inspection and promotion-first conversion strategy
query-asset --asset-pathnow inspectsUserDefinedEnumandUserDefinedStructassets instead of failing with a generic load errorquery-asset --asset-pathnow inspects Blueprint-generatedUDataAsset/UPrimaryDataAssetassets via their generated class default objectcapture-screenshot tab --window-name ...now falls back to visible tab labels and matching top-level window titles, so asset editor tabs opened by label can be captured more reliably
- Removed the standalone
inspect-uassetskill prompt; offline.uassetinspection remains available as a command and as part oftest-tools
- Clarified
inspect-uassetanddiff-uassethelp text, skill metadata, and README wording: they operate on local.uassetfiles offline, with best support currently for Blueprint assets rather than Blueprint-only support
open-assetno longer dereferences a staleUWorldpointer afterLoadLevel(), fixing the access violation that could occur when loading World assets through the level editor path
inspect-uassetanddiff-uassetnow parse UE 5.4+ package headers (LegacyFileVersion -8/-9), so offline Blueprint inspection works on modern UE 5.4-5.7 assets instead of failing on the package summary
- Public repo
README.mdandCHANGELOG.mdare no longer stripped of newlines during sync, so the GitHub project page and PyPI description render correctly again (regression introduced in 1.20.0)
get-config-valueandvalidate-config-keynow share the same resolved section-entry lookup path, allowing bridge reads for keys such asr.Bloomthat may not round-trip throughGConfig->GetString()test-toolsnow validatesset-config-valueagainst the bridge tool's actual{"status":"ok"}response payload instead of expecting a nonexistentsuccessfield
test-toolsnow resolves offline.uassetpaths fromget-project-info.project_directoryand the asset path created earlier in the run, soinspect-uassetanddiff-uassetexercise the saved asset directlytest-toolsnow seeds a project config key before runningconfig get --search, so the offline config search path is exercised against known on-disk input
- Bridge config tools now use public
FConfigCacheInisection accessors instead of the unavailableGetSectionPrivate()helper, fixing UE builds that failed when compilingget-config-valueandvalidate-config-key
test-toolsskill now exercises the new config bridge tools and CLI config subcommands during live integration runs
- Unified
configcommand group for Unreal configuration inspection and editing:config tree,config get,config set,config diff, andconfig audit - Offline config parsing and diff support for UE INI,
BuildConfiguration.xml, and.uproject/.upluginJSON files - Runtime bridge config helpers:
get-config-value,set-config-value, andvalidate-config-key
- MCP now exposes the nested client-side
configtool cleanly via schema extraction and command dispatch
inspect-uassetcommand for offline inspection of local Blueprint.uassetfiles without a running Unreal Editordiff-uassetcommand for offline file-to-file diff of extracted Blueprint metadata sectionsinspect-uassetskill for LLM workflows that need conservative offline package inspection
test-toolsskill now exercisesinspect-uassetanddiff-uassetagainst a real on-disk Blueprint generated during the integration run
- Offline Blueprint summary extraction now resolves
parent_class_pathfrom the imported object's outer package chain instead of reporting incorrect/Script/CoreUObject.*paths for common engine parents - Offline Blueprint summary extraction now parses
blueprint_typeinstead of hardcodingNormal inspect-uassetnow fails fast on non-Blueprint packages instead of returning a misleading successfulUnknownsummary
- CLI argument validation:
capture-screenshot --regionandadd-graph-node --positionnow fail with a clear comma-separated-integer error instead of surfacing a raw PythonValueError - CLI argument validation:
query-mpc --valuenow reports a friendly numeric/JSON parsing error for malformed scalar input instead of crashing with a rawValueError
report-bugandrequest-feature:gh auth tokenlookup now times out cleanly instead of hanging indefinitely when GitHub CLI credentials are unavailable or blocked- MCP schema:
set-propertynow accepts any JSON value forvalue, matching the CLI and bridge behavior for scalar, array, and object payloads - MCP server:
add-graph-nodenow maps--no-auto-positioncorrectly, surfaces normalizednode_guidvalues for special node creation cases, and returns cleaner client-side command errors - MCP server:
pie-session startnow forwards tool-level timeout to the HTTP request and attempts a best-effort stop after startup timeouts to avoid leaving PIE half-initialized test-tools: teardown now treatsdelete-assetreportingAsset not foundas an idempotent success during cleanup, avoiding false failures after restore flows that already removed the temporary test assettest-tools:insights-capture stopnow treats already-idle or auto-stopped traces as a pass in both CLI and MCP paths, avoiding false failures when trace state changes between status polling and stoptest-tools: MCP all-mode now readsmcp-servestdout as UTF-8 with replacement semantics, avoiding Windowscp949decode crashes on non-ASCII outputtest-tools: setup now retries the firstopen-assetcall for a freshly created temporary World asset, reducing false setup failures while the editor finishes registering the new leveltest-tools: restore flow now saves the temporary test level before switching back, avoiding modal unsaved-level prompts that can block or crash automationopen-asset: World assets now load through the level editor path with extra GC passes, reducing map-switch crashes and stale-world failures during automationpie-session: start/stop now return request-based transitional states instead of blocking the request thread while UE finishes entering or leaving PIEinsights-capture: trace start now uses the documented filename-first console command form and stop/status treat already-idle traces consistently, reducing false stop failures in automation
- Plugin: bridge HTTP listener dropped after PIE startup —
USoftUEBridgeSubsystemnow registers a 10-secondFTSTickerthat callsStartAllListeners()to revive listeners silently stopped by PIE world initialization; subsequent bridge calls no longer fail with WinError 10054 after a PIE session test-toolsskill: teardown script calledAssetEditorSubsystem.close_all_asset_editors()which does not exist in UE 5.7 — replaced with agetattrprobe that triesclose_all_asset_editorsandclose_all_editorsin order;SystemLibrary.collect_garbage()now always runs regardless of whether an editor-close method is found
- MCP:
set-console-varrejected integer/float values — MCP schema now declaresvalueasanytype so pydantic accepts strings, ints, and floats - MCP:
batch-delete-actorsrejected list foractorsfield — schema now declaresactorsas array type; same fix applied tobatch-spawn-actors.actors,batch-modify-actors.modifications,spawn-actor.location/rotation,add-graph-node.position, andset-node-position.positions - MCP:
capture-screenshotrequiredmodefield — schema now makesmodeoptional with default"viewport" - MCP:
report-bughung indefinitely via MCP transport —gh auth tokensubprocess was inheriting the MCP stdin pipe and blocking; fixed withstdin=subprocess.DEVNULL - MCP:
test-tools --mode mcpqueue desync after client-side timeout —MCPClient._recvnow matches responses by ID, discarding stale responses from previous timed-out calls
pie-session starttimed out after 30 s even when a longer timeout was requested — the tool's server-sideWaitForPIEReadyhas its owntimeoutargument (default 30 s); the test now passes it explicitly so PIE gets the full allotted timeopen-assetfor World assets crashed the editor with "World Memory Leaks: 1 leaked objects" (triggered by Niagara holding a world reference during level switch) — fatal error is now suppressed via a customFOutputDeviceErrordevice for the duration ofOpenEditorForAsset, allowing the world switch to complete and Niagara to update its reference normally on the next tickmodify-interface: interface class paths like/Game/Path/BPI_Namenow resolve correctly; the tool tries the_C-suffixed class path and BlueprintGeneratedClassfallback when the initial load fails
test-toolsskill v2.0 —--mode cli(default, direct HTTP),--mode mcp(viamcp-servestdio),--mode all(runs both and combines report); MCP mode exercises the full MCP server layer without any LLM in the loopcall_tool()now accepts an optionaltimeoutparameter to override the per-request HTTP timeout (falls back toSOFT_UE_BRIDGE_TIMEOUTenv var or 30 s)- Plugin: Windows Structured Exception handling (SEH) in the bridge root — unhandled C++ exceptions from tools are caught and returned as JSON-RPC errors instead of crashing the editor
mcp-serve:report-bug(and other client-side tools) crashed withNameError: name 'io' is not defined— added missingimport iotomcp_server.pymcp-serve:query-assetwithasset_classfilter returned 0 results — MCP was forwarding the parameter asasset_classbut the bridge expectsclass; added per-tool parameter rename mappingcapture-screenshot --mode windowfailed via MCP with "No active editor window found" — the editor is never the foreground window when an agent calls via mcp-serve; now usesIMainFrameModule::GetParentWindow()with fallback to the active window
create-assetnow supportsWorldasset type — create new levels from the CLI:soft-ue-cli create-asset /Game/Maps/LV_New Worldcreate-asset --template PATH— duplicate an existing level instead of creating a blank one
mcp-serve: tool arguments were silently dropped — MCP client now receives the correct JSON schema for every tool and arguments are forwarded to the bridge as expectedmcp-serve:class-hierarchyandproject-inforouted to wrong bridge tool name, always returning "Unknown tool"mcp-serve:status,check-setup,setup,report-bug,request-feature,submit-testimonialreturned "Unknown tool" because they are client-side operations; they now run their existing handlers directly and return output to the MCP client
submit-testimonialnow posts via REST API instead of GitHub Discussions GraphQL
- Architecture diagram missing on GitHub — use relative path instead of absolute URL to private repo
- Python version badge showing "missing" on PyPI — added Python 3.10–3.13 classifiers to pyproject.toml
set-viewport-cameracommand — programmatically control the editor viewport camera with presets (top, bottom, front, back, left, right, perspective), custom location/rotation, and orthographic zoomlevel-from-imageskill — populate a UE level from a reference image using existing project assets, with autonomous visual feedback loop and human-in-the-loop refinement- Batch actor tool reference section in level-from-image skill documentation
- Skills frontmatter parser now skips nested YAML lines, correctly displaying skill descriptions
submit-testimonialcommand — share feedback via GitHub Discussions with auto-collected metadata (CLI version, usage streak, top tools), consent prompt before posting- Bug report nudge — unexpected errors now suggest filing a bug with a pre-filled
report-bugcommand - Daily usage streak tracking — after 3+ consecutive days of use, a one-time testimonial nudge appears
- MCP server returns structured
bug_report_hintandtestimonial_nudgepayloads for LLM agents - GitHub Discussions integration via GraphQL API for testimonial posting
call_tool()now raisesBridgeErrorwith error classification (expected vs unexpected) instead of callingsys.exit(1)directly — enables richer error handling downstream
mcp-servecommand — run soft-ue-cli as an MCP server over stdio, exposing 60+ commands as MCP tools and skills as MCP prompts- Compatible with Claude Desktop, Claude Code, Cursor, Windsurf, and other MCP clients
- Install with:
pip install soft-ue-cli[mcp]
skills listcommand — discover LLM workflow prompts shipped with the CLIskills get <name>command — retrieve a skill's full content for LLM consumptionblueprint-to-cppskill — instructs an LLM to generate C++.h/.cppfrom Blueprint assets using Layer 1 (class scaffolding) and Layer 2 (graph logic translation with 100+ node type mappings)
compile-materialnow usesGMaxRHIShaderPlatforminstead of deprecatedGMaxRHIFeatureLevel(UE 5.7 compatibility)
query-level --class-filternow matches inherited classes (e.g.--class-filter Characterfinds all Character subclasses)
compile-materialcommand — trigger recompilation of Material, MaterialInstance, or MaterialFunction assets from the CLI- MSYS/Git Bash path mangling detection — automatically reverses
/Game/→C:/Program Files/Git/Game/conversion for asset paths
get-logsand all output commands no longer crash withUnicodeEncodeErroron Korean Windows (cp949 locale)
query-materialnow supports MaterialFunction assets — inspect expression graphs inside material functions
create-asset AnimBlueprint --skeletonnow correctly creates an AnimBlueprint instead of a generic Actor Blueprint (subclass routing order fix)add-graph-node --properties '{"Layer":"X"}'on LinkedAnimLayer now sets InterfaceGuid for proper layer function binding and pin reconstruction
set-node-propertycommand — set properties on graph nodes by GUID after creation, supporting UPROPERTY members, inner anim node structs, and pin defaultsquery-mpccommand — read and write Material Parameter Collection scalar/vector values (both default and runtime)save-asset --checkout— auto-checkout from source control (Perforce, etc.) before savingquery-material --parent-chain— walk full MaterialInstance inheritance chain from leaf to root Materialquery-level --include-foliage— list FoliageType instances with counts from InstancedFoliageActorsquery-level --include-grass— list LandscapeProxy actors with component counts and materialscreate-asset AnimLayerInterface(orALI) — creates a Blueprint-compatible AnimLayerInterface using BPTYPE_Interface factoryquery-assetstructured output forULandscapeGrassType— parses GrassVarieties into per-variety JSON with mesh, density, culling, scaling fields
add-graph-node --properties '{"Layer":"X"}'now correctly configures LinkedAnimLayer nodes by setting Interface and Layer on the inner FAnimNode struct and reconstructing pinsadd-graph-node --properties '{"Alpha":0.08}'now sets pin default values (Alpha, BlendWeight, etc.) when properties aren't found via reflectioncreate-assetphantom registry deadlock resolved — force-rescans the package path to clear stale entries before creation
save-assetcommand — save modified assets to disk after mutations, preventing data loss from editor crashescompile-blueprintcommand — trigger Blueprint/AnimBlueprint compilation and return status (success, warnings, errors)insert-graph-nodecommand — atomically insert a new node between two connected nodes with auto pin detection, single undo transaction, and rollback on failuredisconnect-graph-pin --target-node --target-pin— disconnect a specific pin-to-pin connection while preserving other wires (without these flags, existing break-all behavior is unchanged)
get-propertycommand — read UPROPERTY values from runtime actors/components using UE reflection with dot notation for component propertiesquery-level --include-properties— inspect actor and component property values with optional--property-filterwildcard filteringcreate-asset --skeleton— dedicated flag for specifying skeleton asset path when creating AnimBlueprintsquery-blueprint-graphnow returns interface implementation graphs (type"interface") in addition to event, function, and macro graphs
- Phantom asset handling:
create-assetanddelete-assetnow correctly detect and clean up phantom assets (registry entry with no loadable object) modify-interface addnow auto-generates anim layer function graphs with Root and LinkedInputPose nodes when adding AnimLayerInterface to AnimBlueprintsadd-graph-nodeproperties now correctly resolve through innerNodestruct for animation graph nodes (e.g. AnimGraphNode_SpringBone BoneToModify, SpringStiffness)add-graph-nodenow returnsproperty_warningsin JSON response instead of silently ignoring invalid propertiesadd-graph-node AnimGraphNode_LinkedAnimLayerno longer crashes; pins are reconstructed after properties are set
- Updated supported UE version to 5.7 (active development target)
- Plugin now auto-dismisses blocking UE editor dialogs during bridge tool execution, preventing game thread hangs and timeouts
- CLI timeout error message now hints at modal dialogs as a possible cause
add-graph-nodehelp text documentsAnimLayerFunctionusage for creating anim layer functions on AnimLayerInterface assets
trigger-live-codingnow waits for compilation by default and returns the actual result (success, failure, cancelled). Use--no-waitfor fire-and-forget.
build-and-relaunch --wait— monitors build progress, waits for the editor to come back up, and returns build result with duration. On failure, returns compiler errors directly.
inspect-runtime-widgetscommand — inspect live UMG widget geometry during PIE sessions- Query by widget name or class with keyword search
- Returns computed geometry (absolute position, local size, accumulated render transform)
- Includes slot properties and render settings
- Optional
--include-slateflag for underlying Slate widget data - Supports multiple PIE instances via
--pie-index
- UE5 build error: replaced deprecated
FAssetRegistryModulewithIAssetRegistry::GetChecked()in ModifyInterfaceTool - UE5 build error: fixed
AddFunctionGraphtemplate deduction failure in AddGraphNodeTool
modify-interfacecommand — add or remove implemented interfaces on Blueprints and AnimBlueprintsadd-graph-node AnimLayerFunction— create anim layer function graphs on AnimLayerInterface assets with Root and Input Pose nodesquery-blueprint --include interfaces— list implemented interfaces on a Blueprint
.gitignorebuild/rule no longer excludesTools/Build/plugin source files
- Initial release with 50+ commands for controlling Unreal Engine 5
- Actor spawning, Blueprint editing, material inspection, PIE control
- Screenshot capture, performance profiling, Python scripting
- StateTree editing, widget inspection, DataTable editing
- Build and Live Coding support
- Automatic server discovery via
.soft-ue-bridge/instance.json