@saulwade/swl-ses 2.6.0 → 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 +209 -197
- package/README.md +647 -600
- package/agentes/accesibilidad-wcag-swl.md +690 -690
- package/agentes/arquitecto-swl.md +267 -267
- package/agentes/auto-evolucion-swl.md +932 -932
- 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-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/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/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- 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/observabilidad-swl.md +438 -438
- 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 +218 -218
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/revisor-angular-swl.md +278 -278
- 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/tdd-qa-swl.md +393 -393
- package/bin/swl-ses.js +10 -0
- package/comandos/swl/actualizar.md +174 -174
- package/comandos/swl/adoptar-proyecto.md +265 -265
- package/comandos/swl/aprender.md +836 -836
- package/comandos/swl/aprobar-plan.md +146 -146
- package/comandos/swl/auditar-deps.md +134 -134
- package/comandos/swl/autoresearch.md +264 -264
- package/comandos/swl/ayuda.md +224 -224
- package/comandos/swl/brainstorm.md +52 -51
- package/comandos/swl/checkpoint.md +325 -325
- package/comandos/swl/claudemd.md +234 -234
- package/comandos/swl/compactar.md +310 -310
- package/comandos/swl/configurar-ci.md +235 -235
- package/comandos/swl/contexto.md +110 -110
- package/comandos/swl/crear-skill.md +292 -292
- package/comandos/swl/cron.md +194 -194
- package/comandos/swl/deuda-codigo.md +97 -97
- package/comandos/swl/discutir-fase.md +169 -169
- package/comandos/swl/ejecutar-fase.md +233 -233
- package/comandos/swl/evaluar-skill.md +520 -520
- package/comandos/swl/evolucion-continua.md +73 -73
- package/comandos/swl/evolucionar.md +267 -267
- package/comandos/swl/exportar-vault.md +583 -583
- package/comandos/swl/fix.md +118 -118
- package/comandos/swl/gateway.md +158 -158
- package/comandos/swl/inbox.md +116 -116
- package/comandos/swl/instalar.md +220 -220
- package/comandos/swl/instintos.md +86 -86
- package/comandos/swl/mapear-codebase.md +312 -312
- package/comandos/swl/mcp-status.md +176 -175
- package/comandos/swl/modelo.md +100 -100
- package/comandos/swl/nemesis.md +433 -433
- package/comandos/swl/notificaciones.md +299 -299
- package/comandos/swl/nuevo-proyecto.md +251 -251
- package/comandos/swl/planear-fase.md +263 -263
- package/comandos/swl/plugins.md +256 -256
- package/comandos/swl/predecir.md +169 -169
- package/comandos/swl/reflect-skills.md +125 -125
- package/comandos/swl/release.md +450 -450
- package/comandos/swl/revisar-impacto.md +201 -201
- package/comandos/swl/revisar.md +330 -330
- package/comandos/swl/seguridad.md +189 -189
- package/comandos/swl/sesiones.md +200 -200
- package/comandos/swl/skill-search.md +113 -113
- package/comandos/swl/status.md +345 -345
- package/comandos/swl/verificar.md +817 -817
- package/comandos/swl/wiki.md +620 -620
- package/gateway/cron/jobs.example.json +12 -12
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/agent-deep-links/SKILL.md +148 -148
- package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -294
- package/habilidades/backend-async-postgres-testing/SKILL.md +216 -215
- 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/changelog-generator/SKILL.md +174 -174
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
- package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
- package/habilidades/compactacion-contexto/SKILL.md +2 -1
- package/habilidades/contenedores-docker/SKILL.md +4 -2
- package/habilidades/css-moderno/SKILL.md +7 -1
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/SKILL.md +207 -207
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/drift-detection/SKILL.md +1 -1
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
- package/habilidades/extractor-de-aprendizajes/SKILL.md +12 -2
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
- package/habilidades/harness-claude-code/SKILL.md +315 -314
- package/habilidades/instalar-sistema/SKILL.md +227 -227
- 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/planear-fase/SKILL.md +358 -358
- package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
- 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-ingenieria-requerimientos/SKILL.md +147 -147
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
- package/habilidades/proceso-modular-split/SKILL.md +256 -256
- package/habilidades/release-semver/SKILL.md +2 -2
- 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/SKILL.md +749 -749
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
- package/hooks/agente-lifecycle.js +1 -1
- package/hooks/audit-trail.js +1 -1
- package/hooks/auto-consolidacion.js +1 -1
- package/hooks/calidad-pre-commit.js +159 -10
- package/hooks/captura-acciones-post.js +1 -1
- package/hooks/captura-acciones-session.js +1 -1
- package/hooks/captura-feedback-usuario.js +1 -1
- package/hooks/ciclo-evolucion-subagente.js +26 -26
- package/hooks/ciclo-evolucion.js +26 -26
- package/hooks/contexto-iteracion.js +1 -1
- package/hooks/degradacion-instintos.js +1 -1
- package/hooks/grafo-contexto.js +1 -1
- package/hooks/guardrail-modelo.js +1 -1
- package/hooks/inbox-aviso.js +1 -1
- package/hooks/inyeccion-contexto.js +1 -1
- package/hooks/lib/agent-matcher.js +1 -1
- package/hooks/lib/agent-routing.js +1 -1
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/captura-acciones.js +1 -1
- 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-metricas.js +1 -1
- package/hooks/lib/evolution-tracker.js +1 -1
- package/hooks/lib/gateway-notify.js +193 -193
- package/hooks/lib/mcp-health.js +1 -1
- package/hooks/lib/notificacion-formato.js +92 -0
- package/hooks/lib/nudge-tracker.js +1 -1
- package/hooks/lib/otlp-exporter.js +1 -1
- package/hooks/lib/propose-step.js +1 -1
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/raiz-proyecto.js +158 -102
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/run-log.js +1 -1
- package/hooks/lib/security-net.js +201 -201
- package/hooks/lib/singleton-guard.js +20 -13
- 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/telegram-cliente.js +11 -3
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/notificacion-telegram.js +17 -13
- package/hooks/preservar-estado-pre-compact.js +1 -1
- package/hooks/registro-turnos.js +1 -1
- package/hooks/resumen-sesion.js +1 -1
- package/hooks/risk-scoring.js +1 -1
- package/hooks/session-briefing.js +13 -5
- package/hooks/spec-gate.js +1 -1
- package/hooks/sugerir-regenerar-inventario.js +1 -1
- package/hooks/tdd-gate.js +1 -1
- package/hooks/telemetria-agentes.js +1 -1
- package/hooks/telemetria-skill-routing.js +1 -1
- package/hooks/tracking-costos.js +1 -1
- package/hooks/validar-formato-post-subagente.js +1 -1
- package/hooks/validar-intent-spec.js +1 -1
- package/hooks/validar-planning-paths.js +1 -1
- 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 +6250 -5257
- package/manifiestos/harness-ir.json +47536 -0
- package/manifiestos/modulos.json +1429 -1428
- 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 +1275 -1275
- package/package.json +94 -94
- 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 +369 -369
- 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/auditar-clases-conocidas.js +134 -134
- package/scripts/bootstrap-instintos.js +88 -14
- package/scripts/canario-hooks.js +166 -166
- package/scripts/cli/aprobar-plan.js +73 -73
- package/scripts/cli/autonomia.js +23 -23
- package/scripts/cli/benchmark-memoria.js +37 -37
- package/scripts/cli/briefing.js +23 -23
- package/scripts/cli/ciclo-autonomo.js +73 -73
- package/scripts/cli/ciclo-evolucion.js +26 -26
- package/scripts/cli/ciclo-fase-b.js +102 -102
- 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/guardrail-metrics.js +39 -39
- package/scripts/cli/liberar-fase.js +42 -42
- package/scripts/cli/mark-evolved.js +56 -56
- package/scripts/cli/memoria-search.js +69 -69
- 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/nudge-accionar.js +39 -39
- package/scripts/cli/propose-step.js +29 -29
- package/scripts/cli/run-eval.js +38 -38
- 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 -13
- package/scripts/evidencia-valor.js +101 -101
- package/scripts/field-report.js +16 -16
- 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 +39 -7
- package/scripts/lib/activar-hooks-proyecto.js +116 -116
- 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/candidatos.js +174 -174
- package/scripts/lib/ciclo-autonomo/config.js +165 -165
- package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -174
- package/scripts/lib/ciclo-autonomo/fallback.js +77 -77
- package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -139
- package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -112
- package/scripts/lib/ciclo-autonomo/index.js +301 -301
- package/scripts/lib/ciclo-autonomo/lock.js +124 -124
- package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -122
- package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -240
- package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -248
- package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -190
- package/scripts/lib/ciclo-autonomo/yaml-instintos.js +591 -535
- 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/evidencia-valor.js +228 -228
- package/scripts/lib/expandir-targets.js +71 -71
- 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 +204 -0
- 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/toml-merge.js +204 -204
- 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/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/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 +408 -403
- 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
- package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +0 -53
- package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +0 -372
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* limpiar-basura-global.js — Purga de directorios basura de una instalación
|
|
5
|
+
* global de swl-ses.
|
|
6
|
+
*
|
|
7
|
+
* Caso de origen (2026-07-15): un `install --global` crea `~/_userland`. Una
|
|
8
|
+
* versión previa de `swl-ses doctor` contaba ese `_userland` como marcador de
|
|
9
|
+
* "proyecto swl" (`esProyectoSwl`), así que correr `doctor` desde el HOME
|
|
10
|
+
* sembraba `~/.planning/` con marcadores scaffold (`# PROJECT\n\n(Generado por
|
|
11
|
+
* swl-ses doctor)`). Como el HOME no es un proyecto, ese `.planning/` es basura;
|
|
12
|
+
* peor, hooks que resolvían la raíz vía raiz-proyecto la capturaban y volcaban
|
|
13
|
+
* telemetría ahí. El fix de raiz-proyecto (frontera del HOME) corta la captura;
|
|
14
|
+
* este módulo purga el scaffold ya sembrado en el próximo install global.
|
|
15
|
+
*
|
|
16
|
+
* También purga un `~/_userland/` VACÍO: el contenedor de plugins userland que
|
|
17
|
+
* un install global dejaba en el HOME (subdirs agentes/habilidades/plugins/
|
|
18
|
+
* reglas con solo `.gitkeep`). El instalador actual no lo crea ahí, así que un
|
|
19
|
+
* `_userland` vacío en el HOME es scaffold huérfano.
|
|
20
|
+
*
|
|
21
|
+
* Conservador por diseño (invariantes de seguridad): SOLO elimina un `.planning/`
|
|
22
|
+
* cuyos marcadores llevan la huella del scaffold de doctor, y un `_userland/`
|
|
23
|
+
* SIN archivos reales. Un proyecto real o un `_userland` con plugins del usuario
|
|
24
|
+
* nunca se tocan.
|
|
25
|
+
*
|
|
26
|
+
* Zero-deps.
|
|
27
|
+
*
|
|
28
|
+
* @module scripts/lib/limpiar-basura-global
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
const fs = require('fs');
|
|
32
|
+
const os = require('os');
|
|
33
|
+
const path = require('path');
|
|
34
|
+
|
|
35
|
+
// Huella inequívoca del scaffold vacío que `swl-ses doctor` escribía en cada
|
|
36
|
+
// marcador (`# PROJECT\n\n(Generado por swl-ses doctor)\n`).
|
|
37
|
+
const HUELLA_SCAFFOLD_DOCTOR = '(Generado por swl-ses doctor)';
|
|
38
|
+
const MARCADORES = ['PROYECTO.md', 'REQUISITOS.md', 'HOJA-RUTA.md', 'ESTADO.md'];
|
|
39
|
+
|
|
40
|
+
// Archivos que NO cuentan como contenido real (placeholders de scaffold).
|
|
41
|
+
const ARCHIVOS_PLACEHOLDER = new Set(['.gitkeep', '.DS_Store', 'Thumbs.db']);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* ¿El `.planning/` de `dir` es el scaffold espurio de doctor (no un proyecto
|
|
45
|
+
* real)? Señal: existe al menos un marcador y TODOS los marcadores presentes
|
|
46
|
+
* llevan la huella del scaffold. Un proyecto real tiene marcadores con
|
|
47
|
+
* contenido propio → devuelve false y no se toca.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} dir - Directorio que contiene el `.planning/` a evaluar.
|
|
50
|
+
* @returns {boolean}
|
|
51
|
+
*/
|
|
52
|
+
function esPlanningEspurio(dir) {
|
|
53
|
+
const planning = path.join(dir, '.planning');
|
|
54
|
+
let esDir = false;
|
|
55
|
+
try {
|
|
56
|
+
esDir = fs.statSync(planning).isDirectory();
|
|
57
|
+
} catch (_) {
|
|
58
|
+
return false; // no existe
|
|
59
|
+
}
|
|
60
|
+
if (!esDir) return false;
|
|
61
|
+
|
|
62
|
+
const presentes = MARCADORES.filter(m => fs.existsSync(path.join(planning, m)));
|
|
63
|
+
if (presentes.length === 0) return false;
|
|
64
|
+
|
|
65
|
+
return presentes.every(m => {
|
|
66
|
+
try {
|
|
67
|
+
return fs.readFileSync(path.join(planning, m), 'utf8').includes(HUELLA_SCAFFOLD_DOCTOR);
|
|
68
|
+
} catch (_) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Cuenta archivos reales (no placeholders de scaffold) bajo `dir`, recursivo.
|
|
76
|
+
* @param {string} dir
|
|
77
|
+
* @returns {number}
|
|
78
|
+
*/
|
|
79
|
+
function contarArchivosReales(dir) {
|
|
80
|
+
let entradas;
|
|
81
|
+
try {
|
|
82
|
+
entradas = fs.readdirSync(dir, { withFileTypes: true });
|
|
83
|
+
} catch (_) {
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
let n = 0;
|
|
87
|
+
for (const e of entradas) {
|
|
88
|
+
if (e.isDirectory()) {
|
|
89
|
+
n += contarArchivosReales(path.join(dir, e.name));
|
|
90
|
+
} else if (!ARCHIVOS_PLACEHOLDER.has(e.name)) {
|
|
91
|
+
n += 1;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return n;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* ¿El `_userland/` de `dir` es un scaffold vacío (sin plugins reales del
|
|
99
|
+
* usuario)? Señal: existe y no contiene ningún archivo real (solo placeholders
|
|
100
|
+
* como `.gitkeep`). Un `_userland` con plugins del usuario → false, no se toca.
|
|
101
|
+
*
|
|
102
|
+
* @param {string} dir
|
|
103
|
+
* @returns {boolean}
|
|
104
|
+
*/
|
|
105
|
+
function esUserlandVacio(dir) {
|
|
106
|
+
const userland = path.join(dir, '_userland');
|
|
107
|
+
let esDir = false;
|
|
108
|
+
try {
|
|
109
|
+
esDir = fs.statSync(userland).isDirectory();
|
|
110
|
+
} catch (_) {
|
|
111
|
+
return false; // no existe
|
|
112
|
+
}
|
|
113
|
+
if (!esDir) return false;
|
|
114
|
+
return contarArchivosReales(userland) === 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* ¿El `.planning/` de `dir` contiene un PROYECTO real? Señal: al menos un
|
|
119
|
+
* marcador con contenido propio (ni vacío ni la huella del scaffold de doctor).
|
|
120
|
+
* Es el invariante de seguridad: distingue un proyecto legítimo (que se
|
|
121
|
+
* preserva) de basura (scaffold, backups del install, telemetría mal dirigida).
|
|
122
|
+
*
|
|
123
|
+
* @param {string} dir
|
|
124
|
+
* @returns {boolean}
|
|
125
|
+
*/
|
|
126
|
+
function planningTieneProyectoReal(dir) {
|
|
127
|
+
const planning = path.join(dir, '.planning');
|
|
128
|
+
return MARCADORES.some((m) => {
|
|
129
|
+
try {
|
|
130
|
+
const contenido = fs.readFileSync(path.join(planning, m), 'utf8');
|
|
131
|
+
return contenido.trim().length > 0 && !contenido.includes(HUELLA_SCAFFOLD_DOCTOR);
|
|
132
|
+
} catch (_) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* ¿El `.planning/` en el HOME es removible? Existe pero NO es un proyecto real.
|
|
140
|
+
* Cubre: scaffold de doctor (huella), backups del install (`backups/` sin
|
|
141
|
+
* marcadores), telemetría mal dirigida de hooks, o dir vacío. El HOME nunca es
|
|
142
|
+
* un proyecto de trabajo — un `.planning` ahí sin proyecto real es basura.
|
|
143
|
+
*
|
|
144
|
+
* @param {string} dir
|
|
145
|
+
* @returns {boolean}
|
|
146
|
+
*/
|
|
147
|
+
function esPlanningRemovibleEnHome(dir) {
|
|
148
|
+
const planning = path.join(dir, '.planning');
|
|
149
|
+
try {
|
|
150
|
+
if (!fs.statSync(planning).isDirectory()) return false;
|
|
151
|
+
} catch (_) {
|
|
152
|
+
return false; // no existe
|
|
153
|
+
}
|
|
154
|
+
return !planningTieneProyectoReal(dir);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Elimina los directorios basura de una instalación global en el HOME:
|
|
159
|
+
* - `.planning/` sin proyecto real (scaffold de doctor, backups del install,
|
|
160
|
+
* telemetría mal dirigida o vacío).
|
|
161
|
+
* - `_userland/` vacío (scaffold sin plugins del usuario).
|
|
162
|
+
* Idempotente: si no hay basura, no hace nada. Conservador: cada objetivo tiene
|
|
163
|
+
* su invariante de seguridad y NUNCA borra contenido real (proyecto o plugins).
|
|
164
|
+
* Un fallo de borrado en un objetivo no aborta los demás.
|
|
165
|
+
*
|
|
166
|
+
* @param {object} [opts]
|
|
167
|
+
* @param {string} [opts.home] - Raíz global a limpiar (default: os.homedir()).
|
|
168
|
+
* @param {boolean} [opts.dryRun=false] - No borra; solo reporta qué borraría.
|
|
169
|
+
* @returns {{eliminados: string[], dryRun: boolean}} Paths eliminados (o que se
|
|
170
|
+
* eliminarían en dryRun).
|
|
171
|
+
*/
|
|
172
|
+
function limpiarBasuraGlobal(opts = {}) {
|
|
173
|
+
const home = opts.home || os.homedir();
|
|
174
|
+
const dryRun = !!opts.dryRun;
|
|
175
|
+
const eliminados = [];
|
|
176
|
+
|
|
177
|
+
const objetivos = [
|
|
178
|
+
{ detectar: () => esPlanningRemovibleEnHome(home), ruta: path.join(home, '.planning') },
|
|
179
|
+
{ detectar: () => esUserlandVacio(home), ruta: path.join(home, '_userland') },
|
|
180
|
+
];
|
|
181
|
+
|
|
182
|
+
for (const obj of objetivos) {
|
|
183
|
+
if (!obj.detectar()) continue;
|
|
184
|
+
if (!dryRun) {
|
|
185
|
+
try {
|
|
186
|
+
fs.rmSync(obj.ruta, { recursive: true, force: true });
|
|
187
|
+
} catch (_) {
|
|
188
|
+
continue; // no se pudo borrar: no reportar como eliminado, seguir con el resto
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
eliminados.push(obj.ruta);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return { eliminados, dryRun };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
module.exports = {
|
|
198
|
+
limpiarBasuraGlobal,
|
|
199
|
+
esPlanningEspurio,
|
|
200
|
+
esPlanningRemovibleEnHome,
|
|
201
|
+
planningTieneProyectoReal,
|
|
202
|
+
esUserlandVacio,
|
|
203
|
+
HUELLA_SCAFFOLD_DOCTOR,
|
|
204
|
+
};
|
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* longmemeval-runner.js — Adapter que ejecuta queries del benchmark contra
|
|
5
|
-
* `hooks/lib/memory-search` y devuelve métricas.
|
|
6
|
-
*
|
|
7
|
-
* Patrón adoptado de `temp/agentmemory-main/benchmark/longmemeval-bench.ts`.
|
|
8
|
-
* Adaptado: en lugar de cargar haystack desde el dataset, usa el estado
|
|
9
|
-
* actual del proyecto SWL (APRENDIZAJES.md, sesiones, instintos).
|
|
10
|
-
*
|
|
11
|
-
* El dataset es un JSONL donde cada línea es:
|
|
12
|
-
* {
|
|
13
|
-
* "question_id": "q-001",
|
|
14
|
-
* "question": "texto libre de la query",
|
|
15
|
-
* "gold_ids": ["apr-N", "ses-YYYY-MM-DD-HHMM"],
|
|
16
|
-
* "category": "decision" | "patron" | "anti-patron" | "gotcha" | ...,
|
|
17
|
-
* "status": "real" | "placeholder"
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* @module scripts/lib/longmemeval-runner
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
const fs = require('fs');
|
|
24
|
-
const path = require('path');
|
|
25
|
-
|
|
26
|
-
const memorySearch = require('../../hooks/lib/memory-search');
|
|
27
|
-
const benchmarkMetrics = require('./benchmark-metrics');
|
|
28
|
-
|
|
29
|
-
// ── parser de dataset ─────────────────────────────────────────────────────────
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Parsea un archivo JSONL del dataset.
|
|
33
|
-
* @param {string} ruta
|
|
34
|
-
* @returns {object[]}
|
|
35
|
-
*/
|
|
36
|
-
function leerDataset(ruta) {
|
|
37
|
-
if (!fs.existsSync(ruta)) {
|
|
38
|
-
throw new Error(`Dataset no encontrado: ${ruta}`);
|
|
39
|
-
}
|
|
40
|
-
const contenido = fs.readFileSync(ruta, 'utf8');
|
|
41
|
-
const entries = [];
|
|
42
|
-
let lineNum = 0;
|
|
43
|
-
for (const linea of contenido.split('\n')) {
|
|
44
|
-
lineNum++;
|
|
45
|
-
if (!linea.trim()) continue;
|
|
46
|
-
if (linea.trim().startsWith('//')) continue; // comentarios
|
|
47
|
-
try {
|
|
48
|
-
entries.push(JSON.parse(linea));
|
|
49
|
-
} catch (err) {
|
|
50
|
-
throw new Error(`JSONL malformado en línea ${lineNum}: ${err.message}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return entries;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// ── ejecución de query individual ─────────────────────────────────────────────
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Ejecuta una query del benchmark contra memoria SWL y compara con gold.
|
|
60
|
-
*
|
|
61
|
-
* @param {string} baseDir - Raíz del proyecto.
|
|
62
|
-
* @param {object} entry - Una línea del dataset.
|
|
63
|
-
* @param {object} [opts]
|
|
64
|
-
* @param {number} [opts.limit=20] - Top-k a recuperar.
|
|
65
|
-
* @returns {object} Métricas + ids retrieved + entry original.
|
|
66
|
-
*/
|
|
67
|
-
function ejecutarEntry(baseDir, entry, opts = {}) {
|
|
68
|
-
const limit = opts.limit || 20;
|
|
69
|
-
const inicio = Date.now();
|
|
70
|
-
const resultados = memorySearch.search(baseDir, entry.question, { limit });
|
|
71
|
-
const latencyMs = Date.now() - inicio;
|
|
72
|
-
|
|
73
|
-
const retrievedIds = resultados.map(r => r.id);
|
|
74
|
-
const goldIds = Array.isArray(entry.gold_ids) ? entry.gold_ids : [];
|
|
75
|
-
const metricas = benchmarkMetrics.calcularMetricas(retrievedIds, goldIds);
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
question_id: entry.question_id || 'unknown',
|
|
79
|
-
question: entry.question,
|
|
80
|
-
category: entry.category || null,
|
|
81
|
-
status: entry.status || 'unknown',
|
|
82
|
-
retrievedIds,
|
|
83
|
-
goldIds,
|
|
84
|
-
metricas,
|
|
85
|
-
latencyMs,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Ejecuta el dataset completo y devuelve resultados + métricas agregadas.
|
|
91
|
-
*
|
|
92
|
-
* @param {string} baseDir
|
|
93
|
-
* @param {string} datasetPath
|
|
94
|
-
* @param {object} [opts]
|
|
95
|
-
* @returns {{ entries: object[], promedio: object, dataset: object }}
|
|
96
|
-
*/
|
|
97
|
-
function ejecutarDataset(baseDir, datasetPath, opts = {}) {
|
|
98
|
-
const entries = leerDataset(datasetPath);
|
|
99
|
-
const resultados = entries.map(e => ejecutarEntry(baseDir, e, opts));
|
|
100
|
-
const promedio = benchmarkMetrics.promediar(resultados.map(r => r.metricas));
|
|
101
|
-
|
|
102
|
-
// Estadísticas del dataset
|
|
103
|
-
const placeholderCount = entries.filter(e => e.status === 'placeholder').length;
|
|
104
|
-
const realCount = entries.filter(e => e.status === 'real').length;
|
|
105
|
-
const datasetMeta = {
|
|
106
|
-
total: entries.length,
|
|
107
|
-
real: realCount,
|
|
108
|
-
placeholder: placeholderCount,
|
|
109
|
-
significativo: realCount >= 30,
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
entries: resultados,
|
|
114
|
-
promedio,
|
|
115
|
-
dataset: datasetMeta,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// ── exports ───────────────────────────────────────────────────────────────────
|
|
120
|
-
|
|
121
|
-
module.exports = {
|
|
122
|
-
leerDataset,
|
|
123
|
-
ejecutarEntry,
|
|
124
|
-
ejecutarDataset,
|
|
125
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* longmemeval-runner.js — Adapter que ejecuta queries del benchmark contra
|
|
5
|
+
* `hooks/lib/memory-search` y devuelve métricas.
|
|
6
|
+
*
|
|
7
|
+
* Patrón adoptado de `temp/agentmemory-main/benchmark/longmemeval-bench.ts`.
|
|
8
|
+
* Adaptado: en lugar de cargar haystack desde el dataset, usa el estado
|
|
9
|
+
* actual del proyecto SWL (APRENDIZAJES.md, sesiones, instintos).
|
|
10
|
+
*
|
|
11
|
+
* El dataset es un JSONL donde cada línea es:
|
|
12
|
+
* {
|
|
13
|
+
* "question_id": "q-001",
|
|
14
|
+
* "question": "texto libre de la query",
|
|
15
|
+
* "gold_ids": ["apr-N", "ses-YYYY-MM-DD-HHMM"],
|
|
16
|
+
* "category": "decision" | "patron" | "anti-patron" | "gotcha" | ...,
|
|
17
|
+
* "status": "real" | "placeholder"
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* @module scripts/lib/longmemeval-runner
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const fs = require('fs');
|
|
24
|
+
const path = require('path');
|
|
25
|
+
|
|
26
|
+
const memorySearch = require('../../hooks/lib/memory-search');
|
|
27
|
+
const benchmarkMetrics = require('./benchmark-metrics');
|
|
28
|
+
|
|
29
|
+
// ── parser de dataset ─────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Parsea un archivo JSONL del dataset.
|
|
33
|
+
* @param {string} ruta
|
|
34
|
+
* @returns {object[]}
|
|
35
|
+
*/
|
|
36
|
+
function leerDataset(ruta) {
|
|
37
|
+
if (!fs.existsSync(ruta)) {
|
|
38
|
+
throw new Error(`Dataset no encontrado: ${ruta}`);
|
|
39
|
+
}
|
|
40
|
+
const contenido = fs.readFileSync(ruta, 'utf8');
|
|
41
|
+
const entries = [];
|
|
42
|
+
let lineNum = 0;
|
|
43
|
+
for (const linea of contenido.split('\n')) {
|
|
44
|
+
lineNum++;
|
|
45
|
+
if (!linea.trim()) continue;
|
|
46
|
+
if (linea.trim().startsWith('//')) continue; // comentarios
|
|
47
|
+
try {
|
|
48
|
+
entries.push(JSON.parse(linea));
|
|
49
|
+
} catch (err) {
|
|
50
|
+
throw new Error(`JSONL malformado en línea ${lineNum}: ${err.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ── ejecución de query individual ─────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Ejecuta una query del benchmark contra memoria SWL y compara con gold.
|
|
60
|
+
*
|
|
61
|
+
* @param {string} baseDir - Raíz del proyecto.
|
|
62
|
+
* @param {object} entry - Una línea del dataset.
|
|
63
|
+
* @param {object} [opts]
|
|
64
|
+
* @param {number} [opts.limit=20] - Top-k a recuperar.
|
|
65
|
+
* @returns {object} Métricas + ids retrieved + entry original.
|
|
66
|
+
*/
|
|
67
|
+
function ejecutarEntry(baseDir, entry, opts = {}) {
|
|
68
|
+
const limit = opts.limit || 20;
|
|
69
|
+
const inicio = Date.now();
|
|
70
|
+
const resultados = memorySearch.search(baseDir, entry.question, { limit });
|
|
71
|
+
const latencyMs = Date.now() - inicio;
|
|
72
|
+
|
|
73
|
+
const retrievedIds = resultados.map(r => r.id);
|
|
74
|
+
const goldIds = Array.isArray(entry.gold_ids) ? entry.gold_ids : [];
|
|
75
|
+
const metricas = benchmarkMetrics.calcularMetricas(retrievedIds, goldIds);
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
question_id: entry.question_id || 'unknown',
|
|
79
|
+
question: entry.question,
|
|
80
|
+
category: entry.category || null,
|
|
81
|
+
status: entry.status || 'unknown',
|
|
82
|
+
retrievedIds,
|
|
83
|
+
goldIds,
|
|
84
|
+
metricas,
|
|
85
|
+
latencyMs,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Ejecuta el dataset completo y devuelve resultados + métricas agregadas.
|
|
91
|
+
*
|
|
92
|
+
* @param {string} baseDir
|
|
93
|
+
* @param {string} datasetPath
|
|
94
|
+
* @param {object} [opts]
|
|
95
|
+
* @returns {{ entries: object[], promedio: object, dataset: object }}
|
|
96
|
+
*/
|
|
97
|
+
function ejecutarDataset(baseDir, datasetPath, opts = {}) {
|
|
98
|
+
const entries = leerDataset(datasetPath);
|
|
99
|
+
const resultados = entries.map(e => ejecutarEntry(baseDir, e, opts));
|
|
100
|
+
const promedio = benchmarkMetrics.promediar(resultados.map(r => r.metricas));
|
|
101
|
+
|
|
102
|
+
// Estadísticas del dataset
|
|
103
|
+
const placeholderCount = entries.filter(e => e.status === 'placeholder').length;
|
|
104
|
+
const realCount = entries.filter(e => e.status === 'real').length;
|
|
105
|
+
const datasetMeta = {
|
|
106
|
+
total: entries.length,
|
|
107
|
+
real: realCount,
|
|
108
|
+
placeholder: placeholderCount,
|
|
109
|
+
significativo: realCount >= 30,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
entries: resultados,
|
|
114
|
+
promedio,
|
|
115
|
+
dataset: datasetMeta,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ── exports ───────────────────────────────────────────────────────────────────
|
|
120
|
+
|
|
121
|
+
module.exports = {
|
|
122
|
+
leerDataset,
|
|
123
|
+
ejecutarEntry,
|
|
124
|
+
ejecutarDataset,
|
|
125
|
+
};
|