@saulwade/swl-ses 2.6.1 → 2.8.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/CLAUDE.md +14 -2
- package/README.md +65 -18
- package/agentes/_intent-spec.md +73 -73
- package/agentes/_propose-step.md +90 -90
- package/bin/swl-ses.js +10 -0
- package/comandos/swl/brainstorm.md +1 -0
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/deuda-codigo.md +97 -97
- package/comandos/swl/mcp-status.md +1 -0
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/agent-deep-links/SKILL.md +148 -148
- package/habilidades/backend-async-postgres-testing/SKILL.md +216 -216
- package/habilidades/backend-error-design/SKILL.md +221 -221
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/calidad-anti-patrones-universales/SKILL.md +105 -1
- package/habilidades/calidad-contract-testing/SKILL.md +165 -165
- package/habilidades/calidad-mutation-testing/SKILL.md +25 -1
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
- package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
- package/habilidades/css-moderno/SKILL.md +7 -1
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
- package/habilidades/extractor-de-aprendizajes/SKILL.md +5 -1
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/SKILL.md +3 -2
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
- package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
- package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
- package/habilidades/proceso-dynamic-workflows/SKILL.md +60 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
- package/habilidades/proceso-modular-split/SKILL.md +256 -256
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
- package/hooks/calidad-pre-commit.js +159 -10
- package/hooks/ciclo-evolucion-subagente.js +26 -26
- package/hooks/ciclo-evolucion.js +26 -26
- package/hooks/contexto-subagente.js +68 -68
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/ciclo-evolucion.js +47 -47
- package/hooks/lib/deep-links.js +185 -185
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/notificacion-formato.js +45 -11
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/raiz-proyecto.js +35 -4
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/security-net.js +201 -201
- package/hooks/lib/skill-auditor.js +588 -588
- package/hooks/lib/sync-status.js +228 -228
- package/hooks/lib/taint-tracker.js +107 -107
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/notificacion-telegram.js +5 -11
- package/hooks/session-briefing.js +12 -4
- package/instintos/autonomia.yaml +27 -27
- package/instintos/prompt-appendices.yaml +57 -57
- package/llms.txt +1 -1
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/canonical-hashes.json +662 -0
- package/manifiestos/harness-ir.json +47536 -0
- package/manifiestos/hooks-config.json +469 -469
- package/manifiestos/invariantes-criticos.json +30 -30
- package/manifiestos/policy-bundle.json +2065 -0
- package/manifiestos/policy-corpus-w2.json +3926 -0
- package/manifiestos/runtime-adapters-core3.json +208 -0
- package/manifiestos/runtime-conformance.json +139 -0
- package/manifiestos/skills-lock.json +43 -43
- package/package.json +2 -2
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/release-please.yml +44 -44
- package/plantillas/github-workflows/swl-ci.yml +107 -107
- package/plantillas/github-workflows/swl-security.yml +51 -51
- package/plugin.json +2 -2
- package/reglas/accesibilidad.md +10 -10
- package/reglas/auditorias-documentales-estructurales.md +7 -7
- package/reglas/cloud-infra.md +8 -8
- package/reglas/consultar-vault-primero.md +195 -195
- package/reglas/git-workflow.md +1 -0
- package/reglas/hooks.md +6 -6
- package/reglas/intent-engineering.md +218 -218
- package/reglas/markitdown.md +8 -8
- package/reglas/monitor-ci.md +12 -0
- package/reglas/patrones.md +6 -6
- package/reglas/testing.md +7 -7
- package/reglas/tests-cleanup.md +224 -224
- package/schemas/agent-message.schema.json +73 -73
- package/schemas/agent-output-implementacion.schema.json +114 -114
- package/schemas/agent-output-planificacion.schema.json +150 -150
- package/schemas/agent-output-review.schema.json +98 -98
- package/schemas/diary-entry.schema.json +112 -112
- package/schemas/gate-state.schema.json +76 -0
- package/schemas/harness-ir.schema.json +369 -0
- package/schemas/hook-profiles.schema.json +54 -54
- package/schemas/hooks-config.schema.json +89 -89
- package/schemas/legacy-gates.schema.json +45 -0
- package/schemas/modulos.schema.json +38 -38
- package/schemas/perfiles.schema.json +36 -36
- package/schemas/plugin.schema.json +77 -77
- package/schemas/policy-bundle.schema.json +140 -0
- package/schemas/policy-enforcement.schema.json +117 -0
- package/schemas/policy-operation.schema.json +261 -0
- package/schemas/runtime-adapter.schema.json +176 -0
- package/schemas/runtime-build-attestation.schema.json +100 -0
- package/schemas/runtime-conformance.schema.json +239 -0
- package/schemas/runtime-diagnostic.schema.json +395 -0
- package/schemas/skill-evals.schema.json +119 -119
- package/schemas/skill-frontmatter.schema.json +245 -245
- package/schemas/w4-certification-request.schema.json +72 -0
- package/schemas/w4-certification-verdict.schema.json +224 -0
- package/schemas/w4-corpus.schema.json +172 -0
- package/schemas/w4-mutation-report.schema.json +116 -0
- package/schemas/w4-replay-result.schema.json +164 -0
- package/schemas/w4-scoring-report.schema.json +89 -0
- package/scripts/audit-tools/audit-history.js +330 -330
- package/scripts/audit-tools/bundle-tracker.js +290 -290
- package/scripts/audit-tools/canary-monitor.js +352 -352
- package/scripts/audit-tools/code-profiler.js +605 -605
- package/scripts/audit-tools/dep-doctor.js +320 -320
- package/scripts/audit-tools/env-validator.js +206 -206
- package/scripts/audit-tools/lib/fs-walk.js +48 -48
- package/scripts/audit-tools/lib/output.js +23 -23
- package/scripts/audit-tools/migration-checker.js +392 -392
- package/scripts/audit-tools/pentest-scanner.js +1436 -1436
- package/scripts/bootstrap-instintos.js +3 -0
- package/scripts/cli/aprobar-plan.js +73 -73
- package/scripts/cli/briefing.js +23 -23
- package/scripts/cli/ciclo-evolucion.js +26 -26
- package/scripts/cli/derivar-feature-list.js +25 -25
- package/scripts/cli/detectar-host.js +27 -27
- package/scripts/cli/diary-entry.js +69 -69
- package/scripts/cli/execution-state.js +18 -18
- package/scripts/cli/gateway-notify.js +41 -41
- package/scripts/cli/liberar-fase.js +42 -42
- package/scripts/cli/mark-evolved.js +56 -56
- package/scripts/cli/metricas-dora.js +26 -26
- package/scripts/cli/near-duplicate.js +55 -55
- package/scripts/cli/notificaciones.js +123 -123
- package/scripts/cli/propose-step.js +29 -29
- package/scripts/cli/schedule-parse.js +19 -19
- package/scripts/cli/sugerir-modelo.js +20 -20
- package/scripts/cli/verificar-plan.js +36 -36
- package/scripts/cli/verificar-trazabilidad.js +35 -35
- package/scripts/comandos/install-asistido.js +8 -7
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/doctor.js +61 -36
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-claims-runtime.js +1342 -0
- package/scripts/generar-harness-ir.js +257 -0
- package/scripts/generar-inventario.js +52 -54
- package/scripts/generar-policy-bundle.js +202 -0
- package/scripts/instalador.js +26 -7
- package/scripts/lib/approval-receipts.js +190 -0
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/certificacion-loop-state.js +421 -0
- package/scripts/lib/ci-reader.js +193 -193
- package/scripts/lib/ciclo-autonomo/yaml-instintos.js +56 -0
- package/scripts/lib/clasificar-directorio.js +92 -0
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-host-swl.js +175 -175
- package/scripts/lib/detectar-runtime.js +29 -20
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
- package/scripts/lib/detector-reglas-duplicadas.js +220 -220
- package/scripts/lib/eval-metrics-store.js +218 -218
- package/scripts/lib/eval-quality.js +171 -171
- package/scripts/lib/eval-schemas.js +144 -144
- package/scripts/lib/eval-self-correct.js +106 -106
- package/scripts/lib/eval-validator.js +185 -185
- package/scripts/lib/evidence-verifier.js +192 -0
- package/scripts/lib/evidencia-release.js +322 -322
- package/scripts/lib/frontmatter-canonico.js +509 -0
- package/scripts/lib/gate-engine.js +871 -0
- package/scripts/lib/gate-hooks-requires.js +249 -249
- package/scripts/lib/gate-licencias.js +212 -212
- package/scripts/lib/git-config-preflight.js +48 -0
- package/scripts/lib/git-metricas.js +257 -257
- package/scripts/lib/harness-ir.js +778 -0
- package/scripts/lib/harness-source-snapshot.js +309 -0
- package/scripts/lib/integrity-ledger.js +1147 -0
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/legacy-gate-migration.js +324 -0
- package/scripts/lib/limpiar-basura-global.js +45 -2
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/metricas-dora.js +204 -204
- package/scripts/lib/notificaciones-telegram.js +1 -0
- package/scripts/lib/npm-version.js +1 -0
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/plan-lock.js +61 -13
- package/scripts/lib/policy-broker.js +338 -0
- package/scripts/lib/policy-bundle.js +342 -0
- package/scripts/lib/policy-context-provider.js +310 -0
- package/scripts/lib/policy-contract.js +479 -0
- package/scripts/lib/policy-verifier-utils.js +65 -0
- package/scripts/lib/pr-analyzer.js +399 -399
- package/scripts/lib/principal-verifier.js +178 -0
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/resolver-plan-fase.js +37 -37
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/runtime-adapter-contract.js +267 -0
- package/scripts/lib/runtime-artifact-verifier.js +426 -0
- package/scripts/lib/runtime-build-attestation.js +127 -0
- package/scripts/lib/runtime-bundle-installer.js +586 -0
- package/scripts/lib/runtime-compiler.js +327 -0
- package/scripts/lib/runtime-conformance.js +202 -0
- package/scripts/lib/runtime-doctor-core3.js +567 -0
- package/scripts/lib/runtime-doctor-input.js +59 -0
- package/scripts/lib/runtime-operation-adapter.js +267 -0
- package/scripts/lib/schema-version.js +164 -164
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/signed-envelope.js +545 -0
- package/scripts/lib/single-use-store.js +359 -0
- package/scripts/lib/skills-externas.js +31 -0
- package/scripts/lib/transformadores/codex.js +15 -8
- package/scripts/lib/transformadores/gemini.js +79 -5
- package/scripts/lib/w4-attestation-adapter.js +158 -0
- package/scripts/lib/w4-canario.js +337 -0
- package/scripts/lib/w4-claims.js +182 -0
- package/scripts/lib/w4-corpus-generador.js +542 -0
- package/scripts/lib/w4-gate-c5.js +115 -0
- package/scripts/lib/w4-harness-bajo-prueba.js +155 -0
- package/scripts/lib/w4-matriz-combos.js +55 -0
- package/scripts/lib/w4-motor-mutacion.js +1348 -0
- package/scripts/lib/w4-motor-replay.js +735 -0
- package/scripts/lib/w4-pin-origen.js +54 -0
- package/scripts/lib/w4-publicar-request.js +132 -0
- package/scripts/lib/w4-revocacion.js +62 -0
- package/scripts/lib/w4-runtimes-core3.js +38 -0
- package/scripts/lib/w4-scorer-certificacion.js +692 -0
- package/scripts/lib/w4-superficie-candidato.js +49 -0
- package/scripts/lib/w4-veredicto.js +452 -0
- package/scripts/lib/w4-verificar-veredicto.js +302 -0
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +200 -200
- package/scripts/migrar-gates-legacy.js +108 -0
- package/scripts/publicar-certification-request.js +115 -0
- package/scripts/runtime-doctor.js +107 -0
- package/scripts/tui/componentes/selector-multi.js +189 -189
- package/scripts/tui/componentes/selector-unico.js +158 -158
- package/scripts/tui/ejecutores.js +375 -375
- package/scripts/tui/lib/colores.js +129 -129
- package/scripts/tui/lib/render.js +264 -264
- package/scripts/tui/lib/teclas.js +113 -113
- package/scripts/tui/pantallas/install-wizard.js +12 -7
- package/scripts/tui/pantallas/menu-principal.js +52 -52
- package/scripts/tui/pantallas/progreso.js +274 -274
- package/scripts/tui/pantallas/resumen.js +132 -132
- package/scripts/validar-userland-vacio.js +110 -110
- package/scripts/verificar-aislamiento-swl-eval.js +87 -0
- package/scripts/verificar-empaquetado-downstream.js +375 -0
- package/scripts/verificar-loop-constructor.js +215 -0
- package/scripts/verificar-trazabilidad.js +13 -6
- package/scripts/verificar-veredicto-real.js +84 -0
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Handler unificado de keypress para la TUI de swl-ses.
|
|
5
|
-
* Zero-deps. Usa readline.emitKeypressEvents para parsear secuencias ANSI.
|
|
6
|
-
*
|
|
7
|
-
* Modelo de uso:
|
|
8
|
-
*
|
|
9
|
-
* const teclado = crearTeclado();
|
|
10
|
-
* teclado.on('up', () => cursor--);
|
|
11
|
-
* teclado.on('down', () => cursor++);
|
|
12
|
-
* teclado.on('return', () => resolver());
|
|
13
|
-
* teclado.on('escape', () => cancelar());
|
|
14
|
-
* teclado.activar();
|
|
15
|
-
* // ... eventualmente
|
|
16
|
-
* teclado.desactivar();
|
|
17
|
-
*
|
|
18
|
-
* Maneja:
|
|
19
|
-
* - Flechas (up/down/left/right)
|
|
20
|
-
* - vim-keys (h/j/k/l) opcional
|
|
21
|
-
* - Espacio, return, escape, tab
|
|
22
|
-
* - Ctrl+C (re-emite como 'escape' por default; se puede sobrescribir)
|
|
23
|
-
* - Teclas alfanuméricas como caracteres (con `keypress` evento)
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
const readline = require('readline');
|
|
27
|
-
|
|
28
|
-
function crearTeclado(opciones = {}) {
|
|
29
|
-
const aliasVim = opciones.vim !== false; // por default soporta h/j/k/l
|
|
30
|
-
const handlers = new Map();
|
|
31
|
-
let activo = false;
|
|
32
|
-
let modoAnterior = null;
|
|
33
|
-
|
|
34
|
-
function _resolverNombre(key, str) {
|
|
35
|
-
if (!key) return null;
|
|
36
|
-
if (key.ctrl && key.name === 'c') return 'escape'; // Ctrl+C → escape
|
|
37
|
-
if (key.name) return key.name;
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function onKeypress(str, key) {
|
|
42
|
-
if (!activo) return;
|
|
43
|
-
|
|
44
|
-
const nombre = _resolverNombre(key, str);
|
|
45
|
-
if (!nombre) return;
|
|
46
|
-
|
|
47
|
-
// Alias vim
|
|
48
|
-
let normalizado = nombre;
|
|
49
|
-
if (aliasVim) {
|
|
50
|
-
if (nombre === 'k') normalizado = 'up';
|
|
51
|
-
else if (nombre === 'j') normalizado = 'down';
|
|
52
|
-
else if (nombre === 'h') normalizado = 'left';
|
|
53
|
-
else if (nombre === 'l') normalizado = 'right';
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Disparar handlers exactos
|
|
57
|
-
if (handlers.has(normalizado)) {
|
|
58
|
-
handlers.get(normalizado).forEach(fn => fn(key, str));
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Handler genérico para cualquier tecla
|
|
62
|
-
if (handlers.has('*')) {
|
|
63
|
-
handlers.get('*').forEach(fn => fn(nombre, str, key));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function activar() {
|
|
68
|
-
if (activo) return;
|
|
69
|
-
if (!process.stdin.isTTY) {
|
|
70
|
-
// No-TTY: no podemos leer teclas. El llamador debe manejar este caso.
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
activo = true;
|
|
74
|
-
readline.emitKeypressEvents(process.stdin);
|
|
75
|
-
modoAnterior = process.stdin.isRaw;
|
|
76
|
-
process.stdin.setRawMode(true);
|
|
77
|
-
process.stdin.resume();
|
|
78
|
-
process.stdin.on('keypress', onKeypress);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function desactivar() {
|
|
82
|
-
if (!activo) return;
|
|
83
|
-
activo = false;
|
|
84
|
-
if (process.stdin.isTTY) {
|
|
85
|
-
process.stdin.removeListener('keypress', onKeypress);
|
|
86
|
-
process.stdin.setRawMode(modoAnterior || false);
|
|
87
|
-
process.stdin.pause();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function on(tecla, handler) {
|
|
92
|
-
if (!handlers.has(tecla)) handlers.set(tecla, []);
|
|
93
|
-
handlers.get(tecla).push(handler);
|
|
94
|
-
return api;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function off(tecla, handler) {
|
|
98
|
-
if (!handlers.has(tecla)) return api;
|
|
99
|
-
if (!handler) {
|
|
100
|
-
handlers.delete(tecla);
|
|
101
|
-
return api;
|
|
102
|
-
}
|
|
103
|
-
const arr = handlers.get(tecla).filter(h => h !== handler);
|
|
104
|
-
if (arr.length === 0) handlers.delete(tecla);
|
|
105
|
-
else handlers.set(tecla, arr);
|
|
106
|
-
return api;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const api = { activar, desactivar, on, off, estaActivo: () => activo };
|
|
110
|
-
return api;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
module.exports = { crearTeclado };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Handler unificado de keypress para la TUI de swl-ses.
|
|
5
|
+
* Zero-deps. Usa readline.emitKeypressEvents para parsear secuencias ANSI.
|
|
6
|
+
*
|
|
7
|
+
* Modelo de uso:
|
|
8
|
+
*
|
|
9
|
+
* const teclado = crearTeclado();
|
|
10
|
+
* teclado.on('up', () => cursor--);
|
|
11
|
+
* teclado.on('down', () => cursor++);
|
|
12
|
+
* teclado.on('return', () => resolver());
|
|
13
|
+
* teclado.on('escape', () => cancelar());
|
|
14
|
+
* teclado.activar();
|
|
15
|
+
* // ... eventualmente
|
|
16
|
+
* teclado.desactivar();
|
|
17
|
+
*
|
|
18
|
+
* Maneja:
|
|
19
|
+
* - Flechas (up/down/left/right)
|
|
20
|
+
* - vim-keys (h/j/k/l) opcional
|
|
21
|
+
* - Espacio, return, escape, tab
|
|
22
|
+
* - Ctrl+C (re-emite como 'escape' por default; se puede sobrescribir)
|
|
23
|
+
* - Teclas alfanuméricas como caracteres (con `keypress` evento)
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const readline = require('readline');
|
|
27
|
+
|
|
28
|
+
function crearTeclado(opciones = {}) {
|
|
29
|
+
const aliasVim = opciones.vim !== false; // por default soporta h/j/k/l
|
|
30
|
+
const handlers = new Map();
|
|
31
|
+
let activo = false;
|
|
32
|
+
let modoAnterior = null;
|
|
33
|
+
|
|
34
|
+
function _resolverNombre(key, str) {
|
|
35
|
+
if (!key) return null;
|
|
36
|
+
if (key.ctrl && key.name === 'c') return 'escape'; // Ctrl+C → escape
|
|
37
|
+
if (key.name) return key.name;
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function onKeypress(str, key) {
|
|
42
|
+
if (!activo) return;
|
|
43
|
+
|
|
44
|
+
const nombre = _resolverNombre(key, str);
|
|
45
|
+
if (!nombre) return;
|
|
46
|
+
|
|
47
|
+
// Alias vim
|
|
48
|
+
let normalizado = nombre;
|
|
49
|
+
if (aliasVim) {
|
|
50
|
+
if (nombre === 'k') normalizado = 'up';
|
|
51
|
+
else if (nombre === 'j') normalizado = 'down';
|
|
52
|
+
else if (nombre === 'h') normalizado = 'left';
|
|
53
|
+
else if (nombre === 'l') normalizado = 'right';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Disparar handlers exactos
|
|
57
|
+
if (handlers.has(normalizado)) {
|
|
58
|
+
handlers.get(normalizado).forEach(fn => fn(key, str));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Handler genérico para cualquier tecla
|
|
62
|
+
if (handlers.has('*')) {
|
|
63
|
+
handlers.get('*').forEach(fn => fn(nombre, str, key));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function activar() {
|
|
68
|
+
if (activo) return;
|
|
69
|
+
if (!process.stdin.isTTY) {
|
|
70
|
+
// No-TTY: no podemos leer teclas. El llamador debe manejar este caso.
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
activo = true;
|
|
74
|
+
readline.emitKeypressEvents(process.stdin);
|
|
75
|
+
modoAnterior = process.stdin.isRaw;
|
|
76
|
+
process.stdin.setRawMode(true);
|
|
77
|
+
process.stdin.resume();
|
|
78
|
+
process.stdin.on('keypress', onKeypress);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function desactivar() {
|
|
82
|
+
if (!activo) return;
|
|
83
|
+
activo = false;
|
|
84
|
+
if (process.stdin.isTTY) {
|
|
85
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
86
|
+
process.stdin.setRawMode(modoAnterior || false);
|
|
87
|
+
process.stdin.pause();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function on(tecla, handler) {
|
|
92
|
+
if (!handlers.has(tecla)) handlers.set(tecla, []);
|
|
93
|
+
handlers.get(tecla).push(handler);
|
|
94
|
+
return api;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function off(tecla, handler) {
|
|
98
|
+
if (!handlers.has(tecla)) return api;
|
|
99
|
+
if (!handler) {
|
|
100
|
+
handlers.delete(tecla);
|
|
101
|
+
return api;
|
|
102
|
+
}
|
|
103
|
+
const arr = handlers.get(tecla).filter(h => h !== handler);
|
|
104
|
+
if (arr.length === 0) handlers.delete(tecla);
|
|
105
|
+
else handlers.set(tecla, arr);
|
|
106
|
+
return api;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const api = { activar, desactivar, on, off, estaActivo: () => activo };
|
|
110
|
+
return api;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = { crearTeclado };
|
|
@@ -27,10 +27,15 @@ const { selectorMulti } = require('../componentes/selector-multi');
|
|
|
27
27
|
const render = require('../lib/render');
|
|
28
28
|
const teclas = require('../lib/teclas');
|
|
29
29
|
const { colores, semantico, iconos } = require('../lib/colores');
|
|
30
|
+
const { obtenerEtiquetaConformidad } = require('../../lib/detectar-runtime');
|
|
30
31
|
|
|
31
32
|
const RAIZ = path.resolve(__dirname, '..', '..', '..');
|
|
32
33
|
const PERFILES_PATH = path.join(RAIZ, 'manifiestos', 'perfiles.json');
|
|
33
34
|
|
|
35
|
+
function describirRuntime(target, detalle) {
|
|
36
|
+
return `${detalle} Conformidad ${obtenerEtiquetaConformidad(target)}.`;
|
|
37
|
+
}
|
|
38
|
+
|
|
34
39
|
// ---------------------------------------------------------------------------
|
|
35
40
|
// Datos estáticos
|
|
36
41
|
// ---------------------------------------------------------------------------
|
|
@@ -39,38 +44,38 @@ const RUNTIMES = [
|
|
|
39
44
|
{
|
|
40
45
|
valor: 'claude',
|
|
41
46
|
etiqueta: 'Claude Code',
|
|
42
|
-
descripcion: 'Runtime principal de Anthropic.
|
|
47
|
+
descripcion: describirRuntime('claude', 'Runtime principal de Anthropic.'),
|
|
43
48
|
badge: 'recomendado',
|
|
44
49
|
},
|
|
45
50
|
{
|
|
46
51
|
valor: 'openclaude',
|
|
47
52
|
etiqueta: 'OpenClaude',
|
|
48
|
-
descripcion: 'Fork open source
|
|
53
|
+
descripcion: describirRuntime('openclaude', 'Fork open source con artefactos de Claude Code.'),
|
|
49
54
|
},
|
|
50
55
|
{
|
|
51
56
|
valor: 'opencode',
|
|
52
57
|
etiqueta: 'OpenCode',
|
|
53
|
-
descripcion: 'CLI de código abierto multi-modelo.
|
|
58
|
+
descripcion: describirRuntime('opencode', 'CLI de código abierto multi-modelo.'),
|
|
54
59
|
},
|
|
55
60
|
{
|
|
56
61
|
valor: 'codex',
|
|
57
62
|
etiqueta: 'Codex CLI (OpenAI)',
|
|
58
|
-
descripcion: 'CLI
|
|
63
|
+
descripcion: describirRuntime('codex', 'CLI de OpenAI; emite agentes TOML y seis eventos de hooks.'),
|
|
59
64
|
},
|
|
60
65
|
{
|
|
61
66
|
valor: 'gemini',
|
|
62
67
|
etiqueta: 'Gemini CLI (Google)',
|
|
63
|
-
descripcion: 'CLI
|
|
68
|
+
descripcion: describirRuntime('gemini', 'CLI de Google Gemini.'),
|
|
64
69
|
},
|
|
65
70
|
{
|
|
66
71
|
valor: 'copilot',
|
|
67
72
|
etiqueta: 'GitHub Copilot',
|
|
68
|
-
descripcion: 'Copilot Chat / CLI
|
|
73
|
+
descripcion: describirRuntime('copilot', 'Copilot Chat / CLI; consolida agentes y reglas.'),
|
|
69
74
|
},
|
|
70
75
|
{
|
|
71
76
|
valor: 'cursor',
|
|
72
77
|
etiqueta: 'Cursor',
|
|
73
|
-
descripcion: 'IDE basado en VS Code
|
|
78
|
+
descripcion: describirRuntime('cursor', 'IDE basado en VS Code; emite 17 eventos de hooks.'),
|
|
74
79
|
},
|
|
75
80
|
];
|
|
76
81
|
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Menú principal de la TUI de swl-ses.
|
|
5
|
-
* 4 operaciones disponibles: Install / Update / Inspect / Uninstall.
|
|
6
|
-
*
|
|
7
|
-
* Devuelve uno de: 'install' | 'update' | 'inspect' | 'uninstall' | null
|
|
8
|
-
* (null = el usuario canceló con Escape)
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const { selectorUnico } = require('../componentes/selector-unico');
|
|
12
|
-
|
|
13
|
-
const OPCIONES = [
|
|
14
|
-
{
|
|
15
|
-
valor: 'install',
|
|
16
|
-
etiqueta: 'Install — Instalar SWL en un runtime nuevo',
|
|
17
|
-
descripcion:
|
|
18
|
-
'Asistente paso a paso: runtime + perfil + scope + flags. ' +
|
|
19
|
-
'Detecta instalaciones existentes y avisa si hay conflictos de scope.',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
valor: 'update',
|
|
23
|
-
etiqueta: 'Update — Actualizar instalaciones existentes',
|
|
24
|
-
descripcion:
|
|
25
|
-
'Multi-select de runtimes a actualizar + componentes a refrescar ' +
|
|
26
|
-
'(skills, hooks, agentes, reglas, comandos). Muestra diff antes de aplicar.',
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
valor: 'inspect',
|
|
30
|
-
etiqueta: 'Inspect — Explorar componentes instalados',
|
|
31
|
-
descripcion:
|
|
32
|
-
'Navega por runtime → perfil → componentes sin modificar nada. ' +
|
|
33
|
-
'Lee de los manifiestos y archivos de estado.',
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
valor: 'uninstall',
|
|
37
|
-
etiqueta: 'Uninstall — Desinstalar SWL de un runtime',
|
|
38
|
-
descripcion:
|
|
39
|
-
'Elige runtime y scope a desinstalar. Preserva _userland/ y APRENDIZAJES.md ' +
|
|
40
|
-
'por default. Pide confirmación explícita antes de borrar.',
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
function mostrarMenuPrincipal() {
|
|
45
|
-
return selectorUnico({
|
|
46
|
-
titulo: '¿Qué operación quieres realizar?',
|
|
47
|
-
items: OPCIONES,
|
|
48
|
-
indiceDefault: 0,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
module.exports = { mostrarMenuPrincipal, OPCIONES };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Menú principal de la TUI de swl-ses.
|
|
5
|
+
* 4 operaciones disponibles: Install / Update / Inspect / Uninstall.
|
|
6
|
+
*
|
|
7
|
+
* Devuelve uno de: 'install' | 'update' | 'inspect' | 'uninstall' | null
|
|
8
|
+
* (null = el usuario canceló con Escape)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { selectorUnico } = require('../componentes/selector-unico');
|
|
12
|
+
|
|
13
|
+
const OPCIONES = [
|
|
14
|
+
{
|
|
15
|
+
valor: 'install',
|
|
16
|
+
etiqueta: 'Install — Instalar SWL en un runtime nuevo',
|
|
17
|
+
descripcion:
|
|
18
|
+
'Asistente paso a paso: runtime + perfil + scope + flags. ' +
|
|
19
|
+
'Detecta instalaciones existentes y avisa si hay conflictos de scope.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
valor: 'update',
|
|
23
|
+
etiqueta: 'Update — Actualizar instalaciones existentes',
|
|
24
|
+
descripcion:
|
|
25
|
+
'Multi-select de runtimes a actualizar + componentes a refrescar ' +
|
|
26
|
+
'(skills, hooks, agentes, reglas, comandos). Muestra diff antes de aplicar.',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
valor: 'inspect',
|
|
30
|
+
etiqueta: 'Inspect — Explorar componentes instalados',
|
|
31
|
+
descripcion:
|
|
32
|
+
'Navega por runtime → perfil → componentes sin modificar nada. ' +
|
|
33
|
+
'Lee de los manifiestos y archivos de estado.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
valor: 'uninstall',
|
|
37
|
+
etiqueta: 'Uninstall — Desinstalar SWL de un runtime',
|
|
38
|
+
descripcion:
|
|
39
|
+
'Elige runtime y scope a desinstalar. Preserva _userland/ y APRENDIZAJES.md ' +
|
|
40
|
+
'por default. Pide confirmación explícita antes de borrar.',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
function mostrarMenuPrincipal() {
|
|
45
|
+
return selectorUnico({
|
|
46
|
+
titulo: '¿Qué operación quieres realizar?',
|
|
47
|
+
items: OPCIONES,
|
|
48
|
+
indiceDefault: 0,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
module.exports = { mostrarMenuPrincipal, OPCIONES };
|