godot-cli 0.37.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 +38 -5
- 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
package/dist/utils/ui.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import yoctoSpinner from 'yocto-spinner';
|
|
3
|
+
import { CODE_COMMANDS, EDITOR_COMMANDS, EDITOR_START, ROOT_RQL_RECIPES, RQL_RECIPES } from '../lib/cli-guide.js';
|
|
3
4
|
// --- Verbose mode ---
|
|
4
5
|
let verboseEnabled = false;
|
|
5
6
|
export function setVerbose(enabled) {
|
|
@@ -7,35 +8,35 @@ export function setVerbose(enabled) {
|
|
|
7
8
|
}
|
|
8
9
|
export function verbose(msg) {
|
|
9
10
|
if (verboseEnabled) {
|
|
10
|
-
|
|
11
|
-
console.log(chalk.dim(`[verbose] ${msg}`));
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
console.log(`[verbose] ${msg}`);
|
|
15
|
-
}
|
|
11
|
+
out(isTTY() ? chalk.dim(`[verbose] ${msg}`) : `[verbose] ${msg}`);
|
|
16
12
|
}
|
|
17
13
|
}
|
|
14
|
+
// --- Machine output (--format json|ndjson): stdout carries only the envelope ---
|
|
15
|
+
let machineOutput = false;
|
|
16
|
+
let machineLine;
|
|
17
|
+
/**
|
|
18
|
+
* Route every human-readable line (and spinner) to stderr without colour, keeping stdout for the envelope.
|
|
19
|
+
* `wrap` turns each line into an event (ndjson).
|
|
20
|
+
*/
|
|
21
|
+
export function setMachineOutput(enabled, wrap) {
|
|
22
|
+
machineOutput = enabled;
|
|
23
|
+
machineLine = enabled ? wrap : undefined;
|
|
24
|
+
}
|
|
25
|
+
/** A human-readable line: stdout normally, plain (or wrapped) stderr in machine mode. */
|
|
26
|
+
function out(line, level = 'info') {
|
|
27
|
+
if (!machineOutput) {
|
|
28
|
+
if (level === 'error')
|
|
29
|
+
console.error(line);
|
|
30
|
+
else
|
|
31
|
+
console.log(line);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const plain = stripAnsi(line);
|
|
35
|
+
process.stderr.write((machineLine ? machineLine(level, plain) : plain) + '\n');
|
|
36
|
+
}
|
|
18
37
|
// --- TTY detection ---
|
|
19
38
|
function isTTY() {
|
|
20
|
-
return !!process.stdout.isTTY;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Draw a Unicode rounded box around text with cyan borders.
|
|
24
|
-
*/
|
|
25
|
-
function drawBox(text) {
|
|
26
|
-
const lines = text.split('\n');
|
|
27
|
-
const padding = 2;
|
|
28
|
-
const maxLen = Math.max(...lines.map(l => stripAnsi(l).length));
|
|
29
|
-
const innerWidth = maxLen + padding * 2;
|
|
30
|
-
const pad = ' '.repeat(padding);
|
|
31
|
-
const top = chalk.cyan('╭' + '─'.repeat(innerWidth) + '╮');
|
|
32
|
-
const bottom = chalk.cyan('╰' + '─'.repeat(innerWidth) + '╯');
|
|
33
|
-
const middle = lines.map(l => {
|
|
34
|
-
const visible = stripAnsi(l).length;
|
|
35
|
-
const right = ' '.repeat(maxLen - visible);
|
|
36
|
-
return chalk.cyan('│') + pad + l + right + pad + chalk.cyan('│');
|
|
37
|
-
});
|
|
38
|
-
return [top, ...middle, bottom].join('\n');
|
|
39
|
+
return !machineOutput && !!process.stdout.isTTY;
|
|
39
40
|
}
|
|
40
41
|
/**
|
|
41
42
|
* Strip ANSI escape codes from a string.
|
|
@@ -44,25 +45,45 @@ function stripAnsi(str) {
|
|
|
44
45
|
// eslint-disable-next-line no-control-regex
|
|
45
46
|
return str.replace(/\x1B\[[0-9;]*m/g, '');
|
|
46
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The root help: short on purpose (agents read it first, and every later turn re-reads it): the everyday commands, the
|
|
50
|
+
* other command names, and the RQL recipes most tasks need. Each command's own --help has the details.
|
|
51
|
+
*/
|
|
52
|
+
function formatRootHelp(target, helper, appVersion) {
|
|
53
|
+
const name = target.name();
|
|
54
|
+
const featured = new Set([...EDITOR_COMMANDS, ...CODE_COMMANDS].map(([cmd]) => cmd));
|
|
55
|
+
const row = ([, usage, what]) => ` ${chalk.yellow(usage.padEnd(26))} ${chalk.dim(what)}`;
|
|
56
|
+
const others = helper.visibleCommands(target).map((c) => c.name()).filter((c) => !featured.has(c) && c !== 'help');
|
|
57
|
+
const lines = [
|
|
58
|
+
`${chalk.bold.cyan('Godot-MCP CLI')}${appVersion ? ` v${appVersion}` : ''}: drive the Godot editor of the project in the current folder (or --path <dir>).`,
|
|
59
|
+
'',
|
|
60
|
+
chalk.bold(`Editor work (${EDITOR_START}):`),
|
|
61
|
+
...EDITOR_COMMANDS.map(row),
|
|
62
|
+
chalk.bold('Code:'),
|
|
63
|
+
...CODE_COMMANDS.map(row),
|
|
64
|
+
`${chalk.bold('More commands:')} ${others.join(' ')}`,
|
|
65
|
+
];
|
|
66
|
+
lines.push('', chalk.bold('RQL recipes (strings inside the query take double quotes):'));
|
|
67
|
+
for (const [query, what] of RQL_RECIPES.slice(0, ROOT_RQL_RECIPES))
|
|
68
|
+
lines.push(` ${chalk.yellow(`rql '${query}'`)} ${chalk.dim(`# ${what}`)}`);
|
|
69
|
+
lines.push('', chalk.dim(`Details: ${name} <command> --help (rql --help: operators, more recipes). Machine-readable output: --format json.`), '');
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
47
72
|
/**
|
|
48
73
|
* Apply styled help formatting to a Commander command.
|
|
49
74
|
* Call this on every Command instance (root and subcommands)
|
|
50
75
|
* so that --help / -h always renders the fancy UI.
|
|
51
76
|
*
|
|
52
|
-
* @param appVersion - The CLI version string, shown in the root
|
|
77
|
+
* @param appVersion - The CLI version string, shown in the root help.
|
|
53
78
|
*/
|
|
54
79
|
export function configureStyledHelp(cmd, appVersion) {
|
|
55
80
|
cmd.configureHelp({
|
|
56
81
|
formatHelp(target, helper) {
|
|
57
|
-
|
|
82
|
+
if (!target.parent)
|
|
83
|
+
return formatRootHelp(target, helper, appVersion);
|
|
58
84
|
const lines = [];
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
lines.push(drawBox(`${chalk.bold.cyan('Godot-MCP CLI')} ${chalk.dim(`v${appVersion}`)}\n${chalk.dim('Bridge LLMs with Godot via Model Context Protocol')}`));
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
lines.push(drawBox(`${chalk.bold.cyan(target.name())} ${chalk.dim('—')} ${target.description()}`));
|
|
65
|
-
}
|
|
85
|
+
// A plain line, not a box: agents read this help, and box borders cost as much as the text again.
|
|
86
|
+
lines.push(`${chalk.bold.cyan(target.name())} ${chalk.dim('—')} ${target.description()}`);
|
|
66
87
|
lines.push('');
|
|
67
88
|
// Usage
|
|
68
89
|
lines.push(`${chalk.bold('Usage:')} ${chalk.yellow(helper.commandUsage(target))}`);
|
|
@@ -94,13 +115,6 @@ export function configureStyledHelp(cmd, appVersion) {
|
|
|
94
115
|
}
|
|
95
116
|
lines.push('');
|
|
96
117
|
}
|
|
97
|
-
// Footer
|
|
98
|
-
if (isRoot) {
|
|
99
|
-
lines.push(chalk.dim('Run ') +
|
|
100
|
-
chalk.yellow('godot-cli <command> --help') +
|
|
101
|
-
chalk.dim(' for detailed usage of each command.'));
|
|
102
|
-
lines.push('');
|
|
103
|
-
}
|
|
104
118
|
return lines.join('\n');
|
|
105
119
|
},
|
|
106
120
|
});
|
|
@@ -112,10 +126,10 @@ export function configureStyledHelp(cmd, appVersion) {
|
|
|
112
126
|
*/
|
|
113
127
|
export function success(msg) {
|
|
114
128
|
if (isTTY()) {
|
|
115
|
-
|
|
129
|
+
out(`${chalk.green('✔')} ${msg}`);
|
|
116
130
|
}
|
|
117
131
|
else {
|
|
118
|
-
|
|
132
|
+
out(`SUCCESS: ${msg}`);
|
|
119
133
|
}
|
|
120
134
|
}
|
|
121
135
|
/**
|
|
@@ -124,10 +138,10 @@ export function success(msg) {
|
|
|
124
138
|
*/
|
|
125
139
|
export function error(msg) {
|
|
126
140
|
if (isTTY()) {
|
|
127
|
-
|
|
141
|
+
out(`${chalk.red('✖')} ${chalk.red(msg)}`, 'error');
|
|
128
142
|
}
|
|
129
143
|
else {
|
|
130
|
-
|
|
144
|
+
out(`ERROR: ${msg}`, 'error');
|
|
131
145
|
}
|
|
132
146
|
}
|
|
133
147
|
/**
|
|
@@ -136,10 +150,10 @@ export function error(msg) {
|
|
|
136
150
|
*/
|
|
137
151
|
export function info(msg) {
|
|
138
152
|
if (isTTY()) {
|
|
139
|
-
|
|
153
|
+
out(`${chalk.blue('ℹ')} ${msg}`);
|
|
140
154
|
}
|
|
141
155
|
else {
|
|
142
|
-
|
|
156
|
+
out(`INFO: ${msg}`);
|
|
143
157
|
}
|
|
144
158
|
}
|
|
145
159
|
/**
|
|
@@ -148,41 +162,41 @@ export function info(msg) {
|
|
|
148
162
|
*/
|
|
149
163
|
export function warn(msg) {
|
|
150
164
|
if (isTTY()) {
|
|
151
|
-
|
|
165
|
+
out(`${chalk.yellow('⚠')} ${chalk.yellow(msg)}`);
|
|
152
166
|
}
|
|
153
167
|
else {
|
|
154
|
-
|
|
168
|
+
out(`WARN: ${msg}`);
|
|
155
169
|
}
|
|
156
170
|
}
|
|
157
171
|
/**
|
|
158
172
|
* Print a bold cyan section heading.
|
|
159
173
|
*/
|
|
160
174
|
export function heading(msg) {
|
|
161
|
-
|
|
175
|
+
out(`\n${chalk.bold.cyan(msg)}`);
|
|
162
176
|
}
|
|
163
177
|
/**
|
|
164
178
|
* Print a formatted key-value label.
|
|
165
179
|
*/
|
|
166
180
|
export function label(key, value) {
|
|
167
|
-
|
|
181
|
+
out(` ${chalk.bold(key + ':')} ${value}`);
|
|
168
182
|
}
|
|
169
183
|
/**
|
|
170
184
|
* Create a no-op spinner for non-TTY environments.
|
|
171
185
|
* Methods are safe to call but produce no ANSI output.
|
|
172
186
|
*/
|
|
173
187
|
function createNoOpSpinner(text) {
|
|
174
|
-
|
|
188
|
+
out(text);
|
|
175
189
|
const self = {
|
|
176
190
|
start: () => self,
|
|
177
191
|
stop: () => self,
|
|
178
192
|
success: (msg) => { if (msg)
|
|
179
|
-
|
|
193
|
+
out(`SUCCESS: ${msg}`); return self; },
|
|
180
194
|
error: (msg) => { if (msg)
|
|
181
|
-
|
|
195
|
+
out(`ERROR: ${msg}`, 'error'); return self; },
|
|
182
196
|
warning: (msg) => { if (msg)
|
|
183
|
-
|
|
197
|
+
out(`WARN: ${msg}`); return self; },
|
|
184
198
|
info: (msg) => { if (msg)
|
|
185
|
-
|
|
199
|
+
out(`INFO: ${msg}`); return self; },
|
|
186
200
|
clear: () => self,
|
|
187
201
|
get text() { return text; },
|
|
188
202
|
set text(value) { text = value; },
|
|
@@ -227,13 +241,13 @@ export function badge(visible) {
|
|
|
227
241
|
* Print a feature row with a styled badge and name.
|
|
228
242
|
*/
|
|
229
243
|
export function featureRow(name, visible) {
|
|
230
|
-
|
|
244
|
+
out(` ${badge(visible)} ${name}`);
|
|
231
245
|
}
|
|
232
246
|
/**
|
|
233
247
|
* Print a divider line.
|
|
234
248
|
*/
|
|
235
249
|
export function divider() {
|
|
236
|
-
|
|
250
|
+
out(chalk.dim('─'.repeat(50)));
|
|
237
251
|
}
|
|
238
252
|
/**
|
|
239
253
|
* Interactive yes/no confirmation on the terminal (default **No**). Only call on a TTY —
|
package/dist/utils/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,YAA8B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
latest: string;
|
|
4
|
-
}
|
|
1
|
+
import { type UpdateInfo } from '@baizor/gamedev-cli-core';
|
|
2
|
+
export { isRunningViaNpx } from '@baizor/gamedev-cli-core';
|
|
5
3
|
/** Fetch the latest version string from the npm registry. */
|
|
6
4
|
export declare function fetchLatestVersion(): Promise<string>;
|
|
7
5
|
/**
|
|
8
|
-
* Check if a newer version is available on npm.
|
|
9
|
-
* Returns update info if available, null otherwise.
|
|
10
|
-
* Never throws — all errors are silently caught.
|
|
6
|
+
* Check if a newer version is available on npm (cached for a day).
|
|
7
|
+
* Returns update info if available, null otherwise. Never throws.
|
|
11
8
|
*/
|
|
12
9
|
export declare function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null>;
|
|
13
10
|
/** Format the "update available" message with chalk styling. */
|
|
14
11
|
export declare function formatUpdateAvailable(current: string, latest: string): string;
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
* line with nothing after it: the old wording "Run npm i -g godot-cli to update"
|
|
18
|
-
* was copied whole from the terminal, so npm also installed the unrelated `to`
|
|
19
|
-
* and `update` packages (the latter drags in ~630 deprecated dependencies).
|
|
20
|
-
*/
|
|
21
|
-
export declare const UPDATE_COMMAND = "npm i -g godot-cli";
|
|
12
|
+
/** The exact command a user should run to update, printed ALONE on its own line (see {@link npmGlobalInstallCommand}). */
|
|
13
|
+
export declare const UPDATE_COMMAND: string;
|
|
22
14
|
/** Print a styled update notification to stderr (does not interfere with stdout piping). */
|
|
23
15
|
export declare function printUpdateNotification(current: string, latest: string): void;
|
|
24
|
-
/** Returns true if the CLI was likely invoked via npx. */
|
|
25
|
-
export declare function isRunningViaNpx(): boolean;
|
|
26
|
-
export {};
|
|
@@ -1,88 +1,27 @@
|
|
|
1
1
|
import { homedir } from 'os';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
import { readFileSync, writeFileSync } from 'fs';
|
|
4
3
|
import chalk from 'chalk';
|
|
5
|
-
import {
|
|
4
|
+
import { checkForNpmUpdate, fetchLatestNpmVersion, npmGlobalInstallCommand } from '@baizor/gamedev-cli-core';
|
|
5
|
+
export { isRunningViaNpx } from '@baizor/gamedev-cli-core';
|
|
6
6
|
const PACKAGE_NAME = 'godot-cli';
|
|
7
|
-
const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
8
7
|
const CACHE_FILE = join(homedir(), '.godot-cli-update.json');
|
|
9
|
-
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
10
|
-
const FETCH_TIMEOUT_MS = 3000;
|
|
11
8
|
/** Fetch the latest version string from the npm registry. */
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
15
|
-
headers: { 'Accept': 'application/json' },
|
|
16
|
-
});
|
|
17
|
-
if (!response.ok) {
|
|
18
|
-
throw new Error(`npm registry returned ${response.status}`);
|
|
19
|
-
}
|
|
20
|
-
const data = (await response.json());
|
|
21
|
-
if (!data.version) {
|
|
22
|
-
throw new Error('No version field in registry response');
|
|
23
|
-
}
|
|
24
|
-
return data.version;
|
|
25
|
-
}
|
|
26
|
-
function readCache() {
|
|
27
|
-
try {
|
|
28
|
-
const raw = readFileSync(CACHE_FILE, 'utf-8');
|
|
29
|
-
const parsed = JSON.parse(raw);
|
|
30
|
-
if (parsed.latestVersion && typeof parsed.lastChecked === 'number' && isValidVersion(parsed.latestVersion)) {
|
|
31
|
-
return parsed;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
// Cache missing or corrupt — ignore
|
|
36
|
-
}
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
function writeCache(latestVersion) {
|
|
40
|
-
try {
|
|
41
|
-
const data = { latestVersion, lastChecked: Date.now() };
|
|
42
|
-
writeFileSync(CACHE_FILE, JSON.stringify(data), 'utf-8');
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// Non-critical — ignore write failures
|
|
46
|
-
}
|
|
9
|
+
export function fetchLatestVersion() {
|
|
10
|
+
return fetchLatestNpmVersion(PACKAGE_NAME);
|
|
47
11
|
}
|
|
48
12
|
/**
|
|
49
|
-
* Check if a newer version is available on npm.
|
|
50
|
-
* Returns update info if available, null otherwise.
|
|
51
|
-
* Never throws — all errors are silently caught.
|
|
13
|
+
* Check if a newer version is available on npm (cached for a day).
|
|
14
|
+
* Returns update info if available, null otherwise. Never throws.
|
|
52
15
|
*/
|
|
53
|
-
export
|
|
54
|
-
|
|
55
|
-
// Check cache first
|
|
56
|
-
const cache = readCache();
|
|
57
|
-
if (cache && Date.now() - cache.lastChecked < CACHE_TTL_MS) {
|
|
58
|
-
if (isNewerVersion(currentVersion, cache.latestVersion)) {
|
|
59
|
-
return { current: currentVersion, latest: cache.latestVersion };
|
|
60
|
-
}
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
// Fetch fresh
|
|
64
|
-
const latest = await fetchLatestVersion();
|
|
65
|
-
writeCache(latest);
|
|
66
|
-
if (isNewerVersion(currentVersion, latest)) {
|
|
67
|
-
return { current: currentVersion, latest };
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// Best-effort — never disrupt CLI usage
|
|
72
|
-
}
|
|
73
|
-
return null;
|
|
16
|
+
export function checkForUpdate(currentVersion) {
|
|
17
|
+
return checkForNpmUpdate(currentVersion, { packageName: PACKAGE_NAME, cacheFile: CACHE_FILE });
|
|
74
18
|
}
|
|
75
19
|
/** Format the "update available" message with chalk styling. */
|
|
76
20
|
export function formatUpdateAvailable(current, latest) {
|
|
77
21
|
return `Update available: ${chalk.dim(current)} → ${chalk.green(latest)}`;
|
|
78
22
|
}
|
|
79
|
-
/**
|
|
80
|
-
|
|
81
|
-
* line with nothing after it: the old wording "Run npm i -g godot-cli to update"
|
|
82
|
-
* was copied whole from the terminal, so npm also installed the unrelated `to`
|
|
83
|
-
* and `update` packages (the latter drags in ~630 deprecated dependencies).
|
|
84
|
-
*/
|
|
85
|
-
export const UPDATE_COMMAND = `npm i -g ${PACKAGE_NAME}`;
|
|
23
|
+
/** The exact command a user should run to update, printed ALONE on its own line (see {@link npmGlobalInstallCommand}). */
|
|
24
|
+
export const UPDATE_COMMAND = npmGlobalInstallCommand(PACKAGE_NAME);
|
|
86
25
|
/** Print a styled update notification to stderr (does not interfere with stdout piping). */
|
|
87
26
|
export function printUpdateNotification(current, latest) {
|
|
88
27
|
console.error();
|
|
@@ -90,10 +29,4 @@ export function printUpdateNotification(current, latest) {
|
|
|
90
29
|
console.error(` ${chalk.cyan(UPDATE_COMMAND)}`);
|
|
91
30
|
console.error();
|
|
92
31
|
}
|
|
93
|
-
/** Returns true if the CLI was likely invoked via npx. */
|
|
94
|
-
export function isRunningViaNpx() {
|
|
95
|
-
const execPath = process.env['npm_execpath'] ?? '';
|
|
96
|
-
const npmCommand = process.env['npm_command'] ?? '';
|
|
97
|
-
return execPath.includes('npx') || npmCommand === 'exec';
|
|
98
|
-
}
|
|
99
32
|
//# sourceMappingURL=update-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/utils/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/utils/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,uBAAuB,EAAmB,MAAM,0BAA0B,CAAC;AAE9H,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;AAE7D,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB;IAChC,OAAO,qBAAqB,CAAC,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,cAAsB;IACnD,OAAO,iBAAiB,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,MAAc;IACnE,OAAO,qBAAqB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,0HAA0H;AAC1H,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;AAEpE,4FAA4F;AAC5F,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAc;IACrE,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godot-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.0",
|
|
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",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"node": "^20.19.0 || >=22.12.0"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@baizor/gamedev-cli-core": "^0.
|
|
65
|
+
"@baizor/gamedev-cli-core": "^0.11.1",
|
|
66
66
|
"chalk": "^5.6.2",
|
|
67
67
|
"commander": "^13.1.0",
|
|
68
68
|
"yocto-spinner": "^1.1.0"
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Robust JSON parsing with detailed error reporting.
|
|
3
|
-
*
|
|
4
|
-
* 1. Try to parse the raw string as JSON.
|
|
5
|
-
* 2. If invalid, report the exact position where parsing fails.
|
|
6
|
-
*/
|
|
7
|
-
export interface JsonParseResult {
|
|
8
|
-
readonly value: unknown;
|
|
9
|
-
readonly raw: string;
|
|
10
|
-
readonly wasStringified: boolean;
|
|
11
|
-
}
|
|
12
|
-
export declare class JsonParseError extends Error {
|
|
13
|
-
readonly position: number;
|
|
14
|
-
readonly snippet: string;
|
|
15
|
-
constructor(message: string, position: number, snippet: string);
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Parse a string as strict JSON. Throws {@link JsonParseError} with
|
|
19
|
-
* position and snippet on failure.
|
|
20
|
-
*
|
|
21
|
-
* @param input The raw string to parse as JSON.
|
|
22
|
-
* @returns A result containing the parsed value.
|
|
23
|
-
* @throws {@link JsonParseError} with position and snippet on failure.
|
|
24
|
-
*/
|
|
25
|
-
export declare function parseJsonStrict(input: string): JsonParseResult;
|
package/dist/utils/json-parse.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
export class JsonParseError extends Error {
|
|
2
|
-
constructor(message, position, snippet) {
|
|
3
|
-
super(message);
|
|
4
|
-
this.name = 'JsonParseError';
|
|
5
|
-
this.position = position;
|
|
6
|
-
this.snippet = snippet;
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Extract the error position from a JSON.parse SyntaxError message.
|
|
11
|
-
* Common formats:
|
|
12
|
-
* - "... at position 42" (V8 / Node)
|
|
13
|
-
* - "... at line 3 column 5" (some engines)
|
|
14
|
-
* - "Unexpected token X in JSON at position 42"
|
|
15
|
-
*/
|
|
16
|
-
function extractErrorPosition(error, input) {
|
|
17
|
-
const msg = error.message;
|
|
18
|
-
const posMatch = msg.match(/position\s+(\d+)/i);
|
|
19
|
-
if (posMatch) {
|
|
20
|
-
return parseInt(posMatch[1], 10);
|
|
21
|
-
}
|
|
22
|
-
const lineColMatch = msg.match(/line\s+(\d+)\s+column\s+(\d+)/i);
|
|
23
|
-
if (lineColMatch) {
|
|
24
|
-
const targetLine = parseInt(lineColMatch[1], 10);
|
|
25
|
-
const targetCol = parseInt(lineColMatch[2], 10);
|
|
26
|
-
const lines = input.split('\n');
|
|
27
|
-
let offset = 0;
|
|
28
|
-
for (let i = 0; i < targetLine - 1 && i < lines.length; i++) {
|
|
29
|
-
offset += lines[i].length + 1; // +1 for newline
|
|
30
|
-
}
|
|
31
|
-
return offset + targetCol - 1;
|
|
32
|
-
}
|
|
33
|
-
return -1;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Build a human-readable snippet around the error position.
|
|
37
|
-
*/
|
|
38
|
-
function buildSnippet(input, position) {
|
|
39
|
-
if (position < 0 || position > input.length) {
|
|
40
|
-
return input.length <= 80 ? input : input.slice(0, 80) + '...';
|
|
41
|
-
}
|
|
42
|
-
const contextBefore = 20;
|
|
43
|
-
const contextAfter = 20;
|
|
44
|
-
const start = Math.max(0, position - contextBefore);
|
|
45
|
-
const end = Math.min(input.length, position + contextAfter);
|
|
46
|
-
const before = (start > 0 ? '...' : '') + input.slice(start, position);
|
|
47
|
-
const errorChar = position < input.length ? input[position] : '<end>';
|
|
48
|
-
const after = input.slice(position + 1, end) + (end < input.length ? '...' : '');
|
|
49
|
-
const pointer = ' '.repeat(before.length) + '^';
|
|
50
|
-
return `${before}${errorChar}${after}\n${pointer}`;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Build a detailed error message for a JSON parse failure.
|
|
54
|
-
*/
|
|
55
|
-
function buildDetailedError(input, error) {
|
|
56
|
-
const position = extractErrorPosition(error, input);
|
|
57
|
-
const snippet = buildSnippet(input, position);
|
|
58
|
-
const posInfo = position >= 0 ? ` at position ${position}` : '';
|
|
59
|
-
const message = `Invalid JSON${posInfo}: ${error.message}\n\n` +
|
|
60
|
-
` ${snippet.split('\n').join('\n ')}\n`;
|
|
61
|
-
return new JsonParseError(message, position, snippet);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Parse a string as strict JSON. Throws {@link JsonParseError} with
|
|
65
|
-
* position and snippet on failure.
|
|
66
|
-
*
|
|
67
|
-
* @param input The raw string to parse as JSON.
|
|
68
|
-
* @returns A result containing the parsed value.
|
|
69
|
-
* @throws {@link JsonParseError} with position and snippet on failure.
|
|
70
|
-
*/
|
|
71
|
-
export function parseJsonStrict(input) {
|
|
72
|
-
try {
|
|
73
|
-
const value = JSON.parse(input);
|
|
74
|
-
return { value, raw: input, wasStringified: false };
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
if (error instanceof SyntaxError) {
|
|
78
|
-
throw buildDetailedError(input, error);
|
|
79
|
-
}
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=json-parse.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json-parse.js","sourceRoot":"","sources":["../../src/utils/json-parse.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAIvC,YAAY,OAAe,EAAE,QAAgB,EAAE,OAAe;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,KAAkB,EAAE,KAAa;IAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;IAE1B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACjE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB;QAClD,CAAC;QACD,OAAO,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAa,EAAE,QAAgB;IACnD,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,EAAE,CAAC;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IAEhD,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAkB;IAC3D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,OAAO,GACX,eAAe,OAAO,KAAK,KAAK,CAAC,OAAO,MAAM;QAC9C,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAE5C,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/utils/semver.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** Returns true if the string is a valid numeric semver (e.g. "1.2.3"). */
|
|
2
|
-
export declare function isValidVersion(version: string): boolean;
|
|
3
|
-
/** Returns true if `latest` is strictly greater than `current`. */
|
|
4
|
-
export declare function isNewerVersion(current: string, latest: string): boolean;
|
package/dist/utils/semver.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const SEMVER_NUMERIC = /^\d+(\.\d+)*$/;
|
|
2
|
-
/** Returns true if the string is a valid numeric semver (e.g. "1.2.3"). */
|
|
3
|
-
export function isValidVersion(version) {
|
|
4
|
-
return SEMVER_NUMERIC.test(version);
|
|
5
|
-
}
|
|
6
|
-
/** Returns -1 if a < b, 0 if equal, 1 if a > b. */
|
|
7
|
-
function compareVersions(a, b) {
|
|
8
|
-
const pa = a.split('.').map(Number);
|
|
9
|
-
const pb = b.split('.').map(Number);
|
|
10
|
-
const len = Math.max(pa.length, pb.length);
|
|
11
|
-
for (let i = 0; i < len; i++) {
|
|
12
|
-
const na = pa[i] ?? 0;
|
|
13
|
-
const nb = pb[i] ?? 0;
|
|
14
|
-
if (na < nb)
|
|
15
|
-
return -1;
|
|
16
|
-
if (na > nb)
|
|
17
|
-
return 1;
|
|
18
|
-
}
|
|
19
|
-
return 0;
|
|
20
|
-
}
|
|
21
|
-
/** Returns true if `latest` is strictly greater than `current`. */
|
|
22
|
-
export function isNewerVersion(current, latest) {
|
|
23
|
-
return compareVersions(current, latest) < 0;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=semver.js.map
|
package/dist/utils/semver.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,mDAAmD;AACnD,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC5D,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC"}
|