unity-mcp-cli 0.51.6 → 0.53.1
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 +333 -0
- package/bin/{unity-mcp.js → unity-mcp-cli.js} +2 -2
- package/dist/commands/configure.js +22 -15
- package/dist/commands/configure.js.map +1 -1
- package/dist/commands/connect.js +37 -14
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/create-project.js +25 -13
- package/dist/commands/create-project.js.map +1 -1
- package/dist/commands/install-plugin.js +15 -6
- package/dist/commands/install-plugin.js.map +1 -1
- package/dist/commands/install-unity.d.ts +2 -0
- package/dist/commands/install-unity.js +59 -0
- package/dist/commands/install-unity.js.map +1 -0
- package/dist/commands/open.js +21 -11
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/remove-plugin.d.ts +2 -0
- package/dist/commands/remove-plugin.js +27 -0
- package/dist/commands/remove-plugin.js.map +1 -0
- package/dist/index.js +26 -10
- 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.d.ts +6 -0
- package/dist/utils/manifest.js +40 -13
- package/dist/utils/manifest.js.map +1 -1
- package/dist/utils/ui.d.ts +50 -0
- package/dist/utils/ui.js +136 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/utils/unity-editor.d.ts +2 -2
- package/dist/utils/unity-editor.js +26 -8
- package/dist/utils/unity-editor.js.map +1 -1
- package/dist/utils/unity-hub.d.ts +16 -1
- package/dist/utils/unity-hub.js +244 -13
- package/dist/utils/unity-hub.js.map +1 -1
- package/docs/README.es.md +333 -0
- package/docs/README.ja.md +333 -0
- package/docs/README.zh-CN.md +333 -0
- package/package.json +50 -44
- package/dist/commands/install-editor.d.ts +0 -2
- package/dist/commands/install-editor.js +0 -46
- package/dist/commands/install-editor.js.map +0 -1
package/dist/utils/ui.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import boxen from 'boxen';
|
|
4
|
+
/**
|
|
5
|
+
* Apply styled help formatting to a Commander command.
|
|
6
|
+
* Call this on every Command instance (root and subcommands)
|
|
7
|
+
* so that --help / -h always renders the fancy UI.
|
|
8
|
+
*
|
|
9
|
+
* @param appVersion - The CLI version string, shown in the root banner.
|
|
10
|
+
*/
|
|
11
|
+
export function configureStyledHelp(cmd, appVersion) {
|
|
12
|
+
cmd.configureHelp({
|
|
13
|
+
formatHelp(target, helper) {
|
|
14
|
+
const isRoot = !target.parent;
|
|
15
|
+
const lines = [];
|
|
16
|
+
// Banner for root, styled title for subcommands
|
|
17
|
+
if (isRoot && appVersion) {
|
|
18
|
+
lines.push(boxen(`${chalk.bold.cyan('Unity-MCP CLI')} ${chalk.dim(`v${appVersion}`)}\n${chalk.dim('Bridge LLMs with Unity via Model Context Protocol')}`, {
|
|
19
|
+
padding: { top: 0, bottom: 0, left: 2, right: 2 },
|
|
20
|
+
borderColor: 'cyan',
|
|
21
|
+
borderStyle: 'round',
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
lines.push(boxen(`${chalk.bold.cyan(target.name())} ${chalk.dim('\u2014')} ${target.description()}`, {
|
|
26
|
+
padding: { top: 0, bottom: 0, left: 2, right: 2 },
|
|
27
|
+
borderColor: 'cyan',
|
|
28
|
+
borderStyle: 'round',
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
lines.push('');
|
|
32
|
+
// Usage
|
|
33
|
+
lines.push(`${chalk.bold('Usage:')} ${chalk.yellow(helper.commandUsage(target))}`);
|
|
34
|
+
lines.push('');
|
|
35
|
+
// Subcommands
|
|
36
|
+
const subcommands = helper.visibleCommands(target);
|
|
37
|
+
if (subcommands.length > 0) {
|
|
38
|
+
lines.push(chalk.bold('Commands:'));
|
|
39
|
+
for (const sub of subcommands) {
|
|
40
|
+
lines.push(` ${chalk.yellow(sub.name().padEnd(20))} ${chalk.dim(sub.description() || '')}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push('');
|
|
43
|
+
}
|
|
44
|
+
// Arguments
|
|
45
|
+
const args = helper.visibleArguments(target);
|
|
46
|
+
if (args.length > 0) {
|
|
47
|
+
lines.push(chalk.bold('Arguments:'));
|
|
48
|
+
for (const arg of args) {
|
|
49
|
+
lines.push(` ${chalk.green(helper.argumentTerm(arg).padEnd(30))} ${chalk.dim(helper.argumentDescription(arg))}`);
|
|
50
|
+
}
|
|
51
|
+
lines.push('');
|
|
52
|
+
}
|
|
53
|
+
// Options
|
|
54
|
+
const options = helper.visibleOptions(target);
|
|
55
|
+
if (options.length > 0) {
|
|
56
|
+
lines.push(chalk.bold('Options:'));
|
|
57
|
+
for (const opt of options) {
|
|
58
|
+
lines.push(` ${chalk.green(helper.optionTerm(opt).padEnd(30))} ${chalk.dim(helper.optionDescription(opt))}`);
|
|
59
|
+
}
|
|
60
|
+
lines.push('');
|
|
61
|
+
}
|
|
62
|
+
// Footer
|
|
63
|
+
if (isRoot) {
|
|
64
|
+
lines.push(chalk.dim('Run ') +
|
|
65
|
+
chalk.yellow('unity-mcp-cli <command> --help') +
|
|
66
|
+
chalk.dim(' for detailed usage of each command.'));
|
|
67
|
+
lines.push('');
|
|
68
|
+
}
|
|
69
|
+
return lines.join('\n');
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return cmd;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Print a success message with a green checkmark.
|
|
76
|
+
*/
|
|
77
|
+
export function success(msg) {
|
|
78
|
+
console.log(`${chalk.green('\u2714')} ${msg}`);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Print an error message with a red cross to stderr.
|
|
82
|
+
*/
|
|
83
|
+
export function error(msg) {
|
|
84
|
+
console.error(`${chalk.red('\u2716')} ${chalk.red(msg)}`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Print an info message with a blue info symbol.
|
|
88
|
+
*/
|
|
89
|
+
export function info(msg) {
|
|
90
|
+
console.log(`${chalk.blue('\u2139')} ${msg}`);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Print a warning message with a yellow warning symbol.
|
|
94
|
+
*/
|
|
95
|
+
export function warn(msg) {
|
|
96
|
+
console.log(`${chalk.yellow('\u26A0')} ${chalk.yellow(msg)}`);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Print a bold cyan section heading.
|
|
100
|
+
*/
|
|
101
|
+
export function heading(msg) {
|
|
102
|
+
console.log(`\n${chalk.bold.cyan(msg)}`);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Print a formatted key-value label.
|
|
106
|
+
*/
|
|
107
|
+
export function label(key, value) {
|
|
108
|
+
console.log(` ${chalk.bold(key + ':')} ${value}`);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Start an ora spinner with the given text. Returns the spinner instance.
|
|
112
|
+
*/
|
|
113
|
+
export function startSpinner(text) {
|
|
114
|
+
return ora({ text, color: 'cyan' }).start();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format a status badge (enabled/disabled).
|
|
118
|
+
*/
|
|
119
|
+
export function badge(enabled) {
|
|
120
|
+
return enabled
|
|
121
|
+
? chalk.bgGreen.black('[enabled]')
|
|
122
|
+
: chalk.bgRed.white('[disabled]');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Print a feature row with a styled badge and name.
|
|
126
|
+
*/
|
|
127
|
+
export function featureRow(name, enabled) {
|
|
128
|
+
console.log(` ${badge(enabled)} ${name}`);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Print a divider line.
|
|
132
|
+
*/
|
|
133
|
+
export function divider() {
|
|
134
|
+
console.log(chalk.dim('\u2500'.repeat(50)));
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
export declare function getProjectEditorVersion(projectPath: string): string | null;
|
|
5
5
|
/**
|
|
6
6
|
* Find the Unity Editor binary path for a specific version.
|
|
7
|
-
* Uses Unity Hub to locate installed editors.
|
|
7
|
+
* Uses Unity Hub to locate installed editors. Installs Unity Hub automatically if needed.
|
|
8
8
|
*/
|
|
9
|
-
export declare function findEditorPath(version?: string): string | null
|
|
9
|
+
export declare function findEditorPath(version?: string): Promise<string | null>;
|
|
10
10
|
/**
|
|
11
11
|
* Launch Unity Editor with the given project path.
|
|
12
12
|
* Spawns a detached process and returns immediately.
|
|
@@ -2,7 +2,8 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { spawn } from 'child_process';
|
|
4
4
|
import { platform } from 'os';
|
|
5
|
-
import {
|
|
5
|
+
import { ensureUnityHub, listInstalledEditors } from './unity-hub.js';
|
|
6
|
+
import * as ui from './ui.js';
|
|
6
7
|
/**
|
|
7
8
|
* Compare two Unity version strings with numeric-aware sorting.
|
|
8
9
|
* Parses components like "2022.3.62f3" into [2022, 3, 62, "f", 3].
|
|
@@ -61,10 +62,10 @@ export function getProjectEditorVersion(projectPath) {
|
|
|
61
62
|
}
|
|
62
63
|
/**
|
|
63
64
|
* Find the Unity Editor binary path for a specific version.
|
|
64
|
-
* Uses Unity Hub to locate installed editors.
|
|
65
|
+
* Uses Unity Hub to locate installed editors. Installs Unity Hub automatically if needed.
|
|
65
66
|
*/
|
|
66
|
-
export function findEditorPath(version) {
|
|
67
|
-
const hubPath =
|
|
67
|
+
export async function findEditorPath(version) {
|
|
68
|
+
const hubPath = await ensureUnityHub().catch(() => null);
|
|
68
69
|
if (!hubPath) {
|
|
69
70
|
// Try common default locations
|
|
70
71
|
return findEditorPathByCommonLocations(version);
|
|
@@ -78,7 +79,7 @@ export function findEditorPath(version) {
|
|
|
78
79
|
if (match)
|
|
79
80
|
return getEditorBinary(match.path);
|
|
80
81
|
}
|
|
81
|
-
// Return the
|
|
82
|
+
// Return the highest installed editor by version-aware sorting
|
|
82
83
|
const sorted = [...editors].sort((a, b) => compareUnityVersions(b.version, a.version));
|
|
83
84
|
return getEditorBinary(sorted[0].path);
|
|
84
85
|
}
|
|
@@ -124,11 +125,16 @@ function findEditorPathByCommonLocations(version) {
|
|
|
124
125
|
break;
|
|
125
126
|
}
|
|
126
127
|
case 'linux': {
|
|
128
|
+
const home = process.env['HOME'];
|
|
127
129
|
if (version) {
|
|
128
130
|
candidates.push(`/opt/unity/hub/Editor/${version}/Editor/Unity`);
|
|
129
|
-
|
|
131
|
+
if (home)
|
|
132
|
+
candidates.push(path.join(home, 'Unity', 'Hub', 'Editor', version, 'Editor', 'Unity'));
|
|
130
133
|
}
|
|
131
|
-
|
|
134
|
+
const linuxBaseDirs = ['/opt/unity/hub/Editor'];
|
|
135
|
+
if (home)
|
|
136
|
+
linuxBaseDirs.push(path.join(home, 'Unity', 'Hub', 'Editor'));
|
|
137
|
+
for (const baseDir of linuxBaseDirs) {
|
|
132
138
|
if (fs.existsSync(baseDir)) {
|
|
133
139
|
try {
|
|
134
140
|
const versions = fs.readdirSync(baseDir).sort((a, b) => compareUnityVersions(b, a));
|
|
@@ -151,8 +157,15 @@ function findEditorPathByCommonLocations(version) {
|
|
|
151
157
|
}
|
|
152
158
|
/**
|
|
153
159
|
* Get the Unity binary path from an editor installation directory.
|
|
160
|
+
* Handles cases where the path already points to the executable
|
|
161
|
+
* (e.g. Unity Hub may return ".../Editor/Unity.exe" directly).
|
|
154
162
|
*/
|
|
155
163
|
function getEditorBinary(editorDir) {
|
|
164
|
+
const basename = path.basename(editorDir).toLowerCase();
|
|
165
|
+
// If the path already points to the executable, return it as-is
|
|
166
|
+
if (basename === 'unity.exe' || basename === 'unity') {
|
|
167
|
+
return editorDir;
|
|
168
|
+
}
|
|
156
169
|
const os = platform();
|
|
157
170
|
switch (os) {
|
|
158
171
|
case 'win32':
|
|
@@ -174,7 +187,12 @@ export function launchEditor(editorPath, projectPath, env) {
|
|
|
174
187
|
stdio: 'ignore',
|
|
175
188
|
env: { ...process.env, ...env },
|
|
176
189
|
});
|
|
190
|
+
child.on('spawn', () => {
|
|
191
|
+
ui.success(`Launched Unity Editor (PID: ${child.pid})`);
|
|
192
|
+
});
|
|
193
|
+
child.on('error', (err) => {
|
|
194
|
+
ui.error(`Failed to launch Unity Editor: ${err.message}`);
|
|
195
|
+
});
|
|
177
196
|
child.unref();
|
|
178
|
-
console.log(`Launched Unity Editor (PID: ${child.pid})`);
|
|
179
197
|
}
|
|
180
198
|
//# sourceMappingURL=unity-editor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unity-editor.js","sourceRoot":"","sources":["../../src/utils/unity-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"unity-editor.js","sourceRoot":"","sources":["../../src/utils/unity-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,15 @@
|
|
|
3
3
|
* Returns the path if found, or null.
|
|
4
4
|
*/
|
|
5
5
|
export declare function findUnityHub(): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Download and install Unity Hub silently.
|
|
8
|
+
* Supports Windows, macOS, and Linux.
|
|
9
|
+
*/
|
|
10
|
+
export declare function installUnityHub(): Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Find Unity Hub, or install it automatically if not found.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ensureUnityHub(): Promise<string>;
|
|
6
15
|
export interface InstalledEditor {
|
|
7
16
|
version: string;
|
|
8
17
|
path: string;
|
|
@@ -11,11 +20,17 @@ export interface InstalledEditor {
|
|
|
11
20
|
* List installed Unity editors via Unity Hub CLI.
|
|
12
21
|
*/
|
|
13
22
|
export declare function listInstalledEditors(hubPath: string): InstalledEditor[];
|
|
23
|
+
/**
|
|
24
|
+
* Find the installed editor with the highest version number.
|
|
25
|
+
*/
|
|
26
|
+
export declare function findHighestEditor(editors: InstalledEditor[]): InstalledEditor;
|
|
14
27
|
/**
|
|
15
28
|
* Install a Unity editor version via Unity Hub CLI.
|
|
16
29
|
*/
|
|
17
30
|
export declare function installEditor(hubPath: string, version: string): void;
|
|
18
31
|
/**
|
|
19
|
-
* Create a new Unity project
|
|
32
|
+
* Create a new Unity project using the Unity Editor directly.
|
|
33
|
+
* Unity Hub's headless CLI does not support a 'create' command in newer versions,
|
|
34
|
+
* so we invoke the editor binary with -createProject -quit -batchmode instead.
|
|
20
35
|
*/
|
|
21
36
|
export declare function createProject(hubPath: string, projectPath: string, editorVersion?: string): void;
|
package/dist/utils/unity-hub.js
CHANGED
|
@@ -1,23 +1,32 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { execFileSync, execSync } from 'child_process';
|
|
4
5
|
import { platform } from 'os';
|
|
6
|
+
import { get as httpsGet } from 'https';
|
|
7
|
+
import { get as httpGet } from 'http';
|
|
8
|
+
import * as ui from './ui.js';
|
|
9
|
+
const UNITY_HUB_DOWNLOAD_URLS = {
|
|
10
|
+
win32: 'https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.exe',
|
|
11
|
+
darwin: 'https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.dmg',
|
|
12
|
+
linux: 'https://public-cdn.cloud.unity3d.com/hub/prod/UnityHub.AppImage',
|
|
13
|
+
};
|
|
5
14
|
/**
|
|
6
15
|
* Detect the Unity Hub installation path based on the current platform.
|
|
7
16
|
* Returns the path if found, or null.
|
|
8
17
|
*/
|
|
9
18
|
export function findUnityHub() {
|
|
10
|
-
const
|
|
19
|
+
const plat = platform();
|
|
11
20
|
const candidates = [];
|
|
12
|
-
switch (
|
|
21
|
+
switch (plat) {
|
|
13
22
|
case 'win32':
|
|
14
|
-
candidates.push(path.join(process.env['PROGRAMFILES'] ?? 'C:\\Program Files', 'Unity Hub', 'Unity Hub.exe'),
|
|
23
|
+
candidates.push(path.join(process.env['PROGRAMFILES'] ?? 'C:\\Program Files', 'Unity Hub', 'Unity Hub.exe'), ...(process.env['LOCALAPPDATA'] ? [path.join(process.env['LOCALAPPDATA'], 'Programs', 'Unity Hub', 'Unity Hub.exe')] : []));
|
|
15
24
|
break;
|
|
16
25
|
case 'darwin':
|
|
17
26
|
candidates.push('/Applications/Unity Hub.app/Contents/MacOS/Unity Hub');
|
|
18
27
|
break;
|
|
19
28
|
case 'linux':
|
|
20
|
-
candidates.push('/usr/bin/unity-hub', '/snap/bin/unity-hub',
|
|
29
|
+
candidates.push('/usr/bin/unity-hub', '/snap/bin/unity-hub', ...(process.env['HOME'] ? [path.join(process.env['HOME'], 'Applications', 'Unity Hub.AppImage')] : []));
|
|
21
30
|
break;
|
|
22
31
|
}
|
|
23
32
|
for (const candidate of candidates) {
|
|
@@ -27,6 +36,140 @@ export function findUnityHub() {
|
|
|
27
36
|
}
|
|
28
37
|
return null;
|
|
29
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Download a file from a URL, following redirects.
|
|
41
|
+
*/
|
|
42
|
+
function downloadFile(url, destPath) {
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
const doGet = url.startsWith('https') ? httpsGet : httpGet;
|
|
45
|
+
doGet(url, (response) => {
|
|
46
|
+
// Follow redirects
|
|
47
|
+
if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
|
|
48
|
+
downloadFile(new URL(response.headers.location, url).toString(), destPath).then(resolve, reject);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (response.statusCode && response.statusCode !== 200) {
|
|
52
|
+
reject(new Error(`Download failed with status ${response.statusCode}`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const file = fs.createWriteStream(destPath);
|
|
56
|
+
response.pipe(file);
|
|
57
|
+
file.on('finish', () => { file.close(); resolve(); });
|
|
58
|
+
file.on('error', reject);
|
|
59
|
+
}).on('error', reject);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Download and install Unity Hub silently.
|
|
64
|
+
* Supports Windows, macOS, and Linux.
|
|
65
|
+
*/
|
|
66
|
+
export async function installUnityHub() {
|
|
67
|
+
const plat = platform();
|
|
68
|
+
const url = UNITY_HUB_DOWNLOAD_URLS[plat];
|
|
69
|
+
if (!url) {
|
|
70
|
+
throw new Error(`Unsupported platform for Unity Hub installation: ${plat}`);
|
|
71
|
+
}
|
|
72
|
+
const tmpDir = os.tmpdir();
|
|
73
|
+
switch (plat) {
|
|
74
|
+
case 'win32': {
|
|
75
|
+
const installerPath = path.join(tmpDir, 'UnityHubSetup.exe');
|
|
76
|
+
const spinner = ui.startSpinner('Downloading Unity Hub installer...');
|
|
77
|
+
try {
|
|
78
|
+
await downloadFile(url, installerPath);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
spinner.fail('Failed to download Unity Hub installer');
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
spinner.succeed('Unity Hub installer downloaded');
|
|
85
|
+
ui.info('Installing Unity Hub silently (may require administrator privileges)...');
|
|
86
|
+
try {
|
|
87
|
+
execFileSync(installerPath, ['/S'], { timeout: 300000, stdio: 'inherit' });
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
try {
|
|
91
|
+
fs.unlinkSync(installerPath);
|
|
92
|
+
}
|
|
93
|
+
catch { /* ignore */ }
|
|
94
|
+
}
|
|
95
|
+
const hubPath = findUnityHub();
|
|
96
|
+
if (!hubPath) {
|
|
97
|
+
throw new Error('Unity Hub was installed but could not be found. Try restarting your terminal.');
|
|
98
|
+
}
|
|
99
|
+
return hubPath;
|
|
100
|
+
}
|
|
101
|
+
case 'darwin': {
|
|
102
|
+
const dmgPath = path.join(tmpDir, 'UnityHubSetup.dmg');
|
|
103
|
+
const spinner = ui.startSpinner('Downloading Unity Hub installer...');
|
|
104
|
+
try {
|
|
105
|
+
await downloadFile(url, dmgPath);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
spinner.fail('Failed to download Unity Hub installer');
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
spinner.succeed('Unity Hub installer downloaded');
|
|
112
|
+
const installSpinner = ui.startSpinner('Installing Unity Hub...');
|
|
113
|
+
try {
|
|
114
|
+
const mountOutput = execSync(`hdiutil attach -nobrowse -noverify "${dmgPath}"`, { encoding: 'utf-8' });
|
|
115
|
+
const mountMatch = mountOutput.match(/\/Volumes\/.+/);
|
|
116
|
+
if (!mountMatch)
|
|
117
|
+
throw new Error('Failed to mount Unity Hub DMG');
|
|
118
|
+
const mountPoint = mountMatch[0].trim();
|
|
119
|
+
try {
|
|
120
|
+
execSync(`cp -R "${mountPoint}/Unity Hub.app" /Applications/`, { stdio: 'inherit' });
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
execSync(`hdiutil detach "${mountPoint}" -quiet`, { stdio: 'ignore' });
|
|
124
|
+
}
|
|
125
|
+
installSpinner.succeed('Unity Hub installed');
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
installSpinner.fail('Unity Hub installation failed');
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
try {
|
|
133
|
+
fs.unlinkSync(dmgPath);
|
|
134
|
+
}
|
|
135
|
+
catch { /* ignore */ }
|
|
136
|
+
}
|
|
137
|
+
const hubPath = findUnityHub();
|
|
138
|
+
if (!hubPath) {
|
|
139
|
+
throw new Error('Unity Hub was installed but could not be found.');
|
|
140
|
+
}
|
|
141
|
+
return hubPath;
|
|
142
|
+
}
|
|
143
|
+
case 'linux': {
|
|
144
|
+
const appDir = path.join(process.env['HOME'] ?? '', 'Applications');
|
|
145
|
+
const appImagePath = path.join(appDir, 'UnityHub.AppImage');
|
|
146
|
+
const spinner = ui.startSpinner('Downloading Unity Hub AppImage...');
|
|
147
|
+
fs.mkdirSync(appDir, { recursive: true });
|
|
148
|
+
try {
|
|
149
|
+
await downloadFile(url, appImagePath);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
spinner.fail('Failed to download Unity Hub AppImage');
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
fs.chmodSync(appImagePath, 0o755);
|
|
156
|
+
spinner.succeed(`Unity Hub installed at: ${appImagePath}`);
|
|
157
|
+
return appImagePath;
|
|
158
|
+
}
|
|
159
|
+
default:
|
|
160
|
+
throw new Error(`Unsupported platform: ${plat}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Find Unity Hub, or install it automatically if not found.
|
|
165
|
+
*/
|
|
166
|
+
export async function ensureUnityHub() {
|
|
167
|
+
const hubPath = findUnityHub();
|
|
168
|
+
if (hubPath)
|
|
169
|
+
return hubPath;
|
|
170
|
+
ui.warn('Unity Hub not found. Installing automatically...');
|
|
171
|
+
return installUnityHub();
|
|
172
|
+
}
|
|
30
173
|
/**
|
|
31
174
|
* List installed Unity editors via Unity Hub CLI.
|
|
32
175
|
*/
|
|
@@ -50,15 +193,49 @@ export function listInstalledEditors(hubPath) {
|
|
|
50
193
|
return editors;
|
|
51
194
|
}
|
|
52
195
|
catch (err) {
|
|
53
|
-
|
|
196
|
+
ui.warn(`Failed to list installed editors: ${err.message}`);
|
|
54
197
|
return [];
|
|
55
198
|
}
|
|
56
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Parse a Unity version string into comparable numeric parts.
|
|
202
|
+
* Handles formats like "2022.3.62f1", "6000.3.1f1", "2019.4.40f1".
|
|
203
|
+
*/
|
|
204
|
+
function parseUnityVersion(version) {
|
|
205
|
+
// Split on dots and letter boundaries: "2022.3.62f1" -> [2022, 3, 62, 1]
|
|
206
|
+
return version.split(/[.\-]/).flatMap(part => {
|
|
207
|
+
const sub = part.match(/^(\d+)([a-zA-Z]+)(\d+)$/);
|
|
208
|
+
if (sub)
|
|
209
|
+
return [parseInt(sub[1], 10), parseInt(sub[3], 10)];
|
|
210
|
+
const num = parseInt(part, 10);
|
|
211
|
+
return isNaN(num) ? [] : [num];
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Compare two Unity version strings. Returns positive if a > b, negative if a < b, 0 if equal.
|
|
216
|
+
*/
|
|
217
|
+
function compareUnityVersions(a, b) {
|
|
218
|
+
const partsA = parseUnityVersion(a);
|
|
219
|
+
const partsB = parseUnityVersion(b);
|
|
220
|
+
const len = Math.max(partsA.length, partsB.length);
|
|
221
|
+
for (let i = 0; i < len; i++) {
|
|
222
|
+
const diff = (partsA[i] ?? 0) - (partsB[i] ?? 0);
|
|
223
|
+
if (diff !== 0)
|
|
224
|
+
return diff;
|
|
225
|
+
}
|
|
226
|
+
return 0;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Find the installed editor with the highest version number.
|
|
230
|
+
*/
|
|
231
|
+
export function findHighestEditor(editors) {
|
|
232
|
+
return editors.reduce((highest, current) => compareUnityVersions(current.version, highest.version) > 0 ? current : highest);
|
|
233
|
+
}
|
|
57
234
|
/**
|
|
58
235
|
* Install a Unity editor version via Unity Hub CLI.
|
|
59
236
|
*/
|
|
60
237
|
export function installEditor(hubPath, version) {
|
|
61
|
-
|
|
238
|
+
ui.info(`Installing Unity Editor ${version} via Unity Hub...`);
|
|
62
239
|
try {
|
|
63
240
|
execFileSync(hubPath, ['--', '--headless', 'install', '--version', version], { encoding: 'utf-8', timeout: 600000, stdio: 'inherit' });
|
|
64
241
|
}
|
|
@@ -67,21 +244,75 @@ export function installEditor(hubPath, version) {
|
|
|
67
244
|
}
|
|
68
245
|
}
|
|
69
246
|
/**
|
|
70
|
-
*
|
|
247
|
+
* Resolve the Unity Editor executable path from an editor install path.
|
|
248
|
+
* The path from Unity Hub may already point to the executable (e.g. .../Editor/Unity.exe)
|
|
249
|
+
* or to the install root directory. This function handles both cases.
|
|
250
|
+
*/
|
|
251
|
+
function resolveEditorExecutable(editorPath) {
|
|
252
|
+
// If the path already points to an existing executable, use it directly
|
|
253
|
+
const basename = path.basename(editorPath).toLowerCase();
|
|
254
|
+
if (basename === 'unity.exe' || (basename === 'unity' && !fs.statSync(editorPath, { throwIfNoEntry: false })?.isDirectory())) {
|
|
255
|
+
if (fs.existsSync(editorPath)) {
|
|
256
|
+
return editorPath;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Otherwise, build the path from the install root
|
|
260
|
+
const os = platform();
|
|
261
|
+
const candidates = [];
|
|
262
|
+
switch (os) {
|
|
263
|
+
case 'win32':
|
|
264
|
+
candidates.push(path.join(editorPath, 'Editor', 'Unity.exe'), path.join(editorPath, 'Unity.exe'));
|
|
265
|
+
break;
|
|
266
|
+
case 'darwin':
|
|
267
|
+
candidates.push(path.join(editorPath, 'Unity.app', 'Contents', 'MacOS', 'Unity'), path.join(editorPath, 'Contents', 'MacOS', 'Unity'));
|
|
268
|
+
break;
|
|
269
|
+
default:
|
|
270
|
+
candidates.push(path.join(editorPath, 'Editor', 'Unity'), path.join(editorPath, 'Unity'));
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
for (const candidate of candidates) {
|
|
274
|
+
if (fs.existsSync(candidate)) {
|
|
275
|
+
return candidate;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Fallback: return the first candidate and let the caller handle the error
|
|
279
|
+
return candidates[0];
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Create a new Unity project using the Unity Editor directly.
|
|
283
|
+
* Unity Hub's headless CLI does not support a 'create' command in newer versions,
|
|
284
|
+
* so we invoke the editor binary with -createProject -quit -batchmode instead.
|
|
71
285
|
*/
|
|
72
286
|
export function createProject(hubPath, projectPath, editorVersion) {
|
|
73
|
-
|
|
287
|
+
// Find the editor install path
|
|
288
|
+
const editors = listInstalledEditors(hubPath);
|
|
289
|
+
if (editors.length === 0) {
|
|
290
|
+
throw new Error('No Unity editors installed. Install one with: unity-mcp-cli install-unity --version <version>');
|
|
291
|
+
}
|
|
292
|
+
let editor;
|
|
74
293
|
if (editorVersion) {
|
|
75
|
-
|
|
294
|
+
editor = editors.find(e => e.version === editorVersion);
|
|
295
|
+
if (!editor) {
|
|
296
|
+
throw new Error(`Unity Editor ${editorVersion} not found. Installed versions: ${editors.map(e => e.version).join(', ')}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
editor = findHighestEditor(editors);
|
|
301
|
+
}
|
|
302
|
+
const editorExe = resolveEditorExecutable(editor.path);
|
|
303
|
+
if (!fs.existsSync(editorExe)) {
|
|
304
|
+
throw new Error(`Unity Editor executable not found at: ${editorExe}`);
|
|
76
305
|
}
|
|
77
|
-
|
|
306
|
+
const args = ['-createProject', projectPath, '-quit', '-batchmode'];
|
|
307
|
+
ui.info(`Creating Unity project at: ${projectPath}`);
|
|
308
|
+
ui.label('Unity Editor', `${editor.version} (${editorExe})`);
|
|
78
309
|
try {
|
|
79
|
-
execFileSync(
|
|
310
|
+
execFileSync(editorExe, args, {
|
|
80
311
|
encoding: 'utf-8',
|
|
81
312
|
timeout: 120000,
|
|
82
313
|
stdio: 'inherit',
|
|
83
314
|
});
|
|
84
|
-
|
|
315
|
+
ui.success('Project created successfully.');
|
|
85
316
|
}
|
|
86
317
|
catch (err) {
|
|
87
318
|
throw new Error(`Failed to create project: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unity-hub.js","sourceRoot":"","sources":["../../src/utils/unity-hub.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"unity-hub.js","sourceRoot":"","sources":["../../src/utils/unity-hub.ts"],"names":[],"mappings":"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"}
|