godot-cli 0.19.0 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/dist/lib/setup-mcp.d.ts +2 -2
- package/dist/lib/setup-mcp.js +3 -3
- package/dist/lib/setup-mcp.js.map +1 -1
- package/dist/utils/connection.d.ts +9 -11
- package/dist/utils/connection.js +86 -37
- package/dist/utils/connection.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -140,16 +140,22 @@ Building first guarantees the assembly is present when the addon is instantiated
|
|
|
140
140
|
|
|
141
141
|
### Server URL resolution (`run-tool` / `status` / `wait-for-ready`)
|
|
142
142
|
|
|
143
|
-
|
|
144
|
-
(outside the project tree), so there is no deterministic project-path → port hash. The server base URL is
|
|
145
|
-
resolved as:
|
|
143
|
+
The server base URL a tool call POSTs to (`<base>/api/tools/<name>`) is resolved as:
|
|
146
144
|
|
|
147
145
|
1. `--url <url>` (explicit override).
|
|
148
146
|
2. `GODOT_MCP_HOST` env (Custom-mode host).
|
|
149
|
-
3. `GODOT_MCP_CLOUD_URL` env
|
|
150
|
-
4.
|
|
151
|
-
|
|
152
|
-
|
|
147
|
+
3. `GODOT_MCP_CLOUD_URL` env → the cloud **`/mcp` hub** URL (`/mcp` is appended if absent).
|
|
148
|
+
4. `GODOT_MCP_CONNECTION_MODE=Cloud` → the default cloud hub `https://ai-game.dev/mcp`.
|
|
149
|
+
5. The **enrolled project marker** (`.ai-game-dev/project.json` `serverTarget`, written by
|
|
150
|
+
`install-plugin --enroll`): a hosted target routes to its `/mcp` hub, a `localhost` target is used
|
|
151
|
+
verbatim. This makes an **enrolled cloud project reachable with zero env config** — the persisted
|
|
152
|
+
cloud credential (project store, then `~/.ai-game-dev/credentials.json`) is used automatically.
|
|
153
|
+
6. Local fallback: `http://localhost:<derived-port>`, the deterministic v2 project-path port the
|
|
154
|
+
editor addon binds locally (a marker `portOverride` wins over the hash-derived port).
|
|
155
|
+
|
|
156
|
+
The cloud paths carry the `/mcp` hub segment so the request reaches the hub rather than the cloud
|
|
157
|
+
backend (which serves no `/api/tools/*`). Pass `--url http://localhost:<port>` to target a
|
|
158
|
+
local/self-hosted server explicitly.
|
|
153
159
|
|
|
154
160
|

|
|
155
161
|
|
package/dist/lib/setup-mcp.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CLOUD_MCP_URL
|
|
1
|
+
import { CLOUD_MCP_URL } from '../utils/connection.js';
|
|
2
2
|
import type { SetupMcpOptions, SetupMcpResult } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Decide whether `setup-mcp` writes a static `Authorization: Bearer` header for a
|
|
@@ -41,4 +41,4 @@ export declare function shouldWriteAuthHeader(input: {
|
|
|
41
41
|
export declare function setupMcp(opts: SetupMcpOptions): Promise<SetupMcpResult>;
|
|
42
42
|
/** List every agent id known to `setupMcp`. */
|
|
43
43
|
export declare function listAgentIds(): string[];
|
|
44
|
-
export { CLOUD_MCP_URL
|
|
44
|
+
export { CLOUD_MCP_URL };
|
package/dist/lib/setup-mcp.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import { pinUrl } from '@baizor/gamedev-cli-core';
|
|
3
|
-
import { CLOUD_MCP_URL,
|
|
3
|
+
import { CLOUD_MCP_URL, ENV_HOST, ENV_TOKEN, MCP_HUB_PATH, } from '../utils/connection.js';
|
|
4
4
|
import { getAgentById, getAgentIds, writeJsonAgentConfig, writeTomlAgentConfig, MCP_SERVER_NAME, } from '../utils/agents.js';
|
|
5
5
|
import { derivePinV2 } from '../utils/project-identity.js';
|
|
6
6
|
import { emitProgress } from './progress.js';
|
|
@@ -191,6 +191,6 @@ export async function setupMcp(opts) {
|
|
|
191
191
|
export function listAgentIds() {
|
|
192
192
|
return getAgentIds();
|
|
193
193
|
}
|
|
194
|
-
// Re-export the
|
|
195
|
-
export { CLOUD_MCP_URL
|
|
194
|
+
// Re-export the constant so the CLI command can surface the default URL in help.
|
|
195
|
+
export { CLOUD_MCP_URL };
|
|
196
196
|
//# sourceMappingURL=setup-mcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/lib/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EACL,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/lib/setup-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,6 @@ export declare const DEFAULT_CLOUD_BASE_URL = "https://ai-game.dev";
|
|
|
4
4
|
export declare const MCP_HUB_PATH = "/mcp";
|
|
5
5
|
/** Resolved cloud MCP-client URL (base + /mcp). */
|
|
6
6
|
export declare const CLOUD_MCP_URL = "https://ai-game.dev/mcp";
|
|
7
|
-
/** Default custom-mode host (GodotMcpConfig.DefaultCustomHost). */
|
|
8
|
-
export declare const DEFAULT_CUSTOM_HOST = "http://localhost:8080";
|
|
9
7
|
export declare const ENV_CLOUD_URL = "GODOT_MCP_CLOUD_URL";
|
|
10
8
|
export declare const ENV_HOST = "GODOT_MCP_HOST";
|
|
11
9
|
export declare const ENV_TOKEN = "GODOT_MCP_TOKEN";
|
|
@@ -35,19 +33,19 @@ export declare function resolveAndValidateProjectPath(positionalPath: string | u
|
|
|
35
33
|
* Resolve the MCP server base URL + auth token for direct-tool-call requests
|
|
36
34
|
* (the `<base>/api/tools/<name>` HTTP API exposed by a Godot-MCP server).
|
|
37
35
|
*
|
|
38
|
-
* URL priority
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* 4. default custom host (http://localhost:8080)
|
|
36
|
+
* URL priority — see {@link resolveTargetUrl}. A cloud target carries the `/mcp`
|
|
37
|
+
* hub segment so `<base>/api/tools/<name>` reaches the hub (not the 404'ing
|
|
38
|
+
* backend); a local target is the addon's v2 derived port (or the enrolled
|
|
39
|
+
* marker's recorded localhost target).
|
|
43
40
|
*
|
|
44
41
|
* Token priority:
|
|
45
42
|
* 1. --token flag (explicit override)
|
|
46
43
|
* 2. GODOT_MCP_TOKEN env
|
|
47
|
-
* 3. persisted cloud token (
|
|
48
|
-
* `.godot-mcp/credentials.json` (a `--project`
|
|
49
|
-
* store `~/.ai-game-dev/credentials.json`
|
|
50
|
-
* sign-once-per-machine credential is picked
|
|
44
|
+
* 3. persisted cloud token (cloud targets only — env Cloud mode OR an enrolled
|
|
45
|
+
* hosted marker) — the project-local `.godot-mcp/credentials.json` (a `--project`
|
|
46
|
+
* login) first, then the shared machine store `~/.ai-game-dev/credentials.json`
|
|
47
|
+
* (a default `godot-cli login`), so a sign-once-per-machine credential is picked
|
|
48
|
+
* up here too. An enrolled cloud project therefore authenticates with zero env config.
|
|
51
49
|
*/
|
|
52
50
|
export declare function resolveConnection(projectPath: string, options: ConnectionOptions): {
|
|
53
51
|
url: string;
|
package/dist/utils/connection.js
CHANGED
|
@@ -4,6 +4,8 @@ import { verbose } from './ui.js';
|
|
|
4
4
|
import * as ui from './ui.js';
|
|
5
5
|
import { readCloudToken } from './credentials.js';
|
|
6
6
|
import { readMachineAccessToken } from './machine-credentials.js';
|
|
7
|
+
import { deriveProjectIdentityV2 } from './project-identity.js';
|
|
8
|
+
import { readProjectMarker, isLocalhostUrl } from './project-marker.js';
|
|
7
9
|
// --- Godot MCP connection constants (mirror addons/godot_mcp GodotMcpConfig). ---
|
|
8
10
|
/** Default hosted cloud base URL (GodotMcpConfig.DefaultCloudBaseUrl). */
|
|
9
11
|
export const DEFAULT_CLOUD_BASE_URL = 'https://ai-game.dev';
|
|
@@ -11,8 +13,6 @@ export const DEFAULT_CLOUD_BASE_URL = 'https://ai-game.dev';
|
|
|
11
13
|
export const MCP_HUB_PATH = '/mcp';
|
|
12
14
|
/** Resolved cloud MCP-client URL (base + /mcp). */
|
|
13
15
|
export const CLOUD_MCP_URL = `${DEFAULT_CLOUD_BASE_URL}${MCP_HUB_PATH}`;
|
|
14
|
-
/** Default custom-mode host (GodotMcpConfig.DefaultCustomHost). */
|
|
15
|
-
export const DEFAULT_CUSTOM_HOST = 'http://localhost:8080';
|
|
16
16
|
// --- Environment-variable names the addon reads (GodotMcpConfig EnvX consts). ---
|
|
17
17
|
export const ENV_CLOUD_URL = 'GODOT_MCP_CLOUD_URL';
|
|
18
18
|
export const ENV_HOST = 'GODOT_MCP_HOST';
|
|
@@ -73,50 +73,99 @@ function isCloudMode() {
|
|
|
73
73
|
const mode = normalizeEnv(process.env[ENV_CONNECTION_MODE]);
|
|
74
74
|
return mode !== undefined && mode.toLowerCase() === 'cloud';
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Normalize a cloud/hub base URL so it ends in exactly one `/mcp` hub segment
|
|
78
|
+
* (mirrors `setup-mcp`'s `resolveMcpClientUrl`). The mcp-server's REST
|
|
79
|
+
* direct-tool API is reachable ONLY under the `/mcp`-prefixed route — nginx maps
|
|
80
|
+
* `^/mcp(/|$)` to the mcp-server (stripping `/mcp`) while `/api` alone goes to the
|
|
81
|
+
* cloud backend — so a cloud base that LOSES `/mcp` sends `<base>/api/tools/<name>`
|
|
82
|
+
* to the backend, which 404s (defect A). Trailing slash trimmed; an already-`/mcp`
|
|
83
|
+
* base is left as-is (case-insensitive, idempotent).
|
|
84
|
+
*/
|
|
85
|
+
function ensureMcpHubPath(baseUrl) {
|
|
86
|
+
const trimmed = baseUrl.replace(/\/$/, '');
|
|
87
|
+
if (trimmed.toLowerCase().endsWith(MCP_HUB_PATH))
|
|
88
|
+
return trimmed;
|
|
89
|
+
return trimmed + MCP_HUB_PATH;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolve the base URL a direct-tool-call POSTs to, plus whether that target is
|
|
93
|
+
* the cloud hub. Priority (first match wins):
|
|
94
|
+
* 1. `--url` flag — explicit override, verbatim (trailing slash trimmed).
|
|
95
|
+
* 2. `GODOT_MCP_HOST` env — an explicit Custom-mode host, verbatim.
|
|
96
|
+
* 3. `GODOT_MCP_CLOUD_URL` env — a cloud base, normalized to its `/mcp` hub URL (fix A).
|
|
97
|
+
* 4. `GODOT_MCP_CONNECTION_MODE=Cloud` — the default hosted `/mcp` hub (fix A).
|
|
98
|
+
* 5. Enrolled project marker (`.ai-game-dev/project.json` `serverTarget`) — the
|
|
99
|
+
* ZERO-env-config path (fix B): a hosted target routes to its `/mcp` hub (cloud,
|
|
100
|
+
* so an enrolled project reaches the cloud with no env var set); a localhost
|
|
101
|
+
* target is used verbatim (the derived port enrollment recorded).
|
|
102
|
+
* 6. Local fallback — `http://localhost:<v2-derived-port>`, the deterministic port
|
|
103
|
+
* the addon binds locally (fix B; replaces the dead `http://localhost:8080`). An
|
|
104
|
+
* explicit marker `portOverride` still wins over the hash-derived port.
|
|
105
|
+
*/
|
|
106
|
+
function resolveTargetUrl(projectPath, options) {
|
|
107
|
+
if (options.url) {
|
|
108
|
+
const url = options.url.replace(/\/$/, '');
|
|
109
|
+
verbose(`Using explicit --url: ${url}`);
|
|
110
|
+
return { url, isCloud: false };
|
|
111
|
+
}
|
|
112
|
+
const envHost = normalizeEnv(process.env[ENV_HOST]);
|
|
113
|
+
if (envHost) {
|
|
114
|
+
const url = envHost.replace(/\/$/, '');
|
|
115
|
+
verbose(`Using ${ENV_HOST}: ${url}`);
|
|
116
|
+
return { url, isCloud: false };
|
|
117
|
+
}
|
|
118
|
+
const envCloud = normalizeEnv(process.env[ENV_CLOUD_URL]);
|
|
119
|
+
if (envCloud) {
|
|
120
|
+
const url = ensureMcpHubPath(envCloud);
|
|
121
|
+
verbose(`Using ${ENV_CLOUD_URL} hub URL: ${url}`);
|
|
122
|
+
return { url, isCloud: true };
|
|
123
|
+
}
|
|
124
|
+
if (isCloudMode()) {
|
|
125
|
+
verbose(`Using default cloud hub URL: ${CLOUD_MCP_URL}`);
|
|
126
|
+
return { url: CLOUD_MCP_URL, isCloud: true };
|
|
127
|
+
}
|
|
128
|
+
// The enrolled marker (and any port override) is read once here — it backs both
|
|
129
|
+
// the zero-config marker target (5) and the derived-port fallback (6).
|
|
130
|
+
const marker = readProjectMarker(projectPath);
|
|
131
|
+
const rawTarget = marker?.serverTarget;
|
|
132
|
+
const serverTarget = typeof rawTarget === 'string' && rawTarget.trim().length > 0 ? rawTarget.trim() : undefined;
|
|
133
|
+
if (serverTarget) {
|
|
134
|
+
if (isLocalhostUrl(serverTarget)) {
|
|
135
|
+
const url = serverTarget.replace(/\/$/, '');
|
|
136
|
+
verbose(`Using enrolled marker localhost target: ${url}`);
|
|
137
|
+
return { url, isCloud: false };
|
|
138
|
+
}
|
|
139
|
+
const url = ensureMcpHubPath(serverTarget);
|
|
140
|
+
verbose(`Using enrolled marker cloud hub URL: ${url}`);
|
|
141
|
+
return { url, isCloud: true };
|
|
142
|
+
}
|
|
143
|
+
const portOverride = typeof marker?.portOverride === 'number' ? marker.portOverride : null;
|
|
144
|
+
const { port } = deriveProjectIdentityV2(projectPath, portOverride);
|
|
145
|
+
const url = `http://localhost:${port}`;
|
|
146
|
+
verbose(`Using derived local port fallback: ${url}`);
|
|
147
|
+
return { url, isCloud: false };
|
|
148
|
+
}
|
|
76
149
|
/**
|
|
77
150
|
* Resolve the MCP server base URL + auth token for direct-tool-call requests
|
|
78
151
|
* (the `<base>/api/tools/<name>` HTTP API exposed by a Godot-MCP server).
|
|
79
152
|
*
|
|
80
|
-
* URL priority
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* 4. default custom host (http://localhost:8080)
|
|
153
|
+
* URL priority — see {@link resolveTargetUrl}. A cloud target carries the `/mcp`
|
|
154
|
+
* hub segment so `<base>/api/tools/<name>` reaches the hub (not the 404'ing
|
|
155
|
+
* backend); a local target is the addon's v2 derived port (or the enrolled
|
|
156
|
+
* marker's recorded localhost target).
|
|
85
157
|
*
|
|
86
158
|
* Token priority:
|
|
87
159
|
* 1. --token flag (explicit override)
|
|
88
160
|
* 2. GODOT_MCP_TOKEN env
|
|
89
|
-
* 3. persisted cloud token (
|
|
90
|
-
* `.godot-mcp/credentials.json` (a `--project`
|
|
91
|
-
* store `~/.ai-game-dev/credentials.json`
|
|
92
|
-
* sign-once-per-machine credential is picked
|
|
161
|
+
* 3. persisted cloud token (cloud targets only — env Cloud mode OR an enrolled
|
|
162
|
+
* hosted marker) — the project-local `.godot-mcp/credentials.json` (a `--project`
|
|
163
|
+
* login) first, then the shared machine store `~/.ai-game-dev/credentials.json`
|
|
164
|
+
* (a default `godot-cli login`), so a sign-once-per-machine credential is picked
|
|
165
|
+
* up here too. An enrolled cloud project therefore authenticates with zero env config.
|
|
93
166
|
*/
|
|
94
167
|
export function resolveConnection(projectPath, options) {
|
|
95
|
-
|
|
96
|
-
if (options.url) {
|
|
97
|
-
url = options.url.replace(/\/$/, '');
|
|
98
|
-
verbose(`Using explicit --url: ${url}`);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
const envHost = normalizeEnv(process.env[ENV_HOST]);
|
|
102
|
-
const envCloud = normalizeEnv(process.env[ENV_CLOUD_URL]);
|
|
103
|
-
if (envHost) {
|
|
104
|
-
url = envHost.replace(/\/$/, '');
|
|
105
|
-
verbose(`Using ${ENV_HOST}: ${url}`);
|
|
106
|
-
}
|
|
107
|
-
else if (envCloud) {
|
|
108
|
-
url = envCloud.replace(new RegExp(`${MCP_HUB_PATH}$`), '').replace(/\/$/, '');
|
|
109
|
-
verbose(`Using ${ENV_CLOUD_URL} base: ${url}`);
|
|
110
|
-
}
|
|
111
|
-
else if (isCloudMode()) {
|
|
112
|
-
url = DEFAULT_CLOUD_BASE_URL;
|
|
113
|
-
verbose(`Using default cloud base URL: ${url}`);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
url = DEFAULT_CUSTOM_HOST;
|
|
117
|
-
verbose(`Using default custom host: ${url}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
168
|
+
const { url, isCloud } = resolveTargetUrl(projectPath, options);
|
|
120
169
|
let token = options.token ?? normalizeEnv(process.env[ENV_TOKEN]);
|
|
121
170
|
if (options.token) {
|
|
122
171
|
verbose('Using explicit --token');
|
|
@@ -124,7 +173,7 @@ export function resolveConnection(projectPath, options) {
|
|
|
124
173
|
else if (token) {
|
|
125
174
|
verbose(`Using ${ENV_TOKEN}`);
|
|
126
175
|
}
|
|
127
|
-
else if (
|
|
176
|
+
else if (isCloud) {
|
|
128
177
|
const persisted = readCloudToken(projectPath) ?? readMachineAccessToken();
|
|
129
178
|
if (persisted) {
|
|
130
179
|
token = persisted;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godot-cli",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.1",
|
|
4
4
|
"description": "Cross-platform CLI tool for Godot-MCP (Skills & MCP). Resolves and launches the Godot editor with MCP connection env vars, runs MCP/system tools over HTTP, probes server health, configures AI agents (Claude Code, Cursor, VS Code, …), and enables/disables the godot_mcp addon. Works with Claude Code, Cursor, Copilot, and any MCP client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/lib.js",
|