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 @@
1
+ {"version":3,"file":"escrituraExterna.js","sourceRoot":"","sources":["../../src/agent/escrituraExterna.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
2
+ function esRegistro(valor) {
3
+ return typeof valor === "object" && valor !== null && !Array.isArray(valor);
4
+ }
5
+ /**
6
+ * La API de function calling de Gemini acepta solo una parte de OpenAPI. Zod
7
+ * traduce `.positive()`, `.max()` o `.regex()` a restricciones que son válidas
8
+ * en JSON Schema, pero que Gemini rechaza (por ejemplo `exclusiveMinimum`).
9
+ *
10
+ * La validación real no se pierde: Zod sigue comprobando los argumentos cuando
11
+ * la tool se ejecuta. Aquí solo se rebaja la declaración enviada al modelo.
12
+ */
13
+ const RESTRICCIONES_NO_COMPATIBLES = new Set([
14
+ "default",
15
+ "exclusiveMinimum",
16
+ "exclusiveMaximum",
17
+ "minimum",
18
+ "maximum",
19
+ "multipleOf",
20
+ "minLength",
21
+ "maxLength",
22
+ "pattern",
23
+ "minItems",
24
+ "maxItems",
25
+ "minProperties",
26
+ "maxProperties",
27
+ "additionalProperties",
28
+ ]);
29
+ /**
30
+ * Gemini recibe los esquemas de function calling como un subconjunto de OpenAPI:
31
+ * `type` es escalar y la nulabilidad se expresa con `nullable`. Zod genera la
32
+ * unión JSON Schema `type: [T, "null"]` para los argumentos optional+nullable
33
+ * de las herramientas de filesystem de Deep Agents.
34
+ */
35
+ function normalizarEsquemaGemini(valor, esEsquema = false) {
36
+ if (Array.isArray(valor))
37
+ return valor.map((hijo) => normalizarEsquemaGemini(hijo, esEsquema));
38
+ if (!esRegistro(valor))
39
+ return valor;
40
+ const salida = {};
41
+ for (const [clave, hijo] of Object.entries(valor)) {
42
+ // No se puede hacer este filtro en todos los objetos: `pattern` también es
43
+ // un nombre perfectamente válido de ARGUMENTO dentro de `properties`.
44
+ if (esEsquema && RESTRICCIONES_NO_COMPATIBLES.has(clave))
45
+ continue;
46
+ if (clave === "properties" || clave === "$defs" || clave === "defs") {
47
+ salida[clave] = esRegistro(hijo)
48
+ ? Object.fromEntries(Object.entries(hijo).map(([nombre, schema]) => [nombre, normalizarEsquemaGemini(schema, true)]))
49
+ : hijo;
50
+ continue;
51
+ }
52
+ if (clave === "items" || clave === "anyOf" || clave === "any_of") {
53
+ salida[clave] = normalizarEsquemaGemini(hijo, true);
54
+ continue;
55
+ }
56
+ // `parameters` vive en la declaración de function calling y es la raíz de
57
+ // un schema; fuera de ahí seguimos recorriendo la configuración sin filtrar.
58
+ salida[clave] = normalizarEsquemaGemini(hijo, clave === "parameters" || clave === "response");
59
+ }
60
+ if (!Array.isArray(salida.type))
61
+ return salida;
62
+ const tipos = salida.type.filter((tipo) => typeof tipo === "string");
63
+ const sinNull = tipos.filter((tipo) => tipo !== "null");
64
+ if (!tipos.includes("null") || sinNull.length !== 1)
65
+ return salida;
66
+ salida.type = sinNull[0];
67
+ salida.nullable = true;
68
+ return salida;
69
+ }
70
+ /** Cliente de Gemini que adapta los esquemas de tools al formato de su API. */
71
+ export class ChatGoogleGenerativeAICompatible extends ChatGoogleGenerativeAI {
72
+ bindTools(...args) {
73
+ const ligado = super.bindTools(...args);
74
+ const config = ligado;
75
+ if (config.config.tools !== undefined) {
76
+ config.config.tools = normalizarEsquemaGemini(config.config.tools);
77
+ }
78
+ return ligado;
79
+ }
80
+ }
81
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agent/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Lo que `instantanea.ts` (la foto del ANTES por turno) y `gitSync.ts` (el libro de
3
+ * cuentas de la subida a CloudStudio) necesitan de git y no depende de para qué lo usa
4
+ * cada uno. Estaba copiado en los dos ficheros y ya había DIVERGIDO — este módulo es la
5
+ * única fuente de esa lógica de aquí en adelante.
6
+ */
7
+ import { mkdtempSync, rmSync } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ /**
11
+ * Índice de git propio y temporal, para poder construir un árbol (`git add` + `write-tree`
12
+ * o `commit-tree`) sin pasar por el índice de verdad.
13
+ *
14
+ * Existe porque el usuario puede tener trabajo a medias en SU staging cuando xonecode
15
+ * necesita fotografiar el árbol (al empezar un turno, o al hacer un `/sync`) — tocárselo
16
+ * sería imperdonable: perdería la frontera entre lo que él decidió `add`-ear y lo que no.
17
+ * Un índice aparte, en un directorio temporal que se limpia al terminar, dejar hacer todo
18
+ * esto sin que el índice real se entere de que existió.
19
+ *
20
+ * `etiqueta` solo distingue el prefijo del directorio temporal entre llamadores (útil para
21
+ * reconocer de quién es un directorio huérfano si algo no limpia bien); no cambia el
22
+ * comportamiento.
23
+ */
24
+ export function indicePrivado(etiqueta) {
25
+ const dir = mkdtempSync(join(tmpdir(), `xonecode-${etiqueta}-`));
26
+ return { ruta: join(dir, "git.index"), limpiar: () => rmSync(dir, { recursive: true, force: true }) };
27
+ }
28
+ /**
29
+ * Saca `.xonecode` de un índice PRIVADO recién construido con `git add -A`.
30
+ *
31
+ * Va aquí y no en un pathspec del `add` porque ese camino está medido y no vale: `git add`
32
+ * con `:(exclude).xonecode` en un repo donde la carpeta YA está ignorada —el caso normal,
33
+ * `prepararRepo` escribe `info/exclude`— da por nombrada una ruta ignorada y **sale con
34
+ * código 1**. `rm --cached` con `--ignore-unmatch` funciona en los dos casos y no dice nada
35
+ * cuando no había qué quitar.
36
+ *
37
+ * Y hace falta desde que ahí dentro vive el checkpointer: en un proyecto CLOUD la carpeta
38
+ * está excluida y esto es un no-op, pero en modo OFFLINE sobre el repo del usuario nadie
39
+ * escribió ese exclude —lo dice la cabecera de `sesionGit.ts`—, así que cada foto metía
40
+ * `checkpoint.sqlite` entero en `.git/objects`. Con `MemorySaver` eran unos KB de `.jsonl`
41
+ * y no se notaba; medido hoy, ese fichero son 30 MB que cambian en cada superpaso, y las
42
+ * refs `refs/xonecode/sesion/*` mantienen vivo cada blob para siempre.
43
+ *
44
+ * No cambia lo que se REPORTA en un proyecto cloud (ya no salía), y en uno offline alinea
45
+ * las dos vistas: `sesionGit.ts` ya excluye `.xonecode` de sus diffs a propósito.
46
+ */
47
+ export async function sacarXonecodeDelIndice(ejecutar, raiz, indice) {
48
+ await ejecutar("git", ["rm", "-r", "--cached", "--ignore-unmatch", "-q", "--", ".xonecode"], {
49
+ cwd: raiz,
50
+ env: { ...process.env, GIT_INDEX_FILE: indice },
51
+ });
52
+ }
53
+ /**
54
+ * Traduce la marca de una línea de `git diff --name-status` (la primera letra: `A`, `M`,
55
+ * `D`, `R100`, …) a una de las tres clases de `Cambio`/`CambioLocal`.
56
+ *
57
+ * Esto es la parte que había divergido: `gitSync.ts` mapeaba `T` (cambio de tipo, p.ej.
58
+ * fichero → symlink) a `modificado` pero DESCARTABA en silencio cualquier marca que no
59
+ * reconociera; `instantanea.ts` no mapeaba `T` pero usaba `?? "modificado"` como omisión
60
+ * para lo desconocido. La regla unificada, pensada por caso de uso y no promediada:
61
+ *
62
+ * - `A` es alta limpia (`nuevo`) y `D` es baja limpia (`borrado`): son las dos únicas
63
+ * marcas que hay que distinguir de un cambio de contenido, porque de ellas depende el
64
+ * candado de `planDeSubida` (solo se borra lo que se descargó) y el alta/baja del plan.
65
+ * - CUALQUIER OTRA MARCA —`M`, `R`, `C`, `T`, o una que git añada mañana y que hoy no
66
+ * conocemos— se trata como `modificado`. Para `instantanea.ts` (la foto del ANTES: solo
67
+ * alimenta el deshacer y el diff que lee el modelo) tratar de más como "cambiado" cuesta,
68
+ * como mucho, una línea de diff rara. Para `gitSync.ts` (el plan de subida) la alternativa
69
+ * —descartar la línea, que es lo que hacía antes— es el peor fallo posible: una marca
70
+ * perdida es un fichero que ni sube ni se borra en CloudStudio, y nada avisa de ello. Entre
71
+ * "invisible por defecto" y "visible por defecto", esto último es lo seguro en los dos
72
+ * sitios, así que gana en los dos. `T` en concreto sigue el mismo criterio: es un cambio
73
+ * de contenido (el fichero pasó de ser una cosa a ser otra), no un alta ni una baja.
74
+ */
75
+ export function claseDeCambio(marca) {
76
+ const letra = marca.charAt(0);
77
+ if (letra === "A")
78
+ return "nuevo";
79
+ if (letra === "D")
80
+ return "borrado";
81
+ return "modificado";
82
+ }
83
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/agent/git.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxG,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAA8G,EAC9G,IAAY,EACZ,MAAc;IAEd,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE;QAC3F,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,441 @@
1
+ /**
2
+ * El git local como libro de cuentas de la sincronización.
3
+ *
4
+ * La idea entera: CloudStudio se declara como un remoto SIN servidor git detrás, y su
5
+ * estado vive en una ref de seguimiento. Así `git status` responde «¿está subido?» sin
6
+ * que xonecode invente un fichero de estado — y dos fuentes de verdad para lo mismo es
7
+ * como se rompe esto a los tres meses.
8
+ */
9
+ import { execFile } from "node:child_process";
10
+ import { promisify } from "node:util";
11
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync } from "node:fs";
12
+ import { basename, dirname, resolve } from "node:path";
13
+ import { indicePrivado, claseDeCambio } from "./git.js";
14
+ import { NOMBRE_CARPETA } from "./configEnDisco.js";
15
+ import { selloDeSesion } from "./sesionGit.js";
16
+ const ejecutar = promisify(execFile);
17
+ export const REMOTO = "cloudstudio";
18
+ const EXCLUSION = `${NOMBRE_CARPETA}/`;
19
+ const git = (raiz, args, env) => ejecutar("git", args, { cwd: raiz, env: env ?? process.env, maxBuffer: 32 * 1024 * 1024 });
20
+ async function esRepo(raiz) {
21
+ try {
22
+ const { stdout } = await git(raiz, ["rev-parse", "--is-inside-work-tree"]);
23
+ return stdout.trim() === "true";
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ /**
30
+ * Dónde vive de VERDAD el `info/exclude` de este repo.
31
+ *
32
+ * `join(raiz, ".git", "info", "exclude")` da por hecho dos cosas falsas: que el proyecto
33
+ * es la raíz del repo (con `outer/` repo y `outer/app/` proyecto, crea un `.git` fantasma
34
+ * en `outer/app/` y la exclusión se escribe donde git no la lee jamás) y que `.git` es un
35
+ * directorio (en un worktree de git es un FICHERO, y el `mkdirSync` revienta con ENOTDIR
36
+ * DESPUÉS de que el ZIP ya escribió el disco). `--git-path` resuelve las dos: en un
37
+ * worktree apunta al `info/` del directorio común, que es donde git lo lee.
38
+ *
39
+ * La salida puede venir relativa al cwd (que es `raiz`) o absoluta; `resolve` cubre ambas.
40
+ */
41
+ async function rutaDeExclusion(raiz) {
42
+ const { stdout } = await git(raiz, ["rev-parse", "--git-path", "info/exclude"]);
43
+ return resolve(raiz, stdout.trim());
44
+ }
45
+ /**
46
+ * El prefijo del proyecto dentro del repo (`app/`), o `""` si el proyecto ES la raíz.
47
+ *
48
+ * Mismo patrón que `agent/instantanea.ts#porArbol`, que ya resolvía exactamente esto: git
49
+ * habla en rutas relativas a la raíz del REPO y el resto de xonecode (el manifiesto, los
50
+ * `descargados` del ZIP, el `join(raiz, ruta)` de la subida) habla en rutas relativas al
51
+ * PROYECTO. Sin recortar, `subida.ts` compone `outer/app/app/app.xml` y falla en cada
52
+ * fichero, y el candado de borrado no reconoce ni una ruta.
53
+ *
54
+ * No se detecta el caso comparando `--show-toplevel` con `raiz`: en macOS un temporal es
55
+ * `/var/folders/…` y git devuelve el realpath `/private/var/…`, así que la comparación de
56
+ * cadenas mentiría. El prefijo vacío ES la respuesta a «¿soy la raíz?».
57
+ */
58
+ async function prefijoDelProyecto(raiz) {
59
+ const { stdout } = await git(raiz, ["rev-parse", "--show-prefix"]);
60
+ return stdout.trim();
61
+ }
62
+ /** Quita el prefijo del repo: las rutas se leen desde el proyecto, como en todo lo demás. */
63
+ const recortar = (prefijo, ruta) => prefijo !== "" && ruta.startsWith(prefijo) ? ruta.slice(prefijo.length) : ruta;
64
+ /**
65
+ * El valor EFECTIVO de una clave de configuración, o `undefined` si no la tiene nadie.
66
+ *
67
+ * `git config --get` sale con código 1 cuando la clave no existe, y `execFile` convierte
68
+ * eso en una excepción: sin este envoltorio, «no está puesta» sería un error.
69
+ *
70
+ * Se mira el valor efectivo (repo + global + sistema), no solo el `--local`: al usuario
71
+ * le importa lo que git hace de verdad en esa carpeta, no en qué fichero está escrito.
72
+ */
73
+ async function valorDeConfig(raiz, clave) {
74
+ try {
75
+ const { stdout } = await git(raiz, ["config", "--get", clave]);
76
+ const valor = stdout.trim();
77
+ return valor === "" ? undefined : valor;
78
+ }
79
+ catch {
80
+ return undefined;
81
+ }
82
+ }
83
+ /**
84
+ * Deja el repo listo tras una descarga: repo, exclusiones, remoto y baseline.
85
+ *
86
+ * El commit de baseline se construye con índice privado para no tocar el staging del
87
+ * usuario, que puede tener trabajo a medias cuando hace un `/sync`.
88
+ *
89
+ * **En un repo PREEXISTENTE la configuración es suya, no nuestra.** Se cuida su índice
90
+ * con esmero (`indicePrivado`, la guarda antes del `reset --mixed`) y pisarle la config
91
+ * sin la misma guarda sería incoherente: un repo con `origin` en GitHub acababa con su
92
+ * rama apuntando a un remoto `cloudstudio://` que no es ningún servidor git, y su
93
+ * `git push` dejaba de funcionar. Las claves que ya tienen valor se respetan y se DICE
94
+ * cuáles se omitieron: un aviso que no se da es un cambio invisible en el repo de otro.
95
+ */
96
+ /**
97
+ * Lo que este repo no tiene que ver: la carpeta del harness y la basura del sistema.
98
+ *
99
+ * **Va en `info/exclude` y NUNCA en `.gitignore`**, y no es una preferencia: `.gitignore` es
100
+ * un fichero del PROYECTO, así que el plan de subida lo vería como una alta y acabaría
101
+ * dentro de la app XOne del cliente. `info/exclude` es local del repo y no viaja a ninguna
102
+ * parte.
103
+ *
104
+ * Dos grupos:
105
+ * - **`.xonecode/`**, donde escribe el propio harness. La exclusión se ancla al PROYECTO: en
106
+ * un repo mayor, `.xonecode/` a secas excluiría también el de cualquier otro subdirectorio
107
+ * del usuario. La `/` inicial es relativa a la raíz del repo, que es donde git lo lee.
108
+ * - **La basura del SO**, que sí va sin anclar —un `.DS_Store` es basura esté donde esté— y
109
+ * que entró aquí midiendo: sin ella, el `git add -A` de `commitDeTurno` se la tragaba, y
110
+ * como `cambiosPendientes` compara la ref remota contra el árbol, el fichero del Finder
111
+ * salía en el plan de `/sync subir` como una alta y `subida.ts` lo habría escrito en la app
112
+ * del cliente. De paso arregla la otra mitad: hasta ahora un `.DS_Store` suelto bastaba
113
+ * para que la guarda de árbol limpio se negara a subir.
114
+ *
115
+ * Es idempotente y **solo AÑADE lo que falte**, línea a línea: el fichero puede tener
116
+ * patrones del usuario y de una versión anterior de esto.
117
+ */
118
+ export async function asegurarExclusiones(raiz) {
119
+ const exclude = await rutaDeExclusion(raiz);
120
+ const prefijo = await prefijoDelProyecto(raiz);
121
+ mkdirSync(dirname(exclude), { recursive: true });
122
+ const actual = existsSync(exclude) ? readFileSync(exclude, "utf8") : "";
123
+ const patrones = [`/${prefijo}${EXCLUSION}`, ...BASURA_DEL_SO];
124
+ const lineas = new Set(actual.split("\n").map((l) => l.trim()));
125
+ const faltan = patrones.filter((p) => !lineas.has(p));
126
+ if (faltan.length === 0)
127
+ return;
128
+ appendFileSync(exclude, `${actual.endsWith("\n") || actual === "" ? "" : "\n"}${faltan.join("\n")}\n`);
129
+ }
130
+ export async function prepararRepo(raiz, ramaOrigen, informar = () => { }) {
131
+ const yaEraRepo = await esRepo(raiz);
132
+ if (!yaEraRepo) {
133
+ // La rama local se llama como la remota: dos vocabularios para lo mismo confunden.
134
+ await git(raiz, ["init", "-q", "-b", ramaOrigen]);
135
+ }
136
+ await asegurarExclusiones(raiz);
137
+ // `remote.cloudstudio.*` es nuestro propio espacio de nombres: ahí sí se escribe
138
+ // siempre, porque la ref de seguimiento (`refs/remotes/cloudstudio/…`) es el libro de
139
+ // cuentas de xonecode y nadie más lo usa.
140
+ await git(raiz, ["config", `remote.${REMOTO}.url`, `cloudstudio://${ramaOrigen}`]);
141
+ await git(raiz, ["config", `remote.${REMOTO}.fetch`, `+refs/heads/*:refs/remotes/${REMOTO}/*`]);
142
+ // DETRÁS DE ESTE REMOTO NO HAY UN SERVIDOR GIT. La url `cloudstudio://…` existe para que
143
+ // la pareja `branch.<rama>.remote` + la ref le den a `git status` el «ahead/behind»
144
+ // —que es el corazón del diseño: el libro de cuentas es git y no un fichero nuestro—,
145
+ // pero nadie puede hablar ese protocolo. Sin esto, medido, el `git fetch --all` o el
146
+ // `git remote update` del usuario mueren con «remote helper 'cloudstudio' aborted
147
+ // session» (código 128) por culpa de un remoto que le pusimos nosotros. `skipFetchAll`
148
+ // hace que los recorridos de TODOS los remotos se salten este, y deja intacto todo lo
149
+ // demás. Nuestro «fetch» de verdad es `/sync bajar`, no un transporte de git.
150
+ await git(raiz, ["config", `remote.${REMOTO}.skipFetchAll`, "true"]);
151
+ // Estas tres son del USUARIO: `core.autocrlf` gobierna todo su repo y
152
+ // `branch.<rama>.remote`/`.merge` son a dónde empuja su `git push`. En un repo
153
+ // preexistente solo se escriben si no valen ya nada.
154
+ const omitidas = [];
155
+ const fijarSinPisar = async (clave, valor) => {
156
+ if (yaEraRepo) {
157
+ const actual = await valorDeConfig(raiz, clave);
158
+ // Se compara el VALOR, no solo la presencia. Con `actual !== undefined` bastaba con
159
+ // que la clave existiera: a partir del SEGUNDO `/sync bajar` sobre el repo que
160
+ // xonecode acaba de crear, `yaEraRepo` ya es cierto y nuestras propias claves con
161
+ // nuestros propios valores se declaraban «conservadas» — un aviso que salta cuando
162
+ // no ha pasado nada, que es justo lo que enseña a ignorar los avisos.
163
+ if (actual !== undefined && actual !== valor) {
164
+ omitidas.push(`${clave}=${actual}`);
165
+ return;
166
+ }
167
+ }
168
+ await git(raiz, ["config", clave, valor]);
169
+ };
170
+ // Sin `core.autocrlf=false`, el texto que vuelve del servidor se normaliza al
171
+ // escribirlo y cada `/sync` produce diffs fantasma — pero si el usuario ya eligió otra
172
+ // cosa, mandan él y su aviso, no nuestra comodidad.
173
+ await fijarSinPisar("core.autocrlf", "false");
174
+ await fijarSinPisar(`branch.${ramaOrigen}.remote`, REMOTO);
175
+ await fijarSinPisar(`branch.${ramaOrigen}.merge`, `refs/heads/${ramaOrigen}`);
176
+ if (omitidas.length > 0) {
177
+ informar(`se conserva tu configuración de git y no se toca: ${omitidas.join(", ")}. ` +
178
+ `El seguimiento de CloudStudio vive igualmente en refs/remotes/${REMOTO}/${ramaOrigen}\n`);
179
+ }
180
+ const idx = indicePrivado("sync");
181
+ try {
182
+ const env = { ...process.env, GIT_INDEX_FILE: idx.ruta };
183
+ await git(raiz, ["add", "-A", "--", "."], env);
184
+ const { stdout: arbol } = await git(raiz, ["write-tree"], env);
185
+ const { stdout: commit } = await git(raiz, [
186
+ "-c", "user.email=xonecode@local", "-c", "user.name=xonecode",
187
+ "commit-tree", arbol.trim(), "-m", `estado de CloudStudio (${ramaOrigen})`,
188
+ ], env);
189
+ const sha = commit.trim();
190
+ await git(raiz, ["update-ref", "-m", "sync: descarga inicial", `refs/remotes/${REMOTO}/${ramaOrigen}`, sha]);
191
+ // Si la rama local aún no tiene commits, el baseline ES su primer commit: así el
192
+ // usuario parte de un árbol limpio en vez de con todo el proyecto sin commitear.
193
+ try {
194
+ await git(raiz, ["rev-parse", "--verify", "HEAD"]);
195
+ }
196
+ catch {
197
+ // OJO: `git reset --mixed` sin pathspec sustituye el índice REAL entero por el árbol
198
+ // del commit — no se puede acotar a rutas. Si el usuario ya tenía algo en staging
199
+ // (posible: un repo sin commits que él mismo inició antes del primer `/sync`), ese
200
+ // reset se lo comería. `git diff --cached` funciona con HEAD sin nacer (compara
201
+ // contra el árbol vacío), así que sirve para saber si el índice real está intacto
202
+ // ANTES de tocar nada. Solo con el índice vacío es seguro dejarlo apuntando al
203
+ // baseline; si no, se prioriza no tocar el índice del usuario sobre la comodidad
204
+ // de empezar con un árbol limpio.
205
+ const { stdout: enStaging } = await git(raiz, ["diff", "--cached", "--name-only"]);
206
+ if (enStaging.trim() === "") {
207
+ await git(raiz, ["update-ref", "-m", "sync: descarga inicial", `refs/heads/${ramaOrigen}`, sha]);
208
+ await git(raiz, ["reset", "-q", "--mixed"]);
209
+ }
210
+ }
211
+ return sha;
212
+ }
213
+ finally {
214
+ idx.limpiar();
215
+ }
216
+ }
217
+ /**
218
+ * Lo que hay en local y no está subido: el diff contra la ref de seguimiento de LA rama,
219
+ * `refs/remotes/cloudstudio/<rama>`.
220
+ *
221
+ * Una sola rama, en los dos sentidos: se baja de `config.rama` y se sube a `config.rama`.
222
+ * Hubo una rama de trabajo (`xonecode/<origen>`, con su propia ref y su `crearRama` en el
223
+ * servidor) para no escribir en la rama que el cliente tiene abierta en Studio; el precio
224
+ * era que lo que se subía vivía en un sitio que nadie mira, y la rama del proyecto se
225
+ * quedaba quieta. Lo que se pide es aplicar cambios y subirlos a la rama de la que se bajó
226
+ * el proyecto, así que la ref es UNA — y `prepararRepo` la escribe en cada bajada (y en el
227
+ * alta), que es justo el estado con el que se compara esto.
228
+ */
229
+ export async function cambiosPendientes(raiz, rama) {
230
+ // Las rutas del diff vienen relativas a la RAÍZ DEL REPO. Si el proyecto es un
231
+ // subdirectorio, hay que recortar el prefijo o `subida.ts` compone `raiz/app/app.xml`
232
+ // (ENOENT) y ninguna ruta casa con `descargados`, que son relativas al proyecto.
233
+ const prefijo = await prefijoDelProyecto(raiz);
234
+ // `core.quotePath` (por omisión `true`) escapa a octal cualquier byte >= 0x80: una
235
+ // ruta como «ñu.xne» saldría como `"\303\261u.xne"`. El candado de `planDeSubida`
236
+ // compara estas rutas, tal cual, contra las de `descargados` (que SÍ vienen en UTF-8
237
+ // sin comillas, de `extraerZipBase64`/el manifiesto) — con la ruta citada nunca
238
+ // coinciden, y un proyecto XOne en castellano tiene nombres así a diario.
239
+ const { stdout } = await git(raiz, [
240
+ "-c", "core.quotePath=false",
241
+ // Sin `--no-renames`, un `A.xne` → `B.xne` sale como una sola línea `R100 A.xne
242
+ // B.xne` y este parser solo se queda con el destino (`resto[resto.length - 1]`):
243
+ // `B` sube y `A` se queda vivo en Studio para siempre, como colección huérfana, sin
244
+ // ningún aviso. Forzando borrado + alta por separado, el borrado de `A` SÍ pasa por
245
+ // el candado (estaba en `descargados`, así que se emite) y `B` sube como alta.
246
+ "diff", "--no-renames", "--name-status", `refs/remotes/${REMOTO}/${rama}`, "--", ".",
247
+ ]);
248
+ return stdout
249
+ .split("\n")
250
+ .filter((linea) => linea.trim() !== "")
251
+ .flatMap((linea) => {
252
+ const [marca, ...resto] = linea.split("\t");
253
+ const ruta = resto[resto.length - 1];
254
+ // `claseDeCambio` nunca devuelve `undefined` (ver `agent/git.ts`): una marca que no
255
+ // reconocemos también se cuenta, nunca se pierde en silencio del plan de subida.
256
+ return ruta === undefined ? [] : [{ clase: claseDeCambio(marca), ruta: recortar(prefijo, ruta) }];
257
+ })
258
+ .sort((a, b) => a.ruta.localeCompare(b.ruta));
259
+ }
260
+ /**
261
+ * «Simular el push»: mover la ref. Solo se llama cuando la subida terminó ENTERA.
262
+ *
263
+ * Se mueve la ref de la rama a la que se escribió, que ahora es la MISMA de la que se
264
+ * bajó (`refs/remotes/cloudstudio/<rama>`), así que «lo que falta por subir» se mide
265
+ * siempre contra lo último que consta arriba y el libro de cuentas llama a las cosas por
266
+ * el nombre que tienen en el servidor.
267
+ */
268
+ export async function marcarSubido(raiz, rama, mensaje) {
269
+ const { stdout } = await git(raiz, ["rev-parse", "HEAD"]);
270
+ await git(raiz, ["update-ref", "-m", mensaje, `refs/remotes/${REMOTO}/${rama}`, stdout.trim()]);
271
+ }
272
+ /**
273
+ * ¿Hay cambios sin commitear?
274
+ *
275
+ * Lo exigen las DOS direcciones, por motivos distintos: subir sube el estado de un commit
276
+ * (no un borrador), y bajar SOBRESCRIBE el disco con lo que venga del servidor — sin
277
+ * commit debajo, el trabajo local no se recupera de ninguna forma.
278
+ *
279
+ * `.xonecode/` no cuenta nunca. En el alta, la config del proyecto se escribe ANTES de la
280
+ * primera descarga y `prepararRepo` (que es quien pone la exclusión en `info/exclude`)
281
+ * corre DESPUÉS: sin este `:(exclude)`, la propia alta se bloquearía a sí misma en
282
+ * cualquier repo preexistente. Y la carpeta del harness no sube ni baja jamás.
283
+ *
284
+ * **Sin repo** no hay `git status` que valer: se responde por el contenido. Una carpeta
285
+ * vacía (salvo `.xonecode/` y la basura del sistema operativo) es el alta normal y se deja
286
+ * pasar; una con ficheros dentro y sin git es justo el caso sin red de seguridad —nada que
287
+ * recuperar tras sobrescribir—, así que se declara sucia.
288
+ */
289
+ export async function arbolLimpio(raiz) {
290
+ return (await sinCommitear(raiz)).length === 0;
291
+ }
292
+ /**
293
+ * Ficheros que pone el SISTEMA OPERATIVO, no el usuario.
294
+ *
295
+ * Sin repo, `sinCommitear` responde por el contenido de la carpeta, y en macOS —la
296
+ * plataforma de este repo— una carpeta vacía que se ha abierto una vez en el Finder tiene
297
+ * un `.DS_Store` dentro. Contarlo bloqueaba el alta entera («hay trabajo local sin
298
+ * commitear (.DS_Store)») sin salida posible desde xonecode, porque `/sync bajar` lleva la
299
+ * misma guarda: se arreglaba un riesgo real y se rompía el camino feliz.
300
+ *
301
+ * Es una LISTA CERRADA y no «ignora los ocultos» a propósito: un `.env` o un `.gitignore`
302
+ * son trabajo del usuario, y sobrescribirlos sin red de seguridad es exactamente lo que la
303
+ * guarda existe para impedir. Estos tres no son contenido de ningún proyecto y aparecen
304
+ * solo por abrir la carpeta.
305
+ */
306
+ export const BASURA_DEL_SO = [".DS_Store", "Thumbs.db", "desktop.ini"];
307
+ const esBasuraDelSO = (entrada) => BASURA_DEL_SO.includes(entrada);
308
+ /**
309
+ * QUÉ está sin commitear, para poder decirlo. Es la misma pregunta que `arbolLimpio`
310
+ * —de hecho aquélla se responde con ésta, para que no haya dos criterios de «limpio»—,
311
+ * y no la misma que `cambiosPendientes`: aquélla es «qué falta por SUBIR» (diff contra la
312
+ * ref de seguimiento) y ésta es «qué falta por COMMITEAR».
313
+ */
314
+ export async function sinCommitear(raiz) {
315
+ if (!(await esRepo(raiz))) {
316
+ return readdirSync(raiz)
317
+ .filter((entrada) => entrada !== NOMBRE_CARPETA && entrada !== ".git" && !esBasuraDelSO(entrada))
318
+ .sort();
319
+ }
320
+ return sinCommitearEnRepo(raiz);
321
+ }
322
+ /**
323
+ * El `git status` de un repo, ya sabiendo que lo es. Un fallo aquí SUBE: quien pregunta
324
+ * por esta rama es la guarda de `/sync`, y ahí «no pude mirar» no puede leerse como
325
+ * «adelante» — bajar sobrescribe el disco.
326
+ *
327
+ * `unoAUno` es la única diferencia entre las dos preguntas que pasan por aquí. Por omisión
328
+ * git COLAPSA una carpeta entera sin rastrear en una sola línea («doc/»), que para una
329
+ * guarda es suficiente —lo que decide es si hay algo—, pero para el AVISO no: con la
330
+ * carpeta colapsada, un `doc/` que dentro solo tiene un `.DS_Store` no se puede reconocer
331
+ * como basura, y además «doc/» le dice a quien lo lee mucho menos que «doc/NOTA-DEMO.md».
332
+ * El volumen lo sujetan el tope de nombres y el total, que van al lado.
333
+ */
334
+ async function sinCommitearEnRepo(raiz, unoAUno = false) {
335
+ const prefijo = await prefijoDelProyecto(raiz);
336
+ const { stdout } = await git(raiz, [
337
+ // Mismo motivo que en `cambiosPendientes`: un nombre en castellano saldría citado en
338
+ // octal y el mensaje al usuario sería ilegible.
339
+ "-c", "core.quotePath=false",
340
+ "status", "--porcelain", ...(unoAUno ? ["--untracked-files=all"] : []),
341
+ "--", ".", `:(exclude)${NOMBRE_CARPETA}`,
342
+ ]);
343
+ return stdout
344
+ .split("\n")
345
+ .filter((linea) => linea.trim() !== "")
346
+ // `XY ruta`: dos caracteres de estado y un espacio.
347
+ .map((linea) => recortar(prefijo, linea.slice(3).trim()))
348
+ .sort();
349
+ }
350
+ /**
351
+ * El trabajo de un turno, commiteado en la rama.
352
+ *
353
+ * Existe porque sin él nada se commitea nunca: `prepararRepo` hace UN commit de baseline al
354
+ * descargar y ahí se acaba, así que el árbol se ensucia y no se limpia jamás. Dos
355
+ * consecuencias, y la segunda es la que aprieta: las sesiones se mezclan sin que nada pueda
356
+ * atribuir ni revertir lo de cada una, y **`/sync subir` se vuelve inalcanzable** — su guarda
357
+ * exige árbol limpio, así que después de cualquier trabajo del agente se niega para siempre.
358
+ *
359
+ * Cuatro decisiones:
360
+ * - **Con el índice DE VERDAD, no con el privado de `arbolDeAhora`.** Aquél existe para una
361
+ * foto de solo lectura que no puede tocar el staging del usuario; esto es lo contrario. Si
362
+ * el índice no queda igualado con el commit, `git status` enseña reversiones fantasma y
363
+ * `trabajoSinCommitear` reporta suciedad que no existe.
364
+ * - **`.xonecode/` fuera**, con el `rm --cached` de siempre y no con un pathspec de
365
+ * exclusión: `git add` con `:(exclude).xonecode` en un repo donde ya está ignorado avisa y
366
+ * **sale con código 1** (medido, ver `arbolDeAhora`).
367
+ * - **Sin cambios no se commitea**, y no es higiene: `git commit` con el índice vacío sale
368
+ * con error, así que el camino MÁS común —un turno de conversación— sería un fallo tragado.
369
+ * - **La identidad es NUESTRA y va por `-c`**, como la del baseline: el commit lo hizo el
370
+ * harness, no la persona, y por `-c` no se le escribe nada al `config` de su repo.
371
+ *
372
+ * Lo que el mensaje NO puede decir es «lo escribió el agente»: esto barre todo lo que haya
373
+ * cambiado, incluido lo que tocara una persona a mano en esa carpeta durante el turno. Es la
374
+ * misma honestidad que separa `autorizadas` de «aplicados».
375
+ */
376
+ export async function commitDeTurno(raiz, mensaje, sesion) {
377
+ try {
378
+ if (!(await esRepo(raiz)))
379
+ return { via: "sin-git" };
380
+ // ANTES de mirar y de añadir: un repo bajado con una versión anterior no tiene en su
381
+ // `info/exclude` la basura del SO, y sin ella el `add -A` se la traga y acaba SUBIDA a
382
+ // la app del cliente (medido sobre una copia del proyecto real). Es idempotente.
383
+ await asegurarExclusiones(raiz);
384
+ const cambiados = await sinCommitearEnRepo(raiz);
385
+ if (cambiados.length === 0)
386
+ return { via: "sin-cambios" };
387
+ await git(raiz, ["add", "-A", "--", "."]);
388
+ await git(raiz, ["rm", "-r", "--cached", "--ignore-unmatch", "-q", NOMBRE_CARPETA]);
389
+ // El SELLO va en un trailer, y es lo que permite atribuir un cambio a una sesión
390
+ // (`sesionGit.ts#cambiosDeSesion`). El formato lo pone `selloDeSesion` y no este
391
+ // fichero: quien lo escribe y quien lo lee tienen que ser el mismo, o la atribución se
392
+ // rompe sin que nada avise. Sin id —o con uno que no vale como argumento de git— se
393
+ // commitea igual: perder el commit del turno sería mucho peor que perder su sello, y
394
+ // esa sesión se cae al respaldo «desde-apertura», que dice lo que es.
395
+ const sello = sesion === undefined ? undefined : selloDeSesion(sesion);
396
+ await git(raiz, [
397
+ "-c", "user.email=xonecode@local", "-c", "user.name=xonecode",
398
+ "commit", "-q", "-m", mensaje, ...(sello === undefined ? [] : ["-m", sello]),
399
+ ]);
400
+ return { via: "commit", ficheros: cambiados.length };
401
+ }
402
+ catch (error) {
403
+ // El mensaje de git, acotado: de aquí sale un aviso que se lee en el transcript.
404
+ return { via: "fallo", motivo: error.message.split("\n")[0] ?? "git falló" };
405
+ }
406
+ }
407
+ /**
408
+ * ¿Había trabajo de alguien sin commitear cuando llegaste? La misma medida que
409
+ * `sinCommitear` —mismo `git status`, misma exclusión de `.xonecode/`, mismo
410
+ * `core.quotePath`— con OTRA política ante lo que no se puede mirar, porque la pregunta
411
+ * es otra.
412
+ *
413
+ * `sinCommitear` sostiene una guarda: sin git no hay nada que recuperar tras sobrescribir,
414
+ * así que declara la carpeta sucia y bloquea, y un git roto LANZA para que `/sync` pare.
415
+ * Esto sostiene un AVISO, y un aviso que no se puede sostener no se da: sin repo, o con un
416
+ * git que revienta, se responde `sin-git` y arriba no se pinta nada. Todo proyecto OFFLINE
417
+ * es una carpeta sin git —`prepararRepo` solo corre al descargar—, así que la política de
418
+ * la otra pondría un aviso en cada apertura de cada proyecto offline: el aviso que enseña
419
+ * a ignorar los avisos.
420
+ *
421
+ * No lanza NUNCA: de esto cuelga el mensaje de alta de la consola web, que se emite en los
422
+ * dos flancos de cada turno.
423
+ */
424
+ export async function trabajoSinCommitear(raiz) {
425
+ try {
426
+ if (!(await esRepo(raiz)))
427
+ return { via: "sin-git" };
428
+ const ficheros = await sinCommitearEnRepo(raiz, true);
429
+ // La basura del SO se quita también DENTRO de un repo, y aquí solo aquí: medido contra
430
+ // los proyectos reales del usuario, uno tenía exactamente UN fichero sin commitear y
431
+ // era un `.DS_Store`, o sea que el aviso habría saltado para decir que alguien abrió
432
+ // la carpeta en el Finder. `prepararRepo` solo excluye `.xonecode/`, así que en un repo
433
+ // `git status` los nombra. Es el mismo argumento —y la misma lista CERRADA— que la
434
+ // rama sin repo ya usaba; `sinCommitear` no lo hereda porque sostiene otra cosa.
435
+ return { via: "git", ficheros: ficheros.filter((f) => !esBasuraDelSO(basename(f))) };
436
+ }
437
+ catch {
438
+ return { via: "sin-git" };
439
+ }
440
+ }
441
+ //# sourceMappingURL=gitSync.js.map