godot-cli 0.38.0 → 0.39.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/CHANGELOG.md +99 -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/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/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/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/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/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/output.d.ts +45 -0
- package/dist/utils/output.js +101 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/server-source.d.ts +1 -1
- package/dist/utils/server-source.js +1 -1
- package/dist/utils/skill-guides.d.ts +6 -9
- 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 +2 -2
- 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":"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,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAU/F,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,qDAAqD,CAAC;KAClE,QAAQ,CAAC,QAAQ,EAAE,iFAAiF,CAAC;KACrG,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC;KAC7C,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qDAAqD,CAAC;KAChF,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,EAAE,MAAM,CAAC,CACrF,CAAC,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAAsB,EAAE,EAAE;IAC5E,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,6BAA6B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3E,qHAAqH;IACrH,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/B,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACjC,EAAE,CAAC,OAAO,EAAE,CAAC;IAEb,6BAA6B;IAC7B,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACpD,CAAC;IAED,sBAAsB;IACtB,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,SAAS,KAAK,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7B,OAAO,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,EAAE,CAAC,OAAO,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG;QACX,WAAW;QACX,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE;QAC1D,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;KAClG,CAAC;IACF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,uDAAuD;QACzD,CAAC,CAAC,sDAAsD,CAAC;IAC3D,IAAI,IAAI;QAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;QACtB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC"}
|
|
@@ -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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"}
|