gdharness 0.12.4 → 0.12.6
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 +34 -45
- package/build/cli.js +6 -3
- package/build/index.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,10 +15,15 @@
|
|
|
15
15
|
[](https://bun.sh/)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
**An agent cannot see a running game.** It reads your scripts and guesses at the rest: whether the
|
|
19
|
+
button is on screen, whether the panel updated, whether that error mattered.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
gdharness makes the engine answerable instead. What the screen says, where a control is, what a
|
|
22
|
+
property reads right now, what the console printed, what broke and on which line.
|
|
23
|
+
|
|
24
|
+
## Install
|
|
25
|
+
|
|
26
|
+
Hand this to your agent:
|
|
22
27
|
|
|
23
28
|
```text
|
|
24
29
|
Install gdharness into this project by following
|
|
@@ -27,31 +32,39 @@ recommend back to me.
|
|
|
27
32
|
```
|
|
28
33
|
|
|
29
34
|
Or do it yourself, and pick your harness:
|
|
30
|
-
[aureliolo.github.io/gdharness](https://aureliolo.github.io/gdharness)
|
|
35
|
+
[aureliolo.github.io/gdharness](https://aureliolo.github.io/gdharness).
|
|
31
36
|
|
|
32
|
-
##
|
|
33
|
-
|
|
34
|
-
An agent cannot see a running game. This makes one answerable: where a control is, what a property
|
|
35
|
-
reads, what the console printed, what broke and on which line.
|
|
37
|
+
## The loop it exists for
|
|
36
38
|
|
|
37
39
|
```jsonc
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{ "
|
|
41
|
-
|
|
40
|
+
editor_run { "op": "start", "projectPath": "C:/games/hall" }
|
|
41
|
+
runtime_inspect { "op": "find", "says": "Buy" } // the button, by the word on it
|
|
42
|
+
runtime_input { "op": "click", "nodePath": "/root/Hall/Ledger/BuyButton" }
|
|
43
|
+
runtime_inspect { "op": "text", "nodePath": "/root/Hall/Ledger" } // what the panel says now
|
|
44
|
+
editor_output { "projectPath": "C:/games/hall" } // errors and warnings, with backtraces
|
|
42
45
|
```
|
|
43
46
|
|
|
47
|
+
The open editor plays the game, so its debugger holds it, which is what lets you set a breakpoint
|
|
48
|
+
and read the variables in scope when it stops.
|
|
49
|
+
|
|
50
|
+
Every answer is read back out of the engine after the fact, never echoed from the request. A tool
|
|
51
|
+
that cannot answer says which state it is in and what would change it, rather than answering
|
|
52
|
+
emptily, so a call that succeeded is a call that was understood.
|
|
53
|
+
|
|
44
54
|
## At a glance
|
|
45
55
|
|
|
46
|
-
| |
|
|
47
|
-
| --------- |
|
|
48
|
-
| Needs | Godot 4.7 or newer, Node 22 or newer. Runs under Bun 1.4 too.
|
|
49
|
-
| Surface | 30 tools named `domain_verb`, and 4 `godot://` resources
|
|
50
|
-
| Reaches | The editor that is open, a game it is playing, and the project on disk
|
|
51
|
-
| Harnesses | 35, written inside the project wherever the harness has a project config
|
|
52
|
-
| Skill | Written to `.agents/skills`, which every major harness reads
|
|
53
|
-
| Install | npm, or a Sigstore-signed archive with an SBOM, SLSA Build Level 3
|
|
54
|
-
| Proven | Every tool driven against
|
|
56
|
+
| | |
|
|
57
|
+
| --------- | -------------------------------------------------------------------------------- |
|
|
58
|
+
| Needs | Godot 4.7 or newer, Node 22 or newer. Runs under Bun 1.4 too. |
|
|
59
|
+
| Surface | 30 tools named `domain_verb`, and 4 `godot://` resources |
|
|
60
|
+
| Reaches | The editor that is open, a game it is playing, and the project on disk |
|
|
61
|
+
| Harnesses | 35, written inside the project wherever the harness has a project config |
|
|
62
|
+
| Skill | Written to `.agents/skills`, which every major harness reads |
|
|
63
|
+
| Install | npm, or a Sigstore-signed archive with an SBOM, SLSA Build Level 3 |
|
|
64
|
+
| Proven | Every tool driven against Godot 4.7.2 in CI, on Windows, Linux and macOS |
|
|
65
|
+
| Status | 0.x: pin an exact version. [What a bump means](.github/CONTRIBUTING.md#versions) |
|
|
66
|
+
|
|
67
|
+
Older 4.x is likely to work and is not tested.
|
|
55
68
|
|
|
56
69
|
## Documentation
|
|
57
70
|
|
|
@@ -61,30 +74,6 @@ parts connect, and every tool, op and argument.
|
|
|
61
74
|
[SECURITY.md](.github/SECURITY.md) is how to report something.
|
|
62
75
|
[CONTRIBUTING.md](.github/CONTRIBUTING.md) is what a change has to clear.
|
|
63
76
|
|
|
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**: nearly everything. An answer that was wrong is now right, and the output may change
|
|
77
|
-
shape for it, because a wrong answer corrected is a fix rather than a feature and leaving one
|
|
78
|
-
wrong to protect whoever parsed it is how a tool stops being worth asking. An addition nothing
|
|
79
|
-
has to adapt to is a patch too: a new argument, a new field, an argument reaching further than it
|
|
80
|
-
did. Ignore all of it and your calls still work.
|
|
81
|
-
- **Minor**: a new tool or a new op, meaning this does something it could not do before.
|
|
82
|
-
- **Major**: a tool, an op, an argument or a field was renamed or taken away. Nothing else earns
|
|
83
|
-
one.
|
|
84
|
-
|
|
85
|
-
1.0 is not a date, it is a condition: the tool surface holding still for a fortnight, and the
|
|
86
|
-
issues arriving being things it cannot do yet rather than things it answers wrongly.
|
|
87
|
-
|
|
88
77
|
## Project
|
|
89
78
|
|
|
90
79
|
Fork of [GoPeak](https://github.com/HaD0Yun/Doyunha-Gopeak) v2.3.9, September 2026, MIT: the
|
package/build/cli.js
CHANGED
|
@@ -15729,7 +15729,7 @@ var init_tool_definitions = __esm(() => {
|
|
|
15729
15729
|
},
|
|
15730
15730
|
{
|
|
15731
15731
|
name: "editor_output",
|
|
15732
|
-
description: "What the project started by editor_run has printed, as entries with a severity: the errors and warnings the engine reported, each with where it happened, and everything else as info. Answers with the counts and the verdict as well as the entries. A run that has quit still answers here, with running false and its exit code, until the next one starts. A run this server started also answers with transcript, the file both its streams are written to: uncapped, written while the run is going, and the thing to read or tail for a long run rather than the engine's own log, which every engine start rotates away.",
|
|
15732
|
+
description: "What the project started by editor_run has printed, as entries with a severity: the errors and warnings the engine reported, each with where it happened, and everything else as info. Answers with the counts and the verdict as well as the entries. A run that has quit still answers here, with running false and its exit code, until the next one starts. A run this server started also answers with transcript, the file both its streams are written to: uncapped, written while the run is going, and the thing to read or tail for a long run rather than the engine's own log, which every engine start rotates away. Read the file for output and this answer for state: running is asked of the operating system, endedBy says whether gdharness ended the run, and a transcript that has stopped growing is a run between prints rather than a run that is over.",
|
|
15733
15733
|
parameters: {
|
|
15734
15734
|
severity: {
|
|
15735
15735
|
type: "string",
|
|
@@ -38152,7 +38152,7 @@ class GodotServer {
|
|
|
38152
38152
|
notes.push("Nothing here ended this run: it stopped on its own or something outside this server stopped it.");
|
|
38153
38153
|
}
|
|
38154
38154
|
if (run.transcript !== null && selected.omitted > 0) {
|
|
38155
|
-
notes.push(`Everything this run has printed is in ${run.transcript}, uncapped and still being written.`);
|
|
38155
|
+
notes.push(`Everything this run has printed is in ${run.transcript}, uncapped and still being written. Read it for output, not for whether the run is alive: running above is asked of the operating system, and a transcript that stops growing is a run between prints.`);
|
|
38156
38156
|
}
|
|
38157
38157
|
return this.jsonTextResponse({
|
|
38158
38158
|
running: stillRunning(run),
|
|
@@ -39829,7 +39829,10 @@ that is running, and the project on disk. ${TOOL_SPECS.length} tools, named \`do
|
|
|
39829
39829
|
false is a runtime that is not coming and true is a game still on its way up.
|
|
39830
39830
|
- Read \`editor_output\` after every run. It returns the engine's errors and warnings as entries
|
|
39831
39831
|
with their backtraces, and a \`clean\` verdict, so a run that printed an error is one call away
|
|
39832
|
-
from being known.
|
|
39832
|
+
from being known. For a long run it also names a transcript file: read that for output and this
|
|
39833
|
+
answer for state. Never decide a run has ended by watching the file stop growing, or a process
|
|
39834
|
+
list, or a timeout. \`running\` is asked of the operating system and \`endedBy\` says whether
|
|
39835
|
+
gdharness ended it; a bench between prints looks exactly like a bench that died to everything else.
|
|
39833
39836
|
- One server, one editor. A second project is a second harness session with its own server, and
|
|
39834
39837
|
that works: each editor is opened on its own language server and debug adapter ports, and says
|
|
39835
39838
|
where it serves. Two editors on one project is the thing to refuse.
|
package/build/index.js
CHANGED
|
@@ -28600,7 +28600,7 @@ var TOOL_SPECS = [
|
|
|
28600
28600
|
},
|
|
28601
28601
|
{
|
|
28602
28602
|
name: "editor_output",
|
|
28603
|
-
description: "What the project started by editor_run has printed, as entries with a severity: the errors and warnings the engine reported, each with where it happened, and everything else as info. Answers with the counts and the verdict as well as the entries. A run that has quit still answers here, with running false and its exit code, until the next one starts. A run this server started also answers with transcript, the file both its streams are written to: uncapped, written while the run is going, and the thing to read or tail for a long run rather than the engine's own log, which every engine start rotates away.",
|
|
28603
|
+
description: "What the project started by editor_run has printed, as entries with a severity: the errors and warnings the engine reported, each with where it happened, and everything else as info. Answers with the counts and the verdict as well as the entries. A run that has quit still answers here, with running false and its exit code, until the next one starts. A run this server started also answers with transcript, the file both its streams are written to: uncapped, written while the run is going, and the thing to read or tail for a long run rather than the engine's own log, which every engine start rotates away. Read the file for output and this answer for state: running is asked of the operating system, endedBy says whether gdharness ended the run, and a transcript that has stopped growing is a run between prints rather than a run that is over.",
|
|
28604
28604
|
parameters: {
|
|
28605
28605
|
severity: {
|
|
28606
28606
|
type: "string",
|
|
@@ -30934,7 +30934,7 @@ class GodotServer {
|
|
|
30934
30934
|
notes.push("Nothing here ended this run: it stopped on its own or something outside this server stopped it.");
|
|
30935
30935
|
}
|
|
30936
30936
|
if (run.transcript !== null && selected.omitted > 0) {
|
|
30937
|
-
notes.push(`Everything this run has printed is in ${run.transcript}, uncapped and still being written.`);
|
|
30937
|
+
notes.push(`Everything this run has printed is in ${run.transcript}, uncapped and still being written. Read it for output, not for whether the run is alive: running above is asked of the operating system, and a transcript that stops growing is a run between prints.`);
|
|
30938
30938
|
}
|
|
30939
30939
|
return this.jsonTextResponse({
|
|
30940
30940
|
running: stillRunning(run),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gdharness",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.6",
|
|
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",
|