@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,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* clasificar-directorio.js — Clasifica un directorio de trabajo para que el
|
|
5
|
+
* instalador y `doctor` decidan si deben anclar `.planning/` ahí.
|
|
6
|
+
*
|
|
7
|
+
* Bug de origen (2026-07-15): instalador/doctor trataban `process.cwd()` como
|
|
8
|
+
* proyecto sin distinguir el HOME del usuario (ubicación de una instalación
|
|
9
|
+
* GLOBAL, NO un proyecto) de un proyecto de desarrollo real. Correr
|
|
10
|
+
* `install --global` o `doctor` desde el HOME sembraba `~/.planning/`
|
|
11
|
+
* (backups del install, scaffold de marcadores, telemetría mal dirigida).
|
|
12
|
+
*
|
|
13
|
+
* Categorías:
|
|
14
|
+
* - 'home' : cwd === os.homedir(). Ubicación de install global; NUNCA un proyecto.
|
|
15
|
+
* - 'proyecto' : proyecto de desarrollo real (.git, stack detectado, o `.planning/`
|
|
16
|
+
* con marcadores de proyecto).
|
|
17
|
+
* - 'nuevo' : directorio vacío o casi vacío (candidato a inicializar un proyecto).
|
|
18
|
+
* - 'otro' : con contenido pero sin señales de proyecto (no scaffoldear a ciegas).
|
|
19
|
+
*
|
|
20
|
+
* Uso interno del instalador/doctor (no viaja a destinos): puede requerir otras
|
|
21
|
+
* libs de `scripts/lib` y `hooks/lib`. Zero-deps npm.
|
|
22
|
+
*
|
|
23
|
+
* @module scripts/lib/clasificar-directorio
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const fs = require('fs');
|
|
27
|
+
const os = require('os');
|
|
28
|
+
const path = require('path');
|
|
29
|
+
const { detectarStack } = require('./detectar-stack');
|
|
30
|
+
const { tienePlanningReal } = require('../../hooks/lib/raiz-proyecto');
|
|
31
|
+
|
|
32
|
+
// Entradas que NO cuentan como "contenido" al decidir si un dir está vacío
|
|
33
|
+
// (metadatos del SO / control de versiones que pueden existir en un dir "nuevo").
|
|
34
|
+
const IGNORAR_AL_MEDIR_VACIO = new Set(['.git', '.DS_Store', 'Thumbs.db', 'desktop.ini']);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* ¿El directorio es el HOME del usuario? (comparación canónica por realpath
|
|
38
|
+
* para tolerar el nombre corto 8.3 de Windows — misma razón que raiz-proyecto).
|
|
39
|
+
* @param {string} dir
|
|
40
|
+
* @returns {boolean}
|
|
41
|
+
*/
|
|
42
|
+
function esHome(dir) {
|
|
43
|
+
const canon = (p) => { try { return fs.realpathSync.native(p); } catch (_) { return path.resolve(p); } };
|
|
44
|
+
return canon(dir) === canon(os.homedir());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* ¿El directorio es un proyecto de desarrollo real? Señal: repo git, stack de
|
|
49
|
+
* lenguaje detectado, o `.planning/` con marcadores de proyecto.
|
|
50
|
+
* @param {string} dir
|
|
51
|
+
* @returns {boolean}
|
|
52
|
+
*/
|
|
53
|
+
function esProyectoDesarrollo(dir) {
|
|
54
|
+
try {
|
|
55
|
+
if (fs.existsSync(path.join(dir, '.git'))) return true;
|
|
56
|
+
} catch (_) { /* seguir */ }
|
|
57
|
+
if (tienePlanningReal(dir)) return true;
|
|
58
|
+
try {
|
|
59
|
+
if (detectarStack(dir).size > 0) return true;
|
|
60
|
+
} catch (_) { /* seguir */ }
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* ¿El directorio está vacío o casi vacío (solo metadatos del SO/git)?
|
|
66
|
+
* @param {string} dir
|
|
67
|
+
* @returns {boolean}
|
|
68
|
+
*/
|
|
69
|
+
function estaVacio(dir) {
|
|
70
|
+
let entradas;
|
|
71
|
+
try {
|
|
72
|
+
entradas = fs.readdirSync(dir);
|
|
73
|
+
} catch (_) {
|
|
74
|
+
return false; // no legible → no lo tratamos como vacío
|
|
75
|
+
}
|
|
76
|
+
return entradas.filter((e) => !IGNORAR_AL_MEDIR_VACIO.has(e)).length === 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Clasifica el directorio de trabajo.
|
|
81
|
+
* @param {string} [cwd] - Directorio (default: process.cwd()).
|
|
82
|
+
* @returns {'home'|'proyecto'|'nuevo'|'otro'}
|
|
83
|
+
*/
|
|
84
|
+
function clasificarDirectorio(cwd) {
|
|
85
|
+
const dir = path.resolve(cwd || process.cwd());
|
|
86
|
+
if (esHome(dir)) return 'home';
|
|
87
|
+
if (esProyectoDesarrollo(dir)) return 'proyecto';
|
|
88
|
+
if (estaVacio(dir)) return 'nuevo';
|
|
89
|
+
return 'otro';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
module.exports = { clasificarDirectorio, esHome, esProyectoDesarrollo, estaVacio };
|
|
@@ -1,217 +1,217 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* contadores-inventario.js
|
|
5
|
-
*
|
|
6
|
-
* Funciones puras zero-deps para validar consistencia entre los contadores
|
|
7
|
-
* de inventario (agentes, skills, comandos, hooks, reglas) declarados en
|
|
8
|
-
* `INVENTARIO.md` (fuente de verdad regenerada por
|
|
9
|
-
* `scripts/generar-inventario.js`) y los contadores citados en los demás
|
|
10
|
-
* documentos canónicos del repositorio.
|
|
11
|
-
*
|
|
12
|
-
* Motivado por el drift recurrente detectado el 2026-04-29: MAPEO_SKILLS_AGENTES.md
|
|
13
|
-
* decía "153 skills" cuando la realidad eran 150; COMPACTACION.md reportaba
|
|
14
|
-
* "147 skills, 40 comandos, 31 hooks". El hook `verificar-release.js` valida
|
|
15
|
-
* versión pero no contadores. Este módulo cierra ese hueco.
|
|
16
|
-
*
|
|
17
|
-
* Cobertura intencional:
|
|
18
|
-
* - Patrón resumen "X agentes, Y skills, Z comandos, W reglas, V hooks"
|
|
19
|
-
* (separadores `,` o `+` o `y`) — valida los 5 números a la vez.
|
|
20
|
-
* - Patrón "X agentes + Y habilidades + Z comandos + W reglas + V hooks"
|
|
21
|
-
* común en tablas de perfiles `completo`.
|
|
22
|
-
* - Patrón "Total de agentes: X" / "Total de skills: X" en MAPEO.
|
|
23
|
-
*
|
|
24
|
-
* Cobertura intencionalmente excluida (falsos positivos clásicos):
|
|
25
|
-
* - "los 17 skills de Anthropic" (skills externos)
|
|
26
|
-
* - "8 lenguajes × 5 reglas" (multiplicación)
|
|
27
|
-
* - perfiles parciales "2 hooks", "6 hooks" (no son totales)
|
|
28
|
-
* - notas históricas "estimé 28 hooks visualmente y propagué el error"
|
|
29
|
-
* - referencias a versiones pasadas en MAPEO ("136 skills tras release X")
|
|
30
|
-
* - filas de tabla histórica con SemVer + fecha ("| 5.4.0 | 2026-04-10 | 57 agentes...")
|
|
31
|
-
*
|
|
32
|
-
* Estas se ignoran porque el patrón resumen es el único que tiene los 5
|
|
33
|
-
* componentes alineados; las menciones aisladas de un solo número se dejan
|
|
34
|
-
* para una auditoría aparte (no bloqueante).
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
const COMPONENTES = ['agentes', 'skills', 'comandos', 'hooks', 'reglas'];
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Parsea la sección "## Resumen" de INVENTARIO.md y retorna un mapa con
|
|
41
|
-
* los contadores reales del sistema.
|
|
42
|
-
*
|
|
43
|
-
* Espera tabla del tipo:
|
|
44
|
-
* ## Resumen
|
|
45
|
-
* | Componente | Cantidad |
|
|
46
|
-
* |-----------|----------|
|
|
47
|
-
* | Agentes SWL | 59 |
|
|
48
|
-
* | Habilidades | 150 |
|
|
49
|
-
* | Comandos | 41 |
|
|
50
|
-
* | Reglas base | 20 |
|
|
51
|
-
* | Reglas por lenguaje | 40 |
|
|
52
|
-
* | Hooks | 36 |
|
|
53
|
-
*
|
|
54
|
-
* Retorna `{ agentes, skills, comandos, hooks, reglas }`.
|
|
55
|
-
* `skills` y `habilidades` se mapean al mismo número.
|
|
56
|
-
* `reglas` = base + por_lenguaje.
|
|
57
|
-
*/
|
|
58
|
-
function parsearInventario(rawMd) {
|
|
59
|
-
const lineas = rawMd.split(/\r?\n/);
|
|
60
|
-
const resumen = {};
|
|
61
|
-
let enResumen = false;
|
|
62
|
-
for (const linea of lineas) {
|
|
63
|
-
if (/^##\s+Resumen\s*$/.test(linea)) { enResumen = true; continue; }
|
|
64
|
-
if (enResumen && /^##\s+/.test(linea)) break;
|
|
65
|
-
if (!enResumen) continue;
|
|
66
|
-
const m = linea.match(/^\|\s*([^|]+?)\s*\|\s*(\d+)\s*\|/);
|
|
67
|
-
if (m) resumen[m[1].trim()] = parseInt(m[2], 10);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const reglasBase = resumen['Reglas base'] || 0;
|
|
71
|
-
const reglasLeng = resumen['Reglas por lenguaje'] || 0;
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
agentes: resumen['Agentes SWL'] || 0,
|
|
75
|
-
skills: resumen['Habilidades'] || 0,
|
|
76
|
-
comandos: resumen['Comandos'] || 0,
|
|
77
|
-
hooks: resumen['Hooks'] || 0,
|
|
78
|
-
reglas: reglasBase + reglasLeng,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Detecta el patrón resumen en una línea y retorna los números encontrados.
|
|
84
|
-
* Soporta separadores `,`, `+` y `y`. Tolera el orden canónico
|
|
85
|
-
* agentes → skills/habilidades → comandos → reglas → hooks.
|
|
86
|
-
*
|
|
87
|
-
* Ejemplos que matchean:
|
|
88
|
-
* "59 agentes, 150 skills, 41 comandos, 60 reglas, 36 hooks"
|
|
89
|
-
* "59 agentes + 150 habilidades + 41 comandos + 60 reglas + 36 hooks"
|
|
90
|
-
* "59 agentes, 150 skills, 41 comandos, 60 reglas y 36 hooks"
|
|
91
|
-
* "Frontmatter: 59 agentes + 150 skills + 41 comandos verificados"
|
|
92
|
-
* (los 3 primeros se validan; los 2 últimos faltan → no full match,
|
|
93
|
-
* se devuelve match parcial con flags)
|
|
94
|
-
*
|
|
95
|
-
* Retorna `null` si no encuentra al menos `agentes` y un segundo componente.
|
|
96
|
-
*/
|
|
97
|
-
function extraerResumenDeLinea(linea) {
|
|
98
|
-
// Patrón principal: 5 componentes en orden
|
|
99
|
-
const re5 = /(\d{1,4})\s+agentes?[\s,+y]+\s*(\d{1,4})\s+(?:skills|habilidades)[\s,+y]+\s*(\d{1,4})\s+comandos[\s,+y]+\s*(\d{1,4})\s+reglas[\s,+y]+\s*(\d{1,4})\s+hooks/i;
|
|
100
|
-
const m5 = linea.match(re5);
|
|
101
|
-
if (m5) {
|
|
102
|
-
return {
|
|
103
|
-
tipo: 'resumen5',
|
|
104
|
-
texto: m5[0],
|
|
105
|
-
agentes: parseInt(m5[1], 10),
|
|
106
|
-
skills: parseInt(m5[2], 10),
|
|
107
|
-
comandos: parseInt(m5[3], 10),
|
|
108
|
-
reglas: parseInt(m5[4], 10),
|
|
109
|
-
hooks: parseInt(m5[5], 10),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Patrón parcial: 3 componentes (agentes, skills/habilidades, comandos)
|
|
114
|
-
const re3 = /(\d{1,4})\s+agentes?[\s,+y]+\s*(\d{1,4})\s+(?:skills|habilidades)[\s,+y]+\s*(\d{1,4})\s+comandos/i;
|
|
115
|
-
const m3 = linea.match(re3);
|
|
116
|
-
if (m3) {
|
|
117
|
-
return {
|
|
118
|
-
tipo: 'resumen3',
|
|
119
|
-
texto: m3[0],
|
|
120
|
-
agentes: parseInt(m3[1], 10),
|
|
121
|
-
skills: parseInt(m3[2], 10),
|
|
122
|
-
comandos: parseInt(m3[3], 10),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Decide si una línea debe ignorarse por ser obviamente histórica
|
|
131
|
-
* (fila de changelog/timeline con versión SemVer + fecha en formato tabla).
|
|
132
|
-
*/
|
|
133
|
-
function esLineaHistorica(linea) {
|
|
134
|
-
// Tabla con versión SemVer + fecha ISO: "| 5.4.0 | 2026-04-10 | ..."
|
|
135
|
-
if (/^\s*\|\s*\d+\.\d+\.\d+\s*\|\s*\d{4}-\d{2}-\d{2}/.test(linea)) return true;
|
|
136
|
-
// "Baseline:" suele ser nota histórica
|
|
137
|
-
if (/\bBaseline\s*:/i.test(linea)) return true;
|
|
138
|
-
// "antes de v|previa a|tras release N" sugiere historia
|
|
139
|
-
if (/\b(?:antes de v|previa a|tras release|en v\d+\.\d+)\b/i.test(linea)) return true;
|
|
140
|
-
// Línea entre comillas dobles (cita textual de un patrón documentado): "22 hooks"
|
|
141
|
-
if (/"\s*\d+\s+(?:agentes|skills|habilidades|comandos|hooks|reglas)\s*"/i.test(linea)) return true;
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Valida un archivo contra los contadores reales.
|
|
147
|
-
* Solo flagea las líneas que contienen patrón resumen identificable.
|
|
148
|
-
*
|
|
149
|
-
* Retorna { ok, lineas_revisadas, discrepancias: [{linea, encontrado, esperado, tipo, contexto}] }
|
|
150
|
-
*/
|
|
151
|
-
function validarArchivo(rawMd, contadoresReales) {
|
|
152
|
-
const lineas = rawMd.split(/\r?\n/);
|
|
153
|
-
const discrepancias = [];
|
|
154
|
-
let lineasRevisadas = 0;
|
|
155
|
-
|
|
156
|
-
for (let i = 0; i < lineas.length; i++) {
|
|
157
|
-
if (esLineaHistorica(lineas[i])) continue;
|
|
158
|
-
const r = extraerResumenDeLinea(lineas[i]);
|
|
159
|
-
if (!r) continue;
|
|
160
|
-
lineasRevisadas++;
|
|
161
|
-
|
|
162
|
-
const campos = r.tipo === 'resumen5'
|
|
163
|
-
? COMPONENTES
|
|
164
|
-
: ['agentes', 'skills', 'comandos'];
|
|
165
|
-
|
|
166
|
-
for (const campo of campos) {
|
|
167
|
-
if (r[campo] !== contadoresReales[campo]) {
|
|
168
|
-
discrepancias.push({
|
|
169
|
-
linea: i + 1,
|
|
170
|
-
campo,
|
|
171
|
-
encontrado: r[campo],
|
|
172
|
-
esperado: contadoresReales[campo],
|
|
173
|
-
tipo: r.tipo,
|
|
174
|
-
contexto: lineas[i].trim().slice(0, 110),
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Patrón nominal: "**Total de agentes**: N", "**Total de skills**: N"
|
|
181
|
-
const reTotal = /\*?\*?Total\s+de\s+(agentes|skills|habilidades|comandos|hooks|reglas)\*?\*?\s*:\s*(\d{1,4})/gi;
|
|
182
|
-
for (let i = 0; i < lineas.length; i++) {
|
|
183
|
-
if (esLineaHistorica(lineas[i])) continue;
|
|
184
|
-
let m;
|
|
185
|
-
reTotal.lastIndex = 0;
|
|
186
|
-
while ((m = reTotal.exec(lineas[i])) !== null) {
|
|
187
|
-
const palabra = m[1].toLowerCase();
|
|
188
|
-
const campo = palabra === 'habilidades' ? 'skills' : palabra;
|
|
189
|
-
const num = parseInt(m[2], 10);
|
|
190
|
-
lineasRevisadas++;
|
|
191
|
-
if (num !== contadoresReales[campo]) {
|
|
192
|
-
discrepancias.push({
|
|
193
|
-
linea: i + 1,
|
|
194
|
-
campo,
|
|
195
|
-
encontrado: num,
|
|
196
|
-
esperado: contadoresReales[campo],
|
|
197
|
-
tipo: 'total_nominal',
|
|
198
|
-
contexto: lineas[i].trim().slice(0, 110),
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
return {
|
|
205
|
-
ok: discrepancias.length === 0,
|
|
206
|
-
lineas_revisadas: lineasRevisadas,
|
|
207
|
-
discrepancias,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
module.exports = {
|
|
212
|
-
COMPONENTES,
|
|
213
|
-
parsearInventario,
|
|
214
|
-
extraerResumenDeLinea,
|
|
215
|
-
esLineaHistorica,
|
|
216
|
-
validarArchivo,
|
|
217
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* contadores-inventario.js
|
|
5
|
+
*
|
|
6
|
+
* Funciones puras zero-deps para validar consistencia entre los contadores
|
|
7
|
+
* de inventario (agentes, skills, comandos, hooks, reglas) declarados en
|
|
8
|
+
* `INVENTARIO.md` (fuente de verdad regenerada por
|
|
9
|
+
* `scripts/generar-inventario.js`) y los contadores citados en los demás
|
|
10
|
+
* documentos canónicos del repositorio.
|
|
11
|
+
*
|
|
12
|
+
* Motivado por el drift recurrente detectado el 2026-04-29: MAPEO_SKILLS_AGENTES.md
|
|
13
|
+
* decía "153 skills" cuando la realidad eran 150; COMPACTACION.md reportaba
|
|
14
|
+
* "147 skills, 40 comandos, 31 hooks". El hook `verificar-release.js` valida
|
|
15
|
+
* versión pero no contadores. Este módulo cierra ese hueco.
|
|
16
|
+
*
|
|
17
|
+
* Cobertura intencional:
|
|
18
|
+
* - Patrón resumen "X agentes, Y skills, Z comandos, W reglas, V hooks"
|
|
19
|
+
* (separadores `,` o `+` o `y`) — valida los 5 números a la vez.
|
|
20
|
+
* - Patrón "X agentes + Y habilidades + Z comandos + W reglas + V hooks"
|
|
21
|
+
* común en tablas de perfiles `completo`.
|
|
22
|
+
* - Patrón "Total de agentes: X" / "Total de skills: X" en MAPEO.
|
|
23
|
+
*
|
|
24
|
+
* Cobertura intencionalmente excluida (falsos positivos clásicos):
|
|
25
|
+
* - "los 17 skills de Anthropic" (skills externos)
|
|
26
|
+
* - "8 lenguajes × 5 reglas" (multiplicación)
|
|
27
|
+
* - perfiles parciales "2 hooks", "6 hooks" (no son totales)
|
|
28
|
+
* - notas históricas "estimé 28 hooks visualmente y propagué el error"
|
|
29
|
+
* - referencias a versiones pasadas en MAPEO ("136 skills tras release X")
|
|
30
|
+
* - filas de tabla histórica con SemVer + fecha ("| 5.4.0 | 2026-04-10 | 57 agentes...")
|
|
31
|
+
*
|
|
32
|
+
* Estas se ignoran porque el patrón resumen es el único que tiene los 5
|
|
33
|
+
* componentes alineados; las menciones aisladas de un solo número se dejan
|
|
34
|
+
* para una auditoría aparte (no bloqueante).
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
const COMPONENTES = ['agentes', 'skills', 'comandos', 'hooks', 'reglas'];
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Parsea la sección "## Resumen" de INVENTARIO.md y retorna un mapa con
|
|
41
|
+
* los contadores reales del sistema.
|
|
42
|
+
*
|
|
43
|
+
* Espera tabla del tipo:
|
|
44
|
+
* ## Resumen
|
|
45
|
+
* | Componente | Cantidad |
|
|
46
|
+
* |-----------|----------|
|
|
47
|
+
* | Agentes SWL | 59 |
|
|
48
|
+
* | Habilidades | 150 |
|
|
49
|
+
* | Comandos | 41 |
|
|
50
|
+
* | Reglas base | 20 |
|
|
51
|
+
* | Reglas por lenguaje | 40 |
|
|
52
|
+
* | Hooks | 36 |
|
|
53
|
+
*
|
|
54
|
+
* Retorna `{ agentes, skills, comandos, hooks, reglas }`.
|
|
55
|
+
* `skills` y `habilidades` se mapean al mismo número.
|
|
56
|
+
* `reglas` = base + por_lenguaje.
|
|
57
|
+
*/
|
|
58
|
+
function parsearInventario(rawMd) {
|
|
59
|
+
const lineas = rawMd.split(/\r?\n/);
|
|
60
|
+
const resumen = {};
|
|
61
|
+
let enResumen = false;
|
|
62
|
+
for (const linea of lineas) {
|
|
63
|
+
if (/^##\s+Resumen\s*$/.test(linea)) { enResumen = true; continue; }
|
|
64
|
+
if (enResumen && /^##\s+/.test(linea)) break;
|
|
65
|
+
if (!enResumen) continue;
|
|
66
|
+
const m = linea.match(/^\|\s*([^|]+?)\s*\|\s*(\d+)\s*\|/);
|
|
67
|
+
if (m) resumen[m[1].trim()] = parseInt(m[2], 10);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const reglasBase = resumen['Reglas base'] || 0;
|
|
71
|
+
const reglasLeng = resumen['Reglas por lenguaje'] || 0;
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
agentes: resumen['Agentes SWL'] || 0,
|
|
75
|
+
skills: resumen['Habilidades'] || 0,
|
|
76
|
+
comandos: resumen['Comandos'] || 0,
|
|
77
|
+
hooks: resumen['Hooks'] || 0,
|
|
78
|
+
reglas: reglasBase + reglasLeng,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Detecta el patrón resumen en una línea y retorna los números encontrados.
|
|
84
|
+
* Soporta separadores `,`, `+` y `y`. Tolera el orden canónico
|
|
85
|
+
* agentes → skills/habilidades → comandos → reglas → hooks.
|
|
86
|
+
*
|
|
87
|
+
* Ejemplos que matchean:
|
|
88
|
+
* "59 agentes, 150 skills, 41 comandos, 60 reglas, 36 hooks"
|
|
89
|
+
* "59 agentes + 150 habilidades + 41 comandos + 60 reglas + 36 hooks"
|
|
90
|
+
* "59 agentes, 150 skills, 41 comandos, 60 reglas y 36 hooks"
|
|
91
|
+
* "Frontmatter: 59 agentes + 150 skills + 41 comandos verificados"
|
|
92
|
+
* (los 3 primeros se validan; los 2 últimos faltan → no full match,
|
|
93
|
+
* se devuelve match parcial con flags)
|
|
94
|
+
*
|
|
95
|
+
* Retorna `null` si no encuentra al menos `agentes` y un segundo componente.
|
|
96
|
+
*/
|
|
97
|
+
function extraerResumenDeLinea(linea) {
|
|
98
|
+
// Patrón principal: 5 componentes en orden
|
|
99
|
+
const re5 = /(\d{1,4})\s+agentes?[\s,+y]+\s*(\d{1,4})\s+(?:skills|habilidades)[\s,+y]+\s*(\d{1,4})\s+comandos[\s,+y]+\s*(\d{1,4})\s+reglas[\s,+y]+\s*(\d{1,4})\s+hooks/i;
|
|
100
|
+
const m5 = linea.match(re5);
|
|
101
|
+
if (m5) {
|
|
102
|
+
return {
|
|
103
|
+
tipo: 'resumen5',
|
|
104
|
+
texto: m5[0],
|
|
105
|
+
agentes: parseInt(m5[1], 10),
|
|
106
|
+
skills: parseInt(m5[2], 10),
|
|
107
|
+
comandos: parseInt(m5[3], 10),
|
|
108
|
+
reglas: parseInt(m5[4], 10),
|
|
109
|
+
hooks: parseInt(m5[5], 10),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Patrón parcial: 3 componentes (agentes, skills/habilidades, comandos)
|
|
114
|
+
const re3 = /(\d{1,4})\s+agentes?[\s,+y]+\s*(\d{1,4})\s+(?:skills|habilidades)[\s,+y]+\s*(\d{1,4})\s+comandos/i;
|
|
115
|
+
const m3 = linea.match(re3);
|
|
116
|
+
if (m3) {
|
|
117
|
+
return {
|
|
118
|
+
tipo: 'resumen3',
|
|
119
|
+
texto: m3[0],
|
|
120
|
+
agentes: parseInt(m3[1], 10),
|
|
121
|
+
skills: parseInt(m3[2], 10),
|
|
122
|
+
comandos: parseInt(m3[3], 10),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Decide si una línea debe ignorarse por ser obviamente histórica
|
|
131
|
+
* (fila de changelog/timeline con versión SemVer + fecha en formato tabla).
|
|
132
|
+
*/
|
|
133
|
+
function esLineaHistorica(linea) {
|
|
134
|
+
// Tabla con versión SemVer + fecha ISO: "| 5.4.0 | 2026-04-10 | ..."
|
|
135
|
+
if (/^\s*\|\s*\d+\.\d+\.\d+\s*\|\s*\d{4}-\d{2}-\d{2}/.test(linea)) return true;
|
|
136
|
+
// "Baseline:" suele ser nota histórica
|
|
137
|
+
if (/\bBaseline\s*:/i.test(linea)) return true;
|
|
138
|
+
// "antes de v|previa a|tras release N" sugiere historia
|
|
139
|
+
if (/\b(?:antes de v|previa a|tras release|en v\d+\.\d+)\b/i.test(linea)) return true;
|
|
140
|
+
// Línea entre comillas dobles (cita textual de un patrón documentado): "22 hooks"
|
|
141
|
+
if (/"\s*\d+\s+(?:agentes|skills|habilidades|comandos|hooks|reglas)\s*"/i.test(linea)) return true;
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Valida un archivo contra los contadores reales.
|
|
147
|
+
* Solo flagea las líneas que contienen patrón resumen identificable.
|
|
148
|
+
*
|
|
149
|
+
* Retorna { ok, lineas_revisadas, discrepancias: [{linea, encontrado, esperado, tipo, contexto}] }
|
|
150
|
+
*/
|
|
151
|
+
function validarArchivo(rawMd, contadoresReales) {
|
|
152
|
+
const lineas = rawMd.split(/\r?\n/);
|
|
153
|
+
const discrepancias = [];
|
|
154
|
+
let lineasRevisadas = 0;
|
|
155
|
+
|
|
156
|
+
for (let i = 0; i < lineas.length; i++) {
|
|
157
|
+
if (esLineaHistorica(lineas[i])) continue;
|
|
158
|
+
const r = extraerResumenDeLinea(lineas[i]);
|
|
159
|
+
if (!r) continue;
|
|
160
|
+
lineasRevisadas++;
|
|
161
|
+
|
|
162
|
+
const campos = r.tipo === 'resumen5'
|
|
163
|
+
? COMPONENTES
|
|
164
|
+
: ['agentes', 'skills', 'comandos'];
|
|
165
|
+
|
|
166
|
+
for (const campo of campos) {
|
|
167
|
+
if (r[campo] !== contadoresReales[campo]) {
|
|
168
|
+
discrepancias.push({
|
|
169
|
+
linea: i + 1,
|
|
170
|
+
campo,
|
|
171
|
+
encontrado: r[campo],
|
|
172
|
+
esperado: contadoresReales[campo],
|
|
173
|
+
tipo: r.tipo,
|
|
174
|
+
contexto: lineas[i].trim().slice(0, 110),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Patrón nominal: "**Total de agentes**: N", "**Total de skills**: N"
|
|
181
|
+
const reTotal = /\*?\*?Total\s+de\s+(agentes|skills|habilidades|comandos|hooks|reglas)\*?\*?\s*:\s*(\d{1,4})/gi;
|
|
182
|
+
for (let i = 0; i < lineas.length; i++) {
|
|
183
|
+
if (esLineaHistorica(lineas[i])) continue;
|
|
184
|
+
let m;
|
|
185
|
+
reTotal.lastIndex = 0;
|
|
186
|
+
while ((m = reTotal.exec(lineas[i])) !== null) {
|
|
187
|
+
const palabra = m[1].toLowerCase();
|
|
188
|
+
const campo = palabra === 'habilidades' ? 'skills' : palabra;
|
|
189
|
+
const num = parseInt(m[2], 10);
|
|
190
|
+
lineasRevisadas++;
|
|
191
|
+
if (num !== contadoresReales[campo]) {
|
|
192
|
+
discrepancias.push({
|
|
193
|
+
linea: i + 1,
|
|
194
|
+
campo,
|
|
195
|
+
encontrado: num,
|
|
196
|
+
esperado: contadoresReales[campo],
|
|
197
|
+
tipo: 'total_nominal',
|
|
198
|
+
contexto: lineas[i].trim().slice(0, 110),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
ok: discrepancias.length === 0,
|
|
206
|
+
lineas_revisadas: lineasRevisadas,
|
|
207
|
+
discrepancias,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
module.exports = {
|
|
212
|
+
COMPONENTES,
|
|
213
|
+
parsearInventario,
|
|
214
|
+
extraerResumenDeLinea,
|
|
215
|
+
esLineaHistorica,
|
|
216
|
+
validarArchivo,
|
|
217
|
+
};
|