# Package Manager commands These commands query and modify the project's UPM package set (list, search, add, remove, resolve, status) over `UnityEditor.PackageManager`. Read-only queries block until the registry responds and return synchronously; mutating commands (`package_add`/`package_remove`) require `confirm=true`, support `dry_run` previews, and are async by default (poll `package_status`) with an optional `wait=true` to block until done. ### `package_list` List packages by scope: installed (default) | available (registry) | all (both). Returns the full result synchronously — available/all block until the registry query completes. | Parameter | Required | Default | Description | |-----------|----------|---------|-------------| | `scope` | no | `installed` | Which packages to list: installed (default) | available | all. | | `include_indirect` | no | `true` | Include indirect (transitive) installed dependencies (applies to scope=installed/all). | | `offline` | no | `false` | For available/all: query the local cache instead of the registry. | **Returns:** `object` **Notes:** `MainThreadRequired = false`. Synchronous — `available`/`all` start a registry query and block until it completes (up to a 25s timeout); `installed` reads the resolved set inline on the main thread. ### `package_search` Search packages available in the registry. Provide a name (e.g. com.unity.foo) or omit to list all. Returns the full result synchronously (blocks until the registry query completes). | Parameter | Required | Default | Description | |-----------|----------|---------|-------------| | `query` | no | `–` | Package name to search for. Omit/empty to list all available packages. | | `offline` | no | `false` | Search the local cache only. | **Returns:** `object` **Notes:** `MainThreadRequired = false`. Synchronous — blocks until the registry query completes (up to a 25s timeout). Each result is flagged with whether it is currently installed. ### `package_add` Add a UPM package by name@version, git URL, or 'file:' local path. Async by default (returns in_progress; poll package_status); pass wait=true to block until added. A recompile/domain reload follows — poll recompile_status. Requires confirm=true; use dry_run to preview. | Parameter | Required | Default | Description | |-----------|----------|---------|-------------| | `identifier` | yes | `–` | Package to add: 'com.unity.foo@1.2.3', a git URL, or 'file:../Path'. | | `confirm` | no | `false` | Apply the change. Without it the call is refused. | | `dry_run` | no | `false` | Preview the change without applying it. | | `wait` | no | `false` | Block until the operation completes and return the result (synchronous). Default: return immediately and poll package_status. | **Returns:** `object` **Notes:** `MainThreadRequired = false`. Mutating — requires `confirm=true`; `dry_run=true` returns a preview without applying. Async by default (returns `in_progress`; poll `package_status`); with `wait=true` it blocks until completion (up to a 25s timeout). A successful add triggers a recompile/domain reload — poll `recompile_status`. Returns `busy` if another package operation is already in progress. ### `package_remove` Remove a UPM package by name. Async by default (returns in_progress; poll package_status); pass wait=true to block until removed. A recompile/domain reload follows — poll recompile_status. Requires confirm=true; use dry_run to preview. | Parameter | Required | Default | Description | |-----------|----------|---------|-------------| | `name` | yes | `–` | Package name to remove (e.g. com.unity.foo). | | `confirm` | no | `false` | Apply the change. Without it the call is refused. | | `dry_run` | no | `false` | Preview the change without applying it. | | `wait` | no | `false` | Block until the operation completes and return the result (synchronous). Default: return immediately and poll package_status. | **Returns:** `object` **Notes:** `MainThreadRequired = false`. Mutating — requires `confirm=true`; `dry_run=true` returns a preview without applying. Async by default (returns `in_progress`; poll `package_status`); with `wait=true` it blocks until completion (up to a 25s timeout). A successful remove triggers a recompile/domain reload — poll `recompile_status`; the reload can drop a synchronous reply, so `package_status` confirms the outcome. Returns `busy` if another package operation is already in progress. ### `package_resolve` Resolve/refresh packages from the manifest (re-fetch and re-link). May trigger a recompile/domain reload — poll recompile_status. Its outcome is recorded for package_status. No parameters. **Returns:** `object` **Notes:** `MainThreadRequired = true`. Fire-and-forget — `Client.Resolve()` schedules a resolve on a later tick, so the response returns before any reload. May trigger a recompile/domain reload — poll `recompile_status`. Its outcome is recorded in the status file, so `package_status` validates it. ### `package_status` Status of the last async package operation (add/remove/resolve): idle | in_progress | completed | failed, with the added package, manifest, and any error. No parameters. **Returns:** `string` **Notes:** `MainThreadRequired = false`. Reads a Temp status file that survives the domain reload an add/remove/resolve triggers, so a lost synchronous reply or an interrupted async op is recoverable by polling. Returns `{"status":"idle"}` when no operation has run. See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md).