thedivergentai/gd-agentic-skills18 files

Godot Gdscript Mastery

Expert GDScript landmine guidance: static typing opcodes, signal-up/call-down, %UniqueName/@onready lifecycle, Callable bind/unbind, await sequences, typed collections, and safe Dictionary iteration. Use for code review, refactoring hot paths, or project standards. Trigger keywords: static_typing, signal_architecture, unique_nodes, @onready, class_name, signal_up_call_down, Callable.bind, typed_collections, await_sequence.

Specification
Skill ID
thedivergentai/gd-agentic-skills/godot-gdscript-mastery
Publisher
thedivergentai
Repository
gd-agentic-skills
Installs
0
Files
18
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

thedivergentai/gd-agentic-skills/godot-gdscript-masteryInstalls these files
  • SKILL.md
  • references/gdscript-core-directives.md
  • references/migration-notes.md
  • scripts/advanced_lambdas.gd
  • scripts/array_preallocation_perf.gd
  • scripts/await_sequence_manager.gd
  • scripts/callable_binding_context.gd
  • scripts/dictionary_safe_iteration.gd
  • scripts/functional_lambda_logic.gd
  • scripts/performance_analyzer.gd
  • scripts/safe_type_casting.gd
  • scripts/signal_architecture_validator.gd
  • scripts/static_var_singleton_alt.gd
  • scripts/type_checker.gd
  • scripts/typed_collections_mastery.gd
  • scripts/typed_signal_definitions.gd
  • scripts/unbind_signal_args.gd
  • style_checklist.md

What this skill tells the agent

GDScript Mastery

Expert guidance for writing performant, maintainable GDScript — Godot-landmine decision trees, not a style-guide reprint.

Do NOT Load

  • Do not load this skill for general prose style or Godot engine version upgrades (3→4 / 4.x hops) — those live in godot-version-migration (plus official upgrading guides via that hub).
  • Do not preload every script below; open only the MANDATORY pointer for the Core Directive you are implementing.
  • Do not treat EditorScript utilities (type_checker, performance_analyzer, signal_architecture_validator) as runtime gameplay code.

NEVER Do in GDScript

  • NEVER use `@onready` and `@export` on the same variable — Initialization order will cause @onready to overwrite the Inspector value.
  • NEVER modify a Dictionary's size while iterating it — Use dict.keys().duplicate() or iterate a clone to safely erase elements.
  • NEVER use string-based `connect("signal", ...)` — Always use the Signal object syntax (button.pressed.connect(...)) for compile-time safety.
  • NEVER attempt to override non-virtual native engine methods — Overriding queue_free() or get_class() is unsupported and will be ignored by engine callbacks.
  • NEVER use dynamic `get_node()` or `$` inside `_process()` — Fetching paths every frame stalls the CPU. Cache and use @onready.
  • NEVER use `Parent.method()` calls — Violates "Signal Up, Call Down". Use signals to communicate with parents.
  • NEVER use `is` followed by a hard cast — If the type check passes but the object changes, it crashes. Use as and check for null.
  • NEVER use `print()` for production debugging — Use push_error(), push_warning(), or breakpoints.
  • NEVER pre-load huge resources in `_ready()` — Use ResourceLoader.load_threaded_request() for async loading.
  • NEVER use global variables in Autoloads when `static var` is sufficient — Static variables offer better encapsulation.

Core Directives (decision trees + MANDATORY scripts)

1. Strong Typing & Performance

LandmineDecision
Hot path still Variant?Annotate vars/returns; prefer typed collections
Generic math in _process?Use typed helpers (absf, ceili, clampf)
Green safe-lines missing?Fix inference with := or explicit types
MANDATORY: typed_collections_mastery.gd, array_preallocation_perf.gd, type_checker.gd (EditorScript audit).

2. Signal Architecture

LandmineDecision
Child needs parent reaction?Emit signal up — never call parent methods
Cross-script payload unsafe?Typed signal name(arg: Type)
Connect visibility?Prefer _ready() connects over invisible editor-only wiring
MANDATORY: typed_signal_definitions.gd, signal_architecture_validator.gd.

3. Node Access & Lifecycle Safety

LandmineDecision
Need child nodes?@onready / %UniqueName — never in _init()
Scene-instanced node with ctor args?Use @export injection — _init(args) breaks PackedScene.instantiate()
Path lookup every frame?Cache once; never $ / get_node in _process
MANDATORY: safe_type_casting.gd.

4. Callable & Signal (First-Class)

LandmineDecision
Extra context on callback?Callable.bind(...)
Discard unused signal args?Callable.unbind(n)
One-off timeout logic?Inline lambda OK; keep refs if create_callback-style longevity matters
MANDATORY: callable_binding_context.gd, unbind_signal_args.gd, advanced_lambdas.gd, functional_lambda_logic.gd.

5. Async, Statics & Safe Collections

LandmineDecision
Sequence timers without threads?await chains — see await manager
Global state without Autoload bloat?static var (+ nullify large statics when done)
Erase while iterating Dictionary?Clone keys first
MANDATORY: await_sequence_manager.gd, static_var_singleton_alt.gd, dictionary_safe_iteration.gd, performance_analyzer.gd (EditorScript).

Script Catalog (all files)

ScriptWhen to open
typed_collections_mastery.gdTyped Array/Dictionary opcodes
functional_lambda_logic.gdreduce / all / any
advanced_lambdas.gdHigher-order Callables
safe_type_casting.gdas + null checks
typed_signal_definitions.gdTyped signal boundaries
callable_binding_context.gdbind() context injection
unbind_signal_args.gdunbind() arity trim
await_sequence_manager.gdNon-blocking await flows
array_preallocation_perf.gdresize() pre-alloc
static_var_singleton_alt.gdLightweight global state
dictionary_safe_iteration.gdSafe erase-while-iterate
type_checker.gdEditorScript typing audit
performance_analyzer.gdEditorScript hot-path scan
signal_architecture_validator.gdEditorScript signal-up checks

Quick Landmines

  • Prefer dict.get("key", default) over dict["key"] when presence is uncertain.
  • Toggle Access as Scene Unique Name and read via %Name for critical UI/nodes.
  • Script layout order: extends → class_name → signals/enums/consts → exports/onready → lifecycle → public → _private.

Expert knowledge (on demand)

LLM-ignorance rule: If a general agent would not know it before reading, load the reference — never delete expert deltas.
  • gdscript-core-directives.md — restored baseline pedagogy (architecture, WHY, implementation depth)

Reference

Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain — do not preload the whole lattice.

Official Documentation

  • GDScript basics — Language core for typed vars/funcs, signal declarations, await, and first-class Callables this skill standardizes.
  • GDScript style guide — Canonical script order (extends → class_name → signals → exports → lifecycle → methods) used in reviews and refactoring.
  • Static typing in GDScript — Why typed Arrays/Dictionaries and return types unlock optimized opcodes and editor safe-lines.
  • GDScript: An introduction to dynamic languages — Lambdas, higher-order Callables, and advanced patterns behind filter/map/reduce helpers.

More from thedivergentai

Use this skill in a project

Open any RiverX project, search the Skills panel for thedivergentai/gd-agentic-skills/godot-gdscript-mastery, and install it in one click.

Use this skill