unity-mcp-cli 0.51.6 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +306 -0
- package/bin/{unity-mcp.js → unity-mcp-cli.js} +2 -2
- package/dist/commands/configure.js +9 -3
- package/dist/commands/configure.js.map +1 -1
- package/dist/commands/connect.js +23 -6
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/create-project.js +16 -13
- package/dist/commands/create-project.js.map +1 -1
- package/dist/commands/install-editor.js +13 -10
- package/dist/commands/install-editor.js.map +1 -1
- package/dist/commands/install-plugin.js +9 -3
- package/dist/commands/install-plugin.js.map +1 -1
- package/dist/commands/open.js +13 -7
- package/dist/commands/open.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/config.js +5 -5
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/manifest.js +13 -7
- package/dist/utils/manifest.js.map +1 -1
- package/dist/utils/unity-editor.d.ts +2 -2
- package/dist/utils/unity-editor.js +19 -7
- package/dist/utils/unity-editor.js.map +1 -1
- package/dist/utils/unity-hub.d.ts +16 -1
- package/dist/utils/unity-hub.js +214 -9
- package/dist/utils/unity-hub.js.map +1 -1
- package/package.json +47 -44
package/README.md
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
<div align="center" width="100%">
|
|
2
|
+
<h1>Unity MCP — <i>CLI</i></h1>
|
|
3
|
+
|
|
4
|
+
[](https://www.npmjs.com/package/unity-mcp-cli)
|
|
5
|
+
[](https://nodejs.org/)
|
|
6
|
+
[](https://github.com/IvanMurzak/Unity-MCP/blob/main/LICENSE)
|
|
7
|
+
[](https://stand-with-ukraine.pp.ua)
|
|
8
|
+
|
|
9
|
+
<img src="https://github.com/IvanMurzak/Unity-MCP/raw/main/docs/img/promo/ai-developer-banner-glitch.gif" alt="AI Game Developer" title="Unity MCP CLI" width="100%">
|
|
10
|
+
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
Cross-platform CLI tool for **[Unity MCP](https://github.com/IvanMurzak/Unity-MCP)** — create projects, install plugins, configure MCP tools, and launch Unity with active MCP connections. All from a single command line.
|
|
14
|
+
|
|
15
|
+
## 
|
|
16
|
+
|
|
17
|
+
- :white_check_mark: **Create projects** — scaffold new Unity projects via Unity Editor
|
|
18
|
+
- :white_check_mark: **Install editors** — install any Unity Editor version from the command line
|
|
19
|
+
- :white_check_mark: **Install plugin** — add Unity-MCP plugin to `manifest.json` with all required scoped registries
|
|
20
|
+
- :white_check_mark: **Configure** — enable/disable MCP tools, prompts, and resources
|
|
21
|
+
- :white_check_mark: **Connect** — launch Unity with MCP environment variables for automated server connection
|
|
22
|
+
- :white_check_mark: **Cross-platform** — Windows, macOS, and Linux
|
|
23
|
+
- :white_check_mark: **Version-aware** — never downgrades plugin versions, resolves latest from OpenUPM
|
|
24
|
+
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
# Quick Start
|
|
28
|
+
|
|
29
|
+
Run any command instantly with `npx` — no installation required:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx unity-mcp-cli install-plugin /path/to/unity/project
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Or install globally:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install -g unity-mcp-cli
|
|
39
|
+
unity-mcp-cli install-plugin /path/to/unity/project
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
> **Requirements:** [Node.js](https://nodejs.org/) >= 18. [Unity Hub](https://unity.com/download) is installed automatically if not found.
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
# Contents
|
|
47
|
+
|
|
48
|
+
- [Quick Start](#quick-start)
|
|
49
|
+
- [Commands](#commands)
|
|
50
|
+
- [`create-project`](#create-project) — Create a new Unity project
|
|
51
|
+
- [`install-editor`](#install-editor) — Install Unity Editor via Unity Hub
|
|
52
|
+
- [`open`](#open) — Open a Unity project in the Editor
|
|
53
|
+
- [`install-plugin`](#install-plugin) — Install Unity-MCP plugin into a project
|
|
54
|
+
- [`configure`](#configure) — Configure MCP tools, prompts, and resources
|
|
55
|
+
- [`connect`](#connect) — Launch Unity with MCP connection
|
|
56
|
+
- [Full Automation Example](#full-automation-example)
|
|
57
|
+
- [How It Works](#how-it-works)
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
# Commands
|
|
62
|
+
|
|
63
|
+
## `create-project`
|
|
64
|
+
|
|
65
|
+
Create a new Unity project using the Unity Editor.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx unity-mcp-cli create-project /path/to/new/project
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| Option | Required | Description |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| `[path]` | Yes | Path where the project will be created (positional or `--path`) |
|
|
74
|
+
| `--unity <version>` | No | Unity Editor version to use (defaults to highest installed) |
|
|
75
|
+
|
|
76
|
+
**Example — create a project with a specific editor version:**
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx unity-mcp-cli create-project ./MyGame --unity 2022.3.62f1
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+

|
|
83
|
+
|
|
84
|
+
## `install-editor`
|
|
85
|
+
|
|
86
|
+
Install a Unity Editor version via Unity Hub CLI.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx unity-mcp-cli install-editor --version 6000.3.1f1
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
| Option | Required | Description |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `--version <version>` | No | Unity Editor version to install |
|
|
95
|
+
| `--path <path>` | No | Read the required version from an existing project |
|
|
96
|
+
|
|
97
|
+
If neither option is provided, the command lists currently installed editors.
|
|
98
|
+
|
|
99
|
+
**Example — install the editor version that a project needs:**
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npx unity-mcp-cli install-editor --path ./MyGame
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+

|
|
106
|
+
|
|
107
|
+
## `open`
|
|
108
|
+
|
|
109
|
+
Open a Unity project in the Unity Editor.
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npx unity-mcp-cli open ./MyGame
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
| Option | Required | Description |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `[path]` | Yes | Path to the Unity project (positional or `--path`) |
|
|
118
|
+
| `--unity <version>` | No | Specific Unity Editor version to use (defaults to version from project settings, falls back to highest installed) |
|
|
119
|
+
|
|
120
|
+
The editor process is spawned in detached mode — the CLI returns immediately.
|
|
121
|
+
|
|
122
|
+

|
|
123
|
+
|
|
124
|
+
## `install-plugin`
|
|
125
|
+
|
|
126
|
+
Install the Unity-MCP plugin into a Unity project's `Packages/manifest.json`.
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npx unity-mcp-cli install-plugin ./MyGame
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
| Option | Required | Description |
|
|
133
|
+
|---|---|---|
|
|
134
|
+
| `[path]` | Yes | Path to the Unity project (positional or `--path`) |
|
|
135
|
+
| `--plugin-version <version>` | No | Plugin version to install (defaults to latest from [OpenUPM](https://openupm.com/packages/com.ivanmurzak.unity.mcp/)) |
|
|
136
|
+
|
|
137
|
+
This command:
|
|
138
|
+
1. Adds the **OpenUPM scoped registry** with all required scopes
|
|
139
|
+
2. Adds `com.ivanmurzak.unity.mcp` to `dependencies`
|
|
140
|
+
3. **Never downgrades** — if a higher version is already installed, it is preserved
|
|
141
|
+
|
|
142
|
+
**Example — install a specific plugin version:**
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
npx unity-mcp-cli install-plugin ./MyGame --plugin-version 0.51.6
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
> After running this command, open the project in Unity Editor to complete the package installation.
|
|
149
|
+
|
|
150
|
+

|
|
151
|
+
|
|
152
|
+
## `configure`
|
|
153
|
+
|
|
154
|
+
Configure MCP tools, prompts, and resources in `UserSettings/AI-Game-Developer-Config.json`.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npx unity-mcp-cli configure ./MyGame --list
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
| Option | Required | Description |
|
|
161
|
+
|---|---|---|
|
|
162
|
+
| `[path]` | Yes | Path to the Unity project (positional or `--path`) |
|
|
163
|
+
| `--list` | No | List current configuration and exit |
|
|
164
|
+
| `--enable-tools <names>` | No | Enable specific tools (comma-separated) |
|
|
165
|
+
| `--disable-tools <names>` | No | Disable specific tools (comma-separated) |
|
|
166
|
+
| `--enable-all-tools` | No | Enable all tools |
|
|
167
|
+
| `--disable-all-tools` | No | Disable all tools |
|
|
168
|
+
| `--enable-prompts <names>` | No | Enable specific prompts (comma-separated) |
|
|
169
|
+
| `--disable-prompts <names>` | No | Disable specific prompts (comma-separated) |
|
|
170
|
+
| `--enable-all-prompts` | No | Enable all prompts |
|
|
171
|
+
| `--disable-all-prompts` | No | Disable all prompts |
|
|
172
|
+
| `--enable-resources <names>` | No | Enable specific resources (comma-separated) |
|
|
173
|
+
| `--disable-resources <names>` | No | Disable specific resources (comma-separated) |
|
|
174
|
+
| `--enable-all-resources` | No | Enable all resources |
|
|
175
|
+
| `--disable-all-resources` | No | Disable all resources |
|
|
176
|
+
|
|
177
|
+
**Example — enable specific tools and disable all prompts:**
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npx unity-mcp-cli configure ./MyGame \
|
|
181
|
+
--enable-tools gameobject-create,gameobject-find \
|
|
182
|
+
--disable-all-prompts
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Example — enable everything:**
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npx unity-mcp-cli configure ./MyGame \
|
|
189
|
+
--enable-all-tools \
|
|
190
|
+
--enable-all-prompts \
|
|
191
|
+
--enable-all-resources
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+

|
|
195
|
+
|
|
196
|
+
## `connect`
|
|
197
|
+
|
|
198
|
+
Open a Unity project and connect it to a specific MCP server via environment variables. Every option maps to a `UNITY_MCP_*` environment variable that the Unity plugin reads on startup.
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
npx unity-mcp-cli connect \
|
|
202
|
+
--path ./MyGame \
|
|
203
|
+
--url http://localhost:8080
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
| Option | Env Variable | Required | Description |
|
|
207
|
+
|---|---|---|---|
|
|
208
|
+
| `--url <url>` | `UNITY_MCP_HOST` | Yes | MCP server URL to connect to |
|
|
209
|
+
| `--path <path>` | — | Yes | Path to the Unity project |
|
|
210
|
+
| `--keep-connected` | `UNITY_MCP_KEEP_CONNECTED` | No | Force keep the connection alive |
|
|
211
|
+
| `--token <token>` | `UNITY_MCP_TOKEN` | No | Authentication token |
|
|
212
|
+
| `--auth <option>` | `UNITY_MCP_AUTH_OPTION` | No | Auth mode: `none` or `required` |
|
|
213
|
+
| `--tools <names>` | `UNITY_MCP_TOOLS` | No | Comma-separated list of tools to enable |
|
|
214
|
+
| `--transport <method>` | `UNITY_MCP_TRANSPORT` | No | Transport method: `streamableHttp` or `stdio` |
|
|
215
|
+
| `--start-server` / `--no-start-server` | `UNITY_MCP_START_SERVER` | No | Start or prevent MCP server auto-start in Unity Editor (only applies to `streamableHttp` transport) |
|
|
216
|
+
| `--unity <version>` | — | No | Specific Unity Editor version to use (defaults to version from project settings, falls back to highest installed) |
|
|
217
|
+
|
|
218
|
+
This command launches the Unity Editor with the corresponding `UNITY_MCP_*` environment variables so the plugin picks them up automatically on startup. The environment variables override values from the project's `UserSettings/AI-Game-Developer-Config.json` config file at runtime.
|
|
219
|
+
|
|
220
|
+
**Example — connect with authentication and specific tools:**
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npx unity-mcp-cli connect \
|
|
224
|
+
--path ./MyGame \
|
|
225
|
+
--url http://my-server:8080 \
|
|
226
|
+
--token my-secret-token \
|
|
227
|
+
--auth required \
|
|
228
|
+
--keep-connected \
|
|
229
|
+
--tools gameobject-create,gameobject-find,script-execute
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Example — connect with stdio transport (server managed by AI agent):**
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npx unity-mcp-cli connect \
|
|
236
|
+
--path ./MyGame \
|
|
237
|
+
--url http://localhost:8080 \
|
|
238
|
+
--transport stdio \
|
|
239
|
+
--no-start-server
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Example — connect with streamableHttp and auto-start server:**
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npx unity-mcp-cli connect \
|
|
246
|
+
--path ./MyGame \
|
|
247
|
+
--url http://localhost:8080 \
|
|
248
|
+
--transport streamableHttp \
|
|
249
|
+
--start-server \
|
|
250
|
+
--keep-connected
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+

|
|
254
|
+
|
|
255
|
+
# Full Automation Example
|
|
256
|
+
|
|
257
|
+
Set up a complete Unity MCP project from scratch in one script:
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
# 1. Create a new Unity project
|
|
261
|
+
npx unity-mcp-cli create-project ./MyAIGame --unity 6000.3.1f1
|
|
262
|
+
|
|
263
|
+
# 2. Install the Unity-MCP plugin
|
|
264
|
+
npx unity-mcp-cli install-plugin ./MyAIGame
|
|
265
|
+
|
|
266
|
+
# 3. Enable all MCP tools
|
|
267
|
+
npx unity-mcp-cli configure ./MyAIGame --enable-all-tools
|
|
268
|
+
|
|
269
|
+
# 4. Open the project with MCP connection
|
|
270
|
+
npx unity-mcp-cli connect \
|
|
271
|
+
--path ./MyAIGame \
|
|
272
|
+
--url http://localhost:8080 \
|
|
273
|
+
--keep-connected
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+

|
|
277
|
+
|
|
278
|
+
# How It Works
|
|
279
|
+
|
|
280
|
+
### Deterministic Port
|
|
281
|
+
|
|
282
|
+
The CLI generates a **deterministic port** for each Unity project based on its directory path (SHA256 hash mapped to port range 50000–59999). This matches the port generation in the Unity plugin, ensuring the server and plugin automatically agree on the same port without manual configuration.
|
|
283
|
+
|
|
284
|
+
### Plugin Installation
|
|
285
|
+
|
|
286
|
+
The `install-plugin` command modifies `Packages/manifest.json` directly:
|
|
287
|
+
- Adds the [OpenUPM](https://openupm.com/) scoped registry (`package.openupm.com`)
|
|
288
|
+
- Registers all required scopes (`com.ivanmurzak`, `extensions.unity`, `org.nuget.*`)
|
|
289
|
+
- Adds the `com.ivanmurzak.unity.mcp` dependency with version-aware updates (never downgrades)
|
|
290
|
+
|
|
291
|
+
### Configuration File
|
|
292
|
+
|
|
293
|
+
The `configure` command reads and writes `UserSettings/AI-Game-Developer-Config.json`, which controls:
|
|
294
|
+
- **Tools** — MCP tools available to AI agents
|
|
295
|
+
- **Prompts** — pre-defined prompts injected into LLM conversations
|
|
296
|
+
- **Resources** — read-only data exposed to AI agents
|
|
297
|
+
- **Connection settings** — host URL, auth token, transport method, timeouts
|
|
298
|
+
|
|
299
|
+
### Unity Hub Integration
|
|
300
|
+
|
|
301
|
+
Commands that manage editors or create projects use the **Unity Hub CLI** (`--headless` mode). If Unity Hub is not installed, the CLI **downloads and installs it automatically**:
|
|
302
|
+
- **Windows** — silent install via `UnityHubSetup.exe /S` (may require administrator privileges)
|
|
303
|
+
- **macOS** — downloads the DMG, mounts it, and copies `Unity Hub.app` to `/Applications`
|
|
304
|
+
- **Linux** — downloads `UnityHub.AppImage` to `~/Applications/`
|
|
305
|
+
|
|
306
|
+

|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import '../dist/index.js';
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import '../dist/index.js';
|
|
@@ -7,7 +7,8 @@ function parseCommaSeparated(value) {
|
|
|
7
7
|
}
|
|
8
8
|
export const configureCommand = new Command('configure')
|
|
9
9
|
.description('Configure MCP tools, prompts, and resources in AI-Game-Developer-Config.json')
|
|
10
|
-
.
|
|
10
|
+
.argument('[path]', 'Path to the Unity project')
|
|
11
|
+
.option('--path <path>', 'Path to the Unity project')
|
|
11
12
|
.option('--enable-tools <names>', 'Enable specific tools (comma-separated)', parseCommaSeparated)
|
|
12
13
|
.option('--disable-tools <names>', 'Disable specific tools (comma-separated)', parseCommaSeparated)
|
|
13
14
|
.option('--enable-all-tools', 'Enable all tools')
|
|
@@ -21,8 +22,13 @@ export const configureCommand = new Command('configure')
|
|
|
21
22
|
.option('--enable-all-resources', 'Enable all resources')
|
|
22
23
|
.option('--disable-all-resources', 'Disable all resources')
|
|
23
24
|
.option('--list', 'List current configuration')
|
|
24
|
-
.action(async (options) => {
|
|
25
|
-
const
|
|
25
|
+
.action(async (positionalPath, options) => {
|
|
26
|
+
const resolvedPath = positionalPath ?? options.path;
|
|
27
|
+
if (!resolvedPath) {
|
|
28
|
+
console.error('Error: Path is required. Usage: unity-mcp-cli configure <path> or --path <path>');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const projectPath = path.resolve(resolvedPath);
|
|
26
32
|
if (!fs.existsSync(projectPath)) {
|
|
27
33
|
console.error(`Error: Project path does not exist: ${projectPath}`);
|
|
28
34
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpF,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,8EAA8E,CAAC;KAC3F,
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -4,31 +4,33 @@ import * as fs from 'fs';
|
|
|
4
4
|
import { findEditorPath, getProjectEditorVersion, launchEditor } from '../utils/unity-editor.js';
|
|
5
5
|
export const connectCommand = new Command('connect')
|
|
6
6
|
.description('Open Unity and enforce MCP connection to a specified server URL via environment variables')
|
|
7
|
-
.requiredOption('--
|
|
7
|
+
.requiredOption('--path <path>', 'Path to the Unity project')
|
|
8
8
|
.requiredOption('--url <url>', 'MCP server URL to connect to')
|
|
9
9
|
.option('--tools <names>', 'Comma-separated list of tools to enable (sets UNITY_MCP_TOOLS)')
|
|
10
10
|
.option('--token <token>', 'Auth token (sets UNITY_MCP_TOKEN)')
|
|
11
11
|
.option('--auth <option>', 'Auth option: none or required (sets UNITY_MCP_AUTH_OPTION)')
|
|
12
12
|
.option('--keep-connected', 'Force keep connected (sets UNITY_MCP_KEEP_CONNECTED=true)')
|
|
13
|
-
.option('--
|
|
13
|
+
.option('--transport <method>', 'Transport method: streamableHttp or stdio (sets UNITY_MCP_TRANSPORT)')
|
|
14
|
+
.option('--start-server <value>', 'Set to true/false to control server auto-start (sets UNITY_MCP_START_SERVER)', undefined)
|
|
15
|
+
.option('--unity <version>', 'Specific Unity Editor version to use')
|
|
14
16
|
.action(async (options) => {
|
|
15
|
-
const projectPath = path.resolve(options.
|
|
17
|
+
const projectPath = path.resolve(options.path);
|
|
16
18
|
if (!fs.existsSync(projectPath)) {
|
|
17
19
|
console.error(`Error: Project path does not exist: ${projectPath}`);
|
|
18
20
|
process.exit(1);
|
|
19
21
|
}
|
|
20
22
|
// Determine editor version
|
|
21
|
-
let version = options.
|
|
23
|
+
let version = options.unity;
|
|
22
24
|
if (!version) {
|
|
23
25
|
version = getProjectEditorVersion(projectPath) ?? undefined;
|
|
24
26
|
if (version) {
|
|
25
27
|
console.log(`Detected editor version from project: ${version}`);
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
|
-
const editorPath = findEditorPath(version);
|
|
30
|
+
const editorPath = await findEditorPath(version);
|
|
29
31
|
if (!editorPath) {
|
|
30
32
|
const versionMsg = version ? ` (version ${version})` : '';
|
|
31
|
-
console.error(`Error: Unity Editor not found${versionMsg}. Install it with: unity-mcp install-editor --version <version>`);
|
|
33
|
+
console.error(`Error: Unity Editor not found${versionMsg}. Install it with: unity-mcp-cli install-editor --version <version>`);
|
|
32
34
|
process.exit(1);
|
|
33
35
|
}
|
|
34
36
|
// Build environment variables for MCP connection
|
|
@@ -51,6 +53,21 @@ export const connectCommand = new Command('connect')
|
|
|
51
53
|
}
|
|
52
54
|
env['UNITY_MCP_AUTH_OPTION'] = options.auth;
|
|
53
55
|
}
|
|
56
|
+
if (options.transport) {
|
|
57
|
+
if (options.transport !== 'streamableHttp' && options.transport !== 'stdio') {
|
|
58
|
+
console.error('Error: --transport must be "streamableHttp" or "stdio"');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
env['UNITY_MCP_TRANSPORT'] = options.transport;
|
|
62
|
+
}
|
|
63
|
+
if (options.startServer !== undefined) {
|
|
64
|
+
const val = options.startServer.toLowerCase();
|
|
65
|
+
if (val !== 'true' && val !== 'false') {
|
|
66
|
+
console.error('Error: --start-server must be "true" or "false"');
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
env['UNITY_MCP_START_SERVER'] = val;
|
|
70
|
+
}
|
|
54
71
|
console.log(`Connecting to MCP server: ${options.url}`);
|
|
55
72
|
console.log('Environment variables:');
|
|
56
73
|
for (const [key, value] of Object.entries(env)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEjG,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2FAA2F,CAAC;KACxG,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { ensureUnityHub, createProject, listInstalledEditors, findHighestEditor } from '../utils/unity-hub.js';
|
|
4
4
|
export const createProjectCommand = new Command('create-project')
|
|
5
5
|
.description('Create a new Unity project')
|
|
6
|
-
.
|
|
7
|
-
.option('--
|
|
8
|
-
.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
.argument('[path]', 'Path where the project will be created')
|
|
7
|
+
.option('--path <path>', 'Path where the project will be created')
|
|
8
|
+
.option('--unity <version>', 'Unity Editor version to use')
|
|
9
|
+
.action(async (positionalPath, options) => {
|
|
10
|
+
const resolvedPath = positionalPath ?? options.path;
|
|
11
|
+
if (!resolvedPath) {
|
|
12
|
+
console.error('Error: Path is required. Usage: unity-mcp-cli create-project <path> or --path <path>');
|
|
12
13
|
process.exit(1);
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
const hubPath = await ensureUnityHub();
|
|
16
|
+
let editorVersion = options.unity;
|
|
15
17
|
if (!editorVersion) {
|
|
16
|
-
// Use the
|
|
18
|
+
// Use the highest installed editor version
|
|
17
19
|
const editors = listInstalledEditors(hubPath);
|
|
18
20
|
if (editors.length === 0) {
|
|
19
|
-
console.error('Error: No Unity editors installed. Install one with: unity-mcp install-editor --version <version>');
|
|
21
|
+
console.error('Error: No Unity editors installed. Install one with: unity-mcp-cli install-editor --version <version>');
|
|
20
22
|
process.exit(1);
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
const highest = findHighestEditor(editors);
|
|
25
|
+
editorVersion = highest.version;
|
|
26
|
+
console.log(`No Unity version specified, using highest installed: ${editorVersion}`);
|
|
24
27
|
}
|
|
25
|
-
const projectPath = path.resolve(
|
|
28
|
+
const projectPath = path.resolve(resolvedPath);
|
|
26
29
|
createProject(hubPath, projectPath, editorVersion);
|
|
27
30
|
});
|
|
28
31
|
//# sourceMappingURL=create-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/commands/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/commands/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/G,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC9D,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,QAAQ,EAAE,wCAAwC,CAAC;KAC5D,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;KACjE,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAA0C,EAAE,EAAE;IAC/F,MAAM,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAC;QACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IAEvC,IAAI,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAElC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,2CAA2C;QAC3C,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,uGAAuG,CAAC,CAAC;YACvH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,wDAAwD,aAAa,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import { ensureUnityHub, installEditor, listInstalledEditors } from '../utils/unity-hub.js';
|
|
3
5
|
import { getProjectEditorVersion } from '../utils/unity-editor.js';
|
|
4
6
|
export const installEditorCommand = new Command('install-editor')
|
|
5
7
|
.description('Install Unity Editor via Unity Hub')
|
|
6
8
|
.option('--version <version>', 'Unity Editor version to install')
|
|
7
|
-
.option('--
|
|
9
|
+
.option('--path <path>', 'Read version from an existing Unity project')
|
|
8
10
|
.action(async (options) => {
|
|
9
|
-
const hubPath =
|
|
10
|
-
if (!hubPath) {
|
|
11
|
-
console.error('Error: Unity Hub not found. Please install Unity Hub first.');
|
|
12
|
-
process.exit(1);
|
|
13
|
-
}
|
|
11
|
+
const hubPath = await ensureUnityHub();
|
|
14
12
|
let version = options.version;
|
|
15
|
-
if (!version && options.
|
|
16
|
-
|
|
13
|
+
if (!version && options.path) {
|
|
14
|
+
const projectPath = path.resolve(options.path);
|
|
15
|
+
if (!fs.existsSync(projectPath)) {
|
|
16
|
+
console.error(`Error: Project path does not exist: ${projectPath}`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
version = getProjectEditorVersion(projectPath) ?? undefined;
|
|
17
20
|
if (version) {
|
|
18
21
|
console.log(`Detected editor version from project: ${version}`);
|
|
19
22
|
}
|
|
@@ -23,7 +26,7 @@ export const installEditorCommand = new Command('install-editor')
|
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
if (!version) {
|
|
26
|
-
console.error('Error: Please specify --version or --
|
|
29
|
+
console.error('Error: Please specify --version or --path');
|
|
27
30
|
// Show installed editors as a hint
|
|
28
31
|
const editors = listInstalledEditors(hubPath);
|
|
29
32
|
if (editors.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-editor.js","sourceRoot":"","sources":["../../src/commands/install-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install-editor.js","sourceRoot":"","sources":["../../src/commands/install-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC9D,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;KAChE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAA4C,EAAE,EAAE;IAC7D,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IAEvC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAE9B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;YAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAE3D,mCAAmC;QACnC,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACpE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,6BAA6B,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
|
|
@@ -4,10 +4,16 @@ import * as fs from 'fs';
|
|
|
4
4
|
import { addPluginToManifest, resolveLatestVersion } from '../utils/manifest.js';
|
|
5
5
|
export const installPluginCommand = new Command('install-plugin')
|
|
6
6
|
.description('Install Unity-MCP plugin into a Unity project')
|
|
7
|
-
.
|
|
7
|
+
.argument('[path]', 'Path to the Unity project')
|
|
8
|
+
.option('--path <path>', 'Path to the Unity project')
|
|
8
9
|
.option('--plugin-version <version>', 'Plugin version to install (default: latest)')
|
|
9
|
-
.action(async (options) => {
|
|
10
|
-
const
|
|
10
|
+
.action(async (positionalPath, options) => {
|
|
11
|
+
const resolvedPath = positionalPath ?? options.path;
|
|
12
|
+
if (!resolvedPath) {
|
|
13
|
+
console.error('Error: Path is required. Usage: unity-mcp-cli install-plugin <path> or --path <path>');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const projectPath = path.resolve(resolvedPath);
|
|
11
17
|
// Validate project exists
|
|
12
18
|
const manifestPath = path.join(projectPath, 'Packages', 'manifest.json');
|
|
13
19
|
if (!fs.existsSync(manifestPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../../src/commands/install-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC9D,WAAW,CAAC,+CAA+C,CAAC;KAC5D,
|
|
1
|
+
{"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../../src/commands/install-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC9D,WAAW,CAAC,+CAA+C,CAAC;KAC5D,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,4BAA4B,EAAE,6CAA6C,CAAC;KACnF,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAAkD,EAAE,EAAE;IACvG,MAAM,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAC;QACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,0BAA0B;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IACzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,sEAAsE,WAAW,EAAE,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,OAAO,UAAU,WAAW,EAAE,CAAC,CAAC;IAC5E,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC"}
|
package/dist/commands/open.js
CHANGED
|
@@ -4,26 +4,32 @@ import * as fs from 'fs';
|
|
|
4
4
|
import { findEditorPath, getProjectEditorVersion, launchEditor } from '../utils/unity-editor.js';
|
|
5
5
|
export const openCommand = new Command('open')
|
|
6
6
|
.description('Open a Unity project in Unity Editor')
|
|
7
|
-
.
|
|
8
|
-
.option('--
|
|
9
|
-
.
|
|
10
|
-
|
|
7
|
+
.argument('[path]', 'Path to the Unity project')
|
|
8
|
+
.option('--path <path>', 'Path to the Unity project')
|
|
9
|
+
.option('--unity <version>', 'Specific Unity Editor version to use')
|
|
10
|
+
.action(async (positionalPath, options) => {
|
|
11
|
+
const resolvedPath = positionalPath ?? options.path;
|
|
12
|
+
if (!resolvedPath) {
|
|
13
|
+
console.error('Error: Path is required. Usage: unity-mcp-cli open <path> or --path <path>');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const projectPath = path.resolve(resolvedPath);
|
|
11
17
|
if (!fs.existsSync(projectPath)) {
|
|
12
18
|
console.error(`Error: Project path does not exist: ${projectPath}`);
|
|
13
19
|
process.exit(1);
|
|
14
20
|
}
|
|
15
21
|
// Determine editor version
|
|
16
|
-
let version = options.
|
|
22
|
+
let version = options.unity;
|
|
17
23
|
if (!version) {
|
|
18
24
|
version = getProjectEditorVersion(projectPath) ?? undefined;
|
|
19
25
|
if (version) {
|
|
20
26
|
console.log(`Detected editor version from project: ${version}`);
|
|
21
27
|
}
|
|
22
28
|
}
|
|
23
|
-
const editorPath = findEditorPath(version);
|
|
29
|
+
const editorPath = await findEditorPath(version);
|
|
24
30
|
if (!editorPath) {
|
|
25
31
|
const versionMsg = version ? ` (version ${version})` : '';
|
|
26
|
-
console.error(`Error: Unity Editor not found${versionMsg}. Install it with: unity-mcp install-editor --version <version>`);
|
|
32
|
+
console.error(`Error: Unity Editor not found${versionMsg}. Install it with: unity-mcp-cli install-editor --version <version>`);
|
|
27
33
|
process.exit(1);
|
|
28
34
|
}
|
|
29
35
|
console.log(`Opening project: ${projectPath}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEjG,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,sCAAsC,CAAC;KACnD,
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEjG,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAA0C,EAAE,EAAE;IAC/F,MAAM,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,gCAAgC,UAAU,qEAAqE,CAAC,CAAC;QAC/H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC3C,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ const require = createRequire(import.meta.url);
|
|
|
10
10
|
const pkg = require('../package.json');
|
|
11
11
|
const program = new Command();
|
|
12
12
|
program
|
|
13
|
-
.name('unity-mcp')
|
|
13
|
+
.name('unity-mcp-cli')
|
|
14
14
|
.description('Cross-platform CLI tool for Unity-MCP operations')
|
|
15
15
|
.version(pkg.version);
|
|
16
16
|
program.addCommand(createProjectCommand);
|