gdharness 1.1.35 → 1.1.37

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
@@ -17758,7 +17758,7 @@ var init_tool_definitions = __esm(() => {
17758
17758
  },
17759
17759
  {
17760
17760
  name: "script_edit",
17761
- description: "Creates a GDScript file, or adds functions, variables and signals to one. Every declaration written carries a type. Both load what they wrote under the project's own warning settings and answer with parses; the engine's reasons for a refusal come back under engine_messages. create answers with the extends and class_name the engine read, and a script declaring a class_name is put in the project's class list, with registered saying whether it is there. modify makes every addition or none, and answers with the line each one is on in the file written. rename renames a class or a member wherever the engine uses it and writes every file or none. A new name already taken is refused with nothing written, a member's included when a class inheriting it already uses the name in code, as a local or a parameter. changed lists each file with its changed lines as they now read, and leftAlone lists every other whole-word occurrence of the old name with what the tokenizer makes of it (code, string, comment, doc, nodePath, scene, text, or ignored for a file under a .gdignore directory, which is never changed) and, where it is not plain, why: a string that is the old name whole, such as find_children's type or a call's method name, which nothing renames or compiles and which is listed first; a node named like the class; a call on a value whose type the analyser could not tell. A member rename answers under languageServer how many requests it made and how long they took. A comment or a line of a text file with nothing more to say is given under leftAloneInProse by file and line instead. Read both before calling the rename done; nothing in them was changed. Afterwards an open editor scans the changed files and reloads every changed script, which is also the compile check, and its answer comes back under editor; with no editor the class cache is rebuilt and the changed scripts are compiled in a fresh engine, under classCache and compiled. written is true once the files are written, and ok is false when what came after the write failed: the files are left changed, and note says so.",
17761
+ description: "Creates a GDScript file, or adds functions, variables and signals to one. Every declaration written carries a type. Both load what they wrote under the project's own warning settings and answer with parses; the engine's reasons for a refusal come back under engine_messages. create answers with the extends and class_name the engine read, and a script declaring a class_name is put in the project's class list, with registered saying whether it is there. modify makes every addition or none, and answers with the line each one is on in the file written. rename renames a class or a member wherever the engine uses it and writes every file or none. A new name already taken is refused with nothing written, a member's included when a class inheriting it already uses the name in code, as a local or a parameter. changed lists each file with its changed lines as they now read, and leftAlone lists every other whole-word occurrence of the old name with what the tokenizer makes of it (code, string, comment, doc, nodePath, scene, text, or ignored for a file under a .gdignore directory, which is never changed) and, where it is not plain, why: a string that is the old name whole, such as find_children's type or a call's method name, which nothing renames or compiles and which is listed first; a node named like the class; a call on a value whose type the analyser could not tell. A member rename answers under languageServer how many requests it made and how long they took. A comment or a line of a text file with nothing more to say is given under leftAloneInProse by file and line instead, and code that is certainly another symbol of the same name, a bare name in a file where nothing inherits the member or one the language server resolved to another declaration, under leftAloneOtherSymbols by file, why and line. Read both before calling the rename done; nothing in them was changed. Afterwards an open editor scans the changed files and reloads every changed script, which is also the compile check, and its answer comes back under editor; with no editor the class cache is rebuilt and the changed scripts are compiled in a fresh engine, under classCache and compiled. written is true once the files are written, and ok is false when what came after the write failed: the files are left changed, and note says so.",
17762
17762
  parameters: {
17763
17763
  projectPath: PROJECT_PATH,
17764
17764
  scriptPath: SCRIPT_PATH,
@@ -40136,7 +40136,7 @@ function planClassRename(args) {
40136
40136
  return plan.build();
40137
40137
  }
40138
40138
  function planMemberRename(args) {
40139
- const { texts, scripts, graph, root, family, kind, oldName, newName, resolved } = args;
40139
+ const { texts, scripts, graph, root, family, kind, oldName, newName, resolved, elsewhere, heirFiles } = args;
40140
40140
  const plan = new PlanBuilder(oldName, newName);
40141
40141
  const heirs = graph.descendants(root);
40142
40142
  const docKind = DOC_KIND[kind];
@@ -40193,7 +40193,13 @@ function planMemberRename(args) {
40193
40193
  if (mentionKind !== "code") {
40194
40194
  return;
40195
40195
  }
40196
- return occurrence.afterDot ? "not resolved to this member by the language server: another class with a member of the same name, or a value whose type the analyser could not tell" : "not resolved to this member by the language server";
40196
+ if (!occurrence.afterDot && !heirFiles.has(file)) {
40197
+ return NOT_INHERITED;
40198
+ }
40199
+ if (elsewhere.has(`${file}:${String(occurrence.offset)}`)) {
40200
+ return RESOLVED_ELSEWHERE;
40201
+ }
40202
+ return occurrence.afterDot ? "not resolved to this member by the language server: a value whose type the analyser could not tell, so it may be this member and is left for you" : "not resolved to this member by the language server, which gave no single declaration for it";
40197
40203
  });
40198
40204
  return plan.build();
40199
40205
  }
@@ -40530,7 +40536,7 @@ function applyRewrites(rewrites) {
40530
40536
  throw error;
40531
40537
  }
40532
40538
  }
40533
- var DOC_LINK_KINDS, DOC_KIND, WHOLE_CLASS_NAME = "the whole string is the class's name, as find_children's type, a comparison with get_global_name() or a list of accepted type names takes it, and it was not changed: if it names this class, it no longer matches anything after the rename, and no compile says so", WHOLE_MEMBER_NAME = "the whole string is the member's name, as call, connect, has_method, get or set take it, and it was not changed: if it names this member, it no longer finds it after the rename, and no compile says so";
40539
+ var DOC_LINK_KINDS, DOC_KIND, WHOLE_CLASS_NAME = "the whole string is the class's name, as find_children's type, a comparison with get_global_name() or a list of accepted type names takes it, and it was not changed: if it names this class, it no longer matches anything after the rename, and no compile says so", WHOLE_MEMBER_NAME = "the whole string is the member's name, as call, connect, has_method, get or set take it, and it was not changed: if it names this member, it no longer finds it after the rename, and no compile says so", NOT_INHERITED = "no class in this file inherits the member, so a bare name here is that class's own local, parameter or member, or a global", RESOLVED_ELSEWHERE = "the language server resolved this to another declaration of the name";
40534
40540
  var init_rename = __esm(() => {
40535
40541
  init_gdscript_source();
40536
40542
  DOC_LINK_KINDS = new Set([
@@ -40747,9 +40753,10 @@ async function renameSymbol(request, services) {
40747
40753
  overrides = family.map((one) => one.file).filter((file) => file !== fileOf(root));
40748
40754
  declaringFiles = family.map((one) => one.file);
40749
40755
  took = { references: { asked: 0, ms: 0 }, definitions: { asked: 0, ms: 0 } };
40756
+ const heirFiles = new Set([...graph.descendants(root)].map(fileOf));
40750
40757
  let resolved;
40751
40758
  try {
40752
- resolved = await resolveMember(projectPath, texts, scripts, family, symbol, services, took);
40759
+ resolved = await resolveMember(projectPath, texts, scripts, family, symbol, services, took, heirFiles);
40753
40760
  } catch (error) {
40754
40761
  if (!(error instanceof LSPTimeout)) {
40755
40762
  throw error;
@@ -40785,7 +40792,9 @@ async function renameSymbol(request, services) {
40785
40792
  kind,
40786
40793
  oldName: symbol,
40787
40794
  newName,
40788
- resolved
40795
+ resolved: resolved.ours,
40796
+ elsewhere: resolved.elsewhere,
40797
+ heirFiles
40789
40798
  });
40790
40799
  }
40791
40800
  if (moveTo !== null) {
@@ -40819,7 +40828,7 @@ async function renameSymbol(request, services) {
40819
40828
  }
40820
40829
  };
40821
40830
  }
40822
- async function resolveMember(projectPath, texts, scripts, family, name, services, took) {
40831
+ async function resolveMember(projectPath, texts, scripts, family, name, services, took, heirFiles) {
40823
40832
  const absoluteOf = new Map(texts.map((file) => [file.path, file.absolute]));
40824
40833
  const key = (place) => `${place.file}:${place.offset}`;
40825
40834
  const toResolved = (located) => {
@@ -40843,9 +40852,10 @@ async function resolveMember(projectPath, texts, scripts, family, name, services
40843
40852
  }
40844
40853
  };
40845
40854
  const ours = new Map;
40855
+ const elsewhere = new Set;
40846
40856
  const root = family[0];
40847
40857
  if (root === undefined) {
40848
- return [];
40858
+ return { ours: [], elsewhere };
40849
40859
  }
40850
40860
  const seeded = await ask("references", root);
40851
40861
  if (seeded.length === 0) {
@@ -40861,14 +40871,19 @@ async function resolveMember(projectPath, texts, scripts, family, name, services
40861
40871
  if (occurrence.kind !== "code" || ours.has(key(place))) {
40862
40872
  continue;
40863
40873
  }
40874
+ if (!occurrence.afterDot && !heirFiles.has(script.path)) {
40875
+ continue;
40876
+ }
40864
40877
  const declared = await ask("definitions", place);
40865
40878
  const only = declared.length === 1 ? declared[0] : undefined;
40866
40879
  if (only !== undefined && declarations.has(key(only))) {
40867
40880
  ours.set(key(place), place);
40881
+ } else if (only !== undefined) {
40882
+ elsewhere.add(key(place));
40868
40883
  }
40869
40884
  }
40870
40885
  }
40871
- return [...ours.values()];
40886
+ return { ours: [...ours.values()], elsewhere };
40872
40887
  }
40873
40888
  function changedReport(edits, rewrites) {
40874
40889
  return rewrites.map((rewrite) => {
@@ -40907,15 +40922,25 @@ function changedReport(edits, rewrites) {
40907
40922
  function leftAloneReport(mentions) {
40908
40923
  const full = [];
40909
40924
  const prose = new Map;
40925
+ const others = new Map;
40926
+ const add = (group, line) => {
40927
+ if (!group.lines.includes(line)) {
40928
+ group.lines.push(line);
40929
+ }
40930
+ };
40910
40931
  for (const mention of mentions) {
40911
40932
  if ((mention.kind === "comment" || mention.kind === "text") && mention.why === undefined) {
40912
40933
  const key = `${mention.file}
40913
40934
  ${mention.kind}`;
40914
40935
  const group = prose.get(key) ?? { file: mention.file, kind: mention.kind, lines: [] };
40915
- if (!group.lines.includes(mention.line)) {
40916
- group.lines.push(mention.line);
40917
- }
40936
+ add(group, mention.line);
40918
40937
  prose.set(key, group);
40938
+ } else if (mention.kind === "code" && (mention.why === NOT_INHERITED || mention.why === RESOLVED_ELSEWHERE)) {
40939
+ const key = `${mention.file}
40940
+ ${mention.why}`;
40941
+ const group = others.get(key) ?? { file: mention.file, why: mention.why, lines: [] };
40942
+ add(group, mention.line);
40943
+ others.set(key, group);
40919
40944
  } else {
40920
40945
  full.push(mention);
40921
40946
  }
@@ -40923,7 +40948,8 @@ ${mention.kind}`;
40923
40948
  const loudFirst = (mention) => mention.kind === "string" && mention.why !== undefined ? 0 : 1;
40924
40949
  return {
40925
40950
  leftAlone: full.sort((a, b) => loudFirst(a) - loudFirst(b)),
40926
- ...prose.size > 0 ? { leftAloneInProse: [...prose.values()] } : {}
40951
+ ...prose.size > 0 ? { leftAloneInProse: [...prose.values()] } : {},
40952
+ ...others.size > 0 ? { leftAloneOtherSymbols: [...others.values()] } : {}
40927
40953
  };
40928
40954
  }
40929
40955
  function summaryOf(edits, mentions, rewrites) {
@@ -42378,7 +42404,7 @@ class GodotServer {
42378
42404
  return this.saying(answer, {
42379
42405
  update_available: {
42380
42406
  ...notice,
42381
- what_to_do: "Tell the user a newer gdharness is out, with what changed, and offer to take it. " + "Only run the upgrade command if they say yes: it replaces the addons in their project, " + "and afterwards the MCP server has to be reconnected and the editor restarted with " + "editor_launch restart."
42407
+ what_to_do: "Tell the user a newer gdharness is out, with what changed. Run the upgrade command " + "only with their agreement: a yes now, or a standing instruction of theirs, such as " + "their CLAUDE.md, to upgrade on every release. Without either, offer it and wait, since " + "it replaces the addons in their project. Afterwards the MCP server has to be " + "reconnected and the editor restarted with editor_launch restart."
42382
42408
  }
42383
42409
  });
42384
42410
  }
@@ -47789,8 +47815,9 @@ To rename a class or a member across the project, use \`script_edit rename\` rat
47789
47815
  replacement: it changes the uses the engine resolves, doc links and what scenes record, and lists
47790
47816
  every other occurrence of the word for you to read: a string that is the name whole, such as a
47791
47817
  \`find_children\` type, first under \`leftAlone\` since nothing compiles it, a file under a
47792
- \`.gdignore\` directory there too, and a word in a comment or a text file by line under
47793
- \`leftAloneInProse\`. Pass \`preview\` first on a large rename. If the answer has \`ok: false\`
47818
+ \`.gdignore\` directory there too, a word in a comment or a text file by line under
47819
+ \`leftAloneInProse\`, and a local or another class's member of the same name by line under
47820
+ \`leftAloneOtherSymbols\`. Pass \`preview\` first on a large rename. If the answer has \`ok: false\`
47794
47821
  beside \`written: true\`, the files were changed and a script did not compile afterwards.
47795
47822
 
47796
47823
  Editing a file while a game is running does not change the running game. \`auto_reload\` is an
package/build/index.js CHANGED
@@ -30861,8 +30861,10 @@ function planClassRename(args) {
30861
30861
  });
30862
30862
  return plan.build();
30863
30863
  }
30864
+ var NOT_INHERITED = "no class in this file inherits the member, so a bare name here is that class's own local, parameter or member, or a global";
30865
+ var RESOLVED_ELSEWHERE = "the language server resolved this to another declaration of the name";
30864
30866
  function planMemberRename(args) {
30865
- const { texts, scripts, graph, root, family, kind, oldName, newName, resolved } = args;
30867
+ const { texts, scripts, graph, root, family, kind, oldName, newName, resolved, elsewhere, heirFiles } = args;
30866
30868
  const plan = new PlanBuilder(oldName, newName);
30867
30869
  const heirs = graph.descendants(root);
30868
30870
  const docKind = DOC_KIND[kind];
@@ -30919,7 +30921,13 @@ function planMemberRename(args) {
30919
30921
  if (mentionKind !== "code") {
30920
30922
  return;
30921
30923
  }
30922
- return occurrence.afterDot ? "not resolved to this member by the language server: another class with a member of the same name, or a value whose type the analyser could not tell" : "not resolved to this member by the language server";
30924
+ if (!occurrence.afterDot && !heirFiles.has(file)) {
30925
+ return NOT_INHERITED;
30926
+ }
30927
+ if (elsewhere.has(`${file}:${String(occurrence.offset)}`)) {
30928
+ return RESOLVED_ELSEWHERE;
30929
+ }
30930
+ return occurrence.afterDot ? "not resolved to this member by the language server: a value whose type the analyser could not tell, so it may be this member and is left for you" : "not resolved to this member by the language server, which gave no single declaration for it";
30923
30931
  });
30924
30932
  return plan.build();
30925
30933
  }
@@ -31718,9 +31726,10 @@ async function renameSymbol(request, services) {
31718
31726
  overrides = family.map((one) => one.file).filter((file) => file !== fileOf(root));
31719
31727
  declaringFiles = family.map((one) => one.file);
31720
31728
  took = { references: { asked: 0, ms: 0 }, definitions: { asked: 0, ms: 0 } };
31729
+ const heirFiles = new Set([...graph.descendants(root)].map(fileOf));
31721
31730
  let resolved;
31722
31731
  try {
31723
- resolved = await resolveMember(projectPath, texts, scripts, family, symbol, services, took);
31732
+ resolved = await resolveMember(projectPath, texts, scripts, family, symbol, services, took, heirFiles);
31724
31733
  } catch (error) {
31725
31734
  if (!(error instanceof LSPTimeout)) {
31726
31735
  throw error;
@@ -31756,7 +31765,9 @@ async function renameSymbol(request, services) {
31756
31765
  kind,
31757
31766
  oldName: symbol,
31758
31767
  newName,
31759
- resolved
31768
+ resolved: resolved.ours,
31769
+ elsewhere: resolved.elsewhere,
31770
+ heirFiles
31760
31771
  });
31761
31772
  }
31762
31773
  if (moveTo !== null) {
@@ -31790,7 +31801,7 @@ async function renameSymbol(request, services) {
31790
31801
  }
31791
31802
  };
31792
31803
  }
31793
- async function resolveMember(projectPath, texts, scripts, family, name, services, took) {
31804
+ async function resolveMember(projectPath, texts, scripts, family, name, services, took, heirFiles) {
31794
31805
  const absoluteOf = new Map(texts.map((file) => [file.path, file.absolute]));
31795
31806
  const key = (place) => `${place.file}:${place.offset}`;
31796
31807
  const toResolved = (located) => {
@@ -31814,9 +31825,10 @@ async function resolveMember(projectPath, texts, scripts, family, name, services
31814
31825
  }
31815
31826
  };
31816
31827
  const ours = new Map;
31828
+ const elsewhere = new Set;
31817
31829
  const root = family[0];
31818
31830
  if (root === undefined) {
31819
- return [];
31831
+ return { ours: [], elsewhere };
31820
31832
  }
31821
31833
  const seeded = await ask("references", root);
31822
31834
  if (seeded.length === 0) {
@@ -31832,14 +31844,19 @@ async function resolveMember(projectPath, texts, scripts, family, name, services
31832
31844
  if (occurrence.kind !== "code" || ours.has(key(place))) {
31833
31845
  continue;
31834
31846
  }
31847
+ if (!occurrence.afterDot && !heirFiles.has(script.path)) {
31848
+ continue;
31849
+ }
31835
31850
  const declared = await ask("definitions", place);
31836
31851
  const only = declared.length === 1 ? declared[0] : undefined;
31837
31852
  if (only !== undefined && declarations.has(key(only))) {
31838
31853
  ours.set(key(place), place);
31854
+ } else if (only !== undefined) {
31855
+ elsewhere.add(key(place));
31839
31856
  }
31840
31857
  }
31841
31858
  }
31842
- return [...ours.values()];
31859
+ return { ours: [...ours.values()], elsewhere };
31843
31860
  }
31844
31861
  function changedReport(edits, rewrites) {
31845
31862
  return rewrites.map((rewrite) => {
@@ -31878,15 +31895,25 @@ function changedReport(edits, rewrites) {
31878
31895
  function leftAloneReport(mentions) {
31879
31896
  const full = [];
31880
31897
  const prose = new Map;
31898
+ const others = new Map;
31899
+ const add = (group, line) => {
31900
+ if (!group.lines.includes(line)) {
31901
+ group.lines.push(line);
31902
+ }
31903
+ };
31881
31904
  for (const mention of mentions) {
31882
31905
  if ((mention.kind === "comment" || mention.kind === "text") && mention.why === undefined) {
31883
31906
  const key = `${mention.file}
31884
31907
  ${mention.kind}`;
31885
31908
  const group = prose.get(key) ?? { file: mention.file, kind: mention.kind, lines: [] };
31886
- if (!group.lines.includes(mention.line)) {
31887
- group.lines.push(mention.line);
31888
- }
31909
+ add(group, mention.line);
31889
31910
  prose.set(key, group);
31911
+ } else if (mention.kind === "code" && (mention.why === NOT_INHERITED || mention.why === RESOLVED_ELSEWHERE)) {
31912
+ const key = `${mention.file}
31913
+ ${mention.why}`;
31914
+ const group = others.get(key) ?? { file: mention.file, why: mention.why, lines: [] };
31915
+ add(group, mention.line);
31916
+ others.set(key, group);
31890
31917
  } else {
31891
31918
  full.push(mention);
31892
31919
  }
@@ -31894,7 +31921,8 @@ ${mention.kind}`;
31894
31921
  const loudFirst = (mention) => mention.kind === "string" && mention.why !== undefined ? 0 : 1;
31895
31922
  return {
31896
31923
  leftAlone: full.sort((a, b) => loudFirst(a) - loudFirst(b)),
31897
- ...prose.size > 0 ? { leftAloneInProse: [...prose.values()] } : {}
31924
+ ...prose.size > 0 ? { leftAloneInProse: [...prose.values()] } : {},
31925
+ ...others.size > 0 ? { leftAloneOtherSymbols: [...others.values()] } : {}
31898
31926
  };
31899
31927
  }
31900
31928
  function summaryOf(edits, mentions, rewrites) {
@@ -33083,7 +33111,7 @@ var TOOL_SPECS = [
33083
33111
  },
33084
33112
  {
33085
33113
  name: "script_edit",
33086
- description: "Creates a GDScript file, or adds functions, variables and signals to one. Every declaration written carries a type. Both load what they wrote under the project's own warning settings and answer with parses; the engine's reasons for a refusal come back under engine_messages. create answers with the extends and class_name the engine read, and a script declaring a class_name is put in the project's class list, with registered saying whether it is there. modify makes every addition or none, and answers with the line each one is on in the file written. rename renames a class or a member wherever the engine uses it and writes every file or none. A new name already taken is refused with nothing written, a member's included when a class inheriting it already uses the name in code, as a local or a parameter. changed lists each file with its changed lines as they now read, and leftAlone lists every other whole-word occurrence of the old name with what the tokenizer makes of it (code, string, comment, doc, nodePath, scene, text, or ignored for a file under a .gdignore directory, which is never changed) and, where it is not plain, why: a string that is the old name whole, such as find_children's type or a call's method name, which nothing renames or compiles and which is listed first; a node named like the class; a call on a value whose type the analyser could not tell. A member rename answers under languageServer how many requests it made and how long they took. A comment or a line of a text file with nothing more to say is given under leftAloneInProse by file and line instead. Read both before calling the rename done; nothing in them was changed. Afterwards an open editor scans the changed files and reloads every changed script, which is also the compile check, and its answer comes back under editor; with no editor the class cache is rebuilt and the changed scripts are compiled in a fresh engine, under classCache and compiled. written is true once the files are written, and ok is false when what came after the write failed: the files are left changed, and note says so.",
33114
+ description: "Creates a GDScript file, or adds functions, variables and signals to one. Every declaration written carries a type. Both load what they wrote under the project's own warning settings and answer with parses; the engine's reasons for a refusal come back under engine_messages. create answers with the extends and class_name the engine read, and a script declaring a class_name is put in the project's class list, with registered saying whether it is there. modify makes every addition or none, and answers with the line each one is on in the file written. rename renames a class or a member wherever the engine uses it and writes every file or none. A new name already taken is refused with nothing written, a member's included when a class inheriting it already uses the name in code, as a local or a parameter. changed lists each file with its changed lines as they now read, and leftAlone lists every other whole-word occurrence of the old name with what the tokenizer makes of it (code, string, comment, doc, nodePath, scene, text, or ignored for a file under a .gdignore directory, which is never changed) and, where it is not plain, why: a string that is the old name whole, such as find_children's type or a call's method name, which nothing renames or compiles and which is listed first; a node named like the class; a call on a value whose type the analyser could not tell. A member rename answers under languageServer how many requests it made and how long they took. A comment or a line of a text file with nothing more to say is given under leftAloneInProse by file and line instead, and code that is certainly another symbol of the same name, a bare name in a file where nothing inherits the member or one the language server resolved to another declaration, under leftAloneOtherSymbols by file, why and line. Read both before calling the rename done; nothing in them was changed. Afterwards an open editor scans the changed files and reloads every changed script, which is also the compile check, and its answer comes back under editor; with no editor the class cache is rebuilt and the changed scripts are compiled in a fresh engine, under classCache and compiled. written is true once the files are written, and ok is false when what came after the write failed: the files are left changed, and note says so.",
33087
33115
  parameters: {
33088
33116
  projectPath: PROJECT_PATH,
33089
33117
  scriptPath: SCRIPT_PATH,
@@ -34954,7 +34982,7 @@ class GodotServer {
34954
34982
  return this.saying(answer, {
34955
34983
  update_available: {
34956
34984
  ...notice,
34957
- what_to_do: "Tell the user a newer gdharness is out, with what changed, and offer to take it. " + "Only run the upgrade command if they say yes: it replaces the addons in their project, " + "and afterwards the MCP server has to be reconnected and the editor restarted with " + "editor_launch restart."
34985
+ what_to_do: "Tell the user a newer gdharness is out, with what changed. Run the upgrade command " + "only with their agreement: a yes now, or a standing instruction of theirs, such as " + "their CLAUDE.md, to upgrade on every release. Without either, offer it and wait, since " + "it replaces the addons in their project. Afterwards the MCP server has to be " + "reconnected and the editor restarted with editor_launch restart."
34958
34986
  }
34959
34987
  });
34960
34988
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdharness",
3
- "version": "1.1.35",
3
+ "version": "1.1.37",
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",