@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,191 +1,191 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Provenance Tracker — Rastreo de proveniencia de skills y componentes.
|
|
5
|
-
*
|
|
6
|
-
* Registra de dónde viene cada skill/agente instalado: si es del core SWL,
|
|
7
|
-
* de un repo externo, de auto-evolución, o de la comunidad. Genera y lee
|
|
8
|
-
* archivos meta.json por componente.
|
|
9
|
-
*
|
|
10
|
-
* Patrón adoptado de skillshare (internal/install/meta.go).
|
|
11
|
-
*
|
|
12
|
-
* Zero dependencias externas.
|
|
13
|
-
*
|
|
14
|
-
* Uso:
|
|
15
|
-
* const { registrarProveniencia, leerProveniencia, listarProveniencias } = require('./lib/provenance-tracker');
|
|
16
|
-
*
|
|
17
|
-
* registrarProveniencia('/ruta/skill', {
|
|
18
|
-
* origin: 'core',
|
|
19
|
-
* repoUrl: 'https://github.com/saulwadeleon/swl-ses',
|
|
20
|
-
* version: '5.6.3',
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* const meta = leerProveniencia('/ruta/skill');
|
|
24
|
-
* // { origin: 'core', repoUrl: '...', version: '5.6.3', installedAt: '...' }
|
|
25
|
-
*
|
|
26
|
-
* @module hooks/lib/provenance-tracker
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
const fs = require('fs');
|
|
30
|
-
const path = require('path');
|
|
31
|
-
|
|
32
|
-
// Escritura atómica obligatoria para meta.json (regla CLAUDE.md).
|
|
33
|
-
let atomicWriteJSON;
|
|
34
|
-
try {
|
|
35
|
-
({ atomicWriteJSON } = require('./atomic-write'));
|
|
36
|
-
} catch {
|
|
37
|
-
atomicWriteJSON = (p, o) => fs.writeFileSync(p, JSON.stringify(o, null, 2), 'utf8');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
// Constantes
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
|
|
44
|
-
const META_FILENAME = 'meta.json';
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Orígenes válidos de un componente.
|
|
48
|
-
* @readonly
|
|
49
|
-
*/
|
|
50
|
-
const ORIGENES = Object.freeze({
|
|
51
|
-
CORE: 'core', // Del paquete swl-ses
|
|
52
|
-
AUTO_EVOLUTION: 'auto-evolution', // Generado por /swl:evolucionar
|
|
53
|
-
IMPORTED: 'imported', // Importado de repo externo
|
|
54
|
-
COMMUNITY: 'community', // De skills.sh o similares
|
|
55
|
-
USERLAND: 'userland', // Del usuario (_userland/)
|
|
56
|
-
ANTHROPIC: 'anthropic', // De anthropics/skills
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
// ---------------------------------------------------------------------------
|
|
60
|
-
// API pública
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Registra la proveniencia de un componente instalado.
|
|
65
|
-
*
|
|
66
|
-
* Crea o actualiza meta.json en el directorio del componente.
|
|
67
|
-
*
|
|
68
|
-
* @param {string} componentDir - Ruta al directorio del componente
|
|
69
|
-
* @param {object} datos
|
|
70
|
-
* @param {string} datos.origin - Origen (ver ORIGENES)
|
|
71
|
-
* @param {string} [datos.repoUrl] - URL del repo de origen
|
|
72
|
-
* @param {string} [datos.commit] - Commit hash del origen
|
|
73
|
-
* @param {string} [datos.version] - Versión del sistema al instalar
|
|
74
|
-
* @param {string} [datos.author] - Autor o equipo
|
|
75
|
-
* @param {string} [datos.note] - Nota libre
|
|
76
|
-
*/
|
|
77
|
-
function registrarProveniencia(componentDir, datos) {
|
|
78
|
-
const metaPath = path.join(componentDir, META_FILENAME);
|
|
79
|
-
|
|
80
|
-
const meta = {
|
|
81
|
-
origin: datos.origin || ORIGENES.CORE,
|
|
82
|
-
repoUrl: datos.repoUrl || null,
|
|
83
|
-
commit: datos.commit || null,
|
|
84
|
-
version: datos.version || null,
|
|
85
|
-
author: datos.author || null,
|
|
86
|
-
note: datos.note || null,
|
|
87
|
-
installedAt: new Date().toISOString(),
|
|
88
|
-
installedBy: `swl-ses v${datos.version || 'unknown'}`,
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
// Si ya existe, preservar datos anteriores y agregar historial
|
|
92
|
-
if (fs.existsSync(metaPath)) {
|
|
93
|
-
try {
|
|
94
|
-
const existing = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
95
|
-
// Mover datos anteriores a historial
|
|
96
|
-
if (!existing.history) existing.history = [];
|
|
97
|
-
const { history, ...prevData } = existing;
|
|
98
|
-
existing.history.push({ ...prevData, replacedAt: meta.installedAt });
|
|
99
|
-
|
|
100
|
-
// Actualizar con nuevos datos
|
|
101
|
-
Object.assign(existing, meta);
|
|
102
|
-
existing.history = existing.history.slice(-5); // Máximo 5 entradas de historial
|
|
103
|
-
|
|
104
|
-
atomicWriteJSON(metaPath, existing);
|
|
105
|
-
} catch {
|
|
106
|
-
// Error leyendo existente — sobrescribir
|
|
107
|
-
atomicWriteJSON(metaPath, meta);
|
|
108
|
-
}
|
|
109
|
-
} else {
|
|
110
|
-
atomicWriteJSON(metaPath, meta);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Lee la proveniencia de un componente.
|
|
116
|
-
*
|
|
117
|
-
* @param {string} componentDir - Ruta al directorio del componente
|
|
118
|
-
* @returns {object|null} Datos de proveniencia o null si no existe
|
|
119
|
-
*/
|
|
120
|
-
function leerProveniencia(componentDir) {
|
|
121
|
-
const metaPath = path.join(componentDir, META_FILENAME);
|
|
122
|
-
if (!fs.existsSync(metaPath)) return null;
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
return JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
126
|
-
} catch {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Lista la proveniencia de todos los componentes en un directorio.
|
|
133
|
-
*
|
|
134
|
-
* @param {string} parentDir - Directorio padre (ej: habilidades/)
|
|
135
|
-
* @returns {Array<{ name: string, origin: string, version: string, installedAt: string }>}
|
|
136
|
-
*/
|
|
137
|
-
function listarProveniencias(parentDir) {
|
|
138
|
-
if (!fs.existsSync(parentDir)) return [];
|
|
139
|
-
|
|
140
|
-
const resultado = [];
|
|
141
|
-
const entries = fs.readdirSync(parentDir, { withFileTypes: true });
|
|
142
|
-
|
|
143
|
-
for (const entry of entries) {
|
|
144
|
-
if (!entry.isDirectory()) continue;
|
|
145
|
-
const meta = leerProveniencia(path.join(parentDir, entry.name));
|
|
146
|
-
resultado.push({
|
|
147
|
-
name: entry.name,
|
|
148
|
-
origin: meta ? meta.origin : 'unknown',
|
|
149
|
-
version: meta ? meta.version : null,
|
|
150
|
-
installedAt: meta ? meta.installedAt : null,
|
|
151
|
-
repoUrl: meta ? meta.repoUrl : null,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return resultado;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Genera un resumen de proveniencia por origen.
|
|
160
|
-
*
|
|
161
|
-
* @param {string} parentDir - Directorio padre
|
|
162
|
-
* @returns {{ total: number, byOrigin: Object<string, number>, unknown: number }}
|
|
163
|
-
*/
|
|
164
|
-
function resumenProveniencia(parentDir) {
|
|
165
|
-
const lista = listarProveniencias(parentDir);
|
|
166
|
-
const byOrigin = {};
|
|
167
|
-
let unknown = 0;
|
|
168
|
-
|
|
169
|
-
for (const item of lista) {
|
|
170
|
-
if (item.origin === 'unknown') {
|
|
171
|
-
unknown++;
|
|
172
|
-
} else {
|
|
173
|
-
byOrigin[item.origin] = (byOrigin[item.origin] || 0) + 1;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return { total: lista.length, byOrigin, unknown };
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// ---------------------------------------------------------------------------
|
|
181
|
-
// Exports
|
|
182
|
-
// ---------------------------------------------------------------------------
|
|
183
|
-
|
|
184
|
-
module.exports = {
|
|
185
|
-
registrarProveniencia,
|
|
186
|
-
leerProveniencia,
|
|
187
|
-
listarProveniencias,
|
|
188
|
-
resumenProveniencia,
|
|
189
|
-
ORIGENES,
|
|
190
|
-
META_FILENAME,
|
|
191
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Provenance Tracker — Rastreo de proveniencia de skills y componentes.
|
|
5
|
+
*
|
|
6
|
+
* Registra de dónde viene cada skill/agente instalado: si es del core SWL,
|
|
7
|
+
* de un repo externo, de auto-evolución, o de la comunidad. Genera y lee
|
|
8
|
+
* archivos meta.json por componente.
|
|
9
|
+
*
|
|
10
|
+
* Patrón adoptado de skillshare (internal/install/meta.go).
|
|
11
|
+
*
|
|
12
|
+
* Zero dependencias externas.
|
|
13
|
+
*
|
|
14
|
+
* Uso:
|
|
15
|
+
* const { registrarProveniencia, leerProveniencia, listarProveniencias } = require('./lib/provenance-tracker');
|
|
16
|
+
*
|
|
17
|
+
* registrarProveniencia('/ruta/skill', {
|
|
18
|
+
* origin: 'core',
|
|
19
|
+
* repoUrl: 'https://github.com/saulwadeleon/swl-ses',
|
|
20
|
+
* version: '5.6.3',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const meta = leerProveniencia('/ruta/skill');
|
|
24
|
+
* // { origin: 'core', repoUrl: '...', version: '5.6.3', installedAt: '...' }
|
|
25
|
+
*
|
|
26
|
+
* @module hooks/lib/provenance-tracker
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const fs = require('fs');
|
|
30
|
+
const path = require('path');
|
|
31
|
+
|
|
32
|
+
// Escritura atómica obligatoria para meta.json (regla CLAUDE.md).
|
|
33
|
+
let atomicWriteJSON;
|
|
34
|
+
try {
|
|
35
|
+
({ atomicWriteJSON } = require('./atomic-write'));
|
|
36
|
+
} catch {
|
|
37
|
+
atomicWriteJSON = (p, o) => fs.writeFileSync(p, JSON.stringify(o, null, 2), 'utf8');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Constantes
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
const META_FILENAME = 'meta.json';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Orígenes válidos de un componente.
|
|
48
|
+
* @readonly
|
|
49
|
+
*/
|
|
50
|
+
const ORIGENES = Object.freeze({
|
|
51
|
+
CORE: 'core', // Del paquete swl-ses
|
|
52
|
+
AUTO_EVOLUTION: 'auto-evolution', // Generado por /swl:evolucionar
|
|
53
|
+
IMPORTED: 'imported', // Importado de repo externo
|
|
54
|
+
COMMUNITY: 'community', // De skills.sh o similares
|
|
55
|
+
USERLAND: 'userland', // Del usuario (_userland/)
|
|
56
|
+
ANTHROPIC: 'anthropic', // De anthropics/skills
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// API pública
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Registra la proveniencia de un componente instalado.
|
|
65
|
+
*
|
|
66
|
+
* Crea o actualiza meta.json en el directorio del componente.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} componentDir - Ruta al directorio del componente
|
|
69
|
+
* @param {object} datos
|
|
70
|
+
* @param {string} datos.origin - Origen (ver ORIGENES)
|
|
71
|
+
* @param {string} [datos.repoUrl] - URL del repo de origen
|
|
72
|
+
* @param {string} [datos.commit] - Commit hash del origen
|
|
73
|
+
* @param {string} [datos.version] - Versión del sistema al instalar
|
|
74
|
+
* @param {string} [datos.author] - Autor o equipo
|
|
75
|
+
* @param {string} [datos.note] - Nota libre
|
|
76
|
+
*/
|
|
77
|
+
function registrarProveniencia(componentDir, datos) {
|
|
78
|
+
const metaPath = path.join(componentDir, META_FILENAME);
|
|
79
|
+
|
|
80
|
+
const meta = {
|
|
81
|
+
origin: datos.origin || ORIGENES.CORE,
|
|
82
|
+
repoUrl: datos.repoUrl || null,
|
|
83
|
+
commit: datos.commit || null,
|
|
84
|
+
version: datos.version || null,
|
|
85
|
+
author: datos.author || null,
|
|
86
|
+
note: datos.note || null,
|
|
87
|
+
installedAt: new Date().toISOString(),
|
|
88
|
+
installedBy: `swl-ses v${datos.version || 'unknown'}`,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Si ya existe, preservar datos anteriores y agregar historial
|
|
92
|
+
if (fs.existsSync(metaPath)) {
|
|
93
|
+
try {
|
|
94
|
+
const existing = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
95
|
+
// Mover datos anteriores a historial
|
|
96
|
+
if (!existing.history) existing.history = [];
|
|
97
|
+
const { history, ...prevData } = existing;
|
|
98
|
+
existing.history.push({ ...prevData, replacedAt: meta.installedAt });
|
|
99
|
+
|
|
100
|
+
// Actualizar con nuevos datos
|
|
101
|
+
Object.assign(existing, meta);
|
|
102
|
+
existing.history = existing.history.slice(-5); // Máximo 5 entradas de historial
|
|
103
|
+
|
|
104
|
+
atomicWriteJSON(metaPath, existing);
|
|
105
|
+
} catch {
|
|
106
|
+
// Error leyendo existente — sobrescribir
|
|
107
|
+
atomicWriteJSON(metaPath, meta);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
atomicWriteJSON(metaPath, meta);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Lee la proveniencia de un componente.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} componentDir - Ruta al directorio del componente
|
|
118
|
+
* @returns {object|null} Datos de proveniencia o null si no existe
|
|
119
|
+
*/
|
|
120
|
+
function leerProveniencia(componentDir) {
|
|
121
|
+
const metaPath = path.join(componentDir, META_FILENAME);
|
|
122
|
+
if (!fs.existsSync(metaPath)) return null;
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
return JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
126
|
+
} catch {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Lista la proveniencia de todos los componentes en un directorio.
|
|
133
|
+
*
|
|
134
|
+
* @param {string} parentDir - Directorio padre (ej: habilidades/)
|
|
135
|
+
* @returns {Array<{ name: string, origin: string, version: string, installedAt: string }>}
|
|
136
|
+
*/
|
|
137
|
+
function listarProveniencias(parentDir) {
|
|
138
|
+
if (!fs.existsSync(parentDir)) return [];
|
|
139
|
+
|
|
140
|
+
const resultado = [];
|
|
141
|
+
const entries = fs.readdirSync(parentDir, { withFileTypes: true });
|
|
142
|
+
|
|
143
|
+
for (const entry of entries) {
|
|
144
|
+
if (!entry.isDirectory()) continue;
|
|
145
|
+
const meta = leerProveniencia(path.join(parentDir, entry.name));
|
|
146
|
+
resultado.push({
|
|
147
|
+
name: entry.name,
|
|
148
|
+
origin: meta ? meta.origin : 'unknown',
|
|
149
|
+
version: meta ? meta.version : null,
|
|
150
|
+
installedAt: meta ? meta.installedAt : null,
|
|
151
|
+
repoUrl: meta ? meta.repoUrl : null,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return resultado;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Genera un resumen de proveniencia por origen.
|
|
160
|
+
*
|
|
161
|
+
* @param {string} parentDir - Directorio padre
|
|
162
|
+
* @returns {{ total: number, byOrigin: Object<string, number>, unknown: number }}
|
|
163
|
+
*/
|
|
164
|
+
function resumenProveniencia(parentDir) {
|
|
165
|
+
const lista = listarProveniencias(parentDir);
|
|
166
|
+
const byOrigin = {};
|
|
167
|
+
let unknown = 0;
|
|
168
|
+
|
|
169
|
+
for (const item of lista) {
|
|
170
|
+
if (item.origin === 'unknown') {
|
|
171
|
+
unknown++;
|
|
172
|
+
} else {
|
|
173
|
+
byOrigin[item.origin] = (byOrigin[item.origin] || 0) + 1;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return { total: lista.length, byOrigin, unknown };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Exports
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
|
|
184
|
+
module.exports = {
|
|
185
|
+
registrarProveniencia,
|
|
186
|
+
leerProveniencia,
|
|
187
|
+
listarProveniencias,
|
|
188
|
+
resumenProveniencia,
|
|
189
|
+
ORIGENES,
|
|
190
|
+
META_FILENAME,
|
|
191
|
+
};
|
|
@@ -1,102 +1,158 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* raiz-proyecto.js — Resolución de la raíz del proyecto para hooks que
|
|
5
|
-
* escriben telemetría/memoria en `.planning/`.
|
|
6
|
-
*
|
|
7
|
-
* El CWD de arranque de una sesión NO es la frontera del proyecto: en un
|
|
8
|
-
* monorepo con sesiones abiertas en subdirectorios (`backend/`, `frontend/`),
|
|
9
|
-
* anclar `.planning/` a `process.cwd()` fragmenta la memoria del proyecto en
|
|
10
|
-
* árboles huérfanos (DT-HOOKS-RAIZ-GIT; misma clase que el fix de
|
|
11
|
-
* proteccion-rutas). La frontera correcta es la raíz del repositorio git,
|
|
12
|
-
* con una excepción: un sub-proyecto anidado que ya tiene su propio
|
|
13
|
-
* `.planning/` REAL (con marcadores de proyecto) conserva su árbol local.
|
|
14
|
-
*
|
|
15
|
-
* Reglas de resolución (en orden):
|
|
16
|
-
* 1. Ascendiendo desde `desde`, el primer directorio cuyo `.planning/`
|
|
17
|
-
* contiene un marcador de proyecto (PROYECTO.md, HOJA-RUTA.md,
|
|
18
|
-
* ESTADO.md) gana — respeta sub-proyectos legítimos en monorepos.
|
|
19
|
-
* Un `.planning/` sin marcadores (solo telemetría huérfana de hooks)
|
|
20
|
-
* NO cuenta: eso es el síntoma del bug, no un proyecto.
|
|
21
|
-
* 2. Si ningún nivel tiene `.planning/` real, gana la raíz del repo git
|
|
22
|
-
* (`.git` como directorio o como archivo — worktrees).
|
|
23
|
-
* 3. Sin `.git` alcanzable: fallback al propio `desde`.
|
|
24
|
-
*
|
|
25
|
-
* La ascensión se detiene en el HOME del usuario (sin incluirlo) cuando se
|
|
26
|
-
* llega ahí subiendo: un dotfiles-repo en `~`
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* (
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* (
|
|
41
|
-
*
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* raiz-proyecto.js — Resolución de la raíz del proyecto para hooks que
|
|
5
|
+
* escriben telemetría/memoria en `.planning/`.
|
|
6
|
+
*
|
|
7
|
+
* El CWD de arranque de una sesión NO es la frontera del proyecto: en un
|
|
8
|
+
* monorepo con sesiones abiertas en subdirectorios (`backend/`, `frontend/`),
|
|
9
|
+
* anclar `.planning/` a `process.cwd()` fragmenta la memoria del proyecto en
|
|
10
|
+
* árboles huérfanos (DT-HOOKS-RAIZ-GIT; misma clase que el fix de
|
|
11
|
+
* proteccion-rutas). La frontera correcta es la raíz del repositorio git,
|
|
12
|
+
* con una excepción: un sub-proyecto anidado que ya tiene su propio
|
|
13
|
+
* `.planning/` REAL (con marcadores de proyecto) conserva su árbol local.
|
|
14
|
+
*
|
|
15
|
+
* Reglas de resolución (en orden):
|
|
16
|
+
* 1. Ascendiendo desde `desde`, el primer directorio cuyo `.planning/`
|
|
17
|
+
* contiene un marcador de proyecto (PROYECTO.md, HOJA-RUTA.md,
|
|
18
|
+
* ESTADO.md) gana — respeta sub-proyectos legítimos en monorepos.
|
|
19
|
+
* Un `.planning/` sin marcadores (solo telemetría huérfana de hooks)
|
|
20
|
+
* NO cuenta: eso es el síntoma del bug, no un proyecto.
|
|
21
|
+
* 2. Si ningún nivel tiene `.planning/` real, gana la raíz del repo git
|
|
22
|
+
* (`.git` como directorio o como archivo — worktrees).
|
|
23
|
+
* 3. Sin `.git` alcanzable: fallback al propio `desde`.
|
|
24
|
+
*
|
|
25
|
+
* La ascensión se detiene en el HOME del usuario (sin incluirlo) cuando se
|
|
26
|
+
* llega ahí subiendo: un dotfiles-repo en `~` — o un `~/.planning` sembrado
|
|
27
|
+
* por `swl-ses doctor` en una instalación global — no debe capturar la
|
|
28
|
+
* memoria de un proyecto sin git que viva debajo. La comparación con el HOME
|
|
29
|
+
* se hace en forma CANÓNICA (realpath): en Windows `os.tmpdir()` puede
|
|
30
|
+
* devolver el nombre corto 8.3 (`C:\Users\SAUL~1.WAD`) mientras `os.homedir()`
|
|
31
|
+
* devuelve el largo (`C:\Users\saul.wade`); sin canonicalizar, la frontera no
|
|
32
|
+
* dispararía y capturaría `~/.planning` o `~/.git` (rompía 38 tests locales
|
|
33
|
+
* en Windows, verde en CI Linux porque `/tmp` no cuelga de `$HOME`).
|
|
34
|
+
*
|
|
35
|
+
* Zero-deps (regla de hooks/lib/). Consumidor inicial:
|
|
36
|
+
* hooks/extraccion-aprendizajes.js; la flota completa migró el 2026-07-10
|
|
37
|
+
* (cierre de DT-HOOKS-RAIZ-GIT).
|
|
38
|
+
*
|
|
39
|
+
* LÍMITE DE USO (hallazgo revisor-seguridad 2026-07-10): esta ancla es SOLO
|
|
40
|
+
* para DATOS (.planning/, instintos/, lecturas de config del proyecto).
|
|
41
|
+
* NUNCA resolver con ella EJECUTABLES ni módulos a require()/spawn(): la
|
|
42
|
+
* raíz resuelta pertenece al árbol del proyecto, y un repositorio no
|
|
43
|
+
* confiable puede plantar el script (marcador .planning/PROYECTO.md +
|
|
44
|
+
* scripts/x.js hostil = ejecución de código al disparar el hook). Los
|
|
45
|
+
* ejecutables de la distribución SWL se resuelven desde __dirname
|
|
46
|
+
* (ubicación instalada del hook). Test guardián:
|
|
47
|
+
* tests/hooks/ejecutables-desde-instalacion.test.js.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
const fs = require('fs');
|
|
51
|
+
const path = require('path');
|
|
52
|
+
const os = require('os');
|
|
53
|
+
|
|
54
|
+
const MARCADORES_PROYECTO = ['PROYECTO.md', 'HOJA-RUTA.md', 'ESTADO.md'];
|
|
55
|
+
const MAX_NIVELES = 40;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* ¿El directorio tiene un `.planning/` de proyecto real (no huérfano)?
|
|
59
|
+
* @param {string} dir
|
|
60
|
+
* @returns {boolean}
|
|
61
|
+
*/
|
|
62
|
+
function tienePlanningReal(dir) {
|
|
63
|
+
try {
|
|
64
|
+
return MARCADORES_PROYECTO.some(m =>
|
|
65
|
+
fs.existsSync(path.join(dir, '.planning', m))
|
|
66
|
+
);
|
|
67
|
+
} catch (_) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Canonicaliza un path resolviendo enlaces simbólicos y el nombre corto 8.3
|
|
74
|
+
* de Windows (`C:\Users\SAUL~1.WAD` → `C:\Users\saul.wade`). Solo se usa para
|
|
75
|
+
* la comparación de la frontera del HOME: el valor de RETORNO de raizProyecto
|
|
76
|
+
* conserva la forma del argumento recibido, no la canónica. Si el path no
|
|
77
|
+
* existe (no se puede resolver), cae a `path.resolve`.
|
|
78
|
+
* @param {string} p
|
|
79
|
+
* @returns {string}
|
|
80
|
+
*/
|
|
81
|
+
function canonicalizar(p) {
|
|
82
|
+
try {
|
|
83
|
+
return fs.realpathSync.native(p);
|
|
84
|
+
} catch (_) {
|
|
85
|
+
return path.resolve(p);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Ancla base: asciende desde `desde` buscando la raíz del proyecto (marcadores
|
|
91
|
+
* o `.git`), con frontera del HOME. Ver reglas de resolución en el docstring
|
|
92
|
+
* del módulo. Sin post-proceso de redirección (eso lo hace raizProyecto).
|
|
93
|
+
*
|
|
94
|
+
* @param {string} [desde] - Directorio de partida (default: process.cwd()).
|
|
95
|
+
* @returns {string} Ruta absoluta del ancla base.
|
|
96
|
+
*/
|
|
97
|
+
function _anclaBase(desde) {
|
|
98
|
+
const inicio = path.resolve(desde || process.cwd());
|
|
99
|
+
let actual = inicio;
|
|
100
|
+
let homedirCanon = null;
|
|
101
|
+
try {
|
|
102
|
+
homedirCanon = canonicalizar(path.resolve(os.homedir()));
|
|
103
|
+
} catch (_) { /* sin home resolvible — seguir sin el guard */ }
|
|
104
|
+
|
|
105
|
+
for (let i = 0; i < MAX_NIVELES; i++) {
|
|
106
|
+
// Frontera del HOME: si llegamos aquí ASCENDIENDO, no seguir — un
|
|
107
|
+
// dotfiles-repo (o un ~/.planning sembrado por doctor) en ~ no es la raíz
|
|
108
|
+
// de un proyecto que vive debajo. Comparación canónica: iguala el nombre
|
|
109
|
+
// corto 8.3 heredado de os.tmpdir() con el HOME largo de os.homedir().
|
|
110
|
+
if (homedirCanon && i > 0 && canonicalizar(actual) === homedirCanon) break;
|
|
111
|
+
|
|
112
|
+
if (tienePlanningReal(actual)) return actual;
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
if (fs.existsSync(path.join(actual, '.git'))) return actual;
|
|
116
|
+
} catch (_) {
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const padre = path.dirname(actual);
|
|
121
|
+
if (padre === actual) break; // raíz del filesystem
|
|
122
|
+
actual = padre;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return inicio;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Resuelve la raíz del proyecto a la que deben anclarse las escrituras
|
|
130
|
+
* de `.planning/`.
|
|
131
|
+
*
|
|
132
|
+
* Redirección de telemetría (fix 2026-07-15): si el ancla resuelta es el HOME
|
|
133
|
+
* del usuario y el HOME NO es un proyecto SWL real (solo un `.git` de dotfiles
|
|
134
|
+
* o un fallback sin proyecto), NINGÚN hook debe sembrar `.planning/` en la raíz
|
|
135
|
+
* del HOME — se contiene en `~/.claude/` (mismo scope que los backups del
|
|
136
|
+
* install global, A3). Esto arregla los 33 hooks que anclan vía esta función
|
|
137
|
+
* en un solo punto, sin tocarlos. Un proyecto SWL real EN el HOME (con
|
|
138
|
+
* marcadores de proyecto) se respeta.
|
|
139
|
+
*
|
|
140
|
+
* @param {string} [desde] - Directorio de partida (default: process.cwd()).
|
|
141
|
+
* @returns {string} Ruta absoluta de la raíz del proyecto (o ~/.claude si el
|
|
142
|
+
* HOME no es un proyecto).
|
|
143
|
+
*/
|
|
144
|
+
function raizProyecto(desde) {
|
|
145
|
+
const raiz = _anclaBase(desde);
|
|
146
|
+
let homedirCanon = null;
|
|
147
|
+
try {
|
|
148
|
+
homedirCanon = canonicalizar(path.resolve(os.homedir()));
|
|
149
|
+
} catch (_) {
|
|
150
|
+
return raiz; // sin home resolvible — no redirigir
|
|
151
|
+
}
|
|
152
|
+
if (canonicalizar(raiz) === homedirCanon && !tienePlanningReal(raiz)) {
|
|
153
|
+
try { return path.join(os.homedir(), '.claude'); } catch (_) { return raiz; }
|
|
154
|
+
}
|
|
155
|
+
return raiz;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
module.exports = { raizProyecto, tienePlanningReal, canonicalizar };
|