xonecode 0.3.0 → 0.5.1

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 (408) hide show
  1. package/README.md +50 -8
  2. package/THIRD_PARTY_NOTICES.md +160 -0
  3. package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
  63. package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
  64. package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
  65. package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
  66. package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
  67. package/apps/web/dist/assets/html-CfGypltT.js +1 -0
  68. package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
  69. package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
  70. package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
  71. package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  72. package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  73. package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  74. package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  75. package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  76. package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  77. package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  78. package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
  79. package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  80. package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  81. package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  82. package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  83. package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  84. package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
  85. package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
  86. package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
  87. package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
  88. package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  89. package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
  90. package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
  91. package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
  92. package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
  93. package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
  94. package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
  95. package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
  96. package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
  97. package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
  98. package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
  99. package/apps/web/dist/iconos/xonecode.png +0 -0
  100. package/apps/web/dist/index.html +20 -0
  101. package/dist/agent/agentesEnDisco.js +539 -0
  102. package/dist/agent/agentesEnDisco.js.map +1 -0
  103. package/dist/agent/arbolDeProyecto.js +245 -0
  104. package/dist/agent/arbolDeProyecto.js.map +1 -0
  105. package/dist/agent/artefactosEnDisco.js +139 -0
  106. package/dist/agent/artefactosEnDisco.js.map +1 -0
  107. package/dist/agent/aumentador.js +175 -0
  108. package/dist/agent/aumentador.js.map +1 -0
  109. package/dist/agent/authEnDisco.js +76 -1
  110. package/dist/agent/authEnDisco.js.map +1 -1
  111. package/dist/agent/busquedaRegex.js +92 -0
  112. package/dist/agent/busquedaRegex.js.map +1 -0
  113. package/dist/agent/catalogoModelos.js +345 -0
  114. package/dist/agent/catalogoModelos.js.map +1 -0
  115. package/dist/agent/checkpointer.js +127 -0
  116. package/dist/agent/checkpointer.js.map +1 -0
  117. package/dist/agent/cloudstudioClient.js +194 -0
  118. package/dist/agent/cloudstudioClient.js.map +1 -0
  119. package/dist/agent/cloudstudioMcp.js +722 -0
  120. package/dist/agent/cloudstudioMcp.js.map +1 -0
  121. package/dist/agent/configEnDisco.js +309 -11
  122. package/dist/agent/configEnDisco.js.map +1 -1
  123. package/dist/agent/consumoExterno.js +99 -0
  124. package/dist/agent/consumoExterno.js.map +1 -0
  125. package/dist/agent/descarga.js +149 -0
  126. package/dist/agent/descarga.js.map +1 -0
  127. package/dist/agent/diagnosticoDeTools.js +51 -0
  128. package/dist/agent/diagnosticoDeTools.js.map +1 -0
  129. package/dist/agent/dispositivosEnMaquina.js +596 -0
  130. package/dist/agent/dispositivosEnMaquina.js.map +1 -0
  131. package/dist/agent/escrituraDeCodex.js +134 -0
  132. package/dist/agent/escrituraDeCodex.js.map +1 -0
  133. package/dist/agent/escrituraDeOpencode.js +80 -0
  134. package/dist/agent/escrituraDeOpencode.js.map +1 -0
  135. package/dist/agent/escrituraExterna.js +742 -0
  136. package/dist/agent/escrituraExterna.js.map +1 -0
  137. package/dist/agent/gemini.js +81 -0
  138. package/dist/agent/gemini.js.map +1 -0
  139. package/dist/agent/git.js +83 -0
  140. package/dist/agent/git.js.map +1 -0
  141. package/dist/agent/gitSync.js +441 -0
  142. package/dist/agent/gitSync.js.map +1 -0
  143. package/dist/agent/hotswap.js +448 -0
  144. package/dist/agent/hotswap.js.map +1 -0
  145. package/dist/agent/instalacionEnMaquina.js +252 -0
  146. package/dist/agent/instalacionEnMaquina.js.map +1 -0
  147. package/dist/agent/instantanea.js +7 -10
  148. package/dist/agent/instantanea.js.map +1 -1
  149. package/dist/agent/interrupts.js +11 -2
  150. package/dist/agent/interrupts.js.map +1 -1
  151. package/dist/agent/juezDeTarea.js +345 -0
  152. package/dist/agent/juezDeTarea.js.map +1 -0
  153. package/dist/agent/lanzamientoEnMaquina.js +377 -0
  154. package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
  155. package/dist/agent/manifiesto.js +59 -0
  156. package/dist/agent/manifiesto.js.map +1 -0
  157. package/dist/agent/memoriaDeProyecto.js +60 -0
  158. package/dist/agent/memoriaDeProyecto.js.map +1 -0
  159. package/dist/agent/modelos.js +105 -17
  160. package/dist/agent/modelos.js.map +1 -1
  161. package/dist/agent/modelosDeMotor.js +204 -0
  162. package/dist/agent/modelosDeMotor.js.map +1 -0
  163. package/dist/agent/paqueteDelProyecto.js +181 -0
  164. package/dist/agent/paqueteDelProyecto.js.map +1 -0
  165. package/dist/agent/perfiles.js +92 -31
  166. package/dist/agent/perfiles.js.map +1 -1
  167. package/dist/agent/persona.js +40 -0
  168. package/dist/agent/persona.js.map +1 -0
  169. package/dist/agent/procesosEnMaquina.js +204 -0
  170. package/dist/agent/procesosEnMaquina.js.map +1 -0
  171. package/dist/agent/proyecto.js +311 -13
  172. package/dist/agent/proyecto.js.map +1 -1
  173. package/dist/agent/puente.js +63 -6
  174. package/dist/agent/puente.js.map +1 -1
  175. package/dist/agent/resumenDeContexto.js +30 -0
  176. package/dist/agent/resumenDeContexto.js.map +1 -0
  177. package/dist/agent/resumenDeTool.js +64 -18
  178. package/dist/agent/resumenDeTool.js.map +1 -1
  179. package/dist/agent/sesionGit.js +481 -0
  180. package/dist/agent/sesionGit.js.map +1 -0
  181. package/dist/agent/settingsEnDisco.js +189 -0
  182. package/dist/agent/settingsEnDisco.js.map +1 -0
  183. package/dist/agent/subagenteCodex.js +368 -0
  184. package/dist/agent/subagenteCodex.js.map +1 -0
  185. package/dist/agent/subagenteExterno.js +423 -0
  186. package/dist/agent/subagenteExterno.js.map +1 -0
  187. package/dist/agent/subagenteOpencode.js +389 -0
  188. package/dist/agent/subagenteOpencode.js.map +1 -0
  189. package/dist/agent/subida.js +202 -0
  190. package/dist/agent/subida.js.map +1 -0
  191. package/dist/agent/tareasEnDisco.js +466 -0
  192. package/dist/agent/tareasEnDisco.js.map +1 -0
  193. package/dist/agent/turnoReal.js +663 -50
  194. package/dist/agent/turnoReal.js.map +1 -1
  195. package/dist/agent/versionEnDisco.js +48 -0
  196. package/dist/agent/versionEnDisco.js.map +1 -0
  197. package/dist/agent/xoneAgent.js +290 -49
  198. package/dist/agent/xoneAgent.js.map +1 -1
  199. package/dist/agent/zip.js +52 -0
  200. package/dist/agent/zip.js.map +1 -0
  201. package/dist/cli/acuseDeModelo.js +30 -0
  202. package/dist/cli/acuseDeModelo.js.map +1 -0
  203. package/dist/cli/aprobar.js +55 -2
  204. package/dist/cli/aprobar.js.map +1 -1
  205. package/dist/cli/config.js +9 -13
  206. package/dist/cli/config.js.map +1 -1
  207. package/dist/cli/consola.js +750 -19
  208. package/dist/cli/consola.js.map +1 -1
  209. package/dist/cli/main.js +740 -81
  210. package/dist/cli/main.js.map +1 -1
  211. package/dist/cli/markdown.js +188 -2
  212. package/dist/cli/markdown.js.map +1 -1
  213. package/dist/cli/run.js +32 -4
  214. package/dist/cli/run.js.map +1 -1
  215. package/dist/cli/stdio.js +46 -19
  216. package/dist/cli/stdio.js.map +1 -1
  217. package/dist/cli/tema.js +96 -8
  218. package/dist/cli/tema.js.map +1 -1
  219. package/dist/cli/tokens.js +29 -0
  220. package/dist/cli/tokens.js.map +1 -0
  221. package/dist/cli/tui/app.js +171 -0
  222. package/dist/cli/tui/app.js.map +1 -0
  223. package/dist/cli/tui/aprobarTui.js +80 -0
  224. package/dist/cli/tui/aprobarTui.js.map +1 -0
  225. package/dist/cli/tui/barra.js +37 -0
  226. package/dist/cli/tui/barra.js.map +1 -0
  227. package/dist/cli/tui/correrTui.js +478 -0
  228. package/dist/cli/tui/correrTui.js.map +1 -0
  229. package/dist/cli/tui/entrada.js +166 -0
  230. package/dist/cli/tui/entrada.js.map +1 -0
  231. package/dist/cli/tui/filas.js +24 -0
  232. package/dist/cli/tui/filas.js.map +1 -0
  233. package/dist/cli/tui/logo.js +49 -0
  234. package/dist/cli/tui/logo.js.map +1 -0
  235. package/dist/cli/tui/pielTui.js +14 -0
  236. package/dist/cli/tui/pielTui.js.map +1 -0
  237. package/dist/cli/tui/raton.js +126 -0
  238. package/dist/cli/tui/raton.js.map +1 -0
  239. package/dist/cli/tui/sidebar.js +86 -0
  240. package/dist/cli/tui/sidebar.js.map +1 -0
  241. package/dist/cli/tui/store.js +143 -0
  242. package/dist/cli/tui/store.js.map +1 -0
  243. package/dist/cli/tui/tarjeta.js +19 -0
  244. package/dist/cli/tui/tarjeta.js.map +1 -0
  245. package/dist/cli/tui/temaInk.js +114 -0
  246. package/dist/cli/tui/temaInk.js.map +1 -0
  247. package/dist/cli/tui/transcript.js +254 -0
  248. package/dist/cli/tui/transcript.js.map +1 -0
  249. package/dist/cli/wizardInicial.js +240 -0
  250. package/dist/cli/wizardInicial.js.map +1 -0
  251. package/dist/core/actos.js +113 -0
  252. package/dist/core/actos.js.map +1 -0
  253. package/dist/core/adjuntos.js +97 -0
  254. package/dist/core/adjuntos.js.map +1 -0
  255. package/dist/core/agentes.js +227 -0
  256. package/dist/core/agentes.js.map +1 -0
  257. package/dist/core/artefactos.js +149 -0
  258. package/dist/core/artefactos.js.map +1 -0
  259. package/dist/core/cloudstudio.js +7 -0
  260. package/dist/core/cloudstudio.js.map +1 -0
  261. package/dist/core/config.js +212 -5
  262. package/dist/core/config.js.map +1 -1
  263. package/dist/core/contextos.js +53 -1
  264. package/dist/core/contextos.js.map +1 -1
  265. package/dist/core/descargas.js +106 -0
  266. package/dist/core/descargas.js.map +1 -0
  267. package/dist/core/descriptoresDeApp.js +279 -0
  268. package/dist/core/descriptoresDeApp.js.map +1 -0
  269. package/dist/core/dispositivos.js +466 -0
  270. package/dist/core/dispositivos.js.map +1 -0
  271. package/dist/core/entrega.js +141 -0
  272. package/dist/core/entrega.js.map +1 -0
  273. package/dist/core/entrelazar.js +90 -0
  274. package/dist/core/entrelazar.js.map +1 -0
  275. package/dist/core/esqueleto.js +10 -0
  276. package/dist/core/esqueleto.js.map +1 -1
  277. package/dist/core/modelos.js +235 -3
  278. package/dist/core/modelos.js.map +1 -1
  279. package/dist/core/notify.js +27 -9
  280. package/dist/core/notify.js.map +1 -1
  281. package/dist/core/planDeSubida.js +127 -0
  282. package/dist/core/planDeSubida.js.map +1 -0
  283. package/dist/core/ports.js +189 -1
  284. package/dist/core/ports.js.map +1 -1
  285. package/dist/core/puedeLanzarse.js +239 -0
  286. package/dist/core/puedeLanzarse.js.map +1 -0
  287. package/dist/core/rutaVirtual.js +42 -0
  288. package/dist/core/rutaVirtual.js.map +1 -0
  289. package/dist/core/settings.js +246 -0
  290. package/dist/core/settings.js.map +1 -0
  291. package/dist/core/tareas.js +230 -0
  292. package/dist/core/tareas.js.map +1 -0
  293. package/dist/core/textos.js +36 -0
  294. package/dist/core/textos.js.map +1 -0
  295. package/dist/core/turno.js +56 -8
  296. package/dist/core/turno.js.map +1 -1
  297. package/dist/core/version.js +31 -0
  298. package/dist/core/version.js.map +1 -0
  299. package/dist/vendor/sqliteSaver.js +389 -0
  300. package/dist/vendor/sqliteSaver.js.map +1 -0
  301. package/dist/vendor/tokenTracking.js +22 -1
  302. package/dist/vendor/tokenTracking.js.map +1 -1
  303. package/dist/web/servidor/arranque.js +3964 -0
  304. package/dist/web/servidor/arranque.js.map +1 -0
  305. package/dist/web/servidor/consolaDeTarea.js +161 -0
  306. package/dist/web/servidor/consolaDeTarea.js.map +1 -0
  307. package/dist/web/servidor/consolaWeb.js +389 -0
  308. package/dist/web/servidor/consolaWeb.js.map +1 -0
  309. package/dist/web/servidor/corredorDeTareas.js +1119 -0
  310. package/dist/web/servidor/corredorDeTareas.js.map +1 -0
  311. package/dist/web/servidor/pielWeb.js +269 -0
  312. package/dist/web/servidor/pielWeb.js.map +1 -0
  313. package/dist/web/servidor/servidor.js +257 -0
  314. package/dist/web/servidor/servidor.js.map +1 -0
  315. package/dist/web/servidor/sesiones.js +440 -0
  316. package/dist/web/servidor/sesiones.js.map +1 -0
  317. package/dist/web/servidor/transporte.js +169 -0
  318. package/dist/web/servidor/transporte.js.map +1 -0
  319. package/dist/web/servidor/vestibulo.js +1276 -0
  320. package/dist/web/servidor/vestibulo.js.map +1 -0
  321. package/package.json +33 -9
  322. package/skills/archify/LICENSE +22 -0
  323. package/skills/archify/SKILL.md +109 -0
  324. package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
  325. package/skills/archify/assets/template.html +14787 -0
  326. package/skills/archify/bin/archify.mjs +1990 -0
  327. package/skills/archify/bin/open-artifact.mjs +86 -0
  328. package/skills/archify/bin/preview.mjs +648 -0
  329. package/skills/archify/bin/visual-check.mjs +829 -0
  330. package/skills/archify/brand-marks/README.md +31 -0
  331. package/skills/archify/brand-marks/catalog.json +131 -0
  332. package/skills/archify/delta/architecture-delta.mjs +1214 -0
  333. package/skills/archify/examples/agent-run.lifecycle.json +71 -0
  334. package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
  335. package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
  336. package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
  337. package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
  338. package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
  339. package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
  340. package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
  341. package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
  342. package/skills/archify/examples/event-stream.dataflow.json +57 -0
  343. package/skills/archify/examples/incident-response.workflow.json +64 -0
  344. package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
  345. package/skills/archify/examples/product-analytics.dataflow.json +76 -0
  346. package/skills/archify/examples/production-deployment.architecture.json +71 -0
  347. package/skills/archify/examples/release-delivery.workflow.json +62 -0
  348. package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
  349. package/skills/archify/examples/web-app-rendered.html +14862 -0
  350. package/skills/archify/examples/web-app.architecture.json +46 -0
  351. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
  352. package/skills/archify/migrations/workflow-v2.mjs +279 -0
  353. package/skills/archify/package.json +17 -0
  354. package/skills/archify/recipes/scenarios.mjs +391 -0
  355. package/skills/archify/references/authoring-contract.md +198 -0
  356. package/skills/archify/references/brand-marks.md +69 -0
  357. package/skills/archify/references/delivery-contract.md +116 -0
  358. package/skills/archify/references/viewer-runtime.md +45 -0
  359. package/skills/archify/renderers/architecture/grid.mjs +62 -0
  360. package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
  361. package/skills/archify/renderers/dataflow/README.md +104 -0
  362. package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  363. package/skills/archify/renderers/lifecycle/README.md +115 -0
  364. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  365. package/skills/archify/renderers/sequence/README.md +114 -0
  366. package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
  367. package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
  368. package/skills/archify/renderers/shared/cli.mjs +218 -0
  369. package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
  370. package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
  371. package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
  372. package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  373. package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
  374. package/skills/archify/renderers/shared/geometry.mjs +1423 -0
  375. package/skills/archify/renderers/shared/i18n.mjs +594 -0
  376. package/skills/archify/renderers/shared/layout-report.mjs +40 -0
  377. package/skills/archify/renderers/shared/legend.mjs +217 -0
  378. package/skills/archify/renderers/shared/output-path.mjs +321 -0
  379. package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
  380. package/skills/archify/renderers/shared/text-fit.mjs +49 -0
  381. package/skills/archify/renderers/shared/utils.mjs +232 -0
  382. package/skills/archify/renderers/shared/validator.mjs +86 -0
  383. package/skills/archify/renderers/workflow/README.md +223 -0
  384. package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
  385. package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  386. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  387. package/skills/archify/schemas/README.md +211 -0
  388. package/skills/archify/schemas/architecture.schema.json +176 -0
  389. package/skills/archify/schemas/common.schema.json +115 -0
  390. package/skills/archify/schemas/dataflow.schema.json +243 -0
  391. package/skills/archify/schemas/lifecycle.schema.json +266 -0
  392. package/skills/archify/schemas/sequence.schema.json +223 -0
  393. package/skills/archify/schemas/workflow.schema.json +428 -0
  394. package/skills/archify/scripts/check-render-output.mjs +835 -0
  395. package/skills/archify/scripts/check-update.mjs +1667 -0
  396. package/skills/archify/scripts/render-examples.mjs +26 -0
  397. package/skills/archify/scripts/update-contract.mjs +182 -0
  398. package/skills/archify/skill-release.json +10 -0
  399. package/skills/artifacts-builder/SKILL.md +120 -0
  400. package/skills/artifacts-builder/reference/diagramas.md +123 -0
  401. package/skills/artifacts-builder/reference/estilo.md +123 -0
  402. package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
  403. package/skills/artifacts-builder/reference/graficas.md +22 -0
  404. package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
  405. package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
  406. package/skills/xone-hotswap/SKILL.md +185 -0
  407. package/skills/xone-hotswap/references/comandos.md +706 -0
  408. package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
@@ -0,0 +1,466 @@
1
+ /**
2
+ * Qué hay en la máquina para probar una app XOne: el sistema operativo, las herramientas
3
+ * de Android e iOS, y los dispositivos y simuladores a los que se llega.
4
+ *
5
+ * Aquí viven los TIPOS y los parsers PUROS —texto de una herramienta → datos—; quien lanza
6
+ * las herramientas es `agent/dispositivosEnMaquina.ts`. Separarlo así es lo que permite
7
+ * probar cada formato contra una salida real sin que `npm test` necesite ni adb ni Xcode.
8
+ *
9
+ * Tres estados por herramienta y no un booleano: «no encontrada», «falló» (con el motivo) y
10
+ * «bien». Un cuarto, «no aplica», para lo que no se puede detectar en este sistema —Xcode
11
+ * en Windows— y que no es lo mismo que «no hay»: el escritorio los pinta distintos, porque
12
+ * decir «sin iOS» en un Linux sería afirmar algo que la máquina no puede saber. Y un
13
+ * quinto, «desactivada», para el destino que la persona apagó en Ajustes
14
+ * (`core/settings.ts#AjustesDeDispositivos`) — ese no se consulta, y decir que su
15
+ * herramienta no está sería mentir sobre la máquina.
16
+ */
17
+ /**
18
+ * A qué plataforma sirve una herramienta, **en un solo sitio y exhaustivo por TIPO**.
19
+ *
20
+ * Es lo que rellena `Herramienta.plataforma`, y el `switch` sin `default` es lo que hace que
21
+ * una herramienta nueva no compile hasta que alguien decida de quién es. Escribir la
22
+ * plataforma a mano en cada fila de la medida habría sido la misma respuesta catorce veces,
23
+ * y bastaba con olvidarla en una para que esa fila cayera en la pestaña equivocada —o en
24
+ * ninguna— sin que nada diera error.
25
+ */
26
+ export function plataformaDe(nombre) {
27
+ switch (nombre) {
28
+ case "adb":
29
+ case "emulator":
30
+ return "android";
31
+ case "xcrun":
32
+ case "devicectl":
33
+ return "ios";
34
+ }
35
+ }
36
+ /**
37
+ * La receta del emulador de Android en macOS.
38
+ *
39
+ * **Solo macOS, y a propósito.** En Windows y en Linux los gestores y las rutas son otros,
40
+ * así que serán otra receta; devolver esta con otro título sería el botón muerto de siempre,
41
+ * y el panel prefiere decir que aún no la hay.
42
+ *
43
+ * Sale de los pasos que el usuario verificó a mano en su máquina, no de la documentación.
44
+ */
45
+ export function recetaDeEmuladorAndroid(plataforma, estado) {
46
+ if (plataforma !== "darwin")
47
+ return undefined;
48
+ // Lo que xonecode puede lanzar él necesita las herramientas del paso 1: el binario y el
49
+ // JDK con el que corre. Sin ellos el botón no se ofrece y se dice por qué — un botón que
50
+ // no puede cumplir es el botón muerto de siempre.
51
+ const puedeLanzar = estado.sdkmanager && estado.jdk;
52
+ const pasos = [
53
+ {
54
+ titulo: "Instalar las herramientas: el JDK y el SDK de línea de comandos",
55
+ comandos: [
56
+ "brew install openjdk@17",
57
+ "brew install --cask android-commandlinetools android-platform-tools",
58
+ ],
59
+ nota: "Son unos cientos de MB. Ni la fórmula ni el cask piden la contraseña de " +
60
+ "administrador —instalan dentro del prefijo de Homebrew, que es tuyo—, así que " +
61
+ "puedes pegarlo en un terminal o dejar que lo haga xonecode.",
62
+ // `sdkmanager` es lo que instala el cask: si está, el paso está hecho.
63
+ hecho: estado.sdkmanager,
64
+ // **Este es el paso del que colgaban los otros dos.** Sin él, en una máquina nueva la
65
+ // receta entera no tenía un solo botón vivo: los pasos 3 y 4 exigen `sdkmanager`, que
66
+ // es justo lo que instala este. Se ofrece si hay `brew`, que es lo único que necesita.
67
+ ejecutable: estado.brew,
68
+ ...(estado.brew ? {} : { porQueNo: "hace falta Homebrew (brew.sh)" }),
69
+ },
70
+ {
71
+ titulo: "Descargar el emulador y la imagen del sistema",
72
+ // **`platform-tools` no es un extra de esta línea: sin ellos el emulador no ARRANCA.**
73
+ // Se niega a dar por buena la raíz del SDK que no los tenga dentro —«guessed sdk root …
74
+ // does not seem to be valid» y después `Cannot find AVD system path`, con `ANDROID_HOME`
75
+ // apuntando a la raíz correcta—, y el cask `android-commandlinetools` no los trae: el
76
+ // `adb` del PATH viene del cask APARTE `android-platform-tools`, que los deja fuera de
77
+ // la raíz. Medido el 16-sep-2026 en un Mac con la receta entera hecha: sin esta palabra
78
+ // los tres pasos salían «hechos» y `emulator -avd pixel8` fallaba. Es la misma cuenta
79
+ // que ya hace `dispositivosEnMaquina.ts#comoInstalar`, que para un `adb` que falta
80
+ // propone justo `sdkmanager --install "platform-tools"`.
81
+ comandos: [
82
+ 'sdkmanager --install "platform-tools" "emulator" "platforms;android-35" "system-images;android-35;google_apis;arm64-v8a"',
83
+ ],
84
+ nota: "Son 2-3 GB. Puedes pegarlo en un terminal o dejar que lo haga xonecode.",
85
+ hecho: estado.emulator,
86
+ // Se puede lanzar en cuanto están las herramientas del paso 1: no pide contraseña.
87
+ ejecutable: puedeLanzar,
88
+ ...(puedeLanzar ? {} : { porQueNo: "hace falta el paso 1" }),
89
+ // **Este es el único paso que se repite a propósito**, y por eso lleva nombre propio
90
+ // cuando ya está hecho: aquí «volver a pulsar» no es instalar lo mismo, es subir de
91
+ // versión. Sin esto, quitarle el botón a los pasos hechos habría borrado la única vía
92
+ // de actualizar la imagen del sistema.
93
+ repetir: {
94
+ etiqueta: "Actualizar",
95
+ porQue: "volver a pedirlo sube de versión lo que ya está: `sdkmanager --install` sobre un paquete instalado lo actualiza",
96
+ },
97
+ acepta: "las licencias del SDK de Android de Google",
98
+ },
99
+ {
100
+ titulo: "Crear el dispositivo virtual",
101
+ comandos: ['avdmanager create avd -n pixel8 -k "system-images;android-35;google_apis;arm64-v8a" -d pixel_8'],
102
+ nota: "Si lo pegas en un terminal y pregunta por un perfil de hardware, responde `no`.",
103
+ hecho: estado.avds.length > 0,
104
+ // Necesita la imagen del sistema, que la trae el paso 2.
105
+ ejecutable: puedeLanzar && estado.emulator,
106
+ ...(puedeLanzar && estado.emulator ? {} : { porQueNo: puedeLanzar ? "hazlo después del paso 2" : "hace falta el paso 1" }),
107
+ },
108
+ ];
109
+ return {
110
+ id: "android-emulador",
111
+ plataforma: "android",
112
+ titulo: "Instalar el emulador de Android",
113
+ descripcion: "Tres pasos, una vez por máquina. Los comandos se pegan en un terminal; cada paso se " +
114
+ "marca solo cuando la medida lo encuentra, no cuando lo pulsas.",
115
+ pasos,
116
+ completa: pasos.every((p) => p.hecho),
117
+ // El consejo de la shell, fuera de los pasos: ver `Aparte`. Va aquí y no entre ellos
118
+ // porque no se mide, no se lanza desde esta ventana y no puede dejar la receta a medias
119
+ // — que es exactamente lo que hacía cuando era el paso 2.
120
+ aparte: {
121
+ titulo: "Declarar las variables en tu shell",
122
+ comandos: [
123
+ 'export ANDROID_HOME="$(brew --prefix)/share/android-commandlinetools"',
124
+ 'export PATH="$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools"',
125
+ 'export JAVA_HOME="$(brew --prefix openjdk@17)"',
126
+ ],
127
+ nota: "Va en `~/.zshrc`, y luego abre un terminal nuevo o haz `source ~/.zshrc`. " +
128
+ "xonecode NO lo necesita —ya mira la carpeta de Homebrew para encontrar el SDK—: " +
129
+ "esto es para que `emulator` y `adb` te funcionen en tu terminal, y sin ello el " +
130
+ "comando de abajo hay que escribirlo con la ruta entera. No es un paso: no se mide, " +
131
+ "no se lanza desde aquí y la receta no espera a que lo hagas.",
132
+ },
133
+ // Arrancar un emulador es un proceso de vida larga y otra capacidad; hoy no está
134
+ // cableado, así que se da el comando en vez de prometer un botón.
135
+ despues: "Para arrancarlo: `emulator -avd pixel8`. Con él abierto, `adb devices` lista " +
136
+ "`emulator-5554` y aparecerá aquí. Arrancarlo desde esta ventana todavía no está cableado.",
137
+ };
138
+ }
139
+ /**
140
+ * La receta del simulador de iOS en macOS.
141
+ *
142
+ * **Solo macOS, y no por elección**: los simuladores de iOS los da Xcode, que no existe en
143
+ * ningún otro sistema. Fuera de macOS la respuesta no es otra receta, es que no hay ninguna.
144
+ *
145
+ * Los tres pasos son COPIABLES y ninguno se lanza desde aquí, al contrario que la de
146
+ * Android. Es la regla de siempre —se ofrece ejecutar lo que se puede cumplir— aplicada a lo
147
+ * que cada comando necesita de verdad:
148
+ * - **Xcode se instala del App Store.** No hay comando que lo haga; lo que se da es el que
149
+ * abre su ficha. Un botón «Ejecutar este paso» que solo abriera una ventana del App Store
150
+ * diría que ha hecho el paso, y no lo ha hecho.
151
+ * - **La licencia lleva `sudo` escrito en el comando.** Sin terminal de control `sudo` falla
152
+ * en el acto (medido), así que el botón no se colgaría — fallaría SIEMPRE, que es la otra
153
+ * forma del botón muerto.
154
+ * - **El runtime pide autorización de administrador en una VENTANA del sistema.** Eso no se
155
+ * puede contestar por `stdin` ni fallar rápido: se queda esperando a alguien que está
156
+ * mirando el navegador, no el escritorio.
157
+ *
158
+ * Y hay que decir lo que se mide de esta máquina: aquí, el 10-09-2026, los tres pasos están
159
+ * hechos (Xcode 26.6, licencia aceptada, tres runtime de iOS), así que la receta sale
160
+ * `completa` y el panel dice «ya está» en vez de cuatro pasos que sobran.
161
+ */
162
+ export function recetaDeSimuladorIos(plataforma, estado) {
163
+ if (plataforma !== "darwin")
164
+ return undefined;
165
+ const pasos = [
166
+ {
167
+ titulo: "Instalar Xcode completo (no solo las herramientas de línea de comandos)",
168
+ // `open` con el esquema del App Store: es lo máximo que un comando puede hacer aquí.
169
+ comandos: ['open "macappstore://apps.apple.com/app/id497799835"'],
170
+ nota: "Son unos 10 GB del App Store y no hay comando que lo instale: esto solo abre su " +
171
+ "ficha. Las Command Line Tools por sí solas no traen ningún simulador.",
172
+ hecho: estado.xcode,
173
+ ejecutable: false,
174
+ porQueNo: "Xcode se instala desde el App Store, no con un comando",
175
+ },
176
+ {
177
+ titulo: "Aceptar la licencia y apuntar a Xcode",
178
+ // `/Applications/Xcode.app` es una constante de macOS —igual en todas—, no una ruta
179
+ // MEDIDA de esta máquina: no es la excepción a la regla de arriba, que existe para que
180
+ // no viaje el home de nadie ni un prefijo que cambia entre Intel y Apple Silicon.
181
+ comandos: [
182
+ "sudo xcode-select -s /Applications/Xcode.app/Contents/Developer",
183
+ "sudo xcodebuild -license accept",
184
+ ],
185
+ nota: "Pide la contraseña de administrador, y eso solo se teclea en un terminal: un " +
186
+ "proceso lanzado desde aquí no tiene dónde leerla y falla en el acto. Por eso este " +
187
+ "paso no lleva botón.",
188
+ hecho: estado.licencia,
189
+ ejecutable: false,
190
+ porQueNo: "lleva `sudo`, y la contraseña solo se puede teclear en un terminal",
191
+ },
192
+ {
193
+ titulo: "Descargar el runtime de iOS del simulador",
194
+ comandos: ["xcodebuild -downloadPlatform iOS"],
195
+ nota: "Son varios GB y puede pedirte autorización de administrador en una ventana del " +
196
+ "sistema, así que se pega en un terminal. Con `-downloadAllPlatforms` se traen " +
197
+ "también watchOS, tvOS y visionOS, que aquí no hacen falta.",
198
+ hecho: estado.runtimes.length > 0,
199
+ ejecutable: false,
200
+ porQueNo: "pide autorización en una ventana del sistema, que un proceso de aquí no puede contestar",
201
+ },
202
+ ];
203
+ return {
204
+ id: "ios-simulador",
205
+ plataforma: "ios",
206
+ titulo: "Instalar el simulador de iOS",
207
+ descripcion: "Tres pasos, una vez por máquina. Los comandos se pegan en un terminal; cada paso se " +
208
+ "marca solo cuando la medida lo encuentra, no cuando lo pulsas.",
209
+ pasos,
210
+ completa: pasos.every((p) => p.hecho),
211
+ // Xcode crea un simulador por modelo con cada runtime que instalas, así que «crear» no
212
+ // es un paso: con el runtime puesto ya hay lista. Arrancar uno todavía no está cableado.
213
+ despues: estado.runtimes.length === 0
214
+ ? "Con el runtime instalado, Xcode ya deja una lista de simuladores hecha: aparecerán aquí. Para arrancar uno, `xcrun simctl boot <UDID>`; arrancarlo desde esta ventana todavía no está cableado."
215
+ : `Runtime de iOS instalados: ${estado.runtimes.join(", ")}. Para arrancar un simulador, \`xcrun simctl boot <UDID>\`; arrancarlo desde esta ventana todavía no está cableado.`,
216
+ };
217
+ }
218
+ /** El sistema, a partir de `process.platform`. */
219
+ export function sistemaDe(platform) {
220
+ if (platform === "darwin")
221
+ return "mac";
222
+ if (platform === "win32")
223
+ return "windows";
224
+ if (platform === "linux")
225
+ return "linux";
226
+ return "otro";
227
+ }
228
+ export function nombreDelSistema(sistema) {
229
+ return { mac: "macOS", windows: "Windows", linux: "Linux", otro: "sistema desconocido" }[sistema];
230
+ }
231
+ /**
232
+ * `adb devices -l`. Formato estable desde hace años:
233
+ *
234
+ * List of devices attached
235
+ * emulator-5554 device product:sdk_gphone64_arm64 model:sdk_gphone64_arm64 device:emu64a transport_id:1
236
+ * R58M12ABCDE unauthorized transport_id:2
237
+ * 192.168.1.20:5555 offline
238
+ *
239
+ * El nombre sale de `model:` (con los guiones bajos como espacios) y, sin él, del serial.
240
+ * Un serial `emulator-N` es un emulador; lo demás, físico (incluido un dispositivo por red).
241
+ */
242
+ export function parsearAdbDevices(texto) {
243
+ const salida = [];
244
+ for (const linea of texto.split(/\r?\n/)) {
245
+ const l = linea.trim();
246
+ if (l === "" || /^List of devices/i.test(l) || l.startsWith("*"))
247
+ continue;
248
+ const [serial, estadoCrudo, ...resto] = l.split(/\s+/);
249
+ if (serial === undefined || estadoCrudo === undefined)
250
+ continue;
251
+ const campos = new Map();
252
+ for (const parte of resto) {
253
+ const i = parte.indexOf(":");
254
+ if (i > 0)
255
+ campos.set(parte.slice(0, i), parte.slice(i + 1));
256
+ }
257
+ const estado = estadoCrudo === "device"
258
+ ? "conectado"
259
+ : estadoCrudo === "unauthorized"
260
+ ? "sin-autorizar"
261
+ : estadoCrudo === "offline"
262
+ ? "offline"
263
+ : "no-disponible";
264
+ const modelo = campos.get("model");
265
+ salida.push({
266
+ id: serial,
267
+ nombre: modelo === undefined ? serial : modelo.replace(/_/g, " "),
268
+ plataforma: "android",
269
+ clase: serial.startsWith("emulator-") ? "emulador" : "fisico",
270
+ estado,
271
+ ...(estado === "no-disponible" ? { detalle: `estado «${estadoCrudo}»` } : {}),
272
+ ...(estado === "sin-autorizar" ? { detalle: "acepta la depuración USB en el dispositivo" } : {}),
273
+ });
274
+ }
275
+ return salida;
276
+ }
277
+ /**
278
+ * `emulator -list-avds`: un nombre por línea. Las versiones recientes mezclan líneas
279
+ * `INFO | …` (van a stderr, pero por si acaso se descartan también aquí).
280
+ */
281
+ export function parsearAvds(texto) {
282
+ return texto
283
+ .split(/\r?\n/)
284
+ .map((l) => l.trim())
285
+ .filter((l) => l !== "" && !/^(INFO|WARNING|ERROR)\b/.test(l));
286
+ }
287
+ /**
288
+ * `xcrun simctl list -j devices available`. Forma MEDIDA en esta máquina (Xcode con iOS 26):
289
+ *
290
+ * { "devices": { "com.apple.CoreSimulator.SimRuntime.iOS-26-0": [
291
+ * { "udid": "EF39…", "isAvailable": true, "state": "Shutdown", "name": "iPhone 17 Pro", … } ] } }
292
+ *
293
+ * El runtime se lee de la clave: «iOS-26-0» → «iOS 26.0». `Booted` es el único estado en que
294
+ * se llega al simulador; `Shutdown` es apagado, y cualquier otro se enseña como no disponible
295
+ * con su valor.
296
+ */
297
+ export function parsearSimctl(json) {
298
+ let datos;
299
+ try {
300
+ datos = JSON.parse(json);
301
+ }
302
+ catch {
303
+ return [];
304
+ }
305
+ const devices = datos?.devices;
306
+ if (devices === undefined || devices === null || typeof devices !== "object")
307
+ return [];
308
+ const salida = [];
309
+ for (const [runtime, lista] of Object.entries(devices)) {
310
+ if (!Array.isArray(lista))
311
+ continue;
312
+ const version = runtime.split(".").pop() ?? runtime; // «iOS-26-0»
313
+ const legible = version.replace(/^([A-Za-z]+)-(\d+)-(\d+)$/, "$1 $2.$3").replace(/-/g, " ");
314
+ for (const d of lista) {
315
+ if (typeof d.udid !== "string" || typeof d.name !== "string")
316
+ continue;
317
+ if (d.isAvailable === false)
318
+ continue;
319
+ const estado = d.state === "Booted" ? "arrancado" : d.state === "Shutdown" ? "apagado" : "no-disponible";
320
+ salida.push({
321
+ id: d.udid,
322
+ nombre: `${d.name} · ${legible}`,
323
+ plataforma: "ios",
324
+ clase: "simulador",
325
+ estado,
326
+ ...(estado === "no-disponible" ? { detalle: `estado «${String(d.state)}»` } : {}),
327
+ });
328
+ }
329
+ }
330
+ return salida;
331
+ }
332
+ /**
333
+ * Los runtime de iOS del simulador, del MISMO `xcrun simctl list -j` que ya trae los
334
+ * dispositivos: se le añade el dominio `runtimes` y con eso viene en la misma respuesta.
335
+ *
336
+ * Eso es lo que hace que saber si falta el runtime no cueste NI UN proceso más, que es la
337
+ * regla de esta pantalla: medir cuesta procesos en el equipo del usuario. La otra forma,
338
+ * `xcrun simctl runtime list -j`, existe y contesta lo mismo —medido: un objeto indexado por
339
+ * uuid con `platformIdentifier` y `state: "Ready"`— pero es una llamada aparte.
340
+ *
341
+ * Forma MEDIDA aquí (Xcode 26.6):
342
+ *
343
+ * { "runtimes": [ { "name": "iOS 26.0", "version": "26.0.1", "isAvailable": true,
344
+ * "platform": "iOS", "identifier": "…SimRuntime.iOS-26-0" } ],
345
+ * "devices": { … } }
346
+ *
347
+ * Solo los de **iOS** y solo los `isAvailable`: uno a medio descargar no arranca nada, y con
348
+ * watchOS o tvOS instalados la cifra diría que hay iOS cuando no lo hay. `isAvailable` se
349
+ * mira como booleano de verdad —la trampa del `"false"` de cadena— y **ausente cuenta como
350
+ * disponible**: este listado ya se pide con `available`, así que quien no lo esté no llega
351
+ * hasta aquí, y descartar lo que no lo declara diría que no hay runtime teniéndolos.
352
+ */
353
+ export function parsearRuntimesDeIos(json) {
354
+ let datos;
355
+ try {
356
+ datos = JSON.parse(json);
357
+ }
358
+ catch {
359
+ return [];
360
+ }
361
+ const lista = datos?.runtimes;
362
+ if (!Array.isArray(lista))
363
+ return [];
364
+ const salida = [];
365
+ for (const entrada of lista) {
366
+ if (entrada === null || typeof entrada !== "object")
367
+ continue;
368
+ if (entrada.platform !== "iOS")
369
+ continue;
370
+ if (entrada.isAvailable === false)
371
+ continue;
372
+ const version = typeof entrada.version === "string" ? entrada.version : undefined;
373
+ const nombre = typeof entrada.name === "string" ? entrada.name : undefined;
374
+ if (version === undefined && nombre === undefined)
375
+ continue;
376
+ salida.push(nombre ?? `iOS ${version}`);
377
+ }
378
+ return salida;
379
+ }
380
+ /**
381
+ * `xcrun devicectl list devices --json-output <fichero>`. Forma DOCUMENTADA (Xcode 15+),
382
+ * no medida: en esta máquina no hay ningún dispositivo iOS físico, y el fichero real
383
+ * trae `result.devices: []`. Campos: `identifier`, `deviceProperties.name`,
384
+ * `connectionProperties.tunnelState` («connected» | «unavailable» | …) y
385
+ * `hardwareProperties.platform`.
386
+ */
387
+ export function parsearDevicectl(json) {
388
+ let datos;
389
+ try {
390
+ datos = JSON.parse(json);
391
+ }
392
+ catch {
393
+ return [];
394
+ }
395
+ const lista = datos?.result?.devices;
396
+ if (!Array.isArray(lista))
397
+ return [];
398
+ const salida = [];
399
+ for (const d of lista) {
400
+ const id = d.identifier;
401
+ if (typeof id !== "string")
402
+ continue;
403
+ const props = (d.deviceProperties ?? {});
404
+ const conexion = (d.connectionProperties ?? {});
405
+ const hardware = (d.hardwareProperties ?? {});
406
+ const nombre = typeof props.name === "string" ? props.name : id;
407
+ const tunel = typeof conexion.tunnelState === "string" ? conexion.tunnelState : "";
408
+ const estado = tunel === "connected" ? "conectado" : "no-disponible";
409
+ const plataforma = typeof hardware.platform === "string" ? hardware.platform : "";
410
+ salida.push({
411
+ id,
412
+ nombre: plataforma === "" ? nombre : `${nombre} · ${plataforma}`,
413
+ plataforma: "ios",
414
+ clase: "fisico",
415
+ estado,
416
+ ...(estado === "no-disponible" ? { detalle: tunel === "" ? "sin túnel" : `túnel «${tunel}»` } : {}),
417
+ });
418
+ }
419
+ return salida;
420
+ }
421
+ /**
422
+ * La línea que EXPLICA un fallo de `simctl`, de entre las que escribe.
423
+ *
424
+ * Medido el 10-09-2026 con `xcrun simctl spawn <udid>` sobre un simulador apagado: la
425
+ * primera línea es papeleo y la segunda es lo que hay que leer.
426
+ *
427
+ * An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
428
+ * Process spawn via launchd failed because device is not booted.
429
+ * Underlying error (domain=com.apple.SimLaunchHostService.RequestError, code=3):
430
+ *
431
+ * `describirFallo` se queda con la PRIMERA línea de stderr, que aquí es justo la que no dice
432
+ * nada —un dominio y un número—, así que esta elige la primera que no sea de papeleo. Sin
433
+ * esto, verificar un simulador apagado contestaba con un código de error en vez de con
434
+ * «no está arrancado».
435
+ */
436
+ export function motivoDeSimctl(texto) {
437
+ for (const linea of texto.split(/\r?\n/)) {
438
+ const l = linea.trim();
439
+ if (l === "")
440
+ continue;
441
+ if (/^An error was encountered/i.test(l))
442
+ continue;
443
+ if (/^Underlying error/i.test(l))
444
+ continue;
445
+ return l;
446
+ }
447
+ return undefined;
448
+ }
449
+ /**
450
+ * ¿Este estado es «se puede hablar con él»? El criterio vive AQUÍ y en un solo sitio.
451
+ *
452
+ * Estaba escrito a mano dentro de `alcanzables()`, y el veredicto de lanzamiento
453
+ * (`core/puedeLanzarse.ts`) necesitaba lo mismo: una segunda definición de «alcanzable» es un
454
+ * segundo sitio donde puede dejar de significar lo mismo —el día que un estado nuevo contara
455
+ * como llegada, uno de los dos se enteraría y el otro no—, que es como se ha roto este repo
456
+ * nueve veces. El test que ata las dos respuestas estado a estado es lo que impide que la copia
457
+ * vuelva.
458
+ */
459
+ export function esAlcanzable(estado) {
460
+ return estado === "conectado" || estado === "arrancado";
461
+ }
462
+ /** Con qué dispositivos SE LLEGA ahora mismo: es lo que el escritorio lista por nombre. */
463
+ export function alcanzables(informe) {
464
+ return informe.dispositivos.filter((d) => esAlcanzable(d.estado));
465
+ }
466
+ //# sourceMappingURL=dispositivos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispositivos.js","sourceRoot":"","sources":["../../src/core/dispositivos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * La medida a partir de lo que el turno informó. **Ausente no es vacío.**
3
+ *
4
+ * Un ejecutor que no informa —el guionizado, o una piel que no reenvíe el retorno— no ha
5
+ * dicho que el verificador esté verde: ha dicho nada. Darlo por verde sería la entrega
6
+ * silenciosa que todo esto existe para impedir, así que se traduce a `no-corrio` DICIENDO
7
+ * que nadie informó, que es otra cosa que «el simulador no está».
8
+ */
9
+ export function medidaDeEntrega(resultado,
10
+ /** Lo que dice git de la sesión. `escribio` y `cambiados` solo se afirman con marca: ver
11
+ * los campos. Ausente no se rellena con nada, en las dos. */
12
+ revision,
13
+ /** Cuántas escrituras autorizó el turno, si consta. Ver `MedidaDeEntrega.autorizadas`. */
14
+ autorizadas) {
15
+ const deGit = {
16
+ revisable: revision.revisable,
17
+ ...(revision.escribio === undefined ? {} : { escribio: revision.escribio }),
18
+ ...(revision.cambiados === undefined ? {} : { cambiados: revision.cambiados }),
19
+ ...(autorizadas === undefined ? {} : { autorizadas }),
20
+ };
21
+ if (resultado === undefined) {
22
+ return {
23
+ verificador: "no-corrio",
24
+ pendientes: 0,
25
+ ...deGit,
26
+ motivoSinVerificar: "el ejecutor de este turno no informa de lo que pasó",
27
+ };
28
+ }
29
+ return { ...resultado, ...deGit };
30
+ }
31
+ /** Cuántos ERRORES trae un veredicto rojo. Los avisos no tumban la entrega. */
32
+ const erroresDe = (hallazgos) => (hallazgos ?? []).filter((h) => h.severidad === "error").length;
33
+ /**
34
+ * Lo que se dice de una entrega a la que le faltó una condición porque no APLICABA.
35
+ *
36
+ * Se exporta para que quien la lea (y quien la pruebe) no la reescriba a mano.
37
+ */
38
+ export const SALVEDAD_SIN_ESCRITURAS = "el turno no cambió ningún fichero, así que no había nada que verificar: la entrega va " +
39
+ "solo con la valoración del juez";
40
+ /**
41
+ * Las tres condiciones que comprueba el CÓDIGO. Pura.
42
+ *
43
+ * El motivo nombra TODAS las que fallaron y no la primera: es el caso medido de la deuda
44
+ * que esta pieza hereda —un turno cortado por el tope tiene escrituras pendientes Y un
45
+ * verificador que no corrió—, y decir solo una de las dos manda a adivinar la otra. Es la
46
+ * misma regla del aviso de honestidad que saca los NOMBRES de los ficheros en vez de un
47
+ * contador.
48
+ */
49
+ export function condicionesDeEntrega(medida) {
50
+ const fallos = [];
51
+ /**
52
+ * **El verificador no aplica cuando no se escribió nada, y eso NO es relajar la regla.**
53
+ *
54
+ * «Un verificador que no corrió no es verde» existe porque una tarea que ESCRIBIÓ sin
55
+ * verificarse está sin verificar. Una que no cambió ningún fichero no tiene nada que
56
+ * verificar: el dominio del verificador son las escrituras, así que ahí la condición no
57
+ * aplica en vez de fallar — y cuando no aplica, se DICE (ver `salvedad`), porque una
58
+ * entrega con una condición menos no puede parecer una entrega normal.
59
+ *
60
+ * Se compara con `=== false` y no con un `!`: `undefined` es «no se sabe» y entonces la
61
+ * condición se exige como siempre.
62
+ */
63
+ /**
64
+ * **Autorizó escrituras y git no ve ni un cambio: nada aterrizó.**
65
+ *
66
+ * `Tarea.autorizadas` se apunta al AUTORIZAR, o sea antes de que el backend escriba, así
67
+ * que una ruta que las guardas rechazan —`/artifacts/`, una vista aplanada, `/.env`— sale
68
+ * ahí sin tocar el disco. Si git no ve ningún cambio y el turno autorizó escrituras,
69
+ * TODAS se quedaron por el camino (o escribieron lo que ya estaba): la tarea se cree que
70
+ * trabajó y no cambió el proyecto. Es un hecho comprobable, así que se mide aquí en vez de
71
+ * contárselo al juez — la misma razón por la que su veredicto no basta solo.
72
+ *
73
+ * Y **manda sobre la salvedad de la tarea de solo lectura**: eso significa «el dominio del
74
+ * verificador son las escrituras y no hubo ninguna», y aquí sí las hubo, solo que no
75
+ * llegaron. Tratarlo como solo lectura entregaría el caso al revés.
76
+ */
77
+ const nadaAterrizo = medida.escribio === false && (medida.autorizadas ?? 0) > 0;
78
+ if (nadaAterrizo) {
79
+ fallos.push(`el turno autorizó ${medida.autorizadas} escritura(s) y git no ve ningún cambio en el ` +
80
+ "proyecto: o las rechazó una guarda de ruta, o escribieron lo que ya estaba");
81
+ }
82
+ const nadaQueVerificar = medida.escribio === false && !nadaAterrizo;
83
+ if (nadaQueVerificar) {
84
+ // Nada. Las otras dos condiciones siguen enteras: unas escrituras que quedaron
85
+ // esperando aprobación son escrituras que el turno quiso hacer y no hizo, y sin marca de
86
+ // git no se puede afirmar que no escribiera nada — ese caso no llega aquí.
87
+ }
88
+ else if (medida.verificador === "rojo") {
89
+ const errores = erroresDe(medida.hallazgos);
90
+ fallos.push(errores > 0
91
+ ? `el verificador dejó ${errores} error(es) sin corregir`
92
+ : "el verificador acabó en rojo");
93
+ }
94
+ else if (medida.verificador === "no-corrio") {
95
+ fallos.push(`el verificador no corrió en este turno${medida.motivoSinVerificar === undefined ? "" : ` (${medida.motivoSinVerificar})`}`);
96
+ }
97
+ if (medida.pendientes > 0) {
98
+ fallos.push(`quedaron ${medida.pendientes} escritura(s) esperando aprobación, y no se aplicaron`);
99
+ }
100
+ if (!medida.revisable) {
101
+ fallos.push("no se puede revisar lo que ha escrito: la sesión no dejó marca de git con la que comparar");
102
+ }
103
+ if (fallos.length === 0) {
104
+ return { entregable: true, ...(nadaQueVerificar ? { salvedad: SALVEDAD_SIN_ESCRITURAS } : {}) };
105
+ }
106
+ return { entregable: false, motivo: fallos.join("; ") };
107
+ }
108
+ /**
109
+ * La decisión final: las condiciones Y el juez.
110
+ *
111
+ * El orden importa y es el de siempre, fail-closed: si una condición falla, el veredicto
112
+ * del juez no se mira siquiera — su motivo sería ruido sobre un hecho. Quien llama puede
113
+ * además preguntar primero por `condicionesDeEntrega` para no gastar una llamada del
114
+ * modelo más caro cuando ya se sabe que no se entrega; esta función vuelve a comprobarlas
115
+ * porque la garantía no puede depender de que quien llama lo haya hecho en ese orden.
116
+ *
117
+ * **Sin veredicto no se entrega.** Es lo que hace que «el juez no se puede usar» sea un
118
+ * fallo del entorno con la tarea esperando feedback, y no una entrega en silencio.
119
+ */
120
+ export function decisionDeEntrega(medida, veredicto) {
121
+ const condiciones = condicionesDeEntrega(medida);
122
+ if (!condiciones.entregable)
123
+ return condiciones;
124
+ if (veredicto === undefined) {
125
+ return {
126
+ entregable: false,
127
+ motivo: "no hay veredicto del juez de QA, y sin él una tarea no se entrega",
128
+ };
129
+ }
130
+ if (veredicto.veredicto !== "verde") {
131
+ return {
132
+ entregable: false,
133
+ motivo: `el juez de QA dijo «${veredicto.veredicto}»: ${veredicto.resumen}`,
134
+ };
135
+ }
136
+ // La salvedad de las condiciones viaja hasta aquí: es la entrega la que hay que poder
137
+ // leer, no un paso intermedio. Con el verificador fuera de juego, el veredicto del juez
138
+ // es la única condición de CONTENIDO que quedaba, y eso es lo que dice.
139
+ return { entregable: true, ...(condiciones.salvedad === undefined ? {} : { salvedad: condiciones.salvedad }) };
140
+ }
141
+ //# sourceMappingURL=entrega.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrega.js","sourceRoot":"","sources":["../../src/core/entrega.ts"],"names":[],"mappings":"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"}