---
title: Unity CLI release notes for October 2026
product: Unity command-line interface (CLI)
canonical: https://docs.unity.com/en-us/unity-cli/release-notes/2026/october
last_updated: 2026-11-12
generated_at: 2026-11-14T03:34:13.723Z
locale: en-us
---

# Unity CLI release notes for October 2026

> Learn about the Unity CLI releases in October 2026.

This page contains the release notes for the Unity CLI versions released in October 2026, from newest to oldest.

## 1.0.0-beta.15

**Release date:** October 29, 2026

* **Security**

  * Linking a project to Unity Version Control now sends the repository request only to the organization it names, even when the organization's name contains a slash, a question mark or dots.

  * The CLI no longer runs a program found through a relative `PATH` entry such as `node_modules/.bin`. Only absolute `PATH` entries are searched, so a cloned repository cannot put its own `unity`, `claude`, `zip` or `tar` ahead of the real one.

  * Skill installs and refreshes (global and `--local`) now refuse a skill folder that contains a symbolic link or junction as a subfolder, on every platform. Before, a repository could use one to make the install write or delete files outside the project.

  * `unity install --resume` no longer resumes a paused Editor download on Windows, or as root (for example under `sudo`), when the current Unity release data doesn't list that Editor or gives no checksum for it. Start a fresh install instead.

  * `unity install-modules`, `unity editor module add` and `unity install --resume` now check a module's download against the current Unity release data before installing it on Windows, and on every platform when the module runs its own installer command. A module that can't be checked, for example while offline, isn't installed.

  * `unity install --resume` now takes a paused Editor download's address from the current Unity release data when it lists that version, and on Windows doesn't resume one it can't check.

  * `unity install` and `unity install-modules` no longer reuse or resume a file already in the download folder for a download the release data gives no checksum for. They download it again from the start, so a file someone else placed there is never installed in its place.

  * `sudo unity install` and `sudo unity install-modules` on macOS and Linux now check and install a copy of each download kept in a folder only root can open, so another program running as you can no longer swap the file between the checksum check and the install. As root, archives no longer restore their own file owners or permissions, and `tar` and `unzip` come only from the system folders, never from your `PATH`.

  * `unity ci init` workflows now run `unity license activate` with the serial in the step environment, and mask it in the GitHub Actions log, so the serial no longer appears in the process list. The service-account secrets are set only on the steps that use them, not on the whole job.

  * `unity build` reads the Android keystore and key alias passwords from `UNITY_ANDROID_KEYSTORE_PASSWORD` and `UNITY_ANDROID_KEY_ALIAS_PASSWORD` when you pass no `--android-keystore-password` or `--android-key-alias-password`. The flags still work and take precedence.

  * The Unity Editor that `unity build`, `unity test` and other batch commands start no longer inherits `UNITY_GITHUB_TOKEN` or `UNITY_GITLAB_TOKEN`.

  * Crash reports no longer include your account name, your project's name, or the folders of a file outside your home directory. A path outside your home keeps only its file name, and your home directory reads as `~` wherever it is.

  * `unity mcp` now cleans every text in the tool schemas it passes from the Unity Editor to your AI agent, not only the tool descriptions, and caps their size. It also refuses a call to a tool the Editor did not list, and stops reading an oversized tool catalog.

  * Unity Version Control workspace names made from a repository name now replace control characters and drop leading dashes, so a crafted repository name can no longer be read as a command option.

* **Added**

  * `unity bug` can file an issue against a plugin: `--area` takes a plugin's name, such as `ugs` or `plastic`, and on a terminal the area question offers each plugin you have installed. A plugin area attaches that plugin's newest log files, redacted like the other logs, and every report now lists your installed plugins and their versions.

  * `unity doctor` names where each installed plugin writes its logs, under the external components, and as `logDirectories` in `--format json`.

  * `unity license server health` asks your floating license server how it is, directly on its `/v1/status` endpoint. It needs no sign-in and no licensing client.

  * Plugins now receive what `unity` knows when it runs them: the output format, whether they may prompt, the current Unity project and its Editor version, the active Unity Cloud organization and project, the signed-in user (never a token), whether a person, a CI system or an AI agent is running it, and the analytics and crash-report settings, as `UNITY_CLI_CTX_*` environment variables and one `UNITY_CLI_CTX_JSON` document. `UNITY_CLI_INVOKED_AS` and `UNITY_CLI_CORE_VERSION` now reach every plugin, not only built-in tools.

  * `unity projects audit` opens Project Auditor in your project's running Editor, ready for you to run the analysis. It first installs or updates Project Auditor and its rules package when the Editor needs them, then opens the window on the page for `--workflow` (`upgrade` by default, or `optimization`, `urp` or `coreclr`).

  * `unity setup qwen` installs Unity's agent plugin into Qwen Code by running `qwen extensions install Unity-Technologies/unity-agent-plugin:unity --consent`, then `qwen extensions enable unity`. Like `unity setup codex`, it reports an existing install instead of reinstalling (one Qwen Code has disabled for the current folder counts as not installed, and is turned back on), takes `--dry-run` and every output format, and fails with `QWEN_NOT_FOUND` when `qwen` isn't on your PATH.

  * `unity skill install opencode` installs the Unity skills into OpenCode, in `~/.config/opencode/skills`, or `.opencode/skills` with `--local`. OpenCode also loads `.claude/skills` and `.agents/skills`, so when one of those already holds a skill, it warns and skips it rather than loading two copies; pass `--yes` to install it anyway.

  * `unity install --download-only` downloads and verifies an Editor and its modules into the Hub's download folder without installing anything. With `--operating-system`, it can fetch another operating system's Editor, which `unity install` refused before.

  * `unity auth token` prints an access token from your CLI sign-in, alone on stdout, so a script or another tool can call Unity services without its own sign-in flow: `TOKEN=$(unity auth token)`. An expired token is refreshed first, a service account gets a token for its credentials, and `--json` adds the expiry.

  * `unity mcp --cli-tools` adds read-only tools for status, installed editors, projects, releases and doctor to the MCP server, so a client with no shell, such as Claude Desktop, can call them with no Editor running. Each answers with the command's JSON output.

  * `unity mcp` lists four tools for detached Editor jobs next to the Editor's own, so an agent can run work that takes longer than a tool call may wait: `job_start` starts one of the Editor's tools as a job, the way `unity command <name> --detach` does, `job_status` reads the job, `job_wait` waits up to `timeout` seconds (30 by default, at most 45) and says whether it is still running, and `job_cancel` asks the Editor to cancel it. `--exclude-tools "job_*"` hides them.

  * `install.sh` and `install.ps1` now set up the coding agents they find on your machine right after installing, then show your account, license and Unity Editors. In an interactive terminal they first list the agents found, all selected, so you can untick any to leave alone.

  * `unity skill install <client>` installs the `new-unity-project` skill beside `unity-cli`, so clients that read only skills can guide a new project from an idea to a running one. A client whose plugin already provides `unity-cli` keeps leaving `new-unity-project` to the plugin too when that plugin also ships it, unless you pass `--yes`.

  * `unity setup all` sets up every coding agent it finds, bare `unity setup` on a terminal lets you pick which ones from a checklist, and both finish with a state block showing your account, license, editors and connectivity, with the next command for anything blocking (machine formats carry each blocker as a `notifications` entry).

  * `unity projects create --install-editor` installs the Editor version when it isn't installed, waits for the install, then creates the project. `--module` and `--accept-eula` pass modules and their license agreements to that install.

  * `unity projects create` adds Cinemachine to every new 3D project, at the newest release that supports the project's Unity version. 2D projects and templates that already include it are left as they are. `--bare` leaves it out.

  * `unity projects create` turns on Run In Background in the new project's Player settings, so Play mode keeps running while the Editor is not focused. `--bare` leaves it out.

  * `unity projects create` sets up anonymous player sign-in when it links the project to Unity Cloud. It adds the Authentication package and a startup script that signs the player in before the first scene loads, so cloud save, telemetry and other services have a player ID.

  * `unity docs cache add` downloads a version's documentation as Markdown for offline use: the manual by default, and the scripting API reference too with `--api`. `unity docs --content` then reads cached pages without the network, and `unity docs toc` and topic lookup use the cached page list when docs.unity.com can't be reached.

  * `unity setup copilot` installs Unity's agent plugin, with its Unity skills, into GitHub Copilot CLI by running `copilot plugin marketplace add Unity-Technologies/unity-agent-plugin`, then `copilot plugin install unity@unity-agent-plugin`. Like `unity setup codex`, it reports an existing install instead of reinstalling, and takes `--dry-run`.

  * `unity assets import --include <glob>` imports only part of a package: the entries whose path matches, everything under a matching folder, and the folders above them. Repeat `--include` to select more, with a glob (`*` and `?` stay inside one folder, `**` spans folders) or a plain path such as `Assets/Art/Hero.png`.

  * The `--help` of every `unity collaboration` command now ends with examples you can copy.

  * The `--help` of every `unity vcs` and `unity pipeline` command now ends with examples you can copy.

  * The Linux deb and rpm packages now install a `unity` man page, so `man unity` lists every command, its options and the exit codes. Each release also publishes it next to its downloads as `unity.1.gz`.

  * `unity commands --json` now reports each command's `stability`: `stable`, `preview` or `deprecated`. A bare command group's `--json` answer carries it too.

  * A project can pin the unity CLI versions it supports with `cli.version` in `ProjectSettings/UnityCliConfig.json`, an npm-style range such as `"^1.0.0"`. A command run in the project with a CLI outside that range prints a warning, and in CI it stops before doing anything, with exit code 1 and error code `CLI_VERSION_OUT_OF_RANGE`.

  * `unity assets inspect` says whether a package is signed: `signed` in `--format json` and `ndjson`, and a `Signed:` line in the human output. It checks that a signature is present, not that it is valid.

  * `unity assets import` warns when a package has no signature and reports `signed` in `--format json` and `ndjson`. Pass `--require-signed` to refuse an unsigned package before the Editor starts.

  * `unity mcp configure` now finds entries left by the deprecated Unity MCP server from the AI Assistant package and offers to replace them, so the client keeps one Unity server. `--replace-legacy` replaces them without asking, `--dry-run` shows what would change, and `claude-code` prints the `claude mcp remove` command to run.

  * `unity install <version> --set-default` makes the installed Editor the default once the install succeeds, so `unity install latest --set-default` replaces running `unity install latest` and then `unity editors default latest`. The json and ndjson result report the stored version as `data.defaultVersion`.

  * `unity doctor --ci --skip-license` skips the license check, for runners that get a license another way.

  * On macOS, each release now also publishes a notarized installer, `unity-darwin-arm64.pkg` and `unity-darwin-x64.pkg`, with the notarization ticket attached. It is the installer the Homebrew cask will use, and the cask moves to it in a follow-up.

  * `unity plugin install` and `unity plugin upgrade` show a plugin's license terms and ask you to accept them before anything downloads, for a plugin that has terms. A run that cannot ask, such as one with `--non-interactive`, stops with an error that names `--accept-eula`.

  * `unity setup claude`, `unity setup codex`, `unity setup grok` and `unity setup copilot` offer to install the Unity skills instead when the agent's CLI is missing or its plugin can't be installed. `--yes` installs them without asking.

  * `unity skill install <client>` installs every Unity skill from the Unity-Technologies/skills repository, at the commit this CLI release pins, beside the `unity-cli` skill. Each skill is checked against the pin before anything is written, and the source can't be redirected.

  * `unity skill show --skill new-unity-project` prints the new-unity-project skill the CLI embeds, the same way `unity skill show` prints the unity-cli skill. `--path` and `--list` work with it too.

  * `unity pipeline cloud-build` and `unity pipeline automation` now start, follow and act on work: `builds start`, `cancel`, `steps`, `failures`, `artifacts`, `log --follow` and `download`, and `pipelines trigger`, `jobs watch`, `logs`, `terminate`, `resume`, `approve` and `reject`. `builds cancel`, `jobs terminate` and `jobs reject` ask first unless you pass `--yes`.

* **Changed**

  * `unity command` reaches the Editor through the Pipeline package's own connection when the Editor offers one, and over HTTP otherwise. An Editor whose Pipeline HTTP server is turned off now answers too.

  * `unity status` reports an Editor whose Pipeline HTTP server is turned off instead of showing it as unreachable, and `unity pipeline editors` shows each way to reach the Editor, with a `pipelineServer.endpoints` array in its JSON.

  * `unity pipeline upgrade` now moves a project to the Pipeline package's latest published version, so a new release is available as soon as it is published, without a CLI update. `unity pipeline install`, `unity pipeline list-versions`, `unity pipeline editors` and the Pipeline step of `unity projects create` resolve versions the same way.

  * When `unity cloud org`, `unity cloud project` or `unity cloud status` fails, it now prints the usual error details (the error code, the log file, and how to get more detail) and records the failure in the log, so it shows up in `unity logs` and `unity bug`. JSON output and exit codes are unchanged.

  * When a `unity collab` command fails, it now prints the usual error details in `--format human` (the error code, the log file, and how to get more detail) and records the failure in the log, so it shows up in `unity logs` and `unity bug`. JSON output and exit codes are unchanged.

  * When `unity pipeline automation` or `unity pipeline cloud-build` fails, it now prints the usual error details (the error code, the log file, and how to get more detail) and records the failure in the log, so it shows up in `unity logs` and `unity bug`. JSON output and exit codes are unchanged.

  * `unity skill install` now recommends `unity setup all` to set up every agent client on the machine, in place of `npx skills add Unity-Technologies/skills`.

  * Without `--editor-version`, `unity projects create` uses the default Editor version, else the newest installed Editor, else the latest Unity release when no Editor is installed. `--editor-version latest` and `lts` now name the newest official and LTS releases rather than the newest installed Editor.

  * `unity projects create` checks its prerequisites before it asks anything, downloads a template or starts the Editor: an active license always, and, while the project links to Unity Cloud, a signed-in account, a reachable network and a chosen organization when you belong to several (pass `--cloud-org` to choose). `--no-cloud` removes the Unity Cloud ones; `--bare` does not.

  * `unity auth login` now ends with a short summary of your machine: your account, organization, license, installed Editors and the next command to run. With `--format json` or `--format ndjson`, anything that blocks you from creating a project, such as no installed Editor or an unreachable network, is listed in the result's `notifications`.

  * More commands take the project as `--project-path`: `assets export`, `assets import` and `auth default` take it instead of `--project`, and `templates create`, `templates pack`, `projects link`, `projects unlink` and the `vcs` commands that act on a project accept it next to their path argument. These commands, and `recompile`, also read `UNITY_PROJECT_PATH` when no path is given.

  * `build run` takes the build to launch with `--build-path`, and `projects clone` takes the folder of the project to register with `--subpath`.

  * `pipeline install` and `pipeline upgrade` report a folder that isn't a Unity project with the same message as the other commands that connect to an Editor.

  * `unity templates`, `unity templates info`, `delete` and `edit` take the Editor version as `--editor-version`, like the rest of the CLI, and resolve `lts` and `latest` through the release catalog as `unity install` does.

  * `unity pipeline cloud-build targets`, `tooling os` and `tooling platforms` filter by Editor version with `--editor-version`.

  * `-e` means `--editor-path` on every command. `unity vcs merge-setup` and `unity vcs resolve` now accept it too.

  * `UNITY_EDITOR_VERSION` sets the Editor version on every command that takes `--editor-version`: `build`, `docs`, `install-modules`, `projects create`, `templates`, `vcs merge-setup` and `vcs resolve` now read it as well. The `pipeline cloud-build` filters don't.

  * An exported `UNITY_EDITOR_VERSION` or `UNITY_ARCHITECTURE` now steers `unity build`, as it already steered `run` and `test`: the flag wins, then the variable, then the project's version. `build` prints one line naming the variable when it does.

  * Passing a version to `--editor-path` fails with a hint to use `--editor-version`.

  * `releases` and `cloud projects` take `--offset <n>` to start a page part way through the results, the spelling every offset-paged list uses. The `releases` footer now says `Use --offset <n> to see more`.

  * Every short flag now means one option on every command: `-f` is `--force`, `-i` is `--installed`, `-l` is `--list`, `-m` is `--module`, `-o` is `--output` and `-r` is `--releases`. Options that used those letters for something else show only their long name in help: `--follow`, `--input`, `--log-file`, `--modified`, `--reset` and `--output-path`.

  * Every `--format ndjson` stream now ends with one `{"type":"result"}` frame. Single-record commands such as `unity env`, `unity doctor`, `unity context current`, `unity editors default`, `unity install-path` and `unity diagnose update` answer with that frame alone, its `data` the same as `--format json`, and listings such as `unity logs`, `unity skills`, `unity command` and `unity install-modules --list` write their rows and then the frame.

  * Every row in an ndjson listing now starts with `"type":"row"`, so a script can tell a row from a `progress` or `result` frame. `unity templates` rows keep their own `type` (the template type) and carry no `"row"` marker.

  * Under `--format tsv`, the default when stdout is redirected, single-record commands such as `unity env`, `unity doctor`, `unity config proxy`, `unity install-path` and `unity editors default` print a `key<TAB>value` table with one row per field, named as in `--format json`. A script that reads `unity install-path` from a pipe now gets that table, with the path on the `path` row; use `--format json` and read `data.path` instead.

  * `unity logs --format tsv` and `unity skills --format tsv` now start with a header row, and `unity skills --format tsv` lists your installs instead of printing nothing.

  * The `command` field of `--format json` and `--format ndjson` output is now the full command path, such as `projects list` or `cloud org list`, the same in both formats and on success and failure. A script that matched on the old short names, such as `projects` or `proxy`, needs the full path instead.

  * Every listing now returns its rows in one shape. In `--format json`, `data` holds the rows as `items`, with `total` (`null` when the service doesn't report one), `nextPage` or `nextCursor` for the next page (`null` on the last), and `partial` (`true` when the listing stopped before it finished).

  * `unity doctor`, `unity env`, `unity diagnose proxy`, `unity diagnose accelerator` and `unity diagnose update` show their status as aligned label and value lines, in every language. The copy that `unity diagnose proxy` writes to the logs directory keeps its layout.

  * `unity pipeline editors` lists the open Unity Editors in a table, with any notes and the next step under it. When no Editor is open, it says so and suggests what to do.

  * With `--format tsv`, which is also the default when output is redirected, `unity cache info` prints one `key` and `value` line per field, named like its JSON fields, and `unity license status` prints the active licenses as a table with a header row, instead of sentences.

  * `unity cache info`, `unity auth status`, `unity license status`, `unity analytics status`, `unity config update-check`, `unity config proxy` and `unity language` show their status as aligned label and value lines, in every language. `unity license status` lists active licenses in a table, and `unity language` lists the available languages in one.

  * `unity projects` prints a table with a header in human output, also when its output is redirected with `--format human`. The columns that `--verbose`, `--editor-version`, `--modified`, `--cloud`, `--pipeline` and `--vcs` turn on are now table columns.

  * The anonymous once-per-run usage ping now stops when you turn analytics off (`unity analytics opt-out`, answering no at the first-run prompt, or turning it off in the Hub while signed in) and when `DO_NOT_TRACK` is set to any value but empty, `0` or `false`. `UNITY_NO_CLI_INVOKED_TELEMETRY` still stops it too.

  * The install scripts now install the latest stable release and no longer fall back to the latest beta. To install a beta, set `UNITY_CLI_CHANNEL=beta` before running the installer.

  * `unity self-update` keeps the last 3 versions it replaced instead of only one, and `unity self-update --rollback <version>` restores a specific one. `--rollback` on its own still restores the most recent.

  * `unity projects create`, `unity projects link` and the `unity language` picker no longer ask questions under `--non-interactive`, with `UNITY_NON_INTERACTIVE` set, or in CI, even on a terminal. `unity projects create --vcs uvcs` without `--vcs-region` then fails with an error naming `--vcs-region` instead of showing the region picker.

  * On a terminal, `unity editors upgrade` with no Editor named asks again which installed Editor to upgrade, `unity editor module add` asks you to accept a module's license terms (as `unity install-modules` does), `unity open` and `unity projects open` ask which project or Editor to use when several match, and the `unity collab` delete commands ask you to confirm. In CI nothing asks, even on a terminal: `unity install-modules` and `unity editor module add` then need `--accept-eula`, and a collab delete needs `--non-interactive`.

  * `unity mcp` now lists a title and MCP behavior hints for every Unity tool, so an agent client can run reads such as `scene get_hierarchy` without asking and still ask before anything destructive. A tool that deletes or clears data, takes `confirm`, saves a capture to a path you pick, or runs your code (`script eval`, `script eval_file`, `script run`) is marked destructive.

  * Unity CLI now tells you once, on its first run, that it sends crash reports and an anonymous usage ping, how to turn each off, and where to read the privacy policy. Runs in CI, scripts and agents get the same notice as one line on stderr.

  * Listing no longer needs a `list` word: `unity projects`, `unity templates`, `unity config`, `unity modules <version>` and `unity editors modules <version>` list on their own, with the same options and output, where they used to print their help. Bare `unity modules` and `unity editors module` now exit 2 with the missing `<version>` error instead of printing help at exit 0.

  * The same goes for `unity auth accounts` (the stored accounts), `unity pipeline editors` (the running Editors), `unity cloud orgs`, `unity cloud projects`, `unity docs cache`, `unity vcs uvcs reviews`, `unity collab annotations`, `unity collab attachments <annotationId>`, `unity collab jira issues`, and the `unity pipeline automation` and `unity pipeline cloud-build` listings, such as `unity pipeline automation jobs` and `unity pipeline cloud-build builds`. Bare `unity collab attachments` now exits 2 with the missing `<annotationId>` error.

  * `unity projects link cloud` now describes itself as linking or connecting a local project to Unity Cloud, so `unity commands --grep "connect project cloud"` and `unity command --query "connect project cloud"` find it first.

  * A search that finds nothing (`unity commands --grep` and `unity command --query`) now ends with a line saying that multi-step workflows are documented in the `unity-cli` skill, and that `unity skill show` reads it. `--format json` carries the line in `hint`, and the exit code stays 0.

  * `unity recompile --format json` and `--format ndjson` now write the top-level `errors` and `warnings` arrays every other command writes. Each error is `{code, message}` with the compiler code (such as `CS1002`), and each warning is a `file(line,col): message` string, so a script can read compile results the same way for every command.

  * `unity projects create` no longer adds the Pipeline package on Unity 6000.5.0 to 6000.5.2, where it can't start, and tells you to update the Editor to 6000.5.3f1 or later. `unity status` on a project open in one of those Editors says the same instead of telling you to wait.

  * `unity plugin install` and `unity plugin upgrade` now install the agent skill a plugin ships into every AI client that already has the Unity skill, from `unity skill install` or the Unity agent plugin. Before, they only printed a hint to run `unity skill install`.

  * `unity setup all` gives clients that take only skills the full set of Unity skills, not just `unity-cli`.

* **Removed**

  * The `list` subcommand of these groups is gone. `unity projects list`, `unity editors list`, `unity cloud org list` and the rest now fail as an unknown command, exit 2, and suggest the bare group instead.

  * **Breaking:** `unity projects new` is removed. Use `unity projects create <name> --no-cloud`, which also never links to Unity Cloud.

  * **Breaking:** `unity list` is removed. Use `unity command`, which lists the tools the connected Editor offers.

* **Fixed**

  * `unity auth login` now stays signed in on a Linux container or headless machine that has no Secret Service and blocks the kernel keyring, such as a Docker container with the default seccomp profile. The CLI saves the sign-in to a protected file in your user data directory, readable only by your user, and tells you once when it does.

  * The Windows file properties, the Linux deb and rpm packages and the npm packages now name Unity Technologies as the copyright holder and carry the Unity Terms of Service license.

  * On a machine without Unity Hub, a `cloudConfig.json` left by an older Hub or CLI no longer leaves the Editor on built-in default service URLs (the `environment-mismatch` warning in the CLI log). The CLI now tags and refills a cache that has no environment tag, keeping any keys it does not know.

  * `unity open` and the other Editor-launching commands now give the Editor the `seatinfourl`, `unauthenticatedurl`, `perf-events` and `socialdashboard` service entries, as Unity Hub does. The CLI used to refuse them as unsafe URLs even though Unity's own service config serves them that way.

  * While the Editor service is running, the CLI now fetches Unity's service config again every 15 minutes, as Unity Hub does, so the `cloudConfig.json` it wrote on a machine without Hub no longer goes stale. A cache Unity Hub wrote is still never touched.

  * `unity cloud orgs`, `unity cloud org set-default` and `unity cloud projects` no longer fail with "Unity-token exchange failed (Request failed with status code 401)" for a signed-in user whose access token the server stopped accepting before it expired. The CLI now refreshes the session and tries once more, and only asks you to run `unity auth login` when that fails too.

  * `unity vcs conflicts` no longer lets color or hide codes inside a file path change how the human and tsv tables look. The codes are removed from the path.

  * `unity shell --protocol ndjson` answers a request line with a repeated key or an unpaired surrogate escape with a `BAD_REQUEST` frame and keeps reading, instead of ending the session with an error.

  * Commands no longer pause for up to two seconds on their way out when usage data is turned on and the network is slow or unreachable. Sending usage data now gives up after half a second, and `DO_NOT_TRACK` skips it entirely.

  * `unity skill install claude-code` and `unity skill install codex` now install the skills your installed plugins ship even when an agent plugin already provides the Unity CLI skill. Before, a non-interactive run, such as an agent's headless mode, skipped those skills without saying so.

  * `unity shell` on a terminal remembers your commands across sessions again: press Up to recall them. Secret option values and secrets in URLs are never saved.

  * `unity shell` on a terminal completes commands, options and values with Tab again (press Tab twice to list the choices), and suspends with Ctrl-Z on macOS and Linux.

  * `unity install` refuses a module whose install or rename paths point outside the Editor's install folder, and an Editor version that is not a single folder name. A catalog can no longer make an install write or delete elsewhere.

  * Catalog, manifest and API responses over 64 MB are refused instead of being read into memory, and the Android license page is scanned in one pass.

  * `unity build`, `unity run`, `unity test`, `unity assets export`, `unity assets import`, `unity templates create` and `unity templates pack` no longer refuse a project as already open because of a leftover `Library/EditorInstance.json` whose process ID now belongs to another program, which happened in containers after an Editor was killed. When the refusal comes from that file, the message names it so you can delete it if no Editor is running.

  * `unity build` and `unity batch build` no longer run programs named by a project's git configuration (`core.fsmonitor`, hooks, the pager, file filters other than Git LFS, and an ssh command reached by fetching objects a partial clone lacks) when they read its revision and version. They never fetch, and they check each submodule with the same safe read, so a submodule at an unrecorded commit or with uncommitted edits still counts as a change.

  * With usage analytics turned on, creating a project from a downloaded or custom template no longer reports the template's file path. It reports the template's package name, or `custom` when the template has none.

  * On Linux, `unity vcs` conflict and diff staging, UVCS check-ins, and `unity publish` now keep their temporary files readable only by you, and refuse a folder or link another account planted in the shared temp directory.

  * `unity install --download-directory` and `unity install-modules --download-directory` on Windows now use an absolute path such as `C:\ws\editor` or `C:/ws/editor` as given, instead of joining it onto the current folder.

  * `unity build --create-profile` reads `UNITY_ARCHITECTURE` when `--architecture` isn't given, and refuses an architecture it doesn't know with the same usage error as the flag, instead of starting the Editor.

  * `unity --version` honors a `--format` or `--json` typed after it, as `unity version` does: `unity --version --format ndjson` now prints one result frame instead of the bare version line.

  * `unity docs --package <name> --content` prints the package's local Markdown, the same as `unity docs <name> --content`, instead of trying to open a browser.

  * On a machine licensed by a floating license server, `unity license status` and `unity doctor --ci` no longer report that no license is available before the Editor has leased a seat. When the server answers as healthy, both succeed and say the Editor leases a seat when it starts.

  * `unity license server status` reports a floating license server as reachable when the server answers as healthy but the licensing client cannot read its seat usage, which happens when nobody is signed in.

  * A successful `unity build` no longer lists the Editor's "Access token is unavailable" licensing line as an error.

  * `unity command --query` with a listing option such as `--limit` and no connected Editor now ends `--format ndjson` output with its result frame, which carries the search hints. It used to print nothing.

  * `unity mcp` now lists every Editor tool under a name of its own: the full command name with each space and dot written as `_`, such as `settings_player_get` and `script_eval`. On `com.unity.pipeline` 0.9, several groups shared one name (`get`, `set`, `add`), so clients dropped tools, a call could fail with "names several commands", and some clients rejected the whole server.

  * `unity close` now explains why it could not close an Editor when its output is redirected, for example that the project needs the `com.unity.pipeline` package or `--force`, instead of reporting only that the Editor was not closed.

  * A `cloud`, `collab`, `pipeline automation` or `pipeline cloud-build` command that fails because the server rejected your input (HTTP 400, 404, 409 or 422) no longer sends a crash report or points you at `unity bug`. The error message, the exit code and the json and ndjson output are unchanged.

  * A command that fails because you are signed out or your session expired no longer sends a crash report. The error message, the sign-in hint and the exit code are unchanged.

  * `unity projects` and `unity recompile` JSON and NDJSON output now escapes the C1 control characters (U+0080 to U+009F) like the other control characters, so a project path or compiler message cannot send an escape sequence to a terminal that honors them. Parsed values are unchanged.

  * `unity pipeline` no longer reports a Unity token exchange that returned an empty token, or got no answer, as being signed out. An empty token, or an answer it could not read, now offers the `unity bug` report like any other unexpected failure.

  * `unity plugins` no longer shows an out-of-date version for a plugin such as `ugs` when its saved copy of the plugin registry is more than a week old and this CLI already knows a newer version. The CLI's background refresh now also renews that saved copy once a week when no plugin is installed.

  * On Windows, `unity` now sends a crash report when it crashes, as it does on macOS and Linux. It was silent there before, so Windows crashes never reached us.

  * `unity projects info` shows the active platform for projects saved by Unity 6000.7 betas and newer Editors. Before, the platform was missing for those projects.

  * On Windows, `unity` stays signed in after a restart when the Hub you first signed in with was 3.21 or older.

  * `unity build` now shows why a player build failed, such as an output path that already exists as a folder, instead of listing only licensing log lines.

  * On Linux, `unity status`, `unity editors running` and `unity pipeline editors` list an Editor that Unity Hub 3.21 or older started through its per-version launch link.

  * `unity projects export --format ndjson` prints one JSON line with `"type":"result"`, so an ndjson reader can parse the export.

  * `unity install-modules` with no Editor installed now points you to `unity install <version>` instead of a command that does not exist.

  * `unity releases --limit` and `--offset` now refuse a value that is not a whole number, such as `1.5` or `5abc`, with a usage error instead of reading it as 1 or 5.

* **Deprecated**

  * `--project` on `assets export`, `assets import` and `auth default`, `--path` on `build run`, and `--project-path` on `projects clone` still work, and print a warning naming the new spelling.

  * `--editor` and `-e` on `unity templates`, `-e` on `unity install-modules`, and `--unity-version` on the `pipeline cloud-build` filters still work, and print a warning naming `--editor-version`. In `--format json` the warning is in the envelope's `warnings`.

  * `--skip` on `releases` and `cloud projects` still works, and prints a warning naming `--offset`. In `--format json` the warning is in the envelope's `warnings`.

## 1.0.0-beta.14

**Release date:** October 21, 2026

* **Security**

  * The recent log in `unity doctor` now shows only the command you ran, such as `projects open`. Also, every argument you passed reads `<redacted>`, so paths, project names and option values stay out of a report you paste. The log file itself doesn't change.

  * `unity bug --share-project` no longer follows symbolic links, so a link inside the project that points elsewhere can't put files outside the project into your report. Files the link would have reached and links to files inside the project are skipped.

  * On macOS and Windows, only a Unity-signed Editor started by `unity open` can get your access token from the CLI.

  * The programs the CLI starts for you no longer receive `UNITY_SERVICE_ACCOUNT_ID`, `UNITY_SERVICE_ACCOUNT_SECRET`, `UNITY_GITHUB_TOKEN`, or `UNITY_GITLAB_TOKEN`. The variables still reach `unity shell`'s commands, the command you run with `unity projects exec`, the Unity Editor, plug-ins, the licensing client and the identity server.

  * On Linux, the `unity` AppImage now copies the CLI into sealed, read-only memory when it starts and runs it from there, so the Unity auth broker can confirm it's talking to the genuine CLI. You run the AppImage as before.

  * On Linux, every release download of the `unity` CLI now carries a Unity signature: the standalone binary, the deb and rpm packages, the AppImage, and the npm package. It's made with the same key that signs the CLI on Windows, so the Unity auth broker can confirm it's talking to the genuine CLI.

  * On Linux, `unity doctor` now shows whether the running auth broker carries a valid Unity signature, in a new Signature row of the auth broker section and as `authBroker.runtime.signature` in `--json` output.

  * When the CLI exchanges a credential for a token, it no longer follows a redirect, even to the same host. That covers `unity auth login` with service account credentials or a browser sign-in, refreshing your sign-in, and getting a service account, Unity or Unity Version Control token.

  * When you run the CLI with `sudo`, it now makes you the owner of a folder it creates or repairs only when that folder sits inside a folder you already own.

  * On Windows, `unity self-update`, the MSIX update and `unity doctor` now run the Windows tools they need from the Windows system folder.

  * The CLI sends your sign-in and service-account credentials only to Unity servers. If the cached cloud configuration names any other server for them, the CLI uses the default Unity server and logs the ignored host.

  * `unity hub install` downloads the Hub installer only from Unity servers, and the service URLs the CLI hands to the Unity Editor are Unity servers too. A cached cloud configuration that names another server is ignored.

  Downloads stop after 10 redirects and no longer follow a redirect loop forever.

  * `unity plugin install plastic` and `unity plugin upgrade plastic` follow download redirects only to Plastic's own hosts over `https`. A redirect anywhere else fails the install.

  * Commands that look up Unity releases or templates, such as `unity install`, `unity releases`, `unity editors` and creating a project from a template, ask only Unity servers. A cached cloud configuration that names another server is ignored.

  * On macOS and Linux, the Editor identity server's socket can now be opened only by the current user, and it refuses a connection from a process running as another user. The CLI also sends its environment notice only to a socket owned and served by the current user.

  * `unity install`, `unity templates`, `unity upgrade` and `unity plugin install` refuse a download that redirects from an `https` address to a plain `http` one, instead of following it. `unity upgrade` stops at once instead of retrying.

  * `unity projects create` and `unity projects new` keep the Editor log, which can hold your access token, in a folder only you can open, and delete it when the run ends. After a failed run the log stays there, still private, so you can read it.

  * On Windows, the machine-wide `services-config.json` is used only when the file and every folder above it can be changed only by Administrators, SYSTEM or TrustedInstaller, as Unity Hub already requires. Otherwise the CLI uses the default licensing settings.

  * On Windows, `unity hub install` keeps the downloaded installer locked from its checks until it finishes its run.

  * `unity projects new` and `unity projects create` refuse a template archive that contains a symbolic link, a hard link, or a path outside the project.

  * `unity projects new` and `unity projects create` now only accept gzipped (`.tgz`) template archives. A plain `.tar` that used to work is refused as corrupt.

  * Template downloads ignore catalog entries whose name or version isn't a plain package name and version.

  * On Windows, `unity build run` no longer passes your service-account secret or source-host tokens to the player it starts, matching macOS and Linux.

  * The CLI no longer trusts certificates issued through the distrusted emSign intermediates, which its bundled root certificates and certificate checks could still accept.

  * On Windows, `unity hub install` and the commands that look for running Unity Editors now start Windows PowerShell from the Windows system folder.

  * Downloads no longer follow a redirect from HTTPS to plain HTTP, and `unity install` fetches a module over HTTPS even when the release catalog lists it with an `http://` address.

  * On Linux, removing an Editor that needs administrator rights and installing `git-lfs` through your system package manager now use `pkexec` only from a trusted system location. Otherwise the command fails with a message that it found no trusted `pkexec`.

  * Crash reports and displayed errors hide the value after `-accessToken`, `-password`, `-androidKeystorePass` and `-androidKeyaliasPass`, however short it is, as batch Editor output already did.

  * `unity bug` uploads and `unity batch` terminal output no longer show the serial number passed to the Editor with `-serial`.

  * On macOS, `unity uninstall` no longer lets the environment your shell started with reach the administrator shell that removes an Editor.

* **Added**

  * `unity config path` prints where the CLI keeps its configuration: the settings file and the directory that holds it. It works in every output format; `--json` returns `{file, directory}`.

  * `unity terms accept <version>` accepts the Unity Editor Software Terms for an installed Editor, so it opens without the "Unity Editor Software Terms" dialog, as a container or provisioning script needs. It shows the terms link and the copy installed with the Editor, then asks; pass `--yes` to accept without a prompt, which a run without a terminal requires.

  * The CLI now recognizes when GitHub Copilot runs it, from VS Code's agent terminal or the Copilot CLI. When the Editor is unreachable, the connection error mentions that an agent sandbox may be blocking local connections.

  * `unity releases --operating-system <windows|macos|linux>` lists another operating system's releases, and `unity install <version> --dry-run --operating-system <os>` shows what that system's Editor and modules would download, so you can plan a Windows build machine from a Mac. Without `--dry-run`, an install for another operating system stops with `CROSS_OS_INSTALL_UNSUPPORTED` and names the dry run instead.

  * When the CLI is signed out and Unity Hub is signed in, `unity auth login` shows the Hub's account and the `unity auth switch` command that uses it in the CLI with no browser sign-in, then continues with the browser sign-in. Nothing changes in the Hub.

  * `unity open --until-ready` (and `unity projects open --until-ready`) now names three dialogs the way `unity status` does: `OPEN_BLOCKED_BY_DIALOG_SAFE_MODE` for "Enter Safe Mode?" (quoting up to three compile errors from the Editor's log), `OPEN_BLOCKED_BY_DIALOG_GRAPHICS_API` for the Windows "Auto Graphics API Notice", and `OPEN_BLOCKED_BY_DIALOG_SOFTWARE_TERMS` for "Unity Editor Software Terms". The message gives the same remedy as `status`.

  * `unity status` reports an Editor waiting at the "Enter Safe Mode?" prompt with its own error code, `STATUS_BLOCKED_BY_DIALOG_SAFE_MODE`, and quotes the first compile errors from the Editor's log when it can read them. The message says what to do: quit, fix the errors and open the project again, or choose Enter Safe Mode in the Editor.

  * `unity cloud project --help` now ends with a pointer to `unity projects link cloud`, where a local project is linked to Unity Cloud, and `unity projects link cloud --help` points back to `unity cloud project` for listing projects and setting a default.

  * `unity open --accept-upgrades` (also `unity projects open`) opens a project and doesn't stop at the Editor's upgrade dialogs. As a result, an unattended open no longer hangs on "Project Upgrade Required" or the API Updater's script consent. It says yes to both: the project is upgraded to the Editor's version and Unity rewrites scripts that use obsolete APIs, with no backup prompt.

  * `unity install --download-directory <dir>` (`-d`) installs a self-contained Editor into a folder you name, such as a CI workspace, and doesn't change the install path or add it to the Hub's Editor list. Modules from `-m` go into the same folder, and `unity install-modules --download-directory <dir>` adds more later.

  * `unity projects create --bare` creates the project from the template without the default project scaffolding. The Unity Cloud link and `--vcs` work as usual beside it, and `--no-cloud` still turns the link off.

  * `unity projects create` reports each setup step it ran in a new `steps` field of its `--json` and `--ndjson` result: one entry per step, each `done`, `present` when the template already had it, `skipped` with a reason, or `failed` with an error code.

  * `unity open --until-ready` (and `unity projects open --until-ready`) waits until the Editor it launched is ready for commands, instead of returning right away. When a dialog stops the Editor, such as Project Upgrade Required, Script Updating Consent, Enter Safe Mode? or the Unity Editor Software Terms, it fails at once with `OPEN_BLOCKED_BY_DIALOG`, the dialog's title and what to do about it, rather than leaving a script waiting forever.

  * `unity mcp --tools <list>` exposes only the Editor tools whose names match the list, and `--exclude-tools <list>` hides the ones that match, so an agent's context holds only the tools you want it to use. Both take comma-separated names, and `*` matches any run of characters (`--tools "eval,capture_*"`).

  * The CLI tells you, at most once a day, when a plug-in you installed with `unity plugin install` has a newer version, and suggests `unity plugin upgrade`. Under `--format json` and `--format ndjson` it arrives as a `PLUGIN_UPDATE_AVAILABLE` entry in `notifications`, and over MCP in the server's instructions.

  * `unity command --obsolete-command-names` lists the command names from before command groups and the names that replaced them, from an Editor with a Pipeline package that serves them.

  * `unity --help` and the unknown-command error now end with "Not sure which command? `unity commands --grep <term>`", so a command you can't name is one search away.

  * `unity setup antigravity` installs Unity's agent plug-in into Google Antigravity by running `agy plugin install https://github.com/Unity-Technologies/unity-agent-plugin`. Like `unity setup codex` and `unity setup grok`, it reports an existing install instead of reinstalling, takes `--dry-run` and every output format, and fails with `ANTIGRAVITY_NOT_FOUND` when `agy` isn't on your PATH.

  * `unity docs --package <name>` opens a package's manual for the version your project uses, read from `Packages/packages-lock.json`, for example `unity docs --package com.unity.2d.sprite`. Outside a project it opens the newest release's manual.

  * `unity docs toc` lists every page of the scripting API reference, or the manual with `--manual`, on docs.unity.com, so an agent can pick a real page rather than make a guess. Each page has its path and URL, in every output format.

  * `unity docs <topic>` opens the local page from the Editor's Documentation module when it's installed for your project's Editor version (or the one `--editor-version` names), so it works offline. `--online` opens docs.unity.com instead, and `--url` always prints the docs.unity.com address.

  * `unity docs <topic> --content` prints the page's Markdown instead of opening a browser, and `--format json` wraps it with the page URL, the version and the source. Package topics read the package's local `Documentation~` Markdown, or say that no Markdown exists online yet.

  * `--no-header` leaves the header row out of `tsv` output, for scripts that only want the rows.

  * The `--json` and `--format ndjson` rows of `unity modules list`, `unity editors module list` and `unity install-modules --list` now include `downloadBytes` and `installedBytes` as integers and `isInstalled` as a boolean. Scripts should read these instead of `download`, `installed` and `status`, which are display text, and `status` is translated.

  * `unity projects link cloud <path> --cloud-project <id> --replace` switches a project that is already linked to another Unity Cloud project in one step: it writes the new link over the old one in the project's settings and the Hub's project list, with no `unity projects unlink cloud` first, and names the link it replaced (`previousLink` in JSON). Without `--cloud-project`, `--replace` takes `UNITY_CLOUD_PROJECT` or your saved default project, and fails with `REPLACE_NEEDS_CLOUD_PROJECT` when neither is set: it never creates a cloud project.

  * Every row of `unity commands --grep` and `unity command --query` now says what matched and how to run it: `--format json` adds `path` and `matchedOn` (`name`, `description` or `option`), and `--format tsv` adds them as its last two columns. An installed plug-in's row now shows `unity <plugin>` as its run line instead of nothing.

  * The `--json` and `--format ndjson` rows of `unity editors` now list an installed Editor's platforms (with `--verbose`, its modules) as the `moduleNames` array.

  * The `--json` and `--format ndjson` rows of `unity status` now name each Editor's project as `projectPath` and its version as `editorVersion`, and the rows of `unity editors running` name the version as `editorVersion`, the same names other commands use.

  * `unity command`, `unity list`, `unity job` and `unity mcp` take `--port <number>`, `--pid <number>` and `--instance <name>` to pin one running Editor when several are open, including a Multiplayer Play Mode player by its instance name. A pin that matches no running Editor exits 12 and lists the Editors that are running.

  * `unity open --batchmode` starts the Editor in batch mode, with no window. Add `--until-ready` to return once it is ready for commands, with the same dialog, exit, and timeout errors as a windowed open.

  * `unity status` now reports an Editor in Safe Mode, which it used to leave out or show only as unreachable. The Editor's row lists its compile errors (file, line, and message) in every output format, and the command fails with `STATUS_SAFE_MODE` and exit code 6 (an Editor shown only as unreachable gave 12).

  * `unity logs --console` reads the running Editor's console, and `unity logs --console --follow` streams new entries as the Editor logs them until you press Ctrl-C. Burst and C# compiler errors come with their code, file, and line, `--level` and `--tail` work as they do for the CLI log, `--project-path` picks the Editor, and `--format ndjson` writes one entry per line.

  * `unity version --json` reports the commit a release was built from and its build date, as `commit` and `buildDate`, so a support report can be traced to the exact build. A build you compile yourself reports both as `null`.

  * `unity license activate` reads the license serial from the `UNITY_LICENSE_SERIAL` environment variable when you pass no `--serial` and no other activation option, so the serial stays out of the process list on shared machines. `--serial` still works and takes precedence.

  * When an AI coding agent runs `unity` and Unity's plug-in or skill isn't installed for it, the CLI now suggests one. In Claude Code, you get Claude Code's own one-time prompt to install the Unity plug-in.

* **Changed**

  * `unity env` names its version row "CLI version", and its `--json` output adds `cliVersion`. `unity doctor --json` and `--format tsv` add `runtimeVersion`.

  * The CLI's MSIX package (the winget install) now needs Windows 10 version 21H1 or later, the same as the Unity Hub.

  * When their output is piped or redirected, or with `--format tsv`, `unity projects link cloud` and `unity projects unlink cloud` now print one tab-separated row: the result (`linked`, `already-linked`, `unlinked` or `not-linked`), the project path, the cloud project ID, the project name, the organization ID, and `true` when a new cloud project was created. For `unlink cloud`, the name is the one saved with the link, which is the local project's title when the CLI made the link.

  * `-a` now means `--architecture` on every command, and `-y` means `--yes` on every command that has `--yes`, including `unity bug mcp`, `unity mcp configure`, `unity skill install` and `unity skill refresh`. `unity projects list` and `unity projects size` show `--all` with no short flag; `-a` still works there, so existing scripts keep running.

  * When `unity releases` can't reach the Unity release service, the error names the host it tried and why, such as `ECONNREFUSED` or a failed secure connection, instead of "fetch failed". A connection, TLS or timeout failure also says how to set a proxy (`unity config proxy <url>` or `HTTPS_PROXY`), and `--json` reports the network error code in `errors[].code`.

  * `unity open` (also `unity projects open`) no longer passes `-acceptSoftwareTermsForThisRunOnly` to the Editor when you run it from a terminal, so the Editor shows its own Software Terms dialog to you. An unattended open (`--non-interactive`, `UNITY_NON_INTERACTIVE`, a machine `--format`, redirected output or CI) still passes it, and a copy you add with `--args` is kept.

  * `unity commands --grep` matches a regular expression with no time limit, so a pattern such as `(a+)+$` no longer stops with "took too long". Backreferences (`(a)\1`) and lookaround (`(?<=a)b`) are no longer supported and are refused as an invalid pattern, and an invalid pattern's error now ends with a short reason such as `unclosed group`.

  * `unity commands --grep` now matches plain words in any order and lists the best matches first, so `unity commands --grep 'cloud link'` finds `projects link cloud` at the top. A word in the command's own name ranks above one in its parent group, then its description, then its options.

  * When `unity commands --grep` or `unity command --query` can't search the Editor's Pipeline commands, because no Editor is connected, more than one is open, or it didn't answer within 3 seconds, the output ends with a line saying why and the command to run next. `unity command --query` without a connected Editor answers with that line and the number of CLI commands and plug-ins that match, and exits 0 instead of failing.

  * `unity projects` is now described as "Create, open, upgrade, and link local Unity projects (Unity Cloud, GitHub/GitLab)" in `unity --help`, instead of "Manage Unity projects in the Hub registry", so `unity commands --grep cloud` finds it. Use `unity projects link cloud` to link a project to Unity Cloud.

  * `unity projects create` adds the Pipeline package to every new project, so `unity command` works on it without a separate `unity pipeline install`. `--bare` leaves it out, and `--with-pipeline`, which used to opt in, is still accepted and does nothing.

  * `unity auth list` now marks accounts the CLI isn't signed in to, such as ones you signed in to only in Unity Hub, with `(not signed in to the CLI)`, and `--format json` adds `signedIn` and `signInState` to each account. When no account is active, `unity auth status` now says how many stored accounts aren't signed in to the CLI and suggests `unity auth login`, or `unity auth switch <account>` for one that is.

  * `unity auth switch` to a stored account the CLI isn't signed in to now says so and suggests `unity auth login`, and exits with code 3 and the error code `ACCOUNT_NOT_SIGNED_IN`. It used to fail with exit code 6 and an internal message about a missing token slot.

  * `unity auth login --help`, and `unity auth status` when you're not signed in, now say that a perpetual or legacy serial license needs no sign-in, and show the command: `unity license activate --serial <serial>`. A subscription serial still needs a signed-in user.

  * `-V` and `--version` print the CLI version only at the top level: `unity --version` and `unity -V` work as before. After a command they're no longer the CLI version, so `unity editors --version` now fails as an unknown option (exit 2, `INVALID_COMMAND_ARGS` under `--format json`), and a command's own `--version` means the version of what it acts on.

  * When the CLI hides an e-mail address in its log file or a crash report, it now keeps the domain (`[redacted]@example.com`) and removes only the part before the `@`, as the Unity Hub does. It used to replace the whole address with `<redacted-email>`.

  * `unity cloud project current` now labels what it prints as the saved default project for the organization, and inside a project folder linked to a cloud project it also prints that linked project. With `--format json`, `activeCloudProjectId` still holds the default, and `defaultCloudProjectId` and `linkedCloudProjectId` are added beside it.

  * A template's `package/package.json` larger than 16 MiB is now refused, and the template no longer appears in `unity templates list --editor <version>`. Real template files are a few KiB, so it only affects a damaged or hostile archive.

  * `unity cloud project set-default` now tells you when the project is in another of your organizations. Instead of reporting the project as unknown, the error names that organization and the `unity cloud org set-default` command that makes it active, and `--format json` carries the organization under `data.organization`.

  * `unity pipeline install`, `unity pipeline upgrade` and `unity projects create --with-pipeline` now save `Packages/manifest.json` in the encoding it already had, byte order mark included, and replace it in one step, so a run that stops halfway never leaves a broken manifest. They also only pin a plain version number from the Unity registry, and a manifest that repeats a top-level key is updated instead of failing.

  * `unity projects add` now checks a folder the way Unity Hub's Add project from disk does. It refuses a system folder, such as `/usr`, `C:\Windows` or `/Applications` itself, with `System folders can't be used as Unity projects`; a complete project inside `/Applications` or `C:\Program Files` is still added.

  * When the CLI can't read your signed-in account, a command now runs without the first-run analytics prompt and sends no analytics for that run, and `unity analytics opt-in` and `opt-out` exit with an error saying your choice wasn't saved, and change nothing. They also refuse when `user-settings.json` repeats a key or can't be read.

  * `unity skill install codex` now checks for the Unity plug-in that `unity setup codex` installs. When the plug-in is enabled and already carries the skill, the install says so and asks before writing a second copy, which Codex would load as well; without a terminal, or when you decline, it skips.

  * On Windows, `unity install-path --set` and `unity editors install-path --set` now answer a device path that names no drive, network share or volume, such as `\\.\pipe\name`, with `This directory does not exist.` without opening it. Drive paths, `\\?\C:\...` paths, `\\?\Volume{...}` paths and network shares are checked as before.

  * `unity projects create --vcs <host>` now refuses an IPv6 address or a host name with non-ASCII characters as an invalid provider. Use the server's ASCII host name, the one your provider CLI signs in to.

  * `unity projects create` and `unity projects new` now check a new project's name and location the way Unity Hub's New Project window does. A name can be at most 223 characters, which leaves room for the files Unity names after the project.

  * When a command isn't found, the tip now names `unity command` for the command groups, `unity command --tags` for the tags and, when the Editor's Pipeline package supports it, `unity command --obsolete-command-names` for the old names.

  * `unity command` with no command name now lists the Editor's command groups instead of its tags, and an Editor with an older Pipeline package still lists its tags.

  * `unity command <group>` lists the commands in that group like `--tag` does instead of printing a raw result, and command listings and results show each command as you type it (`editor.playmode start`).

  * `unity command editor status` and the other full command names, `unity editors playmode` and `unity recompile` still work with a Pipeline package from before command groups, and warn once to run `unity pipeline upgrade`.

  * `unity projects link cloud` without `--cloud-project` now links the project named by `UNITY_CLOUD_PROJECT`, then your saved default project for the organization (`unity cloud project set-default`), and creates a Unity Cloud project only when neither is set. On a terminal it asks first, with that project preselected, and it always says when it created one (`created` in `--format json`).

  * A plug-in killed by a signal, run as `unity <tool>` or as a `unity-<name>` command on your PATH, now exits with `128` plus the signal number (`139` for a segmentation fault), the way a shell reports it, instead of `1`. The CLI log now names the plug-in, its version when known, and the signal, so `unity bug` includes them.

  * `unity cache key` with more than one path now lists every argument you passed in its error. `unity config accelerator` now refuses an IPv6 address with an interface name, such as `[fe80::1%eth0]`, whose number depends on the machine; use the numbered zone instead, such as `[fe80::1%3]`.

  * `unity templates` and `unity projects create` now say plainly when the Unity Hub templates folder can't be created, or when its list of downloaded templates can’t be reset or repeats a key, instead of printing a raw system error. For example, a folder they can’t create now shows `Could not create the templates folder (PermissionDenied).`  `unity templates delete` reports a custom templates folder it can't create or read the same way.

  * `unity projects create --template <folder>` now refuses a template whose `package.json` repeats a key as not a valid Unity template, and `unity projects create` and `unity projects new` report the Editor version as unresolved, with how to choose one, when the newest installed Editor can't be told apart, instead of printing an internal error. `unity projects new`, `create`, `link vcs` and `unlink vcs` run from a folder that no longer exists now say `Unable to read the current directory.` unless you pass an absolute path.

  * `unity command` without `--timeout` now lets each Editor command use its own default timeout (for example 10 minutes for `run_tests`) instead of a flat 30 seconds, on a `com.unity.pipeline` that supports it. `--timeout <seconds>` still overrides it, and when it runs out the Editor's own timeout message is shown.

  * A command the Editor rejects because a modal dialog is open now fails at once instead of retrying until `--timeout` runs out. Its error, and the timeout error of a command or job that was already running when the dialog appeared, now name the dialog and the `unity command editor.dialog answer <id> <button>` (or `unity command editor.dialog dismiss <id>` for an Editor window) to run; `unity command editor.dialog list` shows what is open.

  * When the Editor is running but its Pipeline server can't answer yet, for example while scripts compile, `unity command` now shows the Editor's reason, such as `Compiling scripts.`, instead of a bare 503 status or a cannot-connect error. A `unity command --query` search still reports that no Editor could be searched.

  * When the CLI can't reach the Unity Editor from inside an AI coding agent, the hint about the agent's sandbox now also covers Codex, opencode, Cline, Roo Code, Augment, Goose, OpenClaw, Trae, Antigravity, and Cursor's agent. It no longer appears when you type commands yourself in Cursor's terminal.

  * When the CLI can't reach the Unity Editor from inside an AI coding agent, the hint about the agent's sandbox now also covers Grok Build.

  * `unity auth revoke` with an empty application name reports a usage error that points at `unity auth consumers`.

  * `unity build run`'s local server for a WebGL build answers only requests addressed to `localhost`, `127.0.0.1` or `[::1]`, so a web page on another site can't read your build through a rebound domain name. It also closes each connection after its response.

  * `unity test --shard` and `--rerun-failed` refuse a `--filter` pattern that's too long or too complex to check against the test names, with a message that says so, and `--affected` then runs the whole suite instead of narrowing it.

  * `unity run`, `unity test` and `unity build` check the `--log-file` path, and `unity test` the JUnit report path, before the Editor starts. A `--log-file` path that runs through a file, or a JUnit report path that's a folder or runs through a file, is refused with a message naming the option to change.

  * `unity build --create-profile` refuses an architecture it doesn't know, from `--architecture` or `UNITY_ARCHITECTURE`, with the same usage error as every other `unity build`.

  * `unity projects clone --vcs uvcs`, `unity projects link vcs --vcs uvcs` and `unity projects create --vcs uvcs` download the Unity Version Control client only from the vendor's own download servers when it's not installed, and stop if the download redirects anywhere else. The client is checked against its published checksum before it's installed.

  * `unity editor module list` and `add` on macOS report Visual Studio as installed when `Visual Studio.app` is in `/Applications` or `~/Applications`, without asking macOS for permission to control it.

  * `unity editors default <version>` and `unity editors default --unset` fail with exit code 6, and change nothing, when your saved settings file holds a number too large to read or text that can't be decoded. Fix or remove the file, then try again.

  * `unity editors upgrade` with no editor named no longer asks which one to upgrade on a terminal. It stops and asks you to name an editor or pass `--all`, as it already did in scripts.

  * `unity editor module add` (and `unity editors module add`) no longer asks you to accept module license terms on a terminal. Pass `--accept-eula` to accept them; without it, a module with license terms isn't installed.

  * `unity install`, `unity install-modules` and `unity modules list` report a clear error when a Unity Hub file or an answer from Unity's release service can't be read, when the install lock can't be used, or when the computer's architecture can't be told. In that last case, pass `--architecture`.

  * `unity` now ships as a native Rust binary on macOS, Linux, and Windows, with no .NET runtime inside.

  * `unity open` and `unity projects open` no longer ask on a terminal which of several matching projects or Editors to use, or whether to install a missing Editor first. They stop with the same message a script gets: pass the project's full path, `--architecture` or the exact version, or run the suggested `unity install` command.

  * `unity collab` delete commands no longer ask for confirmation on a terminal. Pass `--non-interactive` to confirm the deletion.

  * `unity pipeline install` no longer asks which running Editor to install into when several could take the package. Pass `--project-path` to choose one.

  * `unity projects create` and `unity projects new` download a template that's not on disk yet and verify it against the checksum the template catalog lists before using it. A template whose catalog entry lists no checksum is refused.

  * `unity projects create --open`, `unity projects new --open` and `unity projects upgrade --yes` no longer ask on a terminal which of several matching Editors to open the project in, or whether to install a missing one. `create` and `new` still create the project and warn that it didn't open; `upgrade` stops.

  * `unity close`, `unity projects close`, `unity projects require`, `unity projects upgrade`, `unity projects create` and `unity projects new` stop with a clear error, before anything is changed, when Unity Hub's project list, a project's files or the Hub's settings hold a value the CLI can't read.

  * Commands that reach the network, among them `unity license`, `unity collab`, `unity hub install`, `unity templates`, `unity plugin`, `unity projects create`, `unity editors` and `unity install`, now run behind a proxy set through `HTTPS_PROXY`, `HTTP_PROXY`, `ALL_PROXY`, `UNITY_PROXY` or `unity config proxy`, a SOCKS or credentialed proxy, `NODE_EXTRA_CA_CERTS`, or a macOS automatic proxy configuration (PAC), and with `--log-proxy` on.

  * `--proxy <url>` and `--proxy-disable` now take precedence over proxy environment variables, so `--proxy <url>` works while a proxy variable is also set.

  * Commands that reach the network now read proxy variables per scheme, as curl does: `HTTPS_PROXY` covers `https://` requests and `HTTP_PROXY` covers `http://` ones, while `UNITY_PROXY` and `ALL_PROXY` cover both. Before, the first variable found was used for every request.

  * On Windows, a system proxy set only for HTTP is no longer used for `https://` requests, matching other Windows apps. Set a proxy for secure connections too, or one proxy for all protocols, to keep routing them through it.

  * `unity shell` on a terminal uses a simpler line editor: the usual editing keys work, and Up and Down recall commands from the current session. Tab completion and history from earlier sessions aren't available.

  * `unity templates list`, `info`, `delete` and `edit` stop with a clear message, and leave the file alone, when Unity Hub's saved template data holds a value the CLI can't read. `unity templates edit` no longer edits a template whose `package.json` holds such a value.

  * Every curated tool command, such as `unity uvcs`, `unity cm`, `unity plastic` and `unity ugs`, hands the terminal straight to the tool. A first-run analytics consent question waits for the next `unity` command instead.

  * On Windows, `unity projects clone --vcs uvcs`, `unity projects link vcs --vcs uvcs` and `unity projects create --vcs uvcs` work again, downloading the Unity Version Control client on first use. The first check-in keeps files whose names use characters outside your system code page.

  * `unity projects create --vcs`, `unity projects link vcs` and `unity vcs setup` create the repository on a self-hosted host through `tea`, `bkt` or `az` when it's the signed-in tool, with no change to how you sign in. A repository that Azure DevOps created but whose reply `az` printed unreadably is now reported as left behind, with its URL when there's one.

  * `unity projects unlink vcs` no longer asks for confirmation on a terminal before it removes a Unity Version Control workspace that holds other projects. Pass `--unlink-workspace` to remove it, as in a script.

  * `unity projects unlink cloud --cascade-vcs` no longer asks for confirmation on a terminal before it removes the Unity Version Control workspace: `--cascade-vcs` confirms it. A workspace that holds other projects also needs `--unlink-workspace`.

  * `unity vcs setup`, `unity projects link vcs` and `unity projects create --vcs` no longer ask for a missing provider token or offer to install Git LFS on a terminal. A missing token is reported with the option to pass, and the Git LFS install offer prints the command to run instead of asking.

  * On Windows, `unity uninstall`, `unity editors prune --remove` and `unity editors upgrade --replace` remove an Editor you own without asking for administrator rights. An Editor installed with its own uninstaller, or one in a folder you can't change such as Program Files, is removed after one administrator prompt per command, and setting `UNITY_NO_ELEVATE` refuses it with nothing removed.

  * `unity projects create` and `unity projects new` default to the Editor version's own URP template (`com.unity.template.urp-blank`) instead of the Built-in Render Pipeline 3D template, and `--template 3d` or `--template 2d` picks that version's 3D or 2D URP template. When the version doesn't offer it, the command fails with `TEMPLATE_NOT_FOUND` and lists the templates it does offer.

  * `unity docs` now uses only docs.unity.com, since docs.unity3d.com is being shut down. A class name finds its real page through the site's page index, so `unity docs AdaptivePerformancePackageMetadataStore` and `unity docs GameObject.activeSelf` open the right page instead of a 404, and a name two pages share goes to search rather than a guess.

  * Giving an old and a new option spelling different values prints a warning naming the value used, the last one typed. For `status --project` beside `--project-path` the last one now wins; before, `--project-path` always did.

  * `unity collaboration` takes the Unity Cloud organization and project as `--cloud-org <id>` and `--cloud-project <id>`, like the rest of the CLI. `jira server`, `jira project add`, `delete` and `update`, and `jira issues list` use `UNITY_CLOUD_ORG`, then the default organization (`unity cloud org set-default`), when you don't pass `--cloud-org`.

  * In `unity collaboration`, an empty or blank `--cloud-org`, `--cloud-project`, `UNITY_CLOUD_ORG` or `UNITY_CLOUD_PROJECT` counts as not set, so the next source is used, as `unity pipeline cloud-build` does.

  * `--since` now always takes a revision, as it does on `vcs summarize`, `vcs affected` and `test`. `vcs git migrate-lfs` bounds its scan with `--after <date>`, and `releases` filters from a year with `--from-year <year>`.

  * Four options take the spelling every other command uses: `--git-token-from-stdin` on `projects create`, `projects clone`, `projects link vcs` and `vcs setup`; `--local` on `collaboration annotations create` and `update`, as on spatial attachments; `--group-by` on `command`; and `--long` on `editors` and `projects list` to show every column. The old spellings (`--git-token-stdin`, `--local-space`, `--group_by`, and `-v` on `projects list`) still work and print a warning naming the new one.

  * Every `--timeout`, and `UNITY_BUILD_TIMEOUT`, `UNITY_RUN_TIMEOUT` and `UNITY_TEST_TIMEOUT`, now takes a whole number of seconds written as digits, such as `--timeout 30`; any other value is a usage error (exit code 2) that quotes it. Scripts may need updating: `30s` or `5m` on `build`, `run`, `test`, `watch test` and `recompile` used to wait 30 and 5 seconds, `1e3` and `0x10` on `status`, `open`, `projects open`, `close`, `projects close` and `job wait` waited 1000 and 16 seconds, and `command --timeout 1.5` waited one and a half seconds.

  * `unity install`, `unity install-modules` and `unity projects require` bound the wait for another install with `--timeout <seconds>`, the spelling every other command uses for a time limit. The old `--wait-timeout` still works and prints a warning naming `--timeout`.

  * Under `--format json`, a command that reports an error on stderr now writes the plain `Error: ...` line there, as every other format does, instead of a `{"error": ...}` object. Read the outcome from the envelope on stdout (`success` and `errors`), not from stderr.

  * `unity auth status --format json` signed out now reports `success: false` with a `NOT_SIGNED_IN` error (`SESSION_EXPIRED` for an expired session), matching its exit code `3`. The status report stays in `data`.

  * `unity auth login --format json` now writes its `auth_url=` progress frame, and the `adoptable=` frame, to stderr, so stdout holds only the result envelope.

  * `unity skill install --format json` now writes one envelope whose `data` is an array with a record per skill it considered, instead of one envelope per skill, so its stdout parses as a single JSON document. `--format ndjson` writes the same records as its result frame.

  * `unity skill list`, `unity skill enable`, `unity skill disable` and `unity skill install --list` now end `--format ndjson` output with a `{"type":"result"}` frame carrying the same data as `--format json`, instead of writing nothing.

  * Status commands that answer no now report `success: false` in `--format json`, so `success` agrees with the exit code: `unity cloud status` when signed out (`NOT_SIGNED_IN` or `SESSION_EXPIRED`), `unity license status` with no active license (`LICENSE_NOT_ACTIVE`), and `unity license server status` with no server or an unreachable one (`LICENSE_SERVER_NOT_CONFIGURED`, `LICENSE_SERVER_UNREACHABLE`). Their exit codes and `data` don't change.

  * `tsv` headers now use the same keys as the `--format json` rows (`version`, `upgradeTo`, `genesisId`), whatever your language, instead of the translated column titles. A flag that adds information only appends columns, so `unity editors --verbose` keeps the same columns and order.

  * An empty `tsv` result prints the header row instead of nothing or a sentence (any "no results" hint goes to stderr), and lists that printed bare rows (`unity projects list`, the `vcs` tables) now lead with a header row too.

  * Piped `unity projects list` now prints a header row and the project name before its path, where it printed bare paths. A script that reads each line as a path, such as `unity projects list | xargs` or a `while read` loop, needs `--no-header` and the second column, for example `unity projects list --no-header | cut -f2`.

  * Piped `unity projects list` has a fixed column set: `name`, `path`, `version`, `modified`, `cloudProjectId`, `pipeline`, `vcs`. A column flag such as `--cloud` fills its column, which stays empty without it, so adding a flag never moves a column.

  * Boolean `tsv` columns print `true` or `false`: the `default` column of `unity cloud org list` and `unity cloud project list` and the `active` column of `unity context list` no longer print `*`, and the `removed` column of `unity editors prune` prints `true` or `false` instead of a translated status.

  * An unset value is an empty `tsv` cell: `unity context list`, `unity context current` and `unity context save` no longer print `(not set)`.

  * `tsv` keeps stdout for data: messages, hints, and failures such as "You are not signed in" from `unity auth status` and the `unity cloud` commands now go to stderr.

  * `--quiet` now hides warnings in human and tsv output, and no longer changes json output. With `--format ndjson --quiet`, every listing now keeps its rows except `editors upgrade`, `editors module list`, `install-modules`, `build --list-targets`, `build --list-profiles` and `env`, which still leave them out.

  * In `--format ndjson`, warnings appear only in the final result line's `warnings`, no longer on stderr. In `--format json`, a warning that was only printed to stderr before now appears in `warnings`.

  * `unity projects info` now names the project's Unity Cloud organization when you're signed in, for example `Acme (1001 / <uuid>)`, whether Unity Hub, the CLI, or the Unity Editor last wrote the link. With `--format json` it adds `organizationName`, `organizationGenesisId`, and `organizationUuid` after `organizationId`, which still holds the stored value.

  * `unity cloud org current` now names your default organization when your session is held by the auth broker, and it no longer starts the auth broker to do so. With no broker running on macOS or Linux, it prints the stored value as before.

  * `unity self-update` now runs when you pass `--no-log-proxy`.

  * `unity commands --grep <term>` and `unity command --query <term>` are now one search over the CLI's commands, its plug-ins and the Pipeline commands of the connected Editor, best match first. Pipeline matches show as kind `pipeline`, and every row says how to run it (`--format json` adds an `invoke` field).

  * `unity vcs setup` now refuses a preset file that repeats a key or holds a broken text escape as invalid, with `VCS_PRESET_INVALID`, instead of failing with an internal error. The `unity vcs hooks run pre-commit` check reports a staged `Packages/manifest.json` that's not valid JSON, a repeated key included, as "the file is not valid JSON".

  * `unity vcs setup --vcs` and `unity projects link vcs --vcs` now refuse an IPv6 address and a host name with non-ASCII letters as an unsupported provider, as `unity projects create --vcs` already does.

  * `unity commands --grep` now reads regular-expression patterns the way .NET does. Patterns .NET refuses, such as `a++` and `(a|b)+??`, are refused, `[[:alpha:]]` and `\11` match as they do in .NET, a regular-expression pattern longer than 4096 characters is refused, and an invalid pattern's error ends with .NET's own wording, for example `nested quantifier`.

  * **Breaking:** failures that say what went wrong now exit with their own code instead of `6`, so a script can tell whether to retry. `11`: the path isn't a Unity project, or the release or module doesn't exist.

  * Ctrl-C and SIGTERM now end every command by the signal, which a shell reports as `130` and `143` and which stops a shell loop. Under `--format json` or `ndjson` the command first writes a failure with the code `INTERRUPTED` (Ctrl-C) or `TERMINATED` (SIGTERM), unless it had already started writing its own result.

  * Passing `--json` together with a different `--format`, such as `--json --format tsv`, now stops with a usage error (exit code 2) that names both flags, instead of quietly printing the `--format` output. Pass one of them.

  * `unity mcp configure` quotes arguments with spaces or other shell characters in the `npx` and `claude` command lines it shows and reports, so they can be pasted back. Quoting uses single quotes, which Windows `cmd.exe` doesn't read; a Windows path without spaces is shown unquoted.

  * `unity --help` now lists the top-level commands by area (Editor, Project, Editor Automation, Build and Test, Cloud and Account, Setup, and Help and Diagnostic) instead of one long list, so a command is easier to find.

  * On Linux, module downloads are checked against their published checksums again, as on macOS and Windows. A module that doesn't match fails to install instead of being installed unverified.

  * `unity projects create` and `unity projects new` create the project in a folder that already exists when that folder is empty, so `mkdir MyGame` then `unity projects create MyGame` works. A folder that holds anything, hidden files and `.git` included, is still refused.

  * When a command can't run because a proxy points to a PAC script, the error now names where that proxy came from (`--proxy`, the environment variable, or the saved proxy file) and how to fix it. A saved proxy file the CLI can't read is named too.

  * `unity projects upgrade` exits 3 when the Unity Cloud step is refused with a 401 or 403, or the session is signed out, and 7 when the Unity Cloud service can't be reached. These used to exit 6.

  * `unity pipeline cloud-build` accepts a Unity Cloud project name as well as an id in `--cloud-project` and `UNITY_CLOUD_PROJECT`, the way `unity projects link cloud` does. A name that matches no project, or more than one, is an error that names it.

  * On Windows, links the CLI opens in your browser no longer pass through the command shell, so they open exactly as written.

  * `unity setup claude` installs Unity's plug-in from Anthropic's official Claude Code marketplace, as `unity@claude-plugins-official`. A plug-in you installed earlier from Unity's own marketplace still counts as installed.

  * The CLI now uses Unity Licensing Client 1.19.0. A client it downloaded under an earlier version is replaced the next time a `unity license` command or an Editor launch needs it.

* **Removed**

  * Removed the `UNITY_CLI_FTUE` variable and agent first-session ("paved") mode. Machine output no longer carries `"paved"`, and `unity projects create` no longer writes `UserSettings/UnityCliPaved.json` or reports `pavedSettings`.

  * Removed `unity serve`; it existed for the retired Electron Hub.

* **Fixed**

  * `unity self-update` no longer tells you to update to the version it just installed. The reminder is also gone after `--check`, `--rollback` and `--dry-run`.

  * `unity projects create` no longer deletes a corrupt template archive that sits in a folder whose name differs from the templates folder only by letter case, on a case-sensitive volume. It reports the archive as unreadable and keeps it, so you remove or replace the file yourself.

  * On Linux, installing or repairing an Editor or module no longer fails with a process error when the installer finishes at the exact moment the CLI samples its progress. The CLI treats that as a missing reading and lets the install complete.

  * `unity editors info` now reports the installer and modules for your machine's architecture, or the platform's only build when there's none for it: on Linux arm64 that's the x86\_64 installer, which runs only under FEX-Emu. On x64 Windows it used to show the Arm64 installer.

  * `unity mcp configure <client> --format json` and `--format ndjson` printed nothing and exited 0. They now print the result (client, scope, the config path written or that a dry run would write, and what happened), and a failed write is reported in that result with a non-zero exit.

  * On Windows, `unity build`, `run`, `test`, `status`, `templates create` and `templates pack`, and `unity vcs switch`, `sync` and `git worktree`, no longer report a project as open in the Editor right after you quit that Editor. The check now waits up to a quarter of a second for the Editor's lock to clear, as the Unity Hub does.

  * On Windows 11, plug-ins and their runtimes installed by the CLI from the MSIX package (the winget install) are now visible to every other CLI install and to the Unity Hub, and they're kept when the package updates or is uninstalled. Before, they were private to the package and a package update could remove them.

  * `unity build --args` with an unclosed quote or a trailing backslash now gives the whole error in your saved language. The last part used to stay in English.

  * `unity install-modules --non-interactive --editor-version 6000.4` and `unity editors path 6000.4` now say what is ambiguous when several installed Editors match. With two patches installed, both name the matching versions and ask for the full version.

  * `unity plugin install --help`, `unity plugin remove --help` and `unity plugin changelog --help` no longer list a fixed set of plug-in IDs that left some out. They point to `unity plugin list`, which shows every plug-in you can install.

  * Run from inside a Unity project with no Editor open, `unity command`, `list`, `job` and `mcp` no longer reach the Editor of another project. They fail and name the project, as `--project-path` does, so a command can't change the wrong project.

  * `unity editors upgrade` no longer installs Visual Studio Code or Visual Studio on the upgraded Editor. IDEs update themselves, and declining the VS Code license used to stop the whole upgrade.

  * `unity watch test` started in the project folder no longer re-runs the tests over and over. Each run's own `test-results.affected.xml` counted as a project change, so the next run started at once.

  * `unity skill install` with no terminal, or with `--non-interactive`, still exits 0 when it skips an outdated copy or a skill a plug-in already provides. Its `--format json` result now carries `skipped: true` and a `skipReason`, so a script can tell a skip from an install.

  * `unity ci init` run from a deleted or moved directory now says it can't read the current directory and asks you to change to one that exists, instead of printing a raw system error.

  * `unity command test run --async_tests true` now shows the message telling you to poll `test status` in human and TSV output, instead of `0/0 passed`, with the Pipeline package versions that send an empty results list along with it.

  * `unity list` and `unity command` list parameter types as `string`, `integer`, `number`, `boolean`, `array` or `object` instead of .NET type names, and show a nullable parameter as optional.

  * `unity projects link cloud` and `unity projects unlink cloud` now warn when an open Editor has the project: it keeps the old cloud link until it restarts, and can write it back to the project. The warning names `unity close <path>`.

  * Commands that check whether the Editor has a project open, such as `unity vcs switch`, `unity run`, `unity open` and `unity status`, no longer hang or run out of memory when a project's `Temp/UnityLockfile` or `Library/EditorInstance.json` is a named pipe or a link to a device such as `/dev/zero`. They skip it, as they do any file that's not a regular file.

  * Commands run from a sandbox that can't inspect other processes no longer make a running Editor unreachable. Such an Editor is still listed, without its process ID.

  * `unity status` no longer reports an Editor as `ready` while a modal dialog freezes it, such as the URP Material upgrade prompt in a project made from a 6000.3 template: the row reads `starting` (`STATUS_NOT_READY`), or `unreachable` once nothing has asked about it for 60 seconds, and `unity status --until-ready` keeps waiting. On an Editor that reports its dialogs (Unity 6000.7 or later), the row names the dialog with `STATUS_BLOCKED_BY_DIALOG`.

  * On Windows, a command that shares a settings file with another running Unity tool no longer fails with `Access is denied` when that tool is releasing its lock at the same moment. The command waits a moment and takes the lock.

  * On Windows, `unity open` and `unity projects open` now report the Editor's process ID in `launchedPid` with `--format json` and `--format ndjson`. They always reported `0` there.

  * `unity test --allow-install` now keeps the test settings from the project's `UnityCliConfig.json` and your saved defaults, such as the mode, report format and timeout, after it installs the missing Editor. It used to run the tests without them.

  * `unity cloud org current` now names your default organization when you're signed in, for example `Acme (1001 / <uuid>)`, whether Unity Hub, the CLI, or the Unity Editor last wrote it. With `--format json` it adds `organizationName`, `organizationGenesisId`, and `organizationUuid`, and `--format tsv` still prints the bare stored value.

  * A sign-in request no longer fails with the connection closed when the auth broker had only just started.

  * `unity projects link cloud` no longer fails with `ALREADY_LINKED` when only the project's `ProjectSettings.asset` still names a cloud project, for example after an open Editor wrote back a link you removed. The link now goes ahead and records the new project in both the project file and the Hub's project list.

  * On Linux arm64 with `UNITY_EXPERIMENTAL_FEX_EMU=1`, the CLI now finds a standard FEX-Emu setup, with its config in `~/.config/fex-emu` and its RootFS in `~/.local/share/fex-emu`, when `XDG_CONFIG_HOME` and `XDG_DATA_HOME` aren't set. It used to look only in `~/.fex-emu`, so `unity doctor` reported no RootFS and the x86\_64 Editor was started without FEX-Emu and failed.

  * An Editor opened with `unity open` on a machine without Unity Hub now gets the full Unity cloud configuration, so Asset Store links such as Open in Browser work instead of reporting that the Unity Connect configuration is invalid. The CLI downloads it once in the background and saves it where Unity Hub keeps it, and never replaces one Unity Hub saved.

  * `unity projects info` now reads a project's Unity Cloud link from the project's own settings file, the one the Editor loads, instead of the Hub registry's record. Before, a registry record that named an organization could outrank the file, so `info` reported a link the project no longer had, or mixed the registry's project with the file's name.

  * When the plain `<version>` folder for an editor already holds one, `unity install` no longer quietly writes a second full copy to a `<version>-<arch>` folder beside it. If the editor in that folder is the same version and architecture you asked for, the install stops and names that folder, with a hint to run `unity editors add` if `unity editors` doesn't list it (`--force` still installs).

  * `unity auth login --client-id` now stops at once, with no network call, when the value is an email address. `--client-id` and `--client-secret` take a service-account key created in the Unity Dashboard, not a Unity ID email and password.

  * On macOS and Windows, when the same Unity version and architecture is installed in more than one folder, such as `2022.3.62f2` and `2022.3.62f2-arm64`, every command now uses the `2022.3.62f2` folder and warns about the other copy, naming both folders. Before, commands silently used the `-arm64` folder, so `unity install-modules` could add modules to a copy you weren't using.

  * On Windows, `unity projects create --vcs uvcs` and `unity projects link vcs --vcs uvcs` now check in the whole project when the project's folder path has accented or non-Latin characters, such as `Câmera` or `日本語`. Before, the first check-in added nothing.

  * When GitLab's search for Unity projects fails and `unity projects clone` falls back to listing the repository's files, it now reads at most 100,000 files and folders, so it can't keep asking a server that never stops answering. A project that sits only past that point isn't found.

  * `unity vcs git worktree add` and `remove` now put the real paths in `--format json` and `--format ndjson` output. They used to replace your home folder's account name with `<user>`, so a script or agent could not open the worktree it had just made.

  * `unity cloud project link` and `unlink` aren't commands, because linking lives under `unity projects`. The error now says what to run instead, `unity projects link cloud` or `unity projects unlink cloud`, in the text and in the `--format json` message.

  * On Linux, `unity install` run with no `HOME` set now puts the Editor's desktop entry and icon in your account's home folder. It used to put them in a `.local/share` folder inside the folder you ran the command from.

  * Starting several apps at the same moment no longer leaves two auth brokers running, which could make sign-in requests fail.

  * `unity editors upgrade` now looks up newer releases for all your installed version lines at once. When the Unity Releases service doesn't answer, the command reports that after one request timeout (about 100 seconds) instead of one timeout per version line.

  * If `unity editor add` registers an editor but then can't read the installed editors back to list its modules, the error now says the editor was added and names the `unity editor module refresh` command to run, in your saved language. It used to print an internal note in English.

  * On Windows, a leftover lock from an earlier run is now cleared even when security software blocks the rename normally used to clear it. When folder permissions block it instead, the error now says the lock could not be created, which points you at those permissions.

  * A leftover lock that's a symbolic link, broken or not, no longer makes a command spin at full CPU, wait several minutes or fail. Like any other leftover lock it's held while it's fresh and cleared once it's stale, and its age is read from the link itself, whatever it points at.

  * A lock or write failure that the system gives no name, such as a disk error or a Windows sharing violation, now shows the system's code, such as `os error 32`, instead of the word `Uncategorized`. This covers `unity editors install-path --set`, `unity language --set`, and the reads and writes of `unity config`'s own store.

  * `unity vcs uvcs` commands and `unity projects clone` now recognize a Unity Version Control workspace whose selector names its repository with the short `rep` keyword, such as `rep "Game@acme@cloud"`. Before, they treated the project as not being in a workspace.

  * On Linux, retrying `unity install` after an Editor install ran out of disk space now reinstalls into the same folder, instead of adding a second copy in a folder named `<version>-x86_64` or `<version>-arm64`. Such a copy now shares its version's menu entry, removing an Editor removes every menu entry that still opened it, and an Editor whose program file is empty gets no menu entry.

  * On Windows, `unity doctor` no longer reports one Unity install twice when your `PATH` spells it two ways. An entry written with an 8.3 short name, such as `C:\PROGRA~1\Unity\Hub\Editor`, is now read as the same folder as `C:\Program Files\Unity\Hub\Editor`, and an entry that reaches a folder through a junction is read as the folder it ends at, however that junction's own target is written.

  * When `unity install` or `unity install-modules` can't download a file, the reason is now in your language: a server error, a lost connection, a timeout or a full disk reads as a translated sentence in the `--verbose` summary and in the `reason` of `--format json` and `--format ndjson` failures. The CLI log keeps the English.

  * On Windows, `unity templates` now packs with the `tar.exe` that ships in Windows' System32 folder even when Windows isn't installed in `C:\WINDOWS`, instead of the first `tar.exe` on your `PATH`, and plug-in installs no longer pick a different `tar.exe` when `SystemRoot` is changed.

  * On Windows, `unity collab jira server add`, `update` and `test` with `--key-from-stdin` now read a key with non-ASCII characters the way your console's input code page encodes it.

  * On Windows, when two registered projects share a name, `unity projects info` and `unity projects size` now name each one's parent folder in the list of matches.

  * `unity test --filter` no longer crashes on a regular expression it can't evaluate. Such a pattern now matches no tests, like any other pattern that can't be used.

  * A command no longer signs you out when Unity Hub or another `unity` command refreshed your sign-in at the same moment. You're signed out only when your sign-in has expired.

  * `unity editors upgrade` and `unity install` no longer offer you an Editor your license doesn't cover, such as an extended LTS build. `unity install 2021.3` now picks the newest patch your license covers.

  * `unity open` and `unity projects open` no longer start a second Editor on a project that's already open, which used to fail with `OPEN_EDITOR_EXITED`. They now report the open project with its Editor version and process id and exit 0; `--format json` and `--format ndjson` return `data.alreadyOpen: true` and `data.pid`.

  * `unity plugin install`, `unity plugin remove` and `unity plugin upgrade` now include `errors` and `warnings` in their `--format json` and `--format ndjson` output, as every other command does, so a script that reads them no longer finds them missing. When `install` or `upgrade` can't install a plug-in, that plug-in's row still reports it in `outcome`, and `errors` stays empty.

  * `unity analytics status` now says the one-ping-per-run telemetry is off when `UNITY_NO_CLI_INVOKED_TELEMETRY` is set. It used to always say the ping was on, even with that variable set, which was already stopping the ping itself.

  * `unity doctor --ci` runs its checks again on a machine with no licensing client installed, such as a fresh CI runner, instead of failing with "isn't supported with these options or in this environment". It downloads the licensing client when it needs one.

  * `unity open`, `unity projects open` and `unity context` report a Unity Hub or project file they can't read with one clear message, instead of an internal error.

  * `unity publish play` names a build folder it can't read, instead of printing an internal error.

  * `unity doctor` reads a `cli-log.json` saved as UTF-16 or UTF-32, and shows a log line it can't parse as written, instead of failing.

  * `unity license` and the floating-license checks of `unity install` and `unity uninstall` read a `services-config.json` that holds an invalid escaped character, instead of failing.

  * `unity auth` commands keep working when a sign-in saved by an older CLI version, or the CLI's saved settings, hold text they can't decode.

  * `unity projects upgrade` asks for confirmation on a terminal before it upgrades a project, and `unity projects require` asks before it installs a missing Editor. The upgrade question defaults to no and the install question to yes; `--yes` skips either.

  * `unity projects link vcs --rollback --delete-remote` asks before it deletes the remote repository, once the provider says the repository is empty. The answer defaults to no, and a no keeps the repository.

  * `unity vcs setup` asks which provider to use when you don't pass `--vcs`, with the one that's ready to use first.

  * `unity editors info` and `unity editors upgrade` report a clear error when Unity's release service sends an answer the CLI can't read, instead of an internal error.

  * `unity install --resume` skips a damaged entry in the paused downloads list instead of stopping with an internal error.

  * `unity editors add` and `unity editor add` report a clear error when the editor list can't be read or written, or when a relative path is given from a folder that no longer exists. `unity uninstall` with no version does the same for a folder that no longer exists.

  * Commands that find an installed Editor keep working when an Editor's `modules.json` or `metadata.hub.json`, or your saved settings, repeat a key or hold text they can't decode. The last value of a repeated key wins.

  * `unity editors add` and `--editor-path` on macOS reject an Editor whose signature check doesn't answer within 30 seconds, instead of waiting for it.

  * On macOS and Linux, `unity uninstall`, `unity editors prune --remove` and `unity editors upgrade --replace` stop before deleting anything when an Editor's folder holds a file marked immutable or append-only (`chflags uchg` on macOS, `chattr +i` or `+a` on Linux). They used to remove everything around that file, fail on it, and leave a half-removed Editor that was still listed.

  * `unity doctor --ci` runs on macOS and Windows, and with `--format github`. `unity doctor` reports an account database it can't open as a warning row instead of stopping, and `unity doctor` and `unity diagnose accelerator` report a working directory or a Unity Hub file they can't read with one clear message.

  * `unity diagnose proxy` runs on macOS when a proxy is configured.

  * `unity auth login` reports a sign-in service it can't reach as a failed sign-in, and `unity collab jira server` commands with `--key-from-stdin` check their other options before reading the key.

  * `unity open` opens a project whose `ProjectSettings.asset` it can't fully read, and `unity pipeline list-versions` reports a registry it can't reach.

  * `unity mcp configure --help` and the help of the `unity pipeline automation` and `unity pipeline cloud-build` commands work. `unity self-update` and `unity self-install` report an extra argument or an invalid option as a usage error.

  * `unity projects link vcs --vcs uvcs` and `unity vcs setup --vcs uvcs` on a terminal ask which Unity Version Control region to use the first time an organization uses it, and ask before they create billable resources (the answer defaults to no, and a no leaves nothing created). `unity projects link cloud` on a terminal asks whether to link the project that `UNITY_CLOUD_PROJECT` or the saved default names, or to create a new one.

  * On Linux and macOS, `unity uninstall`, `unity editors prune --remove` and `unity editors upgrade --replace` remove an Editor that you can't delete yourself, such as one installed with `sudo`. They ask for administrator rights once per Editor, and declining leaves it untouched.

  * With `UNITY_INSTALL_MISSING_TOOLS` set to `1`, `true` or `yes`, a command that needs Git LFS and can't find it installs it through your package manager, then goes on. On Linux that's one administrator prompt for `apt`, `dnf`, `pacman`, `zypper` or `apk`, which a run that's already root skips.

  * `unity collaboration` commands given a JSON value that repeats a key, such as `--camera '{"x":1,"x":2}'`, now name the option and the key instead of printing an internal error.

  * `unity projects create` on a terminal asks whether to link the new project to Unity Cloud, which Editor to use when the installed Editors span more than one release, and which Unity Version Control region to use the first time an organization uses it. The cloud-link, Editor and template questions aren't asked in scripts, with `--quiet` or with `--non-interactive`.

  * `unity projects create` and `unity projects new` work again when Unity Hub has a default projects folder saved and no `--path` is given (the project goes in that folder), and when the new project's path belongs to a registered project whose folder was deleted (the project is created and its entry updated).

  * `unity projects report` works again: it groups your registered projects by the Editor version each one needs, shows whether that Editor is installed and whether its stream is LTS, lists projects with no readable `ProjectVersion.txt`, and counts installed Editors no project needs, in every output format.

  * `unity projects verify` works again: it checks a project for missing or orphaned meta files, duplicate GUIDs, conflict markers and an invalid package manifest without launching the Editor, and exits with a non-zero code when it finds an error. Pass `--check` to run only some checks, `--expect-editor <version>` to flag an Editor version drift, and `--strict` to treat warnings as errors.

  * `unity projects clone --vcs github|gitlab`, `unity projects link vcs`, `unity vcs setup` and `unity vcs sync` now work with a repository, namespace or branch whose name has a non-ASCII character, a space or a percent sign, and with a git remote whose address has non-ASCII characters, instead of stopping with an unsupported-state error.

  * `unity projects clone`, `unity projects link vcs`, `unity vcs setup` and `unity vcs sync` now pass the proxy the CLI resolved (`--proxy`, `--proxy-disable`, the proxy variables, the saved proxy setting, or the system proxy) to git, for the clone, the push, the pull and the Git LFS transfer, instead of stopping with an unsupported-state error when a proxy is configured. A proxy with a user name and password is handed to git through its environment, never on its command line, and is never written to the repository's config.

  * `unity vcs sync --verify` works again: after the pull it checks the project for missing or orphaned meta files, duplicate GUIDs, conflict markers and an invalid package manifest, and reports the error and warning counts.

  * `unity vcs` commands run from a folder that no longer exists now say `Unable to read the current directory.` and ask you to change to one that exists, instead of printing a raw system error. Most of them still run when you pass an absolute project path, since that path doesn't depend on the current folder.

  * `unity install`, `unity install-modules` and the installs that `unity run`, `unity test` and `unity projects require` start work on Windows again. When the install needs administrator rights, Windows asks for permission once, before the download starts.

  * `unity modules list` and `unity install --list-modules` work on Windows again, and show whether Visual Studio is installed.

  * `unity install 6000.0.11f1` no longer fails with a checksum mismatch.

  * `unity install-modules` and `unity editor module add` no longer fail with a checksum mismatch when Unity corrected a module's release data after the Editor was installed, as for Windows Build Support (Mono) on 6000.5.3f1. When a module doesn't match the checksum saved with the Editor, the CLI checks it against the current release data before giving up.

  * `unity projects create --vcs uvcs` and `unity projects link vcs` no longer fail the project's first Unity Version Control check-in when an open Unity Editor puts some of the project's files under version control first. The CLI now adds only the files still waiting to be added and checks the project in, as Unity Hub does.

  * `unity docs toc` and topic lookup in `unity docs` work again after docs.unity.com started listing an empty sitemap, instead of failing with `DOCS_TOC_INVALID`.

  * `unity projects add`, `projects clone`, `projects create --vcs` and `projects link vcs` now record a GitLab project in a subgroup by its whole path, as Unity Hub does: `gitlab.com/group/sub/game` is organization `group`, repository `sub/game`. They used to record repository `sub`.

  * `unity cloud org list`, `unity cloud project list`, their `current`, `clear-default` and `set-default` commands, and `unity auth status` now end `--format ndjson` output with a `{"type":"result"}` frame, including when you're signed out or the request fails, instead of writing nothing or plain text to stdout. The `list` commands write their rows first, then that frame with the row count.

  * `unity pipeline list-versions --format ndjson` now ends its rows with one `{"type":"result"}` frame whose `data` holds the row count, which `--quiet` keeps.

  * `unity pipeline list`, `unity build --list-profiles` and `unity build --list-targets` now end `--format ndjson` with one `{"type":"result"}` frame whose `data` holds the row count, which `--quiet` keeps. `unity changelog` and `unity diagnose accelerator` answer `--format ndjson` with that frame alone, its `data` matching `--format json`, instead of plain text.

  * `unity version`, `unity --version`, `unity language`, `unity analytics`, `unity config proxy`, `unity config accelerator` and `unity cache` now answer `--format ndjson` with one `{"type":"result"}` frame whose `data` matches `--format json`, instead of a bare object or plain text. `unity env` writes its rows and then that frame with the row count, which `--quiet` keeps.

  * `unity plugin install` and `unity plugin upgrade` now list each plug-in they can't install in the envelope's `errors`, with a code such as `PLUGIN_UNSUPPORTED_PLATFORM` and the same sentence the terminal shows, instead of failing with an empty `errors`.

  * An invalid `--format` or `UNITY_FORMAT` value now produces the `INVALID_COMMAND_ARGS` envelope when the command also asks for JSON (`--json`, or a valid `UNITY_FORMAT` behind an invalid `--format`), instead of plain text on stderr.

  * `unity doctor --tail` with an invalid value now produces the `INVALID_COMMAND_ARGS` envelope under `--format json` and `--format ndjson`, exiting `2` like other invalid option values.

  * `unity changelog --format json` now says why it failed when no release notes are published for the version: `errors` carries one entry with the code `CHANGELOG_NOT_FOUND` and the same message the other formats print. A download that fails still reports its own code, `ERR_NETWORK` or `COMMAND_FAILED`, so a script can tell the two apart.

  * An unknown command, subcommand or option is now reported in the language set with `unity language --set`, together with the hint lines that follow it. English output is unchanged.

  * `unity help <command> --help` now prints the command's help, as `unity help <command>` does, instead of failing with `unknown command 'help'`.

  * `unity build run` no longer hangs when the build it would launch is a named pipe: it reports that the path isn't a build, as for any file that's not one. A `Library/UnityCli/last-build.json` that repeats a key now reads as no previous build, with the hint to run `unity build`, instead of an internal error.

  * `unity collab` now checks local files before it sends a request: an upload from a pipe, a device or a file you can't read, or a download or export whose folder doesn't exist or that names a folder, fails at once with a message naming the path, instead of hanging or failing after the request. A Unity Cloud address in your settings that's not an http or https URL is named in the error too.

  * On Windows, if `unity editor add` or `unity editor module refresh` registers an Editor through the administrator prompt but then can't save the Editor list, the error now reads in your saved language. The OS reason in parentheses stays as Windows words it.

  * A command group run on its own with `--json`, such as `unity cache --json`, now prints its subcommands as JSON instead of the help text: the group's name and description and, under `data.subcommands`, each subcommand's name, aliases, description and whether it's a group itself. `--format ndjson` prints the same as one result line.

  * Command help no longer shows a placeholder default for `--architecture`: the `(default: "unknown")` note is gone, since leaving the option out uses this computer's architecture. `unity command --help` shows `--timeout` as `(default: 30)` instead of `(default: "30")`, and no longer lists the analytics-only `--caller` and `--skill` options, which still work.

  * A Plastic install or upgrade that verifies the download against Plastic's published checksum file no longer fails when that file is served through a redirect.

  * `unity plugin changelog --format json` and `unity self-update --changelog --format json` now say why they failed when no release notes are published: `errors` carries one entry with the code `CHANGELOG_NOT_FOUND` and the message the other formats print. `unity self-update --changelog` also exits 6 in that case instead of 0, in every format.

  * `unity mcp` now says why no Editor tools are listed when it can't find or reach a Unity Editor with the Pipeline package. Your MCP client lists one `unity-cli-status` tool whose description gives the reason, and calling it checks again.

  * `unity assets inspect` and `unity assets import` given an extra argument, and `unity pipeline list` given any argument, now print a usage error and exit 2 instead of failing with an unsupported-state error and exit 1.

  * `unity vcs resolve` and `unity vcs merge-setup` on Windows find `UnityYAMLMerge.exe` in the Editor's `Data\Tools` folder. Before, they looked for a file with no `.exe` and always reported the tool as missing.

  * `unity vcs merge-setup`, `unity vcs git worktree add` and `unity vcs git worktree remove` now run on Windows. Before, they stopped with a message that the command isn't supported in this environment.

  * `unity vcs git worktree add --install-editor` installs the Editor the new worktree needs, after asking, instead of refusing to run. `unity run --command <name> --allow-install` installs a missing Editor before it runs the command.

  * `unity projects clone` and `unity projects link vcs` accept a repository URL with an IPv4 host (`https://10.0.0.5/team/game.git`) and a path that holds `+`, `@`, `,`, a `%20`-style escape, a query or a fragment. Before, each was refused as unsupported.

  * `unity projects clone` into a folder that holds a project you already registered, such as one whose files you deleted, now clones instead of stopping with "isn't supported with these options or in this environment". When the clone lands exactly on a registered project, its existing entry is updated.

  * `unity pipeline install` and `unity pipeline upgrade` now explain a failure they were unable to handle before. Offline, they name the registry host they can't reach and how to set a proxy.

  * `unity mcp configure` and `unity bug mcp` now explain why they stop when a client config is a symlink, or when the config can't be read or isn't valid JSON, instead of refusing with a generic "isn't supported" error. The message names the path, and nothing is written.

  * A damaged settings file no longer turns usage data off for every run or blocks saving your usage data choice. The CLI keeps a copy of the damaged file and starts a fresh one, and restores the file from the backup an interrupted repair left behind.

  * `unity doctor --ci` runs on Linux arm64 machines that start the licensing client through FEX-Emu, instead of failing with "isn't supported with these options or in this environment". It prints the FEX-Emu notice the other commands print.

  * On Windows, `unity build` and `unity collab` accept projects and paths on a network share (`\\server\share\...`) or spelled as device paths (`\\?\C:\...`), instead of refusing them.

  * On Windows, `unity uninstall`, `unity editors prune --remove` and `unity editors upgrade --replace` now name the Editor folder whose files are in use and ask you to close the Unity Editor and any other app using it, instead of reporting that the removal isn't supported. A file that antivirus or indexing software holds for a moment no longer refuses the command.

  * `unity install` and the module commands, `unity templates list` and `unity releases` now say when your account can't read the Unity Editor install folder, and name that folder, instead of reporting unreadable Hub data or an unsupported state.

  * `unity uninstall` and `unity editors prune --remove` now say an Editor can't be safely uninstalled when its folder is a link or a file, and leave it in place, instead of reporting that the removal isn't supported.

  * `unity editors` commands that can't finish because the machine changed mid-run now show the standard translated "isn't supported" message instead of an English-only one.

  * The background update check now refreshes its cache for users behind a proxy, so the "new version available" notice no longer goes stale there.

  * `unity doctor` no longer lists a .NET runtime and NuGet packages among its open-source components, since the CLI ships neither.

  * `unity diagnose proxy` reports that it can't read the proxy settings, instead of crashing, when `proxy.json` changes while the command starts.

  * Editor commands run from inside a project reach that project's Multiplayer Play Mode clone when the main Editor is closed, instead of reporting that no Editor is open for the project.

  * A `unity pipeline automation` or `unity pipeline cloud-build` command run with `--cloud-org` and no value now names the option `--cloud-org <id-or-name>` in its error, as its help does, since an organization name works there as well as an id.

  * The install script's closing hint on macOS reads `source ~/.zshrc` again, instead of `source \~/.zshrc`, which failed when pasted into a terminal.

  * The install script's env-file hint now reads `. "$HOME/.unity/env"`, which works when pasted. It printed a quoted `~` path, which the shell doesn't expand.

  * Switching accounts with `unity auth switch` while another command is renewing your sign-in no longer saves that sign-in under the account you switched to. If the account is removed or signed out while its sign-in renews, the command now asks you to sign in again.

  * On zsh, `unity self-install` now adds the CLI to your PATH in `.zshenv`, so `unity` is found in non-interactive shells such as the ones coding agents use, not only in a terminal window.

  * New shells no longer print `no such file or directory: .../.unity/env` after `unity self-uninstall`.

  * `unity vcs blame`, `vcs diff`, `vcs explain`, `vcs resolve` and `vcs summarize` given an empty path now say that no path was given and exit with code 2 (error code `VCS_PATH_EMPTY`). They used to report that the command isn't supported with these options.

  * `unity vcs setup` and `unity projects link vcs`, when adopting a repository while Unity Hub's `projects-v1.json` holds no project list, now say the project list is damaged and how to fix it, instead of a generic error. Nothing in the repository changes.

  * `unity projects add`, `remove`, `pin` and `unpin`, when Unity Hub's `projects-v1.json` holds no project list, now say the project list is damaged and how to fix it (`PROJECT_REGISTRY_MALFORMED`, exit 6), instead of a generic unsupported-state error. Your project list isn't changed.

  * `unity projects create` and `unity projects new` refresh your sign-in before they start the Editor. Before, an expired session made the Editor's package downloads fail with "You are not signed in", even though `unity status` showed you signed in.

  * On Windows, `unity hub install` works when the temporary folder path contains a typographic apostrophe, such as a profile named O’Brien.

  * `unity templates delete` no longer removes the whole folder the template's archive sits in. It now deletes the archive, its preview images and, once no other archive in that folder uses it, the template's `package.json`, and removes the folder only when it's a per-template folder inside the templates folder that holds nothing else.

  * `unity mcp` no longer returns a screenshot of every display when a capture tool can't reach the Editor, for example while a dialog is open. It now reports that the Editor could not be captured.

  * Inside a project you pinned to an account with `unity auth default <account>`, cloud, collaboration, pipeline, and version-control commands now act as that account, the one `unity auth status` shows, instead of your active account.

  * `unity auth logout` now always clears your session on this machine, and a session refreshed while you sign out no longer comes back afterward.

  * `unity license server list` no longer passes terminal control sequences in the configured server address through to your terminal.

  * `unity self-update` no longer installs an older version on its own. When the channel's latest version is lower than the one you run, it reports that and changes nothing (exit 1), even with `--yes`, piped output or `--format json`.

  * `unity mcp --tools` and `--exclude-tools` now match a command under every name it answers to, so excluding `test.run` or its older flat name hides `test run` and refuses a call under any of those names. Write a grouped command with a dot, such as `test.run`.

  * A project's `m_EditorVersion` is now accepted only when the whole value is a Unity version, and the `unity install ...` commands that `unity open`, `unity doctor ci` and `unity editors verify` suggest now quote the version.

  * The anonymous usage ping the first-run analytics prompt describes now actually sends: one event per run with the CLI version, the kind of caller, whether it looks like CI, whether it ran interactively, and the project's Unity version. It carries no account, device or project identity, and no IP address.

  * A `unity` plug-in now gets the account the CLI is signed in to, instead of the account the Unity Hub app last signed in to. With two Unity IDs on one machine, a plug-in's calls could go out as the other account and be refused for a missing seat.

  * On macOS, hosts on the system proxy bypass list ("Bypass proxy settings for these Hosts & Domains" and "Exclude simple hostnames") now connect directly when a manual proxy is set, instead of going through the proxy.

* **Deprecated**

  * Old option spellings the CLI still accepts now print a warning naming the one to use: `status --project` (use `--project-path`), `install --list-components` (`--list-modules`), `--childModules`, `--no-childModules` and `--install-dir` on `install` and `install-modules` (`--child-modules`, `--no-child-modules`, `--download-directory`), `--template-version`, `--hub-version` and `--package-version` (`--version`), and `-a` on `projects list` and `projects size` (`--all`). In `--format json` the warning is in the envelope's `warnings`.

  * `--organization-id` and `--project-id` on `unity collaboration` still work, and print a warning naming `--cloud-org` or `--cloud-project`. In `--format json` the warning is in the envelope's `warnings`.

  * `--since` on `vcs git migrate-lfs` and `releases` still works, and prints a warning naming `--after` or `--from-year`. In `--format json` the warning is in the envelope's `warnings`.

  * `--verbose` on `editors` and `projects list` still shows every column, and also prints the full error details on a failure as on every command. It now warns that `--long` is the spelling for the columns.

  * The `modules` string in the `--json` and `--format ndjson` rows of `unity editors` is deprecated and will be removed in a later beta. Read `moduleNames` instead, since a module name can contain a comma.

  * The `project` and `version` keys in the `--json` and `--format ndjson` rows of `unity status`, and the `unityVersion` key in those of `unity editors running`, are deprecated and will be removed in a later beta. Read `projectPath` and `editorVersion` instead.

## 1.0.0-beta.13

**Release date:** October 07, 2026

* **Security**

  * `unity install` with `--changeset`, and `unity editors add` and `unity editor module refresh` when they read an Editor's build from the download server, now refuse a changeset that is not letters and digits, and a manifest file name from the server that is not a plain file name. Both went into the download address unchecked, so a value with `/`, `?` or `..` could point the request somewhere else.

  * A development-only setting that relaxes the peer code-signature check no longer weakens your real sign-in: a broker started that way runs as a separate dev broker with its own address and its own sign-in, never reads yours, and on macOS and Windows refuses Unity-signed applications. It is meant only for apps you build yourself, which sign in from the app that uses it, since `unity auth login` signs in your normal sign-in.

  * The CLI now checks that the sign-in service it talks to is genuine Unity software and that it checks the apps that connect to it. If the check fails, commands that need your sign-in stop with an error, and `unity build`, `unity run`, `unity test` and `unity open` start the Editor signed out with a warning; run with `UNITY_NO_AUTH_BROKER=1` to read your saved sign-in directly.

  * When `unity projects create`, `unity projects link vcs` or `unity vcs setup` looks up your GitLab groups for `--git-namespace`, it now follows further pages of results only on GitLab itself, so your token isn't sent to another host. The lookup also stops after 100 pages of groups.

  * When `unity auth login` sends your service account credentials or finishes a browser sign-in and the server redirects the request to another host, the CLI no longer follows the redirect. It stops and reports the request as failed, so your credentials and the sign-in request body are not sent on to that host.

  * `unity build`, `unity run` and `unity test` no longer print your Unity access token. The Editor writes its full command line into its log, including the `-accessToken` value the CLI passes it, and the CLI streamed that log to your terminal or CI output.

  * On Linux, verifying a connecting peer's identity (for the auth broker's enforced peer-allowlist mode, and for the hardened tier's consent cache) now confirms the peer process is still alive before trusting what was read about it. On a shared Linux host, a narrow race let another local process grab a just-exited peer's process id before the identity check finished reading it, which could make that unrelated process pass the check instead of the one that actually connected.

  * When `unity projects clone`, `unity projects create`, `unity projects link vcs` or `unity vcs setup` calls GitLab with your token and GitLab redirects the request to another host, the CLI no longer sends the token on to that host.

  * A repository URL whose password contains `@` no longer shows part of that password. When `unity projects clone`, `unity projects link vcs`, `unity vcs setup` or a git error printed such a URL, it removed only the text up to the first `@`, so the rest of the password stayed visible.

  * Before installation, `unity install` and `unity install-modules` check whether they can write to the destination folder by creating and removing a test file there. That file now has an unpredictable name and is never created through a link someone else placed in the folder, and a file that was already there is left alone.

  * A quoted credential value in the Editor's log is now masked in full. A line such as `-password "two words"` used to show as `-password "*** words"`, printing everything after the first space.

  * On Linux, the auth broker's check for a debugger or tracer attached to a connecting process can no longer be misled by that process's name.

* **Added**

  * `unity mcp` now reads `UNITY_PROJECT_PATH` when you don't pass `--project-path`, as `unity command`, `list`, `job`, and `status` already do. Set it once per worktree or agent session and the MCP server talks to that project's Editor, not whichever Editor the client's working directory happens to sit in.

  * `unity setup codex` and `unity setup grok` install Unity's agent plugin, with its Unity skills, into Codex and Grok Build in one step, as `unity setup claude` does for Claude Code. Each runs the agent's own plugin commands for you and reports the plugin's version and where its skills are.

* **Changed**

  * On a Mac with Apple silicon running macOS 28 or later, `unity releases` no longer lists Intel (x86\_64) Editor builds, which can't run without Rosetta 2. Earlier macOS versions still list both, as `unity install` and `unity editors upgrade` already did.

  * `unity projects upgrade` into Unity 6.7 or later now needs a Unity Cloud choice when the project isn't linked: `--cloud` links it to a new Unity Cloud project, `--cloud-project <id-or-name>` links an existing one, and `--no-cloud` upgrades without linking. Without one, the upgrade stops before it installs or opens anything.

  * `unity open` and `unity projects open` no longer move a project onto Unity 6.7 or later. If the Editor you pick, with `--editor-version`, with `--editor-path` or at the missing-Editor prompt, is 6.7 or later and the project was saved with an older version, the command stops with `PROJECT_UPGRADE_REQUIRED` before installing or launching anything.

* **Fixed**

  * `unity config set proxyRequestLogging true` now works. The setting was already read by `--log-proxy`'s persisted tier, but `unity config` had no way to actually set it, so `config set proxyRequestLogging true` failed with an unknown-key error.

  * `unity serve`'s session no longer exits with an error when the host writes a line that parses as JSON but isn't a request object (an array, a bare number, `null`, or a `method` that isn't a string). That line is now dropped silently instead of crashing the whole session.

  * `unity serve` now answers a request line that contains an escaped unpaired surrogate, such as `\uD800`, with a parse error. Before, such a line could go unanswered, or end the whole session with an error.

  * On Windows, a console Ctrl-C during a `unity license` command that had just started the Unity Licensing Client no longer also stops the client. The client is a user-level service that is supposed to outlive the CLI; it now leads its own process group, so it is excluded from the console's Ctrl-C delivery, matching the behavior already in place on macOS and Linux.

  * `unity projects create` and `unity pipeline install` now show two messages in your language instead of English: the one saying the Unity registry lists no published version of the Pipeline package, and the one saying Unity Cloud returned no project when a cloud project was created.

  * `unity status` now tells you when a dialog open in the Unity Editor is blocking it, such as a save prompt. The Editor still reads `starting`, with a line naming the dialog, and the error is `STATUS_BLOCKED_BY_DIALOG` instead of `STATUS_NOT_READY`; `--format json` adds a `blockedBy` field with the dialog's level and title.

  * A project whose build settings file in `Library/` is malformed in a deeply nested way no longer crashes the `unity projects` commands that read it. The file is treated like any other unreadable build settings file: the project keeps the build target it last had, or shows none if it never had one.

  * On macOS, `unity templates create` no longer adds hidden `._*` entries to the template archive for files that carry extended attributes, such as downloaded or Finder-tagged files. Archives created on macOS now match the ones created on Windows and Linux.

  * `unity templates` commands and `unity projects create --template` no longer hang when a named pipe or a device sits where a template file is expected, such as a template archive, a `package.json` in your templates folder or `--output` for `unity templates pack`. Such a file is now treated as unreadable, and `unity templates pack --output <pipe> --overwrite` fails with "Operation not permitted".

  * When the CLI can't save your sign-in because it can't write to its credential folder, the warning it records in `cli-log.json` is now filed under `SealedCredentialStore` rather than `AuthBroker`, and a folder the CLI isn't allowed to write to is named `UnauthorizedAccessException` rather than `IOException`. Only the log line changes; signing in behaves as before.

  * `unity mcp` screenshots (`capture_game_view` and `capture_scene_view`) no longer try to close a display library that failed to load. On a machine where the display library can't be loaded, such as Linux without `libX11`, the capture now just reports that it couldn't load it.

  * `unity command run_tests --async_tests true` no longer shows a misleading "0/0 passed" in TSV and other table output the instant an async PlayMode or EditMode run starts. It now shows the server's own message telling you to poll `test_status` for the real result.

  * When `unity projects link vcs` refuses a URL combined with repository or cloud options, the error now names `--coppa` too. In languages other than English it also names `--git-description`, which the translated message left out.

  * On Windows, the CLI now installs the licensing client from Git Bash too. With Git for Windows on `PATH`, `unity license` and the other commands that download the licensing client failed with `tar: Cannot connect to C: resolve failed` and left it uninstalled.

  * `unity cloud org create` works again: it failed with a 404 for every request. It now asks for the same company profile as the Unity Dashboard, which replaced the industry field: pass `--first-name` and `--last-name` for an individual or `--company-name` for a company, plus `--country`, and `--region` for organizations in the US, Canada, and Mexico.

  * `unity auth logout` now accepts `-y` and `--yes`, which its help has always listed. Signing out never asks for confirmation, so the flag changes nothing; it no longer fails as an unknown option.

  * When `unity install` or `unity install-modules` fails with `--format json`, the output now lists which modules failed and why in `data.failedUids` and `data.failures`, as `--format ndjson` already did. Before, `data` was `null` and the only error said how many items failed.

  * The warning you get when only one of `UNITY_SERVICE_ACCOUNT_ID` and `UNITY_SERVICE_ACCOUNT_SECRET` is set now appears in your CLI language. It used to print in English in every language, saying that service-account sign-in won't activate and which variable to set or unset.

  * `unity editors module remove` now shows its refusals in your display language. They used to print in English regardless of your selected language.

  * A corrupt template archive whose header claims gigabytes of data no longer crashes `unity templates list` and the other commands that read your templates, or makes them set that much memory aside first. The archive is skipped like any other unreadable one.

  * `unity editors module` (also `unity editor module`) now says what to pass when several installed Editors match your version: the full version when they are different patches, or `--architecture` when one version is installed for several architectures. It used to say "No editor found", including when `--architecture` still left several patches.

  * `unity editors module` now honors `-a` and `--architecture`, as `unity editor module` does. It used to ignore the value, so a version installed for several architectures could not be chosen there.

  * `unity editors install-path --set` now says another program is using the setting, and that the install path was not changed, when a leftover lock from an earlier run could not be cleared. It used to say the lock file could not be created and send you to check folder permissions.

  * `unity install-modules --non-interactive` now tells you what to pass when several installed Editors match your `--editor-version`: the full version when they are different patches, or `--architecture` when one version is installed for several architectures. A version that exactly matches an installed Editor now wins over a longer one that contains it, such as `6000.3.0a1` beside `6000.3.0a12`.

  * `unity uninstall`, `unity editors verify` and `unity editors path` now pick the installed Editor whose version exactly matches the version you pass, so `6000.3.0a1` selects that Editor instead of being ambiguous with `6000.3.0a12`. A partial version still matches every installed Editor that contains it, and `--architecture` now picks only among the exact version's installs, so it no longer swaps in `6000.3.0a12`.

  * `unity open` and `unity projects open` now say what to pass, in your display language, when they install an Editor for you and then find several installed Editors that match. That is the full version when they are different patches, or `--architecture` when one version is installed for several architectures.

  * In every language except English, `unity self-update` on Windows no longer tells you to close other running `unity` processes after it stages an update or a rollback. A failed binary replacement in `unity self-install` now suggests checking for software that holds the file open, such as antivirus.

  * On Windows, the cross-process install lock of an install that has exited no longer holds up `unity install`, `unity install-modules` or `unity projects require` while another program still has that process open. Once the lock goes stale, the CLI takes it over instead of waiting, or instead of exiting `9` with `INSTALL_LOCK_BUSY` under `--no-wait`.

  * `unity open` and `unity projects open` now say what to pass when several installed Editors match and nothing can ask you, such as under `--non-interactive`: the full version for different patches, or `--architecture` for one version installed for several architectures. They used to name `--architecture` every time, which can't separate two patches of one architecture.

  * `unity open` and `unity projects open` now use `-a` and `--architecture` to choose between the installs that a partial `--editor-version` matches. With `6000.0.32f1` installed for both arm64 and x86\_64, `unity open --editor-version 6000.0 -a arm64` opens the arm64 Editor.

  * `unity projects create` and `unity projects new` now use `-a` and `--architecture` to choose between the installs that a partial `--editor-version` matches. With `6000.0.32f1` installed for both arm64 and x86\_64, `unity projects new MyGame --editor-version 6000.0 -a arm64` creates the project with the arm64 Editor.

  * If two installs of one Editor version have architectures the CLI can't read, the error from the commands that pick an Editor, such as `unity run`, `unity build` and `unity install-modules`, now points to `unity editors list --installed --verbose` to find the incomplete install. It used to suggest `unity editors verify`, which refused both installs.

  * On macOS and Linux, `unity uninstall` now asks for your administrator password when the Editor sits in a folder you can't write to, such as `/opt` or `/Applications`, instead of failing with "The Editor … could not be uninstalled." If the removal still fails, the error code is now `UNINSTALL_FAILED`.

  * `unity uninstall`, `unity editors prune --remove` and `unity editors upgrade --replace` now say in your CLI language that an Editor could not be uninstalled, when the removal fails for a reason the CLI can't name. The message printed in English regardless of your selected language.

  * `unity projects import` now shows its warning for an entry with no usable path, and its error for more than 50 MB on stdin, in your display language. Both printed in English regardless of your selected language.

  * `unity projects import` now stops reading piped input as soon as it passes the 50 MB limit and fails with the same error. It used to read the whole stream into memory before checking the size, so a very large or endless pipe could use up memory or never finish.

  * Commands that change your project list, such as `unity projects add`, `pin` and `import`, no longer fail, or save the change where Unity Hub doesn't look, when Unity Hub or another `unity` command is creating that list at the same moment. This could happen on a new installation when both start together on a busy machine.

  * If git refuses a `unity vcs sync` pull, the error no longer lists git's download progress (`Counting objects`, `Receiving objects`), so git's explanation (the diverged branch, the conflicted files, or the untracked file in the way) is easier to find.

  * If the CLI ends a git command that made no progress, the error now names the command, such as `git clone`, `git pull` or `git push`. It used to name the first setting the CLI passes to git, such as the proxy address or the credential helper config, so a stalled `unity projects clone` or `unity vcs sync` pointed at the wrong thing.

  * `unity config proxy <url>` and `unity config proxy --unset` now protect the shared proxy settings file the way the other shared files already were. When the file can't be read or lists the same name twice, the change is refused with the same error the other settings files give, and the file stays as it was.

  * `unity templates delete` and `unity templates edit` now print their "Path doesn't exist" error in your display language, and its grammar is fixed (previously it read "doesn't exists"). It appears only if the templates folder disappears while the command runs.

  * `unity cache clean` now explains in your CLI language why it refuses to clean a cache folder that is a symbolic link. The message printed in English regardless of your selected language.

  * `unity command`, `unity list` and the other commands that connect to a running Editor now tell you in your CLI language when no Editor is available to them, and when a `--project-path` isn't a Unity project. These errors printed in English regardless of your selected language.

  * `unity status --project-path` no longer matches a sibling project whose path starts with the one you named, so `unity status --until-ready --project-path /x/MyGame` no longer ends on an Editor open on `/x/MyGame-lighting`. A value that is an existing directory now matches that project only, so a parent folder no longer matches the projects inside it (run `unity status` without the flag to list them all).

  * On Windows, sign-in now refuses to talk to the shared authentication process's communication channel if it's owned by a different local account than yours. On a shared or multi-user Windows machine, this closes a narrow window where another account could stand up a channel under the same name before yours starts and have the CLI unknowingly connect to it; your own sign-in session is never affected.

  * `unity pipeline install` and `unity pipeline upgrade` now show their two target errors in your CLI language: a `--project-path` that isn't a Unity project, and a run from a folder that isn't one when no Editor is open. Both printed in English regardless of your selected language.

  * `unity build --format json` now writes exactly one JSON document to stdout, so you can parse it whole. The progress lines and the streamed Editor log used to come first; they now go to stderr.

  * `unity install-modules --force` no longer hangs on Windows for the full install timeout when reinstalling over an already-installed module. A stuck antivirus file scan could make the reinstall wait retry itself forever; it's now bounded and retried automatically instead.

  * `unity build` now shows its `--args` errors in your CLI language: a forwarded flag that the command already sets itself, such as `-projectPath`, and a quote that is never closed. Both printed in English regardless of your selected language.

  * On macOS, `unity` no longer crashes partway through a command when a program that handles signals itself, such as `gh` or another tool written in Go, starts it. Commands that read a lot of data were affected, such as `unity vcs diff` on a large scene, and so was the auth broker the CLI starts in the background.

  * On macOS, the Unity Licensing Client that `unity` starts no longer crashes when another program sends it a `SIGUSR1` signal. The CLI no longer passes a leftover signal setting to the programs it starts.

  * Help for some options no longer shows their default twice. `unity releases --help`, for example, listed `--limit` with `(default: 20) (default: 20)`, and `unity build`, `unity command`, `unity doctor` and `unity logs` repeated a default the same way.

  * `unity mcp configure` now writes a project-local config when you run it from a drive or filesystem root, such as `C:\` or `/`. It used to refuse the write.

  * On Windows, the warning that an update didn't finish installing now appears in your CLI language, the one you set with `unity language`, instead of always in English. It stays in English when no language is saved.
