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 +43 -16
- package/build/index.js +41 -13
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
47793
|
-
\`leftAloneInProse
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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",
|