xonecode 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.md +32 -0
  3. package/apps/web/dist/assets/index-DBZTodio.js +477 -0
  4. package/apps/web/dist/assets/{index-BB3SamhR.css → index-rqecK6s2.css} +1 -1
  5. package/apps/web/dist/assets/{php-D_2--9WK.js → php-BBij3Lhc.js} +1 -1
  6. package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-Dq2YEaLo.js} +1 -1
  7. package/apps/web/dist/index.html +2 -2
  8. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
  9. package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
  10. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
  11. package/dist/agent/{descarga.js → cloudstudio/descarga.js} +3 -3
  12. package/dist/agent/cloudstudio/descarga.js.map +1 -0
  13. package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
  14. package/dist/agent/{subida.js → cloudstudio/subida.js} +3 -3
  15. package/dist/agent/cloudstudio/subida.js.map +1 -0
  16. package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
  17. package/dist/agent/cloudstudio/zip.js.map +1 -0
  18. package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
  19. package/dist/agent/config/authEnDisco.js.map +1 -0
  20. package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +2 -1
  21. package/dist/agent/config/catalogoModelos.js.map +1 -0
  22. package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
  23. package/dist/agent/config/configEnDisco.js.map +1 -0
  24. package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
  25. package/dist/agent/config/crearProyecto.js.map +1 -0
  26. package/dist/agent/config/entorno.js.map +1 -0
  27. package/dist/agent/config/gemini.js.map +1 -0
  28. package/dist/agent/{modelos.js → config/modelos.js} +17 -3
  29. package/dist/agent/config/modelos.js.map +1 -0
  30. package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
  31. package/dist/agent/config/modelosDeMotor.js.map +1 -0
  32. package/dist/agent/{persona.js → config/persona.js} +1 -1
  33. package/dist/agent/config/persona.js.map +1 -0
  34. package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +2 -2
  35. package/dist/agent/config/settingsEnDisco.js.map +1 -0
  36. package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
  37. package/dist/agent/config/versionEnDisco.js.map +1 -0
  38. package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
  39. package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
  40. package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
  41. package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
  42. package/dist/agent/dispositivos/hotswap.js.map +1 -0
  43. package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
  44. package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
  45. package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
  46. package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
  47. package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
  48. package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
  49. package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
  50. package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
  51. package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
  52. package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
  53. package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
  54. package/dist/agent/grafo/busquedaRegex.js.map +1 -0
  55. package/dist/agent/grafo/excluirTools.js +82 -0
  56. package/dist/agent/grafo/excluirTools.js.map +1 -0
  57. package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
  58. package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
  59. package/dist/agent/grafo/navegacionXone.js +198 -0
  60. package/dist/agent/grafo/navegacionXone.js.map +1 -0
  61. package/dist/agent/{perfiles.js → grafo/perfiles.js} +51 -8
  62. package/dist/agent/grafo/perfiles.js.map +1 -0
  63. package/dist/agent/{proyecto.js → grafo/proyecto.js} +207 -24
  64. package/dist/agent/grafo/proyecto.js.map +1 -0
  65. package/dist/agent/grafo/skills.js +393 -0
  66. package/dist/agent/grafo/skills.js.map +1 -0
  67. package/dist/agent/{xoneAgent.js → grafo/xoneAgent.js} +196 -67
  68. package/dist/agent/grafo/xoneAgent.js.map +1 -0
  69. package/dist/agent/navegacion/indiceEnDisco.js +21 -0
  70. package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
  71. package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
  72. package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
  73. package/dist/agent/raizDelPaquete.js +56 -0
  74. package/dist/agent/raizDelPaquete.js.map +1 -0
  75. package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +2 -2
  76. package/dist/agent/sesiones/checkpointer.js.map +1 -0
  77. package/dist/agent/sesiones/git.js.map +1 -0
  78. package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
  79. package/dist/agent/sesiones/gitSync.js.map +1 -0
  80. package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
  81. package/dist/agent/sesiones/sesionGit.js.map +1 -0
  82. package/dist/agent/{agentesEnDisco.js → subagentes/agentesEnDisco.js} +304 -86
  83. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
  84. package/dist/agent/subagentes/consumoExterno.js.map +1 -0
  85. package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
  86. package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
  87. package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
  88. package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +6 -6
  89. package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
  90. package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
  91. package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
  92. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
  93. package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
  94. package/dist/agent/tareas/aumentador.js.map +1 -0
  95. package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +5 -5
  96. package/dist/agent/tareas/juezDeTarea.js.map +1 -0
  97. package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +4 -4
  98. package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
  99. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
  100. package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
  101. package/dist/agent/turno/guionizado.js.map +1 -0
  102. package/dist/agent/turno/informeDeTraza.js +222 -0
  103. package/dist/agent/turno/informeDeTraza.js.map +1 -0
  104. package/dist/agent/turno/inspectorDePrompt.js +205 -0
  105. package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
  106. package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
  107. package/dist/agent/turno/instantanea.js.map +1 -0
  108. package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
  109. package/dist/agent/turno/interrupts.js.map +1 -0
  110. package/dist/agent/turno/mensajes.js.map +1 -0
  111. package/dist/agent/turno/normalizar.js.map +1 -0
  112. package/dist/agent/{puente.js → turno/puente.js} +47 -3
  113. package/dist/agent/turno/puente.js.map +1 -0
  114. package/dist/agent/turno/resumenDeContexto.js +176 -0
  115. package/dist/agent/turno/resumenDeContexto.js.map +1 -0
  116. package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +15 -0
  117. package/dist/agent/turno/resumenDeTool.js.map +1 -0
  118. package/dist/agent/turno/textoDeTool.js.map +1 -0
  119. package/dist/agent/{turnoReal.js → turno/turnoReal.js} +38 -14
  120. package/dist/agent/turno/turnoReal.js.map +1 -0
  121. package/dist/agent/turno/verificador.js.map +1 -0
  122. package/dist/cli/config.js +1 -1
  123. package/dist/cli/config.js.map +1 -1
  124. package/dist/cli/consola.js +9 -9
  125. package/dist/cli/consola.js.map +1 -1
  126. package/dist/cli/describe.js +2 -2
  127. package/dist/cli/describe.js.map +1 -1
  128. package/dist/cli/doctor.js +1 -1
  129. package/dist/cli/doctor.js.map +1 -1
  130. package/dist/cli/fuentesDeDisco.js +29 -0
  131. package/dist/cli/fuentesDeDisco.js.map +1 -0
  132. package/dist/cli/main.js +37 -28
  133. package/dist/cli/main.js.map +1 -1
  134. package/dist/cli/run.js +32 -10
  135. package/dist/cli/run.js.map +1 -1
  136. package/dist/cli/traza.js +48 -0
  137. package/dist/cli/traza.js.map +1 -0
  138. package/dist/cli/tui/correrTui.js +4 -4
  139. package/dist/cli/tui/correrTui.js.map +1 -1
  140. package/dist/cli/verify.js +1 -1
  141. package/dist/cli/verify.js.map +1 -1
  142. package/dist/core/actos.js +1 -1
  143. package/dist/core/adjuntos.js +2 -2
  144. package/dist/core/agentes.js +145 -7
  145. package/dist/core/agentes.js.map +1 -1
  146. package/dist/core/artefactos.js +4 -4
  147. package/dist/core/config.js +1 -1
  148. package/dist/core/contextos.js +12 -1
  149. package/dist/core/contextos.js.map +1 -1
  150. package/dist/core/descargas.js +1 -1
  151. package/dist/core/dispositivos.js +53 -3
  152. package/dist/core/dispositivos.js.map +1 -1
  153. package/dist/core/esqueleto.js +1 -1
  154. package/dist/core/modelos.js +16 -3
  155. package/dist/core/modelos.js.map +1 -1
  156. package/dist/core/navegacion.js +134 -0
  157. package/dist/core/navegacion.js.map +1 -0
  158. package/dist/core/notify.js +5 -0
  159. package/dist/core/notify.js.map +1 -1
  160. package/dist/core/planDeSubida.js +1 -1
  161. package/dist/core/settings.js +2 -2
  162. package/dist/core/shellDeAgente.js +99 -0
  163. package/dist/core/shellDeAgente.js.map +1 -0
  164. package/dist/core/skills.js +158 -0
  165. package/dist/core/skills.js.map +1 -0
  166. package/dist/core/zipDeSkill.js +107 -0
  167. package/dist/core/zipDeSkill.js.map +1 -0
  168. package/dist/vendor/sqliteSaver.js +389 -0
  169. package/dist/vendor/sqliteSaver.js.map +1 -0
  170. package/dist/web/servidor/arranque.js +531 -47
  171. package/dist/web/servidor/arranque.js.map +1 -1
  172. package/dist/web/servidor/corredorDeTareas.js +3 -3
  173. package/dist/web/servidor/corredorDeTareas.js.map +1 -1
  174. package/dist/web/servidor/sesiones.js +4 -4
  175. package/dist/web/servidor/transporte.js +1 -1
  176. package/dist/web/servidor/transporte.js.map +1 -1
  177. package/dist/web/servidor/vestibulo.js +7 -7
  178. package/dist/web/servidor/vestibulo.js.map +1 -1
  179. package/package.json +9 -5
  180. package/skills/archify/SKILL.md +25 -2
  181. package/skills/artifacts-builder/SKILL.md +23 -0
  182. package/skills/xone-hotswap/SKILL.md +74 -0
  183. package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
  184. package/skills/xone-hotswap/scripts/xone-desplegar-android +411 -0
  185. package/skills/xone-hotswap/scripts/xone-hotswap +171 -0
  186. package/skills/xone-hotswap/scripts/xone-log-android +102 -0
  187. package/skills/xone-hotswap/scripts/xone-reiniciar-android +104 -0
  188. package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
  189. package/dist/agent/agentesEnDisco.js.map +0 -1
  190. package/dist/agent/arbolDeProyecto.js.map +0 -1
  191. package/dist/agent/artefactosEnDisco.js.map +0 -1
  192. package/dist/agent/aumentador.js.map +0 -1
  193. package/dist/agent/authEnDisco.js.map +0 -1
  194. package/dist/agent/busquedaRegex.js.map +0 -1
  195. package/dist/agent/catalogoModelos.js.map +0 -1
  196. package/dist/agent/checkpointer.js.map +0 -1
  197. package/dist/agent/cloudstudioClient.js.map +0 -1
  198. package/dist/agent/cloudstudioMcp.js.map +0 -1
  199. package/dist/agent/configEnDisco.js.map +0 -1
  200. package/dist/agent/consumoExterno.js.map +0 -1
  201. package/dist/agent/crearProyecto.js.map +0 -1
  202. package/dist/agent/descarga.js.map +0 -1
  203. package/dist/agent/diagnosticoDeTools.js.map +0 -1
  204. package/dist/agent/dispositivosEnMaquina.js.map +0 -1
  205. package/dist/agent/entorno.js.map +0 -1
  206. package/dist/agent/escrituraDeCodex.js.map +0 -1
  207. package/dist/agent/escrituraDeOpencode.js.map +0 -1
  208. package/dist/agent/escrituraExterna.js.map +0 -1
  209. package/dist/agent/gemini.js.map +0 -1
  210. package/dist/agent/git.js.map +0 -1
  211. package/dist/agent/gitSync.js.map +0 -1
  212. package/dist/agent/guionizado.js.map +0 -1
  213. package/dist/agent/hotswap.js.map +0 -1
  214. package/dist/agent/instalacionEnMaquina.js.map +0 -1
  215. package/dist/agent/instantanea.js.map +0 -1
  216. package/dist/agent/interrupts.js.map +0 -1
  217. package/dist/agent/juezDeTarea.js.map +0 -1
  218. package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
  219. package/dist/agent/manifiesto.js.map +0 -1
  220. package/dist/agent/memoriaDeProyecto.js.map +0 -1
  221. package/dist/agent/mensajes.js.map +0 -1
  222. package/dist/agent/modelos.js.map +0 -1
  223. package/dist/agent/modelosDeMotor.js.map +0 -1
  224. package/dist/agent/normalizar.js.map +0 -1
  225. package/dist/agent/paqueteDelProyecto.js.map +0 -1
  226. package/dist/agent/perfiles.js.map +0 -1
  227. package/dist/agent/persona.js.map +0 -1
  228. package/dist/agent/procesosEnMaquina.js.map +0 -1
  229. package/dist/agent/proyecto.js.map +0 -1
  230. package/dist/agent/puente.js.map +0 -1
  231. package/dist/agent/resumenDeContexto.js +0 -30
  232. package/dist/agent/resumenDeContexto.js.map +0 -1
  233. package/dist/agent/resumenDeTool.js.map +0 -1
  234. package/dist/agent/sesionGit.js.map +0 -1
  235. package/dist/agent/settingsEnDisco.js.map +0 -1
  236. package/dist/agent/skills.js +0 -65
  237. package/dist/agent/skills.js.map +0 -1
  238. package/dist/agent/subagenteCodex.js.map +0 -1
  239. package/dist/agent/subagenteExterno.js.map +0 -1
  240. package/dist/agent/subagenteOpencode.js.map +0 -1
  241. package/dist/agent/subida.js.map +0 -1
  242. package/dist/agent/tareasEnDisco.js.map +0 -1
  243. package/dist/agent/textoDeTool.js.map +0 -1
  244. package/dist/agent/turnoReal.js.map +0 -1
  245. package/dist/agent/verificador.js.map +0 -1
  246. package/dist/agent/versionEnDisco.js.map +0 -1
  247. package/dist/agent/xoneAgent.js.map +0 -1
  248. package/dist/agent/zip.js.map +0 -1
  249. /package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +0 -0
  250. /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
  251. /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
  252. /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
  253. /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
  254. /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
  255. /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
  256. /package/dist/agent/{git.js → sesiones/git.js} +0 -0
  257. /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
  258. /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
  259. /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
  260. /package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +0 -0
  261. /package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +0 -0
  262. /package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +0 -0
  263. /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
  264. /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
  265. /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
  266. /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
@@ -0,0 +1,393 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, lstatSync, renameSync, rmSync, writeFileSync, } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join, relative, sep } from "node:path";
4
+ import { unzipSync } from "fflate";
5
+ import { raizDelPaquete } from "../raizDelPaquete.js";
6
+ import { NOMBRE_CARPETA } from "../config/configEnDisco.js";
7
+ import { segmentoSeguro } from "../../core/settings.js";
8
+ import { escribirSkill, fusionarSkills, leerSkill, tokensDeSkill, } from "../../core/skills.js";
9
+ import { planDeInstalacion, rutaDeZipAceptable } from "../../core/zipDeSkill.js";
10
+ /**
11
+ * Las skills en disco: una carpeta por skill, con su `SKILL.md` dentro.
12
+ *
13
+ * **Tres raíces, no una.** El porqué de cada una y su precedencia están en
14
+ * `core/skills.ts`; aquí vive solo dónde caen:
15
+ *
16
+ * - **De serie**: `<raíz del paquete>/skills/`. La raíz se BUSCA hacia arriba
17
+ * (`agent/raizDelPaquete.ts`) en vez de contarse con `..`: contarlos ataba este fichero a
18
+ * su profundidad, y moverlo de carpeta dejaba el catálogo vacío sin un error que leer. Se
19
+ * resuelve contra ESTE módulo y no contra el cwd, que en la v1 es el proyecto del cliente.
20
+ * - **Global**: `~/.xonecode/skills/`.
21
+ * - **Del proyecto**: `<raiz>/.xonecode/skills/`.
22
+ *
23
+ * Las dos del usuario heredan de `.xonecode/` las dos protecciones que aquí importan: está
24
+ * denegada entera al agente (`permisosDe`) y **no sube nunca** a CloudStudio. Una skill es
25
+ * configuración de la herramienta, no del proyecto XOne.
26
+ *
27
+ * Y el agente NO las lee por esa ruta: las ve montadas en `/skills/<nombre>/`
28
+ * (`proyecto.ts#backendConSkills`), que es de solo lectura para él.
29
+ */
30
+ export const RAIZ_SKILLS = join(raizDelPaquete(), "skills");
31
+ const CARPETA = "skills";
32
+ /** La carpeta de skills de una raíz cualquiera. */
33
+ export function rutaDeSkills(base) {
34
+ return join(base, NOMBRE_CARPETA, CARPETA);
35
+ }
36
+ /** La global. `homedir()` en el momento de la llamada, como el resto del repo: cachearla en
37
+ * una constante de módulo la congelaría para los tests que la cambian. */
38
+ export function rutaGlobalDeSkills() {
39
+ return join(homedir(), NOMBRE_CARPETA, CARPETA);
40
+ }
41
+ /** Estimación de coste. Se reexporta con el nombre viejo: lo usan los evals. */
42
+ export const tokensDe = tokensDeSkill;
43
+ /**
44
+ * Los ficheros que acompañan al `SKILL.md`, en rutas relativas con `/`, ordenadas.
45
+ *
46
+ * No recorre detrás de un enlace (`lstatSync`, y una carpeta que no se puede mirar se
47
+ * salta): la misma línea que el árbol de Ficheros, y por lo mismo — un enlace dentro de la
48
+ * carpeta de una skill puede apuntar a cualquier sitio de la máquina, y lo que se enseña es
49
+ * lo que hay AQUÍ.
50
+ */
51
+ function ficherosDeLaSkill(carpeta, tope = 200) {
52
+ const salida = [];
53
+ const recorrer = (actual) => {
54
+ let entradas;
55
+ try {
56
+ entradas = readdirSync(actual).sort();
57
+ }
58
+ catch {
59
+ return;
60
+ }
61
+ for (const entrada of entradas) {
62
+ if (salida.length >= tope)
63
+ return;
64
+ const completa = join(actual, entrada);
65
+ let esCarpeta = false;
66
+ try {
67
+ // `lstatSync` y no `statSync`: el segundo SIGUE el enlace, así que un enlace a una
68
+ // carpeta de cualquier sitio de la máquina se habría recorrido entero. Es la misma
69
+ // línea, y el mismo motivo, que en `arbolDeProyecto.ts`. Un enlace a un fichero
70
+ // cuenta como fichero y se nombra, que es lo que hay AQUÍ.
71
+ esCarpeta = lstatSync(completa).isDirectory();
72
+ }
73
+ catch {
74
+ continue;
75
+ }
76
+ if (esCarpeta)
77
+ recorrer(completa);
78
+ else if (completa !== join(carpeta, "SKILL.md")) {
79
+ salida.push(relative(carpeta, completa).split(sep).join("/"));
80
+ }
81
+ }
82
+ };
83
+ recorrer(carpeta);
84
+ return salida.sort().slice(0, tope);
85
+ }
86
+ /**
87
+ * Lee una carpeta de skills.
88
+ *
89
+ * Una que no se puede leer o que no valida NO tumba la carga: se salta, se apunta el motivo
90
+ * y las demás siguen — la misma postura que `leerCarpetaDeAgentes` con un `.md` a medio
91
+ * escribir, y la que evita que una skill rota deje la consola sin ninguna.
92
+ *
93
+ * Y el nombre NO se valida aquí: rechazar al leer haría desaparecer una skill que funciona.
94
+ * Se valida al GUARDAR, que es el único momento con alguien delante para arreglarlo — la
95
+ * misma regla, y por el mismo motivo, que la del nombre de un subagente.
96
+ */
97
+ export function leerCarpetaDeSkills(carpeta, origen) {
98
+ if (!existsSync(carpeta))
99
+ return { skills: [], problemas: [] };
100
+ const skills = [];
101
+ const problemas = [];
102
+ let entradas;
103
+ try {
104
+ entradas = readdirSync(carpeta).sort();
105
+ }
106
+ catch {
107
+ return { skills: [], problemas: [] };
108
+ }
109
+ for (const entrada of entradas) {
110
+ const dir = join(carpeta, entrada);
111
+ try {
112
+ // `lstatSync` por lo mismo que en `ficherosDeLaSkill`: un enlace a una carpeta de
113
+ // fuera no es una skill de esta raíz, y seguirlo la metería en el catálogo con el
114
+ // origen equivocado.
115
+ if (!lstatSync(dir).isDirectory())
116
+ continue;
117
+ }
118
+ catch {
119
+ continue;
120
+ }
121
+ const skillMd = join(dir, "SKILL.md");
122
+ if (!existsSync(skillMd)) {
123
+ problemas.push(`${entrada}: no tiene SKILL.md dentro`);
124
+ continue;
125
+ }
126
+ try {
127
+ const leida = leerSkill(readFileSync(skillMd, "utf8"), entrada, origen, ficherosDeLaSkill(dir));
128
+ if ("error" in leida)
129
+ problemas.push(`${entrada}: ${leida.error}`);
130
+ else
131
+ skills.push(leida.skill);
132
+ }
133
+ catch {
134
+ // El motivo de un error de Node lleva la ruta absoluta, y esto viaja por el cable.
135
+ problemas.push(`${entrada}: no se pudo leer`);
136
+ }
137
+ }
138
+ return { skills, problemas };
139
+ }
140
+ /**
141
+ * Todas las skills en vigor, fundidas por nombre con el proyecto ganando.
142
+ *
143
+ * `raiz` ausente = no hay proyecto abierto, y entonces las del proyecto no existen. Es un
144
+ * caso normal —el vestíbulo— y no un hueco: `ausente ≠ vacío` no aplica aquí porque lo que
145
+ * falta es la CARPETA, no el dato.
146
+ */
147
+ export function cargarSkills(raiz) {
148
+ const serie = leerCarpetaDeSkills(RAIZ_SKILLS, "serie");
149
+ const global = leerCarpetaDeSkills(rutaGlobalDeSkills(), "global");
150
+ const proyecto = raiz === undefined
151
+ ? { skills: [], problemas: [] }
152
+ : leerCarpetaDeSkills(rutaDeSkills(raiz), "proyecto");
153
+ return {
154
+ skills: fusionarSkills(serie.skills, global.skills, proyecto.skills),
155
+ problemas: [...serie.problemas, ...global.problemas, ...proyecto.problemas],
156
+ };
157
+ }
158
+ /**
159
+ * Las carpetas de las skills del USUARIO, para que `backendConSkills` las cuelgue una a una.
160
+ *
161
+ * Una a una y no una raíz más porque son DOS carpetas (la global y la del proyecto) que
162
+ * tienen que verse como UNA sola ruta virtual, `/skills/`: el subagente declara `skills:
163
+ * [mi-skill]` y eso se traduce a `/skills/mi-skill/` sin saber de dónde salió. Y porque el
164
+ * proyecto gana sobre el global, que es lo que `cargarSkills` ya decidió — aquí solo se
165
+ * respeta el resultado.
166
+ */
167
+ export function skillsMontables(raiz) {
168
+ const de = (carpeta, origen) => new Map(leerCarpetaDeSkills(carpeta, origen).skills.map((s) => [s.nombre, join(carpeta, s.nombre)]));
169
+ const montajes = new Map([
170
+ ...de(rutaGlobalDeSkills(), "global"),
171
+ ...(raiz === undefined ? [] : de(rutaDeSkills(raiz), "proyecto")),
172
+ ]);
173
+ return [...montajes].map(([nombre, dir]) => ({ nombre, dir }));
174
+ }
175
+ /**
176
+ * TODAS las skills con su carpeta REAL, las de serie incluidas, con la precedencia de siempre.
177
+ *
178
+ * No es lo mismo que `skillsMontables`, y confundirlas costó un turno entero: aquélla contesta
179
+ * «qué carpetas hay que colgar de `/skills/` UNA A UNA», y las de serie no están ahí porque su
180
+ * raíz se cuelga ENTERA en `backendConSkills`. Para el backend da igual; para quien necesita la
181
+ * ruta de verdad de una skill —una shell, que no ve rutas virtuales— significaba que las nueve
182
+ * de serie no existían. Medido: el agente recibió un PATH sin sus scripts, probó el nombre a
183
+ * secas, falló, y acabó haciendo `find /` por el disco entero.
184
+ *
185
+ * El orden es el de la precedencia (`cargarSkills`): serie, luego global, luego proyecto, y el
186
+ * último gana. Una skill del proyecto que se llame igual que una de serie tapa a la de serie
187
+ * también aquí, que es lo que el agente ve por `/skills/`.
188
+ */
189
+ export function skillsConRuta(raiz) {
190
+ const de = (carpeta, origen) => new Map(leerCarpetaDeSkills(carpeta, origen).skills.map((s) => [s.nombre, join(carpeta, s.nombre)]));
191
+ const todas = new Map([
192
+ ...de(RAIZ_SKILLS, "serie"),
193
+ ...de(rutaGlobalDeSkills(), "global"),
194
+ ...(raiz === undefined ? [] : de(rutaDeSkills(raiz), "proyecto")),
195
+ ]);
196
+ return [...todas].map(([nombre, dir]) => ({ nombre, dir }));
197
+ }
198
+ /**
199
+ * Escribe una skill del usuario. Devuelve el motivo si NO se escribió, nunca lanza.
200
+ *
201
+ * Tres negativas, y ninguna es de forma:
202
+ *
203
+ * - **Una de serie no se edita**: vive dentro del paquete instalado, así que el siguiente
204
+ * `npm install` se llevaría el cambio sin decir nada. La consola ofrece copiarla.
205
+ * - **Un destino que existe es un NO**, venga de donde venga —de serie, global o del
206
+ * proyecto—: es el motivo honesto y cubre los tres. Sin esto, crear una skill llamada
207
+ * como una nuestra la tapaba en silencio, que es el agujero que el alta de subagentes ya
208
+ * pagó.
209
+ * - **Y renombrar es `renameSync` y LUEGO escribir**, nunca escribir y luego borrar: un
210
+ * fallo entre los dos pasos deja UNA carpeta y no dos con las mismas instrucciones.
211
+ */
212
+ export function guardarSkill(base, skill, renombrandoDe) {
213
+ let nombre;
214
+ try {
215
+ nombre = segmentoSeguro(skill.nombre, "nombre de skill");
216
+ }
217
+ catch (e) {
218
+ return { error: e instanceof Error ? e.message : "el nombre no vale" };
219
+ }
220
+ const carpeta = rutaDeSkills(base);
221
+ const destino = join(carpeta, nombre);
222
+ const cambiaDeNombre = renombrandoDe !== undefined && renombrandoDe !== nombre;
223
+ if (esDeSerie(nombre) && !existsSync(destino)) {
224
+ return {
225
+ error: `«${nombre}» es una skill que trae xonecode: elige otro nombre, o cópiala desde su ficha para partir de ella`,
226
+ };
227
+ }
228
+ if ((cambiaDeNombre || renombrandoDe === undefined) && existsSync(destino)) {
229
+ return { error: `ya hay una skill «${nombre}» aquí: elige otro nombre, o bórrala primero` };
230
+ }
231
+ try {
232
+ if (cambiaDeNombre) {
233
+ const origen = join(carpeta, segmentoSeguro(renombrandoDe, "nombre de skill"));
234
+ if (existsSync(origen))
235
+ renameSync(origen, destino);
236
+ }
237
+ mkdirSync(destino, { recursive: true });
238
+ writeFileSync(join(destino, "SKILL.md"), escribirSkill({ ...skill, nombre }), "utf8");
239
+ return { ok: true };
240
+ }
241
+ catch {
242
+ // El mensaje de Node lleva la ruta absoluta y esto viaja por el cable (`sinRutas`).
243
+ return { error: `no se pudo escribir la skill «${nombre}»` };
244
+ }
245
+ }
246
+ /** Borra una skill del usuario. `false` = no estaba. Una de serie no llega aquí: la corta
247
+ * el servidor, que es donde vive la guarda — esconder el icono es presentación. */
248
+ export function borrarSkill(base, nombre) {
249
+ let seguro;
250
+ try {
251
+ seguro = segmentoSeguro(nombre, "nombre de skill");
252
+ }
253
+ catch {
254
+ return false;
255
+ }
256
+ const dir = join(rutaDeSkills(base), seguro);
257
+ if (!existsSync(dir))
258
+ return false;
259
+ rmSync(dir, { recursive: true, force: true });
260
+ return true;
261
+ }
262
+ /** ¿La trae xonecode? Se pregunta al DISCO y no a una lista escrita a mano: la lista sería
263
+ * un segundo sitio que mantener, y el día que divergiera nadie se enteraría. */
264
+ export function esDeSerie(nombre) {
265
+ try {
266
+ return existsSync(join(RAIZ_SKILLS, segmentoSeguro(nombre, "nombre de skill"), "SKILL.md"));
267
+ }
268
+ catch {
269
+ return false;
270
+ }
271
+ }
272
+ /**
273
+ * El catálogo que ve el AGENTE: las tres raíces, fundidas.
274
+ *
275
+ * **No cachea.** La versión anterior sí lo hacía —eran seis ficheros del paquete que no
276
+ * cambian a mitad de turno— y con las del usuario dentro eso dejó de ser cierto: se guarda
277
+ * una skill desde Ajustes con la consola abierta, y una lista congelada dentro de este objeto
278
+ * la dejaría fuera incluso de la siguiente construcción. Es la misma postura que `cargarAgentes`.
279
+ *
280
+ * **Lo que esto NO arregla**: construir el agente ocurre al abrir la sesión y en `/modelo`
281
+ * (`turnoReal.ts#construir`), no en cada turno, así que la skill nueva sigue sin alcanzar a la
282
+ * sesión que ya está abierta. Quitar la caché es condición necesaria y no suficiente; el
283
+ * agujero es heredado y está anotado en CLAUDE.md.
284
+ *
285
+ * `raiz` ausente = sin proyecto: solo las de serie y las globales.
286
+ */
287
+ export class SkillsEnDisco {
288
+ raiz;
289
+ constructor(raiz) {
290
+ this.raiz = raiz;
291
+ }
292
+ catalogo() {
293
+ return cargarSkills(this.raiz).skills.map((s) => ({
294
+ nombre: s.nombre,
295
+ descripcion: s.descripcion,
296
+ tokens: s.tokens,
297
+ }));
298
+ }
299
+ cargar(nombre) {
300
+ // El nombre es un SEGMENTO de ruta y aquí se concatena a tres carpetas distintas: sin
301
+ // esta guarda un `../../` se leería un fichero de fuera de las tres. Que hoy no tenga
302
+ // llamador (`SkillsPort.cargar()`) no es una razón para dejarlo abierto — es justo la
303
+ // clase de función que mañana se cablea y nadie revisa.
304
+ let seguro;
305
+ try {
306
+ seguro = segmentoSeguro(nombre, "nombre de skill");
307
+ }
308
+ catch {
309
+ throw new Error(`«${nombre}» no vale como nombre de skill`);
310
+ }
311
+ for (const carpeta of [
312
+ ...(this.raiz === undefined ? [] : [rutaDeSkills(this.raiz)]),
313
+ rutaGlobalDeSkills(),
314
+ RAIZ_SKILLS,
315
+ ]) {
316
+ const skillMd = join(carpeta, seguro, "SKILL.md");
317
+ if (existsSync(skillMd))
318
+ return readFileSync(skillMd, "utf8");
319
+ }
320
+ const hay = this.catalogo()
321
+ .map((s) => s.nombre)
322
+ .join(", ");
323
+ throw new Error(`no hay skill «${nombre}». Las que hay: ${hay || "(ninguna)"}`);
324
+ }
325
+ }
326
+ /**
327
+ * Instala una skill desde un `.zip`. Devuelve el motivo si no se instaló, nunca lanza.
328
+ *
329
+ * El reparto: **la REGLA de qué se acepta vive en `core/zipDeSkill.ts`** —pura y probada sin
330
+ * un fichero delante— y aquí solo está lo que toca el disco. Es el mismo reparto que
331
+ * `core/agentes.ts` con `agentesEnDisco.ts`, y por lo mismo: la parte que decide si una ruta
332
+ * del zip puede escribirse es justo la que no puede depender de tener un zip a mano.
333
+ *
334
+ * Tres cosas que no son de forma:
335
+ *
336
+ * - **Se descomprime ENTERO en memoria y se comprueba ANTES de escribir nada.** Escribir
337
+ * según se descomprime dejaría media skill en disco cuando la entrada 40 resulta ser un
338
+ * `../`: un fallo a medias es peor que un no.
339
+ * - **El destino se comprueba con las MISMAS dos reglas que `guardarSkill`** —un nombre de
340
+ * serie es un NO, un destino que existe es un NO—, porque instalar es otra forma de dar de
341
+ * alta y un segundo sitio donde decidir eso es donde uno de los dos se queda sin la regla.
342
+ * - **Y cada ruta se vuelve a mirar al escribir**, aunque el plan ya la haya aceptado: es la
343
+ * disciplina de `escrituraExterna.ts` —las guardas se REAPLICAN, no se asumen— y aquí
344
+ * cuesta una llamada.
345
+ */
346
+ export function instalarSkillDesdeZip(base, zip, nombreDelFichero) {
347
+ let entradas;
348
+ try {
349
+ entradas = unzipSync(zip);
350
+ }
351
+ catch {
352
+ return { error: "no se pudo abrir el .zip: ¿es un zip de verdad?" };
353
+ }
354
+ // fflate devuelve también las carpetas, como entradas vacías acabadas en `/`. No son
355
+ // ficheros que escribir y no tienen por qué pasar por la regla de forma.
356
+ const ficheros = Object.entries(entradas).filter(([ruta]) => !ruta.endsWith("/"));
357
+ const plan = planDeInstalacion(ficheros.map(([ruta, datos]) => ({ ruta, bytes: datos.length })), nombreDelFichero);
358
+ if ("error" in plan)
359
+ return plan;
360
+ const destino = join(rutaDeSkills(base), plan.nombre);
361
+ if (esDeSerie(plan.nombre) && !existsSync(destino)) {
362
+ return {
363
+ error: `«${plan.nombre}» es una skill que trae xonecode: renombra la carpeta del .zip para instalarla al lado`,
364
+ };
365
+ }
366
+ if (existsSync(destino)) {
367
+ return { error: `ya hay una skill «${plan.nombre}»: bórrala primero si quieres reemplazarla` };
368
+ }
369
+ try {
370
+ for (const [ruta, datos] of ficheros) {
371
+ const relativa = ruta.slice(plan.prefijo.length);
372
+ // Se vuelve a mirar aunque el plan ya lo haya hecho: las guardas se REAPLICAN.
373
+ if (!rutaDeZipAceptable(relativa))
374
+ return { error: "el .zip trae una ruta que no se puede escribir" };
375
+ const salida = join(destino, ...relativa.split("/"));
376
+ mkdirSync(dirname(salida), { recursive: true });
377
+ writeFileSync(salida, datos);
378
+ }
379
+ return { ok: true, nombre: plan.nombre };
380
+ }
381
+ catch {
382
+ // A medias es peor que nada: lo escrito se retira, para que no quede una carpeta con un
383
+ // `SKILL.md` a medio copiar que el catálogo daría por buena.
384
+ try {
385
+ rmSync(destino, { recursive: true, force: true });
386
+ }
387
+ catch {
388
+ // Si ni eso se puede, lo que se dice sigue siendo que no se instaló.
389
+ }
390
+ return { error: `no se pudo escribir la skill «${plan.nombre}»` };
391
+ }
392
+ }
393
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/agent/grafo/skills.ts"],"names":[],"mappings":"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"}