# Unity CLI v1.0.0-beta.16

### 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. While the Pipeline package's server is not running yet, `unity command editor status` warns that the Editor is not ready, shows the state of the editor lifecycle instead, and exits `17`. Other Editors work as before.

- `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. Unity's agent plugin runs it when a session starts.

- 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. It leaves a copy you edited alone unless you pass `--yes`. Both take `--dry-run`.

- `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. The project gets the Remote Config package and a script that reads the switch. `--bare` leaves it out.

- `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. In `--format json` the result carries `viaRunningEditor: true`.

- `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. For example, `unity vcs summarize --since main --objects`.

- `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. Without it, large scenes and prefabs are still capped, and the hint now names `--full`.

- `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. Piped input reaches the command, Ctrl-C asks it to stop (press it again to stop waiting), and the CLI exits with the command's own exit code.

- 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. A busy Editor's exit code `102` is returned instead of waited out, and an unknown command or bad arguments print the Editor's message and exit code instead of the CLI's error. `--result-only` is unchanged.

- `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`. In `--json` output, `errors[0].code` is `EDITOR_BUSY` or `EDITOR_BLOCKED_BY_DIALOG`.

- `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. The `unity mcp` server's instructions now say the CLI is preferred when a client can run shell commands.

- `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`. In these commands a timeout exits `14` and a reset connection `6`, and so does the Unity Cloud step of `unity projects create`, `unity projects link cloud` and `unity projects upgrade`, which exited `7` for both.

- `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. Run `unity setup` afterwards to add Unity's agent plugin.

- `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. An unreachable sign-in service, a credential store that refused a read, or a failed save of refreshed sign-in tokens reports its own message instead. Only a lost session still asks you to run `unity auth login`. For these failures the `unity collab` thumbnail commands now exit with code 6 instead of 3; exit code 3 still means a lost session.

- 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. It now prints the same rows as without `--quiet`, and so do `commands`, `editors`, `editors running`, `editors upgrade`, `license status`, `auth accounts`, `cloud org list`, `cloud project list`, `projects report`, `status` and the other commands that print a tsv table. `--quiet` still hides notices, warnings and progress, and its effect on human and json output is unchanged.

- `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 diagnose proxy --proxy <url>` and these two views no longer list `UNITY_NOPROXY` hosts as bypassed, because requests never skipped the proxy for them.

- `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. Use `--format human` for the sentences.

- `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 create --open` checks the same way before it opens the new project.

- `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. It now exits 6 with `EDITORS_ADD_NOT_VALID_EDITOR` unless the Editor's folder is named like a version (`6000.0.32f1`, or `Unity-6000.0.32f1`). `--skip-signature-check` only skips the signature check.

- `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. Pass `--yes` to install without asking.

- `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. A page larger than 8 MiB now says it is too large instead of "unable to reach docs.unity.com".

- `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 install-modules --all` with everything installed also answers `--format json` and `ndjson` with the empty plan now, where it printed nothing. A module name the Editor does not have still fails.

- `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. Re-run `unity completion powershell | Out-String | Invoke-Expression`, or refresh the line in your `$PROFILE`, to pick it up.

- 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. Before, only the rows already shown refreshed, so the list never changed.

- 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. Re-run `unity completion bash`, `unity completion zsh` or `unity completion powershell` and reload the script to pick it up.

- 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. Other templates commands no longer overwrite such a file either, except `unity templates create --output`, which still rebuilds the file from the defaults.

- `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. It used to exit 6. A drain-all listing whose page times out now exits 14 (timeout) instead of 6.

- `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. An Editor whose recorded architecture is not text is never removed. `unity editors upgrade --replace` stops before installing the new patch when the Editor to replace is one of those.

- `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. Exit codes are unchanged.

- `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. A relative `--project-path`, or a running Editor opened with a relative project path, needs a readable directory, so pass an absolute `--project-path` instead.

- 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. An Editor that stays silent after a reset still exits 7.

- `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). A pin that is none of a version, a `file:` path or a Git URL is moved to the latest version.

- `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`. On macOS and Linux it stops with an error if an Editor is running from that folder, or if it cannot check.

- `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. On a terminal, one line says why the password is needed before the dialog opens.

- `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. An empty `HUB_FORMAT` is ignored.

- `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 editors running` shows an empty list when none is found.

- `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. When service-account credentials come from environment variables, the result carries the "unset the variables" hint in `warnings`.

- `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`. A branch or a tag clones as before.

- `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`.
