Srib integration
Skill sayonsom/srib-godot-skills-demo/.claude/skills/srib-integration
Standalone proof that six Claude Code skills develop a Godot 4.6 feature end-to-end: from an Excel backlog to a runnable SmartThings home view (shaders, animation, UI, integration). Includes one-step Linux/Windows setup.
npx -y skills add sayonsom/srib-godot-skills-demo --skill srib-integrationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Implement integration-layer features for the SRIB Godot 4.6 Android app — wiring the view (shaders/visuals from srib-view) and model (math/logic from srib-model) layers together, connecting Godot to the Android system via JNI/GDExtension/plugin bridge, routing SmartThings API data into the 3D scene, managing autoload singletons, signal plumbing between nodes, scene composition, and the Android export + build pipeline. Use after srib-view and srib-model tickets are merged, or whenever a feature is about how parts of the system connect rather than how they look or compute. Typically the final step after view and model work is done. Trigger on: "srib-integration", "wire up", "connect view and model", "Android build", "SmartThings integration", "export to Android", "signal routing", "autoload".
SKILL.md
6.6 KB, as published. Nobody here has run it
srib-integration
Project: SRIB — Godot 4.6 Android application with a 3D SmartThings home view. Role: Integration layer. Connects what
srib-viewdraws with whatsrib-modelcomputes, and bridges Godot to the Android platform.
Scope
Integration concerns in this project:
| Area | What it covers |
|---|---|
| Scene wiring | Composing view nodes + model nodes into working scenes; signal connections; @onready paths |
| Autoload singletons | Global state managers (device state, SmartThings data cache, app config) |
| SmartThings bridge | Reading SmartThings device status into Godot; mapping device state → visual/model parameters |
| Android plugin/JNI | GDExtension .gdextension + .aar plugin setup; calling Java/Kotlin from GDScript |
| Export pipeline | export_presets.cfg configuration; Gradle build; APK signing; on-device deployment |
| Scene composition | Instantiating sub-scenes, setting up cameras, viewports, and the home 3D layout |
| Signal routing | Defining and connecting signals between model (data ready) and view (update visual) |
Invocation
srib-integration SRIB-NNN
Where SRIB-NNN is a ticket from issues/SRIB-NNN.md. Read the ticket first — it defines scope, acceptance criteria, and which view/model tickets this integrates.
Workflow
Step 1 — Read the ticket
Read issues/SRIB-NNN.md. Extract:
- What view output (shader param, material, node state) needs to be driven
- What model output (computed value, animation state, data structure) is the source
- What Android/SmartThings data feeds in
If the dependent view or model tickets are not yet merged, stop and tell the user: "This integration ticket depends on SRIB-X (view) and SRIB-Y (model). Merge those first."
Step 2 — Locate the relevant files
Search the project for:
- The scene file (
.tscn) that composes the relevant nodes - The GDScript (
.gd) files for both the view node and model node - Any existing autoload in
project.godotunder[autoload] - The Android plugin directory (
android/plugins/orandroid/build/)
Use grep -r and find rather than guessing paths.
Step 3 — Wire signals and data flow
The standard SRIB data flow pattern:
SmartThings/Android data
↓
Autoload singleton (DeviceState.gd)
↓ signal: device_updated(id, state)
Model node (e.g., RoomModel.gd)
↓ signal: visual_params_ready(params: Dictionary)
View node (e.g., RoomShaderController.gd)
↓ shader_material.set_shader_parameter(...)
MeshInstance3D / shader
When wiring:
- Signals go top-down; the model never imports the view.
- View nodes receive a
Dictionaryof named params — they do not know where the data came from. - Autoloads are read-only by consumers; only one writer per data type.
- Scene tree connections use
connect()in_ready()or%NodeNameunique-name syntax.
Step 4 — Android bridge (when needed)
If the ticket touches Android:
GDExtension plugin setup:
- Check
android/plugins/for existing.gdextensionfile - Java/Kotlin plugin class must extend
GodotPlugin - Register methods with
@UsedByGodotannotation - Rebuild
.aarwith./gradlew buildbefore testing
Calling from GDScript:
var plugin = Engine.get_singleton("SmartThingsPlugin")
if plugin:
plugin.connect("device_state_changed", _on_device_state_changed)
plugin.request_device_status(device_id)
SmartThings flow:
- Android plugin fetches device state via SmartThings REST API
- Emits Godot signal with raw state dict
- DeviceState autoload normalises and caches
- Emits
device_updatedfor model nodes to consume
Step 5 — Export / build (when needed)
For APK changes:
- Verify
export_presets.cfghas the correctcustom_template/debugandcustom_template/releasepaths - Confirm
android/build/config.gradlelists all required permissions - Export from editor: Project → Export → Android → Export Project
- Install on device:
adb install -r <apk-path> - Check logcat:
adb logcat -s Godot:V
Acceptance checklist
Every integration ticket must pass before closing:
- Signals connect without errors (
_ready()runs with no "connect" errors in Output) - Data flows from source to view: change a model value, verify the shader/visual updates
- No orphaned signals (every
connecthas a matching disconnect or autofreed owner) - Tested in Godot editor (Play Scene, F5)
- Tested on Android device or emulator (APK installed, correct behavior observed)
- No regressions: other scenes still run without errors
-
project.godotautoloads section is clean (no duplicate or dead entries) - If Android plugin changed:
.aarrebuilt and committed
Common pitfalls
- Circular signal dependencies — model signals view, view signals model. Break the cycle by routing through the autoload singleton.
- Shader param name mismatch —
set_shader_parameter("param_name", v)silently does nothing if the name doesn't match the shaderuniform. Always verify the exact uniform name in the.gdshaderfile. - Plugin not found —
Engine.get_singleton("X")returnsnullon desktop builds. Always null-check before calling plugin methods. - Scene path fragility — avoid hardcoded
$Node/Child/Grandchildpaths; prefer%UniqueNodeNameor@export varreferences. - Export template mismatch — if the Godot version changes, export templates must be re-downloaded and re-set in the export preset.
File conventions
| Type | Path pattern |
|---|---|
| Autoload singletons | scripts/autoloads/<Name>.gd |
| Android plugin | android/plugins/<name>/ |
| Integration scripts | scripts/integration/<FeatureName>Integration.gd |
| Scene compositions | scenes/<room_or_feature_name>.tscn |