godot-cli 0.16.2 → 0.17.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.
Files changed (43) hide show
  1. package/dist/commands/configure.js +24 -1
  2. package/dist/commands/configure.js.map +1 -1
  3. package/dist/commands/install-plugin.js +99 -7
  4. package/dist/commands/install-plugin.js.map +1 -1
  5. package/dist/commands/login.js +53 -15
  6. package/dist/commands/login.js.map +1 -1
  7. package/dist/lib/configure-agent.d.ts +20 -0
  8. package/dist/lib/configure-agent.js +115 -0
  9. package/dist/lib/configure-agent.js.map +1 -0
  10. package/dist/lib/enroll.d.ts +21 -0
  11. package/dist/lib/enroll.js +100 -0
  12. package/dist/lib/enroll.js.map +1 -0
  13. package/dist/lib/install-server.d.ts +25 -0
  14. package/dist/lib/install-server.js +234 -0
  15. package/dist/lib/install-server.js.map +1 -0
  16. package/dist/lib/types.d.ts +138 -0
  17. package/dist/lib.d.ts +4 -1
  18. package/dist/lib.js +3 -0
  19. package/dist/lib.js.map +1 -1
  20. package/dist/utils/addon-deps.js +2 -2
  21. package/dist/utils/addon-deps.js.map +1 -1
  22. package/dist/utils/cloud-login.d.ts +22 -4
  23. package/dist/utils/cloud-login.js +40 -17
  24. package/dist/utils/cloud-login.js.map +1 -1
  25. package/dist/utils/connection.d.ts +4 -7
  26. package/dist/utils/connection.js +8 -10
  27. package/dist/utils/connection.js.map +1 -1
  28. package/dist/utils/enroll.d.ts +39 -0
  29. package/dist/utils/enroll.js +66 -0
  30. package/dist/utils/enroll.js.map +1 -0
  31. package/dist/utils/machine-credentials.d.ts +74 -0
  32. package/dist/utils/machine-credentials.js +182 -0
  33. package/dist/utils/machine-credentials.js.map +1 -0
  34. package/dist/utils/project-identity.d.ts +76 -0
  35. package/dist/utils/project-identity.js +111 -0
  36. package/dist/utils/project-identity.js.map +1 -0
  37. package/dist/utils/project-marker.d.ts +64 -0
  38. package/dist/utils/project-marker.js +192 -0
  39. package/dist/utils/project-marker.js.map +1 -0
  40. package/dist/utils/server-source.d.ts +84 -0
  41. package/dist/utils/server-source.js +217 -0
  42. package/dist/utils/server-source.js.map +1 -0
  43. package/package.json +1 -1
@@ -4,6 +4,7 @@ import * as path from 'path';
4
4
  import * as ui from '../utils/ui.js';
5
5
  import { verbose } from '../utils/ui.js';
6
6
  import { getOrCreateConfig, writeConfig, updateFeatures, } from '../utils/config.js';
7
+ import { configureAgentViaServer } from '../lib/configure-agent.js';
7
8
  function parseCommaSeparated(value) {
8
9
  return value.split(',').map((s) => s.trim()).filter(Boolean);
9
10
  }
@@ -21,9 +22,11 @@ function snapshotFeatures(config, key) {
21
22
  .map((f) => ({ name: f.name, enabled: f.enabled }));
22
23
  }
23
24
  export const configureCommand = new Command('configure')
24
- .description('List / enable / disable MCP tools, prompts, and resources in the project-local .godot-mcp/features.json')
25
+ .description('Configure an AI agent for the project (--agent <id> proxies to the managed gamedev-mcp-server binary, writing that client\'s MCP config with the derived pin + port), OR list / enable / disable MCP tools, prompts, and resources in the project-local .godot-mcp/features.json')
25
26
  .argument('[path]', 'Path to the Godot project')
26
27
  .option('--path <path>', 'Path to the Godot project')
28
+ .option('--agent <id>', 'Configure an AI agent by proxying to the managed gamedev-mcp-server binary (requires install-plugin --with-server)')
29
+ .option('--url <url>', 'Explicit MCP server URL override forwarded to the server binary (--agent only)')
27
30
  .option('--enable-tools <names>', 'Enable specific tools (comma-separated)', parseCommaSeparated)
28
31
  .option('--disable-tools <names>', 'Disable specific tools (comma-separated)', parseCommaSeparated)
29
32
  .option('--enable-all-tools', 'Enable all tools')
@@ -48,6 +51,26 @@ export const configureCommand = new Command('configure')
48
51
  ui.error(`Project path does not exist: ${projectPath}`);
49
52
  process.exit(1);
50
53
  }
54
+ // --agent: proxy to the managed gamedev-mcp-server binary's configurator surface.
55
+ if (options.agent !== undefined) {
56
+ ui.heading(`Configuring agent "${options.agent}"`);
57
+ const spinner = ui.startSpinner('Proxying to the managed server binary...');
58
+ const result = await configureAgentViaServer({
59
+ godotProjectPath: projectPath,
60
+ agentId: options.agent,
61
+ url: options.url,
62
+ });
63
+ if (result.kind === 'failure') {
64
+ spinner.error('Failed to configure agent');
65
+ ui.error(result.error.message);
66
+ process.exit(1);
67
+ }
68
+ spinner.success(`Configured "${result.agentId}" via ${result.serverBinaryPath}`);
69
+ if (result.output.trim().length > 0) {
70
+ console.log(result.output.trimEnd());
71
+ }
72
+ return;
73
+ }
51
74
  verbose(`Loading config for project: ${projectPath}`);
52
75
  const toolsAction = options.list
53
76
  ? undefined
@@ -1 +1 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,13 @@
1
1
  import { Command } from 'commander';
2
2
  import { createRequire } from 'module';
3
+ import * as fs from 'fs';
3
4
  import * as path from 'path';
4
5
  import * as ui from '../utils/ui.js';
5
6
  import { verbose } from '../utils/ui.js';
7
+ import { DEFAULT_CLOUD_BASE_URL } from '../utils/connection.js';
6
8
  import { installPlugin } from '../lib/install-plugin.js';
9
+ import { installServer } from '../lib/install-server.js';
10
+ import { enrollPlugin } from '../lib/enroll.js';
7
11
  /** The CLI's own version — the default addon release version to download. */
8
12
  function cliVersion() {
9
13
  try {
@@ -15,15 +19,47 @@ function cliVersion() {
15
19
  return '';
16
20
  }
17
21
  }
22
+ /** Read a single enrollment code from stdin (so it never lands in argv / shell history). */
23
+ function readEnrollCodeFromStdin() {
24
+ let content;
25
+ try {
26
+ content = fs.readFileSync(0, 'utf-8');
27
+ }
28
+ catch {
29
+ ui.error('Failed to read the enrollment code from stdin.');
30
+ process.exit(1);
31
+ }
32
+ const code = content.trim();
33
+ if (code.length === 0) {
34
+ ui.error('No enrollment code received on stdin.');
35
+ process.exit(1);
36
+ }
37
+ return code;
38
+ }
18
39
  export const installPluginCommand = new Command('install-plugin')
19
- .description('Install the godot_mcp addon into a Godot C# project: materialize res://addons/godot_mcp/ (download the matching GitHub release, or --source a local copy), add the required NuGet PackageReferences and the extension-catalog <EmbeddedResource> to the project .csproj, and enable the plugin in project.godot.')
40
+ .description('Install the godot_mcp addon into a Godot C# project: materialize res://addons/godot_mcp/ (download the matching GitHub release, or --source a local copy), add the required NuGet PackageReferences and the extension-catalog <EmbeddedResource> to the project .csproj, and enable the plugin in project.godot. Optionally download the RID-matched gamedev-mcp-server binary (--with-server) and/or redeem an agent enrollment code (--enroll / --enroll-stdin).')
20
41
  .argument('[path]', 'Path to the Godot project')
21
42
  .option('--path <path>', 'Path to the Godot project')
22
43
  .option('--source <path>', 'Install the addon from a local directory (offline / dev / CI) instead of downloading it')
23
44
  .option('--version <x.y.z>', 'Addon release version to download (defaults to this CLI version). Ignored with --source.')
45
+ .option('--with-server', 'Also download the RID-matched gamedev-mcp-server binary into the CLI-managed dir (verified against the release SHA256SUMS)')
46
+ .option('--server-source <path>', 'Install the server binary from a local directory or .zip (offline / dev / CI) instead of downloading it. Implies --with-server.')
47
+ .option('--server-version <x.y.z>', "Server version to download (defaults to the addon's pinned ServerVersion). Ignored with --server-source.")
48
+ .option('--enroll <code>', 'Redeem an agent enrollment code (plants a plugin credential, no browser hop)')
49
+ .option('--enroll-stdin', 'Read the enrollment code from stdin instead of argv (keeps it out of shell history)')
50
+ .option('--base-url <url>', 'Cloud base URL to redeem the enrollment code against (default: https://ai-game.dev)')
24
51
  .action(async (positionalPath, options) => {
25
52
  const resolvedPath = positionalPath ?? options.path ?? process.cwd();
26
53
  const projectPath = path.resolve(resolvedPath);
54
+ // Resolve the enrollment code (argv vs stdin) up-front so misuse fails fast.
55
+ if (options.enroll !== undefined && options.enrollStdin) {
56
+ ui.error('Use either --enroll <code> or --enroll-stdin, not both.');
57
+ process.exit(1);
58
+ }
59
+ const enrollCode = options.enrollStdin ? readEnrollCodeFromStdin() : options.enroll;
60
+ const wantServer = options.withServer === true || options.serverSource !== undefined;
61
+ let failed = false;
62
+ // 1. Addon install (the existing real installer — always runs).
27
63
  ui.heading('Installing godot_mcp addon');
28
64
  verbose(`Project path: ${projectPath}`);
29
65
  if (options.source)
@@ -58,13 +94,9 @@ export const installPluginCommand = new Command('install-plugin')
58
94
  }
59
95
  // csproj outcome.
60
96
  if (result.csproj.csprojPath) {
61
- const summary = result.csproj.packages
62
- .map((p) => `${p.id}@${p.version} (${p.action})`)
63
- .join(', ');
97
+ const summary = result.csproj.packages.map((p) => `${p.id}@${p.version} (${p.action})`).join(', ');
64
98
  ui.label('NuGet packages', summary || '(none)');
65
- const embedSummary = result.csproj.embeds
66
- .map((e) => `${e.logicalName} (${e.action})`)
67
- .join(', ');
99
+ const embedSummary = result.csproj.embeds.map((e) => `${e.logicalName} (${e.action})`).join(', ');
68
100
  ui.label('Embedded resources', embedSummary || '(none)');
69
101
  }
70
102
  ui.label('project.godot', result.projectGodotPath);
@@ -73,5 +105,65 @@ export const installPluginCommand = new Command('install-plugin')
73
105
  console.log('');
74
106
  ui.warn(warning);
75
107
  }
108
+ // 2. Server binary (--with-server / --server-source).
109
+ if (wantServer) {
110
+ console.log('');
111
+ ui.heading('Downloading gamedev-mcp-server');
112
+ const serverSpinner = ui.startSpinner('Installing server binary...');
113
+ const serverResult = await installServer({
114
+ godotProjectPath: projectPath,
115
+ source: options.serverSource,
116
+ version: options.serverVersion,
117
+ });
118
+ if (serverResult.kind === 'failure') {
119
+ serverSpinner.error('Failed to install server binary');
120
+ ui.error(serverResult.error.message);
121
+ failed = true;
122
+ }
123
+ else {
124
+ serverSpinner.success(serverResult.source === 'download'
125
+ ? `gamedev-mcp-server ${serverResult.version} (${serverResult.rid}) verified + installed`
126
+ : `gamedev-mcp-server installed from local source (${serverResult.rid})`);
127
+ ui.label('Server binary', serverResult.executablePath);
128
+ for (const warning of serverResult.warnings) {
129
+ console.log('');
130
+ ui.warn(warning);
131
+ }
132
+ }
133
+ }
134
+ // 3. Enrollment (--enroll / --enroll-stdin).
135
+ if (enrollCode !== undefined) {
136
+ console.log('');
137
+ ui.heading('Redeeming enrollment code');
138
+ const enrollSpinner = ui.startSpinner('Redeeming...');
139
+ const enrollResult = await enrollPlugin({
140
+ godotProjectPath: projectPath,
141
+ code: enrollCode,
142
+ baseUrl: options.baseUrl ?? DEFAULT_CLOUD_BASE_URL,
143
+ });
144
+ if (enrollResult.kind === 'failure') {
145
+ enrollSpinner.error('Enrollment failed');
146
+ ui.error(enrollResult.error.message);
147
+ failed = true;
148
+ }
149
+ else {
150
+ enrollSpinner.success('Enrolled — plugin credential planted in the machine store');
151
+ ui.label('Server target', enrollResult.serverTarget);
152
+ ui.label('Project pin', enrollResult.pin);
153
+ if (enrollResult.port !== undefined)
154
+ ui.label('Local port', String(enrollResult.port));
155
+ ui.label('Credential', enrollResult.credentialsPath);
156
+ ui.label('Project marker', enrollResult.markerPath);
157
+ if (enrollResult.pinnedConfigs.length > 0) {
158
+ ui.label('Pinned configs', enrollResult.pinnedConfigs.join(', '));
159
+ }
160
+ for (const warning of enrollResult.warnings) {
161
+ console.log('');
162
+ ui.warn(warning);
163
+ }
164
+ }
165
+ }
166
+ if (failed)
167
+ process.exit(1);
76
168
  });
77
169
  //# sourceMappingURL=install-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../../src/commands/install-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../../src/commands/install-plugin.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,30 @@
1
1
  import { Command } from 'commander';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
2
4
  import * as ui from '../utils/ui.js';
3
5
  import { verbose } from '../utils/ui.js';
4
- import { resolveProjectPath, DEFAULT_CLOUD_BASE_URL } from '../utils/connection.js';
5
- import { readCloudToken, readCredentials } from '../utils/credentials.js';
6
+ import { DEFAULT_CLOUD_BASE_URL } from '../utils/connection.js';
7
+ import { readCredentials } from '../utils/credentials.js';
8
+ import { readMachineCredentials, getMachineCredentialsPath } from '../utils/machine-credentials.js';
6
9
  import { runCloudLogin } from '../utils/cloud-login.js';
7
10
  export const loginCommand = new Command('login')
8
- .description('Authenticate with the Godot-MCP cloud server (ai-game.dev) via the RFC 8628 device-authorization flow and persist the cloud token so `godot-cli open --mode Cloud` connects without a manual --token.')
9
- .argument('[path]', 'Godot project path where the token is saved (defaults to current directory)')
10
- .option('--path <path>', 'Godot project path (defaults to current directory)')
11
+ .description('Authenticate with the Godot-MCP cloud server (ai-game.dev) via the RFC 8628 device-authorization flow. ' +
12
+ 'By default the credential is saved to the shared machine store (~/.ai-game-dev/credentials.json, 0600 / ' +
13
+ 'DPAPI) so you sign in once per machine and the editor plugin auto-adopts it. Use --project <path> to keep ' +
14
+ 'a per-project credential (project-local .godot-mcp/credentials.json, gitignored) instead.')
15
+ .argument('[path]', 'Project path for a per-project credential override (alias of --project). Omit for the machine store.')
16
+ .option('--project <path>', 'Save a per-project credential under <path>/.godot-mcp/ instead of the machine store')
17
+ .option('--path <path>', 'Alias of --project (kept for backward compatibility)')
11
18
  .option('--base-url <url>', 'Override the cloud base URL (default: https://ai-game.dev)')
12
- .option('--force', 'Re-authenticate even if a cloud token is already saved')
19
+ .option('--force', 'Re-authenticate even if a credential is already saved')
13
20
  .action(async (positionalPath, options) => {
14
- const projectPath = resolveProjectPath(positionalPath, options);
15
- verbose(`Project path: ${projectPath}`);
16
21
  const baseUrl = (options.baseUrl ?? DEFAULT_CLOUD_BASE_URL).replace(/\/$/, '');
17
- // Only short-circuit when a token is saved AND it was issued against the SAME
18
- // base URL. Otherwise `login --base-url <other>` (without --force) would silently
19
- // reuse a token minted for a different server. readCloudToken() truthy implies the
20
- // credentials file parsed, so the follow-up readCredentials() cannot throw here.
21
- if (!options.force && readCloudToken(projectPath) && readCredentials(projectPath)?.cloudBaseUrl === baseUrl) {
22
+ const { sink, savedLocationLabel } = resolveSink(positionalPath, options);
23
+ verbose(`Credential store: ${savedLocationLabel}`);
24
+ // Only short-circuit when a credential is saved in the SAME store AND it was issued against the
25
+ // SAME base URL. Otherwise `login --base-url <other>` (without --force) would silently reuse a
26
+ // credential minted for a different server.
27
+ if (!options.force && isAlreadyAuthenticated(sink, baseUrl)) {
22
28
  ui.success('Already authenticated with the cloud server.');
23
29
  ui.info('Use --force to re-authenticate.');
24
30
  return;
@@ -26,13 +32,45 @@ export const loginCommand = new Command('login')
26
32
  ui.heading('Cloud Authentication');
27
33
  ui.label('Server', baseUrl);
28
34
  ui.divider();
29
- const token = await runCloudLogin(projectPath, { baseUrl });
35
+ const token = await runCloudLogin({ baseUrl, sink });
30
36
  if (token) {
31
- ui.success('Authentication complete. Cloud token saved to .godot-mcp/credentials.json.');
37
+ ui.success(`Authentication complete. Cloud token saved to ${savedLocationLabel}.`);
32
38
  ui.info('Run: godot-cli open --mode Cloud (no --token needed).');
33
39
  }
34
40
  else {
35
41
  process.exit(1);
36
42
  }
37
43
  });
44
+ /**
45
+ * Resolve where the credential should be stored. A project override (via --project, the legacy
46
+ * --path, or the positional arg) selects the project-local store; otherwise the shared machine store.
47
+ */
48
+ function resolveSink(positionalPath, options) {
49
+ const overrideRaw = options.project ?? options.path ?? positionalPath;
50
+ if (overrideRaw !== undefined) {
51
+ const projectPath = path.resolve(overrideRaw);
52
+ if (!fs.existsSync(projectPath)) {
53
+ ui.error(`Project path does not exist: ${projectPath}`);
54
+ process.exit(1);
55
+ }
56
+ return {
57
+ sink: { kind: 'project', projectPath },
58
+ savedLocationLabel: path.join(projectPath, '.godot-mcp', 'credentials.json'),
59
+ };
60
+ }
61
+ return { sink: { kind: 'machine' }, savedLocationLabel: getMachineCredentialsPath() };
62
+ }
63
+ function isAlreadyAuthenticated(sink, baseUrl) {
64
+ try {
65
+ if (sink.kind === 'project') {
66
+ const creds = readCredentials(sink.projectPath);
67
+ return !!creds?.cloudToken && creds.cloudBaseUrl === baseUrl;
68
+ }
69
+ const creds = readMachineCredentials(sink.storeBaseDir);
70
+ return !!creds?.accessToken && creds.serverTarget === baseUrl;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
38
76
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,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,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQxD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CACV,uMAAuM,CACxM;KACA,QAAQ,CAAC,QAAQ,EAAE,+EAA+E,CAAC;KACnG,MAAM,CAAC,eAAe,EAAE,oDAAoD,CAAC;KAC7E,MAAM,CAAC,kBAAkB,EAAE,4DAA4D,CAAC;KACxF,MAAM,CAAC,SAAS,EAAE,wDAAwD,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAAqB,EAAE,EAAE;IAC1E,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE/E,8EAA8E;IAC9E,kFAAkF;IAClF,mFAAmF;IACnF,iFAAiF;IACjF,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,YAAY,KAAK,OAAO,EAAE,CAAC;QAC5G,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;QAC3D,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5B,EAAE,CAAC,OAAO,EAAE,CAAC;IAEb,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,EAAE,CAAC;QACV,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC;QACzF,EAAE,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ConfigureAgentOptions, ConfigureAgentResult } from './types.js';
2
+ /**
3
+ * Proxy `configure --agent <id>` to the CLI-managed `gamedev-mcp-server` binary's
4
+ * own `configure` subcommand (design 06 / 09 workflow 1B, step 2). The downloaded
5
+ * server binary — placed by `install-plugin --with-server` in the CLI's managed
6
+ * dir, NOT on PATH — owns the shared C# configurator registry and writes the
7
+ * agent's MCP-client config (with the derived `port=` + `project=` pin). The CLI
8
+ * merely locates the managed binary and spawns:
9
+ *
10
+ * <managed-server> configure --agent <id> [--url <url>] (cwd = project root)
11
+ *
12
+ * forwarding the agent id + optional URL and the binary's exit code. cwd is the
13
+ * project root so the server derives this project's pin + port. When no managed
14
+ * binary exists (the user never ran `--with-server`), a clean failure tells them
15
+ * to run it first — NOT a cryptic ENOENT.
16
+ *
17
+ * Library-safe: never throws past the boundary; captures the server's output and
18
+ * returns it (the command prints it). `spawnImpl` is injectable for tests.
19
+ */
20
+ export declare function configureAgentViaServer(opts: ConfigureAgentOptions): Promise<ConfigureAgentResult>;
@@ -0,0 +1,115 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { spawn } from 'child_process';
4
+ import { getManagedServerExecutablePath } from './install-server.js';
5
+ import { emitProgress } from './progress.js';
6
+ /**
7
+ * Proxy `configure --agent <id>` to the CLI-managed `gamedev-mcp-server` binary's
8
+ * own `configure` subcommand (design 06 / 09 workflow 1B, step 2). The downloaded
9
+ * server binary — placed by `install-plugin --with-server` in the CLI's managed
10
+ * dir, NOT on PATH — owns the shared C# configurator registry and writes the
11
+ * agent's MCP-client config (with the derived `port=` + `project=` pin). The CLI
12
+ * merely locates the managed binary and spawns:
13
+ *
14
+ * <managed-server> configure --agent <id> [--url <url>] (cwd = project root)
15
+ *
16
+ * forwarding the agent id + optional URL and the binary's exit code. cwd is the
17
+ * project root so the server derives this project's pin + port. When no managed
18
+ * binary exists (the user never ran `--with-server`), a clean failure tells them
19
+ * to run it first — NOT a cryptic ENOENT.
20
+ *
21
+ * Library-safe: never throws past the boundary; captures the server's output and
22
+ * returns it (the command prints it). `spawnImpl` is injectable for tests.
23
+ */
24
+ export async function configureAgentViaServer(opts) {
25
+ const warnings = [];
26
+ try {
27
+ const projectPath = path.resolve(opts.godotProjectPath);
28
+ if (!fs.existsSync(projectPath)) {
29
+ throw new Error(`Project path does not exist: ${projectPath}`);
30
+ }
31
+ const agentId = (opts.agentId ?? '').trim();
32
+ if (agentId.length === 0) {
33
+ throw new Error('An agent id is required (configure --agent <id>).');
34
+ }
35
+ const serverBinaryPath = getManagedServerExecutablePath(projectPath);
36
+ if (!fs.existsSync(serverBinaryPath)) {
37
+ throw new Error(`No managed server binary found at ${serverBinaryPath}. ` +
38
+ `Run \`godot-cli install-plugin --with-server\` first to download it.`);
39
+ }
40
+ const args = ['configure', '--agent', agentId];
41
+ if (opts.url && opts.url.trim().length > 0) {
42
+ args.push('--url', opts.url.trim());
43
+ }
44
+ emitProgress(opts.onProgress, {
45
+ phase: 'start',
46
+ message: `Proxying to ${serverBinaryPath} ${args.join(' ')}`,
47
+ });
48
+ const run = await runServerConfigure(serverBinaryPath, args, projectPath, opts.spawnImpl);
49
+ if (run.code !== 0) {
50
+ const detail = run.output.trim();
51
+ const err = new Error(`The managed server \`configure --agent ${agentId}\` exited with code ${run.code ?? 'null'}.` +
52
+ (detail.length > 0 ? `\n${detail}` : ''));
53
+ return { kind: 'failure', success: false, exitCode: run.code ?? undefined, warnings, error: err };
54
+ }
55
+ emitProgress(opts.onProgress, { phase: 'done', message: `Configured ${agentId} via the managed server.` });
56
+ return {
57
+ kind: 'success',
58
+ success: true,
59
+ agentId,
60
+ serverBinaryPath,
61
+ args,
62
+ exitCode: 0,
63
+ output: run.output,
64
+ warnings,
65
+ };
66
+ }
67
+ catch (err) {
68
+ return {
69
+ kind: 'failure',
70
+ success: false,
71
+ warnings,
72
+ error: err instanceof Error ? err : new Error(String(err)),
73
+ };
74
+ }
75
+ }
76
+ /**
77
+ * Spawn the managed server's `configure` subcommand, capturing stdout+stderr, and
78
+ * resolve once it exits. A spawn `error` (e.g. the binary is not executable)
79
+ * resolves as a non-zero run rather than throwing past the boundary. `spawnImpl`
80
+ * is injectable for unit tests.
81
+ */
82
+ function runServerConfigure(bin, args, cwd, spawnImpl = spawn) {
83
+ return new Promise((resolve) => {
84
+ let settled = false;
85
+ const finish = (run) => {
86
+ if (settled)
87
+ return;
88
+ settled = true;
89
+ resolve(run);
90
+ };
91
+ let child;
92
+ try {
93
+ child = spawnImpl(bin, args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
94
+ }
95
+ catch (err) {
96
+ const msg = err instanceof Error ? err.message : String(err);
97
+ finish({ code: 127, output: `Failed to spawn "${bin}": ${msg}` });
98
+ return;
99
+ }
100
+ let output = '';
101
+ child.stdout?.on('data', (chunk) => {
102
+ output += chunk.toString();
103
+ });
104
+ child.stderr?.on('data', (chunk) => {
105
+ output += chunk.toString();
106
+ });
107
+ child.on('error', (err) => {
108
+ finish({ code: 127, output: `${output}\nFailed to run "${bin}": ${err.message}` });
109
+ });
110
+ child.on('close', (code) => {
111
+ finish({ code, output });
112
+ });
113
+ });
114
+ }
115
+ //# sourceMappingURL=configure-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-agent.js","sourceRoot":"","sources":["../../src/lib/configure-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { EnrollPluginOptions, EnrollPluginResult } from './types.js';
2
+ /**
3
+ * Redeem a D13 enrollment code and complete the agent-first onboarding for a
4
+ * project (design 06 / 09 workflow 1A, step 3), with NO browser hop:
5
+ *
6
+ * 1. POST the code to the cloud AS `enroll/redeem` endpoint → an `mcp:plugin`
7
+ * JWT + refresh token + the server-target URL the code was minted for.
8
+ * 2. Persist the plugin credential to the SHARED machine store
9
+ * (`~/.ai-game-dev/credentials.json`, 0600 / DPAPI) so the editor plugin
10
+ * auto-adopts it (D12) — zero editor clicks.
11
+ * 3. Write the project marker (`.ai-game-dev/project.json`) with the server
12
+ * target, the D14 pin, and — for a localhost target — the deterministic
13
+ * local port.
14
+ * 4. Upsert the D14 pin into any existing project-local agent config entry so a
15
+ * server the user added manually before enrolling becomes pinned.
16
+ *
17
+ * Library-safe: never throws past the boundary; returns a `{ kind }` union. On a
18
+ * redeem failure NOTHING is written (the machine store + marker + configs are
19
+ * left as found).
20
+ */
21
+ export declare function enrollPlugin(opts: EnrollPluginOptions): Promise<EnrollPluginResult>;
@@ -0,0 +1,100 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { DEFAULT_CLOUD_BASE_URL } from '../utils/connection.js';
4
+ import { redeemEnrollment } from '../utils/enroll.js';
5
+ import { writeMachineCredentials, readMachineCredentials, getMachineCredentialsPath, } from '../utils/machine-credentials.js';
6
+ import { derivePin, derivePort } from '../utils/project-identity.js';
7
+ import { writeProjectMarker, getProjectMarkerPath, isLocalhostUrl, upsertPinIntoAgentConfigs, } from '../utils/project-marker.js';
8
+ import { emitProgress } from './progress.js';
9
+ /**
10
+ * Redeem a D13 enrollment code and complete the agent-first onboarding for a
11
+ * project (design 06 / 09 workflow 1A, step 3), with NO browser hop:
12
+ *
13
+ * 1. POST the code to the cloud AS `enroll/redeem` endpoint → an `mcp:plugin`
14
+ * JWT + refresh token + the server-target URL the code was minted for.
15
+ * 2. Persist the plugin credential to the SHARED machine store
16
+ * (`~/.ai-game-dev/credentials.json`, 0600 / DPAPI) so the editor plugin
17
+ * auto-adopts it (D12) — zero editor clicks.
18
+ * 3. Write the project marker (`.ai-game-dev/project.json`) with the server
19
+ * target, the D14 pin, and — for a localhost target — the deterministic
20
+ * local port.
21
+ * 4. Upsert the D14 pin into any existing project-local agent config entry so a
22
+ * server the user added manually before enrolling becomes pinned.
23
+ *
24
+ * Library-safe: never throws past the boundary; returns a `{ kind }` union. On a
25
+ * redeem failure NOTHING is written (the machine store + marker + configs are
26
+ * left as found).
27
+ */
28
+ export async function enrollPlugin(opts) {
29
+ const warnings = [];
30
+ try {
31
+ const projectPath = path.resolve(opts.godotProjectPath);
32
+ if (!fs.existsSync(projectPath)) {
33
+ throw new Error(`Project path does not exist: ${projectPath}`);
34
+ }
35
+ const baseUrl = (opts.baseUrl ?? DEFAULT_CLOUD_BASE_URL).replace(/\/$/, '');
36
+ emitProgress(opts.onProgress, { phase: 'enroll-redeeming', message: 'Redeeming enrollment code' });
37
+ const redeem = await redeemEnrollment({ code: opts.code, baseUrl, fetchImpl: opts.fetchImpl });
38
+ if (!redeem.success) {
39
+ // A redeem failure is terminal but non-throwing — nothing was written.
40
+ throw new Error(redeem.message);
41
+ }
42
+ const { access_token, refresh_token, expires_in, server_url } = redeem.credential;
43
+ const serverTarget = server_url;
44
+ // 2. Machine store: plant the plugin credential, preserving any existing
45
+ // identity fields (e.g. `subject`), replacing token material + server target.
46
+ let existing = {};
47
+ try {
48
+ existing = readMachineCredentials(opts.storeBaseDir) ?? {};
49
+ }
50
+ catch {
51
+ existing = {};
52
+ }
53
+ const expiresAt = typeof expires_in === 'number' && expires_in > 0
54
+ ? new Date(Date.now() + expires_in * 1000).toISOString()
55
+ : undefined;
56
+ writeMachineCredentials({
57
+ ...existing,
58
+ version: 1,
59
+ accessToken: access_token,
60
+ refreshToken: refresh_token,
61
+ ...(expiresAt ? { expiresAt } : {}),
62
+ serverTarget,
63
+ }, opts.storeBaseDir);
64
+ const credentialsPath = getMachineCredentialsPath(opts.storeBaseDir);
65
+ emitProgress(opts.onProgress, { phase: 'enroll-redeemed', message: 'Credential planted', serverTarget });
66
+ // 3. Project marker: server target + pin (+ derived port for a localhost target).
67
+ const pin = derivePin(projectPath);
68
+ const localhost = isLocalhostUrl(serverTarget);
69
+ const port = localhost ? derivePort(projectPath) : undefined;
70
+ writeProjectMarker(projectPath, {
71
+ serverTarget,
72
+ pin,
73
+ ...(port !== undefined ? { port } : {}),
74
+ });
75
+ const markerPath = getProjectMarkerPath(projectPath);
76
+ // 4. Upsert the pin into any existing project-local agent config entry.
77
+ const pinnedConfigs = upsertPinIntoAgentConfigs(projectPath, pin);
78
+ emitProgress(opts.onProgress, { phase: 'done', message: 'Enrollment complete.' });
79
+ return {
80
+ kind: 'success',
81
+ success: true,
82
+ serverTarget,
83
+ pin,
84
+ port,
85
+ credentialsPath,
86
+ markerPath,
87
+ pinnedConfigs,
88
+ warnings,
89
+ };
90
+ }
91
+ catch (err) {
92
+ return {
93
+ kind: 'failure',
94
+ success: false,
95
+ warnings,
96
+ error: err instanceof Error ? err : new Error(String(err)),
97
+ };
98
+ }
99
+ }
100
+ //# sourceMappingURL=enroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enroll.js","sourceRoot":"","sources":["../../src/lib/enroll.ts"],"names":[],"mappings":"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"}