xonecode 0.19.0 → 0.20.1

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 (61) hide show
  1. package/dist/agent/config/modelos.js +13 -8
  2. package/dist/agent/config/modelos.js.map +1 -1
  3. package/dist/agent/grafo/atributosXone.js +58 -0
  4. package/dist/agent/grafo/atributosXone.js.map +1 -0
  5. package/dist/agent/grafo/xoneAgent.js +3 -2
  6. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  7. package/dist/agent/motores/trueforge/capacidades.js +49 -1
  8. package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
  9. package/dist/agent/motores/trueforge/esperas.js +61 -0
  10. package/dist/agent/motores/trueforge/esperas.js.map +1 -0
  11. package/dist/agent/motores/trueforge/informesDeHijos.js +63 -0
  12. package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -0
  13. package/dist/agent/motores/trueforge/medidaAutomatica.js +118 -0
  14. package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -0
  15. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +186 -0
  16. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -0
  17. package/dist/agent/motores/trueforge/resumenSeguro.js +52 -0
  18. package/dist/agent/motores/trueforge/resumenSeguro.js.map +1 -0
  19. package/dist/agent/motores/trueforge/sesionTrueforge.js +485 -27
  20. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  21. package/dist/agent/motores/trueforge/toolsDeFichero.js +69 -3
  22. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  23. package/dist/agent/subagentes/agentesEnDisco.js +71 -18
  24. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  25. package/dist/agent/turno/diagnosticoDeTools.js +12 -0
  26. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  27. package/dist/agent/turno/informeDeTraza.js +13 -1
  28. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  29. package/dist/agent/turno/resumenDeTool.js +3 -0
  30. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  31. package/dist/core/agentes.js +7 -1
  32. package/dist/core/agentes.js.map +1 -1
  33. package/dist/core/atributosXone.js +187 -0
  34. package/dist/core/atributosXone.js.map +1 -0
  35. package/dist/core/compararCapturas.js +80 -14
  36. package/dist/core/compararCapturas.js.map +1 -1
  37. package/dist/core/esfuerzo.js +33 -0
  38. package/dist/core/esfuerzo.js.map +1 -1
  39. package/dist/core/iconos.js +6 -1
  40. package/dist/core/iconos.js.map +1 -1
  41. package/dist/core/modoDeEscritura.js +18 -0
  42. package/dist/core/modoDeEscritura.js.map +1 -1
  43. package/dist/core/nucleoXone.js +3 -1
  44. package/dist/core/nucleoXone.js.map +1 -1
  45. package/dist/core/selectorDeCarpeta.js +15 -1
  46. package/dist/core/selectorDeCarpeta.js.map +1 -1
  47. package/dist/core/settings.js +19 -4
  48. package/dist/core/settings.js.map +1 -1
  49. package/dist/core/shellDeAgente.js +39 -0
  50. package/dist/core/shellDeAgente.js.map +1 -1
  51. package/dist/core/tareasDelPlan.js +69 -7
  52. package/dist/core/tareasDelPlan.js.map +1 -1
  53. package/package.json +1 -1
  54. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +2 -2
  55. package/skills/xone-development/references/datos/appdata.md +5 -3
  56. package/skills/xone-development/references/fundamentos/errores-comunes.md +34 -0
  57. package/skills/xone-hotswap/SKILL.md +2 -0
  58. package/skills/xone-hotswap/scripts/xone-log-android +18 -1
  59. package/skills/xone-plan-builder/SKILL.md +10 -10
  60. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +5 -5
  61. package/skills/xone-spec-builder/SKILL.md +3 -3
@@ -51,10 +51,43 @@ export function progresoDeTarea(estado, criterios) {
51
51
  return "pendiente";
52
52
  }
53
53
  const CABECERA_DE_TAREA = /^#{2,3}\s+(T?\d{1,3})\s*[—–-]\s*(.+?)\s*$/;
54
+ /**
55
+ * `## Tarea 1: Título`, `#### T1. Título`: el mismo encabezado con otra puntuación. Se exige la palabra
56
+ * «Tarea» o el prefijo `T`: un `## 2. Orden de ejecución` no es una tarea.
57
+ */
58
+ const CABECERA_FLEXIBLE = /^#{2,4}\s+(?:(?:tarea|task)\s+(T?\d{1,3})|(T\d{1,3}))\s*[—–:.)-]\s*(.+?)\s*$/i;
59
+ /**
60
+ * `- **T1 — Título.** Bloqueada por: ninguna.`: la tarea como VIÑETA con el título en negrita, que es
61
+ * como un analista escribió un plan real (`## Cortes verticales` con siete `- **T1 — …**`) y la
62
+ * pestaña Planes dijo «no tiene ninguna sección con forma de tarea». Solo del 1 en adelante: un
63
+ * `- **T0** — Nada que refactorizar` es la declaración de que NO hay tarea.
64
+ */
65
+ const CABECERA_EN_VINETA = /^\s{0,3}[-*]\s+\*\*(T?[1-9]\d{0,2})\s*[—–:.)-]\s*(.+?)\*\*\s*(.*)$/;
66
+ /**
67
+ * Si una línea abre una tarea, en cualquiera de las formas que se han visto, y lo que sobra en esa
68
+ * MISMA línea (en la forma de viñeta, `Bloqueada por: …` suele ir ahí). El formato de la skill
69
+ * (`### 01 — Título`) manda; las otras son tolerancia, no un segundo formato.
70
+ */
71
+ export function cabeceraDeTarea(l) {
72
+ const a = CABECERA_DE_TAREA.exec(l);
73
+ if (a !== null)
74
+ return { numero: a[1], titulo: a[2].trim() };
75
+ const f = CABECERA_FLEXIBLE.exec(l);
76
+ if (f !== null)
77
+ return { numero: (f[1] ?? f[2]), titulo: f[3].trim() };
78
+ const v = CABECERA_EN_VINETA.exec(l);
79
+ if (v === null)
80
+ return undefined;
81
+ const titulo = v[2].replace(/[\s.:]+$/, "").trim();
82
+ const resto = (v[3] ?? "").trim();
83
+ return { numero: v[1], titulo, ...(resto === "" ? {} : { resto }) };
84
+ }
54
85
  /** «Ninguna …» o «nada»: la forma de decir que puede empezar ya. */
55
86
  export const SIN_DEPENDENCIAS = /^(ninguna|nada)\b/i;
56
- const ESTADO = /^\*\*Estado:\*\*\s*(.+?)\s*$/i;
57
- const BLOQUEADA = /^\*\*Bloqueada por:\*\*\s*(.+?)\s*$/i;
87
+ const ESTADO = /^\s*(?:[-*]\s+)?\*\*Estado:\*\*\s*(.+?)\s*$/i;
88
+ const BLOQUEADA = /^\s*(?:[-*]\s+)?\*\*Bloqueada por:\*\*\s*(.+?)\s*$/i;
89
+ /** La misma información en línea: `Bloqueada por: T1.` */
90
+ const BLOQUEADA_EN_LINEA = /^\s*bloqueada por:\s*(.+?)\s*$/i;
58
91
  const CASILLA = /^\s*[-*]\s+\[( |x|X)\]\s+/;
59
92
  /**
60
93
  * Los números de tarea que nombra una línea «Bloqueada por». Un rango `01–07` (con guion,
@@ -138,10 +171,15 @@ export function leerTareasDelPlan(texto) {
138
171
  actual = undefined;
139
172
  };
140
173
  for (const l of lineas) {
141
- const cabecera = CABECERA_DE_TAREA.exec(l);
142
- if (cabecera !== null) {
174
+ const cabecera = cabeceraDeTarea(l);
175
+ if (cabecera !== undefined) {
143
176
  cerrar();
144
- actual = { numero: cabecera[1], titulo: cabecera[2], lineas: [] };
177
+ const enLinea = cabecera.resto === undefined ? undefined : BLOQUEADA_EN_LINEA.exec(cabecera.resto);
178
+ actual = {
179
+ numero: cabecera.numero,
180
+ titulo: cabecera.titulo,
181
+ lineas: enLinea === null || enLinea === undefined ? [] : [`**Bloqueada por:** ${enLinea[1]}`],
182
+ };
145
183
  continue;
146
184
  }
147
185
  // Otra sección de nivel 2 (`## Orden de ejecución`, `## Hitos`) cierra la tarea en curso:
@@ -155,6 +193,30 @@ export function leerTareasDelPlan(texto) {
155
193
  cerrar();
156
194
  return { ...(titulo === undefined || titulo === "" ? {} : { titulo }), tareas };
157
195
  }
196
+ /** La ruta del `TASKS.md` de un plan: `/planes/<slug>/TASKS.md`. */
197
+ export const RUTA_DE_TASKS = /^\/planes\/[^/]+\/TASKS\.md$/;
198
+ /**
199
+ * Por qué NO vale un `TASKS.md` que se va a escribir entero, o `undefined` si vale: tiene que reconocerse al menos una
200
+ * tarea, y CADA tarea tiene que traer sus criterios como casillas `- [ ]`.
201
+ *
202
+ * Existe por una medida: en cinco pasadas de la misma calculadora el analista escribió las casillas en tres y en dos
203
+ * (calc10, calc13) no, con los criterios como viñetas sueltas. Sin casillas, quien comprueba en el aparato no puede marcar
204
+ * nada (`marcarCriterios` solo cambia `- [ ]`), el plan no dice por dónde va y la pestaña Planes no enseña progreso. El
205
+ * prompt ya pedía el formato; era texto. Se aplica al ESCRIBIR el fichero entero, no al editarlo: un plan viejo sin
206
+ * casillas se puede seguir anotando.
207
+ */
208
+ export function motivoDeTasksInaceptable(texto) {
209
+ const { tareas } = leerTareasDelPlan(texto);
210
+ const formato = "Cada tarea va como `### 01 — Título` y sus criterios de aceptación, uno por línea, como casillas `- [ ] criterio comprobable`: " +
211
+ "son las que se marcan `- [x]` al comprobarlas en el aparato.";
212
+ if (tareas.length === 0)
213
+ return `No reconozco ninguna tarea en este TASKS.md. ${formato}`;
214
+ const sin = tareas.filter((t) => t.criterios.total === 0).map((t) => t.numero);
215
+ if (sin.length === 0)
216
+ return undefined;
217
+ const lista = sin.length > 8 ? `${sin.slice(0, 8).join(", ")} y ${sin.length - 8} más` : sin.join(", ");
218
+ return `El TASKS.md no se ha escrito: ${sin.length === tareas.length ? "ninguna tarea trae" : `las tareas ${lista} no traen`} sus criterios como casillas. ${formato} Reescríbelo con ellas.`;
219
+ }
158
220
  /**
159
221
  * Marca como COMPROBADOS unos criterios de una tarea: cambia sus `- [ ]` a `- [x]`, contando las
160
222
  * casillas de la sección de 1 en adelante, en el orden en que aparecen.
@@ -166,11 +228,11 @@ export function leerTareasDelPlan(texto) {
166
228
  export function marcarCriterios(texto, numero, criterios) {
167
229
  const saltos = texto.includes("\r\n") ? "\r\n" : "\n";
168
230
  const lineas = texto.split(/\r?\n/);
169
- const inicio = lineas.findIndex((l) => CABECERA_DE_TAREA.exec(l)?.[1] === numero);
231
+ const inicio = lineas.findIndex((l) => cabeceraDeTarea(l)?.numero === numero);
170
232
  if (inicio === -1)
171
233
  return { error: `No hay ninguna tarea «${numero}» en el TASKS.md.` };
172
234
  const casillas = [];
173
- for (let i = inicio + 1; i < lineas.length && !/^##/.test(lineas[i]); i++) {
235
+ for (let i = inicio + 1; i < lineas.length && !/^##/.test(lineas[i]) && cabeceraDeTarea(lineas[i]) === undefined; i++) {
174
236
  if (CASILLA.test(lineas[i]))
175
237
  casillas.push(i);
176
238
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tareasDelPlan.js","sourceRoot":"","sources":["../../src/core/tareasDelPlan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tareasDelPlan.js","sourceRoot":"","sources":["../../src/core/tareasDelPlan.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xonecode",
3
- "version": "0.19.0",
3
+ "version": "0.20.1",
4
4
  "description": "Consola CLI y harness de agente para desarrollar aplicaciones XOne",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -119,8 +119,8 @@ let sFrameVersion = appData.getGlobalMacro("##FRAME_VERSION##");
119
119
  let valor = appData.getGlobalMacro("##MI_MACRO##");
120
120
  appData.setGlobalMacro("##MI_MACRO##", "mi_valor");
121
121
 
122
- // Escribir mensaje de debug
123
- appData.writeConsoleString("Debug: valor = " + valor);
122
+ // Escribir mensaje de debug: console.log (writeConsoleString es legacy y no llega al log de Android)
123
+ console.log("Debug: valor = " + valor);
124
124
 
125
125
  // Limpiar errores acumulados
126
126
  appData.error().clear();
@@ -372,8 +372,8 @@ appData.exit();
372
372
  // === Cerrar la ventana actual ===
373
373
  ui.getView(self).exit();
374
374
 
375
- // === Escribir en consola de debug ===
376
- appData.writeConsoleString("Debug: valor = " + valor);
375
+ // === Escribir en consola de debug: console.log (writeConsoleString es legacy) ===
376
+ console.log("Debug: valor = " + valor);
377
377
 
378
378
  // === Cargar archivos include (solo para casos dinámicos — preferir <include>/<script> en <app>; ver 4.11) ===
379
379
  appData.loadIncludeFile("scripts/miModulo.js", "javascript", "UTF-8");
@@ -456,7 +456,9 @@ if (error.getNumber() != 0) {
456
456
  }
457
457
  ```
458
458
 
459
- #### writeConsoleString(message) - Consola de Depuracion
459
+ #### writeConsoleString(message) - Consola de Depuracion (legacy)
460
+
461
+ > **Legacy: para depurar, `console.log`.** Medido en un emulador Android: `console.log("X")` sale en el log del host como `V XOneJavaScript: X` (se lee con `xone-log-android --app`), y `appData.writeConsoleString` no deja nada en el log. No uses tampoco `ui.showToast` para depurar: el aviso desaparece y no deja rastro.
460
462
 
461
463
  ```javascript
462
464
  appData.writeConsoleString("App_log_xone->Mensaje de depuracion");
@@ -300,6 +300,40 @@ Declararlas explícitamente (`<prop name="ID">` / `<prop name="ROWID">`) **no ca
300
300
 
301
301
  **Lo que NO es valido:** dos `<coll>` con el mismo `name` en el proyecto.
302
302
 
303
+ ### Error 12: Pedir un control con `getControl` cuando todavía no existe
304
+
305
+ ```javascript
306
+ // MAL: en <create> la vista aún no está montada
307
+ function calcInit() {
308
+ var c = getControl("MAP_EXPRESION"); // LANZA
309
+ c.setText("0");
310
+ }
311
+ ```
312
+
313
+ `getControl("X")` **lanza** una `IllegalArgumentException` («Cannot find control "X"») si el control no existe, y **un
314
+ `try/catch` de JavaScript no la detiene**: viene del puente nativo, aborta el evento entero (`CXoneDataObject::OnCreate
315
+ failed`) y deja un diálogo de error encima de la pantalla. Medido en un emulador Android.
316
+
317
+ **No existen** los controles de la vista durante `<create>` (todavía no está montada) ni los hijos de un frame
318
+ **oculto** (`visible="0"`), como un cajón cerrado.
319
+
320
+ ```javascript
321
+ // BIEN: en <create> solo estado y valores
322
+ function calcInit() {
323
+ self.MAP_EXPRESION = "0";
324
+ }
325
+
326
+ // BIEN: una sonda que NO lanza, para un control que puede no existir
327
+ function calcControl(nombre) {
328
+ var v = ui.getView(self);
329
+ return v ? (v[nombre] || null) : null; // ui.getView(self)["X"] da undefined, no lanza
330
+ }
331
+ ```
332
+
333
+ La documentación de `getControl` y la indexación de la vista (`ui.getView(self)["X"]`) las presenta como equivalentes:
334
+ para acceder no lo son, y esa diferencia es la que evita el diálogo. **Y un texto que cambia desde JavaScript no va en
335
+ un `L`/`TL`** (pintan su `title`): usa un `T` con `labelwidth="0"` y `locked="true"`.
336
+
303
337
  ---
304
338
 
305
339
  Esta guía ha cubierto los conceptos fundamentales de XOne:
@@ -26,6 +26,7 @@ No cuestan lo mismo, ni de lejos. Por orden de lo que vas a necesitar:
26
26
  |---|---|---|
27
27
  | **dónde estoy** | `screen` | una línea: colección activa, diálogos abiertos, ventana con el foco |
28
28
  | **qué está fallando** | `xone-log-android` | un error de JavaScript o una excepción salen ahí con su mensaje y su línea |
29
+ | **qué ha pasado tras una acción** | `xone-log-android --limpiar`, la acción, `xone-log-android --app` | trae SOLO los `console.log` de la app, sus errores y qué manejador corrió (`Executing script: [MenuPrincipal][btnD8][onclick]`): casi siempre basta sin captura |
29
30
  | **el valor de un campo** | `getText name=X` | un viaje, una respuesta corta |
30
31
  | **varios campos** | `getFields names=A,B,C` | UN viaje; un campo que falle no tumba a los demás |
31
32
  | **el contenido de una lista** | `getRows content=X fields=…` | alcanza todas las filas, no solo las pintadas |
@@ -117,6 +118,7 @@ xone-hotswap waitForElement name=BTN_OK timeout=5000 -- click name=BTN_OK # UN
117
118
  # Por qué algo no se pinta o la app se muere: las excepciones del aparato.
118
119
  xone-log-android
119
120
  xone-log-android --limpiar # aísla lo que pase a partir de ahora
121
+ xone-log-android --app # SOLO los console.log de la app, sus errores y qué manejador corrió
120
122
 
121
123
  # RESPALDO de la captura, para cuando el canal no contesta: `adb exec-out screencap` pero
122
124
  # guardándola donde toca. Nunca redirijas ese `adb` tú: el `cwd` es la raíz del proyecto.
@@ -17,6 +17,7 @@
17
17
  * xone-log-android errores y excepciones recientes
18
18
  * xone-log-android --lineas 400 más cola
19
19
  * xone-log-android --todo todo lo del host, no solo errores
20
+ * xone-log-android --app SOLO lo que escribió la app con console.log, más sus errores
20
21
  * xone-log-android --limpiar vacía el buffer y sale (para aislar lo siguiente)
21
22
  * xone-log-android --serie emulator-5554
22
23
  */
@@ -32,6 +33,7 @@ if (args.includes("--help") || args.includes("-h")) {
32
33
  xone-log-android errores y excepciones recientes (por omisión, 200 líneas)
33
34
  xone-log-android --lineas 400 más cola
34
35
  xone-log-android --todo todo lo del host, no solo errores
36
+ xone-log-android --app SOLO los console.log de la app (etiqueta XOneJavaScript) y sus errores
35
37
  xone-log-android --limpiar vacía el buffer y sale, para aislar lo que pase después
36
38
  xone-log-android --serie <id> con varios aparatos conectados
37
39
 
@@ -62,6 +64,13 @@ if (args.includes("--limpiar")) {
62
64
 
63
65
  const lineas = Number(opcion("lineas") ?? 200);
64
66
  const todo = args.includes("--todo");
67
+ /**
68
+ * `--app`: lo que la APP escribió con `console.log`, y sus errores, sin el resto del host. Medido en el emulador: un
69
+ * `console.log("X")` de un script sale como `V XOneJavaScript: X` en el log del host, y la vista por omisión —solo
70
+ * errores— lo tira; `--todo` lo entierra entre cientos de líneas del sistema. `appData.writeConsoleString` (legacy) no
71
+ * deja nada en el log de Android. Es lo que hay que leer para saber qué ha pasado tras una acción, antes que una captura.
72
+ */
73
+ const app = args.includes("--app");
65
74
 
66
75
  /** El PID del host, si está vivo. Sin él no se puede acotar por proceso: se dice y se sigue. */
67
76
  let pid;
@@ -76,7 +85,7 @@ const salida = [];
76
85
  if (pid !== undefined && pid !== "") {
77
86
  const suyo = adb("logcat", "-d", "--pid", pid, "-t", String(lineas));
78
87
  salida.push(`--- ${PAQUETE} (pid ${pid}) ---`);
79
- salida.push(todo ? suyo : soloInteresante(suyo));
88
+ salida.push(todo ? suyo : app ? soloDeLaApp(suyo) : soloInteresante(suyo));
80
89
  } else {
81
90
  salida.push(`--- ${PAQUETE} no está vivo ahora mismo: solo queda lo que dejó escrito ---`);
82
91
  }
@@ -91,6 +100,14 @@ if (caidas !== "") {
91
100
  salida.push("", "--- caídas duras (cualquier proceso) ---", caidas);
92
101
  }
93
102
 
103
+ /** Los `console.log` de la app (etiqueta XOneJavaScript) y los errores del host, en su orden. */
104
+ function soloDeLaApp(texto) {
105
+ const filas = texto.split("\n").filter((l) => /\sXOneJavaScript\s*:/.test(l) || /\s[EF]\s/.test(l) || /Caused by:|Exception/.test(l));
106
+ return filas.length === 0
107
+ ? "(la app no ha escrito nada con console.log ni ha dado errores en esas líneas; si esperabas una línea, no se ejecutó ese código)"
108
+ : filas.join("\n");
109
+ }
110
+
94
111
  /** Lo que merece la pena leer de un volcado del host: errores, avisos y trazas de excepción. */
95
112
  function soloInteresante(texto) {
96
113
  const filas = texto.split("\n").filter((l) => {
@@ -1,6 +1,6 @@
1
1
  ---
2
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."
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 comprobable en el aparato. 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 que cierran con una comprobación en el aparato. Es análisis, no entrevista: no toma decisiones de diseño, si el spec tiene huecos lo devuelve a xone-spec-builder."
4
4
  ---
5
5
 
6
6
  # XOne Plan Builder
@@ -17,7 +17,7 @@ Esta skill es **análisis y descomposición**, no entrevista. No afina el domini
17
17
  xone-spec-builder → PLAN.md (el spec)
18
18
  xone-plan-builder → TASKS.md (el plan de ejecución) ← esta skill
19
19
  xone-project-generator / xone-development → ejecutan una tarea cada vez
20
- xone-review → valida con xone-simulator
20
+ arnés + device-controller → valida: el verificador al cerrar el turno, el aparato con toques reales
21
21
  ```
22
22
 
23
23
  ## Estructura de archivos
@@ -79,7 +79,7 @@ Si algo falta, no lo inventes: devuelve a `xone-spec-builder` con una nota espec
79
79
  Una tarea es un **corte vertical** que atraviesa todas las capas que necesite para entregar un comportamiento completo y verificable:
80
80
 
81
81
  - **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.
82
- - **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`.
82
+ - **Demoable o verificable por sí sola.** Al cerrar la tarea, hay algo que funciona de principio a fin y se puede comprobar: el verificador del arnés (corre `xone-simulator validate` solo, al cerrar cada turno que escribió) y la comprobación en el aparato de `device-controller`.
83
83
  - **Cabe en una sesión de agente.** Si una tarea es tan grande que no cabe en un context window, pártela.
84
84
  - **Declara sus dependencias.** Qué tareas deben cerrarse antes de que ésta pueda empezar.
85
85
 
@@ -104,7 +104,7 @@ El orden de ejecución sigue las dependencias del framework:
104
104
  ↓ — puede ir en paralelo desde el principio; ajuste fino al final
105
105
  8. Sincronización y seguridad (réplica, OAuth2, tokens…)
106
106
  ↓ — si el desarrollo la toca
107
- 9. Validación con xone-review (xone-simulator validate + smoke)
107
+ 9. Comprobación en el aparato (device-controller; el verificador del arnés corre solo)
108
108
  ```
109
109
 
110
110
  ### Reglas de secuenciación
@@ -115,7 +115,7 @@ El orden de ejecución sigue las dependencias del framework:
115
115
  - **El comportamiento se comprueba ANTES que el pulido.** En una pantalla interactiva, la tarea «la app reacciona a un toque» —una captura antes y otra después de la zona que debe cambiar— va justo detrás del esqueleto visual y antes de cualquier tarea de aspecto fino. Si no, se pule algo que no funciona: medido, un display que no se repintaba vivió siete pasadas de retoques visuales.
116
116
  - **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.
117
117
  - **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.
118
- - **Validación al final de cada hito.** Si el plan tiene varios hitos, cada uno cierra con una tarea de validación `xone-review`.
118
+ - **Comprobación al final de cada hito.** Si el plan tiene varios hitos, cada uno cierra con una tarea de comprobación en el aparato (`device-controller`); la validación estática la hace el verificador del arnés solo.
119
119
 
120
120
  ### Prefactoring
121
121
 
@@ -128,7 +128,7 @@ Solo propón prefactor si el spec lo justifica o si al leer el proyecto existent
128
128
  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**:
129
129
 
130
130
  1. **Expand:** añade la nueva forma junto a la vieja, sin romper nada.
131
- 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.
131
+ 2. **Migra** los sitios de uso en lotes (por carpeta, por módulo), cada lote su propia tarea bloqueada por el expand, manteniendo el verificador del arnés en verde lote a lote.
132
132
  3. **Contract:** borra la forma vieja cuando nadie la usa, en una tarea bloqueada por todos los lotes.
133
133
 
134
134
  Si el spec no describe un refactor amplio, no lo fuerces. Es excepción, no regla.
@@ -182,7 +182,7 @@ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Re
182
182
 
183
183
  ## Hitos
184
184
 
185
- {si aplica: qué conjunto de tareas forma un hito verificable con xone-review}
185
+ {si aplica: qué conjunto de tareas forma un hito comprobable en el aparato}
186
186
  ```
187
187
 
188
188
  ## Reglas
@@ -192,7 +192,7 @@ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Re
192
192
  - **Nombres consistentes con el spec**, y el `MAP_` según `xone-development`.
193
193
  - **No inventes lo que el spec no dice.** Si falta algo para descomponer, devuelve a `xone-spec-builder`.
194
194
  - **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.
195
- - **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.
195
+ - **La comprobación es una tarea.** Si el plan tiene hitos, cada hito cierra con una tarea de comprobación en el aparato. Si no, al menos una al final. No nombres herramientas que no estén en las skills de los especialistas: quien ejecuta las buscará.
196
196
 
197
197
  ## Cierre
198
198
 
@@ -203,9 +203,9 @@ Antes de entregar `TASKS.md`:
203
203
  - [ ] El orden de ejecución respeta las dependencias naturales de XOne (mappings → colls → pantallas → integraciones → estilo → validación).
204
204
  - [ ] No hay tareas que dependan de cosas que el spec no especifica —o están marcadas como notas.
205
205
  - [ ] El usuario aprobó el desglose.
206
- - [ ] Las tareas de validación `xone-review` están en su sitio.
206
+ - [ ] Las tareas de comprobación en el aparato están en su sitio.
207
207
 
208
- 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.
208
+ Al entregar, señala el siguiente paso: `xone-project-generator` (app nueva) o `xone-development` (sobre existente) ejecutan una tarea cada vez, y el verificador del arnés (al cerrar cada turno) y device-controller en el aparato validan los hitos.
209
209
 
210
210
  ## Referencias
211
211
 
@@ -43,13 +43,13 @@
43
43
  6. 06 — Integración GPS + ClientesMapa (bloqueada por 02)
44
44
  7. 07 — Firma DR en Pedidos (bloqueada por 03)
45
45
  8. 08 — Estilo: default.css completo + variantes (en paralelo desde 01)
46
- 9. 09 — Validación xone-review (bloqueada por 02-08)
46
+ 9. 09 — Comprobación en el aparato con device-controller (bloqueada por 02-08)
47
47
 
48
48
  ## Hitos
49
49
 
50
50
  {si aplica: qué conjunto de tareas forma un hito verificable. Ejemplo:}
51
51
 
52
- - **Hito 1 — CRUD básico:** tareas 01-04. Al cerrar, validar con xone-review.
52
+ - **Hito 1 — CRUD básico:** tareas 01-04. Al cerrar, comprobarlo en el aparato con device-controller.
53
53
  - **Hito 2 — App completa:** tareas 05-09. Validación final.
54
54
  ```
55
55
 
@@ -83,9 +83,9 @@ y quien empiece un encargo con este plan lo lee primero. Ejemplo:}
83
83
  - **Decisiones, no código.** Sin XML/JS/CSS pegado. Excepción: si un snippet codifica una decisión más preciso que prosa (esquema, state machine), inclúyelo y nota su origen.
84
84
  - **Nombres consistentes con el spec**, y el `MAP_` según `xone-development`.
85
85
  - **Evita rutas de archivo específicas.** Envejecen rápido. El ejecutor las infiere del spec y del proyecto.
86
- - **Criterios de aceptación verificables.** Cada criterio debe poder comprobarse —con `xone-review`, con un smoke, o con un comportamiento observable.
86
+ - **Criterios de aceptación verificables.** Cada criterio debe poder comprobarse —en el aparato con un toque y lo que dice el log, o con un comportamiento observable.
87
87
  - **El comportamiento antes que el pulido.** En una pantalla interactiva, «reacciona a un toque» (captura antes y después) va tras el esqueleto visual y antes del aspecto fino.
88
- - **La validación es una tarea.** Cada hito cierra con una tarea `xone-review`, o al menos una al final del plan.
88
+ - **La comprobación es una tarea.** Cada hito cierra con una tarea de comprobación en el aparato (`device-controller`). La validación estática no es una tarea: la hace el verificador del arnés solo, al cerrar cada turno. No nombres herramientas que no estén en esta skill ni en las de los especialistas: quien ejecuta las buscará.
89
89
 
90
90
  ## Ejemplo: feature sobre existente
91
91
 
@@ -136,5 +136,5 @@ Antes de entregar el plan:
136
136
  - [ ] El orden respeta las dependencias naturales de XOne (mappings → colls → pantallas → integraciones → estilo → validación).
137
137
  - [ ] No hay tareas que dependan de cosas que el spec no especifica —o están marcadas como notas.
138
138
  - [ ] El usuario aprobó el desglose.
139
- - [ ] Las tareas de validación xone-review están en su sitio.
139
+ - [ ] Las tareas de comprobación en el aparato están en su sitio.
140
140
  - [ ] Los hitos (si los hay) están definidos y cierran con validación.
@@ -18,7 +18,7 @@ El spec builder es el primer paso de cualquier trabajo XOne. Lo que sigue:
18
18
  - **`xone-plan-builder`** lee el `PLAN.md` y lo descompone en tareas tracer-bullet con dependencias (`TASKS.md`).
19
19
  - **App nueva** → `xone-project-generator` lee el `PLAN.md` y genera el proyecto completo.
20
20
  - **Feature, refactor, integración, cambio de modelo, rediseño** sobre un proyecto existente → `xone-development` aplica el `PLAN.md` sobre los `.xne`, `.js` y `.css` que ya viven en el repo.
21
- - **Validación final** → `xone-review` con `xone-simulator` en ambos casos.
21
+ - **Validación final** → el verificador del arnés (corre `xone-simulator validate` solo, al cerrar cada turno que escribió) y la comprobación en el aparato de `device-controller`, en ambos casos.
22
22
 
23
23
  `xone-spec-builder` es **especificación**: produce decisiones de diseño y un spec, no código ni tareas. La tentación de empezar a generar archivos o a descomponer el trabajo es la señal de que has llegado al borde del spec; para ahí y entrega el `PLAN.md`.
24
24
 
@@ -76,7 +76,7 @@ No toda petición necesita una entrevista de 8 rounds. Antes de empezar, clasifi
76
76
 
77
77
  | Nivel | Cuándo | Qué hace el spec-builder |
78
78
  |---|---|---|
79
- | **Trivial** | Una sola acción mecánica, sin decisiones de diseño. Ej: «añadir un prop EMAIL (T) a Clientes», «cambiar el color del header», «añadir un botón de salir». | **No produces PLAN.md.** Confirmas la petición en 1-2 preguntas, ejecutas con `xone-development` o `xone-project-generator` directamente, y validas con `xone-review`. Sin `CONTEXT.md` ni ADRs. |
79
+ | **Trivial** | Una sola acción mecánica, sin decisiones de diseño. Ej: «añadir un prop EMAIL (T) a Clientes», «cambiar el color del header», «añadir un botón de salir». | **No produces PLAN.md.** Confirmas la petición en 1-2 preguntas, ejecutas con `xone-development` o `xone-project-generator` directamente; lo valida el verificador del arnés (al cerrar cada turno) y device-controller en el aparato. Sin `CONTEXT.md` ni ADRs. |
80
80
  | **Simple** | Un cambio acotado con alguna decisión menor. Ej: «añadir campo IVA a LineasPedido con formula», «pasar Clientes a mapa», «añadir escáner QR en una pantalla». | **Spec ligero.** Entrevista reducida: solo los rounds que apliquen (típicamente 1, 3 y/o 4 y/o 5). `PLAN.md` en formato condensado —una sección por round, sin secciones vacías—. `CONTEXT.md` solo si hay término de dominio nuevo; ADR solo si hay decisión dura. |
81
81
  | **Normal** | Feature con varias colls/pantallas, refactor, integración multi-pantalla. Ej: «firma de entrega en Pedidos», «login con OAuth2», «módulo de incidencias con fotos». | **Spec completo.** Entrevista con los rounds que apliquen al tipo. `PLAN.md` con las secciones condicionales del formato. `CONTEXT.md` y ADRs según se resuelvan. |
82
82
  | **Grande** | App nueva completa, re-arquitectura, o un desarrollo que no cabe en una sesión de plan-builder. | **Spec completo + considerar wayfinder.** Entrevista los 8 rounds. Si el scope es tan grande que ni el spec cabe en una sesión, considera dividir el esfuerzo con un enfoque tipo wayfinder (chart el mapa de decisiones primero, luego spec por contexto). |
@@ -209,7 +209,7 @@ Revisa el `PLAN.md` completo contra el checklist de [PLAN-FORMAT.md](references/
209
209
  - ¿Los términos de dominio nuevos están en `CONTEXT.md` y las decisiones duras en ADRs?
210
210
  - ¿Quedan preguntas abiertas? Márcalas en `PLAN.md` §Pendientes; no las resuelvas tú.
211
211
 
212
- Si falta algo, vuelve al round correspondiente. Si todo está, entrega el spec y señala el siguiente paso: `xone-plan-builder` para descomponer en tareas, después `xone-project-generator` (app nueva) o `xone-development` (sobre existente), y `xone-review` para validar al final.
212
+ Si falta algo, vuelve al round correspondiente. Si todo está, entrega el spec y señala el siguiente paso: `xone-plan-builder` para descomponer en tareas, después `xone-project-generator` (app nueva) o `xone-development` (sobre existente), y el verificador del arnés (al cerrar cada turno) y device-controller en el aparato para validar.
213
213
 
214
214
  ## Disciplina durante la entrevista
215
215