gdharness 0.11.0 → 0.11.1

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/README.md CHANGED
@@ -61,6 +61,29 @@ parts connect, and every tool, op and argument.
61
61
  [SECURITY.md](.github/SECURITY.md) is how to report something.
62
62
  [CONTRIBUTING.md](.github/CONTRIBUTING.md) is what a change has to clear.
63
63
 
64
+ ## Versions
65
+
66
+ 0.x, and the number is telling the truth: the tools, their arguments and the shape of their
67
+ answers are still moving, because the projects using this keep finding answers that were wrong or
68
+ missing. Pin an exact version and upgrade deliberately.
69
+
70
+ Built and measured against Godot 4.7.2 on Windows, Linux and macOS. The editor, engine, runtime
71
+ and integration suites run against a real engine on all three before anything is tagged. Older
72
+ 4.x is likely to work and is not tested.
73
+
74
+ What each kind of release means here:
75
+
76
+ - **Patch**: an answer that was wrong is now right. The output can change, because a wrong answer
77
+ corrected is a fix rather than a feature, and leaving one wrong to protect whoever parsed it is
78
+ how a tool stops being worth asking.
79
+ - **Minor**: a tool, an op, an argument or a field was added, or behaviour a caller can see
80
+ changed.
81
+ - **Major**: a tool, an op, an argument or a field was renamed or taken away. Nothing else earns
82
+ one.
83
+
84
+ 1.0 is not a date, it is a condition: the tool surface holding still for a fortnight, and the
85
+ issues arriving being things it cannot do yet rather than things it answers wrongly.
86
+
64
87
  ## Project
65
88
 
66
89
  Fork of [GoPeak](https://github.com/HaD0Yun/Doyunha-Gopeak) v2.3.9, September 2026, MIT: the
package/build/cli.js CHANGED
@@ -15725,8 +15725,14 @@ var init_tool_definitions = __esm(() => {
15725
15725
  type: "boolean",
15726
15726
  description: "Only entries printed since the previous editor_output. Default false."
15727
15727
  },
15728
- contains: { type: "string", description: "Only entries mentioning this text." },
15729
- limit: { type: "number", description: "The most entries to answer with, newest kept. Default 200." }
15728
+ contains: {
15729
+ type: "string",
15730
+ description: "Only entries mentioning this text, matched against everything the run has printed rather than against the entries this answer would otherwise carry: a line is found however much was printed after it."
15731
+ },
15732
+ limit: {
15733
+ type: "number",
15734
+ description: "The most entries to answer with, newest kept. Default 200, and omitted says how many matching entries that left out. A run long enough to pass it needs this raised, not just filtered: filtering narrows what counts as matching, and the newest of those is still all one answer carries."
15735
+ }
15730
15736
  },
15731
15737
  requires: []
15732
15738
  },
@@ -36097,6 +36103,9 @@ function runsDirectory() {
36097
36103
  function recordPath() {
36098
36104
  return join14(runsDirectory(), "run.json");
36099
36105
  }
36106
+ function recordPaths() {
36107
+ return runtimeDirectories().map((directory) => join14(directory, "runs", "run.json"));
36108
+ }
36100
36109
  function openTranscript(startedAt) {
36101
36110
  mkdirSync6(runsDirectory(), { recursive: true });
36102
36111
  const path = join14(runsDirectory(), `run-${startedAt}.log`);
@@ -36107,9 +36116,18 @@ function writeRunRecord(record) {
36107
36116
  writeFileSync8(recordPath(), JSON.stringify(record, null, 2), "utf8");
36108
36117
  }
36109
36118
  function readRunRecord() {
36119
+ for (const path of recordPaths()) {
36120
+ const record = recordAt(path);
36121
+ if (record !== null) {
36122
+ return record;
36123
+ }
36124
+ }
36125
+ return null;
36126
+ }
36127
+ function recordAt(path) {
36110
36128
  let parsed;
36111
36129
  try {
36112
- parsed = JSON.parse(readFileSync12(recordPath(), "utf8"));
36130
+ parsed = JSON.parse(readFileSync12(path, "utf8"));
36113
36131
  } catch {
36114
36132
  return null;
36115
36133
  }
@@ -36132,10 +36150,16 @@ function readRunRecord() {
36132
36150
  arguments: Array.isArray(args) ? args.filter((value) => typeof value === "string") : []
36133
36151
  };
36134
36152
  }
36135
- function clearRunRecord() {
36136
- try {
36137
- rmSync7(recordPath());
36138
- } catch {}
36153
+ function clearRunRecord(ours = () => true) {
36154
+ for (const path of recordPaths()) {
36155
+ const record = recordAt(path);
36156
+ if (record === null || !ours(record)) {
36157
+ continue;
36158
+ }
36159
+ try {
36160
+ rmSync7(path);
36161
+ } catch {}
36162
+ }
36139
36163
  }
36140
36164
  function ageMs(path, now) {
36141
36165
  try {
@@ -37764,7 +37788,7 @@ class GodotServer {
37764
37788
  async endActiveGame() {
37765
37789
  const running = this.activeProcess;
37766
37790
  this.activeProcess = null;
37767
- clearRunRecord();
37791
+ clearRunRecord((record) => this.couldBeOurs(record.projectPath));
37768
37792
  if (!running) {
37769
37793
  return;
37770
37794
  }
package/build/index.js CHANGED
@@ -27798,6 +27798,9 @@ function runsDirectory() {
27798
27798
  function recordPath() {
27799
27799
  return join8(runsDirectory(), "run.json");
27800
27800
  }
27801
+ function recordPaths() {
27802
+ return runtimeDirectories().map((directory) => join8(directory, "runs", "run.json"));
27803
+ }
27801
27804
  function openTranscript(startedAt) {
27802
27805
  mkdirSync3(runsDirectory(), { recursive: true });
27803
27806
  const path = join8(runsDirectory(), `run-${startedAt}.log`);
@@ -27808,9 +27811,18 @@ function writeRunRecord(record) {
27808
27811
  writeFileSync4(recordPath(), JSON.stringify(record, null, 2), "utf8");
27809
27812
  }
27810
27813
  function readRunRecord() {
27814
+ for (const path of recordPaths()) {
27815
+ const record = recordAt(path);
27816
+ if (record !== null) {
27817
+ return record;
27818
+ }
27819
+ }
27820
+ return null;
27821
+ }
27822
+ function recordAt(path) {
27811
27823
  let parsed;
27812
27824
  try {
27813
- parsed = JSON.parse(readFileSync8(recordPath(), "utf8"));
27825
+ parsed = JSON.parse(readFileSync8(path, "utf8"));
27814
27826
  } catch {
27815
27827
  return null;
27816
27828
  }
@@ -27833,10 +27845,16 @@ function readRunRecord() {
27833
27845
  arguments: Array.isArray(args) ? args.filter((value) => typeof value === "string") : []
27834
27846
  };
27835
27847
  }
27836
- function clearRunRecord() {
27837
- try {
27838
- rmSync3(recordPath());
27839
- } catch {}
27848
+ function clearRunRecord(ours = () => true) {
27849
+ for (const path of recordPaths()) {
27850
+ const record = recordAt(path);
27851
+ if (record === null || !ours(record)) {
27852
+ continue;
27853
+ }
27854
+ try {
27855
+ rmSync3(path);
27856
+ } catch {}
27857
+ }
27840
27858
  }
27841
27859
  function ageMs(path, now) {
27842
27860
  try {
@@ -28511,8 +28529,14 @@ var TOOL_SPECS = [
28511
28529
  type: "boolean",
28512
28530
  description: "Only entries printed since the previous editor_output. Default false."
28513
28531
  },
28514
- contains: { type: "string", description: "Only entries mentioning this text." },
28515
- limit: { type: "number", description: "The most entries to answer with, newest kept. Default 200." }
28532
+ contains: {
28533
+ type: "string",
28534
+ description: "Only entries mentioning this text, matched against everything the run has printed rather than against the entries this answer would otherwise carry: a line is found however much was printed after it."
28535
+ },
28536
+ limit: {
28537
+ type: "number",
28538
+ description: "The most entries to answer with, newest kept. Default 200, and omitted says how many matching entries that left out. A run long enough to pass it needs this raised, not just filtered: filtering narrows what counts as matching, and the newest of those is still all one answer carries."
28539
+ }
28516
28540
  },
28517
28541
  requires: []
28518
28542
  },
@@ -30546,7 +30570,7 @@ class GodotServer {
30546
30570
  async endActiveGame() {
30547
30571
  const running = this.activeProcess;
30548
30572
  this.activeProcess = null;
30549
- clearRunRecord();
30573
+ clearRunRecord((record) => this.couldBeOurs(record.projectPath));
30550
30574
  if (!running) {
30551
30575
  return;
30552
30576
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdharness",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
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",