Releases: PinWright/pinwright-ue
Release list
v1.0.0
PinWright 1.0.0.
PinWright is an Unreal Editor plugin that runs a local MCP server so an AI coding assistant (Claude Code, Cursor, Codex, Gemini CLI, VS Code Copilot and others) can inspect and author your project from inside the editor: Blueprints, UMG widgets, data assets, materials, Niagara, animation, levels, and Play-In-Editor session recording.
Verified on UE 5.3, 5.4, 5.5, 5.6, 5.7 and 5.8 at 6283b63: connector unit tests on each engine's bundled Python, editor compile, full automation suite, and a Rocket BuildPlugin packaging gate. The tagged commit adds only the descriptor change that drops the beta and experimental flags; the prebuilt zips were built from 6283b63 with the same descriptor change.
Changes
- Changed: graph auto-layout is PinWright's own layered formatter (
PwGraphLayout) for BPIR
compile/insert,material.compile_mgir/material.authoring.auto_layout, AGIR and CRIR
compiles. It sizes every node (estimated from its title and pins), so laid-out nodes never
overlap; every created entry in a graph is laid out, not only the first; data nodes sit in
columns left of their consumer with pin-aligned wires; material and anim graphs grow leftwards
from their output node. The BPIR Layout settingsNodePadX/NodePadY/PinPadX/
InternalGridPxare nowColumnGapPx/RowGapPx/DataColumnGapPx/GridSnapPx
(IntraParameterPadY,CollisionIterationCapandTraversalIterationCapare gone); re-apply
any customised values. Node sizes and pin rows now follow the editor's drawing (subtitle
headers, value boxes, compact nodes, material previews, RigVM value editors); the K2 defaults
areHeaderHeightPx24 andPinRowHeightPx32. - Changed:
drive.click,drive.hover,drive.scroll,drive.draganddrive.keyon
surface=webdeliver real input through Slate into CEF (trusted events, CSS:hover, key
default actions) instead of dispatching synthetic DOM events, refuse a covered target with
TARGET_OCCLUDED(occluding_element), and settle and respond like the game surface
({ outcome, changed, settled, condition_met, elapsed_ms, ticks, input_path, diff }, no more
ok/code). Webdrive.scrolldeltanow means wheel notches with positive scrolling up, web
drive.keyrefuses unknown key names withINVALID_KEY, andos_inputis refused on web. - Removed
system.run_ubt. Build the editor target from a shell with the editor closed
(Build.bat/Build.sh ... -TargetType=Editor), or usesystem.live_coding_compileto
hot-patch a running editor. - Added: Blueprint timeline tracks round-trip through BPIR decompile/compile.
- Added:
editor.undo_history, andstepsoneditor.undo/editor.redo. - Added:
blueprint.graph.connect_pins_batch. - Added:
niagara.list_stack_issuesandniagara.apply_issue_fix— list the Niagara editor stack's
issues with the engine's one-click fixes, and apply one by id with a bounded recompile and a
before/after issue set. - Added:
actors[]batches onactor.set_transform/actor.nudge, andlookAt/rollon
actor.set_transform. - Added:
gameplay_tags.find_referencers. - Added:
animation.retarget_animations, an IK Retargeter batch export of AnimSequences that
verifies every output and deletes them all on a partial result. - Added:
animation.authoring.get_curve_keys,set_curve_keys,remove_curve_key,
remove_curveandrename_curve. - Added:
log_fileinsystem.identity. - Added: the
calltool acceptsargsas a JSON string. - Added: editor background CPU throttling is disabled while an agent is active (project setting
bDisableBackgroundThrottleWhileAgentActive, default on);performance.run_benchmarkreports
the throttle state it measured under (backgroundThrottle). - Added: console verbs refuse lines that bypass a typed verb;
force: trueoverrides. - Changed:
niagara.add_modulerefuses a module whose usage bitmask does not allow the target
stack withINCOMPATIBLE_STACK_GROUP(it used to add it anywhere); withscriptUsageomitted it
picks the only allowed stack when there is exactly one. - Added:
niagara.simulateruns a Niagara system in a private preview world for a bounded number
of fixed steps and reports each emitter's live particle count, soemittedis measured rather
than inferred from the graph (CPU and GPU emitters; an unreadable GPU count is explained, never
reported as 0). - Changed:
asset.get_material_statscompiles the material (bounded) and returns the measured
stats.vertexInstructions/pixelInstructions/samplersand the other engine shader
statistics, plusstatsPlatform,measuredSubjectandtextureSampleNodeCount;statsis
nullwithstatsUnavailableReasonunder PIE, without a renderer, or when the compile did not
complete. The never-populatedstats.instructionCountis removed. - Changed:
editor.undo/editor.redowith nothing to do returnNOTHING_TO_UNDO/
NOTHING_TO_REDOerrors instead of success withsuccess: false. - Changed:
gameplay_tags.removereturnsTAG_IN_USEfor a referenced tag andREMOVE_FAILED
when the engine refuses, instead of success withremoved: false. - Changed:
actor.set_transform/actor.nudgewith no actor returnINVALID_ARGUMENTinstead of
MISSING_REQUIRED_PARAM. - Changed:
blueprint.graph.connect_pinsPIN_NOT_FOUNDcarriessourcePinLookup/
targetPinLookupin its error data. - Changed: the
bpir.txtasset-dump format version is 10 (was 9), so cached BPIR dumps regenerate. - Added: proxy tool
editor_list: every Unreal editor process on the machine (any checkout,
engine, commandlet or-gamerun) with its project, mode, log, gateway port and launch reason. - Added: proxy tools
editor_run_tests(launches the suite detached and capped, returns once the
first test starts) andeditor_test_status(non-blocking progress andcheck_suite_logverdict
by log path). - Added: proxy tools
editor_build(builds this project's<Project>EditorDevelopment target
detached and capped; refuses while an editor of this checkout runs) andeditor_build_status
(non-blocking state, UBT result and compiler/linker error lines from the log). - Added: offscreen and headless editors, test runs and builds run under an internal capped,
detached supervisor (Content/Python/pinwright_supervisor.py, no command line of its own);
Linux caps throughsystemd-run --user --scopewhen available. - Added:
launch_reasonandlaunched_byinsystem.identity. - Changed:
editor_start/editor_restart/editor_run_testsrequiremode(visible,
offscreenorheadless; no default) andreason; the optionalvisibleboolean is removed.
headlessis new:-NullRHI, no window, no display needed. Every PinWright launch passes
-PinWrightLaunchReason/-PinWrightLaunchedByto the editor. - Changed:
editor_startalways spawns the resolved editor directly and detached (the OS
.uprojectassociation launch is gone);offscreenandheadlesseditors run under the capped
supervisor. - Removed: proxy tool
editor_prepare_tests(useeditor_run_tests), and
scripts/Run-Capped.ps1,scripts/Run-SuiteCapped.ps1,scripts/CappedJob.ps1(use
editor_build,editor_run_testsandeditor_start). - Fixed:
skeleton.remove_boneandskeleton.set_bone_parentkeep each bone's translation
retargeting mode on that bone (they used to leave the modes on the old indices) and refresh the
engine's dependent caches; both reportboundMesheswith whether each bound mesh still matches. - Fixed:
check_suite_log(andeditor_test_status) no longer classifies a runCRASHEDon
another editor's crash report: a report counts only between the log's open time and its last
write, only when the-Abslogits command line records (if any) is this log, and only when its
process id matches the run's editor (--pid, or the capped supervisor's
<log>.supervisor.log), when both are known. - Fixed: on Windows the capped supervisor starts through WMI
Win32_Process.Create, outside the
MCP client's process tree and job, so a test run, build or editor (visible ones included,
uncapped) survives the MCP client exiting. Results carrydetached,launchMechanismanddetachNote; a launch that
could not detach saysNOT DETACHEDin its text. - Added: an MCP server started before the plugin's Python changed now fails a supervised launch
withSUPERVISOR_VERSION_MISMATCH(restart the MCP server) instead of an unexplained
exited without a handoff. - Fixed:
object.call_functionon a PIE object no longer runs every RPC locally: a client's
ServerRPC is sent to the server instead of running its_Implementationon the client (which
recursed into a stack-overflow crash for RPCs that re-send themselves).python.executeunder PIE
warns that the Python plugin still runs RPCs locally.
Install
Clone into <Project>/Plugins/PinWright and build the editor target, or download the prebuilt Win64 zip for your engine version below and extract it into <Project>/Plugins/. See README.md and CONTRIBUTING.md.
v0.8.0
PinWright 0.8.0 is the first open-source release, under the MIT License.
PinWright is an Unreal Editor plugin that runs a local MCP server so an AI coding assistant (Claude Code, Cursor, Codex, Gemini CLI, VS Code Copilot and others) can inspect and author your project from inside the editor: Blueprints, UMG widgets, data assets, materials, Niagara, animation, levels, and Play-In-Editor session recording.
Changes
- First open-source release, under the MIT License.
- Linux editor support alongside Windows (UE 5.3-5.8).
- Demo edition removed, together with its daily request cap.
- GitHub Actions removed in favour of local verification (
scripts/Run-SuiteCapped.ps1plusContent/Python/check_suite_log.py).
Install
Clone into <Project>/Plugins/PinWright and build the editor target, or install the prebuilt plugin from Fab. See README.md and CONTRIBUTING.md.