---
title: Unity CLI release notes for November 2026
product: Unity command-line interface (CLI)
canonical: https://docs.unity.com/en-us/unity-cli/release-notes/2026/november
last_updated: 2026-11-13
generated_at: 2026-11-13T21:46:35.670Z
locale: en-us
---

# Unity CLI release notes for November 2026

> Learn about the Unity CLI releases in November 2026.

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

## 1.0.0

**Release date:** November 12, 2026

* **Security**

  * Each release now publishes `SHA256SUMS.asc`, a GPG signature over `SHA256SUMS` by the Unity Technologies ApS key, so you can verify a download with `gpg --verify SHA256SUMS.asc SHA256SUMS`.

  * `unity vcs blame` no longer prints terminal escape sequences from a commit author name or an object name in the table and tsv output. A crafted author name could move the cursor or retitle the terminal.

  * Sign-in no longer falls back to storing your tokens in a plain file when the system credential store (the macOS Keychain, Windows Credential Manager, or the Linux Secret Service and kernel keyring) is unavailable. To keep using the file, sign in with `unity auth login --insecure-storage`, as `gh auth login --insecure-storage` works.

* **Added**

  * `unity vcs uvcs review create` opens a code review of a changeset or a branch, `review reviewers` lists who was asked to review and where each stands, and `review request` asks more people. They work on Unity Cloud and self-hosted servers through the local `cm` client (11.0.16.10512 or later).

  * `unity vcs uvcs review` lists, reads, answers and resolves code review comments on self-hosted Unity Version Control servers, through the local `cm` client and with no Unity sign-in (`cm` 11.0.16.10616 or later; listing reviews works from 11.0.16.10512).

  * `unity plugin install <id>` installs a Unity tool published after your CLI version, and `unity <id>` runs it, with no CLI update. Such a tool downloads only from Unity's CLI plugin CDN and is checksum-verified, like every plugin.

  * `unity command <name> --help` prints that Editor command's usage and parameters, read from the connected Editor. A group name alone lists the group's commands.

  * Tab completion after `unity command` offers the connected Editor's commands and the chosen command's parameters, in every shell and in `unity shell`. Regenerate your completion script with `unity completion <shell>` to get it.

  * `unity commands --include-editor` adds the connected Editor's commands to the manifest, each marked `"source": "editor"`.

  * `unity mcp --exclude-annotations <list>` hides the Editor commands whose MCP annotations include any of `read-only`, `destructive`, `idempotent` or `open-world`, and refuses a call to one. For example, `--exclude-annotations destructive` keeps an agent from deleting assets or running C# in the Editor.

  * `unity mcp --exclude-tool-groups <list>` hides whole Editor command groups, every command in them, and refuses a call to any of them. For example, `--exclude-tool-groups "scene,editor.*"` hides the scene and Editor commands.

  * `unity mcp --tool-groups` lists one tool per Editor command group instead of one per command, so a full Editor catalog fits under the tool limits of clients such as VS Code, Cursor and Windsurf, and takes less of the agent's context. A group tool takes the command's name in `command` and its parameters in `args`, and its description lists every command's parameters.

  * `UGS_CLI_TELEMETRY_DISABLED` turns off the CLI's usage data and anonymous telemetry ping, the same way `DO_NOT_TRACK` does. Any value but empty, `0` or `false` counts.

  * A command group can now hand a subcommand it does not have to a `unity-<group>` plugin on your `PATH`, the way `unity <name>` runs `unity-<name>`. The plugin gets the arguments from that subcommand on, and the group's own subcommands always come first.

  * `unity close --if-saved` refuses to close an Editor that has unsaved scenes and lists them. Without it, `unity close` still quits without saving, and now names the unsaved work it discarded.

  * `unity open` warns when `HUB_ENV=development` makes it start the Editor against the staging cloud environment, and names `--cloudEnvironment production` to use production.

  * `unity command --help` shows `unity command editor dialog`, and says it needs an Editor that serves its own endpoint.

  * `unity editor add --skip-signature-check` registers an unsigned development build, such as a locally built trunk Editor, the same way `unity editors add --skip-signature-check` does.

  * `unity auth login --insecure-storage` saves your sign-in to a plain file when no system credential store is available.

  * `unity pipeline automation apps actions create <app-id> <version> --file <path>` adds an action to a draft version of a Pipeline Automation app, from a JSON file whose name and description `--name` and `--description` override.

  * `unity pipeline automation pipelines create` creates a Pipeline Automation pipeline and its first version, from a JSON file holding its steps and parameters whose name, description, version and tags `--name`, `--description`, `--version` and `--tag` override. A saved pipeline version works as the file.

* **Changed**

  * `unity pipeline cloud-build builds timeline` now works on production, resolving the organization and project like `builds get`, instead of stopping with `AUTOMATION_COMMAND_STAGING_ONLY`.

  * The winget package now carries stable releases only. On the beta channel, when Windows can't apply an update, `unity upgrade` now gives the beta App Installer link to install by hand instead of suggesting winget.

  * Options that write output now follow one rule: `-o, --output` names a file and `--output-dir` names a directory. `build --output-path` is now `build --output`, `collaboration annotations export`, `attachments download` and `thumbnail download` take `-o, --output`, and `test` and `templates pack` gain `-o`.

  * `unity collab` commands accept a Unity Cloud project or organization name as well as an id for `--cloud-project` and `--cloud-org`. A name is looked up in the organization in scope, which is `--cloud-org`, then `UNITY_CLOUD_ORG`, then your saved default organization.

  * `unity mcp configure` writes `--tool-groups` into the entries it creates. An entry an older `unity mcp configure` wrote keeps one tool per command, so a client allow list that names those tools keeps working.

  * `unity`, `unity help`, `unity --help`, `unity -h`, `unity help <command>`, `unity <command> --help` and `unity --version` now show the "new version available" notice after their output, the same as other commands. The notice still goes to stderr, only in an interactive terminal, and never with `--json`, `--quiet`, `CI`, or when the update check is turned off.

  * The branded header and the highlighted names in the command listing use brand blue for the logo, wordmark, version and command names. The blue reads on light and dark terminal backgrounds.

  * Only the branded header asks the terminal for its background, and only where the terminal can answer, with a 100 ms wait. Command help and the command listing never ask; they use `UNITY_THEME`, then `COLORFGBG`, then dark.

  * Set `UNITY_THEME=light` or `UNITY_THEME=dark` to choose the background yourself.

  * **Breaking:** `unity recompile` exits `12` when no Editor answers, as `unity command` does, instead of `7`. A script that matched exit `7` for this should check `12`; `errors[0].code` is unchanged.

  * `unity recompile` takes the project as a positional argument too: `unity recompile <path>`.

  * `unity self-update --target <version>` now keeps the version you chose: Unity Hub no longer replaces it with its bundled CLI at start. Run `unity self-update` with no version to go back to the newest release and let Unity Hub update the CLI again.

  * `unity projects create --help` says that a new project is linked to Unity Cloud unless you pass `--no-cloud`.

  * `unity self-update` says in its JSON result whether it installed anything (`installed`) and, except for an MSIX update, which version (`installedVersion`), and sets `appliesAfterExit` when the new version takes over after the command exits.

  * **Breaking:** `unity close` and `unity projects close` fail with exit `11` and `PROJECTS_CLOSE_NOT_A_PROJECT` when the path isn't a Unity project (no `Assets` or `ProjectSettings` folder), such as a mistyped name. They used to succeed with `reason: "not_open"`.

  * A command that takes `--project-path` and gets an extra argument, for example `unity assets import package.unitypackage ./MyGame`, now names the flag in its "too many arguments" error and shows the corrected call: `unity assets import <file> --project-path <path>`.

  * `unity help <name>` now shows the help of a `unity-<name>` plugin from your `PATH` when `<name>` is not a built-in command, the same as `unity <name> --help`. `unity cloud help <word>` does the same for a `unity-cloud` plugin.

  * When you're signed in, your analytics choice is now saved to your Unity account, so it's the same on every device where you use the CLI or the Hub. `unity analytics opt-in` and `opt-out` save it to your account, and `unity analytics status` and `unity auth login` pick up the choice your account holds.

* **Fixed**

  * `unity license return` now returns Assigned seats such as Unity Pro. It sends your sign-in token to the licensing client first; before, the return always failed with a 401.

  * `unity vcs uvcs` commands recognize workspaces on self-hosted servers whose repository has no organization in its name, instead of reporting that the folder is not a workspace.

  * `unity hub install` no longer leaves its temp folder and a partial installer behind when Ctrl-C or SIGTERM stops it. Stopped while the installer runs, it now waits for the installer to finish before it removes the folder and exits; a second Ctrl-C exits at once.

  * `unity pipeline cloud-build targets create` and `targets update` with `--development-build` now set the `Development` build option that Build Automation reads, instead of `BuildOptions.Development`, which builds ignored. `--no-development-build` removes the option in any spelling.

  * `unity pipeline cloud-build targets update` sends the target's stored name when `--name` isn't given, so updating a target created from the Editor no longer fails.

  * `unity setup all --dry-run` no longer installs skills when an agent's Unity plugin is already installed. A dry run now writes nothing.

  * `unity projects link vcs`, `unity projects unlink vcs` and `unity vcs setup` now refuse a folder that is not a Unity project before they run git or contact a provider. Before, linking such a folder could create a git repository, create a remote repository and push to it.

  * `unity install` and `unity install-modules` write their module notices, such as an added dependency or a skipped unknown module, to stderr under `--format json`, `ndjson` and `tsv`, so stdout holds only the output a script parses.

  * `unity docs <topic>` and `unity docs toc` retry when docs.unity.com briefly rate-limits them, and open fewer connections at once, so a first lookup is less likely to fall back to a search.

  * When a service entry in the Editor config is unusable, the CLI log now says it is left out instead of saying the default was used. Entries with a built-in default still fall back to it.

  * `unity doctor` shows each environment check's status (`[pass]`, `[warn]`, `[fail]`, `[info]`) when its output is piped, instead of cutting the status down to `[…`.

  * `unity templates info --format json` and `--format ndjson` now always include `isUserGenerated` and `isNew`, `false` when the template doesn't set them.

  * `unity install <version> --resume` on an Apple silicon Mac continues the arm64 partial of an Editor download, where it used to restart the x86\_64 installer from scratch and install an x86\_64 Editor. The arm64 and x86\_64 macOS installers share the file name `Unity-<version>.pkg`; an explicit `--architecture`, else the Mac's own architecture, now picks the release, also when the catalog lists no release of that name.

  * `unity projects audit` no longer says it opened a Project Auditor page the window could not show. When the Editor's Project Auditor has no such area or view, the result note says so instead of reporting that the page is open.

  * `unity projects audit` no longer fails the first time it installs Project Auditor when the Editor drops the connection or cancels the install while it reloads. It reconnects, asks for the install again, and finishes.

  * `unity projects audit` now fails when the project has script compile errors, even if Project Auditor is already loaded. It exits with an error asking you to fix the compile errors in the Editor, instead of opening a window that can't run the analysis.

  * `unity projects audit --report` accepts a Git Bash style path such as `/c/Users/me/report.projectauditor` on Windows, instead of looking for it under `C:\c\Users`.

  * `unity projects audit` on a project older than Unity 6 now says Project Auditor needs Unity 6 or later and exits 6, instead of reporting that no Editor is running.

  * `unity hub install` on macOS no longer leaves the Hub removed or half copied when you press Ctrl-C while it replaces it with administrator rights. The copy finishes, then the command stops.

  * `unity <name>` now hands a `unity-<name>` plugin only the arguments after the command, even when an option before it has the same value as the command's name, as in `unity --cloudEnvironment dev dev serve`.

  * `unity self-update` now names the file and says how to fix it when it can't write the partial download, instead of failing with a bare "Operation not permitted" or "Access is denied" message.

  * `unity self-update` now checks it can write the CLI's install location before it downloads. If it can't (for example in `/usr/local/bin` without sudo), it says which path isn't writable and to rerun with write access or reinstall, instead of failing with a bare "Permission denied".

  * `unity self-update --rollback <version>` now says when a kept backup has no version label, and names plain `unity self-update --rollback` as the way to restore the most recent one.

  * A refused or unavailable sign-in broker, or a credential store that denies access, now fails `unity cloud` commands with its own error code (`AUTH_BROKER_REFUSED`, `AUTH_BROKER_UNAVAILABLE`, `CREDENTIAL_STORE_ACCESS_DENIED`) instead of `CLOUD_*_FAILED`, and it is no longer reported as a CLI crash. The exit code is unchanged.

  * In human output, these failures show the broker's own message, such as "Unable to reach the sign-in service. Try again in a moment.", without the command's "Unable to list organizations:" prefix.

  * `unity vcs switch` and `unity vcs worktree add` report an invalid branch name as a usage error (exit 2, code `VCS_INVALID_BRANCH_NAME`) instead of a failed command, and no longer send a crash report for it.

  * `unity vcs uvcs review --changeset` and `unity vcs uvcs review comments --changeset` no longer fail with a rejected request against Unity Cloud. The changeset filter is now sent in the format Cloud accepts.

  * `unity assets inspect` no longer prints raw color codes from a package's entry paths in the human and tsv tables, so a package can't recolor or hide its own entry names. json and ndjson output is unchanged.

  * `unity templates create` and `unity templates edit` now say what went wrong and what to do, instead of printing `UNABLE_CREATE_TPL`, `TEMPLATE_DESTINATION_NOT_WRITABLE` or `USER_TPL_EDIT`: a folder that isn't a Unity project, a templates folder you can't write to, or a template whose `package.json` can't be read. In JSON, `errors[0].code` names the failure (for example `TEMPLATES_CREATE_NOT_UNITY_PROJECT` or `TEMPLATES_EDIT_INVALID_MANIFEST`) instead of `ERROR`.

  * `unity assets inspect` and `unity assets import` with an extra operand now say `Expected 1 argument but got 2: a, b.`, like `unity open` and `unity projects info`, instead of `Expected 0 arguments but got 1: b.`

  * `unity assets import` and `unity open --batchmode` now work on Linux with no display. An import always runs the Editor without graphics, and `--batchmode` does the same when neither `DISPLAY` nor `WAYLAND_DISPLAY` is set.

  * `unity templates edit` now changes only the fields you pass. Before, an edit without `--display-name` (for example only `--description` or `--preview-image`) reset the template's display name to its package name.

  * `unity vcs sync` on a Git LFS repository now brings in the new commits and reports a failed LFS download as a warning with exit code 6, instead of failing the pull when the LFS server is unreachable.

  * `unity build` now fails with exit 6 when Unity exits 0 without a build result in its log and nothing was written to the output path, instead of reporting success.

  * `unity build --create-profile` no longer leaves the helper's `.meta` file, or an `Assets/Editor` folder it created, in the project, so later Editor runs stop recreating empty `UnityCliTemp-*` folders.

  * On Windows, pressing Ctrl+C while `unity build`, `unity build --create-profile`, `unity run` or `unity test` runs the Editor now exits 130 as an interruption. It no longer reports a missing result or a failed build (exit 6).

  * `test`, `run` and `build --create-profile` with `--allow-install --format ndjson` now end a failed run on a `success:false` `result` frame with the error code, after the install's own `result` frame. Before, the stream ended on the install's `success:true` frame while the command exited non-zero.

  * `unity build run -- <project>` now runs that project's last build, like `unity build run <project>`, instead of failing with "isn't supported with these options or in this environment". An extra project name after `--` is the usual "too many arguments" usage error.

  * `unity recompile` no longer fails with "Pipeline server returned 400 Bad Request" after a successful compile on Unity 6000.7 betas. A `400` or a `503` from the Editor during its domain reload is waited out, the command keeps polling, and it reads the compile status once more before it reports a failure.

  * `unity recompile` reports compile warnings without `--strict`. They still fail the run only under `--strict`.

  * `unity command` exits 6 with a `COMMAND_FAILED` error when the command's result reports `success: false`, or a `status` of `rejected`, `busy`, `failed` or `not_implemented`, instead of exiting 0. Editors whose Pipeline writes the command's output itself already set the exit code.

  * `unity command` says the Editor exited, and may have crashed, when the Editor quits while running a command, instead of naming a refused evalToken or a timeout.

  * `unity command` explains a `--instance`, `--pid` or `--port` typed after the command name that matches no Editor, and shows how to pass it to the command after `--`. When the command's parameter list is available, the hint appears only if the command has that parameter, and names it.

  * `unity command` asks a project whose Pipeline package is older than 0.9 by the command's old name first, so the Editor console no longer gets an Error for the new name it doesn't know.

  * `unity install-modules` no longer reads another release's module list for an Editor installed with `Unity.exe` straight in its version folder (as Unity's internal tools do). It now stops before any license question or download, for `unity editor module add` too, and tells you the Editor has no `Editor` folder to add modules to, instead of failing after the admin prompt with a generic installer error.

  * `unity uninstall` and `unity editors prune --remove` now remove only an Editor's own folder when `Unity.exe` sits straight in its version folder. They used to delete the parent folder, and every other Editor version in it.

  * `unity projects info` no longer reports `cloudEnabled: true` for a project that is not linked to a cloud project.

  * `unity command --skill` accepts a plugin prefix such as `unity:ui` and uses the skill name after it.

  * On Windows, a `unity self-update` whose file swap fails after exit no longer forgets the version you chose with `--target`. The next `unity` run puts it back.

  * `unity projects exec` with `--format json`, `ndjson` or `tsv` leads every line of a project's output on stderr with the project's name, so each project's output can be told apart.

  * `unity projects exec` checks every project folder before it runs anything. A missing folder is reported by its path up front and no longer stops the run on the other projects.

  * `unity status --until-ready` keeps waiting while the only open windows are the Editor's progress windows, such as "Hold on..." or "Reloading Domain".

  * A command blocked by an Editor window, not a message box, now says that no command can answer it and that it must be closed in the Editor, or shown with `unity command editor dialog` on an Editor that serves its own endpoint.

  * `unity auth token` prints a token for a service account. Set `UNITY_CLOUD_PROJECT` to the ID of the project the token is for (a name is not accepted); without it, or with a name, the command exits 2 and says so, instead of reporting a connection problem.

  * `unity auth broker ensure` starts the sign-in service when a proxy is configured, either a proxy variable such as `UNITY_PROXY` or `HTTPS_PROXY` or your system's proxy settings, instead of failing with `AUTH_BROKER_UNAVAILABLE`.

  * `unity docs cache add` skips a docs page whose path has a segment over 128 characters or is over 256 characters long, so one such entry in the listing no longer makes every rerun fail with `DOCS_CACHE_INCOMPLETE`.

  * A pager set in `UNITY_PAGER` or `PAGER` that fails without showing anything no longer loses the output when it is slow to start (for example `cmd /c exit 1` on Windows): the output is printed to the terminal instead.

  * `unity vcs affected` and `unity test --affected` no longer stop when an assembly definition repeats a key or holds a broken Unicode escape. They count that file as unreadable and carry on.

  * `unity help <word>` and `unity <group> help <word>` now report an unknown command and exit with code 2 when nothing is named `<word>`. Before, they printed the root or group help and exited 0.

  * `unity projects add`, `remove`, `pin` and `unpin` now end `--format ndjson` output with one `result` line, on success and on failure, as `--format json` ends with its envelope. Before, `add` printed bare paths, a failure printed only an error on stderr, and a damaged project list printed nothing on stdout.

  * `unity editors upgrade` and `unity editors info` now fail when the releases service can't be reached or answers with an error status. Before, `editors upgrade` reported "Up to date" and exited 0, and `editors info` reported the version as not found and exited 11.

  * `unity uninstall` with more than one version now reports "too many arguments" and exits with code 2. Before, it exited with code 1 and a message that the command isn't supported with these options.

  * `unity auth revoke` now refuses an application name made only of spaces, tabs or invisible characters, as it already refuses an empty one. Before, it stored a blank revocation that `unity auth consumers` listed as an empty row.

  * `unity logs --console --follow` and `unity recompile --strict` work again with Unity Pipeline 1.0.0-pre.1, which refuses the old `since_session` name. Both still send `since_session`, which every older package reads, and switch to `since-session` when the package refuses the old name.

  * When a proxy auto-configuration (PAC) script lists several proxies and the first can't be reached, the CLI moves on to the next one. It connects directly only when the script allows it.

  * On Windows, a proxy auto-config (PAC) script whose server cannot be reached, such as a company PAC while you are off the VPN, no longer stalls commands for about 20 seconds. The CLI gives up on the script after 10 seconds and falls back to your other proxy settings, or connects directly.

  * `unity build` through an Editor that already has the project open works again with Unity Pipeline 1.0.0, which refused the output directory under its old name and the build options as a plain string. The CLI still sends the old name first, which every older package reads, and switches to the new one when the package refuses it.

  * `unity projects audit` runs against Pipeline 1.0.0 as well as older Pipeline packages, instead of failing on the first step with an empty reason.

  * A usage mistake no longer fails with the "isn't supported with these options or in this environment" error (exit 1). A command with an extra word before `--help`, such as `unity projects info path --help`, prints that command's help.

  * `unity docs --help` now says that `--manual` searches the manual, and names `unity docs toc --manual` to list its pages. `unity docs --content --manual` says the same when it has no page to print, instead of asking for a more specific name.

  * The `unity docs --cli` example in `unity docs --help` now opens a page that exists.

  * With `--json` or `--format ndjson`, commands run from Claude Code no longer print the Claude plugin hint line on stderr, so stderr carries only what a parser expects.

  * `unity docs --url` no longer returns a page address that doesn't exist for a full API name such as `UnityEngine.Rigidbody.velocity`. When the page index has no such page, it returns a search address, as for any other name.

## 1.0.0-beta.17

**Release date:** November 05, 2026

* **Security**

  * `unity projects close --force` now signals a process only if it is a Unity Editor that did not start after the Editor's recorded start time, and checks again before each signal. A stale or tampered editor record that names a process that is not a Unity Editor, or one that started after the recorded time, is refused with a message, and that process is left running.

* **Added**

  * `unity plugin install` and `unity plugin upgrade` warn you before they download a beta build of a plugin, so you know it isn't a stable release. With `--format json` the warning is in the output's `warnings`.

  * A plugin can declare other plugins it needs. `unity plugin install` and `unity plugin upgrade` install the required ones first, each with its own license step, `unity plugin remove` refuses a plugin an installed plugin requires, and `unity plugin --json` lists each entry's `dependencies`.

  * `unity pipeline automation apps versions create <app-id> --version <version>` adds a draft version to a Pipeline Automation app, empty or copied from an existing version with `--base-version`.

  * `unity pipeline automation apps create` creates a Pipeline Automation app and its first draft version from options, or from a JSON file with `--file`.

  * `unity pipeline cloud-build builds timeline <build-number> --build-target <target>` shows how many seconds each phase of a build took, from waiting for a machine through upload. It is available on staging only for now, and on production it stops with an error before sending any request.

* **Changed**

  * `unity skill install` installs the Unity skills from a newer release of the Unity-Technologies/skills repository. The `unity-cli` skill now covers streamed command output and the `antigravity` and `qwen` skills clients, and `new-unity-project` now upgrades a project to Unity 6000.7 or later with `unity projects upgrade`.

  * `unity docs` opens the common page for a bare name that several script reference pages share: `unity docs Start` opens `MonoBehaviour.Start` and `unity docs Log` opens `Debug.Log`, instead of a search. A name with no clear common owner still opens a search.

  * `unity plugin upgrade` updates a plugin's agent skill only where it is already installed: user-wide, or in the current project. Run it from a project to refresh that project's copy.

  * `unity plugin install <id> --local` writes the plugin's agent skill into the current project, for each AI client whose project already has Unity's skill. Claude Desktop is skipped, because its skills are global only.

  * `unity projects link vcs --rollback --delete-remote` no longer deletes the remote repository unconfirmed when it can't ask (a machine format, `--non-interactive`, no terminal on stdin, or CI). It now fails with `LINK_VCS_DELETE_REMOTE_REQUIRES_YES` (exit `2`) before it reads or detaches anything, only where a delete could happen (a run with no origin or a self-hosted origin is unchanged); pass the new `--yes` (`-y`) to delete without asking.

  * A `unity self-update` that fails because of your machine or network no longer sends a crash report: a download that stalls, a download that doesn't match its checksum or goes missing, an operating system that refuses to start the new binary, a denied or full disk, and a file the system won't replace. The message and the exit code stay the same, and the error no longer suggests `unity bug` for the checksum, stall and blocked-launch cases.

  * When the Unity release service can't be reached, `unity install` and `unity editors default latest` or `lts` now fall back to Unity 6000.0.85f2 and 6000.3.28f1 LTS, up from 6000.0.64f1 and 6000.3.10f1.

  * Crash reports leave out problems on your side, such as a full disk, a denied permission, a network failure or not being signed in, and the same failure is reported at most once an hour. A crash no longer holds up the prompt for more than about a second and a half when you run the CLI in a terminal.

  * If you opted in to analytics, a crash report carries the same anonymous device id analytics uses. Without that consent it carries no id.

  * Turning off **Send crash reports** in the Unity Hub's settings now turns off the CLI's crash reports too. `UNITY_NO_CRASH_REPORT` still turns them off on its own.

  * Updated usage analytics defaults for new installs.

* **Fixed**

  * `unity mcp` waits for an asynchronous Editor test run to finish, and marks a capture that writes a file as able to overwrite one, with Pipeline packages that name their parameters in kebab-case (`async-tests`, `output-path`).

  * The install scripts install the latest beta again when no stable release exists yet, instead of failing. `UNITY_CLI_CHANNEL` set to a channel still installs only from that channel.

  * `unity pipeline list`, `unity status` and every command that finds a running Editor by its project now find an Editor launched with its `-projectPath` argument in quotes, such as `"-projectPath" "C:\My Project"`. Such an Editor was not listed at all.

  * `unity skill install`, `unity skill refresh` and `unity setup` install the latest published Unity skills, even on a machine that has never run the CLI before. Previously a first install could write the skills from before the most recent update.

  * `unity skill refresh --format json` and `--format ndjson` now write a result for every run. The JSON envelope or the final `result` line lists each tracked install the refresh looked at, with what it did: `refreshed`, `up-to-date`, `pruned`, `skipped` or `conflict` (`would-update`, `would-skip` or `would-prune` under `--dry-run`), plus a `skipReason` when the row was left alone or pruned for a reason.

  * An extra argument on `unity cloud`, `unity context`, `unity build`, `unity pipeline` and `unity projects` commands (except `unity pipeline automation` and `unity pipeline cloud-build`), for example `unity cloud status extra`, now prints `error: too many arguments` and exits `2`, like every other command. It used to exit `1` with "isn't supported with these options".

  * `unity vcs setup`, `unity projects create`, `unity projects link vcs` and `unity projects clone --vcs` no longer say a GitHub or GitLab token is invalid when the provider can't be reached. They exit 7 with `VCS_PROVIDER_UNREACHABLE`, and still exit 3 with `VCS_TOKEN_INVALID` when the provider rejects the token.

  * `unity ci init --provider gitlab` now generates a job that runs in a project folder whose name starts with a dash, such as `-rf`.

  * `unity pipeline install` and `unity pipeline upgrade` under `--format tsv` now print their result as `key<TAB>value` lines under a header row, one line per field (`packageId`, `version`, `projectPath`, `alreadyInstalled`; and `previousVersion`, `upgraded`, `alreadyLatest` for upgrade). Before, a script got one headerless row of positional cells and could not tell which cell was which.

  * `unity install-modules` now respects `--architecture` when one build of the version is installed: an invalid value exits 2 in every mode, and an architecture that is not installed exits 6 with a not-found message for `--list`, `--all`, named modules (`-m`) and the module picker, instead of using the installed build.

  * `unity projects create`, `unity projects link vcs` (flag form and URL form) and `unity vcs setup` with `--git-token-from-stdin` (or the deprecated `--git-token-stdin`) no longer fall back to a stored login (a Git credential helper, `gh` or `glab`) when stdin is empty. They now fail with exit code 4 (`VCS_TOKEN_REQUIRED`) and create or push nothing, so a script that pipes an empty variable cannot act as whoever is signed in.

  * `unity projects create --cloud-project <name>` now fails with exit code 6 when the organization has no project, or more than one, matching that name. It used to exit 0 with only a warning.

  * Creating a Unity Cloud project with `--coppa unspecified` now works on `unity projects create`, `projects link cloud`, `projects link vcs` and `vcs setup`. The Cloud request was refused with HTTP 400, so the project stayed unlinked.

  * `unity projects create --vcs github` or `--vcs gitlab` with a `--git-token` now exits `7` (`VCS_PROVIDER_UNREACHABLE`) when the token check cannot reach the provider (offline, a failed DNS lookup, a refused connection, or a proxy that is down), and `14` (`ETIMEDOUT` or `ECONNABORTED`) when it times out, instead of reporting the token as invalid (exit `3`). Nothing is written in either case.

  * `--quiet` no longer blanks the human answer of commands whose result is a sentence or a table. `unity docs cache --quiet` now prints "No documentation is cached..." on stdout instead of nothing, and `context`, `auth accounts`, `config`, `editors running`, `skill`, `doctor` and the other commands listed in the deviation keep their answer under `--quiet`.

  * `unity license status` no longer reports `signedIn: true` with `authMode: "oauth"` when nobody is signed in and the sign-in service refuses the CLI. It now reports the saved sign-in, or signed out when none is saved, matching `unity auth status`.

  * `unity test` now refuses a `--junit-output` that is the same file as `--output` on the report folder's own terms, instead of letting the JUnit report overwrite the NUnit one. Names that differ by letter case, the dotless and dotted `i`, or Unicode form are only a candidate, and the file system decides, component by component from the first path component that differs: a spelling that exists while the other does not is a different file, two that exist are compared by file identity (a dangling link, whose target cannot be looked up, is judged by its link entry and never counts as a different file), and two that are absent are probed with a file created under the first name in a scratch folder inside the nearest existing folder, removed again, so nothing is created or removed at the report paths (a probe that cannot be made or read proves nothing and does not refuse the run), and right before the JUnit report is written the two files are compared by identity once more, so a link or an 8.3 short name created by the NUnit write cannot send the JUnit report over it (NTFS through WSL keeps `É` and `É` as two files and folds `ı` into `I`, a folding folder makes `É` and `É` one).

  * Commands that talk to a running Unity Editor, such as `unity command`, `unity recompile`, `unity job`, `unity logs --console` and `unity projects audit`, no longer crash when the current directory can't be read or no longer exists (a permission refusal such as macOS blocking a protected folder, or a folder deleted under your shell). They skip it, and with several Editors open ask you to pick one with `--project-path`.

  * `unity projects link cloud` links a project whose `ProjectSettings.asset`, as the Editor wrote it, no longer names a cloud project, where it refused with the stale link from the Hub's project list.

  * `unity projects link cloud` now exits with code 7 (14 for a timeout) when Unity's services can't be reached (for example behind a dead proxy), instead of exit 6. Unity Cloud commands whose sign-in step gets no answer from Unity's services now say the services can't be reached, instead of telling you to run `unity auth login`.

  * `unity projects clone --vcs uvcs` now registers the project with its Unity Version Control link, workspace location included, even when the workspace cannot be read back from `cm`, so `unity projects unlink vcs` finds the workspace it removes instead of reporting the project as already unlinked or naming the wrong folder.

  * `unity projects unlink vcs` on Windows no longer refuses a project at the root of its Unity Version Control workspace just because the path differs in letter case (for example `C:\work\game` against the `c:\work\game` that `cm` reports), so it removes the workspace without `--unlink-workspace`. A project below the workspace root is still refused.

  * `unity projects clone --vcs uvcs` of a repository you already cloned into another folder no longer fails with "workspace already exists": the second clone gets a workspace named for its folder (`<repo>_<folder>`), and a name still taken is reported with the `cm workspace delete` command to free it.

  * On Windows, `unity projects clone --subpath` registers the project with backslashes only (`C:\dir\Sub\Game`), instead of a path that mixed `\` and `/`.

  * `unity projects unlink vcs` treats a project whose registry row records its workspace folder itself (as the Hub writes it) as linked to that folder, instead of refusing with a folder two levels above it or removing the `.plastic` there.

  * On Windows, pressing Ctrl-C while a command shows its spinner no longer leaves the Windows Terminal tab and taskbar progress indicator spinning.

  * `unity terms status --quiet` now prints the same table as a run without `--quiet`, and prints "No installed Editors found." when no Editor is installed, instead of printing nothing.

  * On Windows, `unity hub install` now names the expected publisher, `Unity Technologies SF`, when it refuses an installer whose signature does not check out, instead of the macOS Developer ID.

  * On Windows, `UNITY_PAGER=more` and `PAGER=more` now page long listings; the pager lookup also finds `.com` programs.

  * A `UNITY_PAGER` or `PAGER` that cannot be found now prints a warning on stderr instead of silently printing the listing unpaged.

  * A sign-in refresh that times out, and a service-account token exchange that gets no answer from the network, no longer send a crash report. The messages and exit codes are unchanged.

  * `unity vcs doctor`, `hooks`, `status`, `switch`, `sync` and `worktree` now say what to check when git cannot be started (not installed, not on your `PATH`, or not allowed to run), under the new error code `GIT_START_FAILED`.

  * `unity context` reports an accounts database it cannot write to with the same message and `LOCAL_STORE_UNWRITABLE` code as `unity auth`.

  * A pipeline artifact the build does not list, an accounts database `context` cannot write to and a git that cannot be started no longer send a crash report.

  * `unity mcp configure` writes the config file when it sits on a different drive than its temporary copy, which happens when `AppData` is redirected, as with a packaged Claude Desktop. Previously it failed with "The system cannot move the file to a different disk drive" and left the config untouched.

  * `unity mcp configure` now exits with code 1, instead of 6, when it can't write a config file (for example a read-only folder) in the human, `tsv` and `github` formats; `--format json` and `ndjson` already used 1. Scripts that check for exit 6 on a failed write should check for 1.

  * `unity watch test` no longer skips a file change on a busy machine. A slow poll under heavy load used to push the next check far out, so a change could land in the gap and go unnoticed until the following one.

  * The one-time privacy notice now matches your analytics setting on every first command. Before, a machine with analytics on could be told how to turn it on instead of how to turn it off.

## 1.0.0-beta.16

**Release date:** November 03, 2026

* **Added**

  * In Unity Editor versions that support it, `unity command editor dialog` shows the modal dialog the Editor is waiting on, and `unity command editor dialog answer <id> <button>` presses one of its buttons, even while the dialog blocks the Editor. `unity pipeline editors` shows each Editor's phase (such as `loading project` or `safe mode`) and every endpoint it serves with its type, shows the open dialog, and no longer suggests restarting an Editor that is still loading its project.

  * `unity skill sync [client]` installs or updates one AI client's Unity skills without prompting, keeping any copy you edited. With no client it picks the agent running it, `--hook` prints a session-start hook document, and an unchanged run downloads nothing.

  * When an AI agent runs `unity` and its Unity skills are older than the CLI's pin, the CLI suggests `unity skill sync <client>` once a day. `UNITY_NO_AGENT_HINTS` turns it off.

  * `unity setup vscode` installs the Unity skills for VS Code and prints how to add the Unity plugin there with Chat: Install Plugin from Source. `unity setup opencode` installs the Unity skills for OpenCode and writes a plugin file, `~/.config/opencode/plugins/unity.js` (under `$XDG_CONFIG_HOME` when it is set), that keeps them current at the start of each session.

  * `unity skill install` now supports Google Antigravity (`antigravity`) and Qwen Code (`qwen`).

  * `unity projects create` gives every project linked to a cloud project a `liveops_enabled` kill switch in Remote Config, set on the server and never in a file, so live features can be turned off from the Unity Dashboard without a new build. An existing switch is never changed, and a project whose Remote Config already has a `settings` config is asked to add the switch in the Unity Dashboard instead.

  * `unity projects create` adds Cloud Save and one save slot for the signed-in player to every project linked to a cloud project. `--bare` leaves it out.

  * `unity build --target` now builds through the Unity Editor that already has the project open instead of refusing, and switches that Editor's active build target; `--timeout` and Ctrl+C stop waiting without closing the Editor or stopping its build. An Editor in Play Mode, compiling scripts or showing a dialog is refused with a hint, and `--execute-method`, `--profile`, `--args`, `--accelerator`, `--no-accelerator`, `--log-file`, `--editor-path`, an `--editor-version` other than the open Editor's, `--architecture` (or `UNITY_ARCHITECTURE`), `--build-target-group` and the `--android-*` options still need the Editor closed.

  * `unity auth broker ensure` starts the CLI's sign-in service if it isn't running, so a plugin can rely on it before it reads your session.

  * `unity vcs diff` names the asset behind each changed reference, looked up at that side's commit, and marks assets added or deleted in the range, built-in resources, package assets and objects in the same file.

  * `unity vcs guid <guid...>` shows which asset each guid names, in your working tree or at a commit with `--at`.

  * `unity vcs summarize --objects` shows what changed inside each changed scene, prefab and asset in the range, object by object, the way `unity vcs diff` does for one file. Each file's report is capped like `unity vcs diff`'s; add `--full` to see every change.

  * `unity vcs summarize --to <ref>` ends the summary at that commit instead of the one you have checked out, so you can summarize a pull request or a past range without switching branches. For example, `unity vcs summarize --since main --to feature/login`.

  * `unity vcs diff --full` shows every changed object and every value whole, in human and json output. A value nested more than 8 levels deep still collapses, and is marked truncated.

  * `unity skill install --all` installs the Unity skills into every agent client found on your machine, one line per client. It never starts an agent's own CLI, so it works on a machine without git.

  * `unity pipeline cloud-build` now sets up build targets: `targets create` and `targets update` take one option per field, or a whole target as JSON with `--file` (`-` reads stdin), `connections` lists and `connections create` adds a project's repository connections (Unity Version Control uses your Unity sign-in), `scm check-url` checks a repository is reachable, `credentials android|ios|osx|uwp upload` uploads signing credentials, `targets auditlog` lists a target's configuration changes and who made them, and `org free-tier` shows whether the organization has reached its free tier limit. Passwords and tokens are read from stdin or an environment variable, never from an argument, and never appear in output.

* **Changed**

  * `unity command` shows a command's output as the Editor writes it, while the command runs, when the Editor supports it. `--format json` (or `ndjson`, or `--json`) writes the command's result as one JSON value per line and `--format tsv` one tab-separated line per record; pass `--fields name,path` to pick the fields.

  * For scripts: against an Editor that formats its output, `unity command --format json` prints the command's result without the `success`, `command`, `parameters` and `target` envelope, and `--format tsv` has no header row. `--format ndjson` writes the same lines as `--format json`, and `--format github` the human layout.

  * `unity command` listings (`unity command`, `--tag`, `--tags`, a group name such as `unity command editor`) come laid out by the Editor when it supports it, in the same layout without the connection lines above it, and print as they arrive instead of through the pager.

  * The Asset Library plugin (`unity assetlibrary`) now gets the account the CLI is signed in to.

  * Two new exit codes: `17` (`UNAVAILABLE`) when the Editor is busy loading, compiling, reloading, in Safe Mode or running too many commands, and `18` (`AWAITING_INPUT`) when a modal dialog blocks it. Both used to exit `6`.

  * `unity setup claude`, `codex`, `grok`, `copilot`, `antigravity` and `qwen` now also install the Unity skills for that agent, because the Unity plugin no longer carries them. `unity setup all` does the same for each plugin agent it finds.

  * `unity setup all` no longer registers the Unity MCP server for coding agents that can run shell commands, which use the `unity` CLI directly. Run `unity mcp configure <client>` if you want it.

  * `unity docs --package <name>` opens the package's own docs from the project when it has them, so it works offline. `--online` opens the online manual instead, and `--format json` reports `source` as `local` with the file's `path`.

  * A command that cannot reach its service because you are offline, a DNS lookup fails, the connection is refused, or the proxy is down now exits `7` (`NETWORK_UNREACHABLE`) instead of `6`. This covers `unity releases`, `unity changelog`, `unity self-update --check`, `unity pipeline list-versions`, `unity cloud org` and `unity cloud project`.

  * `unity docs cache --format json` now returns the same listing shape as the other list commands: the cached versions are in `data.items`, next to `total`, `nextPage` and `partial`, instead of being a bare array in `data`. Under `--format ndjson` the last line carries the same fields next to `count`.

  * The install scripts now finish by installing the Unity skills into every agent client found on your machine, instead of running `unity setup`. On a Mac without the Xcode Command Line Tools, `unity setup` could not install the Claude Code plugin, because Claude Code needs git to add a plugin marketplace.

  * `unity skill install` installs the Unity skills from a newer release of the Unity-Technologies/skills repository, including the current `new-unity-project` skill, which by default sets up a project from your prompt without a long interview, and the new `craft-game-floors` skill.

  * On Linux, installing or adding a Unity Editor no longer adds an entry for that version to the applications menu. Editor windows keep their name and icon.

  * `unity docs <topic>` answers sooner on a cold start when the topic's Editor version is known (from the project or `--editor-version`): it opens or prints the page as soon as the documentation index files read so far hold it, instead of after the whole index has loaded. It sends the same requests to docs.unity.com as before and caches the same index.

* **Fixed**

  * `unity skill install opencode` now installs into `$XDG_CONFIG_HOME/opencode/skills` when `XDG_CONFIG_HOME` is set, where OpenCode looks for them, instead of always `~/.config/opencode/skills`. A copy an earlier version put in `~/.config/opencode/skills` stays there; delete it if you set `XDG_CONFIG_HOME`.

  * A URP project made with `unity projects create` no longer opens on the "URP Material upgrade" dialog, which held up every Editor command until someone clicked OK. The payload's new `urpMaterials` block reports it.

  * `unity docs <package> --content` prints the docs for the package version the project uses, not a newer copy left in the package cache.

  * `unity collab` commands no longer say "Not signed in" when getting a Unity token fails for another reason, such as a rate limit, no network connection or an unreachable proxy. They now report "Collaboration API call failed:" with the real cause, as `unity cloud` does.

  * A signed-out `unity collab` command now always says how to sign in with `unity auth login` or use a service account with `unity auth service-account`, instead of sometimes leaving out the service-account route.

  * `unity self-update --rollback` now refuses to run together with `--dry-run`, `--check`, `--changelog`, `--target` or `--channel`, and exits `2` without changing anything. Before, those flags were ignored and the rollback went ahead.

  * `unity install <version> --changeset <changeset>` no longer installs the public build of that version when the changeset belongs to a different build. It now exits 11 (`RELEASE_NOT_FOUND`) and installs nothing.

  * `unity pipeline automation` and `unity pipeline cloud-build` no longer put stray control characters around a command name, such as `unity auth login`, in the error message of `--format json` and `--format ndjson` output when you are signed out.

  * `--quiet` no longer empties `--format tsv` tables. `unity --quiet --format tsv releases` printed nothing and exited 0, so a script that piped it got no data.

  * `unity config proxy` and `unity env` now show the proxy from the `--proxy` flag, with source `flag`, when you pass it. They used to show no proxy, or the one from your environment, although requests already went through the flag.

  * `unity command` exits `14` with the `EDITOR_TIMEOUT` error code when the Editor stops a command that ran past `--timeout`, instead of exiting `6` with `COMMAND_FAILED`, so scripts can tell a timeout from a failure.

  * `unity uninstall` now reports the Editor it removed under `--format json`, `ndjson` and `tsv`: the json envelope and the ndjson result frame carry `version` and `architecture`, and `tsv` prints them as key and value rows. It used to print nothing and exit 0.

  * `unity uninstall` with no version now announces the stored default Editor on stderr instead of stdout, so a `--format json` run no longer starts with a line that breaks the parse.

  * `unity language --set` and `unity ci init` print a value you typed, or a project folder name, on one line with no color codes when they refuse it, so a newline in the value can no longer add a fake second error line.

  * `unity docs cache add` now refuses to write when the docs cache folder is itself a symbolic link, the same way it already refused a link inside it. `unity docs --content`, `unity docs toc`, topic lookup and `unity docs cache` no longer read through such a link either.

  * Two `unity self-update` runs started at the same time no longer share one download, which made one of them fail with "No such file or directory". The second run now says it is waiting for the other and starts once that one finishes.

  * `unity vcs diff` given an empty `--from` or `--to` now says which option needs a revision and exits with code 4 (error code `VCS_REVISION_EMPTY`). It used to print an untranslated internal error and exit with code 6.

  * `unity vcs blame` reports a new file that has never been committed as `untracked`, instead of saying the path does not exist.

  * `unity vcs git migrate-lfs --after` now refuses a value that is not a date, such as `banana`, with a usage error instead of scanning anyway. It takes an ISO date such as `2025-01-01`, with an optional time and zone, or a relative one such as `"2 weeks ago"`.

  * `unity auth revoke` now fails with exit code 6 and the `AUTH_REVOKE_LIST_FULL` error when the revocation list already holds 1,024 applications, instead of exiting 0 without revoking anything. Restore an application with `unity auth revoke <application> --restore` to make room.

  * `unity cloud project current --format tsv`, and its default when output is piped, now prints `key<TAB>value` lines with the same fields as `--format json` (`activeOrganizationId`, `activeCloudProjectId`, `defaultCloudProjectId`, `linkedCloudProjectId`) instead of the human sentences. `--quiet` no longer hides them.

  * `unity install` and `unity install-modules` refuse a `--download-directory` that is a file right away, a `--dry-run` included, with a "not a directory" error (exit 6, `PATH_NOT_A_DIRECTORY` in JSON), instead of passing the dry run or failing late.

  * `unity install` now warns when `UNITY_INSTALL_RETRIES` is not a non-negative integer, as `unity install-modules` does, instead of silently using 2 retries.

  * `unity releases --from-year` now filters on each release's date. It used to compare the year with the version number, so every Unity 6 release passed any year (`--from-year 2099` listed them all) and older-line patches released in that year were left out.

  * `unity docs cache add --format ndjson` writes `progress` frames while it downloads pages, before the result frame.

  * `unity self-update 1.2.3` now suggests `unity self-update --target 1.2.3` when it rejects a CLI version, instead of pointing at `unity editors upgrade`.

  * On macOS and Linux, `unity self-uninstall` now stops the Unity auth broker and removes its `~/.unity/run` folder, so `~/.unity` no longer stays behind when you uninstall while signed in.

  * `unity templates pack` no longer leaves a copy of the project in the temp folder when a signal such as SIGTERM stops it.

  * `unity projects create --template <path>.tgz` now checks the minimum Editor version the archive's `package.json` declares, and refuses an older Editor with the same "requires Unity" error as a template folder, before the Editor starts.

  * On macOS and Linux, Ctrl-C or SIGTERM during `unity projects create` now stops the Unity Editor it started, instead of leaving it running and writing the project. The command exits 130 or 143 and names the folder that holds the partial project.

  * `unity collab attachments <annotationId> --format ndjson` writes each attachment as its own row line with no `"type":"row"` marker in front, so a line holds one `type` (the attachment's kind), as `unity templates` rows do. The `--format json` items are unchanged.

  * `unity collab attachments update sketch` now changes a sketch's camera, time or metadata on its own, without `--sketch-data`, instead of failing with "Sketch Data must not be null or white space." The sketch is read and written back in two requests, so another client's edit to the same drawing in between is overwritten; pass `--sketch-data` to set the drawing explicitly.

  * `unity collab attachments add sketch` with only `--preview` or only `--sketch-image` now stops before sending anything and says both files are needed, instead of failing with HTTP 404 and leaving a half-created sketch attachment behind. Pass both files, or neither.

  * `unity collab attachments upload` no longer leaves an unfinished attachment behind when the file transfer fails, so you can run the upload again on the same annotation. If the attachment cannot be removed, the error names the `unity collab attachments delete` command that clears it.

  * `unity test --rerun-failed` exits 6 with "Could not read the previous results" when `--output` names an empty file or one that holds no NUnit test run, instead of reporting that no tests failed and exiting 0.

  * `unity projects info` prints `key<TAB>value` rows under `--format tsv` and when its output is piped, and one JSON line with `"type":"result"` under `--format ndjson`, instead of the human block.

  * `unity projects clone <url>` refuses a URL with a `.` or `..` path segment, an empty path segment, a space, a backslash or a non-ASCII character with an invalid repository or invalid URL error (exit 2), instead of reporting it as unsupported in this environment (exit 1).

  * `unity projects upgrade` on a project that is already open in a Unity Editor now stops with an error that names the running Editor's process, and exits `6`. It used to launch a second Editor, which refused the open project, and report the upgrade as in progress with exit `0`.

  * `unity projects link vcs <path> <url>` on a project already in your list records its provider, organization and repository, as linking without a URL does, so `unity projects --vcs` and `unity projects info` show the link.

  * `unity collab jira issues link` links an issue without `--jira-project-config-id`, instead of failing with `HTTP 415: Unsupported Media Type`.

  * `unity collab jira issues create` without `--reporter-user-id` now sends the project config's default reporter instead of failing with HTTP 400.

  * `unity collab jira project unlink` and `unity collab jira issues unlink` fail with an HTTP 404 error (exit 6) when the link does not exist, instead of reporting success.

  * `unity collab thumbnail download --width` now refuses a value that is not a whole number of at least 50, such as `60abc`, `64.5` or `49`, with a usage error before any request. A smaller width made the service answer HTTP 500.

  * `unity projects new <name>` fails with an unknown command error that suggests `unity projects create <name> --no-cloud` (add `--bare` for a project without the Pipeline package), instead of an error about arguments to `list`. Any other unknown word followed by a second word under `unity projects` is reported as an unknown command too.

  * `unity vcs diff --full` and `unity vcs summarize --full` now name the objects a changed value refers to in objects larger than 4 MB. Without `--full`, those names are still left out, and the report now says so: a notice in human output, `referencesTruncated: true` in json.

  * `unity vcs diff` and `unity vcs summarize --objects` show a reference to a built-in asset with its guid as written, `guid: 0000000000000000e000000000000000`, instead of `guid: 0`. Any value of exactly 32 hex digits now prints as written.

  * `unity projects create -a arm64` (or `-a x86_64`) no longer creates the project with an Editor of the other architecture when that is the only one installed for the version. It fails as an Editor that isn't installed, and the suggested `--install-editor` command installs the architecture you named.

  * Pressing Ctrl-C during `unity projects create` or `unity new` on Windows now stops the Editor, deletes the private Editor log (which held your home path) and fails with exit code 130, naming the folder that holds the partial project. Before, the command exited silently and left the log in the temp folder.

  * `unity self-update` now refuses an update manifest whose version is not valid semver, with the same "update manifest couldn't be read" error (exit 6) as a malformed one, instead of reporting an empty latest version or requesting a download that 404s.

  * `unity collaboration annotations export` names what to do when the service refuses the export with "No assets found for the provided ids" (an annotation points at an asset that was deleted): run `annotations count --grouped` on the exported target to list the targets, then export the ones that still exist with `--target`. The service does not say which asset is missing, so the CLI cannot skip it.

  * `unity auth login` in the browser now replaces a stored service account with the new sign-in. Before, it said "You are now signed in" while `unity auth status` and other commands kept using the service account until you ran `unity auth logout`.

  * When `unity setup all` fails to configure an MCP client, the failure now says why (for example that it can't read the client's config file) instead of only pointing at `unity bug`.

  * A `socks5://`, `socks5h://` or `socks4://` proxy now works for downloads, plugin installs and `unity self-update --check`. They used to fail with `unsupported scheme` without ever contacting the proxy.

  * `unity completion powershell` now completes the global options, such as `--format` and `--color`, and the values they accept, as the bash, zsh and fish scripts do. It listed only the commands before.

  * `unity auth accounts`, `status`, `consumers` and `revoke` now accept the global `--no-header` option instead of failing with "isn't supported with these options or in this environment".

  * `unity install --changeset <changeset>` without a version now says "No version specified" and exits 2, like `unity install` does, instead of reporting an empty version as invalid with exit 6.

  * `unity projects unlink vcs` fails when the project's `.git/config` has a line git cannot parse, leaving the file unchanged, instead of reporting there is nothing to unlink.

  * `unity projects audit --timeout` refuses a value above 2147483647 seconds with the usage error, instead of accepting it and looking for an Editor.

  * On Linux, `unity editors add <folder> --skip-signature-check` no longer registers a folder that holds no Editor. It registered `/tmp` as an installed Editor with an empty version and exited 0.

  * `unity vcs doctor --fix` on Windows no longer fails with `VCS_DOCTOR_WRITE_FAILED` ("The filename, directory name, or volume label syntax is incorrect") on every repair; the `.gitignore`, `.gitattributes` and serialization fixes are written again.

  * `unity vcs git worktree add --install-editor` now refuses up front, with exit `2`, when the branch needs an Editor that is not installed and the run cannot ask for confirmation. Before, the refusal came after the branch and the worktree folder were created, so running it again failed with the branch already checked out.

  * `unity vcs status`, `sync`, `setup`, `doctor`, `conflicts`, `affected`, `switch`, `merge-setup`, `hooks`, `git migrate-lfs`, `git worktree` and `uvcs locks` / `changesets` / `review` given an empty path (`""`) now say no path was given and exit `2` (`VCS_PATH_EMPTY`). Before, the empty path was read as the current project and the command ran on it.

  * `unity docs <topic> --content` now prints the page as Markdown when the Editor has the Documentation module installed. Before, it opened the local page in the browser and printed nothing.

  * `unity mcp help` now prints the help of `unity mcp`, as `unity mcp --help` does, instead of failing with "unity mcp isn't supported with these options or in this environment". `unity mcp help configure` prints the help of `unity mcp configure`.

  * `unity mcp configure --list --format tsv` prints a header and one row per client (`key`, `displayName`, `configPath`, `status`), and `unity mcp configure <client> --format tsv` prints the run's result as `key<TAB>value` rows, instead of nothing and exit 0.

  * `unity build`, `unity run` and `unity test` with `-a arm64` (or `-a x86_64`) no longer launch an Editor of the other architecture when that is the only one installed for the version. They fail as an Editor that isn't installed (exit 6), and `--allow-install` installs the architecture you named.

  * On Linux, `--editor-path` pointing at a directory or at a file that is not executable now stops with `EDITOR_PATH_NOT_A_UNITY_EDITOR` and says the path is not a Unity Editor, instead of failing later with a raw `spawn ... EACCES` error.

  * `unity build`, `unity run` and `unity command` with a `--log-file` in a folder that cannot be created (no permission, `/proc`) now say the path is unusable and name the file and the flag, instead of "An unexpected error occurred".

  * `unity ci init --provider gitlab` now writes a pipeline that changes into a project folder whose name holds `: ` or ` #`, such as `a: b`, instead of one GitLab reads as a mapping or cuts short.

  * `unity docs --content` exits 7 (network unreachable) when the page request gets no answer after the page index answered, the same as when the index is unreachable, instead of exit 6. A page request that times out exits 14 and one whose connection is reset exits 6, as the exit codes table says.

  * `unity templates pack` refuses an `--output` that reaches the project being packed through a symlink, a Windows junction or an 8.3 short folder name, the same as a direct path inside the project (exit 2), instead of writing the archive into the project.

  * `unity templates create` and `unity templates pack` now say why a permission error stopped them, as `Permission denied: <path>`, instead of printing only `UNABLE_CREATE_TPL`. The JSON `errors[0].message` carries the same text and `errors[0].code` and the exit code `6` are unchanged.

  * `unity install-modules --editor-version <version>` with no Editor installed now points you to `unity install <version>`. Before, it only said that no editor was found for the version.

  * `unity install-modules -m <module>` exits 0 when every module you name is already installed, as `unity editor module add` does: it prints `All modules are already installed.`, or the empty plan under `--format json` and `ndjson`. Before, it failed with `No modules found to install.` and exit code 6.

  * `unity editor module`, `unity editors module` and `unity install-modules --list` now show the `Aliases` column (the `aliases` field in `--format json` and `ndjson`), like `unity modules` and `unity install --list-modules` already did. The column comes last, so existing `tsv` pipelines keep their field order.

  * `unity projects clone` with a URL that has no repository path, such as `https://github.com`, now says the URL is invalid instead of blaming a `--vcs-repo` option that was never passed.

  * `unity auth consumers` no longer prints raw escape codes from an application name, scope or time in the human and tsv tables when the broker's audit log was edited or written by another tool. json and ndjson output is unchanged.

  * `unity cloud org` and `unity cloud project` exit with code 3, instead of 6, when the Unity services refuse the request with an HTTP 401 or 403 after you have signed in. The error code and message are unchanged.

  * `unity editor module add` now reads `UNITY_INSTALL_RETRIES` as `unity install-modules` does, retrying a failed module download that many times (default 2), and warns when the value is not a non-negative integer, instead of always running with 0 retries.

  * `unity templates delete` removes the deleted template's entry from the template sources, so a template made with `unity templates create` no longer leaves a stale source behind.

  * `unity projects unlink cloud --cascade-vcs` and `unity projects unlink vcs` end their failure message with one period when the system's own error text already ends with one, instead of two.

  * `unity logs --follow` and the other commands that stop on Ctrl-C now leave SIGINT and SIGQUIT ignored when the parent process ignored them, as a background job started from a script does. Before, `logs --follow` installed its own handler anyway and exited `130`.

  * Pressing Ctrl-C at the `Update it?` question of `unity mcp configure` now ends the command with the `INTERRUPTED` code and exit 130, like every other prompt, instead of exiting 1 with a generic failure hint. The config file is left as it was.

  * `unity editors add` now tells you to run `unity editors add --skip-signature-check <path>` with the Editor path, shell-quoted, when it refuses an Editor that is not signed by Unity Technologies, in every language.

  * On Windows, `unity self-uninstall` keeps retrying for up to 30 seconds to remove `unity.exe` when another process still holds it, such as an MCP server started from it, and no longer leaves its temporary cleanup folder behind.

  * PowerShell completion now offers a command group's subcommands after a space. Pressing Tab after `unity auth ` listed the top-level commands again; it now lists `login`, `status`, `accounts` and the rest, as `unity auth ac` already did.

  * Pressing Ctrl-C during `unity vcs sync` and the other `vcs` commands that run git now ends the git process with the CLI, so a pull or push no longer finishes in the background after the CLI reported it stopped.

  * `unity projects --watch` now follows the project list. A project added or removed from another terminal while the watch runs appears or disappears on the next poll.

  * On Linux and macOS, with a group-writable umask such as `0002` and a shared temp folder, `unity` now creates its private cache fallback folder owner-only instead of refusing it. Before, commands that need scratch space failed for those users.

  * Bash, zsh and PowerShell completion now skip a global option's value before the command. `unity --proxy http://localhost:8080 editors ` treated the URL as the command and offered nothing in PowerShell and zsh, or the wrong list in bash; it now lists the `editors` subcommands, as `unity editors ` does, with `--proxy value` and `--proxy=value` alike.

  * In fish, `unity --proxy <url> <TAB>` now offers the commands, as `unity <TAB>` does. The fish completion skips the value of an option that takes one before it decides which command you are typing.

  * `unity projects` and `unity close` now stop with the same "project list can't be read" error as `unity projects add` when Unity Hub's project database is damaged or is not a file, instead of showing no projects or reporting the project as not open.

  * `unity templates pack` stops with exit code 130 and `Interrupted.` when you press Ctrl-C while it archives the project, and removes its temporary files, instead of reporting `Template packing failed` with exit code 6.

  * `unity templates location --set` and `--reset` now refuse, and leave `templatesSettings.json` untouched, when that file can't be read as settings (cut short, starting with a byte-order mark) or has custom template sources but no valid `defaultPath`. Before, the sources were replaced with an empty list and the command reported success.

  * `unity projects size` warns about a folder it could not read, and marks the JSON result as partial with the folders it skipped, instead of leaving the folder out of the total without a word.

  * `unity cloud project` without paging flags exits 7 (service unreachable) when it cannot reach the service, as `unity cloud project --limit 10` already does. The partial listing and its `CLOUD_PROJECT_LIST_PARTIAL` code are kept in the output.

  * `unity install-path` and `unity editors install-path` now warns, naming the file, when `secondaryInstallPath.json` exists but holds no usable path (not valid JSON, truncated or empty), instead of silently printing the default editor install path. The install path in use does not change.

  * `unity uninstall` no longer deletes an Editor whose architecture the Hub's editor list does not record. Without `--architecture` it now stops with a message and removes nothing; pass `--architecture` to remove it.

  * `unity build --profile` and its "Available profiles" list now ignore a folder named like a Build Profile (`Name.asset`), as `--list-profiles` already did. Before, the folder was listed, and choosing it by name failed with "not a .asset file".

  * `unity vcs setup --vcs <value>` now says a self-hosted host name is accepted when it refuses an unknown provider, as `--help` does. When the provider CLI for a self-hosted host has no session, the refusal now names that host's sign-in (for example `gh auth login --hostname git.example.com`) instead of the bare `gh auth login`, which signs in to github.com.

  * `unity collab --some-unknown-option` (and the same typo at `collab jira`, `collab jira server`, `collab reactions` and the other `collab` groups) now prints `error: unknown option` and exits 2, as every other command group does, instead of printing the group's help and exiting 0. A bare group and `--help` still print help.

  * `unity templates create` says `The output folder does not exist: <path>` for a `--output` folder that is missing, and tells you to pick another `--name` or add `--overwrite` when the template already exists, instead of printing an internal error name. The same sentence is in the `message` of the JSON and NDJSON error.

  * `unity pipeline install` and `unity pipeline upgrade` no longer crash when the current directory can't be read (a permission refusal such as macOS blocking a protected folder). They skip it and use the running Unity Editor, or ask you to pass `--project-path` when none is running.

  * Inside Claude Code, the CLI no longer suggests installing the Unity plugin when Claude Code already has the Unity skills from `unity skill install`. The plugin would list the same skills a second time.

  * An Editor opened with `unity open` while Unity Hub is closed no longer logs `IPC stream failed to write (Timed out)` warnings during a domain reload. The CLI keeps reading the Editor’s requests while an earlier answer is still on its way.

  * `unity collaboration annotations export` with no `--target` asks for the whole project instead of one target path, which could return no annotations.

  * `unity ci init` refuses a project folder whose name holds a Unicode line or paragraph separator (U+2028, U+2029) with exit 2, the same refusal control characters already get. GitLab reads those characters as line breaks, so the generated `.gitlab-ci.yml` gained an extra line.

  * `unity recompile` no longer exits 7 with "socket hang up" when the compile it starts reloads the domain and resets the request. It keeps waiting for the compile and reports its result once it ends.

  * `unity job wait` exits non-zero for a detached `script eval` that threw, like the attached run does, instead of exiting 0.

  * `unity install <version> --dry-run` prints its plan under `--format tsv` and `--format ndjson`, where it used to print nothing and exit 0.

  * `unity auth revoke` now matches an application name exactly as `unity auth consumers` prints it, so a name holding a line break no longer turns into two identical rows when you revoke it.

  * `unity pipeline upgrade` no longer calls a Pipeline package pinned to a Git URL or branch already up to date. It says the package is kept on that Git pin and names it, and leaves the manifest as it is, as it does for a package pinned to a `file:` path (a local checkout).

  * `unity install <version> --force` now reinstalls the Editor in the folder it is already in, replacing the old files, instead of writing a second copy to a `<version>-<arch>` folder beside it. The same goes for `--download-directory` with `--force`.

  * `unity templates create` and `unity templates pack` now leave a project's embedded packages (the package folders under `Packages/`) out of the template archive, as `--keep-embedded-packages` describes, so a private embedded package no longer ships inside a shared template. Pass `--keep-embedded-packages` to include them.

  * `unity uninstall`, `unity editors prune --remove` and `unity editors upgrade --replace` no longer open an administrator password dialog when there is no terminal to answer it (input from a pipe or file, `--non-interactive`, CI, or `--format json`/`ndjson`/`tsv`). When an Editor folder holds files you can't delete, the command now stops with a usage error (exit code 2, code `UNINSTALL_ELEVATION_NEEDS_TERMINAL`) before anything is removed, and tells you to run it from a terminal or as root.

  * `HUB_FORMAT` is read again as the deprecated alias of `UNITY_FORMAT` when `UNITY_FORMAT` is not set. It raises the same deprecation warning as other deprecated spellings, in json `warnings` or on stderr.

  * `unity projects create` refuses a name that starts or ends with a space (exit 6, `Invalid project name`), as it already refuses a name ending in a period, instead of creating the project under the trimmed name.

  * `unity command`, `unity editors running` and `unity status` no longer fail and send a crash report when the folder you run them from has been deleted. They skip that folder and look for running Editors as usual.

  * `unity auth logout --format json` and `--format ndjson` print a success result (`{"signedOut": true}`) instead of the "You have been signed out." notice. The ndjson result is one `"type":"result"` line.

  * `unity auth logout <account> --format ndjson` prints one `"type":"result"` line with the same data as `--format json`, instead of the human notice.

  * `unity mcp configure --local` and `--list` report that the current directory cannot be read, with exit code 6, when the folder you run them from was deleted, instead of a generic refusal.

  * `unity self-update` now exits with code 1 and the error code `UPGRADE_NO_BINARY` when the release has no download for your platform, or `UPGRADE_NO_APPIMAGE` when it has no AppImage, instead of exit 6 with `COMMAND_FAILED`.

  * `unity collab read --timestamp` accepts a date in a form other than ISO 8601, such as `Fri, 02 Jan 2026 03:04:05 GMT`: it is sent to the service as its UTC time, instead of being rejected by the service. A value that is not a date, or is outside years 1 to 9999, is refused before any request is made.

  * `unity templates list --format json` gives every template `isUserGenerated` and `isNew` fields, `false` when a template is neither, so a script can read both on each item.

  * `unity projects clone --ref` now accepts a commit id, full or abbreviated, as its help says: the repository is cloned and that commit is checked out. Before, a commit id failed with `Remote branch <sha> not found in upstream origin`.

  * `unity projects open a b` now exits 2 with the too-many-arguments usage error, as `unity open a b` does, instead of exiting 1 with `UNSUPPORTED_STATE`.
