xonecode 0.1.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 +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { createDeepAgent } from "deepagents";
|
|
2
|
+
import { MemorySaver } from "@langchain/langgraph";
|
|
3
|
+
import { backendDelProyecto, sinVistasAplanadas } from "./proyecto.js";
|
|
4
|
+
import { PERFILES, permisosDe, hitlDe } from "./perfiles.js";
|
|
5
|
+
import { middlewareTextoDeTool } from "./textoDeTool.js";
|
|
6
|
+
import { createTokenTrackingMiddleware } from "../vendor/tokenTracking.js";
|
|
7
|
+
export const PROMPT_ORQUESTADOR = [
|
|
8
|
+
"Eres el orquestador de un harness de desarrollo para la plataforma XOne.",
|
|
9
|
+
"NO tienes herramientas: tu único trabajo es entender la petición y delegar.",
|
|
10
|
+
"Delega en `docs` las preguntas técnicas de la plataforma; en `planner` lo que",
|
|
11
|
+
"exija inspeccionar el proyecto; en `dev` el desarrollo; en `mockup` lo visual.",
|
|
12
|
+
"Cuando varias tareas sean independientes, delégalas EN EL MISMO mensaje para",
|
|
13
|
+
"que corran a la vez.",
|
|
14
|
+
"No afirmes que un cambio se ha aplicado si no te lo ha confirmado el especialista.",
|
|
15
|
+
].join(" ");
|
|
16
|
+
/**
|
|
17
|
+
* El agente real.
|
|
18
|
+
*
|
|
19
|
+
* Cuatro decisiones que no son negociables, y las cuatro están medidas o impuestas por la
|
|
20
|
+
* librería (ver `DISENO.md` §14.3 y el patrón de `runtime.ts`):
|
|
21
|
+
*
|
|
22
|
+
* 1. **El backend va confinado** (`virtualMode: true`) y envuelto para que las vistas
|
|
23
|
+
* aplanadas no existan.
|
|
24
|
+
* 2. **El orquestador no recibe ninguna tool.** Si las tuviera haría el trabajo él mismo y
|
|
25
|
+
* se comería el catálogo entero en su prompt.
|
|
26
|
+
* 3. **Se ocupa el nombre `general-purpose`** para eliminar el destino que la librería
|
|
27
|
+
* añade sola: sin capacidad XOne, sus respuestas serían inventadas. Está medido que
|
|
28
|
+
* ocupar el nombre lo sustituye en el catálogo (`agent/generalPurpose.test.ts`).
|
|
29
|
+
* 4. **El HITL va en las tools de fichero**, que en la v1 son las que escriben.
|
|
30
|
+
*/
|
|
31
|
+
export async function construirAgente(opciones) {
|
|
32
|
+
const backend = sinVistasAplanadas(backendDelProyecto(opciones.raiz), opciones.ficheros);
|
|
33
|
+
// Si no hay tracker, no se añade el middleware: es opcional a propósito arriba.
|
|
34
|
+
const middlewareTracker = opciones.tracker ? [createTokenTrackingMiddleware(opciones.tracker)] : [];
|
|
35
|
+
const subagentes = Object.values(PERFILES).map((perfil) => ({
|
|
36
|
+
name: perfil.nombre,
|
|
37
|
+
description: perfil.descripcion,
|
|
38
|
+
systemPrompt: promptDe(perfil.nombre, opciones.skills),
|
|
39
|
+
// **NO se pasa `tools`.** Era un bug: `SubAgent.tools` es `StructuredTool[]` —objetos,
|
|
40
|
+
// para tools PROPIAS— y pasarle los NOMBRES de las de fichero las sustituía por
|
|
41
|
+
// cadenas, dejando al especialista sin ninguna capacidad real. Compilaba (por el
|
|
42
|
+
// `as any` de `createDeepAgent`) y reventaba al ejecutar.
|
|
43
|
+
//
|
|
44
|
+
// Las tools de fichero las monta el `FilesystemMiddleware` a partir del backend, y
|
|
45
|
+
// quien las acota por NOMBRE es su propia opción `tools` (con la restricción de que
|
|
46
|
+
// `read_file` tiene que estar siempre). Aquí el solo-lectura se impone con
|
|
47
|
+
// `permissions`, que la librería aplica sobre `ls`, `read_file`, `write_file`,
|
|
48
|
+
// `edit_file`, `glob` y `grep` — o sea, sobre todas las que importan.
|
|
49
|
+
permissions: permisosDe(perfil),
|
|
50
|
+
interruptOn: hitlDe(perfil),
|
|
51
|
+
// En CADA especialista, no solo en el orquestador: son ellos los que llaman a las
|
|
52
|
+
// tools de fichero, así que es su siguiente llamada al modelo la que reventaba.
|
|
53
|
+
middleware: [middlewareTextoDeTool(), ...middlewareTracker],
|
|
54
|
+
model: opciones.modelos.paraPapel(perfil.soloLectura ? "rapido" : "trabajo"),
|
|
55
|
+
}));
|
|
56
|
+
return createDeepAgent({
|
|
57
|
+
model: opciones.modelos.paraPapel("rapido"),
|
|
58
|
+
systemPrompt: PROMPT_ORQUESTADOR,
|
|
59
|
+
backend,
|
|
60
|
+
checkpointer: opciones.checkpointer ?? new MemorySaver(),
|
|
61
|
+
// El contenido de los `ToolMessage` va como TEXTO al modelo. Sin esto, un turno real
|
|
62
|
+
// revienta tras 8-10 tools con «Non string tool message content is not supported» —
|
|
63
|
+
// y no es de langchain ni de deepagents, sino de `@langchain/ollama` (ver
|
|
64
|
+
// `textoDeTool.ts`). Medido con dos modelos, nube y local.
|
|
65
|
+
middleware: [middlewareTextoDeTool(), ...middlewareTracker],
|
|
66
|
+
subagents: [
|
|
67
|
+
...subagentes,
|
|
68
|
+
{
|
|
69
|
+
name: "general-purpose",
|
|
70
|
+
description: "NO USAR. No tiene ninguna capacidad de XOne, así que cualquier respuesta sobre el proyecto o la plataforma sería inventada.",
|
|
71
|
+
systemPrompt: "No tienes ninguna herramienta. Responde SIEMPRE que la tarea debe delegarse a docs, planner, dev o mockup.",
|
|
72
|
+
tools: [],
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* El prompt de un especialista, con sus skills dentro.
|
|
80
|
+
*
|
|
81
|
+
* Provisional a propósito: los prompts pasan a ficheros `.md` en la fase 9, y hasta
|
|
82
|
+
* entonces vivir aquí es mejor que vivir repartidos.
|
|
83
|
+
*/
|
|
84
|
+
export function promptDe(nombre, skills) {
|
|
85
|
+
const perfil = PERFILES[nombre];
|
|
86
|
+
const disponibles = new Set(skills.catalogo().map((s) => s.nombre));
|
|
87
|
+
const suyas = perfil.skills.filter((s) => disponibles.has(s));
|
|
88
|
+
const faltan = perfil.skills.filter((s) => !disponibles.has(s));
|
|
89
|
+
return [
|
|
90
|
+
perfil.descripcion,
|
|
91
|
+
"",
|
|
92
|
+
"REGLAS DE XONE, no negociables:",
|
|
93
|
+
"- No es desarrollo web: no existen DOM, React, Vue, ni `async/await` en el runtime.",
|
|
94
|
+
"- La fuente de una colección es su `.xne`. Los `.xml` los genera Studio y no se tocan.",
|
|
95
|
+
"- No inventes atributos XML, funciones ni propiedades CSS: XOne ignora lo desconocido",
|
|
96
|
+
" en silencio, así que un invento no da error — da un bug mudo.",
|
|
97
|
+
"",
|
|
98
|
+
suyas.length ? `Tus skills: ${suyas.join(", ")}. Cárgalas antes de responder.` : "",
|
|
99
|
+
// Patrón 4: un doble nunca se disfraza. Si falta una skill, se dice — no se calla.
|
|
100
|
+
faltan.length ? `AVISO: te faltan estas skills y no las tienes: ${faltan.join(", ")}.` : "",
|
|
101
|
+
perfil.soloLectura ? "No modificas nada." : "Tus escrituras requieren aprobación humana. Si te la rechazan, no insistas: explica qué pretendías y por qué.",
|
|
102
|
+
]
|
|
103
|
+
.filter(Boolean)
|
|
104
|
+
.join("\n");
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=xoneAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xoneAgent.js","sourceRoot":"","sources":["../../src/agent/xoneAgent.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { main } from "./cli/main.js";
|
|
3
|
+
main(process.argv.slice(2))
|
|
4
|
+
.then((codigo) => process.exit(codigo))
|
|
5
|
+
.catch((e) => {
|
|
6
|
+
process.stderr.write(`xonecode falló: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
7
|
+
process.exit(70); // EX_SOFTWARE
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACxB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACtC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;AAClC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { interpretAnswer, REJECT_MESSAGE, MAX_APPROVAL_ROUNDS } from "../vendor/hitl.js";
|
|
2
|
+
import { conContexto, recortar } from "../core/diff.js";
|
|
3
|
+
import { crearTema } from "./tema.js";
|
|
4
|
+
// Los colores del bloque de diff salen del tema — sin TTY son cadena vacía y la salida
|
|
5
|
+
// queda limpia para pipes y CI. Mismo patrón que main.ts.
|
|
6
|
+
const tema = crearTema(process.stdout.isTTY === true);
|
|
7
|
+
/** Contexto alrededor de cada cambio y techo de líneas del bloque de diff. */
|
|
8
|
+
const CONTEXTO_DEL_DIFF = 2;
|
|
9
|
+
const TECHO_DEL_DIFF = 25;
|
|
10
|
+
export { MAX_APPROVAL_ROUNDS, REJECT_MESSAGE };
|
|
11
|
+
/**
|
|
12
|
+
* Pregunta por cada pendiente y devuelve las decisiones, en el mapa por id.
|
|
13
|
+
*
|
|
14
|
+
* **Fail-closed, y no es una preferencia: es la asimetría que protege el proyecto del
|
|
15
|
+
* usuario.** Aprobar ESCRIBE; rechazar no toca nada. Así que lo que no se entiende es
|
|
16
|
+
* RECHAZO, siempre. Y el Enter a secas solo aprueba con `interactive: true` —un TTY de
|
|
17
|
+
* verdad detrás—: en un pipe o en CI una línea en blanco no demuestra que haya nadie
|
|
18
|
+
* mirando, y esto aprueba escrituras sobre un proyecto real.
|
|
19
|
+
*
|
|
20
|
+
* `interpretAnswer` ya implementa las dos reglas y está medido: se reusa, no se reescribe.
|
|
21
|
+
*/
|
|
22
|
+
export async function pedirDecisiones(pendientes, preguntar, escribir, opciones = {}) {
|
|
23
|
+
const decisiones = new Map();
|
|
24
|
+
for (const [i, p] of pendientes.entries()) {
|
|
25
|
+
escribir(`\n${"─".repeat(60)}\n`);
|
|
26
|
+
escribir(`APROBACIÓN ${i + 1}/${pendientes.length}\n`);
|
|
27
|
+
escribir(` ${p.descripcion}\n`);
|
|
28
|
+
const f = opciones.fichero?.(p.id);
|
|
29
|
+
// Solo la RUTA, nunca los argumentos: `write_file` lleva el contenido entero del
|
|
30
|
+
// fichero. Pero aprobar a ciegas es peor que no aprobar, así que la ruta sí.
|
|
31
|
+
if (f)
|
|
32
|
+
escribir(` fichero: ${f}\n`);
|
|
33
|
+
escribir(` quién: ${p.origen}\n`);
|
|
34
|
+
const d = opciones.diff?.(p.id);
|
|
35
|
+
if (d) {
|
|
36
|
+
// Contexto alrededor de los cambios y techo de líneas: un diff de 200 líneas no
|
|
37
|
+
// cabe en una pantalla, y las rachas de «igual» no ayudan a decidir nada.
|
|
38
|
+
const { lineas, recortadas } = recortar(conContexto(d, CONTEXTO_DEL_DIFF), TECHO_DEL_DIFF);
|
|
39
|
+
for (const l of lineas) {
|
|
40
|
+
const color = l.tipo === "anadido" ? tema.anadido : l.tipo === "quitado" ? tema.quitado : tema.mudo;
|
|
41
|
+
const signo = l.tipo === "anadido" ? "+ " : l.tipo === "quitado" ? "- " : " ";
|
|
42
|
+
escribir(` ${color}${signo}${l.texto}${tema.reset}\n`);
|
|
43
|
+
}
|
|
44
|
+
if (recortadas > 0)
|
|
45
|
+
escribir(` … y ${recortadas} líneas más\n`);
|
|
46
|
+
}
|
|
47
|
+
const respuesta = await preguntar(opciones.interactive === true ? "¿Aprobar? [S/n] " : "¿Aprobar? [s/N] ");
|
|
48
|
+
const decision = interpretAnswer(respuesta, opciones);
|
|
49
|
+
decisiones.set(p.id, decision);
|
|
50
|
+
escribir(decision.type === "approve" ? " → APROBADO\n" : " → rechazado, no se ha aplicado nada\n");
|
|
51
|
+
}
|
|
52
|
+
return decisiones;
|
|
53
|
+
}
|
|
54
|
+
/** El `preguntar` de producción: una línea de stdin. */
|
|
55
|
+
export function preguntarPorStdin() {
|
|
56
|
+
return async (pregunta) => {
|
|
57
|
+
process.stdout.write(pregunta);
|
|
58
|
+
return new Promise((resolver) => {
|
|
59
|
+
const limpiar = () => {
|
|
60
|
+
process.stdin.off("data", onData);
|
|
61
|
+
process.stdin.off("end", onEnd);
|
|
62
|
+
process.stdin.pause();
|
|
63
|
+
};
|
|
64
|
+
const onData = (d) => {
|
|
65
|
+
limpiar();
|
|
66
|
+
resolver(d.toString().split("\n")[0] ?? "");
|
|
67
|
+
};
|
|
68
|
+
// **Si stdin se cierra sin dar nada, se resuelve con cadena vacía.** Sin esto el
|
|
69
|
+
// proceso se queda esperando un `data` que no va a llegar (un cron, un `< /dev/null`)
|
|
70
|
+
// y el turno se cuelga para siempre. Y la cadena vacía es lo correcto además de lo
|
|
71
|
+
// seguro: `interpretAnswer` sin TTY la trata como RECHAZO.
|
|
72
|
+
const onEnd = () => {
|
|
73
|
+
limpiar();
|
|
74
|
+
resolver("");
|
|
75
|
+
};
|
|
76
|
+
process.stdin.resume();
|
|
77
|
+
process.stdin.on("data", onData);
|
|
78
|
+
process.stdin.on("end", onEnd);
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=aprobar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aprobar.js","sourceRoot":"","sources":["../../src/cli/aprobar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `xonecode config` — diagnóstico de la configuración SIN llamar a ningún modelo.
|
|
3
|
+
*
|
|
4
|
+
* Un comando de diagnóstico no puede ser la vía por la que una clave acaba en un log o
|
|
5
|
+
* una captura, así que la regla dura de este fichero es: NUNCA se imprime ni un carácter
|
|
6
|
+
* de una credencial — ni truncada, ni los últimos cuatro. Solo «puesta»/«sin credencial»
|
|
7
|
+
* y de dónde sale. Por eso el JSON de salida se construye campo a campo a mano y jamás
|
|
8
|
+
* serializa el objeto `auth` de `cargar`, que SÍ lleva las claves en texto plano.
|
|
9
|
+
*
|
|
10
|
+
* Y al revés: un config MAL escrito no puede impedir que este comando funcione — es
|
|
11
|
+
* justo el que uno corre cuando la configuración está mal. Por eso siempre devuelve 0.
|
|
12
|
+
*/
|
|
13
|
+
import { cargar } from "../agent/configEnDisco.js";
|
|
14
|
+
import { ModeloMalEscrito, PAPELES, resolver, } from "../core/modelos.js";
|
|
15
|
+
import { topeResuelto } from "../core/contextos.js";
|
|
16
|
+
import { escribirEnStdout } from "./stdio.js";
|
|
17
|
+
/**
|
|
18
|
+
* Duplicado a propósito: `agent/configEnDisco.ts` tiene el mismo mapa como `const`
|
|
19
|
+
* privada (no exportada) y ese fichero no se puede tocar. Si cambia allí, cambia aquí.
|
|
20
|
+
* `ollama` no lleva variable: no necesita credencial y se omite de esta sección.
|
|
21
|
+
*/
|
|
22
|
+
const VARIABLE_POR_PROVEEDOR = {
|
|
23
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
24
|
+
openai: "OPENAI_API_KEY",
|
|
25
|
+
gemini: "GOOGLE_API_KEY",
|
|
26
|
+
};
|
|
27
|
+
export function cmdConfig(fuentes, opciones = {}, escribir = escribirEnStdout, raiz = process.cwd()) {
|
|
28
|
+
const cargado = cargar(raiz);
|
|
29
|
+
// `validar()` solo exige que «modelo» sea cadena, no que tenga la forma
|
|
30
|
+
// proveedor/modelo: «basura-sin-barra» pasa la validación de fichero pero `resolver`
|
|
31
|
+
// la rechaza al parsear. El fallback deja fuera proyecto/global SOLO para el modelo:
|
|
32
|
+
// las rutas y las credenciales de más abajo salen igualmente.
|
|
33
|
+
let eleccion;
|
|
34
|
+
const avisosDeResolucion = [];
|
|
35
|
+
try {
|
|
36
|
+
eleccion = resolver({
|
|
37
|
+
...fuentes,
|
|
38
|
+
proyecto: cargado.config.proyecto,
|
|
39
|
+
global: cargado.config.global,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
if (!(e instanceof ModeloMalEscrito))
|
|
44
|
+
throw e;
|
|
45
|
+
avisosDeResolucion.push({
|
|
46
|
+
texto: `no se pudo resolver el modelo desde la configuración de fichero (${e.message}); se ignoran proyecto y global solo para el modelo.`,
|
|
47
|
+
severidad: "grave",
|
|
48
|
+
});
|
|
49
|
+
eleccion = resolver(fuentes);
|
|
50
|
+
}
|
|
51
|
+
const modelos = PAPELES.map((papel) => ({
|
|
52
|
+
papel,
|
|
53
|
+
proveedor: eleccion[papel].proveedor,
|
|
54
|
+
modelo: eleccion[papel].modelo,
|
|
55
|
+
origen: eleccion[papel].origen,
|
|
56
|
+
}));
|
|
57
|
+
// El tope de la ventana de cada papel, con su ORIGEN: quien fija un tope a mano
|
|
58
|
+
// en config.json necesita ver que se ha cogido (y de qué fichero), porque un
|
|
59
|
+
// tope ignorado es un porcentaje que miente sin que se note. Sin tope conocido
|
|
60
|
+
// también es una respuesta, y se distingue de cualquier número.
|
|
61
|
+
const topes = PAPELES.map((papel) => {
|
|
62
|
+
const { proveedor, modelo } = eleccion[papel];
|
|
63
|
+
const resuelto = topeResuelto(proveedor, modelo, {
|
|
64
|
+
proyecto: cargado.config.proyecto?.contextos,
|
|
65
|
+
global: cargado.config.global?.contextos,
|
|
66
|
+
});
|
|
67
|
+
return { papel, modelo: `${proveedor}/${modelo}`, ...resuelto };
|
|
68
|
+
});
|
|
69
|
+
// El entorno gana sobre auth.json (en runtime `aplicarAuth` no pisa una variable que
|
|
70
|
+
// ya existe), así que el origen se decide mirando PRIMERO el entorno.
|
|
71
|
+
const credenciales = Object.keys(VARIABLE_POR_PROVEEDOR).map((proveedor) => {
|
|
72
|
+
const variable = VARIABLE_POR_PROVEEDOR[proveedor];
|
|
73
|
+
const enEntorno = process.env[variable] !== undefined;
|
|
74
|
+
const enAuth = !enEntorno && cargado.auth[proveedor] !== undefined;
|
|
75
|
+
return {
|
|
76
|
+
proveedor,
|
|
77
|
+
puesta: enEntorno || enAuth,
|
|
78
|
+
origen: enEntorno ? "entorno" : enAuth ? "auth.json" : undefined,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
// Graves primero, con orden estable dentro de cada grupo: son lo que hay que mirar
|
|
82
|
+
// antes de seguir, y el resto puede esperar debajo.
|
|
83
|
+
const avisos = [...avisosDeResolucion, ...cargado.avisos];
|
|
84
|
+
const ordenados = [
|
|
85
|
+
...avisos.filter((a) => a.severidad === "grave"),
|
|
86
|
+
...avisos.filter((a) => a.severidad === "aviso"),
|
|
87
|
+
];
|
|
88
|
+
if (opciones.json === true) {
|
|
89
|
+
const salida = {
|
|
90
|
+
rutas: cargado.rutas.map((r) => ({
|
|
91
|
+
ruta: r.ruta,
|
|
92
|
+
existe: r.existe,
|
|
93
|
+
procedencia: r.procedencia,
|
|
94
|
+
})),
|
|
95
|
+
modelos,
|
|
96
|
+
contextos: Object.fromEntries(topes.map(({ papel, ...t }) => [papel, t])),
|
|
97
|
+
credenciales: credenciales.map((c) => c.puesta ? c : { proveedor: c.proveedor, puesta: false }),
|
|
98
|
+
avisos: ordenados.map((a) => ({ severidad: a.severidad, texto: a.texto })),
|
|
99
|
+
};
|
|
100
|
+
escribir(`${JSON.stringify(salida, null, 2)}\n`);
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
escribir("--- ficheros de configuración ---\n");
|
|
104
|
+
for (const r of cargado.rutas) {
|
|
105
|
+
escribir(r.existe ? ` ✓ ${r.ruta}\n` : ` ✗ ${r.ruta} (no existe)\n`);
|
|
106
|
+
}
|
|
107
|
+
escribir("--- modelos por papel ---\n");
|
|
108
|
+
for (const m of modelos) {
|
|
109
|
+
escribir(` ${m.papel} ${m.proveedor}/${m.modelo} (${m.origen})\n`);
|
|
110
|
+
}
|
|
111
|
+
escribir("--- topes de contexto ---\n");
|
|
112
|
+
for (const t of topes) {
|
|
113
|
+
const deDonde = t.origen === "proyecto" ? " (config del proyecto)"
|
|
114
|
+
: t.origen === "global" ? " (config global)"
|
|
115
|
+
: t.origen === "tabla" ? " (tabla)"
|
|
116
|
+
: "";
|
|
117
|
+
escribir(` ${t.papel} ${t.modelo} ${t.tope ?? "sin tope conocido"}${deDonde}\n`);
|
|
118
|
+
}
|
|
119
|
+
escribir("--- credenciales ---\n");
|
|
120
|
+
for (const c of credenciales) {
|
|
121
|
+
escribir(c.puesta
|
|
122
|
+
? ` ✓ puesta ${c.proveedor} (${c.origen})\n`
|
|
123
|
+
: ` · sin credencial ${c.proveedor}\n`);
|
|
124
|
+
}
|
|
125
|
+
if (ordenados.length > 0) {
|
|
126
|
+
escribir("--- avisos ---\n");
|
|
127
|
+
for (const a of ordenados) {
|
|
128
|
+
escribir(` ${a.severidad === "grave" ? "⚠" : "·"} ${a.texto}\n`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
|