xonecode 0.19.0 → 0.20.3
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.
- package/apps/web/dist/assets/{index-BvPUqjUm.js → index-40sIfNsT.js} +65 -65
- package/apps/web/dist/assets/{index-CGEXMJBx.css → index-BYTna8Os.css} +1 -1
- package/apps/web/dist/assets/{php-Dk28VW45.js → php-CDg2Quc0.js} +1 -1
- package/apps/web/dist/assets/{ruby-CPzEcmdp.js → ruby-DlFaAWQT.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/modelos.js +13 -8
- package/dist/agent/config/modelos.js.map +1 -1
- package/dist/agent/grafo/atributosXone.js +58 -0
- package/dist/agent/grafo/atributosXone.js.map +1 -0
- package/dist/agent/grafo/describirImagen.js +134 -0
- package/dist/agent/grafo/describirImagen.js.map +1 -0
- package/dist/agent/grafo/marcarCriteriosDelPlan.js +3 -2
- package/dist/agent/grafo/marcarCriteriosDelPlan.js.map +1 -1
- package/dist/agent/grafo/xoneAgent.js +7 -6
- package/dist/agent/grafo/xoneAgent.js.map +1 -1
- package/dist/agent/motores/trueforge/capacidades.js +49 -1
- package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
- package/dist/agent/motores/trueforge/esperas.js +61 -0
- package/dist/agent/motores/trueforge/esperas.js.map +1 -0
- package/dist/agent/motores/trueforge/informesDeHijos.js +63 -0
- package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.js +118 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +186 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -0
- package/dist/agent/motores/trueforge/resumenSeguro.js +52 -0
- package/dist/agent/motores/trueforge/resumenSeguro.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +512 -30
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +77 -4
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +81 -24
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/turno/diagnosticoDeTools.js +12 -0
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +13 -1
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +5 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/core/actos.js.map +1 -1
- package/dist/core/adjuntos.js +2 -3
- package/dist/core/adjuntos.js.map +1 -1
- package/dist/core/agentes.js +20 -1
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/atributosXone.js +187 -0
- package/dist/core/atributosXone.js.map +1 -0
- package/dist/core/compararCapturas.js +81 -15
- package/dist/core/compararCapturas.js.map +1 -1
- package/dist/core/esfuerzo.js +33 -0
- package/dist/core/esfuerzo.js.map +1 -1
- package/dist/core/iconos.js +6 -1
- package/dist/core/iconos.js.map +1 -1
- package/dist/core/modoDeEscritura.js +18 -0
- package/dist/core/modoDeEscritura.js.map +1 -1
- package/dist/core/motor.js +5 -0
- package/dist/core/motor.js.map +1 -1
- package/dist/core/nucleoXone.js +3 -1
- package/dist/core/nucleoXone.js.map +1 -1
- package/dist/core/selectorDeCarpeta.js +15 -1
- package/dist/core/selectorDeCarpeta.js.map +1 -1
- package/dist/core/settings.js +19 -4
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +39 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/tareasDelPlan.js +70 -8
- package/dist/core/tareasDelPlan.js.map +1 -1
- package/dist/web/servidor/consolaWeb.js +10 -2
- package/dist/web/servidor/consolaWeb.js.map +1 -1
- package/dist/web/servidor/pielWeb.js +13 -4
- package/dist/web/servidor/pielWeb.js.map +1 -1
- package/package.json +1 -1
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +2 -2
- package/skills/xone-development/references/datos/appdata.md +5 -3
- package/skills/xone-development/references/fundamentos/errores-comunes.md +34 -0
- package/skills/xone-hotswap/SKILL.md +2 -0
- package/skills/xone-hotswap/scripts/xone-log-android +18 -1
- package/skills/xone-plan-builder/SKILL.md +10 -10
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +5 -5
- package/skills/xone-spec-builder/SKILL.md +3 -3
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
- **
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 —
|
|
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,
|
|
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 —
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
|