Srib integration
Skill sayonsom/srib-godot-skills-demo/.claude/skills/srib-integration
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".From its SKILL.md
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.
SKILL.md
6.6 KB, ~1.4k tokens by cl100k_base, 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 |
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.