Unity CLI 1.0.0-beta.10
Security and privacy
- Version
- 1.0.0-beta.10
- Released
- Sep 14, 2026
- Product
- Unity CLI
Unity CLI 1.0.0-beta.10
Updates
- Change
`unity mcp configure` no longer follows a symlinked path component when it writes a client's config file. A `--local` write, as well as writes for VS Code and VS Code Insiders, whose configs are always project-local, now refuses a symlink at any path component instead of silently following it. Every client config write, both local and global, is now atomic.
- Change
On macOS, the CLI no longer re-signs a downloaded plugin or component whose code signature fails to verify, except for Unity Version Control's `cm` client, which the CLI now logs when it falls back. Any other component that fails verification now fails its download instead of running under an anonymous signature.
- macOS
- Change
On Linux, `.deb` and `.rpm` installs of the hardened auth-broker tier now enforce it. Every token grant against the hardened tier requires real polkit consent before the isolated credential store is accessed, and the CLI now connects to the hardened tier's socket automatically after provisioning.
- Linux
- Change
`unity mcp configure --dry-run` no longer prints your entire MCP config file, including other servers' credentials. It now previews only the entry it adds or changes.
- Change
`unity mcp configure codex` no longer risks corrupting `config.toml` when it updates the Unity MCP server entry. It now refuses the update and asks you to edit the file manually when it can't verify that the match is safe. It also recognizes a quoted table name instead of duplicating it.
- Change
`unity mcp configure codex` no longer risks corrupting the sandbox and network-proxy settings it relaxes for Codex. It refuses the entire update and asks you to edit the file manually when it can't verify that the match is safe.
- Change
The resident auth broker now signs every refresh-token request with a DPoP proof bound to an in-memory key. It correctly handles the server's nonce challenge and retry. Sign-in, token requests, and existing sessions are unaffected.
- Change
The auth broker's DPoP signing key is now hardware-backed when the machine supports it: the TPM on Windows, the Secure Enclave on macOS, and TPM2 through `tpm2-tools` on Linux. When no hardware-backed key is available, it falls back to the same in-memory key as before.
- Windows
- macOS
- Linux
- Change
`unity projects link vcs` no longer lets a project directory choose which program answers its credential lookup. The project's recorded Git identity is now read as inert data and reapplied through a lookup that always runs from a neutral directory. A repo-local `credential.helper` can no longer substitute its own credential.
- Change
The auth broker's token store is now sealed to the machine's hardware on every real sign-in: a non-exportable TPM key on Windows, TPM2 through `systemd-creds` on Linux, followed by DPAPI, the Secret Service, the Keychain, and a local key file as fallbacks. Earlier releases prepared this sealing, but the live broker still wrote to the plain OS keyring. Copying the store to another machine no longer yields a usable credential, and `unity doctor` reports the active tier.
- Windows
- Linux
- Change
The auth broker now protects itself against memory dumps as soon as it starts. It refuses `ptrace` and disables core dumps on Linux, disables core dumps on macOS, and suppresses the crash dialog on Windows. It also holds credential material in locked, zeroize-on-release memory instead of an ordinary string.
- Windows
- macOS
- Linux
- Change
`unity auth consumers` now reflects actual broker activity. Every token grant and refusal that reaches the broker's token-vending path is recorded in the audit trail that this command reads. `unity auth revoke` still only affects the revocation list; it does not yet stop that application from receiving a new token.
- Change
Every command's OAuth token read now goes through the resident auth broker instead of directly through the OS credential store. A command that needs a token starts the broker on demand if it isn't already running. The broker can remain idle in the background for up to two minutes before it exits. Set `UNITY_NO_AUTH_BROKER` to restore the previous direct-keyring behavior.
- Change
The resident daemon that handles Editor sign-in requests and the auth broker now verify a connecting peer's code signature by default on macOS and Windows. They refuse an unsigned or non-Unity-signed local process. Set `UNITY_PEER_AUTH_MODE=identify-only` to restore the previous logging-only behavior. Linux continues to log only by default. Set `UNITY_PEER_AUTH_MODE=enforce` together with `UNITY_PEER_AUTH_LINUX_ALLOWED_HASHES` to opt in.
- Windows
- macOS
- Linux
- Change
When Unity Hub and the CLI are both signed in to the same account, their credentials now converge automatically without an additional sign-in prompt.
- Change
`unity self-update` now downloads through the CLI's regular download engine instead of a one-shot fetch. An interrupted download resumes from where it left off the next time you run `unity self-update` instead of starting over.
- Change
`unity self-update` now prefers a Brotli-compressed download when the release provides one. The CLI verifies the compressed bytes against their own checksum, then verifies the decompressed binary again as before. A platform without a compressed artifact yet, falls back to the raw download.
- Change
A mistyped command or flag now points you to `unity skill show` for a task-oriented CLI guide when no "Did you mean" suggestion appears. This applies to top-level commands and mistyped subcommands.
- Change
`unity skill install` now also installs agent skills shipped with an installed plugin, alongside the CLI's own skill. `unity skill refresh` re-renders them from the plugin's current copy. `unity plugin install` and `unity plugin upgrade` point you to `unity skill install` when the installed copy ships with a skill.
- Change
`unity command ` and `unity run --command ` no longer refuse a bare, argument-free invocation against an Editor whose Unity Pipeline package predates command-line binding. An invocation with arguments still refuses with the same message as before.
- Change
`unity command --result-only` prints only the Editor's own result value, without the CLI's `command` , `parameters` , `target` , `success` , `errors` , and `warnings` envelope fields. The option implies JSON output on its own and cannot be combined with `--detach` .
- Change
The `capture_game_view` and `capture_scene_view` tools in `unity mcp` now fall back to an OS-level screenshot of the entire desktop when the Editor's main thread does not respond in time, such as during a blocking dialog. The fallback captures the entire screen rather than the specific view and states this in an accompanying note.
- Change
`unity commands --format json` emits a machine-readable manifest of every command, subcommand, argument, and option. This lets agents and tooling discover the CLI surface without parsing `--help` . `unity commands` alone prints a compact grouped listing.
- Change
`unity watch test` re-runs `unity test --affected` every time a project file changes. A debounce combines a burst of changes into a single run. `Library/` , `Temp/` , `Logs/` , `Build/` , and `obj/` are ignored by default. Use `--ignore ` to add more patterns. The command refuses to start under `--non-interactive` or in a detected CI environment.
- Fix
A committed `ProjectSettings/UnityCliConfig.json` now declares `unity build` and `unity test` defaults for a project, including the target, output path, profile, timeout, test mode, report format, coverage, and more. This avoids repeating them in every invocation and CI workflow. `unity config resolve [project]` prints the resolved value and the layer that supplied it: flag, environment variable, this file, global config, or the CLI default.
- Change
`unity build --create-profile ` creates a Unity 6+ Build Profile asset for a target platform and exits without building. This requires Unity 6000.0 or later, the same as `--profile` .
- Fix
Unity Accelerator support is now available. `unity config accelerator ` persists an endpoint. A bare host defaults to port `10080` . `unity run` , `unity test` , and `unity build` inject the cache-server flags automatically. `--accelerator ` and `--no-accelerator` override or suppress the setting for an individual invocation. `UNITY_ACCELERATOR` takes precedence over the persisted setting but is overridden by the command-line flags. `unity diagnose accelerator` reports the resolved endpoint and whether it responds. `unity doctor` and `unity doctor --ci` now include a non-blocking Accelerator check.
- Change
`unity build --list-targets` lists every valid `--target` value and exits. It identifies each target as zero-code or as requiring `--execute-method` or a Build Profile through `--profile` . It supports `--format human` , `--format tsv` , `--format json` , and `--format ndjson` .
- Change
`unity build --list-profiles` lists a project's Build Profile assets and exits. Use it to discover platforms such as Meta Quest that build only through `--profile` . `BUILD_INVALID_TARGET` now directs you to `--profile` when you specify a target outside the classic catalog.
- Change
`unity build run` launches the project's most recent recorded build without rebuilding. A successful `unity build` with a known output path now records the path, target, architecture, and Editor version. An `--execute-method` build without `--output-path` records nothing and keeps the previous record, so launch it with `--path ` instead. A desktop player launches natively. A WebGL build is served from a local, loopback-only HTTP server and opens in your default browser.
- Change
`unity command` and `unity cmd` now render `recompile` , `recompile_status` , `test_status` , and `run_tests` results as short, readable text in the default Result column instead of a compact JSON blob. Other Result cells and `--format json` , `--format ndjson` , and `--format human` output remain unchanged.
- Change
`unity command --project-path ` now starts faster by skipping work it does not need for that invocation, such as display-language detection.
- Change
`unity context` saves and applies named bundles of your account, default organization, default cloud project, default Editor, and install path. `unity context save ` records the current set, `unity context use ` applies one, and `unity context list` and `unity context current` show what exists and what is active. Applying a context is all-or-nothing. Switching to a context clears any of the five settings it does not pin, except the account.
- Change
`unity open --wait` , as well as `unity projects open --wait` and `unity projects upgrade --wait` , blocks until the launched Editor exits and reports its actual outcome. It exits with `6` on failure or `0` on a clean exit. This option is currently available only on macOS and Linux. Windows refuses it with exit code `2` instead of silently falling back to the previous bounded watch.
- Windows
- macOS
- Linux
- Change
`unity open` , `unity projects open` , and `unity projects upgrade` now report when the launched Editor was killed by a signal instead of reporting success, both during the ordinary bounded watch and with `--wait` .
- Change
`unity assets inspect ` lists the contents of a `.unitypackage` , including the asset path, GUID, size, and whether a preview image is bundled. It does not import the package and does not require an installed Editor or an open project. It streams the archive, so it uses constant memory even for multi-gigabyte packages.
- Change
`unity vcs blame ` reports who last changed each GameObject and component in a Unity asset, along with the commit, author, and date. Use `--object ` to narrow the result to one object, `--field ` to narrow it to one serialized field, `--at ` to blame as of another revision, and `--max-revisions ` to limit how far back the command searches.
- Change
`unity license status` now reports `floatingServer` , the licensing server configured for the machine, and `machineId` , the identity that the licensing client reports to it. Use these values to match a lease record when a floating seat appears stuck. Both values appear in `--format json` and `--format ndjson` output, and in human-readable and `tsv` output only when a floating server is configured.
- Fix
On Windows on Arm, `unity` no longer misreports a working Git installation as missing or broken. `unity doctor` and `unity vcs providers` are fixed by the same change.
- Windows
- Change
A signed-in user is no longer reported as signed out solely because the resident auth broker rejects the connection under peer-authentication enforcement. The CLI now falls back to the locally stored session instead of treating the rejection as a sign-out.
- Change
The CLI no longer reports that no Unity Editor is reachable when it runs inside WSL and the Editor runs on the Windows host. `unity projects close` now confirms the exit over the same channel instead of signaling a process ID that could belong to another process. `unity status` now identifies the WSL networking setting to change when the port does not respond.
- Windows
- Change
A running Editor whose project layout hides the Unity Pipeline package, such as a Multiplayer Play Mode virtual player's partial clone or a `Packages` folder reached through a symlink or permissions issue, is no longer reported as unreachable or missing by `unity status` or `unity pipeline list` .
- Change
Concurrent writes to the shared `user-settings.json` no longer drop each other's changes. Settings writes now take a short cross-process lock on the file.
- Change
The CLI no longer mistakes an unrelated process for a running Unity Editor or Player when a stale connection descriptor names a recycled process ID. Discovery now also compares the process start time with the descriptor's timestamp.
- Change
Commands that communicate with a running Unity Editor, including `unity command` , `unity job` , and `unity list` , now identify an AI coding agent's sandbox as a possible cause of a connection refusal, alongside the original "make sure Unity Editor is running" message.
- Change
Sign-in failures where the OS keyring accepts a write but does not retain it are now logged and diagnosable, with a message that distinguishes them from an outright write failure.
- Change
The CLI's Editor identity daemon no longer deletes a Hub socket file when it stops on macOS and Linux.
- macOS
- Linux
- Change
Commands that communicate with a running Editor over loopback, including `unity command` , `unity status` , and `unity job` , no longer resolve the OS proxy configuration up front. They resolve it only when a command first needs it.
- Change
`unity status` no longer reports "no instances" when a Pipeline discovery file exists but the current process cannot read it, such as when a sandboxed AI agent tool runs the CLI as a separate account. It now identifies the actual cause and specifically identifies a sandboxed agent when detected.
- Change
`unity templates pack` and `unity templates create` on Windows now also check for a Windows byte-range lock on a project's `Library` cache before copying it, alongside the existing Linux protection.
- Windows
- Linux
- Change
`unity self-update` and `unity self-install` on Windows now ask a resident Editor identity server daemon to release the binary before replacing it, just as they already ask the resident auth broker. `unity close` and `unity projects close` now also check with the daemon immediately after closing an Editor instead of waiting through its full idle window.
- Windows
- Change
`unity mcp` no longer leaves an agent session with zero Unity tools for its entire lifetime when the client connects before an Editor starts. The server now declares support for tool-list change notifications and notifies the client when the catalog changes.
- Change
`unity doctor` 's credential-store check now exercises the Windows Credential Manager chunking path that real sign-in tokens use instead of testing only a small value.
- Windows
- Change
A chunked credential write that the OS credential store accepts but does not persist no longer leaves stale entries or destroys the previous sign-in. The CLI now verifies the write by reading it back, rolls it back on failure, and automatically cleans up entries left by an earlier version.
- Change
`unity install` no longer fails with an `INSTALL_FAILED` database error when the shared install-state database was created by an older Unity Hub or CLI. The CLI now applies the same schema update as Unity Hub.
- Change
A declined or blocked Windows elevation prompt no longer generates a crash report. The same applies to an incorrect installer or uninstaller format, an unsafe install path, or an install location that you cannot write to. These and similar states also no longer suggest `unity bug` .
- Windows
- Change
`unity status` no longer reports a Unity Editor as `ready` while it is still starting. It now probes the Editor's main thread directly and reports `starting` instead in human-readable, `--format json` , `--format ndjson` , and `--format tsv` output, with a matching exit code.
- Change
`unity test` no longer reports a confusing "results ... could not be converted to JUnit" message when the Editor exits cleanly without writing a new results file. It now distinguishes a narrowed run that matched nothing, using `--filter` , `--shard` , `--rerun-failed` , or `--affected` , from a genuine problem and always fails the run instead of risking a false pass.
- Change
`unity bug --share-project` no longer bundles an entire Unity project into the report. The shared copy is now limited to 1,000 files and warns when the limit truncates the copy.
- Change
Crash reports no longer contain invisible marker characters that the CLI uses to style command hints in the terminal.
- Change
`unity vcs uvcs review list` , `comments` , `reply` , and `resolve` now work when you are signed in. Previously, all four commands failed with a sign-in error even immediately after sign-in because they did not exchange your credential for the short-lived token required by the review service.
- Change
Commands that access Unity Cloud no longer fail spuriously the first time you run one after your sign-in has been idle. A renewed credential is now used within the same run. This affected `unity cloud project list` , `unity projects create` , `unity projects link vcs` , and other commands.
- Change
`unity install` , `unity install-modules` , and `unity editor module add` no longer try to install a bundled Visual Studio module when a compatible version is already installed. The CLI now checks the actual installation state on Windows and macOS and reports Visual Studio as not installed on Linux.
- Windows
- macOS
- Linux
- Change
`unity command --caller plugin` no longer misreports Unity's own third-party-agent plugin as `other` .
- Change
Concurrent installs can no longer bypass the single-install lock while an earlier install is still finishing. The CLI now reclaims a lock only when its holder's heartbeat is stale and its process has exited. The check and claim now occur in a single transaction.
- Change
`unity mcp configure codex` now also relaxes Codex's sandbox network policy, not only the MCP server entry. This allows `unity mcp` and direct `unity command` calls from Codex's shell tool to reach the Editor through localhost.
- Change
`unity status` , `unity editors running` , and `unity command` no longer report a healthy Unity Editor as unreachable immediately after recompilation. Each command now retries once with a refreshed token before it reports the Editor as unreachable.
- Change
On Windows, `unity self-install` and `unity self-update` no longer fail or silently defer to a background swap that cannot complete when a resident background helper holds the installed binary open. Both commands now ask the helper to release the binary first.
- Windows
- Change
Several internal helper processes, such as the Windows installer helpers and the WSL path translator, no longer hang when the spawned tool writes heavily to both stdout and stderr at the same time.
- Windows
- Change
`unity install -a x86_64` no longer reports "No editor version matched" on an Apple Silicon Mac that supports Rosetta 2. The install catalog now offers `x86_64` on Apple Silicon through macOS 27.
- macOS
- Change
`unity plugin install` , `unity plugin upgrade` , and `unity plugin remove` no longer race with each other, Unity Hub's background module updates, or the native Hub licensing-client install into deleting a build that another process just finished installing. A lock left by a crashed process is now reclaimed automatically.
- Change
`unity projects link vcs` and `unity projects create --vcs …` now record a per-project Git identity that remains effective even when an organization-wide credential pin exists, by also saving a URL-scoped form that Git ranks ahead of the organization-wide credential.
- Change
`unity status` no longer sends a crash report or suggests running `unity bug` when every discovered Unity Editor instance is unreachable.
- Change
`unity license activate` now points you to `unity doctor` when a sign-in or session failure occurs on a macOS machine that has already signed in. The message identifies a possibly locked keychain instead of only telling you to sign in again.
- macOS
- Change
Commands that automatically discover an Editor without `--project-path` , including `unity command` and `unity run --command` , no longer report "No Unity Editor instances found" when a healthy Editor has a Unity Pipeline package that is too old to parse the command line. They now report the specific error that `--project-path` already reports.
- Change
On Windows, the CLI no longer crashes with `Decoder ran into invalid data` when an HTTP response is corrupt or its embedded translation bundle cannot be decoded. Both cases now use the CLI's normal error handling.
- Windows
- Change
`unity open` , `unity projects open` , and `unity projects upgrade` no longer launch the Editor inheriting the CLI's working directory, which could crash the Editor if that directory became unreadable. The Editor now always launches from the OS temporary directory and falls back to the previous behavior if that directory is unusable.
- Change
`unity install --resume` can now recover an interrupted module download, such as an SDK component, in addition to an interrupted Editor installer.
- Change
`unity self-install` on Windows can now target a directory other than `%LOCALAPPDATA%\Unity` by setting `UNITY_CLI_HOME` , matching macOS and Linux. `install.ps1` honors the same variable.
- Windows
- macOS
- Linux
- Change
The long-lived Editor identity daemon started by `unity open` no longer stops reporting a signed-in Editor after its auth broker restarts or exits after remaining idle. It now detects a stale broker connection and reconnects automatically.
- Change
A signed-in user is no longer told to sign in again when the auth broker has a temporary problem reading the access token, such as during a broker restart. Only an authoritative refusal now reports a sign-in or session-expired message. Other issues ask you to try again while leaving your session unchanged.
- Change
A signed-in Mac user is no longer told to sign in again when the macOS Keychain refuses to read an existing credential, such as after Unity Hub signed in first. The session now reports as unresolved and points you to `unity doctor` instead of the generic sign-in prompt.
- macOS
- Fix
On macOS, a future CLI update can no longer trigger an unexpected Keychain prompt or a forced re-sign-in because the identifier the CLI uses for Keychain access control is now fixed.
- macOS
- Change
`unity projects list` and other project-registry reads no longer fall back to a stale or empty backup copy of the registry just because another process closed the shared project database last.
- Change
The Linux `.deb` and `.rpm` packages now install the hardened auth-broker tier's assets: the `unity-auth-broker` systemd units, the `unity-broker` system account, and the polkit consent policy. These assets existed in the package for months but were not referenced.
- Linux
- Change
`unity command --format json` no longer prints two separate `success` fields. The envelope now contains exactly one `success` field, derived from the same check the CLI uses to determine whether the command fails.
- Change
`unity vcs setup` now shows the equivalent invocation for a Windows path operand instead of reporting that no shell quoting reproduces the run, for almost every real Windows run.
- Windows
- Change
Git-owned files that the CLI rewrites directly, including `.git/config` , `.git/packed-refs` , and `.git/HEAD` during `unity projects link vcs` and `unlink vcs` , no longer race with a concurrent `git fetch` , `git gc` , or another CLI invocation that accesses the same file. Each write now takes the file's own lock and commits through an atomic rename.
- Change
`unity install` now retries a failed Editor or module download instead of failing the entire install after the first transient network error. It uses the same bounded retry policy as `unity install-modules` , controlled by `UNITY_INSTALL_RETRIES` .
- Change
`unity mcp configure continue` no longer writes an entry to `~/.continue/config.json` , which Continue no longer reads. It now prints setup instructions for `~/.continue/config.yaml` instead.