godot-cli 0.38.0 → 0.39.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/CHANGELOG.md +105 -0
- package/README.md +139 -16
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.d.ts +2 -0
- package/dist/commands/check.js +48 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/close.d.ts +3 -0
- package/dist/commands/close.js +82 -27
- package/dist/commands/close.js.map +1 -1
- package/dist/commands/commands.d.ts +3 -0
- package/dist/commands/commands.js +28 -0
- package/dist/commands/commands.js.map +1 -0
- package/dist/commands/exec.js +43 -28
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.js +45 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/headless-common.d.ts +29 -0
- package/dist/commands/headless-common.js +69 -0
- package/dist/commands/headless-common.js.map +1 -0
- package/dist/commands/import.d.ts +2 -0
- package/dist/commands/import.js +32 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/install-plugin.js.map +1 -1
- package/dist/commands/open.js +38 -6
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/rql.d.ts +2 -0
- package/dist/commands/rql.js +81 -0
- package/dist/commands/rql.js.map +1 -0
- package/dist/commands/run-script.d.ts +2 -0
- package/dist/commands/run-script.js +33 -0
- package/dist/commands/run-script.js.map +1 -0
- package/dist/commands/run-system-tool.js +0 -1
- package/dist/commands/run-system-tool.js.map +1 -1
- package/dist/commands/run-tool-builder.d.ts +38 -4
- package/dist/commands/run-tool-builder.js +179 -56
- package/dist/commands/run-tool-builder.js.map +1 -1
- package/dist/commands/run-tool.js +0 -1
- package/dist/commands/run-tool.js.map +1 -1
- package/dist/commands/setup-skills.js +3 -2
- package/dist/commands/setup-skills.js.map +1 -1
- package/dist/commands/status.js +25 -19
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.js +111 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/tools.d.ts +2 -0
- package/dist/commands/tools.js +120 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/update.js +1 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wait-for-ready.js +18 -20
- package/dist/commands/wait-for-ready.js.map +1 -1
- package/dist/index.js +48 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/build.d.ts +1 -1
- package/dist/lib/build.js +21 -4
- package/dist/lib/build.js.map +1 -1
- package/dist/lib/check.d.ts +44 -0
- package/dist/lib/check.js +191 -0
- package/dist/lib/check.js.map +1 -0
- package/dist/lib/cli-guide.d.ts +26 -0
- package/dist/lib/cli-guide.js +51 -0
- package/dist/lib/cli-guide.js.map +1 -0
- package/dist/lib/configure-agent.js.map +1 -1
- package/dist/lib/exec.d.ts +19 -0
- package/dist/lib/exec.js +61 -10
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/export-project.d.ts +41 -0
- package/dist/lib/export-project.js +159 -0
- package/dist/lib/export-project.js.map +1 -0
- package/dist/lib/godot-log.d.ts +38 -0
- package/dist/lib/godot-log.js +145 -0
- package/dist/lib/godot-log.js.map +1 -0
- package/dist/lib/godot-run.d.ts +34 -0
- package/dist/lib/godot-run.js +113 -0
- package/dist/lib/godot-run.js.map +1 -0
- package/dist/lib/headless.d.ts +82 -0
- package/dist/lib/headless.js +117 -0
- package/dist/lib/headless.js.map +1 -0
- package/dist/lib/import-project.d.ts +9 -0
- package/dist/lib/import-project.js +15 -0
- package/dist/lib/import-project.js.map +1 -0
- package/dist/lib/install-server.js.map +1 -1
- package/dist/lib/junit.d.ts +36 -0
- package/dist/lib/junit.js +146 -0
- package/dist/lib/junit.js.map +1 -0
- package/dist/lib/list-tools.d.ts +51 -0
- package/dist/lib/list-tools.js +147 -0
- package/dist/lib/list-tools.js.map +1 -0
- package/dist/lib/open.js +3 -1
- package/dist/lib/open.js.map +1 -1
- package/dist/lib/progress.d.ts +1 -7
- package/dist/lib/progress.js +2 -15
- package/dist/lib/progress.js.map +1 -1
- package/dist/lib/rql.d.ts +32 -0
- package/dist/lib/rql.js +105 -0
- package/dist/lib/rql.js.map +1 -0
- package/dist/lib/run-script.d.ts +23 -0
- package/dist/lib/run-script.js +43 -0
- package/dist/lib/run-script.js.map +1 -0
- package/dist/lib/run-tests.d.ts +50 -0
- package/dist/lib/run-tests.js +181 -0
- package/dist/lib/run-tests.js.map +1 -0
- package/dist/lib/run-tool.js +6 -22
- package/dist/lib/run-tool.js.map +1 -1
- package/dist/lib/session.d.ts +8 -1
- package/dist/lib/session.js +36 -4
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/setup-skills.d.ts +8 -13
- package/dist/lib/setup-skills.js +27 -24
- package/dist/lib/setup-skills.js.map +1 -1
- package/dist/lib/types.d.ts +7 -0
- package/dist/lib/update-project.js +1 -1
- package/dist/lib/update-project.js.map +1 -1
- package/dist/lib.d.ts +16 -0
- package/dist/lib.js +10 -0
- package/dist/lib.js.map +1 -1
- package/dist/utils/addon-deps.js +2 -2
- package/dist/utils/agents.d.ts +2 -6
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/cloud-login.js.map +1 -1
- package/dist/utils/connection.d.ts +59 -0
- package/dist/utils/connection.js +11 -10
- package/dist/utils/connection.js.map +1 -1
- package/dist/utils/csproj-deps.js +1 -1
- package/dist/utils/csproj-deps.js.map +1 -1
- package/dist/utils/editor-connection.d.ts +74 -0
- package/dist/utils/editor-connection.js +225 -0
- package/dist/utils/editor-connection.js.map +1 -0
- package/dist/utils/editor-mcp-server.d.ts +32 -0
- package/dist/utils/editor-mcp-server.js +134 -0
- package/dist/utils/editor-mcp-server.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +2 -0
- package/dist/utils/exit-codes.js +4 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/extensions-catalog.js.map +1 -1
- package/dist/utils/godot-editor.d.ts +1 -1
- package/dist/utils/godot-editor.js.map +1 -1
- package/dist/utils/godot-process.d.ts +5 -0
- package/dist/utils/godot-process.js +16 -0
- package/dist/utils/godot-process.js.map +1 -1
- package/dist/utils/godot-shutdown.d.ts +3 -1
- package/dist/utils/godot-shutdown.js +4 -2
- package/dist/utils/godot-shutdown.js.map +1 -1
- package/dist/utils/input.d.ts +3 -3
- package/dist/utils/input.js +22 -35
- package/dist/utils/input.js.map +1 -1
- package/dist/utils/machine-store.js.map +1 -1
- package/dist/utils/output.d.ts +45 -0
- package/dist/utils/output.js +101 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/project-godot.js.map +1 -1
- package/dist/utils/server-source.d.ts +1 -1
- package/dist/utils/server-source.js +1 -1
- package/dist/utils/server-source.js.map +1 -1
- package/dist/utils/skill-guides.d.ts +8 -11
- package/dist/utils/skill-guides.js +100 -43
- package/dist/utils/skill-guides.js.map +1 -1
- package/dist/utils/skills.d.ts +1 -14
- package/dist/utils/skills.js +0 -89
- package/dist/utils/skills.js.map +1 -1
- package/dist/utils/ui.d.ts +6 -1
- package/dist/utils/ui.js +72 -58
- package/dist/utils/ui.js.map +1 -1
- package/dist/utils/update-check.d.ts +6 -17
- package/dist/utils/update-check.js +10 -77
- package/dist/utils/update-check.js.map +1 -1
- package/package.json +9 -9
- package/dist/utils/json-parse.d.ts +0 -25
- package/dist/utils/json-parse.js +0 -83
- package/dist/utils/json-parse.js.map +0 -1
- package/dist/utils/semver.d.ts +0 -4
- package/dist/utils/semver.js +0 -25
- package/dist/utils/semver.js.map +0 -1
|
@@ -1,10 +1,30 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { DEFAULT_SESSION_READY_TIMEOUT_MS, classifyEditorStartFailure, classifyToolFailure, } from '@baizor/gamedev-cli-core';
|
|
2
3
|
import * as ui from '../utils/ui.js';
|
|
3
4
|
import { verbose } from '../utils/ui.js';
|
|
4
|
-
import {
|
|
5
|
+
import { isGodotProject, localProjectUrl, resolveAndValidateProjectPath } from '../utils/connection.js';
|
|
6
|
+
import { connectionForCommand } from '../utils/editor-connection.js';
|
|
5
7
|
import { parseInput } from '../utils/input.js';
|
|
8
|
+
import { isLocalhostUrl } from '../utils/project-marker.js';
|
|
9
|
+
import { ExitCode } from '../utils/exit-codes.js';
|
|
10
|
+
import { CommandOutput, addFormatOption, parseFormat, parseIntFlag } from '../utils/output.js';
|
|
11
|
+
import { ensureEditor } from '../lib/session.js';
|
|
12
|
+
import { toolErrorText, toolResponseText, withoutImageData } from '../lib/exec.js';
|
|
13
|
+
import { rqlErrorHint } from '../lib/rql.js';
|
|
14
|
+
/** Exit code and envelope error code when no editor could be obtained (the shared table). */
|
|
15
|
+
export function ensureFailureExit(failure) {
|
|
16
|
+
return classifyEditorStartFailure({
|
|
17
|
+
buildFailed: failure.reason === 'build-failed',
|
|
18
|
+
invalidInput: failure.reason === 'invalid-options',
|
|
19
|
+
sessionReason: failure.sessionReason,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** A tool response that carries `status: "error"`: the call reached the tool and the tool failed. */
|
|
23
|
+
export function isToolErrorResponse(data) {
|
|
24
|
+
return typeof data === 'object' && data !== null && data.status === 'error';
|
|
25
|
+
}
|
|
6
26
|
export function buildRunToolCommand(cfg) {
|
|
7
|
-
return new Command(cfg.name)
|
|
27
|
+
return addFormatOption(new Command(cfg.name)
|
|
8
28
|
.description(cfg.description)
|
|
9
29
|
.argument('<tool-name>', cfg.argDescription)
|
|
10
30
|
.argument('[path]', 'Godot project path (used to validate project.godot when --url is omitted)')
|
|
@@ -15,63 +35,142 @@ export function buildRunToolCommand(cfg) {
|
|
|
15
35
|
.option('--input-file <file>', 'Read JSON arguments from file')
|
|
16
36
|
.option('--raw', 'Output raw JSON (no formatting)')
|
|
17
37
|
.option('--timeout <ms>', 'Request timeout in milliseconds (default: 60000)', '60000')
|
|
18
|
-
.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
.option('--no-start', 'Do not start a headless editor when no editor answers on the local server')
|
|
39
|
+
.option('--once', 'Close the editor after the call when this call started it')
|
|
40
|
+
.option('--no-build', 'Do not build the C# assembly before starting an editor')
|
|
41
|
+
.option('--editor-path <path>', 'Godot editor executable for a started editor')
|
|
42
|
+
.option('--ready-timeout <ms>', 'How long to wait for a started editor to become ready', String(DEFAULT_SESSION_READY_TIMEOUT_MS))).action((toolName, positionalPath, options) => runToolAction(cfg, toolName, positionalPath, options));
|
|
43
|
+
}
|
|
44
|
+
/** Call one tool and print its answer (`run-tool`, and `rql` with the RQL tool it picks); a failure exits. */
|
|
45
|
+
export async function runToolAction(cfg, toolName, positionalPath, options,
|
|
46
|
+
/** After a successful call printed its answer: when the call went out, and whether the editor runs on this machine. */
|
|
47
|
+
onSuccess) {
|
|
48
|
+
const output = new CommandOutput(cfg.name, parseFormat(options.format));
|
|
49
|
+
const human = !options.raw && !output.machine;
|
|
50
|
+
// Validate flags first so a bad value short-circuits before we read --input-file or hit the network.
|
|
51
|
+
const timeoutMs = parseIntFlag(options.timeout, '--timeout');
|
|
52
|
+
const readyTimeoutMs = parseIntFlag(options.readyTimeout, '--ready-timeout');
|
|
53
|
+
// Resolve path + connection up front so the heading and verbose output
|
|
54
|
+
// reflect the final endpoint before the HTTP call fires.
|
|
55
|
+
const projectPath = resolveAndValidateProjectPath(positionalPath, options);
|
|
56
|
+
// Cloud mode: the hub with the sign-in; never signed in: the local server (warning); unusable sign-in: refuse.
|
|
57
|
+
const conn = await connectionForCommand(output, projectPath, options);
|
|
58
|
+
const { url: baseUrl, token } = conn;
|
|
59
|
+
const body = parseInput(options);
|
|
60
|
+
let endpoint = `${baseUrl}${cfg.routePrefix}/${encodeURIComponent(toolName)}`;
|
|
61
|
+
const authSource = options.token ? '--token flag' : 'config/env';
|
|
62
|
+
verbose(`${cfg.verboseLabel}: ${toolName}`);
|
|
63
|
+
verbose(`Endpoint: ${endpoint}`);
|
|
64
|
+
verbose(`Body: ${body}`);
|
|
65
|
+
if (token)
|
|
66
|
+
verbose(`Authorization header set (source: ${authSource})`);
|
|
67
|
+
// Text mode prints the answer alone (agents re-read every line on each later turn); --verbose adds the endpoint.
|
|
68
|
+
const spinner = human && process.stdout.isTTY ? ui.startSpinner(`Calling ${toolName}...`) : null;
|
|
69
|
+
let calledAt = Date.now();
|
|
70
|
+
let calledUrl = baseUrl;
|
|
71
|
+
const call = (url) => {
|
|
72
|
+
calledAt = Date.now();
|
|
73
|
+
calledUrl = url;
|
|
74
|
+
return cfg.invoke({ toolName, url, ...(token ? { token } : {}), input: body, timeoutMs });
|
|
75
|
+
};
|
|
76
|
+
let result = await call(baseUrl);
|
|
77
|
+
// Status lines: the spinner (a terminal), the progress stream (json/ndjson), else stderr: stdout is the answer alone.
|
|
78
|
+
const note = (message) => {
|
|
79
|
+
if (spinner)
|
|
80
|
+
spinner.text = message;
|
|
81
|
+
else if (!output.machine)
|
|
82
|
+
process.stderr.write(message + '\n');
|
|
83
|
+
else
|
|
84
|
+
output.progress(message);
|
|
85
|
+
};
|
|
86
|
+
// No editor answers on the project's local server: start a headless one (exec's policy: a running editor is
|
|
87
|
+
// reused and never closed), then retry.
|
|
88
|
+
// With an explicit --url, start only the editor of a project that was named, or whose own local server that is:
|
|
89
|
+
// never one for whatever Godot project the current directory happens to be.
|
|
90
|
+
const explicitProject = positionalPath !== undefined || options.path !== undefined;
|
|
91
|
+
const ownsUrl = !options.url || explicitProject || normalizeUrl(options.url) === normalizeUrl(localProjectUrl(projectPath));
|
|
92
|
+
// Never for a Cloud connection (even a dev hub on localhost): a signed-in machine is never switched to a local server.
|
|
93
|
+
const canStart = options.start !== false && !conn.cloud && isLocalhostUrl(baseUrl) && isGodotProject(projectPath) && ownsUrl;
|
|
94
|
+
if (result.kind === 'failure' && result.reason === 'connection-refused' && canStart) {
|
|
95
|
+
note('No editor answered; starting a headless editor...');
|
|
96
|
+
const editor = await ensureEditor({
|
|
97
|
+
projectPath,
|
|
49
98
|
url: baseUrl,
|
|
50
99
|
...(token ? { token } : {}),
|
|
51
|
-
|
|
52
|
-
|
|
100
|
+
...(options.editorPath ? { editorPath: options.editorPath } : {}),
|
|
101
|
+
readyTimeoutMs,
|
|
102
|
+
build: options.build !== false,
|
|
103
|
+
onStatus: (message) => {
|
|
104
|
+
verbose(message);
|
|
105
|
+
note(message);
|
|
106
|
+
},
|
|
53
107
|
});
|
|
54
|
-
if (
|
|
55
|
-
spinner?.
|
|
56
|
-
|
|
57
|
-
|
|
108
|
+
if (editor.kind === 'failure') {
|
|
109
|
+
spinner?.stop();
|
|
110
|
+
const mapped = ensureFailureExit(editor);
|
|
111
|
+
return output.fail(mapped.exitCode, mapped.code, `Could not start an editor: ${editor.message}`);
|
|
112
|
+
}
|
|
113
|
+
const { ensured, godot } = editor;
|
|
114
|
+
verbose(`Editor ${ensured.source} on ${ensured.ready}`);
|
|
115
|
+
endpoint = `${ensured.ready}${cfg.routePrefix}/${encodeURIComponent(toolName)}`;
|
|
116
|
+
if (spinner)
|
|
117
|
+
spinner.text = `Calling ${toolName}...`;
|
|
118
|
+
result = await call(ensured.ready);
|
|
119
|
+
if (options.once && ensured.source === 'started') {
|
|
120
|
+
note('Closing the started editor...');
|
|
121
|
+
const closed = await godot.session.closeOwned();
|
|
122
|
+
if (closed.kind === 'closed') {
|
|
123
|
+
if (!spinner)
|
|
124
|
+
note(`Closed the editor this call started (PID ${closed.pid}).`);
|
|
58
125
|
}
|
|
59
126
|
else {
|
|
60
|
-
|
|
61
|
-
|
|
127
|
+
output.warnings.push(`The editor this call started was not closed (${closed.kind}).`);
|
|
128
|
+
note(`WARN: The editor this call started was not closed (${closed.kind}).`);
|
|
62
129
|
}
|
|
63
|
-
return;
|
|
64
130
|
}
|
|
131
|
+
}
|
|
132
|
+
if (result.kind === 'success') {
|
|
133
|
+
const toolError = isToolErrorResponse(result.data);
|
|
65
134
|
spinner?.stop();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
135
|
+
if (options.raw && !output.machine) {
|
|
136
|
+
process.stdout.write(stringifyForRaw(result.data));
|
|
137
|
+
}
|
|
138
|
+
else if (human) {
|
|
139
|
+
if (toolError)
|
|
140
|
+
ui.error(withRqlHint(toolName, `${toolName} returned an error: ${toolErrorMessage(result.data, toolName)}`));
|
|
141
|
+
else
|
|
142
|
+
console.log(toolResponseText(result.data)
|
|
143
|
+
?? (typeof result.data === 'string' ? result.data : JSON.stringify(withoutImageData(result.data), null, 2)));
|
|
144
|
+
}
|
|
145
|
+
if (toolError) {
|
|
146
|
+
return output.finish(ExitCode.CommandFailed, result.data ?? null, [{ code: 'TOOL_FAILED', message: toolErrorMessage(result.data, toolName) }]);
|
|
147
|
+
}
|
|
148
|
+
onSuccess?.({ calledAt, local: !conn.cloud && isLocalhostUrl(calledUrl) });
|
|
149
|
+
return output.finish(ExitCode.Success, result.data ?? null);
|
|
150
|
+
}
|
|
151
|
+
spinner?.stop();
|
|
152
|
+
handleFailure(result, output, {
|
|
153
|
+
toolName,
|
|
154
|
+
endpoint,
|
|
155
|
+
raw: options.raw,
|
|
156
|
+
timeoutMs,
|
|
157
|
+
errorNoun: cfg.errorNoun,
|
|
73
158
|
});
|
|
74
159
|
}
|
|
160
|
+
function toolErrorMessage(data, toolName) {
|
|
161
|
+
const response = data;
|
|
162
|
+
const text = (response.content ?? []).filter((c) => c?.type === 'text' && typeof c.text === 'string').map((c) => c.text).join('\n');
|
|
163
|
+
if (text)
|
|
164
|
+
return text;
|
|
165
|
+
if (typeof response.error === 'string')
|
|
166
|
+
return response.error;
|
|
167
|
+
if (typeof response.message === 'string')
|
|
168
|
+
return response.message;
|
|
169
|
+
return `${toolName} returned status "error"`;
|
|
170
|
+
}
|
|
171
|
+
function normalizeUrl(url) {
|
|
172
|
+
return url.replace(/\/+$/, '').toLowerCase();
|
|
173
|
+
}
|
|
75
174
|
function stringifyForRaw(data) {
|
|
76
175
|
if (typeof data === 'string')
|
|
77
176
|
return data;
|
|
@@ -79,25 +178,33 @@ function stringifyForRaw(data) {
|
|
|
79
178
|
return '';
|
|
80
179
|
return JSON.stringify(data);
|
|
81
180
|
}
|
|
82
|
-
function handleFailure(failure, ctx) {
|
|
181
|
+
function handleFailure(failure, output, ctx) {
|
|
182
|
+
const mapped = classifyToolFailure(failure);
|
|
83
183
|
if (failure.reason === 'http-error') {
|
|
184
|
+
const text = toolErrorText(failure);
|
|
185
|
+
const rqlHint = rqlErrorHint(ctx.toolName, text);
|
|
186
|
+
const hint = rqlHint ? `hint: ${rqlHint}` : httpFailureHint(failure.httpStatus, ctx.toolName);
|
|
187
|
+
const message = `${text}${/^HTTP \d/.test(text) ? '' : ` (HTTP ${failure.httpStatus})`}${hint ? ` ${hint}` : ''}`;
|
|
188
|
+
if (output.machine)
|
|
189
|
+
return output.finish(mapped.exitCode, failure.data ?? null, [{ code: mapped.code, message, httpStatus: mapped.httpStatus }]);
|
|
84
190
|
if (ctx.raw) {
|
|
85
191
|
process.stdout.write(stringifyForRaw(failure.data));
|
|
86
192
|
}
|
|
87
193
|
else {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
194
|
+
// The server's own error text, and what to do next; the raw response only with --verbose.
|
|
195
|
+
ui.error(message);
|
|
196
|
+
verbose(`Response: ${typeof failure.data === 'string' ? failure.data : JSON.stringify(failure.data)}`);
|
|
92
197
|
}
|
|
93
|
-
process.exit(
|
|
198
|
+
process.exit(mapped.exitCode);
|
|
94
199
|
}
|
|
95
200
|
const message = buildFailureMessage(failure, ctx);
|
|
201
|
+
if (output.machine)
|
|
202
|
+
return output.finish(mapped.exitCode, null, [{ code: mapped.code, message }]);
|
|
96
203
|
if (ctx.raw)
|
|
97
204
|
process.stderr.write(message + '\n');
|
|
98
205
|
else
|
|
99
206
|
ui.error(`Failed to call ${ctx.errorNoun}: ${message}`);
|
|
100
|
-
process.exit(
|
|
207
|
+
process.exit(mapped.exitCode);
|
|
101
208
|
}
|
|
102
209
|
export function buildFailureMessage(failure, ctx) {
|
|
103
210
|
switch (failure.reason) {
|
|
@@ -113,7 +220,23 @@ export function buildFailureMessage(failure, ctx) {
|
|
|
113
220
|
return failure.message;
|
|
114
221
|
}
|
|
115
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* The next step after an HTTP failure: list the tools on a 404; on 400 read the tool's arguments (422 is the tool's
|
|
225
|
+
* own failure, e.g. a missing file: its text says what is wrong).
|
|
226
|
+
*/
|
|
227
|
+
export function httpFailureHint(httpStatus, toolName) {
|
|
228
|
+
if (httpStatus === 404)
|
|
229
|
+
return 'Run `godot-cli tools` to list the tools this editor has.';
|
|
230
|
+
if (httpStatus === 400)
|
|
231
|
+
return `Run \`godot-cli tools ${toolName}\` for its arguments.`;
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
116
234
|
function capitalize(s) {
|
|
117
235
|
return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
|
|
118
236
|
}
|
|
237
|
+
/** `message`, with a hint for a familiar slip when an RQL tool failed. */
|
|
238
|
+
function withRqlHint(toolName, message) {
|
|
239
|
+
const hint = rqlErrorHint(toolName, message);
|
|
240
|
+
return hint ? `${message}\nhint: ${hint}` : message;
|
|
241
|
+
}
|
|
119
242
|
//# sourceMappingURL=run-tool-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-tool-builder.js","sourceRoot":"","sources":["../../src/commands/run-tool-builder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-tool-builder.js","sourceRoot":"","sources":["../../src/commands/run-tool-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/commands/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;IAChD,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,sCAAsC;IACnD,cAAc,EAAE,iCAAiC;IACjD,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,MAAM;IACpB,
|
|
1
|
+
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/commands/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;IAChD,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,sCAAsC;IACnD,cAAc,EAAE,iCAAiC;IACjD,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,MAAM;IACpB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC"}
|
|
@@ -7,9 +7,10 @@ function listAgentsWithSkills() {
|
|
|
7
7
|
listAgentTable('AI Agents — Skills Support', 'Skills Path', (a) => a.skillsPath ?? '—');
|
|
8
8
|
}
|
|
9
9
|
export const setupSkillsCommand = new Command('setup-skills')
|
|
10
|
-
.description('
|
|
10
|
+
.description('Write the godot-cli agent skill (cold-start workflow, RQL recipes, exit codes) and ai-game-dev-app under an AI agent\'s skills path; offline, no editor needed')
|
|
11
11
|
.argument('[agent-id]', 'Agent to generate skills for (use --list to see all)')
|
|
12
12
|
.argument('[path]', 'Godot project path (defaults to cwd)')
|
|
13
|
+
.option('--path <path>', 'Godot project path (same as [path])')
|
|
13
14
|
.option('--list', 'List all agents and their skills-support status')
|
|
14
15
|
.action(async (agentId, positionalPath, options) => {
|
|
15
16
|
if (options.list) {
|
|
@@ -34,7 +35,7 @@ export const setupSkillsCommand = new Command('setup-skills')
|
|
|
34
35
|
const spinner = ui.startSpinner(`Generating skills for ${agent.name}...`);
|
|
35
36
|
const result = await setupSkills({
|
|
36
37
|
agentId,
|
|
37
|
-
godotProjectPath: positionalPath,
|
|
38
|
+
godotProjectPath: positionalPath ?? options.path,
|
|
38
39
|
});
|
|
39
40
|
if (result.kind === 'failure') {
|
|
40
41
|
spinner.error('Failed to generate skills');
|
|
@@ -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,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup-skills.js","sourceRoot":"","sources":["../../src/commands/setup-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import * as ui from '../utils/ui.js';
|
|
3
3
|
import { verbose } from '../utils/ui.js';
|
|
4
|
-
import { resolveAndValidateProjectPath
|
|
4
|
+
import { resolveAndValidateProjectPath } from '../utils/connection.js';
|
|
5
|
+
import { connectionForCommand } from '../utils/editor-connection.js';
|
|
5
6
|
import { findGodotProcess } from '../utils/godot-process.js';
|
|
6
7
|
import { probe } from '../utils/probe.js';
|
|
7
|
-
|
|
8
|
+
import { ExitCode } from '../utils/exit-codes.js';
|
|
9
|
+
import { CommandOutput, addFormatOption, parseFormat, parseIntFlag } from '../utils/output.js';
|
|
10
|
+
export const statusCommand = addFormatOption(new Command('status')
|
|
8
11
|
.description('Check Godot editor and MCP server connection status')
|
|
9
12
|
.argument('[path]', 'Godot project path (used to detect a running editor and validate project.godot)')
|
|
10
13
|
.option('--path <path>', 'Godot project path')
|
|
11
14
|
.option('--url <url>', 'MCP server base URL (defaults to GODOT_MCP_HOST/cloud)')
|
|
12
15
|
.option('--token <token>', 'Bearer token override (defaults to GODOT_MCP_TOKEN)')
|
|
13
|
-
.option('--timeout <ms>', 'Probe timeout in milliseconds (default: 5000)', '5000')
|
|
14
|
-
|
|
16
|
+
.option('--timeout <ms>', 'Probe timeout in milliseconds (default: 5000)', '5000')).action(async (positionalPath, options) => {
|
|
17
|
+
const output = new CommandOutput('status', parseFormat(options.format));
|
|
18
|
+
const timeoutMs = parseIntFlag(options.timeout, '--timeout');
|
|
15
19
|
const projectPath = resolveAndValidateProjectPath(positionalPath, options);
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
ui.error(`Invalid --timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
20
|
+
// The server the project's editor serves: its mode decides (Cloud with the sign-in; never signed in: the local one).
|
|
21
|
+
const conn = await connectionForCommand(output, projectPath, options);
|
|
22
|
+
const { url: serverUrl, token } = conn;
|
|
22
23
|
const headers = { 'Content-Type': 'application/json' };
|
|
23
24
|
if (token) {
|
|
24
25
|
headers['Authorization'] = `Bearer ${token}`;
|
|
@@ -48,17 +49,22 @@ export const statusCommand = new Command('status')
|
|
|
48
49
|
spinner.error(`Not available (${result.reason})`);
|
|
49
50
|
}
|
|
50
51
|
ui.divider();
|
|
52
|
+
const data = {
|
|
53
|
+
projectPath,
|
|
54
|
+
editor: { running: proc !== null, pid: proc?.pid ?? null },
|
|
55
|
+
server: { url: serverUrl, reachable: result.ok, ...(result.ok ? {} : { reason: result.reason }) },
|
|
56
|
+
};
|
|
51
57
|
if (result.ok) {
|
|
52
58
|
ui.success('MCP server is reachable — ready for tool calls');
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
else if (proc) {
|
|
56
|
-
ui.warn('Godot is running but MCP server is not responding yet');
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
ui.error('Godot is not running and MCP server is not reachable');
|
|
61
|
-
process.exit(1);
|
|
59
|
+
output.finish(ExitCode.Success, data);
|
|
62
60
|
}
|
|
61
|
+
const message = proc
|
|
62
|
+
? 'Godot is running but MCP server is not responding yet'
|
|
63
|
+
: 'Godot is not running and MCP server is not reachable';
|
|
64
|
+
if (proc)
|
|
65
|
+
ui.warn(message);
|
|
66
|
+
else
|
|
67
|
+
ui.error(message);
|
|
68
|
+
output.finish(ExitCode.Unreachable, data, [{ code: 'UNREACHABLE', message }]);
|
|
63
69
|
});
|
|
64
70
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.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,6BAA6B,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type JUnitCase } from '../lib/junit.js';
|
|
3
|
+
/** `::error file=…,line=…,title=…::message` for one failed case (file relative to the repo / cwd). */
|
|
4
|
+
export declare function githubAnnotation(c: JUnitCase, projectPath: string, cwd?: string): string;
|
|
5
|
+
export declare const testCommand: Command;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import * as ui from '../utils/ui.js';
|
|
5
|
+
import { CommandOutput, addFormatOption, exitWithError, parseFormat } from '../utils/output.js';
|
|
6
|
+
import { ExitCode } from '../utils/exit-codes.js';
|
|
7
|
+
import { collect } from '../utils/input.js';
|
|
8
|
+
import { formatDiagnostic } from '../lib/godot-log.js';
|
|
9
|
+
import { caseScript, failureLine, failureSummary } from '../lib/junit.js';
|
|
10
|
+
import { TEST_RUNNERS, runTests } from '../lib/run-tests.js';
|
|
11
|
+
import { addHeadlessOptions, diagnosticErrors, finishHeadless, headlessProjectPath, headlessTimeout, printSteps, } from './headless-common.js';
|
|
12
|
+
/** GitHub Actions workflow-command escaping (`%`, CR, LF; plus `:` and `,` in properties). */
|
|
13
|
+
function ghEscape(text, property = false) {
|
|
14
|
+
let out = text.replace(/%/g, '%25').replace(/\r/g, '%0D').replace(/\n/g, '%0A');
|
|
15
|
+
if (property)
|
|
16
|
+
out = out.replace(/:/g, '%3A').replace(/,/g, '%2C');
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
/** `::error file=…,line=…,title=…::message` for one failed case (file relative to the repo / cwd). */
|
|
20
|
+
export function githubAnnotation(c, projectPath, cwd = process.cwd()) {
|
|
21
|
+
const script = caseScript(c);
|
|
22
|
+
const props = [];
|
|
23
|
+
if (script) {
|
|
24
|
+
const rel = path.relative(cwd, path.join(projectPath, script.slice('res://'.length))).split(path.sep).join('/');
|
|
25
|
+
props.push(`file=${ghEscape(rel, true)}`);
|
|
26
|
+
const line = failureLine(c);
|
|
27
|
+
if (line !== undefined)
|
|
28
|
+
props.push(`line=${line}`);
|
|
29
|
+
}
|
|
30
|
+
props.push(`title=${ghEscape(`${c.suite || c.classname || ''} ${c.name}`.trim(), true)}`);
|
|
31
|
+
const message = c.details ?? failureSummary(c);
|
|
32
|
+
return `::error ${props.join(',')}::${ghEscape(message)}`;
|
|
33
|
+
}
|
|
34
|
+
export const testCommand = addFormatOption(addHeadlessOptions(new Command('test')
|
|
35
|
+
.description('Run the project\'s GUT or gdUnit4 tests headless; the verdict comes from the JUnit report and the log')
|
|
36
|
+
.argument('[path]', 'Godot project path')
|
|
37
|
+
.option('--runner <runner>', 'gut | gdunit4 (default: the one installed)')
|
|
38
|
+
.option('--dir <dir>', 'Test directory, res:// or project-relative (repeatable; default: res://test, res://tests)', collect, [])
|
|
39
|
+
.option('--filter <text>', 'Only test scripts whose file name contains <text>')
|
|
40
|
+
.option('--output <file>', 'Copy the JUnit XML report to <file>')
|
|
41
|
+
.option('--no-import', 'Skip the --import step (the project is imported already)'), 600000), ['github']).action(async (positional, options) => {
|
|
42
|
+
const format = parseFormat(options.format, ['github']);
|
|
43
|
+
const output = new CommandOutput('test', format);
|
|
44
|
+
let runner;
|
|
45
|
+
if (options.runner !== undefined) {
|
|
46
|
+
const value = options.runner.toLowerCase();
|
|
47
|
+
if (value !== 'gut' && value !== 'gdunit4')
|
|
48
|
+
exitWithError(ExitCode.Usage, 'USAGE', `Invalid --runner value: "${options.runner}". Expected gut or gdunit4.`);
|
|
49
|
+
runner = value;
|
|
50
|
+
}
|
|
51
|
+
const result = await runTests({
|
|
52
|
+
projectPath: headlessProjectPath(positional, options),
|
|
53
|
+
timeoutMs: headlessTimeout(options),
|
|
54
|
+
allowOpenProject: options.allowOpen === true,
|
|
55
|
+
...(runner ? { runner } : {}),
|
|
56
|
+
...(options.dir.length > 0 ? { dirs: options.dir } : {}),
|
|
57
|
+
...(options.filter ? { filter: options.filter } : {}),
|
|
58
|
+
skipImport: options.import === false,
|
|
59
|
+
...(options.editorPath ? { editorPath: options.editorPath } : {}),
|
|
60
|
+
onProgress: (m) => output.progress(m),
|
|
61
|
+
});
|
|
62
|
+
if (options.output && result.junitFile) {
|
|
63
|
+
const target = path.resolve(options.output);
|
|
64
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
65
|
+
fs.copyFileSync(result.junitFile, target);
|
|
66
|
+
}
|
|
67
|
+
const report = result.report;
|
|
68
|
+
const failed = report?.cases.filter((c) => c.status === 'failed' || c.status === 'error') ?? [];
|
|
69
|
+
const loadErrors = result.loadErrors ?? [];
|
|
70
|
+
if (format === 'github') {
|
|
71
|
+
for (const c of failed)
|
|
72
|
+
console.log(githubAnnotation(c, result.projectPath ?? ''));
|
|
73
|
+
for (const d of loadErrors) {
|
|
74
|
+
const file = d.file?.startsWith('res://') && result.projectPath
|
|
75
|
+
? path.relative(process.cwd(), path.join(result.projectPath, d.file.slice('res://'.length))).split(path.sep).join('/')
|
|
76
|
+
: undefined;
|
|
77
|
+
console.log(`::error ${file ? `file=${ghEscape(file, true)}${d.line ? `,line=${d.line}` : ''},` : ''}title=Test script failed to load::${ghEscape(d.message)}`);
|
|
78
|
+
}
|
|
79
|
+
if (report)
|
|
80
|
+
console.log(`${TEST_RUNNERS[result.runner].label}: ${report.passed} passed, ${report.failures + report.errors} failed, ${report.skipped} skipped (${report.tests} total)`);
|
|
81
|
+
}
|
|
82
|
+
else if (!output.machine) {
|
|
83
|
+
ui.heading(`Godot Tests${result.runner ? ` (${TEST_RUNNERS[result.runner].label})` : ''}`);
|
|
84
|
+
if (result.projectPath)
|
|
85
|
+
ui.label('Project', result.projectPath);
|
|
86
|
+
printSteps(result.steps ?? []);
|
|
87
|
+
for (const c of failed)
|
|
88
|
+
ui.error(`${c.suite ? `${c.suite} > ` : ''}${c.name}: ${failureSummary(c)}`);
|
|
89
|
+
for (const d of loadErrors)
|
|
90
|
+
ui.error(formatDiagnostic(d));
|
|
91
|
+
if (report)
|
|
92
|
+
ui.label('Result', `${report.passed} passed, ${report.failures + report.errors} failed, ${report.skipped} skipped (${report.tests} total)`);
|
|
93
|
+
if (result.junitFile)
|
|
94
|
+
ui.label('JUnit', options.output ? path.resolve(options.output) : result.junitFile);
|
|
95
|
+
}
|
|
96
|
+
const data = result.runner ? {
|
|
97
|
+
projectPath: result.projectPath,
|
|
98
|
+
runner: result.runner,
|
|
99
|
+
junitFile: options.output && result.junitFile ? path.resolve(options.output) : result.junitFile ?? null,
|
|
100
|
+
summary: report ? { tests: report.tests, passed: report.passed, failed: report.failures + report.errors, skipped: report.skipped, suiteFailures: report.suiteFailures } : null,
|
|
101
|
+
failures: failed.map((c) => ({ suite: c.suite, name: c.name, file: caseScript(c) ?? null, line: failureLine(c) ?? null, message: failureSummary(c), details: c.details ?? null })),
|
|
102
|
+
loadErrors,
|
|
103
|
+
steps: result.steps,
|
|
104
|
+
} : null;
|
|
105
|
+
const errors = [
|
|
106
|
+
...failed.map((c) => ({ code: 'TESTS_FAILED', message: `${c.suite ? `${c.suite} > ` : ''}${c.name}: ${failureSummary(c)}` })),
|
|
107
|
+
...diagnosticErrors('TEST_RUN_ERROR', loadErrors),
|
|
108
|
+
];
|
|
109
|
+
finishHeadless(output, result, data, result.kind === 'failure' ? errors : [], report ? `${report.passed} test(s) passed` : undefined);
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|