xonecode 0.8.27 → 0.8.37
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-LdUr7EoT.js → index-Bm4ur93-.js} +69 -69
- package/apps/web/dist/assets/index-F-tnEn80.css +1 -0
- package/apps/web/dist/assets/{php-Cg-eWGpQ.js → php-D2qE525B.js} +1 -1
- package/apps/web/dist/assets/{ruby-EcV7Hon3.js → ruby-SvGm1EAa.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/grafo/escriturasEnSerie.js +57 -0
- package/dist/agent/grafo/escriturasEnSerie.js.map +1 -0
- package/dist/agent/grafo/proyecto.js +69 -3
- package/dist/agent/grafo/proyecto.js.map +1 -1
- package/dist/agent/grafo/traerDeLaMaquina.js +117 -0
- package/dist/agent/grafo/traerDeLaMaquina.js.map +1 -0
- package/dist/agent/grafo/validacionXone.js +79 -4
- package/dist/agent/grafo/validacionXone.js.map +1 -1
- package/dist/agent/grafo/xoneAgent.js +33 -1
- package/dist/agent/grafo/xoneAgent.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +34 -6
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/trazaDeErroresEnDisco.js +45 -0
- package/dist/agent/trazaDeErroresEnDisco.js.map +1 -0
- package/dist/agent/turno/diagnosticoDeTools.js +10 -1
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +129 -6
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/puente.js +89 -5
- package/dist/agent/turno/puente.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +28 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +20 -2
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/core/serieDeEscrituras.js +63 -0
- package/dist/core/serieDeEscrituras.js.map +1 -0
- package/dist/core/traerDeLaMaquina.js +80 -0
- package/dist/core/traerDeLaMaquina.js.map +1 -0
- package/dist/core/trazaDeErrores.js +108 -0
- package/dist/core/trazaDeErrores.js.map +1 -0
- package/dist/web/servidor/consolaWeb.js +6 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -1
- package/package.json +2 -1
- package/skills/xone-hotswap/SKILL.md +76 -8
- package/skills/xone-hotswap/references/comandos.md +33 -0
- package/skills/xone-hotswap/references/conexion-y-despliegue.md +61 -1
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +1 -1
- package/skills/xone-hotswap/scripts/xone-captura-android +91 -3
- package/skills/xone-hotswap/scripts/xone-desplegar-android +80 -5
- package/skills/xone-hotswap/scripts/xone-hotswap +151 -8
- package/apps/web/dist/assets/index-DKZqgHtg.css +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El registro de lo que se traga un `catch`.
|
|
3
|
+
*
|
|
4
|
+
* **Por qué hace falta.** Este harness tiene 123 `catch` y casi todos callan a propósito: que
|
|
5
|
+
* no se pueda leer un adjunto, que falle el validador, que `git` no esté — ninguna de esas
|
|
6
|
+
* cosas puede tumbar un turno, y por eso se devuelven en vez de lanzarse. El precio es que
|
|
7
|
+
* cuando algo va mal **no queda rastro de nada**. Medido sobre una sesión que se colgó: el
|
|
8
|
+
* proceso estaba vivo y OCIOSO —`kevent`, sin un socket abierto, sin trabajo—, el `.jsonl`
|
|
9
|
+
* acababa en el mensaje de la persona sin su `fin`, y desde fuera no había forma de saber
|
|
10
|
+
* dónde se quedó. No es que el registro fuera pobre: es que no existía.
|
|
11
|
+
*
|
|
12
|
+
* **Es la misma pieza que `XONECODE_TRACE_TOOLS`** (`agent/turno/diagnosticoDeTools.ts`) y por
|
|
13
|
+
* la misma razón: apagado no cuesta nada, encendido deja un `.jsonl` que se puede leer después.
|
|
14
|
+
* Lo que cambia es qué anota — allí a dónde se fueron los tokens, aquí qué se calló.
|
|
15
|
+
*
|
|
16
|
+
* **Y el sumidero entra por PARÁMETRO**, como el de `core/bitacora.ts`: este módulo vive en
|
|
17
|
+
* `core/` y no toca disco, así que `npm test` no escribe nada y quien lo prueba ve lo que se
|
|
18
|
+
* anotó sin abrir un fichero.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* El mensaje de un error, sin lo que no puede salir de la máquina.
|
|
22
|
+
*
|
|
23
|
+
* **Un error de Node lleva la ruta absoluta dentro del mensaje** —«ENOENT: no such file or
|
|
24
|
+
* directory, open '/Users/alguien/…'»— y este registro acaba en un `.jsonl` que una persona
|
|
25
|
+
* puede mirar por un túnel. Es la misma regla que ya obliga a `codigoDe` y a quedarse con el
|
|
26
|
+
* `error.name` en las guardas: de un error de Node, solo lo que no identifica a nadie.
|
|
27
|
+
*
|
|
28
|
+
* Las rutas se SUSTITUYEN en vez de tirar el mensaje entero, porque lo que queda —«ENOENT: no
|
|
29
|
+
* such file or directory, open '<ruta>'»— sigue diciendo qué pasó.
|
|
30
|
+
*/
|
|
31
|
+
export function mensajeSeguro(mensaje) {
|
|
32
|
+
return mensaje
|
|
33
|
+
.replace(/(['"`])\/(?:[^'"`\s]|\\ )*\1/g, "$1<ruta>$1")
|
|
34
|
+
.replace(/(?<![\w'"`/])\/(?:Users|home|private|Volumes|tmp|var|opt)\/[^\s'"`,;)]*/g, "<ruta>");
|
|
35
|
+
}
|
|
36
|
+
/** De un error, lo que se puede contar. */
|
|
37
|
+
export function anotable(donde, error) {
|
|
38
|
+
if (error instanceof Error) {
|
|
39
|
+
const codigo = error.code;
|
|
40
|
+
return {
|
|
41
|
+
donde,
|
|
42
|
+
nombre: error.name,
|
|
43
|
+
...(typeof codigo === "string" ? { codigo } : {}),
|
|
44
|
+
mensaje: mensajeSeguro(error.message),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return { donde, nombre: "desconocido", mensaje: mensajeSeguro(String(error)) };
|
|
48
|
+
}
|
|
49
|
+
let sumidero;
|
|
50
|
+
/**
|
|
51
|
+
* Enchufa el sumidero. Sin esto, anotar no hace NADA — que es lo que debe pasar apagado.
|
|
52
|
+
*
|
|
53
|
+
* Es global a propósito, y es la única forma que funciona aquí: los sitios que se tragan una
|
|
54
|
+
* excepción están repartidos por todo el árbol —`core/`, `agent/`, `web/`— y muchos viven en
|
|
55
|
+
* funciones puras sin sitio donde inyectar nada. Pasarlo por parámetro habría obligado a
|
|
56
|
+
* cambiar la firma de medio harness para añadir una línea de diagnóstico, y eso es justo el
|
|
57
|
+
* cambio que nadie hace.
|
|
58
|
+
*/
|
|
59
|
+
export function ponerSumideroDeErrores(nuevo) {
|
|
60
|
+
sumidero = nuevo;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Anota lo que un `catch` acaba de tragarse. **No cambia lo que pasa después.**
|
|
64
|
+
*
|
|
65
|
+
* Quien la llama sigue haciendo exactamente lo mismo que hacía: devolver `undefined`, seguir
|
|
66
|
+
* adelante, tragarse el fallo. Esto es un testigo, no una decisión — si además cambiara el
|
|
67
|
+
* control, cada sitio habría que volver a medirlo.
|
|
68
|
+
*
|
|
69
|
+
* Y NUNCA lanza: un registro de diagnóstico que rompe lo que observa es peor que no tenerlo.
|
|
70
|
+
*/
|
|
71
|
+
export function anotarError(donde, error) {
|
|
72
|
+
if (sumidero === undefined)
|
|
73
|
+
return;
|
|
74
|
+
emitir(anotable(donde, error));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Anota que algo EMPIEZA, y devuelve la función que anota que acabó.
|
|
78
|
+
*
|
|
79
|
+
* Se usa envolviendo, no con dos llamadas sueltas: `const fin = anotarPaso(...); try { … }
|
|
80
|
+
* finally { fin(); }`. Así el `fin` no se puede olvidar en la rama del error, que es
|
|
81
|
+
* justamente la rama que interesa.
|
|
82
|
+
*
|
|
83
|
+
* Apagado no cuesta nada —ni una fecha— porque se sale antes de mirar el reloj.
|
|
84
|
+
*/
|
|
85
|
+
export function anotarPaso(donde, detalle) {
|
|
86
|
+
if (sumidero === undefined)
|
|
87
|
+
return () => { };
|
|
88
|
+
const t0 = Date.now();
|
|
89
|
+
emitir({ donde, fase: "inicio", ...(detalle === undefined ? {} : { detalle }) });
|
|
90
|
+
let cerrado = false;
|
|
91
|
+
return () => {
|
|
92
|
+
if (cerrado)
|
|
93
|
+
return;
|
|
94
|
+
cerrado = true;
|
|
95
|
+
emitir({ donde, fase: "fin", ...(detalle === undefined ? {} : { detalle }), ms: Date.now() - t0 });
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function emitir(anotado) {
|
|
99
|
+
if (sumidero === undefined)
|
|
100
|
+
return;
|
|
101
|
+
try {
|
|
102
|
+
sumidero(anotado);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Ni el testigo puede tumbar a quien observa.
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=trazaDeErrores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trazaDeErrores.js","sourceRoot":"","sources":["../../src/core/trazaDeErrores.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAiCH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,OAAO;SACX,OAAO,CAAC,+BAA+B,EAAE,YAAY,CAAC;SACtD,OAAO,CAAC,0EAA0E,EAAE,QAAQ,CAAC,CAAC;AACnG,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAc;IACpD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAI,KAA4B,CAAC,IAAI,CAAC;QAClD,OAAO;YACL,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,IAAI;YAClB,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;SACtC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC;AAKD,IAAI,QAAuC,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAoC;IACzE,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAc;IACvD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAAgB;IACxD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,OAAmC;IACjD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* el prellenado del mapa, no en quién compara la cadena.
|
|
28
28
|
*/
|
|
29
29
|
import { crearPielWeb } from "./pielWeb.js";
|
|
30
|
+
import { anotarPaso } from "../../core/trazaDeErrores.js";
|
|
30
31
|
import { crearTransporte } from "./transporte.js";
|
|
31
32
|
import { CatalogoModelosEnMemoria } from "../../core/ports.js";
|
|
32
33
|
import { REJECT_MESSAGE } from "../../vendor/hitl.js";
|
|
@@ -245,6 +246,10 @@ export function crearConsolaWeb(opciones = {}) {
|
|
|
245
246
|
const decisiones = new Map(pendientes.map((p) => [p.id, { type: "reject", message: REJECT_MESSAGE }]));
|
|
246
247
|
if (!transporte.conectado())
|
|
247
248
|
return Promise.resolve(decisiones);
|
|
249
|
+
// El hito dice CUÁNTAS escrituras se pusieron delante de alguien y cuánto tardó en
|
|
250
|
+
// contestar. Un `inicio` sin `fin` aquí es «la aprobación se quedó sin contestar», que
|
|
251
|
+
// es lo primero que hay que descartar cuando un turno no avanza.
|
|
252
|
+
const finDelPaso = anotarPaso("consolaWeb#aprobacionesTui", `${pendientes.length} pendiente(s)`);
|
|
248
253
|
return new Promise((resuelto) => {
|
|
249
254
|
const temporizador = setTimeout(() => enVuelo.terminar(), msDeEspera);
|
|
250
255
|
const enVuelo = {
|
|
@@ -260,6 +265,7 @@ export function crearConsolaWeb(opciones = {}) {
|
|
|
260
265
|
},
|
|
261
266
|
terminar: () => {
|
|
262
267
|
clearTimeout(temporizador);
|
|
268
|
+
finDelPaso();
|
|
263
269
|
// Soltarlo ANTES de resolver es lo que hace que una decisión tardía no tenga
|
|
264
270
|
// nada que ascender, y que el contenido no sobreviva a la decisión.
|
|
265
271
|
aprobacionEnVuelo = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolaWeb.js","sourceRoot":"","sources":["../../../src/web/servidor/consolaWeb.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"consolaWeb.js","sourceRoot":"","sources":["../../../src/web/servidor/consolaWeb.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xonecode",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.37",
|
|
4
4
|
"description": "Consola CLI y harness de agente para desarrollar aplicaciones XOne",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"build:web": "npm run build --workspace apps/web",
|
|
26
26
|
"prepack": "npm run build",
|
|
27
27
|
"web": "npm run build:web && tsx src/bin.ts --web",
|
|
28
|
+
"web:trazas": "XONECODE_TRACE_ERRORES=1 XONECODE_TRACE_TOOLS=1 npm run web",
|
|
28
29
|
"test": "vitest run",
|
|
29
30
|
"test:watch": "vitest",
|
|
30
31
|
"typecheck": "tsc --noEmit && tsc -p apps/web/tsconfig.json --noEmit",
|
|
@@ -17,6 +17,45 @@ El servidor vive **dentro del proceso de la app**: si la app no está viva, el p
|
|
|
17
17
|
responde. Habla dos protocolos por el mismo puerto: **WebSocket** para los comandos
|
|
18
18
|
(`{"command": "..."}` → `{"result": ..., "status": ...}`) y **HTTP(S)** para lo demás.
|
|
19
19
|
|
|
20
|
+
|
|
21
|
+
## Qué usar para qué (y una captura casi nunca es la respuesta)
|
|
22
|
+
|
|
23
|
+
No cuestan lo mismo, ni de lejos. Por orden de lo que vas a necesitar:
|
|
24
|
+
|
|
25
|
+
| quieres saber… | úsalo | por qué |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| **dónde estoy** | `screen` | una línea: colección activa, diálogos abiertos, ventana con el foco |
|
|
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
|
+
| **el valor de un campo** | `getText name=X` | un viaje, una respuesta corta |
|
|
30
|
+
| **varios campos** | `getFields names=A,B,C` | UN viaje; un campo que falle no tumba a los demás |
|
|
31
|
+
| **el contenido de una lista** | `getRows content=X fields=…` | alcanza todas las filas, no solo las pintadas |
|
|
32
|
+
| **qué hay en la pantalla** | `elements` | SOLO para explorar: decenas de miles de caracteres |
|
|
33
|
+
| **si algo se VE mal** | `shot name=MAP_X` | y solo aquí |
|
|
34
|
+
|
|
35
|
+
**Y la captura del CANAL no pinta los diálogos.** Lo dice la referencia del equipo del
|
|
36
|
+
framework: `getScreenshot` dibuja la ventana de la ACTIVIDAD, así que un diálogo abierto —el
|
|
37
|
+
«Error loading initial config» de XOne, por ejemplo— **no sale en ella** aunque la persona lo
|
|
38
|
+
esté viendo. Para saber qué hay encima está `screen` (trae `dialogs`) o `elements`. La captura
|
|
39
|
+
NATIVA (`xone-captura-android`, que es `adb screencap`) sí lo pinta, porque fotografía la
|
|
40
|
+
pantalla entera y no la ventana — y ésa es toda la diferencia entre las dos, no el formato.
|
|
41
|
+
|
|
42
|
+
**Antes de capturar, comprueba que hay algo que ver.** Si el log no da error y `screen`
|
|
43
|
+
contesta con su colección, la app está bien: no hay nada que diagnosticar en una foto. El
|
|
44
|
+
orden que sale barato es log → `screen` → y solo entonces, si lo que compruebas es VISUAL,
|
|
45
|
+
la captura acotada.
|
|
46
|
+
|
|
47
|
+
**Una captura NO es una herramienta de diagnóstico.** Para saber por qué algo falla están el
|
|
48
|
+
LOG y `elements`. La captura es para lo **visual** —texto cortado, un control tapado, algo
|
|
49
|
+
ilegible— o para cuando lo anterior no concluye.
|
|
50
|
+
|
|
51
|
+
**Y tiene un precio medido.** Una captura de pantalla completa (1080×2400) cuesta **3.375
|
|
52
|
+
tokens** en el revisor visual. El peso del fichero **da igual**: medido contra el proveedor,
|
|
53
|
+
52 KB y 766 KB con las mismas dimensiones cuestan exactamente lo mismo —se paga por PÍXELES—,
|
|
54
|
+
así que bajar `quality` ahorra disco y cero tokens. Lo que ahorra es `scale`, y sobre todo
|
|
55
|
+
acotar: `shot name=MAP_ACEPTAR` cuesta una fracción y además **dice qué se estaba probando**
|
|
56
|
+
en vez de ser una foto de la pantalla.
|
|
57
|
+
|
|
58
|
+
|
|
20
59
|
## Lo que hay que saber antes de tocar nada
|
|
21
60
|
|
|
22
61
|
- **HTTPS con certificado autofirmado** en las dos plataformas. Todas las URLs son `https://`;
|
|
@@ -56,13 +95,14 @@ xone-reiniciar-android --app MiApp
|
|
|
56
95
|
# «lanza la app», «despliégala»: la cadena ENTERA (túnel, ZIP, subida, reinicio, lanzamiento)
|
|
57
96
|
# y termina diciendo si la app está VIVA, con su árbol de controles.
|
|
58
97
|
xone-desplegar-android
|
|
59
|
-
xone-desplegar-android --captura # …y
|
|
98
|
+
xone-desplegar-android --captura # …y además captura: solo si quieres VERLO
|
|
60
99
|
xone-desplegar-android --app MiApp --serie emulator-5554
|
|
61
100
|
|
|
62
101
|
# Cualquier comando del catálogo de más abajo (varios en orden, si le pasas varios):
|
|
63
|
-
xone-hotswap
|
|
64
|
-
xone-hotswap
|
|
65
|
-
xone-hotswap
|
|
102
|
+
xone-hotswap elements # atajo de getAllElements format=xone
|
|
103
|
+
xone-hotswap shot # atajo de getScreenshot, a $XONECODE_ARTEFACTOS
|
|
104
|
+
xone-hotswap click name=MAP_BT_ACEPTAR
|
|
105
|
+
xone-hotswap waitForElement name=BTN_OK timeout=5000 -- click name=BTN_OK # UNA conexión
|
|
66
106
|
|
|
67
107
|
# Por qué algo no se pinta o la app se muere: las excepciones del aparato.
|
|
68
108
|
xone-log-android
|
|
@@ -83,10 +123,18 @@ sobre un proyecto real: la app arrancaba, el árbol de controles contestaba, y l
|
|
|
83
123
|
una fuente. Ni la captura ni `getAllElements` lo cuentan.
|
|
84
124
|
|
|
85
125
|
**Encadenar órdenes cuesta más que la orden.** Lo que devuelve cada una es pequeño —1,6 KB el
|
|
86
|
-
árbol de controles
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
126
|
+
árbol de controles— pero cada ida y vuelta reenvía la conversación entera, así que lo que se
|
|
127
|
+
paga son los VIAJES. Por eso `xone-hotswap` acepta varios comandos de golpe y los scripts
|
|
128
|
+
hacen la cadena entera en una orden.
|
|
129
|
+
|
|
130
|
+
**Pero una CAPTURA no entra en esa cuenta, y el número de antes engañaba.** Aquí decía «108
|
|
131
|
+
bytes la captura», que es lo que devuelve el comando —el fichero se guarda aparte— y no lo
|
|
132
|
+
que cuesta MIRARLA: medido contra el proveedor, una de 1080×2400 son **3.375 fichas** en el
|
|
133
|
+
revisor visual, pesen 52 KB o 766 KB (se paga por píxeles). Así que `--captura` no es «gratis
|
|
134
|
+
porque va en el mismo viaje»: sale cara en cuanto alguien la mira, y para diagnosticar un
|
|
135
|
+
fallo de arranque no hace falta — eso lo dice el log, con fichero y línea, por unas 50.
|
|
136
|
+
|
|
137
|
+
Úsala cuando quieras VER algo: que un control se ve cortado, tapado o ilegible.
|
|
90
138
|
|
|
91
139
|
Tres cosas de `xone-hotswap` que conviene saber antes de leer su salida:
|
|
92
140
|
|
|
@@ -283,3 +331,23 @@ Ninguno es del hotswap; los dos te van a costar una sesión si no los sabes.
|
|
|
283
331
|
|---|---|
|
|
284
332
|
| Los comandos, uno a uno: entrada, salida, errores y qué plataforma lo tiene | [references/comandos.md](references/comandos.md) |
|
|
285
333
|
| Llegar al dispositivo, desplegar una app, relanzarla, y los endpoints de fichero | [references/conexion-y-despliegue.md](references/conexion-y-despliegue.md) |
|
|
334
|
+
|
|
335
|
+
## El permiso que hace que un arranque arranque
|
|
336
|
+
|
|
337
|
+
`xone-desplegar-android` concede `SYSTEM_ALERT_WINDOW` por `appops` antes de lanzar, y no es
|
|
338
|
+
higiene: Android 10 y superiores BLOQUEAN que una app en segundo plano arranque una actividad, y
|
|
339
|
+
ese permiso es la exención que reconocen. El framework se va a segundo plano **con solo apagarse
|
|
340
|
+
la pantalla**, o en cuanto se cierra la app.
|
|
341
|
+
|
|
342
|
+
Sin él, `launchApplication` contesta `Cannot launch app while the framework is in the background`
|
|
343
|
+
y el despliegue parece que fue bien sin que arrancara nada. Si lo lanzas a mano:
|
|
344
|
+
|
|
345
|
+
```sh
|
|
346
|
+
adb shell appops set com.xone.android.framework SYSTEM_ALERT_WINDOW allow
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Y **dos cosas de la versión**: el framework va por **5.0.5.5dev** con **protocolo 3**. El saludo
|
|
350
|
+
no cambió de forma —solo de número— y nuestro cliente no exige ninguna, así que sigue valiendo.
|
|
351
|
+
Los comandos que llegaron con él (`getFields`, `openRecord`, `setGroup`, `setTrace`) están en
|
|
352
|
+
[`references/comandos.md`](references/comandos.md).
|
|
353
|
+
|
|
@@ -15,6 +15,39 @@ promesa de paridad que no se cumple, diagnosticarás mal. Las que más caro sale
|
|
|
15
15
|
|
|
16
16
|
Cómo llegar al dispositivo y cómo desplegar: [conexion-y-despliegue.md](conexion-y-despliegue.md).
|
|
17
17
|
|
|
18
|
+
## Lo que llegó con el framework 5.0.5.5dev (protocolo 3)
|
|
19
|
+
|
|
20
|
+
Tres comandos y un modo de traza que la referencia anterior no tenía. Salen del pack de
|
|
21
|
+
`dispositivo-xone`, que es la documentación del equipo del framework.
|
|
22
|
+
|
|
23
|
+
| comando | campos | qué hace |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `getFields` | `names` (**sí**: array o lista separada por comas) | Varios campos en UN viaje, cada uno leído como lo leería `getText`. Devuelve `fields`, con `value` **o** `error` por campo. No acepta `name`. |
|
|
26
|
+
| `openRecord` | `collection` (sí), `where` | Abre la ficha de un registro **directamente**, sin menú, lista ni scroll. |
|
|
27
|
+
| `setGroup` | `group` (sí) | Lleva la pantalla a ese grupo. No acepta `name` ni fila. |
|
|
28
|
+
| `setTrace` | `enabled` | Enciende la traza de ejecución línea a línea. Apagada por omisión. |
|
|
29
|
+
|
|
30
|
+
Cuatro cosas de estos que no se deducen:
|
|
31
|
+
|
|
32
|
+
- **`getFields` es la forma barata de leer varios valores.** Un campo que falle **no tumba a los
|
|
33
|
+
demás**: viene con su `error` mientras los otros traen su `value`, y eso es lo que distingue un
|
|
34
|
+
campo vacío de uno que no se pudo leer.
|
|
35
|
+
- **Cada `openRecord` APILA una ficha más, no sustituye a la anterior.** Medido por el equipo del
|
|
36
|
+
framework: con dos seguidos, el primer `pressKey keyCode=4` devuelve a la ficha anterior y no a
|
|
37
|
+
la pantalla de partida. Al recorrer varios registros hay que cerrar cada ficha antes de abrir la
|
|
38
|
+
siguiente.
|
|
39
|
+
- **A un grupo se llega con `setGroup`, NUNCA con `scroll`.** El contenedor de grupos no arrastra
|
|
40
|
+
cuando el gesto nace encima de un control —tampoco con el dedo de una persona—, y un comando solo
|
|
41
|
+
sabe apuntar a controles: por ahí no se llega nunca, por bien que se entregue el gesto. El nombre
|
|
42
|
+
es el del volcado (`type: "group"`), no el rótulo de su pestaña, y el cambio es ANIMADO, así que
|
|
43
|
+
se confirma con `elements` o `waitForElement` y no por la respuesta.
|
|
44
|
+
- `setGroup` y `pressKey` son los dos únicos que **no aceptan** los campos de selección de control
|
|
45
|
+
(`name`, `row`, `content`, `where`): no apuntan a ningún control.
|
|
46
|
+
|
|
47
|
+
Y `getFields` se suma a la lista de los que devuelven su objeto **serializado dentro de `status`**
|
|
48
|
+
—con `getAllElements`, `getCurrentScreen` y `getRows`—, así que hay que volver a parsear esa cadena.
|
|
49
|
+
|
|
50
|
+
|
|
18
51
|
## Tipos de respuesta
|
|
19
52
|
|
|
20
53
|
| Tipo | JSON resultante | iOS |
|
|
@@ -22,7 +22,7 @@ Con varios dispositivos: `adb -s <serial> forward tcp:8443 tcp:8443`. Para desha
|
|
|
22
22
|
**El canal de los comandos es un WebSocket, y vive en `/hotswap`.** Medido el 16-sep-2026 contra
|
|
23
23
|
`com.xone.android.framework` **5.0.2.2dev** (flavor standalone, Android): `wss://127.0.0.1:8443/hotswap`
|
|
24
24
|
contesta `101`, mientras que `/`, `/ws` y `/api` contestan `400`. Y **el servidor habla primero**: al
|
|
25
|
-
abrir manda `{"command":"server_hello","protocol_version":
|
|
25
|
+
abrir manda `{"command":"server_hello","protocol_version":3}`, así que el cliente ESPERA el saludo en
|
|
26
26
|
vez de provocarlo. En esta versión `POST /command` por HTTP da **404** — los comandos van por el
|
|
27
27
|
WebSocket—, y por eso el `curl` de más abajo es solo para iOS.
|
|
28
28
|
|
|
@@ -224,3 +224,63 @@ En iOS, `POST /command` responde con el JSON del comando (incluido el de error),
|
|
|
224
224
|
que supere su tope responde también JSON en vez de cortar la conexión. **Un cuerpo enviado sin
|
|
225
225
|
`Content-Length` (`Transfer-Encoding: chunked`) funciona**: es el modo por defecto de varios
|
|
226
226
|
clientes HTTP, entre ellos el `http` de Node.
|
|
227
|
+
|
|
228
|
+
## El permiso de overlay, y por qué `launchApplication` fallaba
|
|
229
|
+
|
|
230
|
+
**Esto es preflight, no un extra.** Sin el permiso de dibujar sobre otras apps,
|
|
231
|
+
`launchApplication` **no puede arrancar nada mientras el framework esté en segundo plano**:
|
|
232
|
+
Android 10 y superiores bloquean el arranque de actividades desde ahí, y ese permiso es la
|
|
233
|
+
exención que reconocen.
|
|
234
|
+
|
|
235
|
+
```sh
|
|
236
|
+
adb shell appops set com.xone.android.framework SYSTEM_ALERT_WINDOW allow
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Y el framework se queda en segundo plano **con solo apagarse la pantalla**, o en cuanto
|
|
240
|
+
`exitApplication` cierra la app — así que sin conceder el permiso cualquier reinicio es una
|
|
241
|
+
carrera contra el foco. Con él, el bucle de trabajo deja de depender de que la pantalla esté
|
|
242
|
+
encendida. Es idempotente: se puede volver a lanzar sin mirar.
|
|
243
|
+
|
|
244
|
+
Esto explica el síntoma que teníamos apuntado como «`result:true` significa *aceptado*, no
|
|
245
|
+
*arrancó*»: buena parte de esos arranques que no arrancaban eran este permiso, y el mensaje
|
|
246
|
+
del servidor lo dice — `Cannot launch app while the framework is in the background`.
|
|
247
|
+
|
|
248
|
+
```sh
|
|
249
|
+
adb shell appops get com.xone.android.framework SYSTEM_ALERT_WINDOW # 'allow' = concedido
|
|
250
|
+
adb shell appops set com.xone.android.framework SYSTEM_ALERT_WINDOW default # revertir
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Y el paquete cambia de flavor**: en el de Play Store es `com.xone.android.developer.framework`.
|
|
254
|
+
|
|
255
|
+
## Cuando el `curl` de comprobación no contesta
|
|
256
|
+
|
|
257
|
+
Tres causas, en este orden:
|
|
258
|
+
|
|
259
|
+
1. **El proceso de la app no está vivo.** El servidor solo existe en builds *debuggable* y
|
|
260
|
+
arranca con el proceso. La pantalla del servidor lo levanta y además enseña IP y puerto
|
|
261
|
+
reales:
|
|
262
|
+
`adb shell am start -n com.xone.android.framework/com.xone.android.hotswap.activities.SetupActivity`
|
|
263
|
+
2. **El puerto no es 8443.** Si estaba ocupado —lo normal con DOS APK de framework
|
|
264
|
+
instaladas— el servidor tomó el siguiente libre. El override guardado se lee con
|
|
265
|
+
`adb shell run-as com.xone.android.framework cat shared_prefs/hotswap_preferences.xml`
|
|
266
|
+
(claves `port_number` y `use_secure_connection`); si no dice nada, se sondea 8443–8446
|
|
267
|
+
rehaciendo el forward a cada puerto remoto.
|
|
268
|
+
3. **El SSL está desactivado** (`use_secure_connection` a `false`): entonces el servidor habla
|
|
269
|
+
`http://` y el cliente tiene que ir en claro.
|
|
270
|
+
|
|
271
|
+
Por LAN en vez de USB no hay forward: se apunta a la IP del dispositivo, la que enseña la barra
|
|
272
|
+
superior de esa pantalla.
|
|
273
|
+
|
|
274
|
+
## Dos cosas del despliegue que no dan ningún error cuando se hacen mal
|
|
275
|
+
|
|
276
|
+
- **El ZIP debe llamarse EXACTAMENTE `debug_app_update.zip`**: el nombre es lo que dispara la
|
|
277
|
+
descompresión en el dispositivo. Y su contenido es lo que irá dentro de `app_<appname>`, **sin
|
|
278
|
+
carpeta raíz que lo envuelva**.
|
|
279
|
+
- **El ZIP no limpia el destino**: añade y sobrescribe, no borra. Un fichero que quitaste del
|
|
280
|
+
proyecto sigue en el dispositivo. Para un despliegue desde cero hay que vaciar `app_<appname>`
|
|
281
|
+
antes — y eso se PIDE, no se hace.
|
|
282
|
+
- **`appName` se baja a minúsculas** para formar el directorio: `MiApp` → `app_miapp`.
|
|
283
|
+
- Y los `-wal`, `-shm` y `-journal` de una base de datos **ya no hay que borrarlos a mano**: al
|
|
284
|
+
reemplazar una base, suelta o dentro del ZIP, se cierra lo que hubiera abierto y se van sus
|
|
285
|
+
ficheros auxiliares. Antes, olvidarlo dejaba la base corrupta **sin dar ningún error**.
|
|
286
|
+
|
|
@@ -36,7 +36,7 @@ if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
|
36
36
|
xone-arrancar-ios --app MiApp además lanza esa app
|
|
37
37
|
|
|
38
38
|
NO despliega el proyecto: en iOS no hay /file_upload y eso no está medido. Después, los comandos
|
|
39
|
-
van por: HOTSWAP_URL=wss://localhost:8443/hotswap xone-hotswap
|
|
39
|
+
van por: HOTSWAP_URL=wss://localhost:8443/hotswap xone-hotswap getAllElements`);
|
|
40
40
|
process.exit(0);
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Una captura de la pantalla del aparato, POR LA VÍA NATIVA, a la carpeta de artefactos.
|
|
4
4
|
*
|
|
5
|
-
* POR QUÉ EXISTE, si el canal ya sabe capturar. `xone-hotswap
|
|
5
|
+
* POR QUÉ EXISTE, si el canal ya sabe capturar. `xone-hotswap shot`
|
|
6
6
|
* es la vía buena —la pide la app host, así que sale lo que la app pinta— pero necesita el
|
|
7
7
|
* túnel y la app viva. Cuando eso no está, lo único que queda es `adb exec-out screencap`, y
|
|
8
8
|
* medido: el modelo la compone él y redirige la salida a un fichero, que en el `cwd` de la
|
|
@@ -35,7 +35,7 @@ if (args.includes("--help") || args.includes("-h")) {
|
|
|
35
35
|
xone-captura-android --serie <id> con varios aparatos conectados
|
|
36
36
|
|
|
37
37
|
Es la vía de RESPALDO: si el túnel y la app host están vivos, la buena es
|
|
38
|
-
\`xone-hotswap
|
|
38
|
+
\`xone-hotswap shot\`, que captura lo que la app pinta.
|
|
39
39
|
Nunca redirijas \`adb exec-out screencap\` a un fichero: el \`cwd\` es la raíz del
|
|
40
40
|
proyecto del usuario y ahí no se escribe.`);
|
|
41
41
|
process.exit(0);
|
|
@@ -58,7 +58,21 @@ const serie = opcion("serie");
|
|
|
58
58
|
// `basename` y no la cadena tal cual: el nombre lo elige el modelo, y un `../` aquí escribiría
|
|
59
59
|
// fuera de la carpeta de la sesión. Misma regla que `esRutaDeArtefacto` en el host.
|
|
60
60
|
const pedido = opcion("nombre");
|
|
61
|
-
|
|
61
|
+
/**
|
|
62
|
+
* **La EXTENSIÓN se pone si falta, y no es cosmética.**
|
|
63
|
+
*
|
|
64
|
+
* Medido en una sesión: el agente pidió `--nombre arranque_error` y el fichero quedó sin
|
|
65
|
+
* extensión. Lo que hizo después es el coste: **tres comandos más** —`file` para averiguar
|
|
66
|
+
* qué había bajado, `sips` para sus dimensiones y un `python3 -c "from PIL import Image…"`
|
|
67
|
+
* para intentar abrirlo—. Un artefacto sin extensión tampoco se sabe pintar: `mimeDeArtefacto`
|
|
68
|
+
* decide por la extensión y sin ella no afirma nada, así que la tarjeta del chat no lo enseña
|
|
69
|
+
* y el revisor visual no lo acepta.
|
|
70
|
+
*
|
|
71
|
+
* Se AÑADE en vez de rechazar: lo que el modelo quería está claro y un «no» aquí cuesta otro
|
|
72
|
+
* viaje para lo mismo.
|
|
73
|
+
*/
|
|
74
|
+
const conExtension = (n) => (/\.[A-Za-z0-9]{2,4}$/.test(n) ? n : `${n}.png`);
|
|
75
|
+
const nombre = pedido === undefined ? `captura-${Date.now()}.png` : conExtension(basename(pedido));
|
|
62
76
|
if (nombre === "" || nombre === "." || nombre === "..") {
|
|
63
77
|
console.error("ese nombre no vale para un fichero.");
|
|
64
78
|
process.exit(1);
|
|
@@ -82,6 +96,80 @@ if (bytes.length === 0) {
|
|
|
82
96
|
process.exit(1);
|
|
83
97
|
}
|
|
84
98
|
|
|
99
|
+
/**
|
|
100
|
+
* **Si XOne ha reventado, el LOG basta y la captura sobra.**
|
|
101
|
+
*
|
|
102
|
+
* Visto tres veces en sesiones reales: la app no arranca, y quien diagnostica fotografía el
|
|
103
|
+
* diálogo de error. La foto es legítima —el diálogo ES el error— pero **lo mismo está en el
|
|
104
|
+
* log en texto**, con fichero, línea, columna y la línea culpable, y cuesta unas 50 fichas
|
|
105
|
+
* contra las **3.375** que cuesta una captura de 1080×2400 en el revisor visual. Setenta veces
|
|
106
|
+
* más por saber lo mismo.
|
|
107
|
+
*
|
|
108
|
+
* Así que no se captura: se enseña la excepción y se dice por qué. Con `--igualmente` se
|
|
109
|
+
* captura de todos modos, que para una comprobación VISUAL —algo cortado, algo tapado— sigue
|
|
110
|
+
* siendo la herramienta buena aunque haya una excepción por ahí.
|
|
111
|
+
*
|
|
112
|
+
* Se mira acotado al PROCESO (`--pid`) y no a las últimas N líneas del aparato: 600 líneas de
|
|
113
|
+
* todo son un par de minutos aquí, y la excepción se sale de esa ventana — el mismo fallo que
|
|
114
|
+
* tenía `xone-desplegar-android`.
|
|
115
|
+
*/
|
|
116
|
+
if (!args.includes("--igualmente")) {
|
|
117
|
+
let roto;
|
|
118
|
+
try {
|
|
119
|
+
const enElAparato = (...partes) =>
|
|
120
|
+
execFileSync("adb", [...(serie ? ["-s", serie] : []), ...partes], {
|
|
121
|
+
encoding: "utf8",
|
|
122
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
123
|
+
});
|
|
124
|
+
const pid = enElAparato("shell", "pidof", "com.xone.android.framework").trim().split(/\s+/)[0];
|
|
125
|
+
if (pid) {
|
|
126
|
+
const log = enElAparato("logcat", "-d", "--pid", pid, "-t", "600");
|
|
127
|
+
const filas = log.split("\n");
|
|
128
|
+
const i = filas.findIndex((l) => l.includes("XOneJavascriptException"));
|
|
129
|
+
if (i >= 0) {
|
|
130
|
+
roto = filas
|
|
131
|
+
.slice(i, i + 12)
|
|
132
|
+
.map((l) => l.replace(/^.*?\bSystem\.err:\s?/, "").trim())
|
|
133
|
+
.filter((l) => l !== "" && !l.startsWith("at "))
|
|
134
|
+
.slice(0, 6)
|
|
135
|
+
.join("\n");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} catch {
|
|
139
|
+
// Sin log no hay nada que objetar: se captura.
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* **Y si NO hay error, se dice también.** Es la otra mitad de la misma regla: si el log no
|
|
143
|
+
* da excepción y la app contesta en qué colección está, no hay nada que diagnosticar en una
|
|
144
|
+
* foto — y capturar «por si acaso» es el caso que más se repite. No se BLOQUEA, porque
|
|
145
|
+
* comprobar algo VISUAL sobre una app sana es legítimo y es para lo que la captura sirve;
|
|
146
|
+
* lo que se hace es decirle a quien la pidió lo que ya se sabe, para que no la pida por
|
|
147
|
+
* costumbre.
|
|
148
|
+
*/
|
|
149
|
+
if (roto === undefined) {
|
|
150
|
+
try {
|
|
151
|
+
const cliente = join(import.meta.dirname, "xone-hotswap");
|
|
152
|
+
const donde = execFileSync("node", [cliente, "screen"], { encoding: "utf8" }).trim();
|
|
153
|
+
const m = /\\"collection\\":\\"([^\\"]+)/.exec(donde);
|
|
154
|
+
if (m) {
|
|
155
|
+
console.log(`(el log no da error y la app responde en «${m[1]}»: si buscabas un fallo,`);
|
|
156
|
+
console.log(" no lo hay. Capturo igual, que para lo VISUAL es la herramienta buena.)");
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
// Sin canal no se puede decir nada del estado: se captura y ya.
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (roto !== undefined) {
|
|
163
|
+
console.log("NO capturo: XOne reventó al cargar y eso ya está en el log, en texto:");
|
|
164
|
+
console.log("");
|
|
165
|
+
console.log(roto);
|
|
166
|
+
console.log("");
|
|
167
|
+
console.log("Ahí tienes fichero, línea y columna. Una captura del diálogo diría lo mismo");
|
|
168
|
+
console.log("y cuesta ~3.375 fichas. Si de verdad quieres la imagen: --igualmente.");
|
|
169
|
+
process.exit(0);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
85
173
|
const destino = join(ARTEFACTOS, nombre);
|
|
86
174
|
try {
|
|
87
175
|
writeFileSync(destino, bytes);
|