godot-cli 0.11.1 → 0.13.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.
@@ -1,18 +1,32 @@
1
1
  import * as fs from 'fs';
2
+ import * as path from 'path';
2
3
  import { GODOT_MCP_PLUGIN_PATH, projectGodotPath as resolveProjectGodotPath, togglePluginInText, } from '../utils/project-godot.js';
4
+ import { addAddonPackageReferences } from '../utils/csproj-deps.js';
5
+ import { ADDON_PACKAGE_REFERENCES } from '../utils/addon-deps.js';
6
+ import { addonDownloadUrl, assertTrustedDownloadUrl, } from '../utils/addon-source.js';
7
+ import { parseZip } from '../utils/unzip.js';
3
8
  import { emitProgress } from './progress.js';
4
9
  import { requireGodotProject } from './validation.js';
10
+ /** Relative path of the addon dir inside a Godot project. */
11
+ const ADDON_REL_DIR = path.join('addons', 'godot_mcp');
5
12
  /**
6
- * Enable the `godot_mcp` addon in a project's `project.godot` `[editor_plugins]`
7
- * `enabled` array. Library-safe: no stdout noise, no process.exit, no throws
8
- * past the public boundary.
13
+ * Install the `godot_mcp` addon into a Godot C# project as a REAL installer:
9
14
  *
10
- * v1 is intentionally minimal it only flips the project.godot plugin-enable
11
- * state. It does NOT copy addon files or patch the consumer `.csproj` with the
12
- * NuGet PackageReferences the addon needs (that is the consumer's responsibility
13
- * per the addon's install docs); a warning surfaces that requirement.
15
+ * 1. Materialize `res://addons/godot_mcp/`by default downloading
16
+ * `godot-mcp-addon-<version>.zip` over HTTPS from github.com only (the
17
+ * `IvanMurzak/Godot-MCP` release `v<version>`), or, with `--source <path>`,
18
+ * copying the addon from a local directory (offline / dev / CI).
19
+ * 2. Add the two NuGet `PackageReference`s the addon needs to the consumer
20
+ * `.csproj`, idempotently and single-sourced from the addon's own pins.
21
+ * 3. Flip the `[editor_plugins] enabled` flag in `project.godot`.
14
22
  *
15
- * Idempotent: enabling an already-enabled plugin returns `changed: false`.
23
+ * Library-safe: no stdout noise, no `process.exit`, no throws past the public
24
+ * boundary; returns a `{ kind: 'success' | 'failure' }` union. Idempotent: a
25
+ * re-run that finds the addon present, the pins present, and the plugin already
26
+ * enabled reports `changed: false` and makes no writes. On a download/copy
27
+ * failure the project is left as found: both paths materialize into a temp
28
+ * sibling and only swap it into the addon dir after a fully successful
29
+ * fetch+extract / copy, so a partial materialization is rolled back.
16
30
  */
17
31
  export async function installPlugin(opts) {
18
32
  const warnings = [];
@@ -30,26 +44,32 @@ export async function installPlugin(opts) {
30
44
  const { projectPath, projectGodotPath } = validated;
31
45
  emitProgress(opts.onProgress, {
32
46
  phase: 'start',
33
- message: `Enabling godot_mcp addon for ${projectPath}`,
47
+ message: `Installing godot_mcp addon into ${projectPath}`,
34
48
  });
49
+ // 1. Materialize the addon files (download / local copy / skip).
50
+ const materialize = await materializeAddon(projectPath, opts, warnings);
51
+ // 2. Patch the consumer csproj with the addon's NuGet PackageReferences.
52
+ const csproj = patchConsumerCsproj(projectPath, warnings, opts.onProgress);
53
+ // 3. Enable the plugin in project.godot.
35
54
  const text = fs.readFileSync(projectGodotPath, 'utf-8');
36
- const result = togglePluginInText(text, true, GODOT_MCP_PLUGIN_PATH);
37
- if (result.kind === 'changed') {
38
- fs.writeFileSync(projectGodotPath, result.text);
55
+ const toggled = togglePluginInText(text, true, GODOT_MCP_PLUGIN_PATH);
56
+ if (toggled.kind === 'changed') {
57
+ fs.writeFileSync(projectGodotPath, toggled.text);
39
58
  emitProgress(opts.onProgress, {
40
59
  phase: 'manifest-patched',
41
60
  message: `Wrote ${projectGodotPath}`,
42
61
  manifestPath: projectGodotPath,
43
62
  });
44
63
  }
45
- warnings.push('Ensure the project .csproj declares the com.IvanMurzak.ReflectorNet and com.IvanMurzak.McpPlugin PackageReferences the addon needs (see the addon README).');
46
- emitProgress(opts.onProgress, { phase: 'done', message: 'godot_mcp addon enabled.' });
64
+ emitProgress(opts.onProgress, { phase: 'done', message: 'godot_mcp addon installed.' });
47
65
  return {
48
66
  kind: 'success',
49
67
  success: true,
50
- changed: result.kind === 'changed',
68
+ changed: toggled.kind === 'changed',
51
69
  projectGodotPath,
52
- enabledPlugins: result.enabled,
70
+ enabledPlugins: toggled.enabled,
71
+ materialize,
72
+ csproj,
53
73
  warnings,
54
74
  };
55
75
  }
@@ -62,6 +82,208 @@ export async function installPlugin(opts) {
62
82
  };
63
83
  }
64
84
  }
85
+ /**
86
+ * Materialize `addons/godot_mcp/` into the project from the GitHub release zip
87
+ * (default) or a local `--source` directory. Idempotent for the local-copy and
88
+ * download paths: the target dir is replaced atomically-ish (extract/copy into a
89
+ * temp sibling, then swap), so a failure leaves the existing addon untouched.
90
+ */
91
+ async function materializeAddon(projectPath, opts, warnings) {
92
+ const addonDir = path.join(projectPath, ADDON_REL_DIR);
93
+ if (opts.skipMaterialize === true) {
94
+ if (!fs.existsSync(path.join(addonDir, 'plugin.cfg'))) {
95
+ warnings.push(`skipMaterialize was set but ${path.join(addonDir, 'plugin.cfg')} is absent — the editor cannot load the plugin until the addon files are present.`);
96
+ }
97
+ return { source: 'skipped', addonDir };
98
+ }
99
+ if (opts.source !== undefined && opts.source !== '') {
100
+ const sourceDir = resolveAddonSourceDir(opts.source);
101
+ copyAddonFromLocal(sourceDir, projectPath, addonDir, opts.onProgress);
102
+ emitProgress(opts.onProgress, {
103
+ phase: 'addon-materialized',
104
+ message: `Copied addon from ${sourceDir}`,
105
+ addonDir,
106
+ source: 'local',
107
+ });
108
+ return { source: 'local', addonDir, sourceDir };
109
+ }
110
+ // Download path. Default the version to the CLI's own version (passed by the
111
+ // command via opts.version); fail clearly if neither is available.
112
+ const version = (opts.version ?? '').trim();
113
+ if (version === '') {
114
+ throw new Error('No addon version to download. Pass --version <x.y.z> or --source <path> to install from a local copy.');
115
+ }
116
+ const url = addonDownloadUrl(version);
117
+ assertTrustedDownloadUrl(url); // fail-closed: github.com + https only.
118
+ emitProgress(opts.onProgress, {
119
+ phase: 'addon-downloading',
120
+ message: `Downloading addon ${version} from ${url}`,
121
+ url,
122
+ });
123
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
124
+ const response = await fetchImpl(url);
125
+ if (!response.ok) {
126
+ throw new Error(`Failed to download addon ${version}: HTTP ${response.status} ${response.statusText} from ${url}. ` +
127
+ `Verify the release v${version} exists, or use --source <path> for an offline/dev install.`);
128
+ }
129
+ const archive = Buffer.from(await response.arrayBuffer());
130
+ emitProgress(opts.onProgress, { phase: 'addon-extracting', message: 'Extracting addon zip' });
131
+ const entries = parseZip(archive);
132
+ extractAddonEntries(entries, projectPath, addonDir);
133
+ emitProgress(opts.onProgress, {
134
+ phase: 'addon-materialized',
135
+ message: `Downloaded + extracted addon to ${addonDir}`,
136
+ addonDir,
137
+ source: 'download',
138
+ });
139
+ return { source: 'download', addonDir, downloadUrl: url };
140
+ }
141
+ /** Resolve + validate a `--source` directory: it must exist and contain plugin.cfg. */
142
+ function resolveAddonSourceDir(source) {
143
+ const resolved = path.resolve(source);
144
+ // Accept either a path that IS addons/godot_mcp (contains plugin.cfg directly)
145
+ // or a path that CONTAINS addons/godot_mcp.
146
+ if (fs.existsSync(path.join(resolved, 'plugin.cfg'))) {
147
+ return resolved;
148
+ }
149
+ const nested = path.join(resolved, 'addons', 'godot_mcp');
150
+ if (fs.existsSync(path.join(nested, 'plugin.cfg'))) {
151
+ return nested;
152
+ }
153
+ throw new Error(`--source ${resolved} does not contain a godot_mcp addon (no plugin.cfg found at it or at addons/godot_mcp/).`);
154
+ }
155
+ /**
156
+ * Materialize the addon into a fresh staging sibling via `fill`, then atomically
157
+ * swap it into `addonDir`. A mid-fill failure leaves the existing addon untouched
158
+ * (staging is discarded), honoring the install's documented rollback guarantee.
159
+ * Shared by both the local-copy and download/extract paths.
160
+ */
161
+ function stageThenSwapAddon(projectPath, addonDir, fill) {
162
+ const addonReal = path.resolve(addonDir);
163
+ const staging = path.resolve(projectPath, `.godot-mcp-addon-staging-${process.pid}-${Date.now()}`);
164
+ fs.rmSync(staging, { recursive: true, force: true });
165
+ fs.mkdirSync(staging, { recursive: true });
166
+ try {
167
+ fill(staging);
168
+ // Swap staging -> addonDir only after `fill` fully succeeded.
169
+ fs.rmSync(addonReal, { recursive: true, force: true });
170
+ fs.mkdirSync(path.dirname(addonReal), { recursive: true });
171
+ fs.renameSync(staging, addonReal);
172
+ }
173
+ finally {
174
+ // Best-effort cleanup if the swap didn't consume staging.
175
+ fs.rmSync(staging, { recursive: true, force: true });
176
+ }
177
+ }
178
+ /**
179
+ * Recursively copy a local addon dir into the project's addons/godot_mcp/. Stages
180
+ * into a temp sibling and swaps, so a mid-copy failure leaves the existing addon
181
+ * intact (matching the download path's rollback guarantee). Deterministic +
182
+ * idempotent: the swap replaces any existing addon dir.
183
+ */
184
+ function copyAddonFromLocal(sourceDir, projectPath, addonDir, onProgress) {
185
+ emitProgress(onProgress, { phase: 'addon-extracting', message: `Copying addon from ${sourceDir}` });
186
+ stageThenSwapAddon(projectPath, addonDir, (staging) => {
187
+ fs.cpSync(sourceDir, staging, { recursive: true });
188
+ if (!fs.existsSync(path.join(staging, 'plugin.cfg'))) {
189
+ throw new Error(`Copy completed but ${path.join(sourceDir, 'plugin.cfg')} did not yield a plugin.cfg.`);
190
+ }
191
+ });
192
+ }
193
+ /**
194
+ * Write the zip entries that live under `addons/godot_mcp/` into the project. The
195
+ * release zip expands to `addons/godot_mcp/...`, so entries are written relative
196
+ * to the project root. Path-safety: every resolved target MUST stay inside the
197
+ * staging dir (reject zip-slip `../` traversal). The target addon dir is replaced
198
+ * atomically so the install is deterministic + idempotent and rollback-safe.
199
+ */
200
+ function extractAddonEntries(entries, projectPath, addonDir) {
201
+ stageThenSwapAddon(projectPath, addonDir, (staging) => {
202
+ let wrotePluginCfg = false;
203
+ for (const entry of entries) {
204
+ // Only the addons/godot_mcp/ subtree is relevant.
205
+ const prefix = 'addons/godot_mcp/';
206
+ if (!entry.path.startsWith(prefix))
207
+ continue;
208
+ const rel = entry.path.slice(prefix.length);
209
+ if (rel === '')
210
+ continue; // the dir entry itself
211
+ const target = path.resolve(staging, rel);
212
+ // Zip-slip guard: target must remain under staging.
213
+ if (target !== staging && !target.startsWith(staging + path.sep)) {
214
+ throw new Error(`Refusing to extract entry escaping the addon dir: ${entry.path}`);
215
+ }
216
+ if (entry.isDirectory) {
217
+ fs.mkdirSync(target, { recursive: true });
218
+ continue;
219
+ }
220
+ fs.mkdirSync(path.dirname(target), { recursive: true });
221
+ fs.writeFileSync(target, entry.bytes);
222
+ if (rel === 'plugin.cfg')
223
+ wrotePluginCfg = true;
224
+ }
225
+ if (!wrotePluginCfg) {
226
+ throw new Error('Downloaded addon zip did not contain addons/godot_mcp/plugin.cfg — the archive is not a valid godot_mcp addon release.');
227
+ }
228
+ });
229
+ }
230
+ /**
231
+ * Find the consumer's `.csproj` (the one Godot compiles the addon into) and add
232
+ * the two addon NuGet PackageReferences idempotently. The csproj is the single
233
+ * `*.csproj` at the project root (the `--dotnet` scaffold writes
234
+ * `<AssemblyName>.csproj` there). When there is no csproj (a GDScript-only
235
+ * project), the patch is skipped with a warning — the addon's C# cannot compile
236
+ * without one, but that is the consumer's project shape to fix.
237
+ */
238
+ function patchConsumerCsproj(projectPath, warnings, onProgress) {
239
+ const csprojPath = findConsumerCsproj(projectPath, warnings);
240
+ if (csprojPath === null) {
241
+ warnings.push('No .csproj found at the project root — the godot_mcp addon is C# and needs a Godot.NET.Sdk project. ' +
242
+ `Create one (e.g. \`godot-cli create-project --dotnet\`) and add the ${ADDON_PACKAGE_REFERENCES.map((r) => r.id).join(' + ')} PackageReferences.`);
243
+ return { changed: false, packages: [] };
244
+ }
245
+ const before = fs.readFileSync(csprojPath, 'utf-8');
246
+ const patched = addAddonPackageReferences(before);
247
+ if (patched.changed) {
248
+ fs.writeFileSync(csprojPath, patched.text);
249
+ emitProgress(onProgress, {
250
+ phase: 'csproj-patched',
251
+ message: `Added addon PackageReferences to ${csprojPath}`,
252
+ csprojPath,
253
+ });
254
+ }
255
+ return {
256
+ csprojPath,
257
+ changed: patched.changed,
258
+ packages: patched.changes.map((c) => ({
259
+ id: c.id,
260
+ action: c.action,
261
+ version: c.version,
262
+ })),
263
+ };
264
+ }
265
+ /** The single `*.csproj` directly at the project root, or null when none/ambiguous. */
266
+ function findConsumerCsproj(projectPath, warnings) {
267
+ let names;
268
+ try {
269
+ names = fs.readdirSync(projectPath).filter((n) => n.toLowerCase().endsWith('.csproj'));
270
+ }
271
+ catch {
272
+ return null;
273
+ }
274
+ if (names.length === 0)
275
+ return null;
276
+ // A scaffolded Godot project has exactly one root csproj. If there are several,
277
+ // pick deterministically (first alphabetically) — better than failing the whole
278
+ // install; all root csprojs compile into the same Godot assembly and would each
279
+ // need the pins, but warn so the heuristic's choice is observable.
280
+ names.sort();
281
+ if (names.length > 1) {
282
+ warnings.push(`Multiple .csproj files found at the project root (${names.join(', ')}); patched ${names[0]}. ` +
283
+ 'If a different one is the Godot project, add the addon PackageReferences to it as well.');
284
+ }
285
+ return path.join(projectPath, names[0]);
286
+ }
65
287
  /**
66
288
  * Disable the `godot_mcp` addon in a project's `project.godot`
67
289
  * `[editor_plugins]` `enabled` array. Idempotent: disabling an already-absent
@@ -1 +1 @@
1
- {"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../../src/lib/install-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../../src/lib/install-plugin.ts"],"names":[],"mappings":"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"}
package/dist/lib/open.js CHANGED
@@ -4,6 +4,7 @@ import { findGodotBinary, launchEditor } from '../utils/godot-editor.js';
4
4
  import { findGodotProcess } from '../utils/godot-process.js';
5
5
  import { ENV_AUTH_OPTION, ENV_CLOUD_URL, ENV_CONNECTION_MODE, ENV_HOST, ENV_LOG_LEVEL, ENV_TOKEN, } from '../utils/connection.js';
6
6
  import { emitProgress } from './progress.js';
7
+ import { buildProject } from './build.js';
7
8
  /**
8
9
  * Resolve the project path from an explicit option or fall back to the supplied
9
10
  * cwd. Returns an absolute path plus a flag indicating whether the cwd fallback
@@ -77,6 +78,7 @@ export async function openProject(options) {
77
78
  const warnings = [];
78
79
  let resolvedProjectPath;
79
80
  let resolvedEditorPath;
81
+ let built = false;
80
82
  try {
81
83
  const { projectPath } = resolveProjectPath(options.projectPath, process.cwd());
82
84
  resolvedProjectPath = projectPath;
@@ -108,8 +110,38 @@ export async function openProject(options) {
108
110
  projectPath,
109
111
  warnings,
110
112
  alreadyRunning: true,
113
+ built: false,
111
114
  };
112
115
  }
116
+ // Build the C# assembly BEFORE launching the editor, so a fresh first open
117
+ // finds a compiled assembly when it instantiates enabled EditorPlugins
118
+ // (otherwise the editor shows "Unable to load addon script … Disabling the
119
+ // addon"). GDScript-only projects are skipped inside buildProject. Opt out
120
+ // with `build: false`. A build failure aborts the open — launching anyway
121
+ // would reproduce the very disable-addon failure this guards against.
122
+ if (options.build !== false) {
123
+ const buildResult = await buildProject({
124
+ projectPath,
125
+ configuration: options.buildConfiguration,
126
+ dotnetPath: options.dotnetPath,
127
+ spawnImpl: options.buildSpawnImpl,
128
+ onProgress: options.onProgress,
129
+ });
130
+ if (buildResult.kind === 'failure') {
131
+ throw new Error(`Build before open failed; not launching the editor (it would disable the addon).\n${buildResult.errorMessage}`);
132
+ }
133
+ for (const w of buildResult.warnings)
134
+ warnings.push(w);
135
+ built = !buildResult.skipped;
136
+ if (!buildResult.skipped && buildResult.csprojPath !== undefined) {
137
+ emitProgress(options.onProgress, {
138
+ phase: 'build-succeeded',
139
+ message: 'C# assembly built before launch.',
140
+ csprojPath: buildResult.csprojPath,
141
+ configuration: buildResult.configuration ?? 'Debug',
142
+ });
143
+ }
144
+ }
113
145
  // Locate the Godot binary.
114
146
  const editorPath = findGodotBinary(options.editorPath);
115
147
  if (!editorPath) {
@@ -165,6 +197,7 @@ export async function openProject(options) {
165
197
  editorPid: pid,
166
198
  projectPath,
167
199
  warnings,
200
+ built,
168
201
  };
169
202
  }
170
203
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/lib/open.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/lib/open.ts"],"names":[],"mappings":"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"}
@@ -9,10 +9,40 @@ export type ProgressEvent = {
9
9
  phase: 'manifest-patched';
10
10
  message: string;
11
11
  manifestPath: string;
12
+ } | {
13
+ phase: 'addon-downloading';
14
+ message: string;
15
+ url: string;
16
+ } | {
17
+ phase: 'addon-extracting';
18
+ message: string;
19
+ } | {
20
+ phase: 'addon-materialized';
21
+ message: string;
22
+ addonDir: string;
23
+ source: 'download' | 'local';
24
+ } | {
25
+ phase: 'csproj-patched';
26
+ message: string;
27
+ csprojPath: string;
12
28
  } | {
13
29
  phase: 'project-scaffolded';
14
30
  message: string;
15
31
  projectPath: string;
32
+ } | {
33
+ phase: 'build-running';
34
+ message: string;
35
+ csprojPath: string;
36
+ command: string;
37
+ } | {
38
+ phase: 'build-skipped';
39
+ message: string;
40
+ reason: BuildSkipReason;
41
+ } | {
42
+ phase: 'build-succeeded';
43
+ message: string;
44
+ csprojPath: string;
45
+ configuration: string;
16
46
  } | {
17
47
  phase: 'editor-resolved';
18
48
  message: string;
@@ -88,6 +118,44 @@ export interface SetupSkillsFailure {
88
118
  error: Error;
89
119
  }
90
120
  export type SetupSkillsResult = SetupSkillsSuccess | SetupSkillsFailure;
121
+ /** Why a build was skipped rather than run. */
122
+ export type BuildSkipReason = 'no-csproj';
123
+ export interface BuildProjectOptions {
124
+ /** Path to the Godot project to build. Defaults to `process.cwd()`. */
125
+ projectPath?: string;
126
+ /** MSBuild configuration to compile. Defaults to `Debug` (CI parity). */
127
+ configuration?: string;
128
+ /** Explicit `dotnet` executable path. Defaults to `dotnet` on `PATH`. */
129
+ dotnetPath?: string;
130
+ /** Injectable `child_process.spawn` for tests (mock the build). */
131
+ spawnImpl?: typeof import('child_process').spawn;
132
+ onProgress?: ProgressCallback;
133
+ }
134
+ export interface BuildProjectSuccess {
135
+ kind: 'success';
136
+ success: true;
137
+ projectPath: string;
138
+ /** True when the project had no C# to build (GDScript-only). */
139
+ skipped: boolean;
140
+ /** Set when `skipped` is true. */
141
+ skipReason?: BuildSkipReason;
142
+ /** The `.csproj` that was built (absent when skipped). */
143
+ csprojPath?: string;
144
+ /** The MSBuild configuration compiled (absent when skipped). */
145
+ configuration?: string;
146
+ /** Captured `dotnet build` stdout+stderr (absent when skipped). */
147
+ output?: string;
148
+ warnings: string[];
149
+ }
150
+ export interface BuildProjectFailure {
151
+ kind: 'failure';
152
+ success: false;
153
+ projectPath?: string;
154
+ warnings: string[];
155
+ errorMessage: string;
156
+ error: Error;
157
+ }
158
+ export type BuildProjectResult = BuildProjectSuccess | BuildProjectFailure;
91
159
  /** Auth option propagated to the editor as `GODOT_MCP_AUTH_OPTION`. */
92
160
  export type OpenProjectAuthOption = 'None' | 'Required';
93
161
  /** Connection mode propagated to the editor as `GODOT_MCP_CONNECTION_MODE`. */
@@ -97,6 +165,19 @@ export interface OpenProjectOptions {
97
165
  projectPath?: string;
98
166
  /** Explicit Godot editor executable path (skips resolution). */
99
167
  editorPath?: string;
168
+ /**
169
+ * Build the C# assembly (`dotnet build`) before launching the editor so a
170
+ * fresh first open loads the addon instead of failing with "Unable to load
171
+ * addon script … Disabling the addon". Defaults to `true`. Set `false` to skip
172
+ * (GDScript-only projects are skipped automatically — see `buildProject`).
173
+ */
174
+ build?: boolean;
175
+ /** MSBuild configuration for the pre-open build. Defaults to `Debug`. */
176
+ buildConfiguration?: string;
177
+ /** Explicit `dotnet` executable path for the pre-open build. */
178
+ dotnetPath?: string;
179
+ /** Injectable `child_process.spawn` for the pre-open build (tests). */
180
+ buildSpawnImpl?: typeof import('child_process').spawn;
100
181
  /** If `true`, skip wiring the GODOT_MCP_* env vars onto the editor process. */
101
182
  noConnect?: boolean;
102
183
  /** MCP server host — sets `GODOT_MCP_HOST`. */
@@ -122,6 +203,12 @@ export interface OpenProjectSuccess {
122
203
  warnings: string[];
123
204
  /** True when an editor was already running for this project; launch skipped. */
124
205
  alreadyRunning?: boolean;
206
+ /**
207
+ * Whether the C# assembly was built before launch: `true` when a build ran,
208
+ * `false` when skipped (`--no-build`, a GDScript-only project, or an
209
+ * already-running editor short-circuit).
210
+ */
211
+ built?: boolean;
125
212
  }
126
213
  export interface OpenProjectFailure {
127
214
  kind: 'failure';
@@ -237,8 +324,55 @@ export type RunSystemToolFailure = RunToolFailure;
237
324
  export interface InstallPluginOptions {
238
325
  /** Absolute or relative path to the Godot project root. */
239
326
  godotProjectPath: string;
327
+ /**
328
+ * Local directory to copy `addons/godot_mcp/` from instead of downloading it
329
+ * from the GitHub release (offline / dev / CI path). When set, no network call
330
+ * is made; the directory must contain the addon files (a `plugin.cfg`).
331
+ */
332
+ source?: string;
333
+ /**
334
+ * Addon release version to download (`<version>` in
335
+ * `godot-mcp-addon-<version>.zip`, tag `v<version>`). Defaults to the CLI's own
336
+ * version. Ignored when `source` is set. Used only on the download path.
337
+ */
338
+ version?: string;
339
+ /**
340
+ * Skip materializing the addon files (download / copy) and only enable the
341
+ * plugin + patch the csproj. Restores the pre-installer behavior for callers
342
+ * that manage the addon files themselves.
343
+ */
344
+ skipMaterialize?: boolean;
345
+ /**
346
+ * Injectable fetch for tests (mock the GitHub download). Defaults to
347
+ * `globalThis.fetch`. Used only on the download path.
348
+ */
349
+ fetchImpl?: typeof fetch;
240
350
  onProgress?: ProgressCallback;
241
351
  }
352
+ /** What `install-plugin` did to materialize the `addons/godot_mcp/` files. */
353
+ export interface AddonMaterializeOutcome {
354
+ /** Where the addon files came from. `skipped` when `skipMaterialize` was set. */
355
+ source: 'download' | 'local' | 'skipped';
356
+ /** Absolute path to the materialized `addons/godot_mcp/` directory. */
357
+ addonDir: string;
358
+ /** The download URL used (download path only). */
359
+ downloadUrl?: string;
360
+ /** The local source directory used (`--source` path only). */
361
+ sourceDir?: string;
362
+ }
363
+ /** What `install-plugin` did to the consumer `.csproj`'s PackageReferences. */
364
+ export interface CsprojPatchOutcome {
365
+ /** Absolute path to the consumer `.csproj` that was patched, if one was found. */
366
+ csprojPath?: string;
367
+ /** True when the csproj text was modified. */
368
+ changed: boolean;
369
+ /** Per-package summary: each addon pin's add / update / unchanged outcome. */
370
+ packages: {
371
+ id: string;
372
+ action: 'added' | 'updated' | 'unchanged';
373
+ version: string;
374
+ }[];
375
+ }
242
376
  export interface InstallPluginSuccess {
243
377
  kind: 'success';
244
378
  success: true;
@@ -246,6 +380,10 @@ export interface InstallPluginSuccess {
246
380
  changed: boolean;
247
381
  projectGodotPath: string;
248
382
  enabledPlugins: string[];
383
+ /** Addon-files materialization outcome (download / local copy / skipped). */
384
+ materialize: AddonMaterializeOutcome;
385
+ /** Consumer csproj PackageReference patch outcome. */
386
+ csproj: CsprojPatchOutcome;
249
387
  warnings: string[];
250
388
  }
251
389
  export interface InstallPluginFailure {
package/dist/lib.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export { openProject } from './lib/open.js';
2
+ export { buildProject } from './lib/build.js';
2
3
  export { createProject } from './lib/create-project.js';
3
4
  export { runTool, runSystemTool } from './lib/run-tool.js';
4
5
  export { setupMcp, listAgentIds } from './lib/setup-mcp.js';
5
6
  export { setupSkills } from './lib/setup-skills.js';
6
7
  export { installPlugin, removePlugin } from './lib/install-plugin.js';
7
- export type { ProgressEvent, ProgressCallback, ResultKind, OpenProjectOptions, OpenProjectResult, OpenProjectSuccess, OpenProjectFailure, OpenProjectAuthOption, OpenProjectConnectionMode, CreateProjectOptions, CreateProjectResult, CreateProjectSuccess, CreateProjectFailure, RunToolOptions, RunToolResult, RunToolSuccess, RunToolFailure, RunToolFailureReason, RunSystemToolOptions, RunSystemToolResult, RunSystemToolSuccess, RunSystemToolFailure, SetupMcpOptions, SetupMcpResult, SetupMcpSuccess, SetupMcpFailure, SetupSkillsOptions, SetupSkillsResult, SetupSkillsSuccess, SetupSkillsFailure, InstallPluginOptions, InstallPluginResult, InstallPluginSuccess, InstallPluginFailure, RemovePluginOptions, RemovePluginResult, RemovePluginSuccess, RemovePluginFailure, } from './lib/types.js';
8
+ export type { ProgressEvent, ProgressCallback, ResultKind, OpenProjectOptions, OpenProjectResult, OpenProjectSuccess, OpenProjectFailure, OpenProjectAuthOption, OpenProjectConnectionMode, BuildProjectOptions, BuildProjectResult, BuildProjectSuccess, BuildProjectFailure, BuildSkipReason, CreateProjectOptions, CreateProjectResult, CreateProjectSuccess, CreateProjectFailure, RunToolOptions, RunToolResult, RunToolSuccess, RunToolFailure, RunToolFailureReason, RunSystemToolOptions, RunSystemToolResult, RunSystemToolSuccess, RunSystemToolFailure, SetupMcpOptions, SetupMcpResult, SetupMcpSuccess, SetupMcpFailure, SetupSkillsOptions, SetupSkillsResult, SetupSkillsSuccess, SetupSkillsFailure, InstallPluginOptions, InstallPluginResult, InstallPluginSuccess, InstallPluginFailure, AddonMaterializeOutcome, CsprojPatchOutcome, RemovePluginOptions, RemovePluginResult, RemovePluginSuccess, RemovePluginFailure, } from './lib/types.js';
package/dist/lib.js CHANGED
@@ -13,6 +13,7 @@
13
13
  // Consumers: `import { openProject } from 'godot-cli'` (maps to this file
14
14
  // via the `exports` field in package.json).
15
15
  export { openProject } from './lib/open.js';
16
+ export { buildProject } from './lib/build.js';
16
17
  export { createProject } from './lib/create-project.js';
17
18
  export { runTool, runSystemTool } from './lib/run-tool.js';
18
19
  export { setupMcp, listAgentIds } from './lib/setup-mcp.js';
package/dist/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,eAAe;AACf,+EAA+E;AAC/E,wDAAwD;AACxD,oDAAoD;AACpD,yEAAyE;AACzE,4DAA4D;AAC5D,+EAA+E;AAC/E,gEAAgE;AAChE,6EAA6E;AAC7E,EAAE;AACF,0EAA0E;AAC1E,4CAA4C;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,eAAe;AACf,+EAA+E;AAC/E,wDAAwD;AACxD,oDAAoD;AACpD,yEAAyE;AACzE,4DAA4D;AAC5D,+EAA+E;AAC/E,gEAAgE;AAChE,6EAA6E;AAC7E,EAAE;AACF,0EAA0E;AAC1E,4CAA4C;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** A single NuGet `<PackageReference>` the consumer csproj must declare. */
2
+ export interface AddonPackageReference {
3
+ /** The NuGet package id (the `Include=` attribute). */
4
+ id: string;
5
+ /** The pinned version (the `Version=` attribute). */
6
+ version: string;
7
+ }
8
+ /**
9
+ * The exact NuGet `PackageReference`s the consumer's project `.csproj` needs,
10
+ * single-sourced from the addon's `Godot-MCP.csproj` pins. Order matches the
11
+ * addon csproj (ReflectorNet first, then McpPlugin).
12
+ */
13
+ export declare const ADDON_PACKAGE_REFERENCES: readonly AddonPackageReference[];
14
+ /** The resource path of the addon manifest a consumer project loads the plugin from. */
15
+ export declare const ADDON_PLUGIN_CFG_RESOURCE = "res://addons/godot_mcp/plugin.cfg";