unity-mcp-cli 0.53.1 → 0.55.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 +168 -114
- package/dist/commands/configure.js +3 -0
- package/dist/commands/configure.js.map +1 -1
- package/dist/commands/create-project.js +6 -3
- package/dist/commands/create-project.js.map +1 -1
- package/dist/commands/install-plugin.js +14 -3
- package/dist/commands/install-plugin.js.map +1 -1
- package/dist/commands/install-unity.js +27 -14
- package/dist/commands/install-unity.js.map +1 -1
- package/dist/commands/open.js +75 -7
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/remove-plugin.js +2 -0
- package/dist/commands/remove-plugin.js.map +1 -1
- package/dist/commands/run-tool.d.ts +2 -0
- package/dist/commands/run-tool.js +180 -0
- package/dist/commands/run-tool.js.map +1 -0
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +17 -1
- package/dist/utils/config.js +26 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/manifest.d.ts +6 -3
- package/dist/utils/manifest.js +30 -27
- package/dist/utils/manifest.js.map +1 -1
- package/dist/utils/ui.d.ts +23 -3
- package/dist/utils/ui.js +170 -18
- package/dist/utils/ui.js.map +1 -1
- package/dist/utils/unity-editor.d.ts +5 -0
- package/dist/utils/unity-editor.js +42 -2
- package/dist/utils/unity-editor.js.map +1 -1
- package/dist/utils/unity-hub.d.ts +29 -1
- package/dist/utils/unity-hub.js +260 -17
- package/dist/utils/unity-hub.js.map +1 -1
- package/docs/README.es.md +128 -113
- package/docs/README.ja.md +128 -113
- package/docs/README.zh-CN.md +128 -113
- package/package.json +2 -5
- package/dist/commands/connect.d.ts +0 -2
- package/dist/commands/connect.js +0 -87
- package/dist/commands/connect.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-unity.js","sourceRoot":"","sources":["../../src/commands/install-unity.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;
|
|
1
|
+
{"version":3,"file":"install-unity.js","sourceRoot":"","sources":["../../src/commands/install-unity.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/open.js
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
|
-
import { findEditorPath, getProjectEditorVersion, launchEditor } from '../utils/unity-editor.js';
|
|
4
|
+
import { findEditorPath, getProjectEditorVersion, launchEditor, printEditorNotFoundHelp } from '../utils/unity-editor.js';
|
|
5
5
|
import * as ui from '../utils/ui.js';
|
|
6
|
+
import { verbose } from '../utils/ui.js';
|
|
6
7
|
export const openCommand = new Command('open')
|
|
7
|
-
.description('Open a Unity project in Unity Editor')
|
|
8
|
+
.description('Open a Unity project in Unity Editor, optionally passing MCP connection env vars when connection options (--url, --token, etc.) are provided. Use --no-connect to suppress all MCP env vars.')
|
|
8
9
|
.argument('[path]', 'Path to the Unity project')
|
|
9
10
|
.option('--path <path>', 'Path to the Unity project')
|
|
10
11
|
.option('--unity <version>', 'Specific Unity Editor version to use')
|
|
12
|
+
.option('--no-connect', 'Open without MCP connection environment variables')
|
|
13
|
+
.option('--url <url>', 'MCP server URL to connect to (sets UNITY_MCP_HOST)')
|
|
14
|
+
.option('--tools <names>', 'Comma-separated list of tools to enable (sets UNITY_MCP_TOOLS)')
|
|
15
|
+
.option('--token <token>', 'Auth token (sets UNITY_MCP_TOKEN)')
|
|
16
|
+
.option('--auth <option>', 'Auth option: none or required (sets UNITY_MCP_AUTH_OPTION)')
|
|
17
|
+
.option('--keep-connected', 'Force keep connected (sets UNITY_MCP_KEEP_CONNECTED=true)')
|
|
18
|
+
.option('--transport <method>', 'Transport method: streamableHttp or stdio (sets UNITY_MCP_TRANSPORT)')
|
|
19
|
+
.option('--start-server <value>', 'Set to true/false to control server auto-start (sets UNITY_MCP_START_SERVER)', undefined)
|
|
11
20
|
.action(async (positionalPath, options) => {
|
|
12
21
|
const resolvedPath = positionalPath ?? options.path;
|
|
13
22
|
if (!resolvedPath) {
|
|
@@ -19,25 +28,84 @@ export const openCommand = new Command('open')
|
|
|
19
28
|
ui.error(`Project path does not exist: ${projectPath}`);
|
|
20
29
|
process.exit(1);
|
|
21
30
|
}
|
|
31
|
+
verbose(`open invoked for project: ${projectPath}`);
|
|
32
|
+
verbose(`--no-connect: ${options.connect === false}`);
|
|
22
33
|
// Determine editor version
|
|
23
34
|
let version = options.unity;
|
|
24
35
|
if (!version) {
|
|
25
36
|
version = getProjectEditorVersion(projectPath) ?? undefined;
|
|
26
37
|
if (version) {
|
|
27
38
|
ui.info(`Detected editor version from project: ${version}`);
|
|
39
|
+
verbose(`Resolved editor version from ProjectVersion.txt: ${version}`);
|
|
28
40
|
}
|
|
29
41
|
}
|
|
30
42
|
const spinner = ui.startSpinner('Locating Unity Editor...');
|
|
31
43
|
const editorPath = await findEditorPath(version);
|
|
32
44
|
if (!editorPath) {
|
|
33
|
-
spinner.
|
|
34
|
-
|
|
35
|
-
ui.error(`Unity Editor not found${versionMsg}. Install it with: unity-mcp-cli install-unity --version <version>`);
|
|
45
|
+
spinner.stop();
|
|
46
|
+
printEditorNotFoundHelp(version, 'open');
|
|
36
47
|
process.exit(1);
|
|
37
48
|
}
|
|
38
|
-
spinner.
|
|
49
|
+
spinner.success('Unity Editor located');
|
|
50
|
+
verbose(`Editor path: ${editorPath}`);
|
|
51
|
+
// Build environment variables for MCP connection (unless --no-connect)
|
|
52
|
+
const useConnect = options.connect !== false;
|
|
53
|
+
let env;
|
|
54
|
+
if (useConnect) {
|
|
55
|
+
const envVars = {};
|
|
56
|
+
if (options.url) {
|
|
57
|
+
envVars['UNITY_MCP_HOST'] = options.url;
|
|
58
|
+
}
|
|
59
|
+
if (options.keepConnected) {
|
|
60
|
+
envVars['UNITY_MCP_KEEP_CONNECTED'] = 'true';
|
|
61
|
+
}
|
|
62
|
+
if (options.tools) {
|
|
63
|
+
envVars['UNITY_MCP_TOOLS'] = options.tools;
|
|
64
|
+
}
|
|
65
|
+
if (options.token) {
|
|
66
|
+
envVars['UNITY_MCP_TOKEN'] = options.token;
|
|
67
|
+
}
|
|
68
|
+
if (options.auth) {
|
|
69
|
+
if (options.auth !== 'none' && options.auth !== 'required') {
|
|
70
|
+
ui.error('--auth must be "none" or "required"');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
envVars['UNITY_MCP_AUTH_OPTION'] = options.auth;
|
|
74
|
+
}
|
|
75
|
+
if (options.transport) {
|
|
76
|
+
if (options.transport !== 'streamableHttp' && options.transport !== 'stdio') {
|
|
77
|
+
ui.error('--transport must be "streamableHttp" or "stdio"');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
envVars['UNITY_MCP_TRANSPORT'] = options.transport;
|
|
81
|
+
}
|
|
82
|
+
if (options.startServer !== undefined) {
|
|
83
|
+
const val = options.startServer.toLowerCase();
|
|
84
|
+
if (val !== 'true' && val !== 'false') {
|
|
85
|
+
ui.error('--start-server must be "true" or "false"');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
envVars['UNITY_MCP_START_SERVER'] = val;
|
|
89
|
+
}
|
|
90
|
+
if (Object.keys(envVars).length > 0) {
|
|
91
|
+
env = envVars;
|
|
92
|
+
ui.heading('Connection Details');
|
|
93
|
+
ui.label('Project', projectPath);
|
|
94
|
+
ui.label('Editor', editorPath);
|
|
95
|
+
ui.heading('Environment Variables');
|
|
96
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
97
|
+
const display = key === 'UNITY_MCP_TOKEN' ? '***' : value;
|
|
98
|
+
ui.label(key, display);
|
|
99
|
+
verbose(`Setting ${key}=${display}`);
|
|
100
|
+
}
|
|
101
|
+
ui.divider();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
verbose('MCP connection disabled via --no-connect');
|
|
106
|
+
}
|
|
39
107
|
ui.label('Project', projectPath);
|
|
40
108
|
ui.label('Editor', editorPath);
|
|
41
|
-
launchEditor(editorPath, projectPath);
|
|
109
|
+
launchEditor(editorPath, projectPath, env);
|
|
42
110
|
});
|
|
43
111
|
//# sourceMappingURL=open.js.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import { removePluginFromManifest } from '../utils/manifest.js';
|
|
5
5
|
import * as ui from '../utils/ui.js';
|
|
6
|
+
import { verbose } from '../utils/ui.js';
|
|
6
7
|
export const removePluginCommand = new Command('remove-plugin')
|
|
7
8
|
.description('Remove Unity-MCP plugin from a Unity project')
|
|
8
9
|
.argument('[path]', 'Path to the Unity project')
|
|
@@ -20,6 +21,7 @@ export const removePluginCommand = new Command('remove-plugin')
|
|
|
20
21
|
ui.error(`Not a valid Unity project (missing Packages/manifest.json): ${projectPath}`);
|
|
21
22
|
process.exit(1);
|
|
22
23
|
}
|
|
24
|
+
verbose(`Manifest path: ${manifestPath}`);
|
|
23
25
|
ui.info(`Removing Unity-MCP plugin from: ${projectPath}`);
|
|
24
26
|
removePluginFromManifest(projectPath);
|
|
25
27
|
ui.success('Done!');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-plugin.js","sourceRoot":"","sources":["../../src/commands/remove-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,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"remove-plugin.js","sourceRoot":"","sources":["../../src/commands/remove-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,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC5D,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAA0B,EAAE,EAAE;IAC/E,MAAM,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;QACzF,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,EAAE,CAAC,KAAK,CAAC,+DAA+D,WAAW,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC;IAC1C,EAAE,CAAC,IAAI,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;IAC1D,wBAAwB,CAAC,WAAW,CAAC,CAAC;IACtC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as ui from '../utils/ui.js';
|
|
5
|
+
import { verbose } from '../utils/ui.js';
|
|
6
|
+
import { generatePortFromDirectory } from '../utils/port.js';
|
|
7
|
+
import { readConfig, resolveConnectionFromConfig } from '../utils/config.js';
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the project path from positional arg, --path option, or cwd.
|
|
10
|
+
*/
|
|
11
|
+
function resolveProjectPath(positionalPath, options) {
|
|
12
|
+
const resolved = path.resolve(positionalPath ?? options.path ?? process.cwd());
|
|
13
|
+
if ((positionalPath !== undefined || options.path !== undefined) && !fs.existsSync(resolved)) {
|
|
14
|
+
ui.error(`Project path does not exist: ${resolved}`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
return resolved;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the server URL and auth token.
|
|
21
|
+
*
|
|
22
|
+
* URL priority:
|
|
23
|
+
* 1. --url flag (explicit override)
|
|
24
|
+
* 2. Config file connectionMode → Custom: host, Cloud: cloudServerUrl
|
|
25
|
+
* 3. Deterministic port from project path
|
|
26
|
+
*
|
|
27
|
+
* Token priority:
|
|
28
|
+
* 1. --token flag (explicit override)
|
|
29
|
+
* 2. Config file token
|
|
30
|
+
*/
|
|
31
|
+
function resolveConnection(projectPath, options) {
|
|
32
|
+
const config = readConfig(projectPath);
|
|
33
|
+
const fromConfig = config ? resolveConnectionFromConfig(config) : { url: undefined, token: undefined };
|
|
34
|
+
verbose(`Config loaded: connectionMode=${config?.connectionMode ?? 'N/A'}, configUrl=${fromConfig.url ?? 'N/A'}, hasToken=${!!fromConfig.token}`);
|
|
35
|
+
let url;
|
|
36
|
+
if (options.url) {
|
|
37
|
+
url = options.url.replace(/\/$/, '');
|
|
38
|
+
verbose(`Using explicit --url: ${url}`);
|
|
39
|
+
}
|
|
40
|
+
else if (fromConfig.url) {
|
|
41
|
+
url = fromConfig.url.replace(/\/$/, '');
|
|
42
|
+
verbose(`Using URL from config (${config?.connectionMode} mode): ${url}`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const port = generatePortFromDirectory(projectPath);
|
|
46
|
+
url = `http://localhost:${port}`;
|
|
47
|
+
verbose(`Using deterministic port URL: ${url}`);
|
|
48
|
+
}
|
|
49
|
+
const token = options.token ?? fromConfig.token;
|
|
50
|
+
if (options.token) {
|
|
51
|
+
verbose('Using explicit --token');
|
|
52
|
+
}
|
|
53
|
+
return { url, token };
|
|
54
|
+
}
|
|
55
|
+
function parseInput(options) {
|
|
56
|
+
if (options.inputFile) {
|
|
57
|
+
const filePath = path.resolve(options.inputFile);
|
|
58
|
+
if (!fs.existsSync(filePath)) {
|
|
59
|
+
ui.error(`Input file does not exist: ${filePath}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
63
|
+
try {
|
|
64
|
+
JSON.parse(content);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
ui.error(`Input file does not contain valid JSON: ${filePath}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
return content;
|
|
71
|
+
}
|
|
72
|
+
if (options.input) {
|
|
73
|
+
try {
|
|
74
|
+
JSON.parse(options.input);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
ui.error('--input must be valid JSON');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
return options.input;
|
|
81
|
+
}
|
|
82
|
+
return '{}';
|
|
83
|
+
}
|
|
84
|
+
export const runToolCommand = new Command('run-tool')
|
|
85
|
+
.description('Execute an MCP tool via the HTTP API')
|
|
86
|
+
.argument('<tool-name>', 'Name of the MCP tool to execute')
|
|
87
|
+
.argument('[path]', 'Unity project path (used for config and auto port detection)')
|
|
88
|
+
.option('--path <path>', 'Unity project path (config and auto port detection)')
|
|
89
|
+
.option('--url <url>', 'Direct server URL override (bypasses config)')
|
|
90
|
+
.option('--token <token>', 'Bearer token override (bypasses config)')
|
|
91
|
+
.option('--input <json>', 'JSON string of tool arguments')
|
|
92
|
+
.option('--input-file <file>', 'Read JSON arguments from file')
|
|
93
|
+
.option('--raw', 'Output raw JSON (no formatting)')
|
|
94
|
+
.action(async (toolName, positionalPath, options) => {
|
|
95
|
+
const projectPath = resolveProjectPath(positionalPath, options);
|
|
96
|
+
const { url: baseUrl, token } = resolveConnection(projectPath, options);
|
|
97
|
+
const body = parseInput(options);
|
|
98
|
+
const endpoint = `${baseUrl}/api/tools/${encodeURIComponent(toolName)}`;
|
|
99
|
+
verbose(`Tool: ${toolName}`);
|
|
100
|
+
verbose(`Endpoint: ${endpoint}`);
|
|
101
|
+
verbose(`Body: ${body}`);
|
|
102
|
+
const headers = {
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
};
|
|
105
|
+
if (token) {
|
|
106
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
107
|
+
verbose(`Authorization header set (source: ${options.token ? '--token flag' : 'config'})`);
|
|
108
|
+
}
|
|
109
|
+
const authSource = options.token ? '--token flag' : 'config';
|
|
110
|
+
if (!options.raw) {
|
|
111
|
+
ui.heading('Run Tool');
|
|
112
|
+
ui.label('Tool', toolName);
|
|
113
|
+
ui.label('URL', endpoint);
|
|
114
|
+
if (token) {
|
|
115
|
+
ui.label('Auth', `from ${authSource}`);
|
|
116
|
+
}
|
|
117
|
+
ui.divider();
|
|
118
|
+
}
|
|
119
|
+
const spinner = options.raw ? null : ui.startSpinner(`Calling ${toolName}...`);
|
|
120
|
+
const controller = new AbortController();
|
|
121
|
+
const fetchTimeout = setTimeout(() => controller.abort(), 30000);
|
|
122
|
+
try {
|
|
123
|
+
const response = await fetch(endpoint, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers,
|
|
126
|
+
body,
|
|
127
|
+
signal: controller.signal,
|
|
128
|
+
});
|
|
129
|
+
const responseText = await response.text();
|
|
130
|
+
let responseData;
|
|
131
|
+
try {
|
|
132
|
+
responseData = JSON.parse(responseText);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
responseData = responseText;
|
|
136
|
+
}
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
spinner?.stop();
|
|
139
|
+
if (options.raw) {
|
|
140
|
+
process.stdout.write(responseText);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
ui.error(`HTTP ${response.status}: ${response.statusText}`);
|
|
144
|
+
if (responseData) {
|
|
145
|
+
ui.info(typeof responseData === 'string'
|
|
146
|
+
? responseData
|
|
147
|
+
: JSON.stringify(responseData, null, 2));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
spinner?.success(`${toolName} completed`);
|
|
153
|
+
if (options.raw) {
|
|
154
|
+
process.stdout.write(responseText);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
ui.success('Response:');
|
|
158
|
+
console.log(typeof responseData === 'string'
|
|
159
|
+
? responseData
|
|
160
|
+
: JSON.stringify(responseData, null, 2));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
spinner?.stop();
|
|
165
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
166
|
+
const isTimeout = err instanceof Error && err.name === 'AbortError';
|
|
167
|
+
const displayMessage = isTimeout ? `Tool call timed out after 30 seconds: ${toolName}` : message;
|
|
168
|
+
if (options.raw) {
|
|
169
|
+
process.stderr.write(displayMessage + '\n');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
ui.error(`Failed to call tool: ${displayMessage}`);
|
|
173
|
+
}
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
clearTimeout(fetchTimeout);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=run-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/commands/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAW7E;;GAEG;AACH,SAAS,kBAAkB,CAAC,cAAkC,EAAE,OAAuB;IACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7F,EAAE,CAAC,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,iBAAiB,CACxB,WAAmB,EACnB,OAAuB;IAEvB,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAEvG,OAAO,CAAC,iCAAiC,MAAM,EAAE,cAAc,IAAI,KAAK,eAAe,UAAU,CAAC,GAAG,IAAI,KAAK,cAAc,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAElJ,IAAI,GAAW,CAAC;IAChB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;QAC1B,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,0BAA0B,MAAM,EAAE,cAAc,WAAW,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;QACpD,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;QACjC,OAAO,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,OAAuB;IACzC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,KAAK,CAAC,2CAA2C,QAAQ,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAClD,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,aAAa,EAAE,iCAAiC,CAAC;KAC1D,QAAQ,CAAC,QAAQ,EAAE,8DAA8D,CAAC;KAClF,MAAM,CAAC,eAAe,EAAE,qDAAqD,CAAC;KAC9E,MAAM,CAAC,aAAa,EAAE,8CAA8C,CAAC;KACrE,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;KACpE,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;KACzD,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC9D,MAAM,CAAC,OAAO,EAAE,iCAAiC,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,cAAkC,EAAE,OAAuB,EAAE,EAAE;IAC9F,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,OAAO,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAExE,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC7B,OAAO,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAEzB,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAC7C,OAAO,CAAC,qCAAqC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE7D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvB,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3B,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1B,IAAI,KAAK,EAAE,CAAC;YACV,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,EAAE,CAAC,OAAO,EAAE,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,QAAQ,KAAK,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,YAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,YAAY,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,IAAI,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC5D,IAAI,YAAY,EAAE,CAAC;oBACjB,EAAE,CAAC,IAAI,CAAC,OAAO,YAAY,KAAK,QAAQ;wBACtC,CAAC,CAAC,YAAY;wBACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAC;QAE1C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,OAAO,YAAY,KAAK,QAAQ;gBAC1C,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;QACpE,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACjG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,32 +5,41 @@ import { installUnityCommand } from './commands/install-unity.js';
|
|
|
5
5
|
import { openCommand } from './commands/open.js';
|
|
6
6
|
import { installPluginCommand } from './commands/install-plugin.js';
|
|
7
7
|
import { configureCommand } from './commands/configure.js';
|
|
8
|
-
import { connectCommand } from './commands/connect.js';
|
|
9
8
|
import { removePluginCommand } from './commands/remove-plugin.js';
|
|
10
|
-
import {
|
|
9
|
+
import { runToolCommand } from './commands/run-tool.js';
|
|
10
|
+
import { configureStyledHelp, error as uiError, setVerbose } from './utils/ui.js';
|
|
11
11
|
const require = createRequire(import.meta.url);
|
|
12
12
|
const pkg = require('../package.json');
|
|
13
13
|
const program = new Command();
|
|
14
14
|
program
|
|
15
15
|
.name('unity-mcp-cli')
|
|
16
16
|
.description('Cross-platform CLI tool for Unity-MCP operations')
|
|
17
|
-
.version(pkg.version)
|
|
17
|
+
.version(pkg.version)
|
|
18
|
+
.option('-v, --verbose', 'Enable verbose diagnostic output');
|
|
18
19
|
// Register all subcommands
|
|
19
20
|
const subcommands = [
|
|
21
|
+
configureCommand,
|
|
20
22
|
createProjectCommand,
|
|
23
|
+
installPluginCommand,
|
|
21
24
|
installUnityCommand,
|
|
22
25
|
openCommand,
|
|
23
|
-
installPluginCommand,
|
|
24
|
-
configureCommand,
|
|
25
|
-
connectCommand,
|
|
26
26
|
removePluginCommand,
|
|
27
|
+
runToolCommand,
|
|
27
28
|
];
|
|
28
29
|
for (const cmd of subcommands) {
|
|
30
|
+
cmd.option('-v, --verbose', 'Enable verbose diagnostic output');
|
|
29
31
|
configureStyledHelp(cmd);
|
|
30
32
|
program.addCommand(cmd);
|
|
31
33
|
}
|
|
32
34
|
// Apply styled help to root (after subcommands so banner knows about them)
|
|
33
35
|
configureStyledHelp(program, pkg.version);
|
|
36
|
+
// Wire verbose flag before any command executes
|
|
37
|
+
program.hook('preAction', (_thisCommand, actionCommand) => {
|
|
38
|
+
const opts = actionCommand.optsWithGlobals();
|
|
39
|
+
if (opts.verbose) {
|
|
40
|
+
setVerbose(true);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
34
43
|
// Show help when no command provided
|
|
35
44
|
program.action(() => {
|
|
36
45
|
program.outputHelp();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAElF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,GAAG;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,cAAc;CACf,CAAC;AAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IAChE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAE1C,gDAAgD;AAChD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,EAA2B,CAAC;IACtE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,qCAAqC;AACrC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,OAAO,CAAE,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export interface UnityConnectionConfig {
|
|
|
11
11
|
keepServerRunning?: boolean;
|
|
12
12
|
transportMethod?: string;
|
|
13
13
|
authOption?: string;
|
|
14
|
-
connectionMode?: string;
|
|
14
|
+
connectionMode?: string | number;
|
|
15
15
|
cloudServerUrl?: string;
|
|
16
16
|
cloudToken?: string;
|
|
17
17
|
tools?: McpFeature[];
|
|
@@ -49,3 +49,19 @@ export declare function updateFeatures(config: UnityConnectionConfig, featureTyp
|
|
|
49
49
|
enableAll?: boolean;
|
|
50
50
|
disableAll?: boolean;
|
|
51
51
|
}): void;
|
|
52
|
+
/**
|
|
53
|
+
* Determine whether the config is in Cloud mode.
|
|
54
|
+
* Handles both string ("Cloud") and legacy integer (1) representations
|
|
55
|
+
* of the ConnectionMode enum.
|
|
56
|
+
*/
|
|
57
|
+
export declare function isCloudMode(config: UnityConnectionConfig): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the server URL and auth token from a project config based on connectionMode.
|
|
60
|
+
* - Custom mode (string "Custom" or integer 0): uses `host` and `token`
|
|
61
|
+
* - Cloud mode (string "Cloud" or integer 1): uses `cloudServerUrl` and `cloudToken`
|
|
62
|
+
* Returns undefined values when the config or relevant fields are not set.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveConnectionFromConfig(config: UnityConnectionConfig): {
|
|
65
|
+
url: string | undefined;
|
|
66
|
+
token: string | undefined;
|
|
67
|
+
};
|
package/dist/utils/config.js
CHANGED
|
@@ -115,4 +115,30 @@ export function updateFeatures(config, featureType, options) {
|
|
|
115
115
|
}
|
|
116
116
|
config[featureType] = features;
|
|
117
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Determine whether the config is in Cloud mode.
|
|
120
|
+
* Handles both string ("Cloud") and legacy integer (1) representations
|
|
121
|
+
* of the ConnectionMode enum.
|
|
122
|
+
*/
|
|
123
|
+
export function isCloudMode(config) {
|
|
124
|
+
const mode = config.connectionMode;
|
|
125
|
+
return mode === 'Cloud' || mode === 1;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Resolve the server URL and auth token from a project config based on connectionMode.
|
|
129
|
+
* - Custom mode (string "Custom" or integer 0): uses `host` and `token`
|
|
130
|
+
* - Cloud mode (string "Cloud" or integer 1): uses `cloudServerUrl` and `cloudToken`
|
|
131
|
+
* Returns undefined values when the config or relevant fields are not set.
|
|
132
|
+
*/
|
|
133
|
+
export function resolveConnectionFromConfig(config) {
|
|
134
|
+
const cloud = isCloudMode(config);
|
|
135
|
+
const rawCloudUrl = config.cloudServerUrl?.replace(/\/$/, '');
|
|
136
|
+
const cloudUrl = rawCloudUrl
|
|
137
|
+
? rawCloudUrl.endsWith('/mcp') ? rawCloudUrl : rawCloudUrl + '/mcp'
|
|
138
|
+
: undefined;
|
|
139
|
+
return {
|
|
140
|
+
url: cloud ? cloudUrl : config.host,
|
|
141
|
+
token: cloud ? config.cloudToken : config.token,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
118
144
|
//# sourceMappingURL=config.js.map
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/manifest.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve the latest plugin version
|
|
2
|
+
* Resolve the latest plugin version from the OpenUPM registry.
|
|
3
|
+
* Throws an error with actionable suggestions if the network request fails.
|
|
3
4
|
*/
|
|
4
5
|
export declare function resolveLatestVersion(): Promise<string>;
|
|
5
6
|
/**
|
|
@@ -12,9 +13,11 @@ export declare function shouldUpdateVersion(currentVersion: string, newVersion:
|
|
|
12
13
|
* Add Unity-MCP plugin to a Unity project's Packages/manifest.json.
|
|
13
14
|
* Ports the C# Installer.Manifest.cs logic:
|
|
14
15
|
* - Adds OpenUPM scoped registry with required scopes
|
|
15
|
-
* - Adds/updates the plugin dependency
|
|
16
|
+
* - Adds/updates the plugin dependency
|
|
17
|
+
* - When force is false (auto-resolved version): never downgrades
|
|
18
|
+
* - When force is true (user-specified --plugin-version): allows downgrade
|
|
16
19
|
*/
|
|
17
|
-
export declare function addPluginToManifest(projectPath: string, version: string): void;
|
|
20
|
+
export declare function addPluginToManifest(projectPath: string, version: string, force?: boolean): void;
|
|
18
21
|
/**
|
|
19
22
|
* Remove Unity-MCP plugin from a Unity project's Packages/manifest.json.
|
|
20
23
|
* Only removes the plugin dependency — scoped registries and scopes are
|
package/dist/utils/manifest.js
CHANGED
|
@@ -12,38 +12,39 @@ const REQUIRED_SCOPES = [
|
|
|
12
12
|
'org.nuget.system',
|
|
13
13
|
'org.nuget.r3',
|
|
14
14
|
];
|
|
15
|
-
// Hardcoded fallback version (updated on each release)
|
|
16
|
-
const FALLBACK_VERSION = '0.53.1';
|
|
17
15
|
/**
|
|
18
|
-
* Resolve the latest plugin version
|
|
16
|
+
* Resolve the latest plugin version from the OpenUPM registry.
|
|
17
|
+
* Throws an error with actionable suggestions if the network request fails.
|
|
19
18
|
*/
|
|
20
19
|
export async function resolveLatestVersion() {
|
|
20
|
+
const controller = new AbortController();
|
|
21
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
21
22
|
try {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (latest) {
|
|
33
|
-
ui.info(`Resolved latest version from OpenUPM: ${latest}`);
|
|
34
|
-
return latest;
|
|
35
|
-
}
|
|
23
|
+
const res = await fetch(`https://package.openupm.com/${PACKAGE_ID}`, {
|
|
24
|
+
signal: controller.signal,
|
|
25
|
+
headers: { Accept: 'application/json' },
|
|
26
|
+
});
|
|
27
|
+
if (res.ok) {
|
|
28
|
+
const data = (await res.json());
|
|
29
|
+
const latest = data?.['dist-tags']?.latest;
|
|
30
|
+
if (latest) {
|
|
31
|
+
ui.info(`Resolved latest version from OpenUPM: ${latest}`);
|
|
32
|
+
return latest;
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
throw new Error(`OpenUPM returned status ${res.status}. ` +
|
|
36
|
+
'Check your network connection and retry, or specify a version manually with --plugin-version <version>');
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (err instanceof Error && err.message.includes('--plugin-version')) {
|
|
40
|
+
throw err;
|
|
40
41
|
}
|
|
42
|
+
throw new Error('Failed to resolve latest plugin version from OpenUPM. ' +
|
|
43
|
+
'Check your network connection and retry, or specify a version manually with --plugin-version <version>');
|
|
41
44
|
}
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
finally {
|
|
46
|
+
clearTimeout(timeout);
|
|
44
47
|
}
|
|
45
|
-
ui.warn(`Using fallback version: ${FALLBACK_VERSION}`);
|
|
46
|
-
return FALLBACK_VERSION;
|
|
47
48
|
}
|
|
48
49
|
/**
|
|
49
50
|
* Determines if the version should be updated.
|
|
@@ -79,9 +80,11 @@ export function shouldUpdateVersion(currentVersion, newVersion) {
|
|
|
79
80
|
* Add Unity-MCP plugin to a Unity project's Packages/manifest.json.
|
|
80
81
|
* Ports the C# Installer.Manifest.cs logic:
|
|
81
82
|
* - Adds OpenUPM scoped registry with required scopes
|
|
82
|
-
* - Adds/updates the plugin dependency
|
|
83
|
+
* - Adds/updates the plugin dependency
|
|
84
|
+
* - When force is false (auto-resolved version): never downgrades
|
|
85
|
+
* - When force is true (user-specified --plugin-version): allows downgrade
|
|
83
86
|
*/
|
|
84
|
-
export function addPluginToManifest(projectPath, version) {
|
|
87
|
+
export function addPluginToManifest(projectPath, version, force = false) {
|
|
85
88
|
const manifestPath = path.join(projectPath, 'Packages', 'manifest.json');
|
|
86
89
|
if (!fs.existsSync(manifestPath)) {
|
|
87
90
|
throw new Error(`manifest.json not found at: ${manifestPath}`);
|
|
@@ -122,12 +125,12 @@ export function addPluginToManifest(projectPath, version) {
|
|
|
122
125
|
modified = true;
|
|
123
126
|
}
|
|
124
127
|
const currentVersion = manifest.dependencies[PACKAGE_ID];
|
|
125
|
-
if (!currentVersion || shouldUpdateVersion(currentVersion, version)) {
|
|
128
|
+
if (!currentVersion || force || shouldUpdateVersion(currentVersion, version)) {
|
|
126
129
|
manifest.dependencies[PACKAGE_ID] = version;
|
|
127
130
|
modified = true;
|
|
128
131
|
}
|
|
129
132
|
else {
|
|
130
|
-
ui.info(`Plugin already at version ${currentVersion} (>= ${version}). Skipping version update.`);
|
|
133
|
+
ui.info(`Plugin already at version ${currentVersion} (>= ${version}). Skipping version update. Use --plugin-version to force a specific version.`);
|
|
131
134
|
}
|
|
132
135
|
// --- Write back
|
|
133
136
|
if (modified) {
|