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 +23 -0
- package/build/cli.js +32 -8
- package/build/index.js +32 -8
- package/package.json +1 -1
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: {
|
|
15729
|
-
|
|
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(
|
|
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
|
-
|
|
36137
|
-
|
|
36138
|
-
|
|
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(
|
|
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
|
-
|
|
27838
|
-
|
|
27839
|
-
|
|
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: {
|
|
28515
|
-
|
|
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.
|
|
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",
|