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.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.md +32 -0
- package/apps/web/dist/assets/index-DBZTodio.js +477 -0
- package/apps/web/dist/assets/{index-BB3SamhR.css → index-rqecK6s2.css} +1 -1
- package/apps/web/dist/assets/{php-D_2--9WK.js → php-BBij3Lhc.js} +1 -1
- package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-Dq2YEaLo.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
- package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
- package/dist/agent/{descarga.js → cloudstudio/descarga.js} +3 -3
- package/dist/agent/cloudstudio/descarga.js.map +1 -0
- package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
- package/dist/agent/{subida.js → cloudstudio/subida.js} +3 -3
- package/dist/agent/cloudstudio/subida.js.map +1 -0
- package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
- package/dist/agent/cloudstudio/zip.js.map +1 -0
- package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
- package/dist/agent/config/authEnDisco.js.map +1 -0
- package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +2 -1
- package/dist/agent/config/catalogoModelos.js.map +1 -0
- package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
- package/dist/agent/config/configEnDisco.js.map +1 -0
- package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
- package/dist/agent/config/crearProyecto.js.map +1 -0
- package/dist/agent/config/entorno.js.map +1 -0
- package/dist/agent/config/gemini.js.map +1 -0
- package/dist/agent/{modelos.js → config/modelos.js} +17 -3
- package/dist/agent/config/modelos.js.map +1 -0
- package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
- package/dist/agent/config/modelosDeMotor.js.map +1 -0
- package/dist/agent/{persona.js → config/persona.js} +1 -1
- package/dist/agent/config/persona.js.map +1 -0
- package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +2 -2
- package/dist/agent/config/settingsEnDisco.js.map +1 -0
- package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
- package/dist/agent/config/versionEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
- package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
- package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/hotswap.js.map +1 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
- package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
- package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
- package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
- package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
- package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
- package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
- package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
- package/dist/agent/grafo/busquedaRegex.js.map +1 -0
- package/dist/agent/grafo/excluirTools.js +82 -0
- package/dist/agent/grafo/excluirTools.js.map +1 -0
- package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
- package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +198 -0
- package/dist/agent/grafo/navegacionXone.js.map +1 -0
- package/dist/agent/{perfiles.js → grafo/perfiles.js} +51 -8
- package/dist/agent/grafo/perfiles.js.map +1 -0
- package/dist/agent/{proyecto.js → grafo/proyecto.js} +207 -24
- package/dist/agent/grafo/proyecto.js.map +1 -0
- package/dist/agent/grafo/skills.js +393 -0
- package/dist/agent/grafo/skills.js.map +1 -0
- package/dist/agent/{xoneAgent.js → grafo/xoneAgent.js} +196 -67
- package/dist/agent/grafo/xoneAgent.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +21 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
- package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
- package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
- package/dist/agent/raizDelPaquete.js +56 -0
- package/dist/agent/raizDelPaquete.js.map +1 -0
- package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +2 -2
- package/dist/agent/sesiones/checkpointer.js.map +1 -0
- package/dist/agent/sesiones/git.js.map +1 -0
- package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
- package/dist/agent/sesiones/gitSync.js.map +1 -0
- package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -0
- package/dist/agent/{agentesEnDisco.js → subagentes/agentesEnDisco.js} +304 -86
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
- package/dist/agent/subagentes/consumoExterno.js.map +1 -0
- package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
- package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
- package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +6 -6
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
- package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
- package/dist/agent/tareas/aumentador.js.map +1 -0
- package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +5 -5
- package/dist/agent/tareas/juezDeTarea.js.map +1 -0
- package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +4 -4
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
- package/dist/agent/turno/guionizado.js.map +1 -0
- package/dist/agent/turno/informeDeTraza.js +222 -0
- package/dist/agent/turno/informeDeTraza.js.map +1 -0
- package/dist/agent/turno/inspectorDePrompt.js +205 -0
- package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
- package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
- package/dist/agent/turno/instantanea.js.map +1 -0
- package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
- package/dist/agent/turno/interrupts.js.map +1 -0
- package/dist/agent/turno/mensajes.js.map +1 -0
- package/dist/agent/turno/normalizar.js.map +1 -0
- package/dist/agent/{puente.js → turno/puente.js} +47 -3
- package/dist/agent/turno/puente.js.map +1 -0
- package/dist/agent/turno/resumenDeContexto.js +176 -0
- package/dist/agent/turno/resumenDeContexto.js.map +1 -0
- package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +15 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -0
- package/dist/agent/turno/textoDeTool.js.map +1 -0
- package/dist/agent/{turnoReal.js → turno/turnoReal.js} +38 -14
- package/dist/agent/turno/turnoReal.js.map +1 -0
- package/dist/agent/turno/verificador.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +9 -9
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/describe.js +2 -2
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/fuentesDeDisco.js +29 -0
- package/dist/cli/fuentesDeDisco.js.map +1 -0
- package/dist/cli/main.js +37 -28
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +32 -10
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/traza.js +48 -0
- package/dist/cli/traza.js.map +1 -0
- package/dist/cli/tui/correrTui.js +4 -4
- package/dist/cli/tui/correrTui.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/core/actos.js +1 -1
- package/dist/core/adjuntos.js +2 -2
- package/dist/core/agentes.js +145 -7
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/artefactos.js +4 -4
- package/dist/core/config.js +1 -1
- package/dist/core/contextos.js +12 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +1 -1
- package/dist/core/dispositivos.js +53 -3
- package/dist/core/dispositivos.js.map +1 -1
- package/dist/core/esqueleto.js +1 -1
- package/dist/core/modelos.js +16 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/navegacion.js +134 -0
- package/dist/core/navegacion.js.map +1 -0
- package/dist/core/notify.js +5 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +1 -1
- package/dist/core/settings.js +2 -2
- package/dist/core/shellDeAgente.js +99 -0
- package/dist/core/shellDeAgente.js.map +1 -0
- package/dist/core/skills.js +158 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/zipDeSkill.js +107 -0
- package/dist/core/zipDeSkill.js.map +1 -0
- package/dist/vendor/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.js.map +1 -0
- package/dist/web/servidor/arranque.js +531 -47
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/corredorDeTareas.js +3 -3
- package/dist/web/servidor/corredorDeTareas.js.map +1 -1
- package/dist/web/servidor/sesiones.js +4 -4
- package/dist/web/servidor/transporte.js +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +7 -7
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +9 -5
- package/skills/archify/SKILL.md +25 -2
- package/skills/artifacts-builder/SKILL.md +23 -0
- package/skills/xone-hotswap/SKILL.md +74 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +411 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +171 -0
- package/skills/xone-hotswap/scripts/xone-log-android +102 -0
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +104 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
- package/dist/agent/agentesEnDisco.js.map +0 -1
- package/dist/agent/arbolDeProyecto.js.map +0 -1
- package/dist/agent/artefactosEnDisco.js.map +0 -1
- package/dist/agent/aumentador.js.map +0 -1
- package/dist/agent/authEnDisco.js.map +0 -1
- package/dist/agent/busquedaRegex.js.map +0 -1
- package/dist/agent/catalogoModelos.js.map +0 -1
- package/dist/agent/checkpointer.js.map +0 -1
- package/dist/agent/cloudstudioClient.js.map +0 -1
- package/dist/agent/cloudstudioMcp.js.map +0 -1
- package/dist/agent/configEnDisco.js.map +0 -1
- package/dist/agent/consumoExterno.js.map +0 -1
- package/dist/agent/crearProyecto.js.map +0 -1
- package/dist/agent/descarga.js.map +0 -1
- package/dist/agent/diagnosticoDeTools.js.map +0 -1
- package/dist/agent/dispositivosEnMaquina.js.map +0 -1
- package/dist/agent/entorno.js.map +0 -1
- package/dist/agent/escrituraDeCodex.js.map +0 -1
- package/dist/agent/escrituraDeOpencode.js.map +0 -1
- package/dist/agent/escrituraExterna.js.map +0 -1
- package/dist/agent/gemini.js.map +0 -1
- package/dist/agent/git.js.map +0 -1
- package/dist/agent/gitSync.js.map +0 -1
- package/dist/agent/guionizado.js.map +0 -1
- package/dist/agent/hotswap.js.map +0 -1
- package/dist/agent/instalacionEnMaquina.js.map +0 -1
- package/dist/agent/instantanea.js.map +0 -1
- package/dist/agent/interrupts.js.map +0 -1
- package/dist/agent/juezDeTarea.js.map +0 -1
- package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
- package/dist/agent/manifiesto.js.map +0 -1
- package/dist/agent/memoriaDeProyecto.js.map +0 -1
- package/dist/agent/mensajes.js.map +0 -1
- package/dist/agent/modelos.js.map +0 -1
- package/dist/agent/modelosDeMotor.js.map +0 -1
- package/dist/agent/normalizar.js.map +0 -1
- package/dist/agent/paqueteDelProyecto.js.map +0 -1
- package/dist/agent/perfiles.js.map +0 -1
- package/dist/agent/persona.js.map +0 -1
- package/dist/agent/procesosEnMaquina.js.map +0 -1
- package/dist/agent/proyecto.js.map +0 -1
- package/dist/agent/puente.js.map +0 -1
- package/dist/agent/resumenDeContexto.js +0 -30
- package/dist/agent/resumenDeContexto.js.map +0 -1
- package/dist/agent/resumenDeTool.js.map +0 -1
- package/dist/agent/sesionGit.js.map +0 -1
- package/dist/agent/settingsEnDisco.js.map +0 -1
- package/dist/agent/skills.js +0 -65
- package/dist/agent/skills.js.map +0 -1
- package/dist/agent/subagenteCodex.js.map +0 -1
- package/dist/agent/subagenteExterno.js.map +0 -1
- package/dist/agent/subagenteOpencode.js.map +0 -1
- package/dist/agent/subida.js.map +0 -1
- package/dist/agent/tareasEnDisco.js.map +0 -1
- package/dist/agent/textoDeTool.js.map +0 -1
- package/dist/agent/turnoReal.js.map +0 -1
- package/dist/agent/verificador.js.map +0 -1
- package/dist/agent/versionEnDisco.js.map +0 -1
- package/dist/agent/xoneAgent.js.map +0 -1
- package/dist/agent/zip.js.map +0 -1
- /package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +0 -0
- /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
- /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
- /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
- /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
- /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
- /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
- /package/dist/agent/{git.js → sesiones/git.js} +0 -0
- /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
- /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
- /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
- /package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +0 -0
- /package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +0 -0
- /package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +0 -0
- /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
- /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
- /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
- /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
|
@@ -0,0 +1,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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"}
|