@saulwade/swl-ses 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +47 -6
- package/README.md +1 -1
- package/agentes/accesibilidad-wcag-swl.md +690 -690
- package/agentes/arquitecto-swl.md +267 -267
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/backend-api-swl.md +472 -472
- package/agentes/backend-csharp-swl.md +420 -420
- package/agentes/backend-go-swl.md +390 -390
- package/agentes/backend-java-swl.md +281 -281
- package/agentes/backend-node-swl.md +479 -479
- package/agentes/backend-python-swl.md +605 -605
- package/agentes/backend-rust-swl.md +364 -364
- package/agentes/backend-workers-swl.md +482 -482
- package/agentes/cloud-infra-swl.md +509 -509
- package/agentes/consolidador-swl.md +541 -541
- package/agentes/datos-swl.md +605 -605
- package/agentes/depurador-swl.md +352 -352
- package/agentes/devops-ci-swl.md +400 -400
- package/agentes/disenador-ui-swl.md +569 -569
- package/agentes/documentador-swl.md +345 -345
- package/agentes/frontend-angular-swl.md +621 -621
- package/agentes/frontend-css-swl.md +716 -716
- package/agentes/frontend-react-swl.md +692 -692
- package/agentes/frontend-swl.md +496 -496
- package/agentes/frontend-tailwind-swl.md +826 -826
- package/agentes/gh-fix-ci-swl.md +2 -2
- package/agentes/implementador-swl.md +328 -328
- package/agentes/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- package/agentes/llm-apps-swl.md +278 -278
- package/agentes/migrador-swl.md +442 -442
- package/agentes/mobile-android-swl.md +511 -511
- package/agentes/mobile-cross-swl.md +541 -541
- package/agentes/mobile-ios-swl.md +502 -502
- package/agentes/mobile-testing-swl.md +302 -302
- package/agentes/nemesis-auditor-swl.md +285 -285
- package/agentes/notificador-swl.md +918 -918
- package/agentes/observabilidad-swl.md +438 -438
- package/agentes/orquestador-swl.md +1026 -1026
- package/agentes/pagos-swl.md +310 -310
- package/agentes/perfilador-usuario-swl.md +321 -321
- package/agentes/planificador-swl.md +399 -399
- package/agentes/producto-prd-swl.md +589 -589
- package/agentes/red-team-swl.md +1 -1
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/resolutor-build-swl.md +245 -245
- package/agentes/revisor-angular-swl.md +278 -278
- package/agentes/revisor-codigo-swl.md +505 -505
- package/agentes/revisor-csharp-swl.md +264 -264
- package/agentes/revisor-go-swl.md +259 -259
- package/agentes/revisor-java-swl.md +257 -257
- package/agentes/revisor-kotlin-swl.md +273 -273
- package/agentes/revisor-nextjs-swl.md +281 -281
- package/agentes/revisor-php-swl.md +271 -271
- package/agentes/revisor-react-swl.md +278 -278
- package/agentes/revisor-rust-swl.md +346 -346
- package/agentes/revisor-seguridad-swl.md +399 -399
- package/agentes/revisor-swift-swl.md +268 -268
- package/agentes/revisor-typescript-swl.md +346 -346
- package/agentes/sre-swl.md +291 -291
- package/agentes/tdd-qa-swl.md +393 -393
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/predecir.md +139 -139
- package/comandos/swl/sesiones.md +1 -1
- package/gateway/agent-executor.js +1 -1
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/agent-deep-links/SKILL.md +148 -148
- package/habilidades/agentes-como-servicio/SKILL.md +2 -2
- package/habilidades/angular-moderno/SKILL.md +20 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/backend-async-postgres-testing/SKILL.md +215 -215
- package/habilidades/backend-error-design/SKILL.md +221 -221
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/calidad-anti-patrones-universales/SKILL.md +368 -368
- package/habilidades/calidad-contract-testing/SKILL.md +165 -165
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -170
- package/habilidades/changelog-generator/scripts/parse-commits.js +367 -367
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +1 -1
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +252 -252
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- 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/proceso-ddia-fundamentos/SKILL.md +255 -255
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -105
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -138
- 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/prompt-engineering/recursos/patrones-avanzados.md +2 -2
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/structured-outputs/SKILL.md +2 -2
- 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/swl-dashboard/SKILL.md +2 -2
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +1 -1
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +1 -1
- package/hooks/ciclo-evolucion-subagente.js +26 -26
- package/hooks/ciclo-evolucion.js +26 -26
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/claudemd-duplicacion-detector.js +170 -170
- package/hooks/contexto-iteracion.js +144 -144
- package/hooks/guardrail-modelo.js +1 -1
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/autonomia.js +208 -208
- 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/etapa-auto-evolucion.js +701 -701
- package/hooks/lib/etapa-metricas.js +388 -388
- package/hooks/lib/etapa-perfil-usuario.js +376 -376
- package/hooks/lib/loop-telemetry.js +321 -321
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/model-router.js +2 -2
- package/hooks/lib/propose-step.js +358 -358
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/rate-limit-tracker.js +253 -253
- 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/token-estimator.js +1 -0
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/lib/usage-model.js +1 -1
- package/hooks/linea-estado.js +2 -0
- package/hooks/registro-turnos.js +209 -209
- package/hooks/session-briefing.js +98 -98
- package/hooks/spec-gate.js +211 -211
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/tdd-gate.js +241 -241
- package/hooks/telemetria-skill-routing.js +100 -100
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-intent-spec.js +242 -242
- package/hooks/validar-memoria-hook.js +218 -218
- package/hooks/validar-planning-paths.js +134 -134
- package/instintos/autonomia.yaml +27 -27
- package/instintos/prompt-appendices.yaml +57 -57
- package/llms.txt +29 -29
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/canonical-hashes.json +2291 -1964
- package/manifiestos/planning-paths.json +44 -44
- package/manifiestos/skills-lock.json +1282 -1282
- package/package.json +1 -1
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/README.md +47 -47
- 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 +1 -1
- package/reglas/accesibilidad.md +10 -10
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/api-diseno.md +9 -9
- package/reglas/arreglar-al-detectar.md +240 -240
- 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/debatir-antes-de-aceptar.md +158 -158
- package/reglas/fragmentos-compartidos.md +183 -183
- package/reglas/hooks.md +6 -6
- package/reglas/intent-engineering.md +218 -218
- package/reglas/markitdown.md +8 -8
- package/reglas/monitor-ci.md +309 -309
- package/reglas/patrones.md +6 -6
- package/reglas/sesiones-paralelas.md +180 -180
- package/reglas/sin-duplicacion-reglas-globales.md +182 -182
- package/reglas/skills-estandar.md +6 -6
- package/reglas/testing.md +7 -7
- package/reglas/tests-cleanup.md +224 -224
- package/reglas/usar-code-review-graph.md +155 -155
- package/reglas/usar-context7.md +226 -226
- package/reglas/verificar-citas-normativas.md +548 -548
- package/schemas/agent-frontmatter.schema.json +3 -3
- 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/hook-profiles.schema.json +54 -54
- package/schemas/hooks-config.schema.json +89 -89
- package/schemas/modulos.schema.json +38 -38
- package/schemas/perfiles.schema.json +36 -36
- package/schemas/plugin.schema.json +77 -77
- package/schemas/skill-evals.schema.json +119 -119
- package/schemas/skill-frontmatter.schema.json +245 -245
- 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/benchmark-memoria.js +167 -167
- 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/configurar-ci.js +40 -40
- 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/loop-telemetry.js +125 -125
- 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/configurar-branch-protection.js +418 -418
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/field-report.js +199 -199
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-matriz-lenguajes.js +271 -271
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/auditar-invocaciones-comandos.js +104 -104
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/ci-reader.js +193 -193
- package/scripts/lib/claude-sessions.js +1 -0
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-host-swl.js +175 -175
- 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/diary-entry.js +234 -234
- 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/evidencia-release.js +322 -322
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/gate-hooks-requires.js +249 -249
- package/scripts/lib/gate-licencias.js +212 -212
- package/scripts/lib/git-metricas.js +257 -257
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/metricas-dora.js +204 -204
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/plan-lock.js +275 -275
- package/scripts/lib/pr-analyzer.js +399 -399
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/reglas-globales-conocidas.json +180 -180
- package/scripts/lib/resolver-plan-fase.js +37 -37
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/schema-version.js +164 -164
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/tool-cost-analyzer.js +1 -0
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +200 -200
- package/scripts/publicar.js +497 -497
- package/scripts/run-eval.js +141 -141
- 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/index.js +162 -162
- 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/inspect.js +173 -173
- package/scripts/tui/pantallas/install-wizard.js +334 -334
- 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/tui/pantallas/uninstall-wizard.js +208 -208
- package/scripts/tui/pantallas/update-wizard.js +232 -232
- package/scripts/tui/pantallas/welcome.js +187 -187
- package/scripts/validar-userland-vacio.js +110 -110
package/hooks/lib/autonomia.js
CHANGED
|
@@ -1,208 +1,208 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* hooks/lib/autonomia.js — Fase 13 (ADR-0037): presupuesto de autonomía.
|
|
5
|
-
*
|
|
6
|
-
* Carga el dial de autonomía por clase de riesgo desde instintos/autonomia.yaml
|
|
7
|
-
* y provee el auto-checkpoint mecánico que precede a una acción autónoma de clase
|
|
8
|
-
* cambio_reversible (reversibilidad como precondición de autonomía, D-13-05).
|
|
9
|
-
*
|
|
10
|
-
* Defaults = los controles vigentes de reglas/seguridad-agentes.md. La lib NUNCA
|
|
11
|
-
* relaja: valores desconocidos o clases ausentes degradan al default (más
|
|
12
|
-
* restrictivo). Si el yaml no existe (proyecto destino sin el archivo), usa
|
|
13
|
-
* DEFAULTS hardcodeados.
|
|
14
|
-
*
|
|
15
|
-
* Enforcement v1 = GUÍA leída + auto-checkpoint mecánico. NO es un gate bloqueante
|
|
16
|
-
* (eso es el patrón que el ADR descartó). El test de REQ-13-07 verifica el
|
|
17
|
-
* mecanismo del checkpoint, no la conducta del agente.
|
|
18
|
-
*
|
|
19
|
-
* Zero-deps (Node stdlib). Parser YAML local mínimo: la estructura de
|
|
20
|
-
* autonomia.yaml es plana y trivial, así se evita el require cross-dir
|
|
21
|
-
* hooks/lib → scripts/lib que se rompe en el destino aplanado.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
const fs = require('fs');
|
|
25
|
-
const path = require('path');
|
|
26
|
-
const { execFileSync } = require('child_process');
|
|
27
|
-
|
|
28
|
-
// Defaults = reglas/seguridad-agentes.md (este archivo NO los relaja).
|
|
29
|
-
const DEFAULTS = Object.freeze({
|
|
30
|
-
lectura_analisis: 'total',
|
|
31
|
-
cambio_reversible: 'con_auto_checkpoint',
|
|
32
|
-
migracion_auth_push_publish: 'hitl',
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
// Nivel válido por clase. Cualquier otro valor degrada a 'hitl'.
|
|
36
|
-
const NIVELES_VALIDOS = new Set(['total', 'con_auto_checkpoint', 'hitl']);
|
|
37
|
-
|
|
38
|
-
const YAML_PATH = ['instintos', 'autonomia.yaml'];
|
|
39
|
-
const CHECKPOINTS_PATH = ['.planning', 'user-profile', 'auto-checkpoints.jsonl'];
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Parser mínimo de la estructura plana de autonomia.yaml:
|
|
43
|
-
* key: value (escalares de primer nivel)
|
|
44
|
-
* clases:
|
|
45
|
-
* subkey: value (1 nivel de anidamiento)
|
|
46
|
-
* Ignora comentarios (#) y líneas en blanco. Suficiente para este archivo.
|
|
47
|
-
*/
|
|
48
|
-
// Claves prohibidas: evitan prototype pollution si un yaml hostil las declara.
|
|
49
|
-
const CLAVES_PROHIBIDAS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
50
|
-
|
|
51
|
-
function _parsearYamlPlano(texto) {
|
|
52
|
-
const out = {};
|
|
53
|
-
let seccion = null;
|
|
54
|
-
for (const lineaRaw of String(texto).split(/\r?\n/)) {
|
|
55
|
-
const linea = lineaRaw.replace(/\s+#.*$/, ''); // comentario inline
|
|
56
|
-
if (!linea.trim() || linea.trim().startsWith('#')) continue;
|
|
57
|
-
const mSeccion = linea.match(/^([A-Za-z_][\w-]*)\s*:\s*$/);
|
|
58
|
-
if (mSeccion) {
|
|
59
|
-
seccion = mSeccion[1];
|
|
60
|
-
if (CLAVES_PROHIBIDAS.has(seccion)) { seccion = null; continue; }
|
|
61
|
-
out[seccion] = {};
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
const mKV = linea.match(/^(\s*)([A-Za-z_][\w-]*)\s*:\s*(.+?)\s*$/);
|
|
65
|
-
if (mKV) {
|
|
66
|
-
const indent = mKV[1].length;
|
|
67
|
-
const k = mKV[2];
|
|
68
|
-
if (CLAVES_PROHIBIDAS.has(k)) continue;
|
|
69
|
-
const v = mKV[3].replace(/^["'](.*)["']$/, '$1');
|
|
70
|
-
if (indent > 0 && seccion) {
|
|
71
|
-
out[seccion][k] = v;
|
|
72
|
-
} else {
|
|
73
|
-
seccion = null;
|
|
74
|
-
out[k] = v;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return out;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function _normalizarNivel(valor) {
|
|
82
|
-
return NIVELES_VALIDOS.has(valor) ? valor : 'hitl';
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Carga el dial de autonomía. Merge que solo COMPLETA con defaults y degrada
|
|
87
|
-
* valores desconocidos a 'hitl' (nunca relaja).
|
|
88
|
-
* @param {string} baseDir - raíz del proyecto (default: cwd).
|
|
89
|
-
* @returns {{version?:string, defaults?:string, clases:Object}}
|
|
90
|
-
*/
|
|
91
|
-
function cargarDial(baseDir) {
|
|
92
|
-
const ruta = path.join(baseDir || process.cwd(), ...YAML_PATH);
|
|
93
|
-
let parsed = {};
|
|
94
|
-
try {
|
|
95
|
-
parsed = _parsearYamlPlano(fs.readFileSync(ruta, 'utf8'));
|
|
96
|
-
} catch (_) {
|
|
97
|
-
parsed = {}; // sin archivo → solo defaults
|
|
98
|
-
}
|
|
99
|
-
const clasesYaml = parsed.clases && typeof parsed.clases === 'object' ? parsed.clases : {};
|
|
100
|
-
const clases = {};
|
|
101
|
-
for (const clase of Object.keys(DEFAULTS)) {
|
|
102
|
-
clases[clase] = clase in clasesYaml ? _normalizarNivel(clasesYaml[clase]) : DEFAULTS[clase];
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
version: parsed.version,
|
|
106
|
-
defaults: parsed.defaults || 'seguridad-agentes.md',
|
|
107
|
-
clases,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* ¿La clase requiere auto-checkpoint antes de actuar autónomamente?
|
|
113
|
-
* Solo cuando el dial declara la clase como 'con_auto_checkpoint'.
|
|
114
|
-
* @param {object} dial
|
|
115
|
-
* @param {string} clase
|
|
116
|
-
* @returns {boolean}
|
|
117
|
-
*/
|
|
118
|
-
function requiereAutoCheckpoint(dial, clase) {
|
|
119
|
-
return !!(dial && dial.clases && dial.clases[clase] === 'con_auto_checkpoint');
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function _gitHead(baseDir) {
|
|
123
|
-
try {
|
|
124
|
-
return execFileSync('git', ['rev-parse', 'HEAD'], {
|
|
125
|
-
cwd: baseDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
|
|
126
|
-
}).trim() || null;
|
|
127
|
-
} catch (_) {
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function _archivosModificados(baseDir) {
|
|
133
|
-
try {
|
|
134
|
-
return execFileSync('git', ['status', '--porcelain'], {
|
|
135
|
-
cwd: baseDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
|
|
136
|
-
})
|
|
137
|
-
.split('\n').map((l) => l.slice(3).trim()).filter(Boolean);
|
|
138
|
-
} catch (_) {
|
|
139
|
-
return [];
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Registra un auto-checkpoint antes de una acción autónoma de cambio reversible.
|
|
145
|
-
* No hace snapshot: los commits atómicos SON la reversibilidad (seguridad-agentes.md);
|
|
146
|
-
* el checkpoint registra HEAD + archivos modificados como evidencia de rollback.
|
|
147
|
-
* Best-effort: nunca lanza (no debe bloquear la acción que protege).
|
|
148
|
-
* @param {string} baseDir
|
|
149
|
-
* @param {string} accion - descripción corta de la acción.
|
|
150
|
-
* @param {string} [tsISO] - timestamp inyectable para tests.
|
|
151
|
-
* @returns {{ts,accion,clase,gitHead,archivosModificados}}
|
|
152
|
-
*/
|
|
153
|
-
const MAX_ACCION_LEN = 512; // tope para que el JSONL no crezca sin límite
|
|
154
|
-
|
|
155
|
-
function autoCheckpoint(baseDir, accion, tsISO) {
|
|
156
|
-
const base = baseDir || process.cwd();
|
|
157
|
-
const registro = {
|
|
158
|
-
ts: tsISO || new Date().toISOString(),
|
|
159
|
-
accion: String(accion || '').slice(0, MAX_ACCION_LEN),
|
|
160
|
-
clase: 'cambio_reversible',
|
|
161
|
-
gitHead: _gitHead(base),
|
|
162
|
-
archivosModificados: _archivosModificados(base),
|
|
163
|
-
};
|
|
164
|
-
try {
|
|
165
|
-
const ruta = path.join(base, ...CHECKPOINTS_PATH);
|
|
166
|
-
const dir = path.dirname(ruta);
|
|
167
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
168
|
-
fs.appendFileSync(ruta, JSON.stringify(registro) + '\n');
|
|
169
|
-
} catch (_) {
|
|
170
|
-
// persistir es best-effort; el registro se devuelve igual.
|
|
171
|
-
}
|
|
172
|
-
return registro;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// ─── CLI ──────────────────────────────────────────────────────────────────────
|
|
176
|
-
|
|
177
|
-
// Soporta `--accion=texto` y `--accion texto`. Un solo mecanismo de parse.
|
|
178
|
-
function _parseAccion(args) {
|
|
179
|
-
for (let j = 0; j < args.length; j++) {
|
|
180
|
-
const a = args[j];
|
|
181
|
-
if (a.startsWith('--accion=')) return a.slice('--accion='.length);
|
|
182
|
-
if (a === '--accion' && args[j + 1] && !args[j + 1].startsWith('--')) return args[j + 1];
|
|
183
|
-
}
|
|
184
|
-
return '';
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function main(argv) {
|
|
188
|
-
const accion = _parseAccion(argv.slice(2));
|
|
189
|
-
const baseDir = process.cwd();
|
|
190
|
-
const dial = cargarDial(baseDir);
|
|
191
|
-
if (requiereAutoCheckpoint(dial, 'cambio_reversible')) {
|
|
192
|
-
const reg = autoCheckpoint(baseDir, accion || '(sin descripción)');
|
|
193
|
-
process.stdout.write(JSON.stringify(reg) + '\n');
|
|
194
|
-
}
|
|
195
|
-
return 0;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
if (require.main === module) {
|
|
199
|
-
process.exit(main(process.argv));
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
module.exports = {
|
|
203
|
-
DEFAULTS,
|
|
204
|
-
cargarDial,
|
|
205
|
-
requiereAutoCheckpoint,
|
|
206
|
-
autoCheckpoint,
|
|
207
|
-
_parsearYamlPlano,
|
|
208
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* hooks/lib/autonomia.js — Fase 13 (ADR-0037): presupuesto de autonomía.
|
|
5
|
+
*
|
|
6
|
+
* Carga el dial de autonomía por clase de riesgo desde instintos/autonomia.yaml
|
|
7
|
+
* y provee el auto-checkpoint mecánico que precede a una acción autónoma de clase
|
|
8
|
+
* cambio_reversible (reversibilidad como precondición de autonomía, D-13-05).
|
|
9
|
+
*
|
|
10
|
+
* Defaults = los controles vigentes de reglas/seguridad-agentes.md. La lib NUNCA
|
|
11
|
+
* relaja: valores desconocidos o clases ausentes degradan al default (más
|
|
12
|
+
* restrictivo). Si el yaml no existe (proyecto destino sin el archivo), usa
|
|
13
|
+
* DEFAULTS hardcodeados.
|
|
14
|
+
*
|
|
15
|
+
* Enforcement v1 = GUÍA leída + auto-checkpoint mecánico. NO es un gate bloqueante
|
|
16
|
+
* (eso es el patrón que el ADR descartó). El test de REQ-13-07 verifica el
|
|
17
|
+
* mecanismo del checkpoint, no la conducta del agente.
|
|
18
|
+
*
|
|
19
|
+
* Zero-deps (Node stdlib). Parser YAML local mínimo: la estructura de
|
|
20
|
+
* autonomia.yaml es plana y trivial, así se evita el require cross-dir
|
|
21
|
+
* hooks/lib → scripts/lib que se rompe en el destino aplanado.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const path = require('path');
|
|
26
|
+
const { execFileSync } = require('child_process');
|
|
27
|
+
|
|
28
|
+
// Defaults = reglas/seguridad-agentes.md (este archivo NO los relaja).
|
|
29
|
+
const DEFAULTS = Object.freeze({
|
|
30
|
+
lectura_analisis: 'total',
|
|
31
|
+
cambio_reversible: 'con_auto_checkpoint',
|
|
32
|
+
migracion_auth_push_publish: 'hitl',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Nivel válido por clase. Cualquier otro valor degrada a 'hitl'.
|
|
36
|
+
const NIVELES_VALIDOS = new Set(['total', 'con_auto_checkpoint', 'hitl']);
|
|
37
|
+
|
|
38
|
+
const YAML_PATH = ['instintos', 'autonomia.yaml'];
|
|
39
|
+
const CHECKPOINTS_PATH = ['.planning', 'user-profile', 'auto-checkpoints.jsonl'];
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Parser mínimo de la estructura plana de autonomia.yaml:
|
|
43
|
+
* key: value (escalares de primer nivel)
|
|
44
|
+
* clases:
|
|
45
|
+
* subkey: value (1 nivel de anidamiento)
|
|
46
|
+
* Ignora comentarios (#) y líneas en blanco. Suficiente para este archivo.
|
|
47
|
+
*/
|
|
48
|
+
// Claves prohibidas: evitan prototype pollution si un yaml hostil las declara.
|
|
49
|
+
const CLAVES_PROHIBIDAS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
50
|
+
|
|
51
|
+
function _parsearYamlPlano(texto) {
|
|
52
|
+
const out = {};
|
|
53
|
+
let seccion = null;
|
|
54
|
+
for (const lineaRaw of String(texto).split(/\r?\n/)) {
|
|
55
|
+
const linea = lineaRaw.replace(/\s+#.*$/, ''); // comentario inline
|
|
56
|
+
if (!linea.trim() || linea.trim().startsWith('#')) continue;
|
|
57
|
+
const mSeccion = linea.match(/^([A-Za-z_][\w-]*)\s*:\s*$/);
|
|
58
|
+
if (mSeccion) {
|
|
59
|
+
seccion = mSeccion[1];
|
|
60
|
+
if (CLAVES_PROHIBIDAS.has(seccion)) { seccion = null; continue; }
|
|
61
|
+
out[seccion] = {};
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const mKV = linea.match(/^(\s*)([A-Za-z_][\w-]*)\s*:\s*(.+?)\s*$/);
|
|
65
|
+
if (mKV) {
|
|
66
|
+
const indent = mKV[1].length;
|
|
67
|
+
const k = mKV[2];
|
|
68
|
+
if (CLAVES_PROHIBIDAS.has(k)) continue;
|
|
69
|
+
const v = mKV[3].replace(/^["'](.*)["']$/, '$1');
|
|
70
|
+
if (indent > 0 && seccion) {
|
|
71
|
+
out[seccion][k] = v;
|
|
72
|
+
} else {
|
|
73
|
+
seccion = null;
|
|
74
|
+
out[k] = v;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function _normalizarNivel(valor) {
|
|
82
|
+
return NIVELES_VALIDOS.has(valor) ? valor : 'hitl';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Carga el dial de autonomía. Merge que solo COMPLETA con defaults y degrada
|
|
87
|
+
* valores desconocidos a 'hitl' (nunca relaja).
|
|
88
|
+
* @param {string} baseDir - raíz del proyecto (default: cwd).
|
|
89
|
+
* @returns {{version?:string, defaults?:string, clases:Object}}
|
|
90
|
+
*/
|
|
91
|
+
function cargarDial(baseDir) {
|
|
92
|
+
const ruta = path.join(baseDir || process.cwd(), ...YAML_PATH);
|
|
93
|
+
let parsed = {};
|
|
94
|
+
try {
|
|
95
|
+
parsed = _parsearYamlPlano(fs.readFileSync(ruta, 'utf8'));
|
|
96
|
+
} catch (_) {
|
|
97
|
+
parsed = {}; // sin archivo → solo defaults
|
|
98
|
+
}
|
|
99
|
+
const clasesYaml = parsed.clases && typeof parsed.clases === 'object' ? parsed.clases : {};
|
|
100
|
+
const clases = {};
|
|
101
|
+
for (const clase of Object.keys(DEFAULTS)) {
|
|
102
|
+
clases[clase] = clase in clasesYaml ? _normalizarNivel(clasesYaml[clase]) : DEFAULTS[clase];
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
version: parsed.version,
|
|
106
|
+
defaults: parsed.defaults || 'seguridad-agentes.md',
|
|
107
|
+
clases,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* ¿La clase requiere auto-checkpoint antes de actuar autónomamente?
|
|
113
|
+
* Solo cuando el dial declara la clase como 'con_auto_checkpoint'.
|
|
114
|
+
* @param {object} dial
|
|
115
|
+
* @param {string} clase
|
|
116
|
+
* @returns {boolean}
|
|
117
|
+
*/
|
|
118
|
+
function requiereAutoCheckpoint(dial, clase) {
|
|
119
|
+
return !!(dial && dial.clases && dial.clases[clase] === 'con_auto_checkpoint');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function _gitHead(baseDir) {
|
|
123
|
+
try {
|
|
124
|
+
return execFileSync('git', ['rev-parse', 'HEAD'], {
|
|
125
|
+
cwd: baseDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
|
|
126
|
+
}).trim() || null;
|
|
127
|
+
} catch (_) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function _archivosModificados(baseDir) {
|
|
133
|
+
try {
|
|
134
|
+
return execFileSync('git', ['status', '--porcelain'], {
|
|
135
|
+
cwd: baseDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
|
|
136
|
+
})
|
|
137
|
+
.split('\n').map((l) => l.slice(3).trim()).filter(Boolean);
|
|
138
|
+
} catch (_) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Registra un auto-checkpoint antes de una acción autónoma de cambio reversible.
|
|
145
|
+
* No hace snapshot: los commits atómicos SON la reversibilidad (seguridad-agentes.md);
|
|
146
|
+
* el checkpoint registra HEAD + archivos modificados como evidencia de rollback.
|
|
147
|
+
* Best-effort: nunca lanza (no debe bloquear la acción que protege).
|
|
148
|
+
* @param {string} baseDir
|
|
149
|
+
* @param {string} accion - descripción corta de la acción.
|
|
150
|
+
* @param {string} [tsISO] - timestamp inyectable para tests.
|
|
151
|
+
* @returns {{ts,accion,clase,gitHead,archivosModificados}}
|
|
152
|
+
*/
|
|
153
|
+
const MAX_ACCION_LEN = 512; // tope para que el JSONL no crezca sin límite
|
|
154
|
+
|
|
155
|
+
function autoCheckpoint(baseDir, accion, tsISO) {
|
|
156
|
+
const base = baseDir || process.cwd();
|
|
157
|
+
const registro = {
|
|
158
|
+
ts: tsISO || new Date().toISOString(),
|
|
159
|
+
accion: String(accion || '').slice(0, MAX_ACCION_LEN),
|
|
160
|
+
clase: 'cambio_reversible',
|
|
161
|
+
gitHead: _gitHead(base),
|
|
162
|
+
archivosModificados: _archivosModificados(base),
|
|
163
|
+
};
|
|
164
|
+
try {
|
|
165
|
+
const ruta = path.join(base, ...CHECKPOINTS_PATH);
|
|
166
|
+
const dir = path.dirname(ruta);
|
|
167
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
168
|
+
fs.appendFileSync(ruta, JSON.stringify(registro) + '\n');
|
|
169
|
+
} catch (_) {
|
|
170
|
+
// persistir es best-effort; el registro se devuelve igual.
|
|
171
|
+
}
|
|
172
|
+
return registro;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ─── CLI ──────────────────────────────────────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
// Soporta `--accion=texto` y `--accion texto`. Un solo mecanismo de parse.
|
|
178
|
+
function _parseAccion(args) {
|
|
179
|
+
for (let j = 0; j < args.length; j++) {
|
|
180
|
+
const a = args[j];
|
|
181
|
+
if (a.startsWith('--accion=')) return a.slice('--accion='.length);
|
|
182
|
+
if (a === '--accion' && args[j + 1] && !args[j + 1].startsWith('--')) return args[j + 1];
|
|
183
|
+
}
|
|
184
|
+
return '';
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function main(argv) {
|
|
188
|
+
const accion = _parseAccion(argv.slice(2));
|
|
189
|
+
const baseDir = process.cwd();
|
|
190
|
+
const dial = cargarDial(baseDir);
|
|
191
|
+
if (requiereAutoCheckpoint(dial, 'cambio_reversible')) {
|
|
192
|
+
const reg = autoCheckpoint(baseDir, accion || '(sin descripción)');
|
|
193
|
+
process.stdout.write(JSON.stringify(reg) + '\n');
|
|
194
|
+
}
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (require.main === module) {
|
|
199
|
+
process.exit(main(process.argv));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
module.exports = {
|
|
203
|
+
DEFAULTS,
|
|
204
|
+
cargarDial,
|
|
205
|
+
requiereAutoCheckpoint,
|
|
206
|
+
autoCheckpoint,
|
|
207
|
+
_parsearYamlPlano,
|
|
208
|
+
};
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* hooks/lib/ciclo-evolucion.js — Lib de dominio del ciclo de evolución (Fase 11).
|
|
5
|
-
*
|
|
6
|
-
* Consolida las 3 etapas que antes eran hooks independientes
|
|
7
|
-
* (`metricas-evolucion.js`, `actualizar-perfil-usuario.js`,
|
|
8
|
-
* `auto-evolucion.js`). Cada etapa preserva su lógica intacta en
|
|
9
|
-
* `etapa-*.js`; esta lib solo las compone para reducir procesos de arranque.
|
|
10
|
-
*
|
|
11
|
-
* Mapeo a entry points:
|
|
12
|
-
* - hooks/ciclo-evolucion.js (Stop) → metricas + perfil-usuario
|
|
13
|
-
* - hooks/ciclo-evolucion-subagente.js (SubagentStop) → auto-evolucion
|
|
14
|
-
*
|
|
15
|
-
* `auto-consolidacion.js` queda FUERA por diseño: pertenece al dominio de
|
|
16
|
-
* consolidación de aprendizajes (/swl:aprender), no al de evolución (D-12).
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
const etapaMetricas = require('./etapa-metricas');
|
|
20
|
-
const etapaPerfilUsuario = require('./etapa-perfil-usuario');
|
|
21
|
-
const etapaAutoEvolucion = require('./etapa-auto-evolucion');
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Sub-etapas del evento Stop: métricas del ciclo + perfil de usuario.
|
|
25
|
-
* Cada etapa es best-effort (nunca lanza); un fallo en una no impide la otra.
|
|
26
|
-
* @param {string} inputRaw payload del hook Stop
|
|
27
|
-
*/
|
|
28
|
-
function ejecutarStop(inputRaw) {
|
|
29
|
-
try { etapaMetricas.ejecutar(inputRaw); } catch { /* best-effort */ }
|
|
30
|
-
try { etapaPerfilUsuario.ejecutar(inputRaw); } catch { /* best-effort */ }
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Sub-etapa del evento SubagentStop: auto-evolución de agentes.
|
|
35
|
-
* @param {string} inputRaw payload del hook SubagentStop
|
|
36
|
-
*/
|
|
37
|
-
function ejecutarSubagentStop(inputRaw) {
|
|
38
|
-
try { etapaAutoEvolucion.ejecutar(inputRaw); } catch { /* best-effort */ }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
module.exports = {
|
|
42
|
-
ejecutarStop,
|
|
43
|
-
ejecutarSubagentStop,
|
|
44
|
-
etapaMetricas,
|
|
45
|
-
etapaPerfilUsuario,
|
|
46
|
-
etapaAutoEvolucion,
|
|
47
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* hooks/lib/ciclo-evolucion.js — Lib de dominio del ciclo de evolución (Fase 11).
|
|
5
|
+
*
|
|
6
|
+
* Consolida las 3 etapas que antes eran hooks independientes
|
|
7
|
+
* (`metricas-evolucion.js`, `actualizar-perfil-usuario.js`,
|
|
8
|
+
* `auto-evolucion.js`). Cada etapa preserva su lógica intacta en
|
|
9
|
+
* `etapa-*.js`; esta lib solo las compone para reducir procesos de arranque.
|
|
10
|
+
*
|
|
11
|
+
* Mapeo a entry points:
|
|
12
|
+
* - hooks/ciclo-evolucion.js (Stop) → metricas + perfil-usuario
|
|
13
|
+
* - hooks/ciclo-evolucion-subagente.js (SubagentStop) → auto-evolucion
|
|
14
|
+
*
|
|
15
|
+
* `auto-consolidacion.js` queda FUERA por diseño: pertenece al dominio de
|
|
16
|
+
* consolidación de aprendizajes (/swl:aprender), no al de evolución (D-12).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const etapaMetricas = require('./etapa-metricas');
|
|
20
|
+
const etapaPerfilUsuario = require('./etapa-perfil-usuario');
|
|
21
|
+
const etapaAutoEvolucion = require('./etapa-auto-evolucion');
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Sub-etapas del evento Stop: métricas del ciclo + perfil de usuario.
|
|
25
|
+
* Cada etapa es best-effort (nunca lanza); un fallo en una no impide la otra.
|
|
26
|
+
* @param {string} inputRaw payload del hook Stop
|
|
27
|
+
*/
|
|
28
|
+
function ejecutarStop(inputRaw) {
|
|
29
|
+
try { etapaMetricas.ejecutar(inputRaw); } catch { /* best-effort */ }
|
|
30
|
+
try { etapaPerfilUsuario.ejecutar(inputRaw); } catch { /* best-effort */ }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Sub-etapa del evento SubagentStop: auto-evolución de agentes.
|
|
35
|
+
* @param {string} inputRaw payload del hook SubagentStop
|
|
36
|
+
*/
|
|
37
|
+
function ejecutarSubagentStop(inputRaw) {
|
|
38
|
+
try { etapaAutoEvolucion.ejecutar(inputRaw); } catch { /* best-effort */ }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = {
|
|
42
|
+
ejecutarStop,
|
|
43
|
+
ejecutarSubagentStop,
|
|
44
|
+
etapaMetricas,
|
|
45
|
+
etapaPerfilUsuario,
|
|
46
|
+
etapaAutoEvolucion,
|
|
47
|
+
};
|