Release 1.1.2 — the default path works end to end

Fix release for 1.1.1: the minimal path end to end, engine commands that
run on Godot, Unity and Unreal, hook warnings you can see, and verdicts
that say when they could not check. Details in CHANGELOG.md; upgrade
steps in UPGRADING.md (v1.1.1 → v1.1.2).

Fixes #67
Fixes #131

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
This commit is contained in:
Donchitos
2026-09-29 21:32:19 +10:00
co-authored by Claude Opus 5.5
parent 7ed2c3e9c4
commit b21fa0f7f2
383 changed files with 22888 additions and 10618 deletions
@@ -53,7 +53,7 @@ Changes between Godot versions, focused on post-LLM-cutoff changes (4.4+).
| Core | `OS.execute_with_pipe` | Added optional `blocking` parameter |
| Core | `RegEx.compile/create_from_string` | Added optional `show_error` parameter |
| Rendering | `RenderingDevice.draw_list_begin` | Many parameters removed; `breadcrumb` parameter added |
| Rendering | Shader texture types | Parameter/return types changed from `Texture2D` to `Texture` |
| Rendering | `Shader.set_default_texture_parameter()` / `get_default_texture_parameter()` | Parameter/return type changed from `Texture2D` to `Texture`; the shading language did not change |
| Particles | `.restart()` method | Added optional `keep_seed` parameter (CPU/GPU 2D/3D) |
| GUI | `RichTextLabel.push_meta` | Added optional `tooltip` parameter |
| GUI | `GraphEdit.connect_node` | Added optional `keep_alive` parameter |
@@ -7,21 +7,36 @@ This supplements (not replaces) the agent's built-in knowledge.
## GDScript (4.5+)
- **Variadic arguments**: Functions can accept arbitrary parameter counts
- **Variadic arguments**: Functions can accept arbitrary parameter counts. The
rest parameter is written `...name`, comes last, and is typed `Array` or left
untyped — `values: Variant...` and `...values: Array[int]` do not parse
```gdscript
func log_values(prefix: String, values: Variant...) -> void:
func log_values(prefix: String, ...values: Array) -> void:
for v in values:
print(prefix, ": ", v)
```
- **Lambdas capture local variables by value** (every Godot 4 version): a local
is captured once, when the lambda is created, and a lambda cannot reassign an
outer local — `var hit := false` / `func(): hit = true` leaves the caller's
`hit` false. Share state through a reference type (a Dictionary, an Array or
an object) and mutate its contents. A rest parameter works in a lambda too, so
`func(...args)` connects to a signal with any number of arguments (observed on
4.6.1; a one-argument lambda on a zero-argument signal errors "Method expected
1 argument(s), but called with 0")
```gdscript
var state := {"emitted": false}
some_signal.connect(func(...args): state.emitted = true)
```
- **Abstract classes and methods**: Use `@abstract` to enforce inheritance
```gdscript
@abstract
class_name BaseEnemy extends CharacterBody3D
@abstract
func get_attack_pattern() -> Array[Attack]:
pass # Subclasses MUST override
# No body: "a newline or a semicolon is expected after the function header".
# Subclasses MUST override it.
@abstract func get_attack_pattern() -> Array[Attack]
```
- **Script backtracing**: Detailed call stacks available even in Release builds
@@ -99,6 +114,49 @@ This supplements (not replaces) the agent's built-in knowledge.
`rg --type gdscript` is a hard error — the search never executes.
Always use `rg --glob "*.gd"` (shell) or `glob: "*.gd"` (Grep tool) to filter GDScript files.
## Command Line — Tests and Parse Check
Flags, from Godot's command-line tutorial: `--headless` (headless display and a
dummy audio driver, "useful for servers and with `--script`"), `--path <dir>`
(a directory holding `project.godot`), `-s`/`--script <script>`, `-d`/`--debug`
(the local stdout debugger), `--remote-debug <protocol>://<host>[:<port>]`,
`--import` (starts the editor, waits for the import, and quits),
`--quit-after <n>` (iterations), `--export-debug <preset>` (implies `--import`)
and `--check-only` (parse for errors and quit, with `--script`). The editor is
not on `PATH` by default: on Windows and Linux run the binary by its relative or
absolute path; on macOS run `Godot.app/Contents/MacOS/Godot` inside the bundle.
gdUnit4's runner is `res://addons/gdUnit4/bin/GdUnitCmdTool.gd`; `-a <dir|suite>`
adds suites, reports go to `res://reports/` by default (`-rd` changes it), and
the documented exit codes are 0 (all passed), 100 (failures) and 101 (warnings).
The command the framework uses:
`godot --headless -s -d --remote-debug tcp://127.0.0.1:0 res://addons/gdUnit4/bin/GdUnitCmdTool.gd -a res://tests --ignoreHeadlessMode`.
Observed on Godot 4.6.1 with gdUnit4 6.1.3 — not in the docs:
- 101 is also the exit when every test passed but a test leaked orphan nodes;
105 means a test script does not parse; 103 means gdUnit4 refused to run
headless (`--ignoreHeadlessMode` missing). 104 is gdUnit4 refusing a Godot
older than 4.3 — not reproducible on the pin.
- Over zero tests the runner prints `No test cases found` and exits 0.
- Without `--remote-debug tcp://127.0.0.1:0`, a script error opens the `-d`
debugger and the run waits at a `debug>` prompt; with it, every run prints two
`ERROR:` lines about the remote port, which are expected.
- A fresh clone has no `.godot/` class cache: run
`godot --headless --path . --import` first, or `GdUnitCmdTool.gd` does not
load and the run exits 1 having run nothing.
- `--check-only` with `-s <file>` exits 1 on valid code that names an autoload
(`Identifier not found`), and `--import` / `--quit-after` exit 0 on a parse
error — neither is a parse check. The framework's parse check is
`godot --headless --path . -s res://.claude/scripts/godot-parse-check.gd -- res://<file>.gd …`
(exit 1 when a script does not load).
- On Windows, a quoted full path to the editor (`"C:/Program Files/Godot/…exe"`)
runs from Git Bash with its stdout and exit code intact.
Sources:
- Command line tutorial: https://docs.godotengine.org/en/stable/tutorials/editor/command_line_tutorial.html
- gdUnit4 command line tool: https://godot-gdunit-labs.github.io/gdUnit4/latest/advanced_testing/cmd/
- GDScript reference, lambda functions and rest parameters: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html
## Platform (4.5+)
- **visionOS export**: First new platform since open-sourcing (windowed app mode)
@@ -38,6 +38,6 @@ with the "Use Instead" column.
| String-based `connect()` | Typed signal connections | Type-safe, refactor-friendly |
| `$NodePath` in `_process()` | `@onready var` cached reference | Performance: path lookup every frame |
| Untyped `Array` / `Dictionary` | `Array[Type]`, typed variables | GDScript compiler optimizations |
| `Texture2D` in shader parameters | `Texture` base type | Changed in 4.4 |
| `Texture2D` in `Shader.set_default_texture_parameter()` / `get_default_texture_parameter()` | `Texture` base type | Changed in 4.4; the shading language's `sampler2D` / `texture()` did not change |
| Manual post-process viewport chains | `Compositor` + `CompositorEffect` | Structured post-processing (4.3+) |
| GodotPhysics3D for new projects | Jolt Physics 3D | Default since 4.6; better stability |
@@ -19,7 +19,9 @@ Last verified: 2026-02-12 | Engine: Godot 4.6
### 4.4 Changes
- **`RenderingDevice.draw_list_begin`**: Many parameters removed; optional `breadcrumb` added
- **Shader texture types**: Changed from `Texture2D` to `Texture` base type
- **`Shader` default-texture methods**: `set_default_texture_parameter()` takes and
`get_default_texture_parameter()` returns `Texture`, not `Texture2D` (the shading
language's `sampler2D` / `texture()` did not change)
- **Particles `.restart()`**: Added optional `keep_seed` parameter
### 4.3 Changes (in training data)
@@ -55,5 +57,7 @@ Windows default backend: D3D12 (was Vulkan pre-4.6)
## Common Mistakes
- Assuming Vulkan is the default backend on Windows (D3D12 since 4.6)
- Using manual viewport chains instead of Compositor for post-processing
- Using `Texture2D` in shader uniform types (use `Texture` since 4.4)
- Passing or expecting `Texture2D` in `Shader.set_default_texture_parameter()` /
`get_default_texture_parameter()` (the type is `Texture` since 4.4 — the shading
language's `sampler2D` / `texture()` did not change)
- Not using Shader Baker for projects with many shader variants