xonecode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
@@ -0,0 +1,412 @@
1
+ # XOne XML — Props por tipo: mapas, listas y vistas de colección
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/02b-xml-prop-tipos.md` §5.9.11–§5.9.12d. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §5.9.11 mapa type=Z viewmode=mapview · §5.9.12 grid/lista Z · §5.9.12e chips · §5.9.12c tablero kanban · §5.9.12d carrusel coverflow
6
+
7
+ ---
8
+
9
+ #### 5.9.11 Mapa (`type="Z" viewmode="mapview"`)
10
+
11
+ Los mapas en XOne son **contenedores** (`type="Z"`) con `viewmode="mapview"` (Google Maps), `maplibre` (MapLibre) u `openstreetmap`. **No existe un `type="M"` propio para mapas.**
12
+
13
+ ```xml
14
+ <!-- Mapa básico (Google Maps) -->
15
+ <prop name="MAP_MAPA" type="Z" viewmode="mapview" visible="7"
16
+ width="100%" height="100%"
17
+ show-user-location="true"
18
+ zoom="15" />
19
+
20
+ <!-- Mapa con eventos -->
21
+ <prop name="MAP_MAPA" type="Z" viewmode="mapview" visible="7"
22
+ width="100%" height="70%"
23
+ show-user-location="true"
24
+ onmapclicked="onMapClick(e);"
25
+ onmapready="onMapReady(e);" />
26
+
27
+ <!-- Alternativas open source -->
28
+ <prop name="MAP_MAPA" type="Z" viewmode="maplibre" visible="7" width="100%" height="100%" />
29
+ <prop name="MAP_MAPA" type="Z" viewmode="openstreetmap" visible="7" width="100%" height="100%" />
30
+ ```
31
+
32
+ **Atributos:**
33
+
34
+ | Atributo | Descripción |
35
+ |----------|-------------|
36
+ | `show-user-location` | Muestra la posición del usuario |
37
+ | `zoom` | Nivel de zoom inicial |
38
+ | `max-zoom` | Zoom máximo permitido |
39
+
40
+ **Eventos** (atributos XML inline en el prop):
41
+
42
+ | Atributo | Cuándo se dispara | Parámetros del evento |
43
+ |----------|-------------------|----------------------|
44
+ | `onmapready` | Mapa inicializado y listo | `e.target` |
45
+ | `onmapclicked` | Click en el mapa (no sobre un marcador) | `e.latitude`, `e.longitude`, `e.target` |
46
+ | `onmaplongclicked` | Click largo en el mapa | `e.latitude`, `e.longitude`, `e.target` |
47
+ | `onmapzoomchanged` | Cambio de nivel de zoom | `e.zoom` (nuevo nivel); `e.bounds` = `Object[]` de 2 elementos `[noreste, suroeste]`, cada uno objeto location con `latitude`, `longitude`, `altitude`, `accuracy`, `bearing`, `speed`, `time` (los 5 últimos siempre a 0) |
48
+ | `onmarkerdragend` | Fin de arrastre de un marcador | `e.latitude`, `e.longitude`, `e.tag`, `e.marker` |
49
+ | `ondrop` | Objeto soltado sobre el mapa (drag & drop) | `e.latitude`, `e.longitude`, `e.target` |
50
+ | `onlocationready` | Primera localización GPS obtenida | `e.latitude`, `e.longitude` |
51
+ | `onlocationchanged` | Cambio de posición GPS | `e.latitude`, `e.longitude` |
52
+ | `onstreetviewenabled` | StreetView activado | `e.latitude`, `e.longitude`, `e.target` (coordenadas del punto donde se activó) |
53
+ | `onstreetviewunavailable` | StreetView no disponible en la zona | `e.latitude`, `e.longitude`, `e.target` (coordenadas del punto consultado) |
54
+ | `ondistancemeter` | Resultado del medidor de distancia | `e.distance` (metros), `e.location1`, `e.location2` — ver sección siguiente |
55
+
56
+ ##### Medidor de distancia interactivo
57
+
58
+ Sólo está implementado en **Google Maps** (`viewmode="mapview"`). En `openstreetmap`, `maplibre` y `picturemap` las llamadas a `startDistanceMeter` / `stopDistanceMeter` lanzan `UnsupportedOperationException("Not implemented yet")`.
59
+
60
+ ```javascript
61
+ let mapControl = getControl("MAP_MAPA");
62
+
63
+ // Forma 1: objeto JS (recomendada). Crea dos marcadores arrastrables
64
+ mapControl.startDistanceMeter({
65
+ latitude : 38.886546,
66
+ longitude : -7.0043193,
67
+ startMarkerIcon: "ic_start.png", // opcional, ruta relativa a la carpeta de recursos de la app
68
+ endMarkerIcon : "ic_end.png" // opcional
69
+ });
70
+
71
+ // Forma 2: parámetros posicionales — location + iconos (máx. 2 iconos)
72
+ mapControl.startDistanceMeter("38.886546,-7.0043193", "ic_start.png", "ic_end.png");
73
+
74
+ // Forma 3: sin parámetros → usa el centro actual de la cámara como punto de partida
75
+ mapControl.startDistanceMeter();
76
+
77
+ // Detener: elimina marcadores y línea
78
+ mapControl.stopDistanceMeter();
79
+ ```
80
+
81
+ El evento `ondistancemeter` declarado en el prop se dispara **al terminar de arrastrar cualquiera de los dos marcadores** (no solo el final). Parámetros del evento:
82
+
83
+ | Campo | Tipo | Descripción |
84
+ |-------|------|-------------|
85
+ | `e.distance` | `double` | Distancia en **metros** entre los dos marcadores (geodésica, vía `SphericalUtil.computeDistanceBetween`) |
86
+ | `e.location1` | objeto | Posición del marcador de inicio. Campos: `latitude`, `longitude`, `altitude` (0), `accuracy` (0), `bearing` (0), `speed` (0), `time` (0) |
87
+ | `e.location2` | objeto | Posición del marcador final, con los mismos campos |
88
+
89
+ ```javascript
90
+ function onDistanceMeter(e) {
91
+ self.MAP_DISTANCIA = e.distance.toFixed(1) + " m";
92
+ self.MAP_LAT_FIN = e.location2.latitude;
93
+ self.MAP_LON_FIN = e.location2.longitude;
94
+ ui.refreshValue("MAP_DISTANCIA", "MAP_LAT_FIN", "MAP_LON_FIN");
95
+ }
96
+ ```
97
+
98
+ ##### Operaciones sobre marcadores (MarkerScriptWrapper)
99
+
100
+ Cada llamada a `mapControl.addMarker(...)` devuelve un wrapper del marcador con métodos para modificarlo en runtime. Cuidado: algunos métodos están **implementados solo en Google Maps**; en MapLibre devuelven el wrapper sin hacer nada (no-op silencioso, sin excepción).
101
+
102
+ ```javascript
103
+ marker.setVisible(true);
104
+ marker.setDraggable(true); // MapLibre: no-op
105
+ marker.setRotation(180); // Rotación en grados; animado por defecto
106
+ marker.setRotation(180, false); // Rotación instantánea (sin animación). MapLibre: no-op
107
+ marker.setAlpha(0.5); // MapLibre: no-op
108
+ marker.setAnchor("top"); // top / bottom / center. MapLibre: no-op
109
+ marker.setIcon("ic_nuevo.png");
110
+ marker.setPosition({
111
+ latitude : 38.8685452,
112
+ longitude: -6.8170906,
113
+ animate : true,
114
+ duration : 500 // ms de animación
115
+ });
116
+ let pos = marker.getPosition(); // [latitude, longitude]
117
+ marker.showInfo();
118
+ marker.hideInfo();
119
+ marker.remove();
120
+ ```
121
+
122
+ Resumen de soporte por backend:
123
+
124
+ | Método | Google Maps (`mapview`) | MapLibre (`maplibre`) |
125
+ |--------|-------------------------|------------------------|
126
+ | `setVisible` / `setIcon` / `setPosition` / `remove` / `showInfo` / `hideInfo` | OK | OK |
127
+ | `setDraggable` / `setRotation` / `setAlpha` / `setAnchor` | OK | No-op silencioso |
128
+
129
+ > **Nota**: Los mapas también pueden mostrarse mediante `type="Z"` con `viewmode="mapview"` para mostrar multiples marcadores. Ver sección 5.9.12.
130
+
131
+ #### 5.9.12 Grid/Lista (Z)
132
+
133
+ El tipo `Z` es el más potente para mostrar listas de datos. Se vincula a un nodo `<contents>` que define la fuente de datos.
134
+
135
+ ```xml
136
+ <!-- Lista con RecyclerView -->
137
+ <prop name="MAP_LISTA" type="Z" visible="1"
138
+ contents="@MiContenido"
139
+ viewmode="recyclerview"
140
+ width="100%" height="80%"
141
+ edit-inrow="true"
142
+ show-no-data="true"
143
+ show-loading="true" />
144
+ <contents name="@MiContenido" src="ColeccionDatos" />
145
+
146
+ <!-- Mapa con marcadores -->
147
+ <prop name="MAP_MAPA" type="Z" visible="1"
148
+ viewmode="mapview"
149
+ mapview-embedded="true"
150
+ contents="mapaDatos"
151
+ width="100%" height="80%"
152
+ show-user-location="true"
153
+ zoom-to-pois="true" />
154
+ <contents name="mapaDatos" src="ContentMapa" />
155
+
156
+ <!-- Gráfico de barras -->
157
+ <prop name="@ChartBarras" type="Z" visible="1"
158
+ classid="XOneCharts"
159
+ viewmode="barchart"
160
+ contents="GraficosBarrasDatos"
161
+ width="100%" height="300p" />
162
+ <contents name="GraficosBarrasDatos" src="ContentGraficosBarras" />
163
+
164
+ <!-- Calendario -->
165
+ <prop name="Calendario" type="Z" visible="1"
166
+ calendar-viewmode="week"
167
+ contents="calendario"
168
+ viewmode="calendarview"
169
+ width="100%" height="100%" />
170
+ <contents name="calendario" src="ContentCalendario" />
171
+ ```
172
+
173
+ **ViewModes disponibles para type="Z"**:
174
+
175
+ **Listas y Grids:**
176
+
177
+ | ViewMode | Descripción |
178
+ |----------|-------------|
179
+ | `recyclerview` | Lista con reciclaje de vistas (**recomendado** para listas largas) |
180
+ | `gridview` | Vista de cuadricula |
181
+ | `slideview` | Vista deslizable tipo carrusel (swipe tabs) |
182
+ | `coverflow` | Variante de `slideview` con efecto Cover Flow estilo iTunes (cards laterales escaladas/atenuadas/rotadas en 3D). Ver sección 5.9.12d |
183
+ | `kanban` | Tablero estilo Trello/Jira: items agrupados en columnas verticales con drag&drop entre columnas. Ver sección 5.9.12c |
184
+ | `chipsview` | Conjunto de **chips Material** (pastillas redondeadas) con *wrap* automático a varias filas. Cada fila de un `<contents>` es un chip. Ver sección 5.9.12e |
185
+ | `expanview` | Vista expandible / colapsable (acordeón) |
186
+
187
+ **Mapas:**
188
+
189
+ | ViewMode | Descripción |
190
+ |----------|-------------|
191
+ | `mapview` | Mapa con marcadores (Google Maps) |
192
+ | `openstreetmap` | Mapa OpenStreetMap |
193
+ | `picturemap` | Mapa con imágenes / catálogo visual de marcadores |
194
+
195
+ **Gráficos:**
196
+
197
+ | ViewMode | Descripción |
198
+ |----------|-------------|
199
+ | `barchart` | Gráfico de barras |
200
+ | `3dbarchart` | Gráfico de barras 3D |
201
+ | `linechart` | Gráfico de lineas |
202
+ | `xylinechart` | Gráfico de lineas XY |
203
+ | `areachart` | Gráfico de áreas |
204
+ | `timeserieschart` | Gráfico de series temporales |
205
+ | `slidingbarchart` | Gráfico de barras con navegación horizontal |
206
+ | `piechart` | Gráfico circular |
207
+ | `piechart2` | Gráfico circular (variante alternativa) |
208
+
209
+ **Otros:**
210
+
211
+ | ViewMode | Descripción |
212
+ |----------|-------------|
213
+ | `calendarview` | Vista de calendario |
214
+
215
+ **Atributos especificos de Z**:
216
+
217
+ | Atributo | Descripción |
218
+ |----------|-------------|
219
+ | `contents` | Nombre del content vinculado (con prefijo `@`) |
220
+ | `viewmode` | Modo de visualizacion (ver tabla) |
221
+ | `versión` | Versión del grid (`"v2"` para versión mejorada) |
222
+ | `edit-inrow` | Editar directamente en la fila |
223
+ | `show-no-data` | Mostrar mensaje cuando no hay datos |
224
+ | `show-loading` | Mostrar indicador de carga |
225
+ | `classid` | Para gráficos: `"XOneCharts"` |
226
+ | `mask` | Mascara de opciones |
227
+ | `calendar-viewmode` | Para calendarios: `week`, `month` |
228
+
229
+ #### 5.9.12e Chips (viewmode="chipsview")
230
+
231
+ Muestra una colección de etiquetas como **chips Material** (pastillas redondeadas) con *wrap* automático a varias filas — el equivalente a un `Wrap(children: [Chip(...)])`. Es un `<prop type="Z" viewmode="chipsview">` alimentado por un `<contents>`: **cada fila del contents es un chip**.
232
+
233
+ La colección del `<contents>` debe declarar:
234
+ - una prop con **`chip-value="true"`** → su valor es el texto que se pinta en el chip (obligatoria).
235
+ - opcionalmente una prop con **`chip-close-enabled="true"`** → si su valor es verdadero, el chip muestra una "x" para cerrarse.
236
+
237
+ ```xml
238
+ <!-- En la pantalla -->
239
+ <prop name="MAP_TAGS" type="Z" viewmode="chipsview" contents="@tagsContent"
240
+ width="100%" height="-2" />
241
+ <contents name="@tagsContent" src="Etiqueta" />
242
+
243
+ <!-- Colección de las etiquetas. Puede vivir en memoria (volatile) si los chips
244
+ se generan al vuelo (p. ej. partiendo un campo de texto): -->
245
+ <coll name="Etiqueta" volatile="true" loadall="true" manual-load="true" progid="ASData.CASBasicDataObj">
246
+ <prop name="VALUE" type="T" chip-value="true" size="120" />
247
+ </coll>
248
+ ```
249
+
250
+ **Rellenar los chips desde JS** (típico: trocear un campo CSV en el `before-edit` del detalle). Hay que **añadir** cada objeto al contents y refrescar el control:
251
+
252
+ ```javascript
253
+ var c = self.getContents("@tagsContent");
254
+ c.unlock();
255
+ c.clear();
256
+ var tags = String(self.TAGS || "").split(",");
257
+ for (var i = 0; i < tags.length; i++) {
258
+ var t = tags[i].replace(/^\s+|\s+$/g, "");
259
+ if (t.length === 0) continue;
260
+ var o = c.createObject();
261
+ o.VALUE = t;
262
+ c.addItem(o); // addItem, NO save
263
+ }
264
+ c.lock();
265
+ var v = ui.getView(self);
266
+ if (v !== null) v.refresh("MAP_TAGS"); // refrescar el control type=Z
267
+ ```
268
+
269
+ > **Importante (colección en memoria):** con `volatile="true"` añade también **`manual-load="true"`** y **`loadall="true"`** en la `<coll>`. Si no, el control intenta recargar la colección desde la base de datos al pintarse y la deja vacía. Para llenarla usa `createObject()` + **`addItem()`** (NO `save()`, que fallaría al no existir tabla), luego `lock()` y refresca el control con `ui.refresh("NOMBRE_DEL_Z")`.
270
+
271
+ **Selección / cierre (todos los chips son *checkable* / toggle):** cada chip se puede marcar y desmarcar; no existe un modo "solo lectura" — un chip sin handler simplemente no hace nada al marcarse. Esto los hace ideales como *filter chips* (seleccionar para filtrar).
272
+
273
+ - **`onitemschanged="onTags(e);"`** — se dispara en cada marca/desmarca y `e` trae **todos** los chips marcados en ese momento: **`e.values`** (array con los textos) y **`e.ids`** (array con sus ids). Es el camino recomendado para reaccionar a la selección.
274
+ - **`onitemremoved="onQuita(e);"`** — se dispara al pulsar la "x" de un chip (requiere que esa fila tenga `chip-close-enabled` con valor verdadero); `e.value` / `e.id` identifican el chip cerrado.
275
+ - Alternativa imperativa: `ui.getView(self).getControl("MAP_TAGS").getCheckedValues()` devuelve los marcados como `[{id, value}]`.
276
+
277
+ ```javascript
278
+ // filter chips: al cambiar la selección, relanzar una búsqueda con los tags activos
279
+ function onTags(e) {
280
+ var tags = [];
281
+ if (e && e.values) {
282
+ for (var i = 0; i < e.values.length; i++) tags.push(String(e.values[i]));
283
+ }
284
+ buscarConTags(tags); // tu lógica de filtrado
285
+ }
286
+ ```
287
+
288
+ #### 5.9.12c Tablero Kanban (viewmode="kanban")
289
+
290
+ Tablero estilo Trello / Jira para `<prop type="Z">`: los items de un `<contents>` se agrupan en columnas verticales según el valor de un campo, con **drag&drop entre columnas**. Al soltar una card en otra columna, el framework asigna al campo declarado en `kanban-column-field` el valor de la columna destino y persiste el cambio automáticamente (sin código JS adicional).
291
+
292
+ **Modo simple — card con título + subtítulo (sin frame propio):**
293
+
294
+ ```xml
295
+ <prop name="MAP_TABLERO" type="Z" visible="1"
296
+ viewmode="kanban"
297
+ contents="@tareasContent"
298
+ kanban-column-field="ESTADO"
299
+ kanban-columns="TODO|DOING|DONE"
300
+ kanban-column-titles="Pendiente|En curso|Hecho"
301
+ kanban-column-colors="#FFE0E0|#FFF4D0|#D0F0D0"
302
+ kanban-column-width="280p"
303
+ kanban-card-title-field="TITULO"
304
+ kanban-card-subtitle-field="DESCRIPCION"
305
+ kanban-card-bgcolor="#FFFFFF"
306
+ draggable="true"
307
+ width="100%" height="100%" />
308
+ <contents name="@tareasContent" src="Tareas" />
309
+ ```
310
+
311
+ **Modo objeto XOne completo — la card usa el `<frame>` declarado en la coll del contents:**
312
+
313
+ ```xml
314
+ <prop name="MAP_TABLERO" type="Z" visible="1"
315
+ viewmode="kanban"
316
+ contents="@tareasContent"
317
+ kanban-column-field="ESTADO"
318
+ kanban-columns="TODO|DOING|DONE"
319
+ width="100%" height="100%" />
320
+ ```
321
+
322
+ **Atributos obligatorios:**
323
+
324
+ | Atributo | Descripción |
325
+ |----------|-------------|
326
+ | `contents` | Nombre del `<contents>` vinculado |
327
+ | `kanban-column-field` | Nombre del campo del item cuyo valor determina la columna |
328
+ | `kanban-columns` | Valores posibles del campo separados por `\|` (ej. `TODO\|DOING\|DONE`). Define orden y número de columnas |
329
+
330
+ **Atributos opcionales:**
331
+
332
+ | Atributo | Default | Descripción |
333
+ |----------|---------|-------------|
334
+ | `kanban-column-titles` | usa los valores | Títulos visibles de las columnas separados por `\|`. Si no se da, se muestra el valor crudo |
335
+ | `kanban-column-colors` | gris claro | Colores de fondo de la cabecera de cada columna separados por `\|`. Acepta `#RRGGBB` y `#AARRGGBB` |
336
+ | `kanban-column-width` | `280p` | Ancho de cada columna. Acepta `p`, `%`, etc. |
337
+ | `kanban-card-title-field` | — | Campo a mostrar como título de la card (modo simple) |
338
+ | `kanban-card-subtitle-field` | — | Campo a mostrar como subtítulo (modo simple) |
339
+ | `kanban-card-bgcolor` | blanco | Color de fondo de las cards |
340
+ | `draggable` | `true` | Si `false`, deshabilita drag&drop (tablero solo lectura) |
341
+ | `disableedit` | `false` | Formula o literal; si evalua a `true`, las cards no son arrastrables aunque `draggable="true"` |
342
+
343
+ **Modos de renderizado de las cards:**
344
+
345
+ - **Modo simple:** activo cuando esta presente al menos uno de `kanban-card-title-field` / `kanban-card-subtitle-field`. La card muestra título + subtítulo sobre `kanban-card-bgcolor`. Útil para tableros ligeros.
346
+ - **Modo objeto XOne completo:** activo cuando ninguno de esos atributos esta presente. Cada card se renderiza con el `<frame>` declarado en la coll del contents (mismo patron que `recyclerview` / `slideview`). Permite layouts complejos.
347
+
348
+ **Eventos:**
349
+
350
+ | Evento | Cuando se dispara |
351
+ |--------|--------------------|
352
+ | `<selecteditem>` / `onselecteditem` | Clic corto sobre una card (mismo patron que `recyclerview`) |
353
+ | Drag&drop entre columnas | Long-press sobre la card inicia el drag. Al soltar en otra columna, el framework asigna `kanban-column-field = valor de la columna destino` y guarda |
354
+
355
+ **Casos de uso típicos:** gestion de tareas (TODO/DOING/DONE), pipeline comercial (LEAD/QUOTE/WON/LOST), tableros de proyecto, workflows de aprobacion.
356
+
357
+ **Notas:**
358
+
359
+ - El campo `kanban-column-field` debe existir en la coll del contents y aceptar como valor cualquiera de los strings declarados en `kanban-columns` (mismo formato, sin transformación).
360
+ - Cards cuyo valor del campo no coincida con ninguna columna declarada **no se muestran**.
361
+ - Si el ancho total de las columnas supera la pantalla, el tablero se desplaza horizontalmente.
362
+
363
+ #### 5.9.12d Carrusel Cover Flow (viewmode="coverflow")
364
+
365
+ Variante de `slideview` para `<prop type="Z">` con efecto **Cover Flow** estilo iTunes: las cards laterales se reducen, se atenuan y opcionalmente rotan en 3D respecto a la card central, creando sensacion de profundidad. La card del centro se ve a tamaño y opacidad plenos; las que se alejan a izquierda o derecha se interpolan linealmente hacia los mínimos definidos.
366
+
367
+ Internamente comparte motor con `slideview` (mismo `<contents>`, misma navegación por swipe, mismos eventos: `onselecteditem`, `autoslide-delay`, indicadores de página). Solo cambia la animación de transición.
368
+
369
+ ```xml
370
+ <!-- Cover Flow básico (escala 75%, alpha 60%, sin rotacion 3D) -->
371
+ <prop name="MAP_CARRUSEL" type="Z" visible="1"
372
+ viewmode="coverflow"
373
+ contents="@productosContent"
374
+ width="100%" height="320p" />
375
+ <contents name="@productosContent" src="Productos" />
376
+
377
+ <!-- Cover Flow con rotacion 3D en Y -->
378
+ <prop name="MAP_CARRUSEL" type="Z" visible="1"
379
+ viewmode="coverflow"
380
+ contents="@productosContent"
381
+ cover-flow-min-scale="0.7"
382
+ cover-flow-min-alpha="0.5"
383
+ cover-flow-rotation="35"
384
+ width="100%" height="320p" />
385
+ ```
386
+
387
+ **Atributos especificos:**
388
+
389
+ | Atributo | Default | Rango | Descripción |
390
+ |----------|---------|-------|-------------|
391
+ | `cover-flow-min-scale` | `0.75` | `0.0` – `1.0` | Escala mínima de las cards laterales. La central se ve a `1.0`; las pegadas al borde se reducen hasta este valor |
392
+ | `cover-flow-min-alpha` | `0.6` | `0.0` – `1.0` | Opacidad mínima de las cards laterales. La central a `1.0`; las laterales se atenuan linealmente |
393
+ | `cover-flow-rotation` | `0` | grados | Rotación 3D sobre el eje Y de las cards laterales. Si distinto de `0`, se aplica perspectiva 3D real. Valores típicos: `25`–`45` |
394
+
395
+ Todos los atributos heredados de `slideview` (`autoslide-delay`, `onselecteditem`, etc.) siguen funcionando.
396
+
397
+ **Comportamiento:**
398
+
399
+ - **Card central:** escala `1.0`, alpha `1.0`, rotación `0` (siempre se ve al máximo).
400
+ - **Cards laterales:** se interpolan linealmente entre el centro y los mínimos según la distancia. Una card pegada al borde (posición ±1) se ve exactamente a `cover-flow-min-scale` de escala, `cover-flow-min-alpha` de alpha y `±cover-flow-rotation` grados.
401
+ - **Cards fuera del viewport:** invisibles (alpha 0) — no se renderizan visualmente.
402
+ - **Layout de la card:** el contenido es el `<frame>` declarado en la coll del contents, igual que `slideview`. El transformer solo modifica escala/alpha/rotación.
403
+
404
+ **Casos de uso típicos:** galerías de productos destacados en home, onboarding ilustrado, selectores visuales (plan, avatar), showcases donde se quiere foco en una card y peek de las adyacentes.
405
+
406
+ **Notas:**
407
+
408
+ - Valores de `cover-flow-min-scale` / `cover-flow-min-alpha` se recortan al rango `[0, 1]`; valores fuera se ajustan automáticamente.
409
+ - Con `cover-flow-rotation="0"` (default), el efecto es puramente plano (escala + opacidad). Para Cover Flow clasico estilo iTunes, usar entre 30 y 45 grados.
410
+ - Suele dejarse el `width` de cada card algo menor que el viewport para ver "peeking" de las adyacentes.
411
+ - No combinable con `viewmode="slideview"`: o uno o el otro.
412
+
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: xone-plan-builder
3
+ description: "Descomponer el PLAN.md (spec) de xone-spec-builder en un plan de ejecución (TASKS.md): tareas tracer-bullet verticales con dependencias explícitas. Valida el spec, descompone en cortes verticales (coll + pantalla + eventos + estilo), cada uno demoable y verificable con xone-review. Dependencias naturales XOne: mappings.xne → colls base → colls negocio → pantallas entidad → pantallas especiales → integraciones dispositivo (GPS, cámara, firma DR, escáner, biometría) → estilo → sincronización → validación. Prefactoring: reestructuras que facilitan el cambio. Refactors amplios: expand-contract. Quiz al usuario: granularidad, dependencias, partición. Tareas: una por context window, qué entrega (no cómo), bloqueada por, criterios verificables. Hitos con validación xone-review. Es análisis, no entrevista: no toma decisiones de diseño, si el spec tiene huecos lo devuelve a xone-spec-builder."
4
+ ---
5
+
6
+ # XOne Plan Builder
7
+
8
+ Lee el `PLAN.md` (el spec) producido por `xone-spec-builder` y lo descompone en un **plan de ejecución**: una lista de tareas **tracer-bullet verticales**, cada una con sus dependencias explícitas. El resultado es `TASKS.md`, que `xone-project-generator` (app nueva) o `xone-development` (sobre existente) consumen una tarea a la vez.
9
+
10
+ Esta skill es **análisis y descomposición**, no entrevista. No afina el dominio ni toma decisiones de diseño —eso ya está resuelto en el `PLAN.md`—. Si el spec tiene pendientes o decisiones sin resolver, **devuélvelo a `xone-spec-builder`** en vez de inventar las respuestas.
11
+
12
+ > **Carga `xone-development` antes de descomponer.** Necesitas conocer las dependencias naturales entre colls, pantallas, eventos y estilo para secuenciar bien las tareas. Toda afirmación sobre XOne debe venir de sus referencias.
13
+
14
+ ## Flujo
15
+
16
+ ```
17
+ xone-spec-builder → PLAN.md (el spec)
18
+ xone-plan-builder → TASKS.md (el plan de ejecución) ← esta skill
19
+ xone-project-generator / xone-development → ejecutan una tarea cada vez
20
+ xone-review → valida con xone-simulator
21
+ ```
22
+
23
+ ## Estructura de archivos
24
+
25
+ ```
26
+ <raíz del proyecto>/
27
+ ├── PLAN.md ← entrada (producido por xone-spec-builder)
28
+ ├── TASKS.md ← salida (esta skill)
29
+ ├── CONTEXT.md ← glosario (ya existe del spec-builder)
30
+ ├── docs/
31
+ │ └── adr/
32
+ ```
33
+
34
+ Si no existe `PLAN.md`, **detente y pide al usuario que ejecute `xone-spec-builder` primero**. No se puede descomponer lo que no está especificado.
35
+
36
+ ## Precondiciones
37
+
38
+ Antes de descomponer, valida el `PLAN.md`:
39
+
40
+ 1. **Existe** y tiene el tipo de desarrollo declarado.
41
+ 2. **No tiene pendientes bloqueantes.** Si §Pendientes tiene preguntas que impiden descomponer (p. ej., «¿hay multiidioma?» afecta a si se crea `lang/`), devuelve el spec a `xone-spec-builder`. Pendientes que no bloquean la descomposición se marcan en la tarea correspondiente como nota, pero no paran el plan.
42
+ 3. **El modelo de datos está completo** — colls, campos, tipos, relaciones.
43
+ 4. **Las pantallas están identificadas** con propósito y contenido.
44
+
45
+ Si algo falta, no lo inventes: devuelve a `xone-spec-builder` con una nota específica de qué falta.
46
+
47
+ ## Descomposición en tareas tracer-bullet
48
+
49
+ ### Qué es una tarea tracer-bullet
50
+
51
+ Una tarea es un **corte vertical** que atraviesa todas las capas que necesite para entregar un comportamiento completo y verificable:
52
+
53
+ - **Vertical, no horizontal.** «Crear coll Clientes + su pantalla de lista + su pantalla de edición + su estilo» es vertical. «Crear todas las colls» es horizontal —no es una tarea, es una capa.
54
+ - **Demoable o verificable por sí sola.** Al cerrar la tarea, hay algo que funciona de principio a fin y se puede validar con `xone-review`.
55
+ - **Cabe en una sesión de agente.** Si una tarea es tan grande que no cabe en un context window, pártela.
56
+ - **Declara sus dependencias.** Qué tareas deben cerrarse antes de que ésta pueda empezar.
57
+
58
+ ### Dependencias naturales en XOne
59
+
60
+ El orden de ejecución sigue las dependencias del framework:
61
+
62
+ ```
63
+ 1. Estructura base y configuración (app.xml, app.ini, mappings.xne, default.css)
64
+ ↓ — solo app nueva
65
+ 2. Colecciones base del modelo de datos (Empresas, Usuarios en mappings.xne)
66
+
67
+ 3. Colecciones de negocio (Clientes, Pedidos, LineasPedido…)
68
+ ↓ — una tarea por coll o por grupo de colls relacionadas
69
+ 4. Pantallas de entidad (lista → edición, por coll)
70
+ ↓ — dependen de su coll
71
+ 5. Pantallas especiales (Login, EntradaApp, MenuPrincipal)
72
+ ↓ — app nueva; pueden ir en paralelo con 3-4
73
+ 6. Integraciones de dispositivo (GPS, cámara, firma, escáner…)
74
+ ↓ — dependen de la coll/pantalla que las aloja
75
+ 7. Estilo (default.css, variantes)
76
+ ↓ — puede ir en paralelo desde el principio; ajuste fino al final
77
+ 8. Sincronización y seguridad (réplica, OAuth2, tokens…)
78
+ ↓ — si el desarrollo la toca
79
+ 9. Validación con xone-review (xone-simulator validate + smoke)
80
+ ```
81
+
82
+ ### Reglas de secuenciación
83
+
84
+ - **`mappings.xne` primero.** Empresas y Usuarios deben existir antes que cualquier coll de negocio que haga combo a Empresas.
85
+ - **Una coll antes que su pantalla.** No se puede crear la pantalla de edición de Pedidos sin que la coll Pedidos exista.
86
+ - **`inherits`/`<include-layout>` antes que las colls que los consumen.** Si se define una coll base `special="true"` para herencia, va antes que las colls que heredan de ella.
87
+ - **Estilo en paralelo.** `default.css` con las clases base puede empezar desde la tarea 1, pero el ajuste fino de pantallas específicas va después de que la pantalla exista.
88
+ - **Integraciones después de su contenedor.** La firma DR en Pedidos va en una tarea que depende de que Pedidos (coll + pantalla de edición) ya exista.
89
+ - **Validación al final de cada hito.** Si el plan tiene varios hitos, cada uno cierra con una tarea de validación `xone-review`.
90
+
91
+ ### Prefactoring
92
+
93
+ Antes de partir el trabajo, busca oportunidades de **prefactor** que hagan la implementación más fácil —«facilita el cambio, luego haz el cambio fácil». Si el proyecto existente tiene código que conviene reestructurar antes de añadir la feature nueva (p. ej., migrar `load` a `before-edit` en las colls que se van a tocar), esa prefactor va como **primera tarea**, bloqueando a las que dependen de ella.
94
+
95
+ Solo propón prefactor si el spec lo justifica o si al leer el proyecto existente es evidente. No inventes refactor fuera del scope.
96
+
97
+ ### Refactors amplios: la excepción a las tareas verticales
98
+
99
+ Un **refactor amplio** es un cambio mecánico cuyo **radio de explosión** cubre todo el proyecto —renombrar una coll, cambiar el tipo de un campo compartido, migrar de `load` a `before-edit` en todas las colls—. No se puede partir en un corte vertical porque un solo edit rompe miles de sitios. Secuenciálo como **expand–contract**:
100
+
101
+ 1. **Expand:** añade la nueva forma junto a la vieja, sin romper nada.
102
+ 2. **Migra** los sitios de uso en lotes (por carpeta, por módulo), cada lote su propia tarea bloqueada por el expand, manteniendo `xone-review` verde lote a lote.
103
+ 3. **Contract:** borra la forma vieja cuando nadie la usa, en una tarea bloqueada por todos los lotes.
104
+
105
+ Si el spec no describe un refactor amplio, no lo fuerces. Es excepción, no regla.
106
+
107
+ ## Quiz al usuario
108
+
109
+ Presenta el desglose propuesto como una lista numerada. Por cada tarea muestra:
110
+
111
+ - **Título**: nombre descriptivo corto
112
+ - **Bloqueada por**: qué tareas deben cerrarse primero (o «Ninguna — puede empezar ya»)
113
+ - **Qué entrega**: el comportamiento end-to-end que esta tarea hace funcionar
114
+
115
+ Pregunta al usuario:
116
+
117
+ - ¿La granularidad es correcta? (demasiado gruesa / demasiado fina)
118
+ - ¿Las dependencias son correctas —cada tarea solo depende de las que genuinamente la bloquean?
119
+ - ¿Falta fusionar o partir alguna?
120
+
121
+ Itera hasta que el usuario apruebe el desglose. Luego escribe `TASKS.md`.
122
+
123
+ ## TASKS.md
124
+
125
+ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Resumen:
126
+
127
+ ```md
128
+ # Plan de ejecución — {Título del desarrollo}
129
+
130
+ **Spec de origen:** PLAN.md
131
+ **Tipo:** {app nueva | feature | refactor | integración | cambio de modelo | rediseño}
132
+
133
+ ## Tareas
134
+
135
+ ### 01 — {Título}
136
+ **Qué entrega:** {comportamiento end-to-end, perspectiva del usuario — no lista de capas}
137
+ **Bloqueada por:** Ninguna — puede empezar ya
138
+ **Notas:** {si hay algo que el spec dejó pendiente que afecta a esta tarea}
139
+
140
+ - [ ] Criterio de aceptación 1
141
+ - [ ] Criterio de aceptación 2
142
+
143
+ ### 02 — {Título}
144
+ **Qué entrega:** …
145
+ **Bloqueada por:** 01
146
+
147
+
148
+ ## Orden de ejecución
149
+
150
+ {lista numerada en orden de dependencias, o un grafo simple}
151
+
152
+ ## Hitos
153
+
154
+ {si aplica: qué conjunto de tareas forma un hito verificable con xone-review}
155
+ ```
156
+
157
+ ## Reglas
158
+
159
+ - **Una tarea = un context window.** Si no cabe, pártela.
160
+ - **Decisiones, no código.** No pegues XML/JS/CSS en las tareas. Describe el comportamiento y qué se logra.
161
+ - **Nombres consistentes con el spec**, y el `MAP_` según `xone-development`.
162
+ - **No inventes lo que el spec no dice.** Si falta algo para descomponer, devuelve a `xone-spec-builder`.
163
+ - **Evita rutas de archivo o snippets de código específicos** —envejecen rápido. Excepción: si un prototipo o el spec produjo un snippet que codifica una decisión más preciso que prosa (esquema, state machine), inclúyelo y nota su origen.
164
+ - **La validación es una tarea.** Si el plan tiene hitos, cada hito cierra con una tarea `xone-review`. Si no, al menos una tarea de validación al final.
165
+
166
+ ## Cierre
167
+
168
+ Antes de entregar `TASKS.md`:
169
+
170
+ - [ ] Cada tarea es un corte vertical completo y verificable.
171
+ - [ ] Cada tarea declara sus dependencias correctamente.
172
+ - [ ] El orden de ejecución respeta las dependencias naturales de XOne (mappings → colls → pantallas → integraciones → estilo → validación).
173
+ - [ ] No hay tareas que dependan de cosas que el spec no especifica —o están marcadas como notas.
174
+ - [ ] El usuario aprobó el desglose.
175
+ - [ ] Las tareas de validación `xone-review` están en su sitio.
176
+
177
+ Al entregar, señala el siguiente paso: `xone-project-generator` (app nueva) o `xone-development` (sobre existente) ejecutan una tarea cada vez, y `xone-review` valida los hitos.
178
+
179
+ ## Referencias
180
+
181
+ - [references/TASKS-FORMAT.md](references/TASKS-FORMAT.md) — Plantilla de `TASKS.md` y formato de cada tarea.
182
+
183
+ Las reglas de XML, JavaScript, CSS, datos y dispositivo viven en `xone-development`. El spec que esta skill consume, en `xone-spec-builder`. El generador de proyectos, en `xone-project-generator`.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "XOne Plan Builder"
3
+ short_description: "Break a PLAN.md into tracer-bullet tasks"
4
+ policy:
5
+ allow_implicit_invocation: false