xonecode 0.5.1 → 0.8.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.
- package/apps/web/dist/assets/{index-BB3SamhR.css → index-Boak51UP.css} +1 -1
- package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
- package/apps/web/dist/assets/{php-D_2--9WK.js → php-Cu6F_QCJ.js} +1 -1
- package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-BiqQPoC6.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +10 -0
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
- package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
- package/dist/agent/{descarga.js → cloudstudio/descarga.js} +17 -7
- package/dist/agent/cloudstudio/descarga.js.map +1 -0
- package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
- package/dist/agent/cloudstudio/ramaActiva.js +11 -0
- package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
- package/dist/agent/{subida.js → cloudstudio/subida.js} +16 -7
- package/dist/agent/cloudstudio/subida.js.map +1 -0
- package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
- package/dist/agent/cloudstudio/zip.js.map +1 -0
- package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
- package/dist/agent/config/authEnDisco.js.map +1 -0
- package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +47 -1
- package/dist/agent/config/catalogoModelos.js.map +1 -0
- package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
- package/dist/agent/config/configEnDisco.js.map +1 -0
- package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
- package/dist/agent/config/crearProyecto.js.map +1 -0
- package/dist/agent/config/entorno.js.map +1 -0
- package/dist/agent/config/gemini.js.map +1 -0
- package/dist/agent/config/modelos.js +235 -0
- package/dist/agent/config/modelos.js.map +1 -0
- package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
- package/dist/agent/config/modelosDeMotor.js.map +1 -0
- package/dist/agent/config/mudanzaEnDisco.js +121 -0
- package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
- package/dist/agent/{persona.js → config/persona.js} +1 -1
- package/dist/agent/config/persona.js.map +1 -0
- package/dist/agent/config/selectorEnMaquina.js +45 -0
- package/dist/agent/config/selectorEnMaquina.js.map +1 -0
- package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +37 -2
- package/dist/agent/config/settingsEnDisco.js.map +1 -0
- package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
- package/dist/agent/config/versionEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
- package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
- package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/hotswap.js.map +1 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +152 -0
- package/dist/agent/dispositivos/juezVisual.js.map +1 -0
- package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
- package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
- package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
- package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
- package/dist/agent/exportarPdf.js +140 -0
- package/dist/agent/exportarPdf.js.map +1 -0
- package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
- package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
- package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
- package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
- package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
- package/dist/agent/grafo/busquedaRegex.js.map +1 -0
- package/dist/agent/grafo/criticaVisual.js +115 -0
- package/dist/agent/grafo/criticaVisual.js.map +1 -0
- package/dist/agent/grafo/excluirTools.js +82 -0
- package/dist/agent/grafo/excluirTools.js.map +1 -0
- package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
- package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +231 -0
- package/dist/agent/grafo/navegacionXone.js.map +1 -0
- package/dist/agent/{perfiles.js → grafo/perfiles.js} +96 -10
- package/dist/agent/grafo/perfiles.js.map +1 -0
- package/dist/agent/{proyecto.js → grafo/proyecto.js} +274 -24
- package/dist/agent/grafo/proyecto.js.map +1 -0
- package/dist/agent/grafo/skills.js +425 -0
- package/dist/agent/grafo/skills.js.map +1 -0
- package/dist/agent/grafo/xoneAgent.js +566 -0
- package/dist/agent/grafo/xoneAgent.js.map +1 -0
- package/dist/agent/navegacion/estilosEnDisco.js +110 -0
- package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/hechosEnDisco.js +26 -0
- package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +36 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
- package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
- package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
- package/dist/agent/raizDelPaquete.js +56 -0
- package/dist/agent/raizDelPaquete.js.map +1 -0
- package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +1 -1
- package/dist/agent/sesiones/checkpointer.js.map +1 -0
- package/dist/agent/sesiones/git.js.map +1 -0
- package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
- package/dist/agent/sesiones/gitSync.js.map +1 -0
- package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -0
- package/dist/agent/subagentes/agentesEnDisco.js +818 -0
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
- package/dist/agent/subagentes/consumoExterno.js.map +1 -0
- package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
- package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
- package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +59 -6
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
- package/dist/agent/subagentes/pluginDeSkills.js +99 -0
- package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
- package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +48 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
- package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +53 -1
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
- package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
- package/dist/agent/tareas/aumentador.js.map +1 -0
- package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +6 -6
- package/dist/agent/tareas/juezDeTarea.js.map +1 -0
- package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +53 -4
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
- package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +5 -1
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
- package/dist/agent/turno/guionizado.js.map +1 -0
- package/dist/agent/turno/informeDeTraza.js +245 -0
- package/dist/agent/turno/informeDeTraza.js.map +1 -0
- package/dist/agent/turno/inspectorDePrompt.js +205 -0
- package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
- package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
- package/dist/agent/turno/instantanea.js.map +1 -0
- package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
- package/dist/agent/turno/interrupts.js.map +1 -0
- package/dist/agent/turno/mensajes.js.map +1 -0
- package/dist/agent/turno/normalizar.js.map +1 -0
- package/dist/agent/{puente.js → turno/puente.js} +71 -4
- package/dist/agent/turno/puente.js.map +1 -0
- package/dist/agent/turno/resumenDeContexto.js +260 -0
- package/dist/agent/turno/resumenDeContexto.js.map +1 -0
- package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +33 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -0
- package/dist/agent/turno/rubrica.js +91 -0
- package/dist/agent/turno/rubrica.js.map +1 -0
- package/dist/agent/turno/textoDeTool.js.map +1 -0
- package/dist/agent/{turnoReal.js → turno/turnoReal.js} +210 -25
- package/dist/agent/turno/turnoReal.js.map +1 -0
- package/dist/agent/turno/verificador.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +72 -9
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/describe.js +2 -2
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/fuentesDeDisco.js +29 -0
- package/dist/cli/fuentesDeDisco.js.map +1 -0
- package/dist/cli/main.js +87 -31
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +40 -10
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/traza.js +48 -0
- package/dist/cli/traza.js.map +1 -0
- package/dist/cli/tui/correrTui.js +4 -4
- package/dist/cli/tui/correrTui.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/core/actos.js +1 -1
- package/dist/core/adjuntos.js +2 -2
- package/dist/core/agentes.js +247 -7
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/artefactos.js +4 -4
- package/dist/core/config.js +1 -1
- package/dist/core/contextos.js +12 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +1 -1
- package/dist/core/dispositivos.js +53 -3
- package/dist/core/dispositivos.js.map +1 -1
- package/dist/core/esfuerzo.js +141 -0
- package/dist/core/esfuerzo.js.map +1 -0
- package/dist/core/esqueleto.js +1 -1
- package/dist/core/estilos.js +78 -0
- package/dist/core/estilos.js.map +1 -0
- package/dist/core/exportacion.js +140 -0
- package/dist/core/exportacion.js.map +1 -0
- package/dist/core/hechosDelProyecto.js +87 -0
- package/dist/core/hechosDelProyecto.js.map +1 -0
- package/dist/core/logDeDispositivo.js +143 -0
- package/dist/core/logDeDispositivo.js.map +1 -0
- package/dist/core/modelos.js +48 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/mudanzaDeWorkspace.js +93 -0
- package/dist/core/mudanzaDeWorkspace.js.map +1 -0
- package/dist/core/navegacion.js +134 -0
- package/dist/core/navegacion.js.map +1 -0
- package/dist/core/notify.js +5 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +1 -1
- package/dist/core/planes.js +70 -0
- package/dist/core/planes.js.map +1 -0
- package/dist/core/ports.js +4 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/rubrica.js +90 -0
- package/dist/core/rubrica.js.map +1 -0
- package/dist/core/selectorDeCarpeta.js +87 -0
- package/dist/core/selectorDeCarpeta.js.map +1 -0
- package/dist/core/settings.js +56 -7
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +144 -0
- package/dist/core/shellDeAgente.js.map +1 -0
- package/dist/core/skills.js +158 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/topeAgotado.js +69 -0
- package/dist/core/topeAgotado.js.map +1 -0
- package/dist/core/zipDeSkill.js +107 -0
- package/dist/core/zipDeSkill.js.map +1 -0
- package/dist/web/servidor/arranque.js +853 -54
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/corredorDeTareas.js +3 -3
- package/dist/web/servidor/corredorDeTareas.js.map +1 -1
- package/dist/web/servidor/sesiones.js +34 -6
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/transporte.js +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +62 -13
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +7 -4
- package/skills/archify/SKILL.md +25 -2
- package/skills/artifacts-builder/SKILL.md +23 -0
- package/skills/xone-hotswap/SKILL.md +96 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +439 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +201 -0
- package/skills/xone-hotswap/scripts/xone-log-android +102 -0
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +132 -0
- package/skills/xone-plan-builder/SKILL.md +22 -4
- package/skills/xone-spec-builder/SKILL.md +37 -7
- package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
- package/dist/agent/agentesEnDisco.js +0 -539
- package/dist/agent/agentesEnDisco.js.map +0 -1
- package/dist/agent/arbolDeProyecto.js.map +0 -1
- package/dist/agent/artefactosEnDisco.js.map +0 -1
- package/dist/agent/aumentador.js.map +0 -1
- package/dist/agent/authEnDisco.js.map +0 -1
- package/dist/agent/busquedaRegex.js.map +0 -1
- package/dist/agent/catalogoModelos.js.map +0 -1
- package/dist/agent/checkpointer.js.map +0 -1
- package/dist/agent/cloudstudioClient.js.map +0 -1
- package/dist/agent/cloudstudioMcp.js.map +0 -1
- package/dist/agent/configEnDisco.js.map +0 -1
- package/dist/agent/consumoExterno.js.map +0 -1
- package/dist/agent/crearProyecto.js.map +0 -1
- package/dist/agent/descarga.js.map +0 -1
- package/dist/agent/diagnosticoDeTools.js.map +0 -1
- package/dist/agent/dispositivosEnMaquina.js.map +0 -1
- package/dist/agent/entorno.js.map +0 -1
- package/dist/agent/escrituraDeCodex.js.map +0 -1
- package/dist/agent/escrituraDeOpencode.js.map +0 -1
- package/dist/agent/escrituraExterna.js.map +0 -1
- package/dist/agent/gemini.js.map +0 -1
- package/dist/agent/git.js.map +0 -1
- package/dist/agent/gitSync.js.map +0 -1
- package/dist/agent/guionizado.js.map +0 -1
- package/dist/agent/hotswap.js.map +0 -1
- package/dist/agent/instalacionEnMaquina.js.map +0 -1
- package/dist/agent/instantanea.js.map +0 -1
- package/dist/agent/interrupts.js.map +0 -1
- package/dist/agent/juezDeTarea.js.map +0 -1
- package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
- package/dist/agent/manifiesto.js.map +0 -1
- package/dist/agent/memoriaDeProyecto.js.map +0 -1
- package/dist/agent/mensajes.js.map +0 -1
- package/dist/agent/modelos.js +0 -130
- package/dist/agent/modelos.js.map +0 -1
- package/dist/agent/modelosDeMotor.js.map +0 -1
- package/dist/agent/normalizar.js.map +0 -1
- package/dist/agent/paqueteDelProyecto.js.map +0 -1
- package/dist/agent/perfiles.js.map +0 -1
- package/dist/agent/persona.js.map +0 -1
- package/dist/agent/procesosEnMaquina.js.map +0 -1
- package/dist/agent/proyecto.js.map +0 -1
- package/dist/agent/puente.js.map +0 -1
- package/dist/agent/resumenDeContexto.js +0 -30
- package/dist/agent/resumenDeContexto.js.map +0 -1
- package/dist/agent/resumenDeTool.js.map +0 -1
- package/dist/agent/sesionGit.js.map +0 -1
- package/dist/agent/settingsEnDisco.js.map +0 -1
- package/dist/agent/skills.js +0 -65
- package/dist/agent/skills.js.map +0 -1
- package/dist/agent/subagenteCodex.js.map +0 -1
- package/dist/agent/subagenteExterno.js.map +0 -1
- package/dist/agent/subagenteOpencode.js.map +0 -1
- package/dist/agent/subida.js.map +0 -1
- package/dist/agent/tareasEnDisco.js.map +0 -1
- package/dist/agent/textoDeTool.js.map +0 -1
- package/dist/agent/turnoReal.js.map +0 -1
- package/dist/agent/verificador.js.map +0 -1
- package/dist/agent/versionEnDisco.js.map +0 -1
- package/dist/agent/xoneAgent.js +0 -347
- package/dist/agent/xoneAgent.js.map +0 -1
- package/dist/agent/zip.js.map +0 -1
- /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
- /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
- /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
- /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
- /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
- /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
- /package/dist/agent/{git.js → sesiones/git.js} +0 -0
- /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
- /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
- /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
- /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
- /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
- /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
- /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* El log del aparato, acotado a lo que sirve para diagnosticar: excepciones y errores del host.
|
|
4
|
+
*
|
|
5
|
+
* POR QUÉ NO ES `adb logcat` A SECAS. Un volcado crudo de este emulador son megabytes de
|
|
6
|
+
* `WindowManager` y `Transition requested`, con líneas sueltas de 2 KB: metido en el contexto de
|
|
7
|
+
* un agente cuesta más que todo el turno y entierra justo lo que se busca. Aquí se filtra por el
|
|
8
|
+
* **PID del host** —así sale TODO lo suyo, incluidas las excepciones de JavaScript del runtime
|
|
9
|
+
* XOne— y, aparte, los `FATAL`/`AndroidRuntime` de cualquiera, que son los que cuentan cuando la
|
|
10
|
+
* app se acaba de morir y ya no tiene PID.
|
|
11
|
+
*
|
|
12
|
+
* **Nunca sigue el log.** `adb logcat` sin `-d` no termina jamás, y un comando que no termina
|
|
13
|
+
* cuelga el turno entero. Si quieres aislar lo que pasa a partir de ahora: `--limpiar`, haces lo
|
|
14
|
+
* que sea, y vuelves a pedirlo.
|
|
15
|
+
*
|
|
16
|
+
* USO:
|
|
17
|
+
* xone-log-android errores y excepciones recientes
|
|
18
|
+
* xone-log-android --lineas 400 más cola
|
|
19
|
+
* xone-log-android --todo todo lo del host, no solo errores
|
|
20
|
+
* xone-log-android --limpiar vacía el buffer y sale (para aislar lo siguiente)
|
|
21
|
+
* xone-log-android --serie emulator-5554
|
|
22
|
+
*/
|
|
23
|
+
import { execFileSync } from "node:child_process";
|
|
24
|
+
|
|
25
|
+
const PAQUETE = "com.xone.android.framework";
|
|
26
|
+
|
|
27
|
+
const args = process.argv.slice(2);
|
|
28
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
29
|
+
console.error(`xone-log-android — el log del aparato, acotado al host de XOne.
|
|
30
|
+
|
|
31
|
+
xone-log-android errores y excepciones recientes (por omisión, 200 líneas)
|
|
32
|
+
xone-log-android --lineas 400 más cola
|
|
33
|
+
xone-log-android --todo todo lo del host, no solo errores
|
|
34
|
+
xone-log-android --limpiar vacía el buffer y sale, para aislar lo que pase después
|
|
35
|
+
xone-log-android --serie <id> con varios aparatos conectados
|
|
36
|
+
|
|
37
|
+
Filtra por el PID del host, así que trae también las excepciones de JavaScript del runtime.
|
|
38
|
+
Nunca sigue el log: un comando que no termina cuelga el turno.`);
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const opcion = (nombre) => {
|
|
43
|
+
const i = args.indexOf(`--${nombre}`);
|
|
44
|
+
return i >= 0 ? args[i + 1] : undefined;
|
|
45
|
+
};
|
|
46
|
+
const serie = opcion("serie");
|
|
47
|
+
const adb = (...partes) =>
|
|
48
|
+
execFileSync("adb", [...(serie ? ["-s", serie] : []), ...partes], {
|
|
49
|
+
encoding: "utf8",
|
|
50
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (args.includes("--limpiar")) {
|
|
54
|
+
adb("logcat", "-c");
|
|
55
|
+
console.log("buffer del log vaciado. Haz lo que quieras aislar y vuelve a pedir el log.");
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const lineas = Number(opcion("lineas") ?? 200);
|
|
60
|
+
const todo = args.includes("--todo");
|
|
61
|
+
|
|
62
|
+
/** El PID del host, si está vivo. Sin él no se puede acotar por proceso: se dice y se sigue. */
|
|
63
|
+
let pid;
|
|
64
|
+
try {
|
|
65
|
+
pid = adb("shell", "pidof", PAQUETE).trim().split(/\s+/)[0];
|
|
66
|
+
} catch {
|
|
67
|
+
pid = undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const salida = [];
|
|
71
|
+
|
|
72
|
+
if (pid !== undefined && pid !== "") {
|
|
73
|
+
const suyo = adb("logcat", "-d", "--pid", pid, "-t", String(lineas));
|
|
74
|
+
salida.push(`--- ${PAQUETE} (pid ${pid}) ---`);
|
|
75
|
+
salida.push(todo ? suyo : soloInteresante(suyo));
|
|
76
|
+
} else {
|
|
77
|
+
salida.push(`--- ${PAQUETE} no está vivo ahora mismo: solo queda lo que dejó escrito ---`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Las caídas duras van aparte y SIN el PID, a propósito: cuando una app se muere, el proceso
|
|
82
|
+
* que escribió la excepción ya no existe, así que filtrar por PID se lleva por delante justo la
|
|
83
|
+
* traza que explica la muerte.
|
|
84
|
+
*/
|
|
85
|
+
const caidas = adb("logcat", "-d", "-t", String(lineas * 4), "AndroidRuntime:E", "DEBUG:F", "*:F", "*:S").trim();
|
|
86
|
+
if (caidas !== "") {
|
|
87
|
+
salida.push("", "--- caídas duras (cualquier proceso) ---", caidas);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Lo que merece la pena leer de un volcado del host: errores, avisos y trazas de excepción. */
|
|
91
|
+
function soloInteresante(texto) {
|
|
92
|
+
const filas = texto.split("\n").filter((l) => {
|
|
93
|
+
if (/^\s*$/.test(l)) return false;
|
|
94
|
+
// El nivel va tras el PID/TID: `09-18 08:21:17.053 815 880 E Tag: mensaje`.
|
|
95
|
+
if (/\s[EWF]\s/.test(l)) return true;
|
|
96
|
+
// Y el cuerpo de una traza de Java, que no lleva nivel en cada línea.
|
|
97
|
+
return /\bat [\w$.]+\(|Caused by:|Exception|Error:/.test(l);
|
|
98
|
+
});
|
|
99
|
+
return filas.length === 0 ? "(sin errores ni avisos en esas líneas)" : filas.join("\n");
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log(salida.join("\n"));
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Dejar el host de Android en un estado conocido: matarlo y volver a levantarlo.
|
|
4
|
+
*
|
|
5
|
+
* POR QUÉ EXISTE. El host guarda la última app ejecutada y la reabre al arrancar, así que si
|
|
6
|
+
* esa app se quedó en un diálogo de error —o simplemente colgada— el canal **no contesta** y
|
|
7
|
+
* cualquier comando que mandes muere con «no se pudo hablar con el aparato». Desde fuera eso
|
|
8
|
+
* se lee como «no hay dispositivo», que es el diagnóstico equivocado: el aparato está, el
|
|
9
|
+
* framework está, y lo que hay es una app atascada delante.
|
|
10
|
+
*
|
|
11
|
+
* Es la primera orden que conviene correr al empezar con un aparato, y la que hay que probar
|
|
12
|
+
* antes de concluir que algo no funciona.
|
|
13
|
+
*
|
|
14
|
+
* USO:
|
|
15
|
+
* xone-reiniciar-android deja el host en su pantalla de inicio
|
|
16
|
+
* xone-reiniciar-android --app MiApp y además lanza esa app
|
|
17
|
+
* xone-reiniciar-android --serie emulator-5554 con varios aparatos conectados
|
|
18
|
+
*
|
|
19
|
+
* **No despliega nada**: no sube ficheros ni toca el proyecto. Para eso está
|
|
20
|
+
* `xone-desplegar-android`, que ya hace este reinicio como uno de sus pasos.
|
|
21
|
+
*/
|
|
22
|
+
import { execFileSync } from "node:child_process";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
|
|
25
|
+
const PAQUETE = "com.xone.android.framework";
|
|
26
|
+
const ACTIVIDAD = `${PAQUETE}/com.xone.android.hotswap.activities.SetupActivity`;
|
|
27
|
+
const PUERTO = 8443;
|
|
28
|
+
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
31
|
+
console.error(`xone-reiniciar-android — mata el host de XOne y lo vuelve a levantar.
|
|
32
|
+
|
|
33
|
+
xone-reiniciar-android lo deja en su pantalla de inicio
|
|
34
|
+
xone-reiniciar-android --app MiApp y además lanza esa app
|
|
35
|
+
xone-reiniciar-android --serie emulator-5554 con varios aparatos conectados
|
|
36
|
+
|
|
37
|
+
Úsalo cuando el canal no conteste: el host reabre la última app ejecutada, y si ésa se quedó
|
|
38
|
+
en un error, nada responde aunque el aparato esté perfectamente. No despliega ni sube nada.`);
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const opcion = (nombre) => {
|
|
43
|
+
const i = args.indexOf(`--${nombre}`);
|
|
44
|
+
return i >= 0 ? args[i + 1] : undefined;
|
|
45
|
+
};
|
|
46
|
+
const serie = opcion("serie");
|
|
47
|
+
const adb = (...partes) =>
|
|
48
|
+
execFileSync("adb", [...(serie ? ["-s", serie] : []), ...partes], { encoding: "utf8" });
|
|
49
|
+
|
|
50
|
+
const cliente = join(import.meta.dirname, "xone-hotswap");
|
|
51
|
+
const mandar = (comando) =>
|
|
52
|
+
execFileSync("node", [cliente, JSON.stringify(comando)], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Sin aparato NO se empieza, y se dice el siguiente paso HECHO.
|
|
56
|
+
*
|
|
57
|
+
* Antes el primer `adb forward` moría con «no devices/emulators found», que es cierto y no
|
|
58
|
+
* dice qué hacer: medido, el modelo se ponía a componer el arranque a mano —y `emulator` no
|
|
59
|
+
* está en el PATH—. Es la regla de `porQueNo`: cuando sabemos la salida, se escribe, no se
|
|
60
|
+
* aconseja.
|
|
61
|
+
*/
|
|
62
|
+
function exigirAparato() {
|
|
63
|
+
let lista = "";
|
|
64
|
+
try {
|
|
65
|
+
lista = execFileSync("adb", ["devices"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error(`no pude hablar con adb: ${error.message.split("\n")[0]}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const hay = lista
|
|
71
|
+
.split(/\r?\n/)
|
|
72
|
+
.slice(1)
|
|
73
|
+
.some((l) => /\sdevice$/.test(l.trim()));
|
|
74
|
+
if (!hay) {
|
|
75
|
+
console.error("no hay ningún aparato conectado. Arranca el emulador primero:");
|
|
76
|
+
console.error(" xone-arrancar-android");
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
exigirAparato();
|
|
82
|
+
console.log(`1/3 túnel y parada de ${PAQUETE}`);
|
|
83
|
+
// El túnel PRIMERO y sin quitarlo después: hay que reaplicarlo tras cada reconexión del cable,
|
|
84
|
+
// así que quitarlo dejaría al siguiente hablando con nadie.
|
|
85
|
+
adb("forward", `tcp:${PUERTO}`, `tcp:${PUERTO}`);
|
|
86
|
+
adb("shell", "am", "force-stop", PAQUETE);
|
|
87
|
+
|
|
88
|
+
console.log("2/3 levantando el host");
|
|
89
|
+
adb("shell", "am", "start", "-n", ACTIVIDAD);
|
|
90
|
+
|
|
91
|
+
console.log("3/3 esperando a que el canal CONTESTE");
|
|
92
|
+
/**
|
|
93
|
+
* Se espera a una respuesta, no a un reloj: el `am start` vuelve cuando Android acepta el
|
|
94
|
+
* intent, no cuando el servidor escucha. Medido — sin esto, el primer comando de después muere
|
|
95
|
+
* con «Received network error or non-101 status code».
|
|
96
|
+
*
|
|
97
|
+
* Y la pregunta es `getAllElements`: contesta tanto si hay app viva como si no (`App is not
|
|
98
|
+
* running`), así que sirve de latido sin exigir que haya nada cargado.
|
|
99
|
+
*/
|
|
100
|
+
let vivo = false;
|
|
101
|
+
for (let intento = 1; intento <= 20 && !vivo; intento++) {
|
|
102
|
+
try {
|
|
103
|
+
mandar({ command: "getAllElements", format: "xone" });
|
|
104
|
+
vivo = true;
|
|
105
|
+
} catch {
|
|
106
|
+
execFileSync("sleep", ["1"]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!vivo) {
|
|
110
|
+
console.error(`el canal no levantó. Comprueba que ${PAQUETE} está instalado (adb shell pm list packages | grep xone)`);
|
|
111
|
+
console.error(`y que el puerto es el ${PUERTO}: si estaba ocupado, el framework coge el siguiente libre y lo dice en su pantalla.`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const app = opcion("app");
|
|
116
|
+
if (app === undefined) {
|
|
117
|
+
console.log("host reiniciado y canal listo. Ninguna app cargada.");
|
|
118
|
+
} else {
|
|
119
|
+
console.log(`lanzando ${app}`);
|
|
120
|
+
console.log(mandar({ command: "launchApplication", appName: app }));
|
|
121
|
+
for (let intento = 1; intento <= 10; intento++) {
|
|
122
|
+
const salida = mandar({ command: "getAllElements", format: "xone" });
|
|
123
|
+
if (!salida.includes("App is not running")) {
|
|
124
|
+
console.log(salida);
|
|
125
|
+
process.exit(0);
|
|
126
|
+
}
|
|
127
|
+
execFileSync("sleep", ["2"]);
|
|
128
|
+
}
|
|
129
|
+
console.error(`«${app}» no llegó a contestar el árbol de controles: NO está viva.`);
|
|
130
|
+
console.error("Si nunca se ha subido a este aparato, primero xone-desplegar-android.");
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
@@ -22,17 +22,33 @@ xone-review → valida con xone-simulator
|
|
|
22
22
|
|
|
23
23
|
## Estructura de archivos
|
|
24
24
|
|
|
25
|
+
Todo vive en **la carpeta del plan**, `/planes/<nombre>/`, NUNCA en la raíz del proyecto: un plan
|
|
26
|
+
no es parte de la app del cliente, y lo que se escribe en la raíz entra en el commit del turno y
|
|
27
|
+
sube a CloudStudio. Escribe tu `TASKS.md` **en la misma carpeta de la que leíste el `PLAN.md`**,
|
|
28
|
+
no en otra: quien desarrolle va a buscarlo ahí. Y el nombre es **EXACTO** — nada de
|
|
29
|
+
`tareas.md` ni variantes: dos ficheros con las mismas tareas son dos fuentes de verdad, y la
|
|
30
|
+
que nadie marca se queda vieja.
|
|
31
|
+
|
|
25
32
|
```
|
|
26
|
-
|
|
33
|
+
/planes/favoritos/
|
|
27
34
|
├── PLAN.md ← entrada (producido por xone-spec-builder)
|
|
28
|
-
├── TASKS.md
|
|
35
|
+
├── TASKS.md ← salida (esta skill)
|
|
29
36
|
├── CONTEXT.md ← glosario (ya existe del spec-builder)
|
|
30
|
-
|
|
31
|
-
│ └── adr/
|
|
37
|
+
└── adr/
|
|
32
38
|
```
|
|
33
39
|
|
|
34
40
|
Si no existe `PLAN.md`, **detente y pide al usuario que ejecute `xone-spec-builder` primero**. No se puede descomponer lo que no está especificado.
|
|
35
41
|
|
|
42
|
+
## El `TASKS.md` se ACTUALIZA, no se archiva
|
|
43
|
+
|
|
44
|
+
`**Estado:**` es `pendiente`, `en curso` o `hecha`, y lo mantiene **quien ejecuta la tarea**, en
|
|
45
|
+
este mismo fichero y en esta misma carpeta. Las casillas de los criterios se marcan `- [x]`
|
|
46
|
+
cuando ese criterio está comprobado, no cuando se escribió el código que debería cumplirlo.
|
|
47
|
+
|
|
48
|
+
Ésa es la razón de que el plan viva en `/planes/` y no entre los artefactos: no es un documento
|
|
49
|
+
que se entrega una vez, es el estado compartido entre quien planifica y quien desarrolla, a lo
|
|
50
|
+
largo de varios turnos y varias sesiones.
|
|
51
|
+
|
|
36
52
|
## Precondiciones
|
|
37
53
|
|
|
38
54
|
Antes de descomponer, valida el `PLAN.md`:
|
|
@@ -133,6 +149,7 @@ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Re
|
|
|
133
149
|
## Tareas
|
|
134
150
|
|
|
135
151
|
### 01 — {Título}
|
|
152
|
+
**Estado:** pendiente
|
|
136
153
|
**Qué entrega:** {comportamiento end-to-end, perspectiva del usuario — no lista de capas}
|
|
137
154
|
**Bloqueada por:** Ninguna — puede empezar ya
|
|
138
155
|
**Notas:** {si hay algo que el spec dejó pendiente que afecta a esta tarea}
|
|
@@ -141,6 +158,7 @@ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Re
|
|
|
141
158
|
- [ ] Criterio de aceptación 2
|
|
142
159
|
|
|
143
160
|
### 02 — {Título}
|
|
161
|
+
**Estado:** pendiente
|
|
144
162
|
**Qué entrega:** …
|
|
145
163
|
**Bloqueada por:** 01
|
|
146
164
|
…
|
|
@@ -24,22 +24,52 @@ El spec builder es el primer paso de cualquier trabajo XOne. Lo que sigue:
|
|
|
24
24
|
|
|
25
25
|
## Estructura de archivos
|
|
26
26
|
|
|
27
|
-
La entrevista escribe en
|
|
27
|
+
La entrevista escribe en **`/planes/<nombre>/`**, NUNCA en la raíz del proyecto. Un plan no es
|
|
28
|
+
parte de la app: la raíz es el proyecto XOne del cliente, y lo que se escribe ahí pasa por
|
|
29
|
+
aprobación, entra en el commit de cada turno y **sube a CloudStudio**. `/planes/` no: no entra en
|
|
30
|
+
git, no se sincroniza, y **sobrevive a la sesión** — se planifica un día y se implementa otro.
|
|
31
|
+
|
|
32
|
+
**Elige tú el `<nombre>`**, y es una carpeta por plan porque puede haber varios a la vez:
|
|
33
|
+
minúsculas, dígitos y guiones sencillos (`favoritos`, `sync-offline`), corto y por lo que el
|
|
34
|
+
desarrollo ES. Mira antes `/planes/` por si ya existe uno del mismo tema: si lo hay, AMPLÍALO en
|
|
35
|
+
vez de abrir otro. Crea los archivos **lazy**, solo cuando hay algo que escribir.
|
|
36
|
+
|
|
37
|
+
**Los nombres son EXACTOS**: `PLAN.md`, `CONTEXT.md` y la carpeta `adr/`. No crees
|
|
38
|
+
traducciones ni variantes (`spec.md`, `glosario.md`, `plan.md`): quien lea el plan después
|
|
39
|
+
busca esos nombres, y dos ficheros con lo mismo dentro son dos fuentes de verdad — la que
|
|
40
|
+
nadie actualiza se queda vieja sin que nadie lo note.
|
|
28
41
|
|
|
29
42
|
```
|
|
30
|
-
|
|
43
|
+
/planes/favoritos/
|
|
31
44
|
├── PLAN.md ← el plan del desarrollo (entregable)
|
|
32
45
|
├── CONTEXT.md ← glosario del dominio (términos canónicos, evitar)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
│ └── 0002-login-con-oauth2-o-contra-db.md
|
|
46
|
+
└── adr/
|
|
47
|
+
├── 0001-sqlite-local-vs-replica.md
|
|
48
|
+
└── 0002-login-con-oauth2-o-contra-db.md
|
|
37
49
|
```
|
|
38
50
|
|
|
39
|
-
Si no existe `PLAN.md`, créalo cuando la entrevista empiece a cristalizar decisiones. Si no existe `CONTEXT.md`, créalo cuando se resuelva el primer término de dominio. Si no existe `
|
|
51
|
+
Si no existe `PLAN.md`, créalo cuando la entrevista empiece a cristalizar decisiones. Si no existe `CONTEXT.md`, créalo cuando se resuelva el primer término de dominio. Si no existe `adr/` dentro de la carpeta del plan, créalo cuando se tome la primera decisión digna de ADR.
|
|
40
52
|
|
|
41
53
|
> **`PLAN.md` es el entregable.** `CONTEXT.md` y los ADRs lo acompañan y alimentan, pero lo que el usuario se lleva es el plan.
|
|
42
54
|
|
|
55
|
+
## Si no hay nadie a quien entrevistar
|
|
56
|
+
|
|
57
|
+
Puede que corras **dentro de un subagente**, y entonces no tienes interlocutor: una delegación es
|
|
58
|
+
de un solo disparo y no hay forma de devolverle una pregunta a nadie a mitad de trabajo. Se nota
|
|
59
|
+
en que nadie contesta a la primera ronda.
|
|
60
|
+
|
|
61
|
+
Cuando eso pase, **no te inventes las respuestas**, que es justo lo que esta skill se prohíbe.
|
|
62
|
+
Haz esto:
|
|
63
|
+
|
|
64
|
+
1. Escribe el `PLAN.md` con lo que SÍ puedes resolver leyendo el proyecto.
|
|
65
|
+
2. Pon las decisiones que no puedes tomar en **§Pendientes**, cada una con las opciones y con
|
|
66
|
+
qué cambia según la respuesta. Una pregunta sin consecuencia no merece bloquear nada.
|
|
67
|
+
3. **Dilo en tu respuesta final**, nombrando las pendientes que bloquean. Quien lea eso sí puede
|
|
68
|
+
preguntárselo a la persona y volver a encargártelo con las respuestas dentro.
|
|
69
|
+
|
|
70
|
+
Un plan con tres huecos declarados vale; uno con tres huecos rellenados a ojo es peor que no
|
|
71
|
+
tenerlo, porque nadie sabe cuáles eran.
|
|
72
|
+
|
|
43
73
|
## Antes de entrevistar: triage de complejidad
|
|
44
74
|
|
|
45
75
|
No toda petición necesita una entrevista de 8 rounds. Antes de empezar, clasifica la **complejidad** del desarrollo y ajusta el nivel de especificación:
|