unity-mcp-cli 0.83.1 → 0.84.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/dist/commands/configure.js +20 -1
- package/dist/commands/configure.js.map +1 -1
- package/dist/commands/install-plugin.js +67 -1
- package/dist/commands/install-plugin.js.map +1 -1
- package/dist/commands/login.js +26 -14
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/setup-skills.js +2 -1
- package/dist/commands/setup-skills.js.map +1 -1
- package/dist/utils/cloud-login.d.ts +3 -2
- package/dist/utils/cloud-login.js +7 -10
- package/dist/utils/cloud-login.js.map +1 -1
- package/dist/utils/enroll.d.ts +101 -0
- package/dist/utils/enroll.js +251 -0
- package/dist/utils/enroll.js.map +1 -0
- package/dist/utils/machine-credentials.d.ts +64 -0
- package/dist/utils/machine-credentials.js +114 -0
- package/dist/utils/machine-credentials.js.map +1 -0
- package/dist/utils/managed-server.d.ts +95 -0
- package/dist/utils/managed-server.js +261 -0
- package/dist/utils/managed-server.js.map +1 -0
- package/dist/utils/port.d.ts +15 -2
- package/dist/utils/port.js +61 -6
- package/dist/utils/port.js.map +1 -1
- package/dist/utils/project-marker.d.ts +26 -0
- package/dist/utils/project-marker.js +48 -0
- package/dist/utils/project-marker.js.map +1 -0
- package/dist/utils/rid.d.ts +17 -0
- package/dist/utils/rid.js +60 -0
- package/dist/utils/rid.js.map +1 -0
- package/dist/utils/server-version.d.ts +27 -0
- package/dist/utils/server-version.js +33 -0
- package/dist/utils/server-version.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import * as ui from '../utils/ui.js';
|
|
4
4
|
import { verbose } from '../utils/ui.js';
|
|
5
5
|
import { configure } from '../lib/configure.js';
|
|
6
|
+
import { proxyConfigure } from '../utils/managed-server.js';
|
|
6
7
|
function parseCommaSeparated(value) {
|
|
7
8
|
return value.split(',').map((s) => s.trim()).filter(Boolean);
|
|
8
9
|
}
|
|
@@ -17,9 +18,11 @@ function buildAction(enable, disable, enableAll, disableAll) {
|
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
20
|
export const configureCommand = new Command('configure')
|
|
20
|
-
.description('Configure MCP tools
|
|
21
|
+
.description('Configure MCP tools/prompts/resources, or (with --agent) write an AI agent config via the managed server')
|
|
21
22
|
.argument('[path]', 'Path to the Unity project')
|
|
22
23
|
.option('--path <path>', 'Path to the Unity project')
|
|
24
|
+
.option('--agent <id>', 'Write an AI agent MCP config by proxying to the managed GameDev-MCP-Server configurator')
|
|
25
|
+
.option('--url <url>', 'Explicit server URL forwarded to the managed configurator (with --agent)')
|
|
23
26
|
.option('--enable-tools <names>', 'Enable specific tools (comma-separated)', parseCommaSeparated)
|
|
24
27
|
.option('--disable-tools <names>', 'Disable specific tools (comma-separated)', parseCommaSeparated)
|
|
25
28
|
.option('--enable-all-tools', 'Enable all tools')
|
|
@@ -40,6 +43,22 @@ export const configureCommand = new Command('configure')
|
|
|
40
43
|
process.exit(1);
|
|
41
44
|
}
|
|
42
45
|
const projectPath = path.resolve(resolvedPath);
|
|
46
|
+
// `--agent` mode: proxy to the managed GameDev-MCP-Server binary's `configure` subcommand
|
|
47
|
+
// (design 06/09 Phase 3) so the shared C# configurator writes the agent config with the
|
|
48
|
+
// derived project pin + port. This is a distinct mode from the tools/prompts/resources
|
|
49
|
+
// toggles below and short-circuits them.
|
|
50
|
+
if (options.agent) {
|
|
51
|
+
verbose(`Proxying configure --agent ${options.agent} to the managed server for: ${projectPath}`);
|
|
52
|
+
try {
|
|
53
|
+
proxyConfigure({ agentId: options.agent, projectPath, url: options.url });
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
ui.error(err instanceof Error ? err.message : String(err));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
ui.success(`Configured agent "${options.agent}" via the managed server.`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
43
62
|
verbose(`Loading config for project: ${projectPath}`);
|
|
44
63
|
// `--list` must be read-only: previously this command short-
|
|
45
64
|
// circuited before applying any enable/disable flags. Preserve
|
|
@@ -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,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import * as fs from 'fs';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import * as ui from '../utils/ui.js';
|
|
4
5
|
import { verbose } from '../utils/ui.js';
|
|
5
6
|
import { installPlugin } from '../lib/install-plugin.js';
|
|
7
|
+
import { downloadServerBinary } from '../utils/managed-server.js';
|
|
8
|
+
import { DEFAULT_SERVER_VERSION } from '../utils/server-version.js';
|
|
9
|
+
import { resolveEnrollCode, runEnroll, EnrollmentError } from '../utils/enroll.js';
|
|
10
|
+
import { MachineCredentialStore } from '../utils/machine-credentials.js';
|
|
6
11
|
export const installPluginCommand = new Command('install-plugin')
|
|
7
|
-
.description('Install Unity-MCP plugin into a Unity project')
|
|
12
|
+
.description('Install Unity-MCP plugin into a Unity project (optionally download the server + enroll)')
|
|
8
13
|
.argument('[path]', 'Path to the Unity project')
|
|
9
14
|
.option('--path <path>', 'Path to the Unity project')
|
|
10
15
|
.option('--plugin-version <version>', 'Plugin version to install (default: latest)')
|
|
16
|
+
.option('--with-server', 'Also download the RID-matched GameDev-MCP-Server binary into the CLI managed dir')
|
|
17
|
+
.option('--server-version <version>', `Server version to download with --with-server (default: ${DEFAULT_SERVER_VERSION})`)
|
|
18
|
+
.option('--server-source <path-or-url>', 'Offline/CI override: install the server from a local zip path or URL (skips SHA256SUMS verification)')
|
|
19
|
+
.option('--enroll <code>', 'Redeem an enrollment code for a plugin credential (planted in the shared machine store)')
|
|
20
|
+
.option('--enroll-stdin', 'Read the enrollment code from stdin (never argv/shell history)')
|
|
11
21
|
.action(async (positionalPath, options) => {
|
|
12
22
|
const resolvedPath = positionalPath ?? options.path;
|
|
13
23
|
if (!resolvedPath) {
|
|
@@ -15,6 +25,7 @@ export const installPluginCommand = new Command('install-plugin')
|
|
|
15
25
|
process.exit(1);
|
|
16
26
|
}
|
|
17
27
|
const projectPath = path.resolve(resolvedPath);
|
|
28
|
+
// ── Phase 1: install the plugin into the Unity project's manifest ────────
|
|
18
29
|
// Wire the library's progress events back into the CLI's chalk-
|
|
19
30
|
// styled ui so the terminal experience stays identical.
|
|
20
31
|
let spinner;
|
|
@@ -59,6 +70,61 @@ export const installPluginCommand = new Command('install-plugin')
|
|
|
59
70
|
for (const warning of result.warnings) {
|
|
60
71
|
ui.warn(warning);
|
|
61
72
|
}
|
|
73
|
+
// ── Phase 2: download the RID-matched server binary (--with-server) ──────
|
|
74
|
+
if (options.withServer) {
|
|
75
|
+
const serverSpinner = ui.startSpinner('Downloading GameDev-MCP-Server binary...');
|
|
76
|
+
try {
|
|
77
|
+
const download = await downloadServerBinary({
|
|
78
|
+
version: options.serverVersion ?? DEFAULT_SERVER_VERSION,
|
|
79
|
+
source: options.serverSource,
|
|
80
|
+
onProgress: (msg) => {
|
|
81
|
+
serverSpinner.text = msg;
|
|
82
|
+
verbose(msg);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
serverSpinner.success(`Server ${download.rid} v${download.version} installed${download.verified ? ' (checksum verified)' : ''}`);
|
|
86
|
+
ui.label('Server binary', download.binaryPath);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
serverSpinner.error('Server download failed');
|
|
90
|
+
ui.error(err instanceof Error ? err.message : String(err));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ── Phase 3: redeem an enrollment code (--enroll / --enroll-stdin) ───────
|
|
95
|
+
if (options.enroll || options.enrollStdin) {
|
|
96
|
+
let code;
|
|
97
|
+
try {
|
|
98
|
+
code = resolveEnrollCode({ enroll: options.enroll, enrollStdin: options.enrollStdin }, () => fs.readFileSync(0, 'utf-8'));
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
ui.error(err instanceof Error ? err.message : String(err));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
const enrollSpinner = ui.startSpinner('Redeeming enrollment code...');
|
|
105
|
+
try {
|
|
106
|
+
const enrolled = await runEnroll({
|
|
107
|
+
code,
|
|
108
|
+
projectPath,
|
|
109
|
+
store: new MachineCredentialStore(),
|
|
110
|
+
});
|
|
111
|
+
enrollSpinner.success('Enrollment complete');
|
|
112
|
+
ui.label('Credential', enrolled.credentialPath);
|
|
113
|
+
ui.label('Server target', enrolled.serverTarget);
|
|
114
|
+
ui.label('Project marker', enrolled.markerPath);
|
|
115
|
+
ui.label('Project pin', enrolled.pin);
|
|
116
|
+
if (enrolled.pinnedConfigs.length > 0) {
|
|
117
|
+
for (const cfg of enrolled.pinnedConfigs) {
|
|
118
|
+
ui.info(`Pinned project routing in ${cfg}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
enrollSpinner.error('Enrollment failed');
|
|
124
|
+
ui.error(err instanceof EnrollmentError || err instanceof Error ? err.message : String(err));
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
62
128
|
ui.success('Done! Open the project in Unity Editor to complete installation.');
|
|
63
129
|
});
|
|
64
130
|
//# sourceMappingURL=install-plugin.js.map
|
|
@@ -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,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
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,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,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAYzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC9D,WAAW,CAAC,yFAAyF,CAAC;KACtG,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,4BAA4B,EAAE,6CAA6C,CAAC;KACnF,MAAM,CAAC,eAAe,EAAE,kFAAkF,CAAC;KAC3G,MAAM,CAAC,4BAA4B,EAAE,2DAA2D,sBAAsB,GAAG,CAAC;KAC1H,MAAM,CAAC,+BAA+B,EAAE,sGAAsG,CAAC;KAC/I,MAAM,CAAC,iBAAiB,EAAE,yFAAyF,CAAC;KACpH,MAAM,CAAC,gBAAgB,EAAE,gEAAgE,CAAC;KAC1F,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAA6B,EAAE,EAAE;IAClF,MAAM,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,4EAA4E;IAC5E,gEAAgE;IAChE,wDAAwD;IACxD,IAAI,OAAuD,CAAC;IAC5D,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACjC,gBAAgB,EAAE,WAAW;QAC7B,OAAO,EAAE,OAAO,CAAC,aAAa;QAC9B,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,KAAK,CAAC,KAAK,KAAK,uBAAuB,IAAI,OAAO,EAAE,CAAC;gBACvD,OAAO,CAAC,OAAO,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7D,OAAO,GAAG,SAAS,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;gBACvC,uDAAuD;gBACvD,0DAA0D;gBAC1D,2DAA2D;gBAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACzC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;QACD,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iEAAiE;IACjE,uCAAuC;IACvC,OAAO,CAAC,mBAAmB,MAAM,CAAC,gBAAgB,eAAe,CAAC,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;IAC7F,OAAO,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACjD,EAAE,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,gBAAgB,UAAU,WAAW,EAAE,CAAC,CAAC;IAExF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,0CAA0C,CAAC,CAAC;QAClF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;gBAC1C,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,sBAAsB;gBACxD,MAAM,EAAE,OAAO,CAAC,YAAY;gBAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;oBAClB,aAAa,CAAC,IAAI,GAAG,GAAG,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,CAAC;gBACf,CAAC;aACF,CAAC,CAAC;YACH,aAAa,CAAC,OAAO,CACnB,UAAU,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,OAAO,aAAa,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1G,CAAC;YACF,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,aAAa,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC9C,EAAE,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,iBAAiB,CACtB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,EAC5D,GAAG,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAClC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;gBAC/B,IAAI;gBACJ,WAAW;gBACX,KAAK,EAAE,IAAI,sBAAsB,EAAE;aACpC,CAAC,CAAC;YACH,aAAa,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAC7C,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YACjD,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;oBACzC,EAAE,CAAC,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,aAAa,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACzC,EAAE,CAAC,KAAK,CAAC,GAAG,YAAY,eAAe,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,30 +1,42 @@
|
|
|
1
1
|
// Copyright (c) 2024 Ivan Murzak. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License, Version 2.0.
|
|
3
3
|
import { Command } from 'commander';
|
|
4
|
+
import * as path from 'path';
|
|
4
5
|
import * as ui from '../utils/ui.js';
|
|
5
6
|
import { verbose } from '../utils/ui.js';
|
|
6
|
-
import {
|
|
7
|
-
import { getOrCreateConfig, CLOUD_SERVER_BASE_URL } from '../utils/config.js';
|
|
7
|
+
import { CLOUD_SERVER_BASE_URL } from '../utils/config.js';
|
|
8
8
|
import { runCloudLogin } from '../utils/cloud-login.js';
|
|
9
|
+
import { MachineCredentialStore, MACHINE_STORE_DIR_NAME } from '../utils/machine-credentials.js';
|
|
10
|
+
/**
|
|
11
|
+
* Resolve the credential store: the shared machine store (`~/.ai-game-dev/`) by default, or a
|
|
12
|
+
* project-local store (`<path>/.ai-game-dev/`) when `--project` is given.
|
|
13
|
+
*/
|
|
14
|
+
function resolveStore(options) {
|
|
15
|
+
if (options.project) {
|
|
16
|
+
const base = path.join(path.resolve(options.project), MACHINE_STORE_DIR_NAME);
|
|
17
|
+
return new MachineCredentialStore(base);
|
|
18
|
+
}
|
|
19
|
+
return new MachineCredentialStore();
|
|
20
|
+
}
|
|
9
21
|
export const loginCommand = new Command('login')
|
|
10
|
-
.description('
|
|
11
|
-
.
|
|
12
|
-
.option('--force', 'Re-authenticate even if already
|
|
13
|
-
.action(async (
|
|
14
|
-
const
|
|
15
|
-
verbose(`
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
ui.
|
|
22
|
+
.description('Sign in to ai-game.dev and store the credential in the shared machine credential store (~/.ai-game-dev/credentials.json)')
|
|
23
|
+
.option('--project <path>', 'Store the credential in a project-local store (<path>/.ai-game-dev/) instead of the shared machine store')
|
|
24
|
+
.option('--force', 'Re-authenticate even if already signed in')
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
const store = resolveStore(options);
|
|
27
|
+
verbose(`Credential store: ${store.credentialsPath}`);
|
|
28
|
+
if (store.exists && !options.force) {
|
|
29
|
+
ui.success('Already signed in.');
|
|
30
|
+
ui.info(`Credential: ${store.credentialsPath}`);
|
|
19
31
|
ui.info('Use --force to re-authenticate.');
|
|
20
32
|
return;
|
|
21
33
|
}
|
|
22
|
-
ui.heading('
|
|
34
|
+
ui.heading('Sign in to ai-game.dev');
|
|
23
35
|
ui.label('Server', CLOUD_SERVER_BASE_URL);
|
|
24
36
|
ui.divider();
|
|
25
|
-
const token = await runCloudLogin(
|
|
37
|
+
const token = await runCloudLogin(store);
|
|
26
38
|
if (token) {
|
|
27
|
-
ui.success(
|
|
39
|
+
ui.success(`Signed in. Credential saved to ${store.credentialsPath}`);
|
|
28
40
|
}
|
|
29
41
|
else {
|
|
30
42
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,kDAAkD;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,kDAAkD;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAOjG;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAqB;IACzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAC9E,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,sBAAsB,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CACV,0HAA0H,CAC3H;KACA,MAAM,CACL,kBAAkB,EAClB,0GAA0G,CAC3G;KACA,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAqB,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,qBAAqB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IAEtD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACjC,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;QAChD,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAC1C,EAAE,CAAC,OAAO,EAAE,CAAC;IAEb,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,EAAE,CAAC,OAAO,CAAC,kCAAkC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { resolveAndValidateProjectPath, resolveConnection } from '../utils/conne
|
|
|
6
6
|
import { getAgentById, getAgentIds, listAgentTable } from '../utils/agents.js';
|
|
7
7
|
import { readConfig, isCloudMode } from '../utils/config.js';
|
|
8
8
|
import { runCloudLogin } from '../utils/cloud-login.js';
|
|
9
|
+
import { MachineCredentialStore } from '../utils/machine-credentials.js';
|
|
9
10
|
function listAgentsWithSkills() {
|
|
10
11
|
listAgentTable('AI Agents \u2014 Skills Support', 'Skills Path', (a) => a.skillsPath ?? '\u2014');
|
|
11
12
|
}
|
|
@@ -96,7 +97,7 @@ export const setupSkillsCommand = new Command('setup-skills')
|
|
|
96
97
|
if (cloud && !options.token && !hadToken) {
|
|
97
98
|
ui.info('Cloud authentication required. Starting login...');
|
|
98
99
|
console.log();
|
|
99
|
-
const newToken = await runCloudLogin(
|
|
100
|
+
const newToken = await runCloudLogin(new MachineCredentialStore());
|
|
100
101
|
if (!newToken) {
|
|
101
102
|
process.exit(1);
|
|
102
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-skills.js","sourceRoot":"","sources":["../../src/commands/setup-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup-skills.js","sourceRoot":"","sources":["../../src/commands/setup-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { MachineCredentialStore } from './machine-credentials.js';
|
|
1
2
|
/**
|
|
2
3
|
* Run the cloud device-auth flow: initiate, display code, open browser, poll,
|
|
3
|
-
* and persist the token to the
|
|
4
|
+
* and persist the token to the shared machine credential store.
|
|
4
5
|
*
|
|
5
6
|
* Returns the access token on success, or null on failure (errors are printed).
|
|
6
7
|
*/
|
|
7
|
-
export declare function runCloudLogin(
|
|
8
|
+
export declare function runCloudLogin(store: MachineCredentialStore): Promise<string | null>;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// Copyright (c) 2024 Ivan Murzak. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License, Version 2.0.
|
|
3
3
|
import * as ui from './ui.js';
|
|
4
|
-
import {
|
|
4
|
+
import { CLOUD_SERVER_BASE_URL } from './config.js';
|
|
5
5
|
import { deviceAuthFlow } from './auth.js';
|
|
6
6
|
import { openBrowser } from './browser.js';
|
|
7
7
|
/**
|
|
8
8
|
* Run the cloud device-auth flow: initiate, display code, open browser, poll,
|
|
9
|
-
* and persist the token to the
|
|
9
|
+
* and persist the token to the shared machine credential store.
|
|
10
10
|
*
|
|
11
11
|
* Returns the access token on success, or null on failure (errors are printed).
|
|
12
12
|
*/
|
|
13
|
-
export async function runCloudLogin(
|
|
13
|
+
export async function runCloudLogin(store) {
|
|
14
14
|
let spinner;
|
|
15
15
|
try {
|
|
16
16
|
const result = await deviceAuthFlow(CLOUD_SERVER_BASE_URL, 'Unity-MCP CLI', {
|
|
@@ -28,13 +28,10 @@ export async function runCloudLogin(projectPath) {
|
|
|
28
28
|
});
|
|
29
29
|
if (result.success) {
|
|
30
30
|
spinner?.success('Authorized');
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
connectionMode: 'Cloud',
|
|
36
|
-
};
|
|
37
|
-
writeConfig(projectPath, updatedConfig);
|
|
31
|
+
store.write({
|
|
32
|
+
accessToken: result.accessToken,
|
|
33
|
+
serverTarget: CLOUD_SERVER_BASE_URL,
|
|
34
|
+
});
|
|
38
35
|
return result.accessToken;
|
|
39
36
|
}
|
|
40
37
|
spinner?.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-login.js","sourceRoot":"","sources":["../../src/utils/cloud-login.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,kDAAkD;AAElD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cloud-login.js","sourceRoot":"","sources":["../../src/utils/cloud-login.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,kDAAkD;AAElD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAA6B;IAC/D,IAAI,OAAuD,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,qBAAqB,EACrB,eAAe,EACf;YACE,UAAU,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE;gBACxC,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,eAAe,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC3B,WAAW,CAAC,eAAe,CAAC,CAAC;YAC/B,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC;YAC5D,CAAC;SACF,CACF,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAE/B,KAAK,CAAC,KAAK,CAAC;gBACV,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,qBAAqB;aACpC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;QAChB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,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,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACzE,EAAE,CAAC,KAAK,CAAC,gCAAgC,qBAAqB,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { MachineCredentialStore } from './machine-credentials.js';
|
|
2
|
+
/**
|
|
3
|
+
* Agent-driven enrollment (D13): redeem a one-time enrollment code — minted by the server's
|
|
4
|
+
* `enroll_engine_plugin` tool from an already-authorized agent session — for a plugin credential,
|
|
5
|
+
* with NO second browser hop. The redeemed credential is planted in the shared machine store, the
|
|
6
|
+
* server target it was minted for is recorded in the project marker, and the D14 project pin is
|
|
7
|
+
* upserted into any existing project-local agent config so the plugin boots pointed at the right
|
|
8
|
+
* hub. Codes are burned server-side on first redeem attempt; a spent/invalid code yields a uniform
|
|
9
|
+
* error surfaced here as an actionable message.
|
|
10
|
+
*/
|
|
11
|
+
/** Raised on any enrollment-redeem failure. Carries the HTTP status when one was received. */
|
|
12
|
+
export declare class EnrollmentError extends Error {
|
|
13
|
+
readonly status?: number;
|
|
14
|
+
constructor(message: string, status?: number);
|
|
15
|
+
}
|
|
16
|
+
/** Credential material returned by a successful `/api/auth/enroll/redeem`. */
|
|
17
|
+
export interface RedeemedCredential {
|
|
18
|
+
accessToken?: string;
|
|
19
|
+
refreshToken?: string;
|
|
20
|
+
expiresAt?: string;
|
|
21
|
+
serverTarget?: string;
|
|
22
|
+
subject?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface RedeemOptions {
|
|
25
|
+
/** Authorization Server base; defaults to the hosted `CLOUD_SERVER_BASE_URL`. */
|
|
26
|
+
baseUrl?: string;
|
|
27
|
+
/** `fetch` injection (tests). */
|
|
28
|
+
fetchImpl?: typeof fetch;
|
|
29
|
+
/** Request timeout; defaults to 30s. */
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Normalize the redeem response. The Authorization Server's JSON key casing is not re-derivable
|
|
34
|
+
* from this repo (the AS lives in a separate service), so both snake_case and camelCase variants
|
|
35
|
+
* of every field are accepted defensively; `expires_in` seconds are converted to an absolute
|
|
36
|
+
* `expiresAt` ISO timestamp when no explicit `expires_at` is present.
|
|
37
|
+
*/
|
|
38
|
+
export declare function normalizeRedeemResponse(data: Record<string, unknown>): RedeemedCredential;
|
|
39
|
+
/**
|
|
40
|
+
* Redeem an enrollment code against `POST <baseUrl>/api/auth/enroll/redeem` with body
|
|
41
|
+
* `{enroll_code}`. The code travels only in the request BODY (never a query string). A non-2xx
|
|
42
|
+
* response is surfaced as an actionable `EnrollmentError` (invalid/expired/already-used codes all
|
|
43
|
+
* return a uniform server error; burn-on-first-attempt is server-side).
|
|
44
|
+
*/
|
|
45
|
+
export declare function redeemEnrollmentCode(code: string, opts?: RedeemOptions): Promise<RedeemedCredential>;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the enrollment code from `--enroll <code>` (argv) or `--enroll-stdin` (stdin), enforcing
|
|
48
|
+
* mutual exclusion. `--enroll-stdin` reads via the injected `readStdin` so the code NEVER lands in
|
|
49
|
+
* argv / shell history. `readStdin` is only invoked in the stdin mode.
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveEnrollCode(opts: {
|
|
52
|
+
enroll?: string;
|
|
53
|
+
enrollStdin?: boolean;
|
|
54
|
+
}, readStdin: () => string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Add (or replace) the `/p/<pin>` routing segment on a config URL so an agent session launched in
|
|
57
|
+
* this project folder routes strictly to this project's engine (design 06 D14). Existing `/p/<pin>`
|
|
58
|
+
* segments are replaced; the port / host / scheme are preserved.
|
|
59
|
+
*/
|
|
60
|
+
export declare function pinUrl(rawUrl: string, pin: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* The exact project-root STRING to feed into ProjectIdentity so the CLI-derived pin matches the
|
|
63
|
+
* plugin's. The Unity plugin registers with `ProjectIdentity.DerivePin(UnityMcpPluginEditor
|
|
64
|
+
* .ProjectRootPath)`, where `ProjectRootPath => Path.GetDirectoryName(Application.dataPath)`.
|
|
65
|
+
* `Application.dataPath` is forward-slash on EVERY platform (incl. Windows: `C:/proj/Assets`), so
|
|
66
|
+
* the plugin hashes a forward-slash root like `C:/proj`. Node's `path.resolve` yields BACKSLASHES
|
|
67
|
+
* on Windows (`C:\proj`), which the ProjectIdentity golden vectors hash to a DIFFERENT pin — so we
|
|
68
|
+
* convert separators to `/` here (a no-op on POSIX) to route to the same engine instance.
|
|
69
|
+
*/
|
|
70
|
+
export declare function projectRootForIdentity(projectPath: string): string;
|
|
71
|
+
export interface PinUpsertResult {
|
|
72
|
+
updatedFiles: string[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Upsert the project pin into every EXISTING project-local (project-scoped) JSON agent config that
|
|
76
|
+
* carries an `ai-game-developer` server entry with a `url` / `serverUrl`. Global client config
|
|
77
|
+
* files (Claude Desktop, Antigravity, Cline, the Copilot CLI) are never touched — the golden path
|
|
78
|
+
* writes no user-global entry. TOML (Codex) configs are left to the server binary's own
|
|
79
|
+
* `configure`. Returns the list of files actually rewritten.
|
|
80
|
+
*/
|
|
81
|
+
export declare function upsertProjectPinIntoConfigs(projectPath: string, pin: string): PinUpsertResult;
|
|
82
|
+
export interface RunEnrollOptions {
|
|
83
|
+
code: string;
|
|
84
|
+
projectPath: string;
|
|
85
|
+
store: MachineCredentialStore;
|
|
86
|
+
baseUrl?: string;
|
|
87
|
+
fetchImpl?: typeof fetch;
|
|
88
|
+
}
|
|
89
|
+
export interface RunEnrollResult {
|
|
90
|
+
serverTarget: string;
|
|
91
|
+
pin: string;
|
|
92
|
+
credentialPath: string;
|
|
93
|
+
markerPath: string;
|
|
94
|
+
pinnedConfigs: string[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Execute the full enrollment side effect: redeem → persist the plugin credential to the SHARED
|
|
98
|
+
* machine store → write the project marker with the server target → upsert the D14 pin into
|
|
99
|
+
* existing project-local configs. NEVER writes a project token file / `cloudToken` config.
|
|
100
|
+
*/
|
|
101
|
+
export declare function runEnroll(opts: RunEnrollOptions): Promise<RunEnrollResult>;
|