Checks your node groups — add_to_group, is_in_group, get_nodes_in_group and the Node panel's Groups tab — for the one failure mode nothing else in Godot can ever catch: a typo'd group name.
The problem
A node group is a plain string, everywhere, with no exceptions. There is no enum, no autocomplete that spans files, and critically, no warning of any kind when the two sides disagree:
# enemy.gd
add_to_group("enemy")
# spawner.gd
for e in get_tree().get_nodes_in_group("enemies"): # typo — silently empty, forever
e.queue_free()
Both lines are completely legal GDScript. Run the project and nothing prints, nothing turns red in the editor, nothing shows up in the debugger — get_nodes_in_group("enemies") just always returns an empty array, every frame, until someone notices the enemies never actually get cleared and spends an hour stepping through the wrong function before checking the group name. is_in_group() does the same silent-false thing, and so does the Node dock's own Groups tab: it will happily let you type a brand new group name that nothing else in the project has ever heard of, with zero indication you just created an orphan.
What it does
- Scans every
.gdfile foradd_to_group(...)calls and every.tscnfor thegroups=[...]property the editor's own Node > Groups panel writes — together, these are every way a node actually joins a group. - Scans every
.gdfile foris_in_group(...),get_nodes_in_group(...),get_first_node_in_group(...),get_tree().call_group(...)andremove_from_group(...)— every way a group name gets referenced. - Flags a reference to a group that nothing in the project ever joins. If an existing group name is a close text match (one added, missing or swapped character — the classic singular/plural slip or fat-fingered letter), the result names it directly: "did you mean 'enemy'?"
- Flags a group that nodes join but that nothing in the project ever queries — a heuristic "possibly unused group," always Low confidence, since a group can legitimately be meant for a tool script or a future feature.
- Double-click a result to see the exact file, line and reasoning.
- "Export Markdown" writes
group_audit_report.mdfor a PR or issue.
Every regex is anchored to the exact argument syntax Godot 4.x actually accepts (plain string, &"StringName" literal, or a bare identifier), and a commented-out line is never counted as a real join or a real reference.
A quick example
add_to_group("checkpoint")
...
get_tree().call_group("checkpiont", "activate") # flagged: did you mean "checkpoint"?
Works with
Godot 4.2 and later (tested on 4.7). Pure GDScript text scan — no project settings are changed, no files are modified except the optional Markdown export you trigger yourself.
Installing it
Drop addons/group_reference_auditor into your project's addons/ folder, then enable Group Reference Auditor under Project > Project Settings > Plugins. A new dock tab appears on the left. Click Scan Project.
License
MIT. See LICENSE.
Changelog for version v1.1.0
2026-11-03 23:39:31
No changelog provided for this version.