@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
|
@@ -1,193 +1,193 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Gateway Notify — Helper para encolar notificaciones al gateway multi-plataforma.
|
|
5
|
-
*
|
|
6
|
-
* Escribe un archivo JSON en .planning/comms/ que el GatewayRunner consume
|
|
7
|
-
* mediante polling (ver gateway/index.js _pollComms). Zero-deps, escritura
|
|
8
|
-
* atómica, opt-in por configuración en manifiestos/gateway-config.json.
|
|
9
|
-
*
|
|
10
|
-
* Uso:
|
|
11
|
-
* const { notificarGateway } = require('./lib/gateway-notify');
|
|
12
|
-
* notificarGateway({ tipo: 'session-stop', titulo: 'Sesión terminada', texto: '...' });
|
|
13
|
-
*
|
|
14
|
-
* No bloquea ni lanza: si el gateway está deshabilitado o no hay comms dir,
|
|
15
|
-
* retorna silenciosamente.
|
|
16
|
-
*
|
|
17
|
-
* @module hooks/lib/gateway-notify
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
const fs = require('fs');
|
|
21
|
-
const { raizProyecto } = require('./raiz-proyecto');
|
|
22
|
-
const path = require('path');
|
|
23
|
-
const { atomicWriteJSON } = require('./atomic-write');
|
|
24
|
-
|
|
25
|
-
// Deep links opt-in (ADR-0029). Si el módulo no carga (instalación incompleta),
|
|
26
|
-
// el enriquecimiento se omite silenciosamente — comportamiento default sin
|
|
27
|
-
// cambios respecto a versiones previas.
|
|
28
|
-
let construirDeepLink, formatearEnlace;
|
|
29
|
-
try {
|
|
30
|
-
({ construirDeepLink, formatearEnlace } = require('./deep-links'));
|
|
31
|
-
} catch {
|
|
32
|
-
construirDeepLink = () => null;
|
|
33
|
-
formatearEnlace = (_, etiqueta) => etiqueta;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const COMMS_DIR = '.planning/comms';
|
|
37
|
-
const CONFIG_PATH = 'manifiestos/gateway-config.json';
|
|
38
|
-
|
|
39
|
-
// Memo de la raíz del proyecto POR cwd: una notificación consulta config +
|
|
40
|
-
// comms en la misma invocación — sin memo el walk ascendente de raizProyecto
|
|
41
|
-
// se repetiría 3 veces con su I/O de existsSync. La clave por cwd evita
|
|
42
|
-
// congelar la raíz cuando el proceso cambia de directorio (tests, daemons).
|
|
43
|
-
let _raizCache = null;
|
|
44
|
-
function raizBase() {
|
|
45
|
-
const cwd = process.cwd();
|
|
46
|
-
if (!_raizCache || _raizCache.cwd !== cwd) {
|
|
47
|
-
_raizCache = { cwd, raiz: raizProyecto(cwd) };
|
|
48
|
-
}
|
|
49
|
-
return _raizCache.raiz;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Receptores reconocidos para formato de deep link. */
|
|
53
|
-
const RECEPTORES = new Set(['telegram', 'discord', 'slack', 'email', 'plain']);
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Verifica si el gateway está habilitado en configuración.
|
|
57
|
-
* @returns {boolean}
|
|
58
|
-
*/
|
|
59
|
-
function gatewayHabilitado() {
|
|
60
|
-
try {
|
|
61
|
-
const cfgPath = path.join(raizBase(), CONFIG_PATH);
|
|
62
|
-
if (!fs.existsSync(cfgPath)) return false;
|
|
63
|
-
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
|
|
64
|
-
return cfg && cfg.enabled === true;
|
|
65
|
-
} catch (_) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Verifica si un tipo de notificación está habilitado.
|
|
72
|
-
* Lee el mapa notifications de gateway-config.json.
|
|
73
|
-
* @param {string} tipo - session-stop, checkpoint, error, release, build-fail
|
|
74
|
-
* @returns {boolean}
|
|
75
|
-
*/
|
|
76
|
-
function tipoHabilitado(tipo) {
|
|
77
|
-
try {
|
|
78
|
-
const cfgPath = path.join(raizBase(), CONFIG_PATH);
|
|
79
|
-
if (!fs.existsSync(cfgPath)) return true;
|
|
80
|
-
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
|
|
81
|
-
const map = cfg.notifications || {};
|
|
82
|
-
const claves = {
|
|
83
|
-
'session-stop': 'onSessionComplete',
|
|
84
|
-
'checkpoint': 'onCheckpoint',
|
|
85
|
-
'error': 'onError',
|
|
86
|
-
'release': 'onRelease',
|
|
87
|
-
'build-fail': 'onBuildFail',
|
|
88
|
-
};
|
|
89
|
-
const clave = claves[tipo];
|
|
90
|
-
if (!clave) return true;
|
|
91
|
-
return map[clave] !== false;
|
|
92
|
-
} catch (_) {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Si el payload incluye `fileRef` + `idePreferido`, retorna el enlace
|
|
99
|
-
* formateado al receptor; en otro caso retorna null. No modifica el payload.
|
|
100
|
-
*
|
|
101
|
-
* Estructura esperada del payload (opt-in, ADR-0029):
|
|
102
|
-
* payload.fileRef = {
|
|
103
|
-
* archivo: '/abs/path/al/archivo.js',
|
|
104
|
-
* linea?: 42,
|
|
105
|
-
* columna?: 8,
|
|
106
|
-
* etiqueta?: 'Abrir archivo.js:42', // default: archivo:linea
|
|
107
|
-
* proyecto?: 'mi-proyecto', // requerido solo para JetBrains
|
|
108
|
-
* }
|
|
109
|
-
* payload.idePreferido = 'vscode' | 'cursor' | ...
|
|
110
|
-
*
|
|
111
|
-
* @param {object} payload
|
|
112
|
-
* @param {string} receptor - 'telegram' | 'discord' | 'slack' | 'email' | 'plain'
|
|
113
|
-
* @returns {string|null}
|
|
114
|
-
* @private
|
|
115
|
-
*/
|
|
116
|
-
function _construirEnlaceFileRef(payload, receptor) {
|
|
117
|
-
if (!payload || !payload.fileRef || !payload.idePreferido) return null;
|
|
118
|
-
const { archivo, linea, columna, etiqueta, proyecto } = payload.fileRef;
|
|
119
|
-
if (!archivo) return null;
|
|
120
|
-
|
|
121
|
-
const url = construirDeepLink({
|
|
122
|
-
ide: payload.idePreferido,
|
|
123
|
-
rutaAbsoluta: archivo,
|
|
124
|
-
linea,
|
|
125
|
-
columna,
|
|
126
|
-
proyecto,
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
const label = etiqueta || (linea ? `${path.basename(archivo)}:${linea}` : path.basename(archivo));
|
|
130
|
-
const formato = RECEPTORES.has(receptor) ? receptor : 'plain';
|
|
131
|
-
return formatearEnlace(url, label, formato);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Encola una notificación para el gateway.
|
|
136
|
-
* No bloquea ni lanza. Retorna true si se encoló, false si fue descartada.
|
|
137
|
-
*
|
|
138
|
-
* Enriquecimiento opt-in (ADR-0029): si `params.payload.fileRef` +
|
|
139
|
-
* `params.payload.idePreferido` están presentes, el mensaje agrega el campo
|
|
140
|
-
* `enlace` con un deep link formateado al receptor. Sin esos campos, el
|
|
141
|
-
* comportamiento es idéntico al previo (compatibilidad hacia atrás).
|
|
142
|
-
*
|
|
143
|
-
* @param {object} params
|
|
144
|
-
* @param {string} params.tipo - session-stop, checkpoint, error, release, build-fail, custom
|
|
145
|
-
* @param {string} [params.titulo] - Título corto.
|
|
146
|
-
* @param {string} [params.texto] - Texto del mensaje (soporta Markdown).
|
|
147
|
-
* @param {string} [params.to='all'] - Destino: 'all', 'telegram', 'discord', etc.
|
|
148
|
-
* @param {object} [params.payload] - Payload adicional para el adaptador.
|
|
149
|
-
* @returns {boolean}
|
|
150
|
-
*/
|
|
151
|
-
function notificarGateway(params) {
|
|
152
|
-
try {
|
|
153
|
-
if (!gatewayHabilitado()) return false;
|
|
154
|
-
if (!tipoHabilitado(params.tipo)) return false;
|
|
155
|
-
|
|
156
|
-
const commsDir = path.join(raizBase(), COMMS_DIR);
|
|
157
|
-
if (!fs.existsSync(commsDir)) {
|
|
158
|
-
fs.mkdirSync(commsDir, { recursive: true });
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const id = `msg-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
162
|
-
const receptor = params.to || 'all';
|
|
163
|
-
const payloadBase = {
|
|
164
|
-
tipo: params.tipo,
|
|
165
|
-
titulo: params.titulo || '',
|
|
166
|
-
texto: params.texto || '',
|
|
167
|
-
...(params.payload || {}),
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// Enriquecimiento opt-in con deep link (ADR-0029).
|
|
171
|
-
const enlace = _construirEnlaceFileRef(payloadBase, receptor);
|
|
172
|
-
if (enlace) payloadBase.enlace = enlace;
|
|
173
|
-
|
|
174
|
-
const msg = {
|
|
175
|
-
id,
|
|
176
|
-
type: 'gateway_notification',
|
|
177
|
-
from: 'swl-system',
|
|
178
|
-
to: receptor,
|
|
179
|
-
payload: payloadBase,
|
|
180
|
-
text: params.texto || '',
|
|
181
|
-
timestamp: new Date().toISOString(),
|
|
182
|
-
status: 'pending',
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
const filePath = path.join(commsDir, `${id}.json`);
|
|
186
|
-
atomicWriteJSON(filePath, msg);
|
|
187
|
-
return true;
|
|
188
|
-
} catch (_) {
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
module.exports = { notificarGateway, gatewayHabilitado, tipoHabilitado };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Gateway Notify — Helper para encolar notificaciones al gateway multi-plataforma.
|
|
5
|
+
*
|
|
6
|
+
* Escribe un archivo JSON en .planning/comms/ que el GatewayRunner consume
|
|
7
|
+
* mediante polling (ver gateway/index.js _pollComms). Zero-deps, escritura
|
|
8
|
+
* atómica, opt-in por configuración en manifiestos/gateway-config.json.
|
|
9
|
+
*
|
|
10
|
+
* Uso:
|
|
11
|
+
* const { notificarGateway } = require('./lib/gateway-notify');
|
|
12
|
+
* notificarGateway({ tipo: 'session-stop', titulo: 'Sesión terminada', texto: '...' });
|
|
13
|
+
*
|
|
14
|
+
* No bloquea ni lanza: si el gateway está deshabilitado o no hay comms dir,
|
|
15
|
+
* retorna silenciosamente.
|
|
16
|
+
*
|
|
17
|
+
* @module hooks/lib/gateway-notify
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const fs = require('fs');
|
|
21
|
+
const { raizProyecto } = require('./raiz-proyecto');
|
|
22
|
+
const path = require('path');
|
|
23
|
+
const { atomicWriteJSON } = require('./atomic-write');
|
|
24
|
+
|
|
25
|
+
// Deep links opt-in (ADR-0029). Si el módulo no carga (instalación incompleta),
|
|
26
|
+
// el enriquecimiento se omite silenciosamente — comportamiento default sin
|
|
27
|
+
// cambios respecto a versiones previas.
|
|
28
|
+
let construirDeepLink, formatearEnlace;
|
|
29
|
+
try {
|
|
30
|
+
({ construirDeepLink, formatearEnlace } = require('./deep-links'));
|
|
31
|
+
} catch {
|
|
32
|
+
construirDeepLink = () => null;
|
|
33
|
+
formatearEnlace = (_, etiqueta) => etiqueta;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const COMMS_DIR = '.planning/comms';
|
|
37
|
+
const CONFIG_PATH = 'manifiestos/gateway-config.json';
|
|
38
|
+
|
|
39
|
+
// Memo de la raíz del proyecto POR cwd: una notificación consulta config +
|
|
40
|
+
// comms en la misma invocación — sin memo el walk ascendente de raizProyecto
|
|
41
|
+
// se repetiría 3 veces con su I/O de existsSync. La clave por cwd evita
|
|
42
|
+
// congelar la raíz cuando el proceso cambia de directorio (tests, daemons).
|
|
43
|
+
let _raizCache = null;
|
|
44
|
+
function raizBase() {
|
|
45
|
+
const cwd = process.cwd();
|
|
46
|
+
if (!_raizCache || _raizCache.cwd !== cwd) {
|
|
47
|
+
_raizCache = { cwd, raiz: raizProyecto(cwd) };
|
|
48
|
+
}
|
|
49
|
+
return _raizCache.raiz;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Receptores reconocidos para formato de deep link. */
|
|
53
|
+
const RECEPTORES = new Set(['telegram', 'discord', 'slack', 'email', 'plain']);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Verifica si el gateway está habilitado en configuración.
|
|
57
|
+
* @returns {boolean}
|
|
58
|
+
*/
|
|
59
|
+
function gatewayHabilitado() {
|
|
60
|
+
try {
|
|
61
|
+
const cfgPath = path.join(raizBase(), CONFIG_PATH);
|
|
62
|
+
if (!fs.existsSync(cfgPath)) return false;
|
|
63
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
|
|
64
|
+
return cfg && cfg.enabled === true;
|
|
65
|
+
} catch (_) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Verifica si un tipo de notificación está habilitado.
|
|
72
|
+
* Lee el mapa notifications de gateway-config.json.
|
|
73
|
+
* @param {string} tipo - session-stop, checkpoint, error, release, build-fail
|
|
74
|
+
* @returns {boolean}
|
|
75
|
+
*/
|
|
76
|
+
function tipoHabilitado(tipo) {
|
|
77
|
+
try {
|
|
78
|
+
const cfgPath = path.join(raizBase(), CONFIG_PATH);
|
|
79
|
+
if (!fs.existsSync(cfgPath)) return true;
|
|
80
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
|
|
81
|
+
const map = cfg.notifications || {};
|
|
82
|
+
const claves = {
|
|
83
|
+
'session-stop': 'onSessionComplete',
|
|
84
|
+
'checkpoint': 'onCheckpoint',
|
|
85
|
+
'error': 'onError',
|
|
86
|
+
'release': 'onRelease',
|
|
87
|
+
'build-fail': 'onBuildFail',
|
|
88
|
+
};
|
|
89
|
+
const clave = claves[tipo];
|
|
90
|
+
if (!clave) return true;
|
|
91
|
+
return map[clave] !== false;
|
|
92
|
+
} catch (_) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Si el payload incluye `fileRef` + `idePreferido`, retorna el enlace
|
|
99
|
+
* formateado al receptor; en otro caso retorna null. No modifica el payload.
|
|
100
|
+
*
|
|
101
|
+
* Estructura esperada del payload (opt-in, ADR-0029):
|
|
102
|
+
* payload.fileRef = {
|
|
103
|
+
* archivo: '/abs/path/al/archivo.js',
|
|
104
|
+
* linea?: 42,
|
|
105
|
+
* columna?: 8,
|
|
106
|
+
* etiqueta?: 'Abrir archivo.js:42', // default: archivo:linea
|
|
107
|
+
* proyecto?: 'mi-proyecto', // requerido solo para JetBrains
|
|
108
|
+
* }
|
|
109
|
+
* payload.idePreferido = 'vscode' | 'cursor' | ...
|
|
110
|
+
*
|
|
111
|
+
* @param {object} payload
|
|
112
|
+
* @param {string} receptor - 'telegram' | 'discord' | 'slack' | 'email' | 'plain'
|
|
113
|
+
* @returns {string|null}
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
function _construirEnlaceFileRef(payload, receptor) {
|
|
117
|
+
if (!payload || !payload.fileRef || !payload.idePreferido) return null;
|
|
118
|
+
const { archivo, linea, columna, etiqueta, proyecto } = payload.fileRef;
|
|
119
|
+
if (!archivo) return null;
|
|
120
|
+
|
|
121
|
+
const url = construirDeepLink({
|
|
122
|
+
ide: payload.idePreferido,
|
|
123
|
+
rutaAbsoluta: archivo,
|
|
124
|
+
linea,
|
|
125
|
+
columna,
|
|
126
|
+
proyecto,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const label = etiqueta || (linea ? `${path.basename(archivo)}:${linea}` : path.basename(archivo));
|
|
130
|
+
const formato = RECEPTORES.has(receptor) ? receptor : 'plain';
|
|
131
|
+
return formatearEnlace(url, label, formato);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Encola una notificación para el gateway.
|
|
136
|
+
* No bloquea ni lanza. Retorna true si se encoló, false si fue descartada.
|
|
137
|
+
*
|
|
138
|
+
* Enriquecimiento opt-in (ADR-0029): si `params.payload.fileRef` +
|
|
139
|
+
* `params.payload.idePreferido` están presentes, el mensaje agrega el campo
|
|
140
|
+
* `enlace` con un deep link formateado al receptor. Sin esos campos, el
|
|
141
|
+
* comportamiento es idéntico al previo (compatibilidad hacia atrás).
|
|
142
|
+
*
|
|
143
|
+
* @param {object} params
|
|
144
|
+
* @param {string} params.tipo - session-stop, checkpoint, error, release, build-fail, custom
|
|
145
|
+
* @param {string} [params.titulo] - Título corto.
|
|
146
|
+
* @param {string} [params.texto] - Texto del mensaje (soporta Markdown).
|
|
147
|
+
* @param {string} [params.to='all'] - Destino: 'all', 'telegram', 'discord', etc.
|
|
148
|
+
* @param {object} [params.payload] - Payload adicional para el adaptador.
|
|
149
|
+
* @returns {boolean}
|
|
150
|
+
*/
|
|
151
|
+
function notificarGateway(params) {
|
|
152
|
+
try {
|
|
153
|
+
if (!gatewayHabilitado()) return false;
|
|
154
|
+
if (!tipoHabilitado(params.tipo)) return false;
|
|
155
|
+
|
|
156
|
+
const commsDir = path.join(raizBase(), COMMS_DIR);
|
|
157
|
+
if (!fs.existsSync(commsDir)) {
|
|
158
|
+
fs.mkdirSync(commsDir, { recursive: true });
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const id = `msg-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
162
|
+
const receptor = params.to || 'all';
|
|
163
|
+
const payloadBase = {
|
|
164
|
+
tipo: params.tipo,
|
|
165
|
+
titulo: params.titulo || '',
|
|
166
|
+
texto: params.texto || '',
|
|
167
|
+
...(params.payload || {}),
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Enriquecimiento opt-in con deep link (ADR-0029).
|
|
171
|
+
const enlace = _construirEnlaceFileRef(payloadBase, receptor);
|
|
172
|
+
if (enlace) payloadBase.enlace = enlace;
|
|
173
|
+
|
|
174
|
+
const msg = {
|
|
175
|
+
id,
|
|
176
|
+
type: 'gateway_notification',
|
|
177
|
+
from: 'swl-system',
|
|
178
|
+
to: receptor,
|
|
179
|
+
payload: payloadBase,
|
|
180
|
+
text: params.texto || '',
|
|
181
|
+
timestamp: new Date().toISOString(),
|
|
182
|
+
status: 'pending',
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const filePath = path.join(commsDir, `${id}.json`);
|
|
186
|
+
atomicWriteJSON(filePath, msg);
|
|
187
|
+
return true;
|
|
188
|
+
} catch (_) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
module.exports = { notificarGateway, gatewayHabilitado, tipoHabilitado };
|
package/hooks/lib/mcp-health.js
CHANGED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* notificacion-formato.js — Formato del cuerpo de las notificaciones.
|
|
5
|
+
*
|
|
6
|
+
* Módulo sin efectos secundarios (solo funciones puras), separado del hook
|
|
7
|
+
* `notificacion-telegram.js` para poder unit-testearlo sin disparar el `run()`
|
|
8
|
+
* del hook (que se ejecuta al `require`, porque los hooks se invocan vía el
|
|
9
|
+
* wrapper `node -e "require('./hooks/X.js')"` — no admiten gate de entrypoint).
|
|
10
|
+
*
|
|
11
|
+
* Zero-deps.
|
|
12
|
+
*
|
|
13
|
+
* @module hooks/lib/notificacion-formato
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Prepara el último mensaje del asistente para una notificación de Telegram:
|
|
18
|
+
* limpia el ruido de markdown que Telegram no renderiza (fences de código, filas
|
|
19
|
+
* de tabla, reglas horizontales) y el markdown inline (negritas, itálicas,
|
|
20
|
+
* código, enlaces, viñetas), preservando el TEXTO COMPLETO. Solo trunca mensajes
|
|
21
|
+
* ENORMES que no caben en Telegram (~3500 chars el mensaje completo con el
|
|
22
|
+
* wrapper), y en ese caso corta en un límite natural (fin de línea u oración),
|
|
23
|
+
* nunca a media palabra. El default alto evita el corte agresivo previo (400
|
|
24
|
+
* chars) que dejaba mensajes útiles truncados (feedback 2026-07-15).
|
|
25
|
+
*
|
|
26
|
+
* @param {string} texto - Mensaje completo del asistente (markdown).
|
|
27
|
+
* @param {number} [maxChars=3300] - Largo máximo del cuerpo (deja margen para el
|
|
28
|
+
* título/labels dentro del límite de 3500 del cliente Telegram).
|
|
29
|
+
* @returns {string} Texto limpio (completo salvo mensajes enormes).
|
|
30
|
+
*/
|
|
31
|
+
function resumirParaNotificacion(texto, maxChars = 3300) {
|
|
32
|
+
if (!texto) return '';
|
|
33
|
+
const limpias = [];
|
|
34
|
+
let enFence = false;
|
|
35
|
+
for (const raw of String(texto).split(/\r?\n/)) {
|
|
36
|
+
const l = raw.trim();
|
|
37
|
+
if (/^```/.test(l)) { enFence = !enFence; continue; } // abre/cierra bloque de código
|
|
38
|
+
if (enFence) continue; // omitir contenido de código
|
|
39
|
+
if (/^\|.*\|$/.test(l)) continue; // omitir filas de tabla
|
|
40
|
+
if (/^[-=_*]{3,}$/.test(l)) continue; // omitir reglas horizontales
|
|
41
|
+
if (l === '') {
|
|
42
|
+
if (limpias.length && limpias[limpias.length - 1] !== '') limpias.push('');
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const t = l
|
|
46
|
+
.replace(/^#{1,6}\s+/, '') // encabezados
|
|
47
|
+
.replace(/^>\s?/, '') // citas
|
|
48
|
+
.replace(/^[-*+]\s+/, '• ') // viñetas → •
|
|
49
|
+
.replace(/^\d+\.\s+/, '') // listas numeradas
|
|
50
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1') // negritas
|
|
51
|
+
.replace(/(^|[^*])\*([^*]+)\*/g, '$1$2') // itálicas
|
|
52
|
+
.replace(/`([^`]+)`/g, '$1') // código inline
|
|
53
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1'); // enlaces → texto
|
|
54
|
+
limpias.push(t);
|
|
55
|
+
}
|
|
56
|
+
const resumen = limpias.join('\n').replace(/\n{3,}/g, '\n\n').trim();
|
|
57
|
+
if (resumen.length <= maxChars) return resumen;
|
|
58
|
+
// Mensaje enorme: cortar en el último límite natural antes de maxChars.
|
|
59
|
+
const corte = resumen.slice(0, maxChars - 1);
|
|
60
|
+
const limite = Math.max(
|
|
61
|
+
corte.lastIndexOf('\n'),
|
|
62
|
+
corte.lastIndexOf('. '),
|
|
63
|
+
corte.lastIndexOf('! '),
|
|
64
|
+
corte.lastIndexOf('? ')
|
|
65
|
+
);
|
|
66
|
+
const base = limite > (maxChars - 1) * 0.6 ? corte.slice(0, limite + 1) : corte;
|
|
67
|
+
return base.trimEnd() + '…';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Clasifica el `message` de un evento Notification de Claude Code y devuelve
|
|
72
|
+
* subtítulo + cuerpo EN ESPAÑOL (regla es-MX de brevedad-output). El mensaje
|
|
73
|
+
* nativo de Claude Code viene en inglés ("Claude needs your permission",
|
|
74
|
+
* "Claude is waiting for your input"); volcarlo crudo mezclaba idiomas en la
|
|
75
|
+
* notificación (bug 2026-07-15). Se detecta la categoría por keyword (en/es) y
|
|
76
|
+
* se emite texto es-MX propio, nunca el `message` inglés.
|
|
77
|
+
*
|
|
78
|
+
* @param {string} mensaje - evt.message del evento Notification (puede venir en inglés).
|
|
79
|
+
* @returns {{subtitulo: string, cuerpo: string}} Ambos en español.
|
|
80
|
+
*/
|
|
81
|
+
function clasificarNotificacion(mensaje) {
|
|
82
|
+
const m = String(mensaje || '').toLowerCase();
|
|
83
|
+
if (m.includes('permission') || m.includes('permiso')) {
|
|
84
|
+
return { subtitulo: 'Permisos pendientes', cuerpo: 'Claude necesita tu permiso para continuar.' };
|
|
85
|
+
}
|
|
86
|
+
if (m.includes('idle') || m.includes('waiting') || m.includes('esperando')) {
|
|
87
|
+
return { subtitulo: 'Esperando respuesta', cuerpo: 'Claude está esperando tu respuesta.' };
|
|
88
|
+
}
|
|
89
|
+
return { subtitulo: 'Atención requerida', cuerpo: 'Claude requiere tu atención.' };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
module.exports = { resumirParaNotificacion, clasificarNotificacion };
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
const fs = require('fs');
|
|
25
|
-
const { raizProyecto } = require('./raiz-proyecto');
|
|
25
|
+
const { raizProyecto } = require('./raiz-proyecto');
|
|
26
26
|
const path = require('path');
|
|
27
27
|
|
|
28
28
|
// Escritura atómica para reescritura completa del JSONL (marcar accionado).
|