gdharness 0.13.0 → 0.13.2

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/build/cli.js CHANGED
@@ -36950,10 +36950,14 @@ class GodotServer {
36950
36950
  const known = new Set([...Object.keys(spec.parameters), ...spec.operations ? ["op"] : []]);
36951
36951
  const unknown = Object.keys(args).filter((key) => !known.has(key));
36952
36952
  if (unknown.length > 0) {
36953
- const takes = known.size === 0 ? "It takes no arguments." : `It takes: ${[...known].join(", ")}.`;
36953
+ const asked = readString(args, "op");
36954
+ const named = asked !== undefined && spec.operations?.[asked] !== undefined ? asked : null;
36955
+ const wanted = named === null ? [...known] : [...argumentsOf(spec, named), "op"];
36956
+ const takes = wanted.length === 0 ? "It takes no arguments." : `It takes: ${wanted.join(", ")}.`;
36957
+ const where = named === null ? spec.name : `${spec.name} ${named}`;
36954
36958
  return {
36955
36959
  ok: false,
36956
- response: this.createErrorResponse(`${spec.name} does not take ${unknown.join(", ")}. ${takes}`)
36960
+ response: this.createErrorResponse(`${where} does not take ${unknown.join(", ")}. ${takes} This is gdharness ${SERVER_VERSION}, which is what decides whether an argument exists.`)
36957
36961
  };
36958
36962
  }
36959
36963
  const wrong = wrongTypes(spec, args);
@@ -37693,13 +37697,13 @@ class GodotServer {
37693
37697
  const severity = asParams(entry)["severity"];
37694
37698
  return severity === 1 || severity === "error" || severity === "ERROR";
37695
37699
  }).length;
37696
- return this.jsonTextResponse({
37700
+ return this.jsonTextResponse(markIfStale({
37697
37701
  scriptPath: readString(args, "scriptPath"),
37698
37702
  clean: errors === 0,
37699
37703
  errors,
37700
37704
  warnings: diagnostics.length - errors,
37701
37705
  diagnostics
37702
- });
37706
+ }, this.godotBridge.getStatus().addonVersion, SERVER_VERSION));
37703
37707
  }
37704
37708
  async handleLSP(toolName, args) {
37705
37709
  const port = this.editorServes("lspPort", "GDHARNESS_LSP_PORT", DEFAULT_LSP_PORT);
@@ -39955,12 +39959,18 @@ function headlessSection() {
39955
39959
  return [
39956
39960
  "## What a gate can call",
39957
39961
  "",
39958
- "These answer from a short-lived headless engine: no editor window, no port, no running game,",
39959
- "and nothing left behind. They are the only calls worth putting in a push gate, because every",
39960
- "other tool needs an editor somebody has open or a game somebody is running.",
39962
+ "These answer from a short-lived headless engine: no editor window, no running game, and no",
39963
+ "process or port outliving the answer. They are the only calls an automatic check can make at",
39964
+ "all, because every other tool needs an editor somebody has open or a game somebody is running.",
39961
39965
  "",
39962
39966
  ...byTool.map((line) => `- ${line}`),
39963
39967
  "",
39968
+ "Needing nothing is not the same as changing nothing, and a gate wants both. Most of these",
39969
+ "write to the project because that is what they are for: `script_edit create` writes a file,",
39970
+ "`project_settings set` rewrites `project.godot`, `project_import reimport` and `refresh_classes`",
39971
+ "write under `.godot`. The reading ops are the ones to gate on, and which is which is in each",
39972
+ "op's own summary below rather than assumed from this list.",
39973
+ "",
39964
39974
  "Everything else needs the editor (`editor_*`, `debug_*`, `scene_*`, `resource_*`) or a running",
39965
39975
  "game (`runtime_*`).",
39966
39976
  ""
package/build/index.js CHANGED
@@ -29705,10 +29705,14 @@ class GodotServer {
29705
29705
  const known = new Set([...Object.keys(spec.parameters), ...spec.operations ? ["op"] : []]);
29706
29706
  const unknown = Object.keys(args).filter((key) => !known.has(key));
29707
29707
  if (unknown.length > 0) {
29708
- const takes = known.size === 0 ? "It takes no arguments." : `It takes: ${[...known].join(", ")}.`;
29708
+ const asked = readString(args, "op");
29709
+ const named = asked !== undefined && spec.operations?.[asked] !== undefined ? asked : null;
29710
+ const wanted = named === null ? [...known] : [...argumentsOf(spec, named), "op"];
29711
+ const takes = wanted.length === 0 ? "It takes no arguments." : `It takes: ${wanted.join(", ")}.`;
29712
+ const where = named === null ? spec.name : `${spec.name} ${named}`;
29709
29713
  return {
29710
29714
  ok: false,
29711
- response: this.createErrorResponse(`${spec.name} does not take ${unknown.join(", ")}. ${takes}`)
29715
+ response: this.createErrorResponse(`${where} does not take ${unknown.join(", ")}. ${takes} This is gdharness ${SERVER_VERSION}, which is what decides whether an argument exists.`)
29712
29716
  };
29713
29717
  }
29714
29718
  const wrong = wrongTypes(spec, args);
@@ -30448,13 +30452,13 @@ class GodotServer {
30448
30452
  const severity = asParams(entry)["severity"];
30449
30453
  return severity === 1 || severity === "error" || severity === "ERROR";
30450
30454
  }).length;
30451
- return this.jsonTextResponse({
30455
+ return this.jsonTextResponse(markIfStale({
30452
30456
  scriptPath: readString(args, "scriptPath"),
30453
30457
  clean: errors === 0,
30454
30458
  errors,
30455
30459
  warnings: diagnostics.length - errors,
30456
30460
  diagnostics
30457
- });
30461
+ }, this.godotBridge.getStatus().addonVersion, SERVER_VERSION));
30458
30462
  }
30459
30463
  async handleLSP(toolName, args) {
30460
30464
  const port = this.editorServes("lspPort", "GDHARNESS_LSP_PORT", DEFAULT_LSP_PORT);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdharness",
3
- "version": "0.13.0",
3
+ "version": "0.13.2",
4
4
  "mcpName": "io.github.Aureliolo/gdharness",
5
5
  "description": "A harness for driving a Godot 4 project from an agent: editor addons, a runtime bridge into the running game, an MCP server in front of them, and a CLI that installs and diagnoses the Godot side.",
6
6
  "type": "module",