Releases: DirtybitGames/unityctl
v0.9.0
What's Changed
Agent-friendliness is the theme for 0.9.0 — compile errors now self-diagnose with "did you mean?" hints, the eval wrapper handles more realistic code shapes, and two new introspection commands let agents discover types and members without burning round-trips on reflection.
Features
- New:
unityctl script members <Type>— list public members of a type, grouped by kind (properties / fields / methods / events / nested types) with readable signatures. Supports--filter,--static,--limit,--json. Resolves short names via the sharedTypeResolver(e.g.ListfindsList<T>). - New:
unityctl script lookup-type <Name>— return ranked matches for a short type name across loaded assemblies (Assembly-CSharp → UnityEngine → vendor → stdlib). Useful when aHint:isn't emitted.
Improvements
- Compile errors now hint at fixes.
- CS0103 / CS0234 / CS0246 (unknown type/namespace): appends
Hint: 'Storage' is defined as Dirtybit.Game.Model.Storage in assembly Assembly-CSharp — add -u Dirtybit.Game.Model or fully qualify. - CS0117 / CS1061 (missing member): appends
Hint: 'PrefabUtility' has no member 'IsAddedGameObject'. Close matches: GetAddedGameObjects, ApplyAddedGameObject., with a fallback to a sample member listing when nothing is close enough.
- CS0103 / CS0234 / CS0246 (unknown type/namespace): appends
Objectaliased toUnityEngine.Objectin thescript evalwrapper — bareObject.FindFirstObjectByType<T>()no longer fails with CS0104. Doesn't affectobject(keyword) or explicitSystem.Object.- Faster script eval. Roslyn reference list is now cached in
ScriptExecutorwithAppDomain.AssemblyLoadinvalidation. Warm steady-state drops from ~95ms refs + ~440ms compile to refs ~0ms, compile ~15ms. Opt-in profiling viaUNITYCTL_SCRIPT_PROFILE=1.
Bug Fixes
- Three
script evalauto-wrap traps fixed:- Leading
using X.Y;lines now lift into the generated usings block instead of landing insideMain()as invalid using-statements. Aliased usings andusing (…)disposables stay in place. return X ? Y : Z(explicitreturn, no trailing;) no longer gets double-wrapped asreturn return X ? Y : Z;. Word-boundary keyword check preserves identifiers likereturnValue.var p = X; try { … } catch { … }without a trailing;no longer collapses into expression mode. A small state machine tracks regular / verbatim / interpolated / char literals and line comments, so"hello;world".Lengthstill evaluates as an expression.
- Leading
Full Changelog: v0.8.3...v0.9.0
v0.8.3
What's Changed
Bug Fixes
- Make domain-reload handshake synchronous and acked — the plugin's
beforeAssemblyReloadhandler previously fireddomain.reloadStartingas fire-and-forget, so the bridge could observe the WebSocket close before the event arrived. In that race the grace-period flag was still false andCancelAllPendingOperations()nuked any in-flight RPC, makingasset refresh && script eval-style chains flaky. The plugin now blocks (≤ 500 ms) until the bridge acks the event over the same socket. Backward compatible: if the ack never arrives (old bridge), the timeout falls through to previous behavior.
Improvements
- Skip sync-version write when content is unchanged — the sync-version scripts no longer rewrite
UnityCtl.UnityPackage/package.jsonwhen the version string already matches, preventing spurious Unity package reimports ("importing packages 69/69") on every./ucinvocation.
Documentation
- Document
screenshot list-windowsandscreenshot windowcommands in the skill.
Full Changelog: v0.8.2...v0.8.3
v0.8.2
What's Changed
Features
snapshot --filternow searches the full hierarchy and shows each match with its ancestor breadcrumb pathsnapshot --id+--filteruses the same breadcrumb behavior within the target subtree- Match count shown in snapshot header when filtering
Improvements
- Hint message when
--filtermatches nothing (reminds about glob vs regex syntax) - Skill documentation: added verification guidance table — prefer
snapshot/logs/evalover screenshots
Full Changelog: v0.8.1...v0.8.2
v0.8.1
What's Changed
Features
- Add
--nameoption toui clickfor find-and-click in one call — avoids unstable instance IDs across play mode transitions
Before (two calls, instance ID not stable across play mode entry):
unityctl script eval 'return GameObject.Find("StartButton")?.GetInstanceID().ToString() ?? "x";'
unityctl ui click --id -215278After (one call, resolved Unity-side in play mode):
unityctl ui click --name "StartButton"Full Changelog: v0.8.0...v0.8.1
v0.8.0
What's Changed
Features
- Redesign snapshot with screen-space awareness and query (#40)
- Add
play.pauseandplay.stepcommands (#39) - Add
ui.clickcommand — click UI elements by instance ID or screen coordinates (play mode) - Add play mode and loaded scenes to
statuscommand - Snapshot all loaded scenes instead of only the active scene
Bug Fixes
- Replace placeholder GUIDs in Unity
.metafiles with proper random values (#38) - Fix
Win32Exceptionwhen stale bridge PID is reused by another user's process - Fix
enforce-version-matchnot found in monorepo layouts
Improvements
- Read plugin version from manifest when bridge/editor not connected
Full Changelog: v0.7.0...v0.8.0
v0.7.0
What's Changed
Features
Plugin System (#37)
unityctl now supports plugins — extend the CLI with custom commands backed by C# scripts or standalone executables.
Script plugins run C# directly in Unity via script eval:
# Create a script plugin
unityctl plugin create my-tool --type script
# Structure:
.unityctl/plugins/my-tool/
├── plugin.json # manifest with name, description, commands
└── hello.cs # C# script executed in Unity contextExecutable plugins are standalone programs that appear as subcommands:
# Any executable named unityctl-<name> on PATH becomes a command
unityctl my-tool --helpPlugins integrate with the skill system — plugin documentation is automatically included when generating Claude Code skills:
# Rebuild skill to pick up new plugins
unityctl skill rebuildPlugin management commands:
unityctl plugin list # List installed plugins
unityctl plugin create foo # Scaffold a new plugin
unityctl plugin run my-tool cmd # Run a plugin command directlyConfig Options Command
List all available configuration settings and their current values:
unityctl config optionsFull Changelog: v0.6.3...v0.7.0
v0.6.3
What's Changed
Features
- Add
screenshot.windowandscreenshot.listWindowscommands for capturing individual editor windows - Add
enforce-version-matchconfig to catch version mismatches across team members
enforce-version-match
When enabled, unityctl status will error if the Unity plugin version is newer than the CLI/Bridge — meaning a team member updated the package but you haven't updated your tools yet.
# Enable for a project
unityctl config set enforce-version-match true
# Status will now error on mismatch
unityctl status
# ERROR: Unity plugin is newer than CLI/Bridge (enforce-version-match is enabled)!
# CLI: 0.6.2, Bridge: 0.6.2, Plugin: 0.6.3
# Run 'unityctl update' to sync all components.Full Changelog: v0.6.2...v0.6.3
v0.6.2
What's Changed
Features
- Add
--levelflag tologscommand for minimum severity filtering - Add
open/closeas aliases foreditor run/stopcommands - Dev mode:
./uc bridge startnow uses local source viadotnet run - Updated SKILL.md with tips on script execution to reduce error rates.
Bug Fixes
- Move screenshot file-move responsibility from Unity plugin to CLI (fixes out-of-project screenshots)
- Fix screenshot/record path confusion when CWD is not project root
- Fix snapshot name filter to support contains and suffix wildcards
Breaking
- Remove
script execute -coption (#34) — use positional file argument instead
Other
- Add demo page skill and GitHub Pages setup
- Validate
--leveloption and make severity ranking case-insensitive
Full Changelog: v0.6.1...v0.6.2
v0.6.1
What's Changed
Features
- Add
--saveand--discardflags to prefab close - Add stdin support for
script eval - Support comma-separated namespaces in
script eval -uflag - Add
--framesoption for recording
Bug Fixes
- Fix MINGW bash mangling
!in script eval expressions (limited to Windows) - Fix frame counting in recording
Other
- Add
./ucdev wrapper - Documentation/skill updates
Full Changelog: v0.6.0...v0.6.1
v0.6.0
What's Changed
Features
- Dialog detection system with cross-platform progress bar detection
snapshotcommand andeval --idfor structured scene observationprefabcommand for prefab manipulation- Universal
--timeout/-tglobal flag for all commands scene load --additiveflaglogs --count/--lastandscreenshot --outputaliases- Command aliases and hints for common agent misses
Improvements
- Show generated source on eval compilation errors
- Standardize on single quotes for script eval examples
- Surface dialogs on timeout
- Play mode error guidance
Documentation
- Dialog detection documentation
- Skill file updates for dialog detection and scene --additive
Full Changelog: v0.5.0...v0.6.0