godot-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +101 -0
  3. package/bin/godot-cli.js +2 -0
  4. package/dist/cli.d.ts +11 -0
  5. package/dist/cli.js +17 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/close.d.ts +18 -0
  8. package/dist/commands/close.js +112 -0
  9. package/dist/commands/close.js.map +1 -0
  10. package/dist/commands/configure.d.ts +2 -0
  11. package/dist/commands/configure.js +92 -0
  12. package/dist/commands/configure.js.map +1 -0
  13. package/dist/commands/install-plugin.d.ts +2 -0
  14. package/dist/commands/install-plugin.js +35 -0
  15. package/dist/commands/install-plugin.js.map +1 -0
  16. package/dist/commands/open.d.ts +16 -0
  17. package/dist/commands/open.js +124 -0
  18. package/dist/commands/open.js.map +1 -0
  19. package/dist/commands/remove-plugin.d.ts +2 -0
  20. package/dist/commands/remove-plugin.js +31 -0
  21. package/dist/commands/remove-plugin.js.map +1 -0
  22. package/dist/commands/run-system-tool.d.ts +1 -0
  23. package/dist/commands/run-system-tool.js +13 -0
  24. package/dist/commands/run-system-tool.js.map +1 -0
  25. package/dist/commands/run-tool-builder.d.ts +25 -0
  26. package/dist/commands/run-tool-builder.js +119 -0
  27. package/dist/commands/run-tool-builder.js.map +1 -0
  28. package/dist/commands/run-tool.d.ts +1 -0
  29. package/dist/commands/run-tool.js +13 -0
  30. package/dist/commands/run-tool.js.map +1 -0
  31. package/dist/commands/setup-mcp.d.ts +2 -0
  32. package/dist/commands/setup-mcp.js +58 -0
  33. package/dist/commands/setup-mcp.js.map +1 -0
  34. package/dist/commands/status.d.ts +2 -0
  35. package/dist/commands/status.js +64 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/commands/update.d.ts +2 -0
  38. package/dist/commands/update.js +75 -0
  39. package/dist/commands/update.js.map +1 -0
  40. package/dist/commands/wait-for-ready.d.ts +2 -0
  41. package/dist/commands/wait-for-ready.js +57 -0
  42. package/dist/commands/wait-for-ready.js.map +1 -0
  43. package/dist/index.d.ts +1 -0
  44. package/dist/index.js +69 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/lib/install-plugin.d.ts +22 -0
  47. package/dist/lib/install-plugin.js +118 -0
  48. package/dist/lib/install-plugin.js.map +1 -0
  49. package/dist/lib/open.d.ts +34 -0
  50. package/dist/lib/open.js +198 -0
  51. package/dist/lib/open.js.map +1 -0
  52. package/dist/lib/progress.d.ts +7 -0
  53. package/dist/lib/progress.js +16 -0
  54. package/dist/lib/progress.js.map +1 -0
  55. package/dist/lib/run-tool.d.ts +12 -0
  56. package/dist/lib/run-tool.js +192 -0
  57. package/dist/lib/run-tool.js.map +1 -0
  58. package/dist/lib/setup-mcp.d.ts +16 -0
  59. package/dist/lib/setup-mcp.js +118 -0
  60. package/dist/lib/setup-mcp.js.map +1 -0
  61. package/dist/lib/types.d.ts +210 -0
  62. package/dist/lib/types.js +8 -0
  63. package/dist/lib/types.js.map +1 -0
  64. package/dist/lib/validation.d.ts +30 -0
  65. package/dist/lib/validation.js +44 -0
  66. package/dist/lib/validation.js.map +1 -0
  67. package/dist/lib.d.ts +5 -0
  68. package/dist/lib.js +19 -0
  69. package/dist/lib.js.map +1 -0
  70. package/dist/utils/agents.d.ts +31 -0
  71. package/dist/utils/agents.js +188 -0
  72. package/dist/utils/agents.js.map +1 -0
  73. package/dist/utils/config.d.ts +40 -0
  74. package/dist/utils/config.js +97 -0
  75. package/dist/utils/config.js.map +1 -0
  76. package/dist/utils/connection.d.ts +57 -0
  77. package/dist/utils/connection.js +129 -0
  78. package/dist/utils/connection.js.map +1 -0
  79. package/dist/utils/godot-editor.d.ts +42 -0
  80. package/dist/utils/godot-editor.js +184 -0
  81. package/dist/utils/godot-editor.js.map +1 -0
  82. package/dist/utils/godot-process.d.ts +10 -0
  83. package/dist/utils/godot-process.js +93 -0
  84. package/dist/utils/godot-process.js.map +1 -0
  85. package/dist/utils/godot-shutdown.d.ts +16 -0
  86. package/dist/utils/godot-shutdown.js +67 -0
  87. package/dist/utils/godot-shutdown.js.map +1 -0
  88. package/dist/utils/input.d.ts +13 -0
  89. package/dist/utils/input.js +72 -0
  90. package/dist/utils/input.js.map +1 -0
  91. package/dist/utils/json-parse.d.ts +25 -0
  92. package/dist/utils/json-parse.js +83 -0
  93. package/dist/utils/json-parse.js.map +1 -0
  94. package/dist/utils/probe.d.ts +18 -0
  95. package/dist/utils/probe.js +61 -0
  96. package/dist/utils/probe.js.map +1 -0
  97. package/dist/utils/project-godot.d.ts +41 -0
  98. package/dist/utils/project-godot.js +126 -0
  99. package/dist/utils/project-godot.js.map +1 -0
  100. package/dist/utils/semver.d.ts +4 -0
  101. package/dist/utils/semver.js +25 -0
  102. package/dist/utils/semver.js.map +1 -0
  103. package/dist/utils/ui.d.ts +61 -0
  104. package/dist/utils/ui.js +238 -0
  105. package/dist/utils/ui.js.map +1 -0
  106. package/dist/utils/update-check.d.ts +19 -0
  107. package/dist/utils/update-check.js +92 -0
  108. package/dist/utils/update-check.js.map +1 -0
  109. package/docs/README.md +7 -0
  110. package/package.json +73 -0
@@ -0,0 +1,31 @@
1
+ import { Command } from 'commander';
2
+ import * as path from 'path';
3
+ import * as ui from '../utils/ui.js';
4
+ import { verbose } from '../utils/ui.js';
5
+ import { removePlugin } from '../lib/install-plugin.js';
6
+ export const removePluginCommand = new Command('remove-plugin')
7
+ .description('Disable the godot_mcp addon in a project (removes res://addons/godot_mcp/plugin.cfg from project.godot [editor_plugins])')
8
+ .argument('[path]', 'Path to the Godot project')
9
+ .option('--path <path>', 'Path to the Godot project')
10
+ .action(async (positionalPath, options) => {
11
+ const resolvedPath = positionalPath ?? options.path ?? process.cwd();
12
+ const projectPath = path.resolve(resolvedPath);
13
+ ui.heading('Disabling godot_mcp addon');
14
+ verbose(`Project path: ${projectPath}`);
15
+ const spinner = ui.startSpinner('Updating project.godot...');
16
+ const result = await removePlugin({ godotProjectPath: projectPath });
17
+ if (result.kind === 'failure') {
18
+ spinner.error('Failed to disable plugin');
19
+ ui.error(result.error.message);
20
+ process.exit(1);
21
+ }
22
+ if (result.changed) {
23
+ spinner.success('godot_mcp addon disabled');
24
+ }
25
+ else {
26
+ spinner.success('godot_mcp addon was not enabled');
27
+ }
28
+ ui.label('project.godot', result.projectGodotPath);
29
+ ui.label('Enabled plugins', result.enabledPlugins.join(', ') || '(none)');
30
+ });
31
+ //# sourceMappingURL=remove-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-plugin.js","sourceRoot":"","sources":["../../src/commands/remove-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMxD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC5D,WAAW,CAAC,0HAA0H,CAAC;KACvI,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAA+B,EAAE,EAAE;IACpF,MAAM,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACxC,OAAO,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAErE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnD,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const runSystemToolCommand: import("commander").Command;
@@ -0,0 +1,13 @@
1
+ import { runSystemTool } from '../lib/run-tool.js';
2
+ import { buildRunToolCommand } from './run-tool-builder.js';
3
+ export const runSystemToolCommand = buildRunToolCommand({
4
+ name: 'run-system-tool',
5
+ description: 'Execute a system tool via the HTTP API (not exposed to MCP clients)',
6
+ argDescription: 'Name of the system tool to execute',
7
+ routePrefix: '/api/system-tools',
8
+ verboseLabel: 'System tool',
9
+ headingLabel: 'Run System Tool',
10
+ errorNoun: 'system tool',
11
+ invoke: runSystemTool,
12
+ });
13
+ //# sourceMappingURL=run-system-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-system-tool.js","sourceRoot":"","sources":["../../src/commands/run-system-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;IACtD,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,qEAAqE;IAClF,cAAc,EAAE,oCAAoC;IACpD,WAAW,EAAE,mBAAmB;IAChC,YAAY,EAAE,aAAa;IAC3B,YAAY,EAAE,iBAAiB;IAC/B,SAAS,EAAE,aAAa;IACxB,MAAM,EAAE,aAAa;CACtB,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Command } from 'commander';
2
+ import type { RunToolOptions, RunToolResult } from '../lib/types.js';
3
+ interface BuilderOptions {
4
+ /** CLI subcommand name, e.g. `'run-tool'`. */
5
+ name: string;
6
+ /** `description()` text for the commander command. */
7
+ description: string;
8
+ /** Description shown next to the `<tool-name>` argument. */
9
+ argDescription: string;
10
+ /** URL path prefix the lib function targets, e.g. `'/api/tools'`. */
11
+ routePrefix: string;
12
+ /** Verbose-log label, e.g. `'Tool'` or `'System tool'`. */
13
+ verboseLabel: string;
14
+ /** Heading printed by `ui.heading`, e.g. `'Run Tool'`. */
15
+ headingLabel: string;
16
+ /**
17
+ * Lower-case noun used in user-facing failure copy:
18
+ * `Failed to call <noun>:` and `<Capitalized> call timed out…`.
19
+ */
20
+ errorNoun: string;
21
+ /** Library function — `runTool` or `runSystemTool`. */
22
+ invoke: (opts: RunToolOptions) => Promise<RunToolResult>;
23
+ }
24
+ export declare function buildRunToolCommand(cfg: BuilderOptions): Command;
25
+ export {};
@@ -0,0 +1,119 @@
1
+ import { Command } from 'commander';
2
+ import * as ui from '../utils/ui.js';
3
+ import { verbose } from '../utils/ui.js';
4
+ import { resolveAndValidateProjectPath, resolveConnection } from '../utils/connection.js';
5
+ import { parseInput } from '../utils/input.js';
6
+ export function buildRunToolCommand(cfg) {
7
+ return new Command(cfg.name)
8
+ .description(cfg.description)
9
+ .argument('<tool-name>', cfg.argDescription)
10
+ .argument('[path]', 'Godot project path (used to validate project.godot when --url is omitted)')
11
+ .option('--path <path>', 'Godot project path')
12
+ .option('--url <url>', 'MCP server base URL (defaults to GODOT_MCP_HOST/cloud)')
13
+ .option('--token <token>', 'Bearer token override (defaults to GODOT_MCP_TOKEN)')
14
+ .option('--input <json>', 'JSON string of tool arguments')
15
+ .option('--input-file <file>', 'Read JSON arguments from file')
16
+ .option('--raw', 'Output raw JSON (no formatting)')
17
+ .option('--timeout <ms>', 'Request timeout in milliseconds (default: 60000)', '60000')
18
+ .action(async (toolName, positionalPath, options) => {
19
+ // Validate --timeout first so a bad value short-circuits before we read
20
+ // --input-file or hit the network.
21
+ const timeoutMs = parseInt(options.timeout, 10);
22
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
23
+ ui.error(`Invalid --timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
24
+ process.exit(1);
25
+ }
26
+ // Resolve path + connection up front so the heading and verbose output
27
+ // reflect the final endpoint before the HTTP call fires.
28
+ const projectPath = resolveAndValidateProjectPath(positionalPath, options);
29
+ const { url: baseUrl, token } = resolveConnection(projectPath, options);
30
+ const body = parseInput(options);
31
+ const endpoint = `${baseUrl}${cfg.routePrefix}/${encodeURIComponent(toolName)}`;
32
+ const authSource = options.token ? '--token flag' : 'config/env';
33
+ verbose(`${cfg.verboseLabel}: ${toolName}`);
34
+ verbose(`Endpoint: ${endpoint}`);
35
+ verbose(`Body: ${body}`);
36
+ if (token)
37
+ verbose(`Authorization header set (source: ${authSource})`);
38
+ if (!options.raw) {
39
+ ui.heading(cfg.headingLabel);
40
+ ui.label('Tool', toolName);
41
+ ui.label('URL', endpoint);
42
+ if (token)
43
+ ui.label('Auth', `from ${authSource}`);
44
+ ui.divider();
45
+ }
46
+ const spinner = options.raw ? null : ui.startSpinner(`Calling ${toolName}...`);
47
+ const result = await cfg.invoke({
48
+ toolName,
49
+ url: baseUrl,
50
+ ...(token ? { token } : {}),
51
+ input: body,
52
+ timeoutMs,
53
+ });
54
+ if (result.kind === 'success') {
55
+ spinner?.success(`${toolName} completed`);
56
+ if (options.raw) {
57
+ process.stdout.write(stringifyForRaw(result.data));
58
+ }
59
+ else {
60
+ ui.success('Response:');
61
+ console.log(typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2));
62
+ }
63
+ return;
64
+ }
65
+ spinner?.stop();
66
+ handleFailure(result, {
67
+ toolName,
68
+ endpoint,
69
+ raw: options.raw,
70
+ timeoutMs,
71
+ errorNoun: cfg.errorNoun,
72
+ });
73
+ });
74
+ }
75
+ function stringifyForRaw(data) {
76
+ if (typeof data === 'string')
77
+ return data;
78
+ if (data === undefined)
79
+ return '';
80
+ return JSON.stringify(data);
81
+ }
82
+ function handleFailure(failure, ctx) {
83
+ if (failure.reason === 'http-error') {
84
+ if (ctx.raw) {
85
+ process.stdout.write(stringifyForRaw(failure.data));
86
+ }
87
+ else {
88
+ ui.error(`HTTP ${failure.httpStatus}: ${failure.message}`);
89
+ if (failure.data !== undefined) {
90
+ ui.info(typeof failure.data === 'string' ? failure.data : JSON.stringify(failure.data, null, 2));
91
+ }
92
+ }
93
+ process.exit(1);
94
+ }
95
+ const message = buildFailureMessage(failure, ctx);
96
+ if (ctx.raw)
97
+ process.stderr.write(message + '\n');
98
+ else
99
+ ui.error(`Failed to call ${ctx.errorNoun}: ${message}`);
100
+ process.exit(1);
101
+ }
102
+ function buildFailureMessage(failure, ctx) {
103
+ switch (failure.reason) {
104
+ case 'timeout':
105
+ return `${capitalize(ctx.errorNoun)} call timed out after ${ctx.timeoutMs / 1000} seconds: ${ctx.toolName}`;
106
+ case 'connection-refused':
107
+ return `Connection refused at ${ctx.endpoint}. Is the MCP server running? Open Godot with the godot_mcp plugin connected first.`;
108
+ case 'connection-reset':
109
+ return `Connection was reset by the server at ${ctx.endpoint}. The server may have crashed or restarted.`;
110
+ case 'network-error':
111
+ return `Cannot reach ${ctx.endpoint}. Check your network connection and server URL.`;
112
+ default:
113
+ return failure.message;
114
+ }
115
+ }
116
+ function capitalize(s) {
117
+ return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
118
+ }
119
+ //# sourceMappingURL=run-tool-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-tool-builder.js","sourceRoot":"","sources":["../../src/commands/run-tool-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const runToolCommand: import("commander").Command;
@@ -0,0 +1,13 @@
1
+ import { runTool } from '../lib/run-tool.js';
2
+ import { buildRunToolCommand } from './run-tool-builder.js';
3
+ export const runToolCommand = buildRunToolCommand({
4
+ name: 'run-tool',
5
+ description: 'Execute an MCP tool via the HTTP API',
6
+ argDescription: 'Name of the MCP tool to execute',
7
+ routePrefix: '/api/tools',
8
+ verboseLabel: 'Tool',
9
+ headingLabel: 'Run Tool',
10
+ errorNoun: 'tool',
11
+ invoke: runTool,
12
+ });
13
+ //# sourceMappingURL=run-tool.js.map
@@ -0,0 +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,YAAY,EAAE,UAAU;IACxB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const setupMcpCommand: Command;
@@ -0,0 +1,58 @@
1
+ import { Command } from 'commander';
2
+ import * as ui from '../utils/ui.js';
3
+ import { verbose } from '../utils/ui.js';
4
+ import { getAgentById, getAgentIds, listAgentTable, MCP_SERVER_NAME } from '../utils/agents.js';
5
+ import { setupMcp } from '../lib/setup-mcp.js';
6
+ function listAgents() {
7
+ listAgentTable('Available AI Agents', 'Config Path', (a) => a.configPathDisplay);
8
+ }
9
+ export const setupMcpCommand = new Command('setup-mcp')
10
+ .description('Write MCP client config for an AI agent, pointing at the Godot MCP server')
11
+ .argument('[agent-id]', 'Agent to configure (use --list to see all)')
12
+ .argument('[path]', 'Godot project path (defaults to cwd)')
13
+ .option('--url <url>', 'MCP server host override (the <host>/mcp client URL is derived from it)')
14
+ .option('--token <token>', 'Auth token override (defaults to GODOT_MCP_TOKEN)')
15
+ .option('--list', 'List all available agent IDs')
16
+ .action(async (agentId, positionalPath, options) => {
17
+ if (options.list) {
18
+ listAgents();
19
+ return;
20
+ }
21
+ if (!agentId) {
22
+ ui.error('Missing required argument: agent-id');
23
+ ui.info(`Available agent IDs: ${getAgentIds().join(', ')}`);
24
+ process.exit(1);
25
+ }
26
+ const agent = getAgentById(agentId);
27
+ if (!agent) {
28
+ ui.error(`Unknown agent: "${agentId}"`);
29
+ ui.info(`Available agent IDs: ${getAgentIds().join(', ')}`);
30
+ process.exit(1);
31
+ }
32
+ const spinner = ui.startSpinner(`Configuring ${agent.name}...`);
33
+ const result = await setupMcp({
34
+ agentId,
35
+ godotProjectPath: positionalPath,
36
+ url: options.url,
37
+ token: options.token,
38
+ });
39
+ if (result.kind === 'failure') {
40
+ spinner.error('Failed to write config');
41
+ ui.error(result.error.message);
42
+ process.exit(1);
43
+ }
44
+ if (positionalPath) {
45
+ verbose(`Project path: ${positionalPath}`);
46
+ }
47
+ verbose(`Config file: ${result.configPath}`);
48
+ spinner.success(`${agent.name} configured successfully`);
49
+ console.log('');
50
+ ui.label('Config file', result.configPath);
51
+ ui.label('Server URL', result.serverUrl);
52
+ ui.label('Server name', MCP_SERVER_NAME);
53
+ for (const warning of result.warnings) {
54
+ console.log('');
55
+ ui.warn(warning);
56
+ }
57
+ });
58
+ //# sourceMappingURL=setup-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const statusCommand: Command;
@@ -0,0 +1,64 @@
1
+ import { Command } from 'commander';
2
+ import * as ui from '../utils/ui.js';
3
+ import { verbose } from '../utils/ui.js';
4
+ import { resolveAndValidateProjectPath, resolveConnection } from '../utils/connection.js';
5
+ import { findGodotProcess } from '../utils/godot-process.js';
6
+ import { probe } from '../utils/probe.js';
7
+ export const statusCommand = new Command('status')
8
+ .description('Check Godot editor and MCP server connection status')
9
+ .argument('[path]', 'Godot project path (used to detect a running editor and validate project.godot)')
10
+ .option('--path <path>', 'Godot project path')
11
+ .option('--url <url>', 'MCP server base URL (defaults to GODOT_MCP_HOST/cloud)')
12
+ .option('--token <token>', 'Bearer token override (defaults to GODOT_MCP_TOKEN)')
13
+ .option('--timeout <ms>', 'Probe timeout in milliseconds (default: 5000)', '5000')
14
+ .action(async (positionalPath, options) => {
15
+ const projectPath = resolveAndValidateProjectPath(positionalPath, options);
16
+ const { url: serverUrl, token } = resolveConnection(projectPath, options);
17
+ const timeoutMs = parseInt(options.timeout ?? '5000', 10);
18
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
19
+ ui.error(`Invalid --timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
20
+ process.exit(1);
21
+ }
22
+ const headers = { 'Content-Type': 'application/json' };
23
+ if (token) {
24
+ headers['Authorization'] = `Bearer ${token}`;
25
+ }
26
+ ui.heading('Godot-MCP Status');
27
+ ui.label('Project', projectPath);
28
+ ui.divider();
29
+ // 1. Godot process detection
30
+ ui.heading('Godot Editor Process');
31
+ const proc = findGodotProcess(projectPath);
32
+ if (proc) {
33
+ ui.success(`Godot is running (PID: ${proc.pid})`);
34
+ }
35
+ else {
36
+ ui.warn('Godot is not running with this project');
37
+ }
38
+ // 2. MCP server check
39
+ ui.heading('MCP Server');
40
+ ui.label('URL', serverUrl);
41
+ const spinner = ui.startSpinner(`Probing ${serverUrl}...`);
42
+ const result = await probe(serverUrl, headers, timeoutMs);
43
+ if (result.ok) {
44
+ spinner.success('Connected');
45
+ verbose(`Server response: ${JSON.stringify(result.data)}`);
46
+ }
47
+ else {
48
+ spinner.error(`Not available (${result.reason})`);
49
+ }
50
+ ui.divider();
51
+ if (result.ok) {
52
+ ui.success('MCP server is reachable — ready for tool calls');
53
+ process.exit(0);
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);
62
+ }
63
+ });
64
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function createUpdateCommand(currentVersion: string): Command;
@@ -0,0 +1,75 @@
1
+ import { Command } from 'commander';
2
+ import { spawn } from 'child_process';
3
+ import { platform } from 'os';
4
+ import * as ui from '../utils/ui.js';
5
+ import { fetchLatestVersion, formatUpdateAvailable, isRunningViaNpx } from '../utils/update-check.js';
6
+ import { isNewerVersion } from '../utils/semver.js';
7
+ const PACKAGE_NAME = 'godot-cli';
8
+ function npmCommand() {
9
+ return platform() === 'win32' ? 'npm.cmd' : 'npm';
10
+ }
11
+ function runNpmInstall(packageSpec) {
12
+ return new Promise((resolve, reject) => {
13
+ const child = spawn(npmCommand(), ['install', '-g', packageSpec], { stdio: 'inherit' });
14
+ child.on('error', reject);
15
+ child.on('close', (code) => resolve(code ?? 1));
16
+ });
17
+ }
18
+ export function createUpdateCommand(currentVersion) {
19
+ return new Command('update')
20
+ .description('Update godot-cli to the latest version')
21
+ .option('--check', 'Only check for updates without installing')
22
+ .action(async (options) => {
23
+ if (isRunningViaNpx()) {
24
+ ui.info('Running via npx — it always fetches the latest published version.');
25
+ ui.info('No update action needed.');
26
+ process.exit(0);
27
+ }
28
+ const spinner = ui.startSpinner('Checking for updates...');
29
+ let latest;
30
+ try {
31
+ latest = await fetchLatestVersion();
32
+ }
33
+ catch (err) {
34
+ spinner.error('Failed to check for updates');
35
+ ui.error(err.message || String(err));
36
+ process.exit(1);
37
+ return;
38
+ }
39
+ if (!isNewerVersion(currentVersion, latest)) {
40
+ spinner.success(`Already up to date (v${currentVersion})`);
41
+ process.exit(0);
42
+ }
43
+ spinner.success(formatUpdateAvailable(currentVersion, latest));
44
+ console.log();
45
+ // --check mode: exit 2 = outdated (distinct from exit 1 = error)
46
+ if (options.check) {
47
+ process.exit(2);
48
+ }
49
+ ui.info(`Installing ${PACKAGE_NAME}@${latest}...`);
50
+ console.log();
51
+ try {
52
+ const exitCode = await runNpmInstall(`${PACKAGE_NAME}@${latest}`);
53
+ if (exitCode !== 0) {
54
+ console.log();
55
+ ui.error('Update failed.');
56
+ if (platform() === 'win32') {
57
+ ui.info('Try running the terminal as Administrator.');
58
+ }
59
+ else {
60
+ ui.info(`Try: sudo npm install -g ${PACKAGE_NAME}@latest`);
61
+ }
62
+ process.exit(1);
63
+ }
64
+ }
65
+ catch (err) {
66
+ console.log();
67
+ ui.error(`Could not run npm: ${err.message}`);
68
+ ui.info('Make sure npm is installed and in your PATH.');
69
+ process.exit(1);
70
+ }
71
+ console.log();
72
+ ui.success(`Updated to v${latest}`);
73
+ });
74
+ }
75
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const waitForReadyCommand: Command;
@@ -0,0 +1,57 @@
1
+ import { Command } from 'commander';
2
+ import * as ui from '../utils/ui.js';
3
+ import { verbose } from '../utils/ui.js';
4
+ import { resolveAndValidateProjectPath, resolveConnection } from '../utils/connection.js';
5
+ import { probe } from '../utils/probe.js';
6
+ const MAX_PROBE_TIMEOUT_MS = 10000;
7
+ export const waitForReadyCommand = new Command('wait-for-ready')
8
+ .description('Wait until the Godot editor and MCP server are ready to accept tool calls')
9
+ .argument('[path]', 'Godot project path (validated when --url is omitted)')
10
+ .option('--path <path>', 'Godot project path')
11
+ .option('--url <url>', 'MCP server base URL (defaults to GODOT_MCP_HOST/cloud)')
12
+ .option('--token <token>', 'Bearer token override (defaults to GODOT_MCP_TOKEN)')
13
+ .option('--timeout <ms>', 'Maximum time to wait in milliseconds (default: 120000)', '120000')
14
+ .option('--interval <ms>', 'Polling interval in milliseconds (default: 3000)', '3000')
15
+ .action(async (positionalPath, options) => {
16
+ const projectPath = resolveAndValidateProjectPath(positionalPath, options);
17
+ const { url: serverUrl, token } = resolveConnection(projectPath, options);
18
+ const timeoutMs = parseInt(options.timeout ?? '120000', 10);
19
+ const intervalMs = parseInt(options.interval ?? '3000', 10);
20
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
21
+ ui.error(`Invalid --timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
22
+ process.exit(1);
23
+ }
24
+ if (!Number.isFinite(intervalMs) || intervalMs <= 0) {
25
+ ui.error(`Invalid --interval value: "${options.interval}". Must be a positive integer (milliseconds).`);
26
+ process.exit(1);
27
+ }
28
+ const headers = { 'Content-Type': 'application/json' };
29
+ if (token) {
30
+ headers['Authorization'] = `Bearer ${token}`;
31
+ }
32
+ verbose(`Probe target: ${serverUrl}`);
33
+ verbose(`Timeout: ${timeoutMs}ms, Interval: ${intervalMs}ms`);
34
+ const spinner = ui.startSpinner('Waiting for Godot editor and MCP server...');
35
+ const startTime = Date.now();
36
+ while (true) {
37
+ const elapsed = Date.now() - startTime;
38
+ if (elapsed >= timeoutMs) {
39
+ spinner.error(`Timed out after ${(timeoutMs / 1000).toFixed(1)}s waiting for MCP server`);
40
+ process.exit(1);
41
+ }
42
+ const remaining = Math.ceil((timeoutMs - elapsed) / 1000);
43
+ spinner.text = `Waiting for Godot editor and MCP server... (${remaining}s remaining)`;
44
+ const probeTimeout = Math.min(intervalMs, MAX_PROBE_TIMEOUT_MS);
45
+ const result = await probe(serverUrl, headers, probeTimeout);
46
+ if (result.ok) {
47
+ const totalSeconds = ((Date.now() - startTime) / 1000).toFixed(1);
48
+ spinner.success(`MCP server is ready at ${result.baseUrl} (connected in ${totalSeconds}s)`);
49
+ process.exit(0);
50
+ }
51
+ const remainingMs = timeoutMs - (Date.now() - startTime);
52
+ if (remainingMs <= 0)
53
+ continue;
54
+ await new Promise((resolve) => setTimeout(resolve, Math.min(intervalMs, remainingMs)));
55
+ }
56
+ });
57
+ //# sourceMappingURL=wait-for-ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-ready.js","sourceRoot":"","sources":["../../src/commands/wait-for-ready.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,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,MAAM,oBAAoB,GAAG,KAAM,CAAC;AAUpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC7D,WAAW,CAAC,2EAA2E,CAAC;KACxF,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,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,wDAAwD,EAAE,QAAQ,CAAC;KAC5F,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,EAAE,MAAM,CAAC;KACrF,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAA4B,EAAE,EAAE;IACjF,MAAM,WAAW,GAAG,6BAA6B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,EAAE,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,OAAO,+CAA+C,CAAC,CAAC;QACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpD,EAAE,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,QAAQ,+CAA+C,CAAC,CAAC;QACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,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,OAAO,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,YAAY,SAAS,iBAAiB,UAAU,IAAI,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,4CAA4C,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvC,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,GAAG,+CAA+C,SAAS,cAAc,CAAC;QAEtF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAE7D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,OAAO,kBAAkB,YAAY,IAAI,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACzD,IAAI,WAAW,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,69 @@
1
+ import { Command } from 'commander';
2
+ import { createRequire } from 'module';
3
+ import { openCommand } from './commands/open.js';
4
+ import { runToolCommand } from './commands/run-tool.js';
5
+ import { runSystemToolCommand } from './commands/run-system-tool.js';
6
+ import { statusCommand } from './commands/status.js';
7
+ import { waitForReadyCommand } from './commands/wait-for-ready.js';
8
+ import { setupMcpCommand } from './commands/setup-mcp.js';
9
+ import { configureCommand } from './commands/configure.js';
10
+ import { closeCommand } from './commands/close.js';
11
+ import { createUpdateCommand } from './commands/update.js';
12
+ import { installPluginCommand } from './commands/install-plugin.js';
13
+ import { removePluginCommand } from './commands/remove-plugin.js';
14
+ import { configureStyledHelp, error as uiError, setVerbose } from './utils/ui.js';
15
+ import { checkForUpdate, isRunningViaNpx, printUpdateNotification } from './utils/update-check.js';
16
+ const require = createRequire(import.meta.url);
17
+ const pkg = require('../package.json');
18
+ const program = new Command();
19
+ program
20
+ .name('godot-cli')
21
+ .description('Cross-platform CLI tool for Godot-MCP operations')
22
+ .version(pkg.version)
23
+ .option('-v, --verbose', 'Enable verbose diagnostic output');
24
+ // Register all subcommands
25
+ const subcommands = [
26
+ closeCommand,
27
+ configureCommand,
28
+ installPluginCommand,
29
+ openCommand,
30
+ removePluginCommand,
31
+ runToolCommand,
32
+ runSystemToolCommand,
33
+ setupMcpCommand,
34
+ statusCommand,
35
+ createUpdateCommand(pkg.version),
36
+ waitForReadyCommand,
37
+ ];
38
+ for (const cmd of subcommands) {
39
+ cmd.option('-v, --verbose', 'Enable verbose diagnostic output');
40
+ configureStyledHelp(cmd);
41
+ program.addCommand(cmd);
42
+ }
43
+ // Apply styled help to root (after subcommands so banner knows about them)
44
+ configureStyledHelp(program, pkg.version);
45
+ // Wire verbose flag before any command executes
46
+ program.hook('preAction', (_thisCommand, actionCommand) => {
47
+ const opts = actionCommand.optsWithGlobals();
48
+ if (opts.verbose) {
49
+ setVerbose(true);
50
+ }
51
+ });
52
+ // Show help when no command provided
53
+ program.action(() => {
54
+ program.outputHelp();
55
+ });
56
+ // Start update check in background (non-blocking, parallel with command execution)
57
+ const updateCheckPromise = isRunningViaNpx() ? Promise.resolve(null) : checkForUpdate(pkg.version);
58
+ program.parseAsync()
59
+ .then(async () => {
60
+ const update = await updateCheckPromise;
61
+ if (update) {
62
+ printUpdateNotification(update.current, update.latest);
63
+ }
64
+ })
65
+ .catch((err) => {
66
+ uiError(err.message || String(err));
67
+ process.exit(1);
68
+ });
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}