Descripción
Investigar la viabilidad de crear un GDExtension que integre el Hub de CapyDeploy directamente en el editor de Godot 4.x como un dock/panel. El desarrollador podría buildear su juego en Godot y deployarlo al handheld sin salir del editor.
Contexto
CapyDeploy está orientado a handhelds. Un plugin de Godot cerraría el loop de desarrollo: build → deploy → test, todo desde el editor. Los crates de Rust del proyecto son reutilizables via godot-rust (gdext).
Preguntas a responder
Arquitectura
Frontend / UI
Integración con Godot
Telemetría
Networking
Distribución y Godot Asset Library
CI/CD
Riesgos
Alto
- Tokio runtime dentro de Godot — Levantar runtime en background y bridgear con hilo principal. Posibles deadlocks si no se maneja bien.
- Rebuild completo de UI — No se reutiliza nada del frontend Svelte. Todo desde cero con nodos Godot.
- Cross-compilation macOS — Sin runner nativo es complicado.
Medio
- Registro automático del plugin — Los plugins gdext se cargan siempre que el GDExtension esté en el proyecto. No se pueden desactivar desde Project Settings (a diferencia de plugins GDScript).
- Godot version coupling — Cada versión mayor puede romper compatibilidad del GDExtension ABI.
- Tamaño del binario — tokio + tungstenite + mdns-sd + serde compilado ≈ 5-15 MB.
Bajo
- Editor-only — Marcado como
@tool. No afecta al juego exportado.
- Hot reload limitado — gdext requiere reiniciar el editor al recompilar (aunque
reloadable = true es experimental desde Godot 4.2).
Estructura propuesta
# Nuevo crate en el workspace
crates/hub-gdext/
Cargo.toml # Depende de protocol, discovery, hub-connection, hub-deploy
src/
lib.rs # Entry point GDExtension
plugin.rs # EditorPlugin (dock, lifecycle)
ui/ # Nodos de Godot para la UI
bridge.rs # Tokio runtime <-> Godot main thread
O como repo separado si la Asset Library lo requiere.
Spike previo
Antes de la implementación completa, crear un prototipo mínimo que valide:
- Un EditorPlugin en Rust (gdext) con un dock panel
- Un
tokio::Runtime en background con WebSocket a un agent real
- Discovery mDNS funcionando dentro de Godot
- Una
Tree o RichTextLabel mostrando datos del agente en vivo
Referencias
Decisión
Pendiente de spike/prototipo.
Descripción
Investigar la viabilidad de crear un GDExtension que integre el Hub de CapyDeploy directamente en el editor de Godot 4.x como un dock/panel. El desarrollador podría buildear su juego en Godot y deployarlo al handheld sin salir del editor.
Contexto
CapyDeploy está orientado a handhelds. Un plugin de Godot cerraría el loop de desarrollo: build → deploy → test, todo desde el editor. Los crates de Rust del proyecto son reutilizables via godot-rust (gdext).
Preguntas a responder
Arquitectura
EditorPlugincon UI (dock panel) via GDExtension en Rust (gdext)?EditorPlugin.add_dock()acepta cualquier nodoControl. gdext v0.4.5 soporta#[class(tool, base=EditorPlugin)].hub-connection,discovery,hub-deploy) dependen de tokio.tokio::Runtimeen thread separado desde_enter_tree(), comunicar con hilo principal de Godot viastd::sync::mpsc. Procesar mensajes en_process().capydeploy-protocol— ✅ Puro serde, sin tokio, reutilizable directamentecapydeploy-discovery—capydeploy-hub-connection—capydeploy-hub-deploy—capydeploy-hub-telemetry—Frontend / UI
PanelContainer+VBoxContainer+LabelProgressBar(nativo)TabContainer/TabBarRichTextLabel(BBCode, colores, scroll)Tree(con columnas) oItemListButton,MenuButtonSpinBox,CheckBox,OptionButton,LineEditIntegración con Godot
EditorExportPlugintiene_export_begin(features, is_debug, path, flags)y_export_end(). Se podría auto-deployar al terminar la exportación.print(),push_error(),push_warning())?print()de scripts del usuario. La consola del agente remoto (console log del juego corriendo en el handheld) seguiría llegando por WebSocket como ahora.EditorExportPlugin.get_export_preset()durante export.ProjectSettingsaccesible como singleton._build() -> bool— ¿útil para validar conexión antes de deploy?Telemetría
Performancesingleton pero son del editor, no del dispositivo remoto.Networking
WebSocketPeernativo de Godot (hay que pollear en_process())tokio-tungstenite,mdns-sd) en thread de tokio separadoDistribución y Godot Asset Library
.gitignoreobligatorioCI/CD
cross-rso GitHub macOS runners.Riesgos
Alto
Medio
Bajo
@tool. No afecta al juego exportado.reloadable = truees experimental desde Godot 4.2).Estructura propuesta
O como repo separado si la Asset Library lo requiere.
Spike previo
Antes de la implementación completa, crear un prototipo mínimo que valide:
tokio::Runtimeen background con WebSocket a un agent realTreeoRichTextLabelmostrando datos del agente en vivoReferencias
Decisión
Pendiente de spike/prototipo.