xonecode 0.29.0 → 0.33.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 (82) hide show
  1. package/apps/web/dist/assets/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-H_kGeZt2.js} +1 -1
  2. package/apps/web/dist/assets/{index-IptObD2z.css → index-CWBaotdZ.css} +1 -1
  3. package/apps/web/dist/assets/index-DnGuOvbb.js +499 -0
  4. package/apps/web/dist/assets/{php-B91ZcS-9.js → php-CMFQiZgk.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-Dj3BOBHc.js} +1 -1
  6. package/apps/web/dist/index.html +2 -2
  7. package/dist/agent/config/modelosDeMotor.js +4 -2
  8. package/dist/agent/config/modelosDeMotor.js.map +1 -1
  9. package/dist/agent/config/settingsEnDisco.js +26 -0
  10. package/dist/agent/config/settingsEnDisco.js.map +1 -1
  11. package/dist/agent/dispositivos/cajasDeMaqueta.js +130 -0
  12. package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
  13. package/dist/agent/dispositivos/geometriaEnDisco.js +25 -0
  14. package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
  15. package/dist/agent/dispositivos/juezVisual.js +84 -3
  16. package/dist/agent/dispositivos/juezVisual.js.map +1 -1
  17. package/dist/agent/grafo/criticaVisual.js +240 -11
  18. package/dist/agent/grafo/criticaVisual.js.map +1 -1
  19. package/dist/agent/grafo/lectorDeReferencias.js +21 -0
  20. package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
  21. package/dist/agent/grafo/validarFicheroXone.js +114 -0
  22. package/dist/agent/grafo/validarFicheroXone.js.map +1 -0
  23. package/dist/agent/motores/motoresLocales.js +429 -0
  24. package/dist/agent/motores/motoresLocales.js.map +1 -0
  25. package/dist/agent/motores/trueforge/sesionTrueforge.js +79 -11
  26. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  27. package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
  28. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  29. package/dist/agent/sesiones/adjuntosDeSesion.js +125 -5
  30. package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
  31. package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
  32. package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
  33. package/dist/agent/subagentes/subagenteCodex.js +7 -2
  34. package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
  35. package/dist/agent/subagentes/subagenteOpencode.js +12 -5
  36. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
  37. package/dist/agent/turno/resumenDeTool.js +2 -0
  38. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  39. package/dist/core/adjuntos.js +10 -2
  40. package/dist/core/adjuntos.js.map +1 -1
  41. package/dist/core/contextos.js +20 -0
  42. package/dist/core/contextos.js.map +1 -1
  43. package/dist/core/cssBienFormado.js +97 -0
  44. package/dist/core/cssBienFormado.js.map +1 -0
  45. package/dist/core/descripcionDePantalla.js +354 -0
  46. package/dist/core/descripcionDePantalla.js.map +1 -0
  47. package/dist/core/estiloMedido.js +332 -0
  48. package/dist/core/estiloMedido.js.map +1 -0
  49. package/dist/core/geometriaDePantalla.js +437 -0
  50. package/dist/core/geometriaDePantalla.js.map +1 -0
  51. package/dist/core/jsParaRhino.js +93 -0
  52. package/dist/core/jsParaRhino.js.map +1 -0
  53. package/dist/core/motoresLocales.js +128 -0
  54. package/dist/core/motoresLocales.js.map +1 -0
  55. package/dist/core/notify.js +2 -0
  56. package/dist/core/notify.js.map +1 -1
  57. package/dist/core/nucleoXone.js +6 -6
  58. package/dist/core/nucleoXone.js.map +1 -1
  59. package/dist/core/settings.js +5 -0
  60. package/dist/core/settings.js.map +1 -1
  61. package/dist/core/shellDeAgente.js +13 -0
  62. package/dist/core/shellDeAgente.js.map +1 -1
  63. package/dist/core/xmlBienFormado.js +206 -0
  64. package/dist/core/xmlBienFormado.js.map +1 -0
  65. package/dist/core/zipDeAdjunto.js +79 -0
  66. package/dist/core/zipDeAdjunto.js.map +1 -0
  67. package/dist/web/servidor/arranque.js +84 -0
  68. package/dist/web/servidor/arranque.js.map +1 -1
  69. package/dist/web/servidor/transporte.js.map +1 -1
  70. package/package.json +2 -1
  71. package/skills/xone-development/SKILL.md +2 -1
  72. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
  73. package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +81 -0
  74. package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
  75. package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
  76. package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
  77. package/skills/xone-development/references/indice-completo.md +1 -0
  78. package/skills/xone-hotswap/lib/geometria.mjs +147 -0
  79. package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
  80. package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
  81. package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
  82. package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
@@ -0,0 +1,437 @@
1
+ /**
2
+ * La GEOMETRÍA de una pantalla: comparar CAJAS, no píxeles. Pura.
3
+ *
4
+ * Existe por una sesión de MyAllXOne (crear una calculadora de Stitch): diez rondas de «cambio el CSS →
5
+ * despliega y captura → compara» porque nada le decía al agente QUÉ estaba mal. El comparador de franjas
6
+ * (`compararCapturas.ts`) da dónde hay contenido, no qué tecla; el SSIM se quedó en 0,44–0,48 en todas
7
+ * las rondas; y el crítico con visión no vio la «=» tapada por la barra de navegación y se inventó
8
+ * diferencias de color. Pero los dos lados se pueden tener como DATOS:
9
+ *
10
+ * - **El aparato** da su árbol de controles (`getAllElements`): cada control con su texto, su nombre y
11
+ * su caja en píxeles. Lo guarda con la captura, en el mismo momento, `xone-captura-android`.
12
+ * - **Una maqueta de Stitch** trae `code.html`: renderizado, da la caja de cada botón con su texto.
13
+ *
14
+ * Dos niveles:
15
+ * 1. **Solo con el aparato** (`hallazgosDelAparato`), haya maqueta o no: lo TAPADO por las barras del
16
+ * sistema (Android dibuja de borde a borde, así que un control puede quedar debajo de la de
17
+ * navegación), lo que se SALE de la pantalla y lo que se SOLAPA.
18
+ * 2. **Con la maqueta** (`compararConMaqueta`): se EMPAREJAN por texto Y posición —por texto solo, el
19
+ * «0» del visor se emparejó con la tecla «0»— y se dice qué FALTA, qué cambia de FILA o de ORDEN, y
20
+ * qué TAMAÑO RELATIVO a sus vecinas cambia. Nada de coordenadas absolutas: las proporciones de la
21
+ * maqueta (390×746) y del aparato (1080×2400) no coinciden, y cada «está 30 px más abajo» sería ruido.
22
+ *
23
+ * Lo que es BLOQUEANTE (tapado, fuera, falta) decide el veredicto; el resto son diferencias.
24
+ */
25
+ /** Cuántos hallazgos de cada clase como mucho: más es ruido que nadie lee. */
26
+ export const TOPE_DE_HALLAZGOS = 10;
27
+ /** Cuánto (en fracción del alto del control) tiene que meterse bajo una barra para contar como tapado. */
28
+ const FRACCION_TAPADA = 0.1;
29
+ /** Cuánto cambia el tamaño relativo a sus vecinas para decirlo: un 40 %. */
30
+ const CAMBIO_DE_TAMAÑO = 0.4;
31
+ /** Distancia máxima (en fracción de la pantalla) para emparejar un icono sin texto por su posición. */
32
+ const DISTANCIA_PARA_ICONOS = 0.08;
33
+ /**
34
+ * Cuánto puede moverse el borde de una fila (en fracción del ancho de la pantalla) sin que sea noticia. Medido en la
35
+ * calculadora: un teclado cuya cuarta columna acababa en el 87 % del ancho, con la maqueta llegando al 94 %, dejaba
36
+ * una franja vacía a la derecha que ni las filas ni los anchos relativos veían.
37
+ */
38
+ const ENCAJE = 0.04;
39
+ // ---------------------------------------------------------------- el árbol del aparato
40
+ /** Los controles del árbol de `getAllElements` (lista anidada de nodos con `bounds`), aplanados. */
41
+ export function controlesDelArbol(arbol) {
42
+ const salida = [];
43
+ let contenedores = 0;
44
+ const visitar = (n, padre) => {
45
+ if (Array.isArray(n)) {
46
+ for (const x of n)
47
+ visitar(x, padre);
48
+ return;
49
+ }
50
+ if (n === null || typeof n !== "object")
51
+ return;
52
+ const nodo = n;
53
+ const b = nodo["bounds"];
54
+ if (b !== undefined &&
55
+ nodo["visible"] !== false &&
56
+ typeof b["left"] === "number" &&
57
+ typeof b["top"] === "number" &&
58
+ typeof b["width"] === "number" &&
59
+ typeof b["height"] === "number" &&
60
+ b["width"] > 0 &&
61
+ b["height"] > 0) {
62
+ const texto = typeof nodo["text"] === "string" ? nodo["text"].trim() : "";
63
+ contenedores += 1;
64
+ const yo = contenedores;
65
+ salida.push({
66
+ ...(padre === undefined ? {} : { padre }),
67
+ ...("visibleBounds" in nodo && nodo["visibleBounds"] === null ? { fueraDeVista: true } : {}),
68
+ ...(typeof nodo["name"] === "string" ? { nombre: nodo["name"] } : {}),
69
+ ...(texto === "" ? {} : { texto }),
70
+ ...(typeof nodo["type"] === "string" ? { tipo: nodo["type"] } : {}),
71
+ ...(typeof nodo["propType"] === "string" ? { clase: nodo["propType"] } : {}),
72
+ caja: { x: b["left"], y: b["top"], ancho: b["width"], alto: b["height"] },
73
+ });
74
+ for (const v of Object.values(nodo))
75
+ if (v !== null && typeof v === "object")
76
+ visitar(v, yo);
77
+ return;
78
+ }
79
+ for (const v of Object.values(nodo))
80
+ if (v !== null && typeof v === "object")
81
+ visitar(v, padre);
82
+ };
83
+ visitar(arbol);
84
+ return salida;
85
+ }
86
+ /** Un control «de verdad» (con texto, o que no es un contenedor): los marcos llegan de borde a borde y solo meten ruido. */
87
+ /** Un control que se juzga: con texto o que no es un marco, y que se VE (no está fuera por el scroll de su lista). */
88
+ const esHoja = (c) => c.fueraDeVista !== true && (c.texto !== undefined || (c.tipo !== undefined && c.tipo !== "frame" && c.tipo !== "group"));
89
+ /** Cómo se nombra un control en un hallazgo: su texto entre comillas, y su nombre si lo tiene. */
90
+ function nombrar(c) {
91
+ if (c.texto !== undefined && c.nombre !== undefined)
92
+ return `«${c.texto}» (${c.nombre})`;
93
+ return c.texto !== undefined ? `«${c.texto}»` : (c.nombre ?? "un control sin nombre");
94
+ }
95
+ // ---------------------------------------------------------------- nivel 1: solo el aparato
96
+ export function hallazgosDelAparato(g) {
97
+ const bloqueantes = [];
98
+ const diferencias = [];
99
+ const notas = [];
100
+ const hojas = g.controles.filter(esHoja);
101
+ const nav = g.barras?.navegacion;
102
+ const estado = g.barras?.estado;
103
+ if (g.barras === undefined)
104
+ notas.push("sin las barras del sistema: no puedo decir qué queda tapado por ellas");
105
+ for (const c of hojas) {
106
+ const abajo = c.caja.y + c.caja.alto;
107
+ const derecha = c.caja.x + c.caja.ancho;
108
+ if (nav !== undefined && abajo - nav.arriba > c.caja.alto * FRACCION_TAPADA && c.caja.y < nav.abajo) {
109
+ bloqueantes.push(`${nombrar(c)} queda TAPADO por la barra de navegación: acaba en y=${abajo} y la barra empieza en y=${nav.arriba} (${abajo - nav.arriba} px debajo).`);
110
+ }
111
+ else if (estado !== undefined && estado.abajo - c.caja.y > c.caja.alto * FRACCION_TAPADA && abajo > estado.arriba && c.caja.y < estado.abajo) {
112
+ bloqueantes.push(`${nombrar(c)} queda TAPADO por la barra de estado: empieza en y=${c.caja.y} y la barra acaba en y=${estado.abajo}.`);
113
+ }
114
+ else if (c.caja.x < -2 || c.caja.y < -2 || derecha > g.pantalla.ancho + 2 || abajo > g.pantalla.alto + 2) {
115
+ bloqueantes.push(`${nombrar(c)} se SALE de la pantalla (${c.caja.x},${c.caja.y} → ${derecha},${abajo} en una de ${g.pantalla.ancho}×${g.pantalla.alto}).`);
116
+ }
117
+ }
118
+ // Solapes entre controles con texto: dos teclas montadas una encima de otra se ven, pero no se pulsan. Solo entre
119
+ // HERMANOS: un panel que se abre encima del teclado (medido: la cinta de la calculadora) no es un error de maqueta. El
120
+ // árbol de `getAllElements` viene PLANO pero en el orden de la jerarquía (cada marco antes que lo suyo), así que el
121
+ // contenedor es el último marco ANTERIOR en la lista que lo contiene. Por geometría sola, un panel que tapa una tecla
122
+ // entera pasaba por su contenedor.
123
+ const contiene = (m, c) => c.x >= m.x - 1 && c.y >= m.y - 1 && c.x + c.ancho <= m.x + m.ancho + 1 && c.y + c.alto <= m.y + m.alto + 1;
124
+ const contenedor = (c) => {
125
+ if (c.padre !== undefined)
126
+ return c.padre;
127
+ const i = g.controles.indexOf(c);
128
+ for (let k = i - 1; k >= 0; k--) {
129
+ const m = g.controles[k];
130
+ if ((m.tipo === "frame" || m.tipo === "group") && contiene(m.caja, c.caja))
131
+ return m;
132
+ }
133
+ return undefined;
134
+ };
135
+ const conTexto = hojas.filter((c) => c.texto !== undefined);
136
+ for (let i = 0; i < conTexto.length; i++) {
137
+ for (let j = i + 1; j < conTexto.length; j++) {
138
+ if (contenedor(conTexto[i]) !== contenedor(conTexto[j]))
139
+ continue;
140
+ const a = conTexto[i].caja;
141
+ const b = conTexto[j].caja;
142
+ const ancho = Math.min(a.x + a.ancho, b.x + b.ancho) - Math.max(a.x, b.x);
143
+ const alto = Math.min(a.y + a.alto, b.y + b.alto) - Math.max(a.y, b.y);
144
+ if (ancho <= 0 || alto <= 0)
145
+ continue;
146
+ const menor = Math.min(a.ancho * a.alto, b.ancho * b.alto);
147
+ // Uno DENTRO de otro (un texto dentro de su tarjeta) no es un solape: es anidar.
148
+ if (ancho * alto >= menor * 0.95)
149
+ continue;
150
+ if (ancho * alto > menor * 0.2)
151
+ diferencias.push(`${nombrar(conTexto[i])} y ${nombrar(conTexto[j])} se SOLAPAN.`);
152
+ }
153
+ }
154
+ return { bloqueantes, diferencias, notas };
155
+ }
156
+ // ---------------------------------------------------------------- nivel 2: contra la maqueta
157
+ /** Los signos que se escriben de varias formas. */
158
+ const ALIAS = { "−": "-", "–": "-", "×": "x", "*": "x", "÷": "/" };
159
+ /** Adornos que el aparato pinta delante de un texto («• DEG») y no forman parte de él. */
160
+ const ADORNOS = /[•◦▪●]/g;
161
+ /**
162
+ * El texto con el que se empareja, o `""` si es un ICONO. Los botones de Stitch llevan iconos de Material
163
+ * como ligaduras (`backspace`, `content_copy COPY`): una palabra en minúsculas y con `_` es el nombre de un
164
+ * icono, no texto que se vea.
165
+ */
166
+ export function textoParaEmparejar(texto) {
167
+ // `[borrar]`: así nombra un icono quien DESCRIBE una maqueta (`maquetaDescrita.ts`).
168
+ if (/^\[[^\]]*\]$/.test(texto.trim()))
169
+ return "";
170
+ const palabras = texto.replace(ADORNOS, " ").trim().split(/\s+/).filter((p) => p !== "");
171
+ const visibles = palabras.filter((p) => !/^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(p) && !(palabras.length === 1 && /^[a-z]{4,}$/.test(p)));
172
+ const unido = visibles.join(" ");
173
+ return unido
174
+ .split("")
175
+ .map((c) => ALIAS[c] ?? c)
176
+ .join("")
177
+ .toLowerCase();
178
+ }
179
+ /** El centro de una caja en fracción de su pantalla. */
180
+ const centro = (c, ancho, alto) => [(c.x + c.ancho / 2) / ancho, (c.y + c.alto / 2) / alto];
181
+ /**
182
+ * Empareja uno a uno: primero por TEXTO igual, eligiendo entre los iguales el más cercano (así el «0» de
183
+ * la tecla no se empareja con el «0» del visor); después los ICONOS por posición, solo si el más cercano
184
+ * está cerca y libre. Lo que no se empareja se devuelve aparte.
185
+ */
186
+ export function emparejar(m, g,
187
+ /** Solo por texto: con una maqueta DESCRITA las posiciones son de una rejilla, y un icono «cerca» no significa nada. */
188
+ soloTexto = false) {
189
+ const hojas = g.controles.filter(esHoja);
190
+ const usadosM = new Set();
191
+ const usadosA = new Set();
192
+ const parejas = [];
193
+ const distancia = (e, c) => {
194
+ const [mx, my] = centro(e.caja, m.ancho, m.alto);
195
+ const [ax, ay] = centro(c.caja, g.pantalla.ancho, g.pantalla.alto);
196
+ return Math.abs(mx - ax) + Math.abs(my - ay);
197
+ };
198
+ const candidatas = [];
199
+ m.elementos.forEach((e, i) => {
200
+ const t = textoParaEmparejar(e.texto);
201
+ if (t === "")
202
+ return;
203
+ hojas.forEach((c, j) => {
204
+ if (c.texto !== undefined && textoParaEmparejar(c.texto) === t)
205
+ candidatas.push({ i, j, d: distancia(e, c) });
206
+ });
207
+ });
208
+ for (const { i, j } of candidatas.sort((a, b) => a.d - b.d)) {
209
+ if (usadosM.has(i) || usadosA.has(j))
210
+ continue;
211
+ usadosM.add(i);
212
+ usadosA.add(j);
213
+ parejas.push({ maqueta: m.elementos[i], aparato: hojas[j] });
214
+ }
215
+ // Iconos —y lo que en la maqueta es texto y en el aparato una IMAGEN («√»)—: por posición, contra
216
+ // controles SIN texto que nadie ha cogido.
217
+ m.elementos.forEach((e, i) => {
218
+ if (soloTexto || usadosM.has(i))
219
+ return;
220
+ let mejor;
221
+ hojas.forEach((c, j) => {
222
+ if (usadosA.has(j) || c.texto !== undefined)
223
+ return;
224
+ const d = distancia(e, c);
225
+ if (mejor === undefined || d < mejor.d)
226
+ mejor = { j, d };
227
+ });
228
+ if (mejor !== undefined && mejor.d <= DISTANCIA_PARA_ICONOS) {
229
+ usadosM.add(i);
230
+ usadosA.add(mejor.j);
231
+ parejas.push({ maqueta: e, aparato: hojas[mejor.j], ...(textoParaEmparejar(e.texto) === "" ? {} : { porPosicion: true }) });
232
+ }
233
+ });
234
+ return { parejas, sinPareja: m.elementos.filter((_, i) => !usadosM.has(i)) };
235
+ }
236
+ /** Agrupa en FILAS: dos van en la misma si sus centros verticales están a menos de medio alto. Devuelve el índice de fila de cada uno. */
237
+ export function filas(cajas) {
238
+ const orden = cajas.map((c, i) => ({ i, cy: c.y + c.alto / 2, alto: c.alto })).sort((a, b) => a.cy - b.cy);
239
+ const fila = new Array(cajas.length).fill(0);
240
+ let actual = -1;
241
+ let referencia;
242
+ for (const o of orden) {
243
+ if (referencia === undefined || Math.abs(o.cy - referencia.cy) >= Math.min(o.alto, referencia.alto) / 2) {
244
+ actual += 1;
245
+ referencia = { cy: o.cy, alto: o.alto };
246
+ }
247
+ fila[o.i] = actual;
248
+ }
249
+ return fila;
250
+ }
251
+ const mediana = (xs) => {
252
+ const o = [...xs].sort((a, b) => a - b);
253
+ return o.length === 0 ? 0 : o.length % 2 === 1 ? o[(o.length - 1) / 2] : (o[o.length / 2 - 1] + o[o.length / 2]) / 2;
254
+ };
255
+ const etiqueta = (e) => {
256
+ const t = e.texto.trim();
257
+ return /^[a-z][a-z0-9_]*$/.test(t) ? `el icono «${t}»` : `«${t.replace(/^[a-z_]+\s+/, "")}»`;
258
+ };
259
+ const veces = (x) => x.toFixed(1).replace(".", ",");
260
+ const mayuscula = (t) => t.charAt(0).toUpperCase() + t.slice(1);
261
+ export function compararConMaqueta(m, g, modo = {}) {
262
+ const bloqueantes = [];
263
+ const diferencias = [];
264
+ const notas = [];
265
+ const aproximada = modo.aproximada === true;
266
+ const { maqueta: laMaqueta, aparato: elAparato } = modo.nombres ?? { maqueta: "la maqueta", aparato: "el aparato" };
267
+ const { parejas, sinPareja } = emparejar(m, g, aproximada);
268
+ for (const p of parejas) {
269
+ if (p.porPosicion === true)
270
+ notas.push(`${etiqueta(p.maqueta)} de ${laMaqueta} es en ${elAparato} un control SIN texto (${p.aparato.nombre ?? "sin nombre"}): una imagen en su sitio. Comparo su caja igual.`);
271
+ }
272
+ /**
273
+ * En una maqueta DESCRITA, un texto sin pareja solo es noticia si su FILA existe en el otro lado (algún
274
+ * vecino suyo sí se emparejó): medido sobre la calculadora, los textos de ejemplo del visor
275
+ * («1,240 × 15% + 450 = 636») no están en el aparato, y no tienen por qué.
276
+ */
277
+ const filasConPareja = new Set(parejas.map((p) => p.maqueta.caja.y));
278
+ const sinFila = [];
279
+ for (const e of sinPareja) {
280
+ if (textoParaEmparejar(e.texto) === "") {
281
+ if (!aproximada)
282
+ notas.push(`${etiqueta(e)} de ${laMaqueta} no lo puedo emparejar: no tiene texto y nada de ${elAparato} cae cerca de su sitio.`);
283
+ }
284
+ else if (aproximada) {
285
+ if (filasConPareja.has(e.caja.y))
286
+ diferencias.push(`${etiqueta(e)} de ${laMaqueta} no lo encuentro en ${elAparato} con ese texto (puede ser una imagen en su sitio: míralo).`);
287
+ else
288
+ sinFila.push(etiqueta(e));
289
+ }
290
+ else
291
+ bloqueantes.push(`${etiqueta(e)} de ${laMaqueta} NO está en ${elAparato} (ningún control con ese texto).`);
292
+ }
293
+ if (sinFila.length > 0) {
294
+ notas.push(`sin el mismo texto en ${elAparato}, ni en su fila: ${sinFila.slice(0, 5).join(", ")}${sinFila.length > 5 ? "…" : ""} (si son datos de ejemplo de un visor, es normal).`);
295
+ }
296
+ if (parejas.length < 2) {
297
+ notas.push("con menos de dos controles emparejados no hay filas ni tamaños que comparar.");
298
+ return { bloqueantes, diferencias, notas };
299
+ }
300
+ const filaM = filas(parejas.map((p) => p.maqueta.caja));
301
+ const filaA = filas(parejas.map((p) => p.aparato.caja));
302
+ // FILAS: lo que en la maqueta va junto y en el aparato no (o al revés), dicho por fila de la maqueta.
303
+ const porFilaM = new Map();
304
+ filaM.forEach((f, i) => porFilaM.set(f, [...(porFilaM.get(f) ?? []), i]));
305
+ for (const indices of porFilaM.values()) {
306
+ if (indices.length < 2)
307
+ continue;
308
+ const enAparato = new Map();
309
+ for (const i of indices)
310
+ enAparato.set(filaA[i], [...(enAparato.get(filaA[i]) ?? []), i]);
311
+ const nombres = indices
312
+ .slice()
313
+ .sort((a, b) => parejas[a].maqueta.caja.x - parejas[b].maqueta.caja.x)
314
+ .map((i) => etiqueta(parejas[i].maqueta));
315
+ if (enAparato.size > 1) {
316
+ // La parte más grande es «la fila»; lo demás, lo que se ha ido a otra.
317
+ const grupos = [...enAparato.values()].sort((a, b) => b.length - a.length);
318
+ const fuera = grupos.slice(1).flat().map((i) => etiqueta(parejas[i].maqueta));
319
+ diferencias.push(`${mayuscula(`en ${laMaqueta}`)} ${nombres.join(", ")} van en la MISMA fila; en ${elAparato} ${fuera.join(", ")} va${fuera.length > 1 ? "n" : ""} en otra.`);
320
+ continue;
321
+ }
322
+ // Misma fila en los dos: el ORDEN de izquierda a derecha.
323
+ const ordenA = indices.slice().sort((a, b) => parejas[a].aparato.caja.x - parejas[b].aparato.caja.x).map((i) => etiqueta(parejas[i].maqueta));
324
+ if (ordenA.join("|") !== nombres.join("|"))
325
+ diferencias.push(`En la fila ${nombres.join(", ")} el ORDEN cambia: en ${elAparato} va ${ordenA.join(", ")}.`);
326
+ }
327
+ // ENCAJE: dónde empieza y acaba cada fila, en fracción del ancho de su pantalla. Solo con las dos medidas (una
328
+ // maqueta descrita es una rejilla y su ancho no es el de nada). Las filas con el mismo desajuste van juntas.
329
+ if (!aproximada) {
330
+ const porcentaje = (x) => `${Math.round(x * 100)} %`;
331
+ const encajes = new Map();
332
+ for (const indices of porFilaM.values()) {
333
+ if (indices.length < 2)
334
+ continue;
335
+ const borde = (lado, ancho) => ({
336
+ izq: Math.min(...indices.map((i) => parejas[i][lado].caja.x)) / ancho,
337
+ der: Math.max(...indices.map((i) => parejas[i][lado].caja.x + parejas[i][lado].caja.ancho)) / ancho,
338
+ });
339
+ const bm = borde("maqueta", m.ancho);
340
+ const ba = borde("aparato", g.pantalla.ancho);
341
+ const primera = etiqueta(parejas[indices.slice().sort((a, b) => parejas[a].maqueta.caja.x - parejas[b].maqueta.caja.x)[0]].maqueta);
342
+ const partes = [];
343
+ if (Math.abs(ba.izq - bm.izq) > ENCAJE)
344
+ partes.push(`empieza{n} en el ${porcentaje(ba.izq)} del ancho (en ${laMaqueta}, en el ${porcentaje(bm.izq)})`);
345
+ if (Math.abs(ba.der - bm.der) > ENCAJE)
346
+ partes.push(`acaba{n} en el ${porcentaje(ba.der)} del ancho (en ${laMaqueta}, en el ${porcentaje(bm.der)})`);
347
+ if (partes.length > 0)
348
+ encajes.set(partes.join(" y "), [...(encajes.get(partes.join(" y ")) ?? []), primera]);
349
+ }
350
+ for (const [como, filas] of encajes) {
351
+ const n = filas.length > 1 ? "n" : "";
352
+ diferencias.push(`${filas.length > 1 ? `Las filas de ${filas.join(", ")}` : `La fila de ${filas[0]}`} ${como.replaceAll("{n}", n)}: no ocupa${n} el mismo ANCHO.`);
353
+ }
354
+ }
355
+ // TAMAÑO relativo a sus vecinas de fila (en la maqueta y en el aparato, cada uno con las suyas). Solo
356
+ // entre BOTONES e imágenes: la caja de una etiqueta es el hueco que le da el layout, no lo que se pinta,
357
+ // y medido sobre la calculadora, «• DEG» salía «2,7 veces el ancho» sin verse distinto.
358
+ const comparable = (i) => {
359
+ const clase = parejas[i].aparato.clase;
360
+ return clase === undefined || clase === "B" || clase === "IMG";
361
+ };
362
+ for (const todos of porFilaM.values()) {
363
+ const indices = todos.filter((i) => comparable(i) && parejas[i].maqueta.sinAncho !== true);
364
+ if (indices.length < 2)
365
+ continue;
366
+ const anchosM = indices.map((i) => parejas[i].maqueta.caja.ancho);
367
+ const anchosA = indices.map((i) => parejas[i].aparato.caja.ancho);
368
+ const medM = mediana(anchosM);
369
+ const medA = mediana(anchosA);
370
+ if (medM <= 0 || medA <= 0)
371
+ continue;
372
+ indices.forEach((i, k) => {
373
+ const rm = anchosM[k] / medM;
374
+ const ra = anchosA[k] / medA;
375
+ if (Math.abs(ra / rm - 1) > CAMBIO_DE_TAMAÑO) {
376
+ diferencias.push(`${etiqueta(parejas[i].maqueta)} mide ${veces(ra)} veces el ancho de las de su fila; en ${laMaqueta}, ${veces(rm)}.`);
377
+ }
378
+ });
379
+ }
380
+ // PROPORCIÓN de cada control (alto entre ancho): una tecla aplastada o estirada. Si su ANCHO ya se ha
381
+ // dicho, la proporción es la misma noticia contada otra vez.
382
+ if (aproximada)
383
+ return { bloqueantes, diferencias, notas };
384
+ const yaDichos = new Set(diferencias.filter((d) => d.includes("veces el ancho")).map((d) => d.split(" mide ")[0]));
385
+ parejas.forEach((p, i) => {
386
+ if (!comparable(i) || yaDichos.has(etiqueta(p.maqueta)))
387
+ return;
388
+ const pm = p.maqueta.caja.alto / p.maqueta.caja.ancho;
389
+ const pa = p.aparato.caja.alto / p.aparato.caja.ancho;
390
+ if (pm > 0 && Math.abs(pa / pm - 1) > CAMBIO_DE_TAMAÑO && (pa < pm ? pm / pa : pa / pm) > 1.4) {
391
+ diferencias.push(`${etiqueta(p.maqueta)} tiene otra PROPORCIÓN: alto/ancho ${veces(pa)} en el aparato y ${veces(pm)} en la maqueta (${pa < pm ? "más aplastado" : "más estirado"}).`);
392
+ }
393
+ });
394
+ return { bloqueantes, diferencias, notas };
395
+ }
396
+ /** Los dos niveles juntos, recortados al tope, y sin repetir. */
397
+ export function hallazgosDeGeometria(g, m) {
398
+ const aparato = hallazgosDelAparato(g);
399
+ const maqueta = m === undefined ? { bloqueantes: [], diferencias: [], notas: [] } : compararConMaqueta(m, g);
400
+ const unico = (xs) => [...new Set(xs)];
401
+ const recorte = (xs) => xs.length <= TOPE_DE_HALLAZGOS ? xs : [...xs.slice(0, TOPE_DE_HALLAZGOS), `… y ${xs.length - TOPE_DE_HALLAZGOS} más del mismo tipo.`];
402
+ return {
403
+ bloqueantes: recorte(unico([...aparato.bloqueantes, ...maqueta.bloqueantes])),
404
+ diferencias: recorte(unico([...aparato.diferencias, ...maqueta.diferencias])),
405
+ notas: unico([...aparato.notas, ...maqueta.notas]),
406
+ };
407
+ }
408
+ /** El bloque de texto que ve el agente (y que se le da al crítico como HECHOS). */
409
+ export function informeDeGeometria(h, conMaqueta) {
410
+ const lineas = [
411
+ conMaqueta
412
+ ? "GEOMETRÍA, MEDIDA (árbol de controles del aparato contra las cajas de la maqueta: exacta, no es una opinión):"
413
+ : "GEOMETRÍA, MEDIDA (árbol de controles del aparato; sin cajas de la maqueta, solo lo que se ve en el propio aparato):",
414
+ ];
415
+ if (h.bloqueantes.length === 0 && h.diferencias.length === 0)
416
+ lineas.push("- Nada: ningún control tapado, fuera de la pantalla o solapado" + (conMaqueta ? ", y la estructura cuadra con la maqueta." : "."));
417
+ for (const b of h.bloqueantes)
418
+ lineas.push(`- ${b}`);
419
+ for (const d of h.diferencias)
420
+ lineas.push(`- ${d}`);
421
+ for (const n of h.notas)
422
+ lineas.push(`- (nota) ${n}`);
423
+ return lineas;
424
+ }
425
+ /**
426
+ * Los controles que SE VEN en el aparato, en filas de arriba abajo y cada fila de izquierda a derecha: los que
427
+ * tienen texto, y los botones e imágenes sin él. Es la ESTRUCTURA que se le da a quien describe la captura
428
+ * (`descripcionDePantalla.ts`), para que describa estos controles y no se invente otros.
429
+ */
430
+ export function filasDelAparato(g) {
431
+ const visibles = g.controles.filter((c) => c.texto !== undefined || c.clase === "B" || c.clase === "IMG");
432
+ const indice = filas(visibles.map((c) => c.caja));
433
+ const porFila = new Map();
434
+ visibles.forEach((c, i) => porFila.set(indice[i], [...(porFila.get(indice[i]) ?? []), c]));
435
+ return [...porFila.entries()].sort((a, b) => a[0] - b[0]).map(([, fila]) => fila.sort((a, b) => a.caja.x - b.caja.x));
436
+ }
437
+ //# sourceMappingURL=geometriaDePantalla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometriaDePantalla.js","sourceRoot":"","sources":["../../src/core/geometriaDePantalla.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * ¿Lo lee el motor JavaScript de XOne en Android (Rhino 1.7.12-1.7.13)? Pura y sin llamar a nadie:
3
+ * `acorn` es una librería en JS puro, sin red ni procesos.
4
+ *
5
+ * La regla es la MEDIDA ejecutando en el emulador (`docs/DECISIONES.md`, la matriz de `REGLAS_XONE`):
6
+ * ningún `ecmaVersion` de acorn sirve solo —a 5 da por malo lo que Rhino sí lee (arrow, `let`,
7
+ * `const`, destructuring, `for…of`, método abreviado); a 2015 deja pasar lo que Rhino rechaza—. Así
8
+ * que se parsea a **2015** (lo que es más nuevo, como `?.`, `??`, `**`, `async` o `1n`, ya falla ahí)
9
+ * y se niega por tipo de nodo la rodaja de ES2015 que a Rhino le falta.
10
+ *
11
+ * Por qué no `new Function` / `vm.Script`: V8 acepta todo ES2022, y en modo laxo deja pasar un `=`
12
+ * donde iba `==` (`if (a = 0)`), que Rhino rechaza al compilar.
13
+ */
14
+ import { parse } from "acorn";
15
+ /** El primer nodo que Rhino no lee, con su motivo. `padre` hace falta para el `{a}` abreviado. */
16
+ function noSoportado(nodo, padre) {
17
+ switch (nodo.type) {
18
+ case "TemplateLiteral":
19
+ case "TaggedTemplateExpression":
20
+ return "una template literal (`…${}`): Rhino no las lee; concatena con «+»";
21
+ case "ClassDeclaration":
22
+ case "ClassExpression":
23
+ return "«class»: Rhino no la lee; usa una función constructora";
24
+ case "SpreadElement":
25
+ return "el spread «...»: Rhino no lo lee";
26
+ case "RestElement":
27
+ return "el rest «...»: Rhino no lo lee; usa «arguments»";
28
+ case "AssignmentPattern":
29
+ return "un valor por defecto («a = 1» en parámetros o destructuring): Rhino no lo lee";
30
+ case "FunctionDeclaration":
31
+ case "FunctionExpression":
32
+ return nodo["generator"] === true ? "un generador «function*»: Rhino no lo lee" : undefined;
33
+ case "Property":
34
+ if (padre?.type !== "ObjectExpression")
35
+ return undefined; // en un destructuring, `{a}` SÍ vale (medido)
36
+ if (nodo["shorthand"] === true)
37
+ return "una propiedad abreviada «{a}»: Rhino no la lee; escribe «{a: a}»";
38
+ if (nodo["computed"] === true)
39
+ return "una clave calculada «{[k]: v}»: Rhino no la lee";
40
+ return undefined;
41
+ default:
42
+ return undefined;
43
+ }
44
+ }
45
+ function recorrer(nodo, padre) {
46
+ const motivo = noSoportado(nodo, padre);
47
+ if (motivo !== undefined)
48
+ return { nodo, motivo };
49
+ for (const valor of Object.values(nodo)) {
50
+ const hijos = Array.isArray(valor) ? valor : [valor];
51
+ for (const hijo of hijos) {
52
+ if (hijo !== null && typeof hijo === "object" && typeof hijo.type === "string") {
53
+ const encontrado = recorrer(hijo, nodo);
54
+ if (encontrado !== undefined)
55
+ return encontrado;
56
+ }
57
+ }
58
+ }
59
+ return undefined;
60
+ }
61
+ export function comprobarJs(entrada) {
62
+ const texto = entrada.startsWith("") ? entrada.slice(1) : entrada;
63
+ let arbol;
64
+ try {
65
+ arbol = parse(texto, { ecmaVersion: 2015, sourceType: "script", locations: true });
66
+ }
67
+ catch (error) {
68
+ const e = error;
69
+ const motivo = String(e.message ?? error).replace(/\s*\(\d+:\d+\)$/, "");
70
+ let masNuevo = false;
71
+ try {
72
+ parse(texto, { ecmaVersion: "latest", sourceType: "script" });
73
+ masNuevo = true;
74
+ }
75
+ catch {
76
+ // También es error en lo más nuevo: es un error de sintaxis de verdad.
77
+ }
78
+ return {
79
+ ok: false,
80
+ linea: e.loc?.line ?? 1,
81
+ columna: (e.loc?.column ?? 0) + 1,
82
+ motivo: masNuevo
83
+ ? `sintaxis más nueva que la que lee Rhino (${motivo}): ?. ?? ** async/await y 1n no existen en el motor`
84
+ : `error de sintaxis: ${motivo}`,
85
+ };
86
+ }
87
+ const malo = recorrer(arbol, undefined);
88
+ if (malo === undefined)
89
+ return { ok: true };
90
+ const loc = malo.nodo.loc;
91
+ return { ok: false, linea: loc?.start.line ?? 1, columna: (loc?.start.column ?? 0) + 1, motivo: malo.motivo };
92
+ }
93
+ //# sourceMappingURL=jsParaRhino.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsParaRhino.js","sourceRoot":"","sources":["../../src/core/jsParaRhino.ts"],"names":[],"mappings":"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"}