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.
Files changed (315) hide show
  1. package/apps/web/dist/assets/{index-BB3SamhR.css → index-Boak51UP.css} +1 -1
  2. package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
  3. package/apps/web/dist/assets/{php-D_2--9WK.js → php-Cu6F_QCJ.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-BiqQPoC6.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +10 -0
  7. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
  8. package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
  9. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
  10. package/dist/agent/{descarga.js → cloudstudio/descarga.js} +17 -7
  11. package/dist/agent/cloudstudio/descarga.js.map +1 -0
  12. package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
  13. package/dist/agent/cloudstudio/ramaActiva.js +11 -0
  14. package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
  15. package/dist/agent/{subida.js → cloudstudio/subida.js} +16 -7
  16. package/dist/agent/cloudstudio/subida.js.map +1 -0
  17. package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
  18. package/dist/agent/cloudstudio/zip.js.map +1 -0
  19. package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
  20. package/dist/agent/config/authEnDisco.js.map +1 -0
  21. package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +47 -1
  22. package/dist/agent/config/catalogoModelos.js.map +1 -0
  23. package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
  24. package/dist/agent/config/configEnDisco.js.map +1 -0
  25. package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
  26. package/dist/agent/config/crearProyecto.js.map +1 -0
  27. package/dist/agent/config/entorno.js.map +1 -0
  28. package/dist/agent/config/gemini.js.map +1 -0
  29. package/dist/agent/config/modelos.js +235 -0
  30. package/dist/agent/config/modelos.js.map +1 -0
  31. package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
  32. package/dist/agent/config/modelosDeMotor.js.map +1 -0
  33. package/dist/agent/config/mudanzaEnDisco.js +121 -0
  34. package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
  35. package/dist/agent/{persona.js → config/persona.js} +1 -1
  36. package/dist/agent/config/persona.js.map +1 -0
  37. package/dist/agent/config/selectorEnMaquina.js +45 -0
  38. package/dist/agent/config/selectorEnMaquina.js.map +1 -0
  39. package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +37 -2
  40. package/dist/agent/config/settingsEnDisco.js.map +1 -0
  41. package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
  42. package/dist/agent/config/versionEnDisco.js.map +1 -0
  43. package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
  44. package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
  45. package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
  46. package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
  47. package/dist/agent/dispositivos/hotswap.js.map +1 -0
  48. package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
  49. package/dist/agent/dispositivos/juezVisual.js +152 -0
  50. package/dist/agent/dispositivos/juezVisual.js.map +1 -0
  51. package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
  52. package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
  53. package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
  54. package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
  55. package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
  56. package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
  57. package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
  58. package/dist/agent/exportarPdf.js +140 -0
  59. package/dist/agent/exportarPdf.js.map +1 -0
  60. package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
  61. package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
  62. package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
  63. package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
  64. package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
  65. package/dist/agent/grafo/busquedaRegex.js.map +1 -0
  66. package/dist/agent/grafo/criticaVisual.js +115 -0
  67. package/dist/agent/grafo/criticaVisual.js.map +1 -0
  68. package/dist/agent/grafo/excluirTools.js +82 -0
  69. package/dist/agent/grafo/excluirTools.js.map +1 -0
  70. package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
  71. package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
  72. package/dist/agent/grafo/navegacionXone.js +231 -0
  73. package/dist/agent/grafo/navegacionXone.js.map +1 -0
  74. package/dist/agent/{perfiles.js → grafo/perfiles.js} +96 -10
  75. package/dist/agent/grafo/perfiles.js.map +1 -0
  76. package/dist/agent/{proyecto.js → grafo/proyecto.js} +274 -24
  77. package/dist/agent/grafo/proyecto.js.map +1 -0
  78. package/dist/agent/grafo/skills.js +425 -0
  79. package/dist/agent/grafo/skills.js.map +1 -0
  80. package/dist/agent/grafo/xoneAgent.js +566 -0
  81. package/dist/agent/grafo/xoneAgent.js.map +1 -0
  82. package/dist/agent/navegacion/estilosEnDisco.js +110 -0
  83. package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
  84. package/dist/agent/navegacion/hechosEnDisco.js +26 -0
  85. package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
  86. package/dist/agent/navegacion/indiceEnDisco.js +36 -0
  87. package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
  88. package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
  89. package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
  90. package/dist/agent/raizDelPaquete.js +56 -0
  91. package/dist/agent/raizDelPaquete.js.map +1 -0
  92. package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +1 -1
  93. package/dist/agent/sesiones/checkpointer.js.map +1 -0
  94. package/dist/agent/sesiones/git.js.map +1 -0
  95. package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
  96. package/dist/agent/sesiones/gitSync.js.map +1 -0
  97. package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
  98. package/dist/agent/sesiones/sesionGit.js.map +1 -0
  99. package/dist/agent/subagentes/agentesEnDisco.js +818 -0
  100. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
  101. package/dist/agent/subagentes/consumoExterno.js.map +1 -0
  102. package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
  103. package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
  104. package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
  105. package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +59 -6
  106. package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
  107. package/dist/agent/subagentes/pluginDeSkills.js +99 -0
  108. package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
  109. package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
  110. package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +48 -0
  111. package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
  112. package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +53 -1
  113. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
  114. package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
  115. package/dist/agent/tareas/aumentador.js.map +1 -0
  116. package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +6 -6
  117. package/dist/agent/tareas/juezDeTarea.js.map +1 -0
  118. package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +53 -4
  119. package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
  120. package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +5 -1
  121. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
  122. package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
  123. package/dist/agent/turno/guionizado.js.map +1 -0
  124. package/dist/agent/turno/informeDeTraza.js +245 -0
  125. package/dist/agent/turno/informeDeTraza.js.map +1 -0
  126. package/dist/agent/turno/inspectorDePrompt.js +205 -0
  127. package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
  128. package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
  129. package/dist/agent/turno/instantanea.js.map +1 -0
  130. package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
  131. package/dist/agent/turno/interrupts.js.map +1 -0
  132. package/dist/agent/turno/mensajes.js.map +1 -0
  133. package/dist/agent/turno/normalizar.js.map +1 -0
  134. package/dist/agent/{puente.js → turno/puente.js} +71 -4
  135. package/dist/agent/turno/puente.js.map +1 -0
  136. package/dist/agent/turno/resumenDeContexto.js +260 -0
  137. package/dist/agent/turno/resumenDeContexto.js.map +1 -0
  138. package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +33 -0
  139. package/dist/agent/turno/resumenDeTool.js.map +1 -0
  140. package/dist/agent/turno/rubrica.js +91 -0
  141. package/dist/agent/turno/rubrica.js.map +1 -0
  142. package/dist/agent/turno/textoDeTool.js.map +1 -0
  143. package/dist/agent/{turnoReal.js → turno/turnoReal.js} +210 -25
  144. package/dist/agent/turno/turnoReal.js.map +1 -0
  145. package/dist/agent/turno/verificador.js.map +1 -0
  146. package/dist/cli/config.js +1 -1
  147. package/dist/cli/config.js.map +1 -1
  148. package/dist/cli/consola.js +72 -9
  149. package/dist/cli/consola.js.map +1 -1
  150. package/dist/cli/describe.js +2 -2
  151. package/dist/cli/describe.js.map +1 -1
  152. package/dist/cli/doctor.js +1 -1
  153. package/dist/cli/doctor.js.map +1 -1
  154. package/dist/cli/fuentesDeDisco.js +29 -0
  155. package/dist/cli/fuentesDeDisco.js.map +1 -0
  156. package/dist/cli/main.js +87 -31
  157. package/dist/cli/main.js.map +1 -1
  158. package/dist/cli/run.js +40 -10
  159. package/dist/cli/run.js.map +1 -1
  160. package/dist/cli/traza.js +48 -0
  161. package/dist/cli/traza.js.map +1 -0
  162. package/dist/cli/tui/correrTui.js +4 -4
  163. package/dist/cli/tui/correrTui.js.map +1 -1
  164. package/dist/cli/verify.js +1 -1
  165. package/dist/cli/verify.js.map +1 -1
  166. package/dist/core/actos.js +1 -1
  167. package/dist/core/adjuntos.js +2 -2
  168. package/dist/core/agentes.js +247 -7
  169. package/dist/core/agentes.js.map +1 -1
  170. package/dist/core/artefactos.js +4 -4
  171. package/dist/core/config.js +1 -1
  172. package/dist/core/contextos.js +12 -1
  173. package/dist/core/contextos.js.map +1 -1
  174. package/dist/core/descargas.js +1 -1
  175. package/dist/core/dispositivos.js +53 -3
  176. package/dist/core/dispositivos.js.map +1 -1
  177. package/dist/core/esfuerzo.js +141 -0
  178. package/dist/core/esfuerzo.js.map +1 -0
  179. package/dist/core/esqueleto.js +1 -1
  180. package/dist/core/estilos.js +78 -0
  181. package/dist/core/estilos.js.map +1 -0
  182. package/dist/core/exportacion.js +140 -0
  183. package/dist/core/exportacion.js.map +1 -0
  184. package/dist/core/hechosDelProyecto.js +87 -0
  185. package/dist/core/hechosDelProyecto.js.map +1 -0
  186. package/dist/core/logDeDispositivo.js +143 -0
  187. package/dist/core/logDeDispositivo.js.map +1 -0
  188. package/dist/core/modelos.js +48 -3
  189. package/dist/core/modelos.js.map +1 -1
  190. package/dist/core/mudanzaDeWorkspace.js +93 -0
  191. package/dist/core/mudanzaDeWorkspace.js.map +1 -0
  192. package/dist/core/navegacion.js +134 -0
  193. package/dist/core/navegacion.js.map +1 -0
  194. package/dist/core/notify.js +5 -0
  195. package/dist/core/notify.js.map +1 -1
  196. package/dist/core/planDeSubida.js +1 -1
  197. package/dist/core/planes.js +70 -0
  198. package/dist/core/planes.js.map +1 -0
  199. package/dist/core/ports.js +4 -0
  200. package/dist/core/ports.js.map +1 -1
  201. package/dist/core/rubrica.js +90 -0
  202. package/dist/core/rubrica.js.map +1 -0
  203. package/dist/core/selectorDeCarpeta.js +87 -0
  204. package/dist/core/selectorDeCarpeta.js.map +1 -0
  205. package/dist/core/settings.js +56 -7
  206. package/dist/core/settings.js.map +1 -1
  207. package/dist/core/shellDeAgente.js +144 -0
  208. package/dist/core/shellDeAgente.js.map +1 -0
  209. package/dist/core/skills.js +158 -0
  210. package/dist/core/skills.js.map +1 -0
  211. package/dist/core/topeAgotado.js +69 -0
  212. package/dist/core/topeAgotado.js.map +1 -0
  213. package/dist/core/zipDeSkill.js +107 -0
  214. package/dist/core/zipDeSkill.js.map +1 -0
  215. package/dist/web/servidor/arranque.js +853 -54
  216. package/dist/web/servidor/arranque.js.map +1 -1
  217. package/dist/web/servidor/corredorDeTareas.js +3 -3
  218. package/dist/web/servidor/corredorDeTareas.js.map +1 -1
  219. package/dist/web/servidor/sesiones.js +34 -6
  220. package/dist/web/servidor/sesiones.js.map +1 -1
  221. package/dist/web/servidor/transporte.js +1 -1
  222. package/dist/web/servidor/transporte.js.map +1 -1
  223. package/dist/web/servidor/vestibulo.js +62 -13
  224. package/dist/web/servidor/vestibulo.js.map +1 -1
  225. package/package.json +7 -4
  226. package/skills/archify/SKILL.md +25 -2
  227. package/skills/artifacts-builder/SKILL.md +23 -0
  228. package/skills/xone-hotswap/SKILL.md +96 -0
  229. package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
  230. package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
  231. package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
  232. package/skills/xone-hotswap/scripts/xone-desplegar-android +439 -0
  233. package/skills/xone-hotswap/scripts/xone-hotswap +201 -0
  234. package/skills/xone-hotswap/scripts/xone-log-android +102 -0
  235. package/skills/xone-hotswap/scripts/xone-reiniciar-android +132 -0
  236. package/skills/xone-plan-builder/SKILL.md +22 -4
  237. package/skills/xone-spec-builder/SKILL.md +37 -7
  238. package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
  239. package/dist/agent/agentesEnDisco.js +0 -539
  240. package/dist/agent/agentesEnDisco.js.map +0 -1
  241. package/dist/agent/arbolDeProyecto.js.map +0 -1
  242. package/dist/agent/artefactosEnDisco.js.map +0 -1
  243. package/dist/agent/aumentador.js.map +0 -1
  244. package/dist/agent/authEnDisco.js.map +0 -1
  245. package/dist/agent/busquedaRegex.js.map +0 -1
  246. package/dist/agent/catalogoModelos.js.map +0 -1
  247. package/dist/agent/checkpointer.js.map +0 -1
  248. package/dist/agent/cloudstudioClient.js.map +0 -1
  249. package/dist/agent/cloudstudioMcp.js.map +0 -1
  250. package/dist/agent/configEnDisco.js.map +0 -1
  251. package/dist/agent/consumoExterno.js.map +0 -1
  252. package/dist/agent/crearProyecto.js.map +0 -1
  253. package/dist/agent/descarga.js.map +0 -1
  254. package/dist/agent/diagnosticoDeTools.js.map +0 -1
  255. package/dist/agent/dispositivosEnMaquina.js.map +0 -1
  256. package/dist/agent/entorno.js.map +0 -1
  257. package/dist/agent/escrituraDeCodex.js.map +0 -1
  258. package/dist/agent/escrituraDeOpencode.js.map +0 -1
  259. package/dist/agent/escrituraExterna.js.map +0 -1
  260. package/dist/agent/gemini.js.map +0 -1
  261. package/dist/agent/git.js.map +0 -1
  262. package/dist/agent/gitSync.js.map +0 -1
  263. package/dist/agent/guionizado.js.map +0 -1
  264. package/dist/agent/hotswap.js.map +0 -1
  265. package/dist/agent/instalacionEnMaquina.js.map +0 -1
  266. package/dist/agent/instantanea.js.map +0 -1
  267. package/dist/agent/interrupts.js.map +0 -1
  268. package/dist/agent/juezDeTarea.js.map +0 -1
  269. package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
  270. package/dist/agent/manifiesto.js.map +0 -1
  271. package/dist/agent/memoriaDeProyecto.js.map +0 -1
  272. package/dist/agent/mensajes.js.map +0 -1
  273. package/dist/agent/modelos.js +0 -130
  274. package/dist/agent/modelos.js.map +0 -1
  275. package/dist/agent/modelosDeMotor.js.map +0 -1
  276. package/dist/agent/normalizar.js.map +0 -1
  277. package/dist/agent/paqueteDelProyecto.js.map +0 -1
  278. package/dist/agent/perfiles.js.map +0 -1
  279. package/dist/agent/persona.js.map +0 -1
  280. package/dist/agent/procesosEnMaquina.js.map +0 -1
  281. package/dist/agent/proyecto.js.map +0 -1
  282. package/dist/agent/puente.js.map +0 -1
  283. package/dist/agent/resumenDeContexto.js +0 -30
  284. package/dist/agent/resumenDeContexto.js.map +0 -1
  285. package/dist/agent/resumenDeTool.js.map +0 -1
  286. package/dist/agent/sesionGit.js.map +0 -1
  287. package/dist/agent/settingsEnDisco.js.map +0 -1
  288. package/dist/agent/skills.js +0 -65
  289. package/dist/agent/skills.js.map +0 -1
  290. package/dist/agent/subagenteCodex.js.map +0 -1
  291. package/dist/agent/subagenteExterno.js.map +0 -1
  292. package/dist/agent/subagenteOpencode.js.map +0 -1
  293. package/dist/agent/subida.js.map +0 -1
  294. package/dist/agent/tareasEnDisco.js.map +0 -1
  295. package/dist/agent/textoDeTool.js.map +0 -1
  296. package/dist/agent/turnoReal.js.map +0 -1
  297. package/dist/agent/verificador.js.map +0 -1
  298. package/dist/agent/versionEnDisco.js.map +0 -1
  299. package/dist/agent/xoneAgent.js +0 -347
  300. package/dist/agent/xoneAgent.js.map +0 -1
  301. package/dist/agent/zip.js.map +0 -1
  302. /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
  303. /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
  304. /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
  305. /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
  306. /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
  307. /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
  308. /package/dist/agent/{git.js → sesiones/git.js} +0 -0
  309. /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
  310. /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
  311. /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
  312. /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
  313. /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
  314. /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
  315. /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
- <raíz del proyecto>/
33
+ /planes/favoritos/
27
34
  ├── PLAN.md ← entrada (producido por xone-spec-builder)
28
- ├── TASKS.md ← salida (esta skill)
35
+ ├── TASKS.md ← salida (esta skill)
29
36
  ├── CONTEXT.md ← glosario (ya existe del spec-builder)
30
- ├── docs/
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 el **directorio de trabajo** del usuario — la raíz del proyecto XOne (existente o por crear). Crea los archivos **lazy**, solo cuando hay algo que escribir:
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
- <raíz del proyecto>/
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
- ├── docs/
34
- │ └── adr/
35
- │ ├── 0001-sqlite-local-vs-replica.md
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 `docs/adr/`, créalo cuando se tome la primera decisión digna de ADR.
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: