Skip to content

Releases: DirtybitGames/unityctl

v0.9.0

22 Apr 11:17

Choose a tag to compare

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 shared TypeResolver (e.g. List finds List<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 a Hint: 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.
  • Object aliased to UnityEngine.Object in the script eval wrapper — bare Object.FindFirstObjectByType<T>() no longer fails with CS0104. Doesn't affect object (keyword) or explicit System.Object.
  • Faster script eval. Roslyn reference list is now cached in ScriptExecutor with AppDomain.AssemblyLoad invalidation. Warm steady-state drops from ~95ms refs + ~440ms compile to refs ~0ms, compile ~15ms. Opt-in profiling via UNITYCTL_SCRIPT_PROFILE=1.

Bug Fixes

  • Three script eval auto-wrap traps fixed:
    1. Leading using X.Y; lines now lift into the generated usings block instead of landing inside Main() as invalid using-statements. Aliased usings and using (…) disposables stay in place.
    2. return X ? Y : Z (explicit return, no trailing ;) no longer gets double-wrapped as return return X ? Y : Z;. Word-boundary keyword check preserves identifiers like returnValue.
    3. 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".Length still evaluates as an expression.

Full Changelog: v0.8.3...v0.9.0

v0.8.3

21 Apr 15:26

Choose a tag to compare

What's Changed

Bug Fixes

  • Make domain-reload handshake synchronous and acked — the plugin's beforeAssemblyReload handler previously fired domain.reloadStarting as 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 and CancelAllPendingOperations() nuked any in-flight RPC, making asset 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.json when the version string already matches, preventing spurious Unity package reimports ("importing packages 69/69") on every ./uc invocation.

Documentation

  • Document screenshot list-windows and screenshot window commands in the skill.

Full Changelog: v0.8.2...v0.8.3

v0.8.2

14 Apr 18:06

Choose a tag to compare

What's Changed

Features

  • snapshot --filter now searches the full hierarchy and shows each match with its ancestor breadcrumb path
  • snapshot --id + --filter uses the same breadcrumb behavior within the target subtree
  • Match count shown in snapshot header when filtering

Improvements

  • Hint message when --filter matches nothing (reminds about glob vs regex syntax)
  • Skill documentation: added verification guidance table — prefer snapshot/logs/eval over screenshots

Full Changelog: v0.8.1...v0.8.2

v0.8.1

08 Apr 09:20

Choose a tag to compare

What's Changed

Features

  • Add --name option to ui click for 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 -215278

After (one call, resolved Unity-side in play mode):

unityctl ui click --name "StartButton"

Full Changelog: v0.8.0...v0.8.1

v0.8.0

24 Mar 11:56

Choose a tag to compare

What's Changed

Features

  • Redesign snapshot with screen-space awareness and query (#40)
  • Add play.pause and play.step commands (#39)
  • Add ui.click command — click UI elements by instance ID or screen coordinates (play mode)
  • Add play mode and loaded scenes to status command
  • Snapshot all loaded scenes instead of only the active scene

Bug Fixes

  • Replace placeholder GUIDs in Unity .meta files with proper random values (#38)
  • Fix Win32Exception when stale bridge PID is reused by another user's process
  • Fix enforce-version-match not 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

16 Mar 08:08

Choose a tag to compare

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 context

Executable plugins are standalone programs that appear as subcommands:

# Any executable named unityctl-<name> on PATH becomes a command
unityctl my-tool --help

Plugins integrate with the skill system — plugin documentation is automatically included when generating Claude Code skills:

# Rebuild skill to pick up new plugins
unityctl skill rebuild

Plugin 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 directly

Config Options Command

List all available configuration settings and their current values:

unityctl config options

Full Changelog: v0.6.3...v0.7.0

v0.6.3

13 Mar 10:30

Choose a tag to compare

What's Changed

Features

  • Add screenshot.window and screenshot.listWindows commands for capturing individual editor windows
  • Add enforce-version-match config 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

11 Mar 13:09

Choose a tag to compare

What's Changed

Features

  • Add --level flag to logs command for minimum severity filtering
  • Add open/close as aliases for editor run/stop commands
  • Dev mode: ./uc bridge start now uses local source via dotnet 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 -c option (#34) — use positional file argument instead

Other

  • Add demo page skill and GitHub Pages setup
  • Validate --level option and make severity ranking case-insensitive

Full Changelog: v0.6.1...v0.6.2

v0.6.1

10 Mar 18:16

Choose a tag to compare

What's Changed

Features

  • Add --save and --discard flags to prefab close
  • Add stdin support for script eval
  • Support comma-separated namespaces in script eval -u flag
  • Add --frames option for recording

Bug Fixes

  • Fix MINGW bash mangling ! in script eval expressions (limited to Windows)
  • Fix frame counting in recording

Other

  • Add ./uc dev wrapper
  • Documentation/skill updates

Full Changelog: v0.6.0...v0.6.1

v0.6.0

10 Mar 08:19

Choose a tag to compare

What's Changed

Features

  • Dialog detection system with cross-platform progress bar detection
  • snapshot command and eval --id for structured scene observation
  • prefab command for prefab manipulation
  • Universal --timeout/-t global flag for all commands
  • scene load --additive flag
  • logs --count/--last and screenshot --output aliases
  • 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