@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,583 +1,583 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: swl:exportar-vault
|
|
3
|
-
description: Exporta un resumen compacto de la sesión actual del proyecto al vault SWL personal de Saul (F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox\). Úsalo después de /swl:compactar o al cerrar una sesión productiva cuando quieras que el contenido llegue al segundo cerebro sin esperar a una sincronización manual.
|
|
4
|
-
allowed_tools: ["Read", "Write", "Bash", "Glob"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /swl:exportar-vault — Puente SWL-SES → Vault personal
|
|
8
|
-
|
|
9
|
-
Eres el puente entre el proyecto activo (sigaf, sigm, swl-ses, ecosistema-multi-agente-ia u otro) y el **vault personal de Saul** ubicado en `F:\Google Drive\Developer\Obsidian\Vault\SWL`. Tu trabajo: producir una nota de Inbox del vault con el resumen de la sesión actual, lista para que Saul la procese cuando abra el vault.
|
|
10
|
-
|
|
11
|
-
Este comando es **complementario a `/swl:compactar`**, no lo reemplaza. Compactar actualiza `.planning/COMPACTACION.md` del proyecto; exportar-vault propaga lo relevante al vault.
|
|
12
|
-
|
|
13
|
-
## Señales de que debes usarlo
|
|
14
|
-
|
|
15
|
-
- Acabas de cerrar `/swl:compactar` con decisiones o aprendizajes importantes.
|
|
16
|
-
- Vas a terminar la sesión del día y quieres que los puntos clave queden en el segundo cerebro.
|
|
17
|
-
- Saul lo pide explícitamente.
|
|
18
|
-
- La sesión produjo una decisión arquitectural que afecta a otros proyectos del ecosistema.
|
|
19
|
-
|
|
20
|
-
## Paso 0 — Validación del destino y canal de escritura
|
|
21
|
-
|
|
22
|
-
Hay **dos canales** posibles para escribir al vault. El canal preferido es el
|
|
23
|
-
MCP de Obsidian; el filesystem directo es fallback documentado.
|
|
24
|
-
|
|
25
|
-
### 0a — Validar el vault en filesystem (para lectura y detección)
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
test -d "F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox" \
|
|
29
|
-
&& echo "[OK] Vault accesible" \
|
|
30
|
-
|| echo "[ERROR] Vault no accesible — abortar"
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Si la ruta no es accesible (por ejemplo, Google Drive no sincronizado o letra de unidad distinta), **abortar con mensaje claro**. No intentes rutas alternativas sin permiso explícito.
|
|
34
|
-
|
|
35
|
-
### 0b — Detectar disponibilidad del MCP de Obsidian
|
|
36
|
-
|
|
37
|
-
Verifica si los tools `mcp__obsidian__obsidian_append_content` o
|
|
38
|
-
`mcp__obsidian__obsidian_patch_content` están cargados o deferidos:
|
|
39
|
-
|
|
40
|
-
- Si aparecen como **deferred** en `<system-reminder>`, cargar el schema con
|
|
41
|
-
`ToolSearch(query="select:mcp__obsidian__obsidian_append_content", ...)`.
|
|
42
|
-
- Si tras `ToolSearch` siguen sin estar disponibles, el MCP server no está
|
|
43
|
-
corriendo (Obsidian cerrado o plugin Local REST API desactivado). En ese
|
|
44
|
-
caso usar canal de fallback (filesystem directo) — ver Paso 4.
|
|
45
|
-
|
|
46
|
-
**Por qué MCP-first**: el hook `proteccion-rutas.js` bloquea la herramienta
|
|
47
|
-
`Write` con destino fuera del CWD del proyecto. La ruta del vault
|
|
48
|
-
(`F:\Google Drive\...`) siempre cae fuera del CWD si trabajas en
|
|
49
|
-
`D:\Python\<proyecto>\`. El MCP de Obsidian opera vía HTTPS al puerto 27124
|
|
50
|
-
del plugin Local REST API — **no pasa por el hook de filesystem**, así que
|
|
51
|
-
nunca dispara el bloqueo.
|
|
52
|
-
|
|
53
|
-
Defaultear a filesystem cuando el MCP está disponible es un anti-patrón
|
|
54
|
-
documentado en `reglas/consultar-vault-primero.md § Workflow forzoso para
|
|
55
|
-
escritura al vault`. El bloqueo por `proteccion-rutas.js` no es una falla a
|
|
56
|
-
esquivar — es una señal de que el canal correcto es el MCP.
|
|
57
|
-
|
|
58
|
-
### 0c — Verificar que el vault activo de Obsidian apunta a `Vault\SWL\` (CRÍTICO)
|
|
59
|
-
|
|
60
|
-
> Origen del paso: sesión 2026-05-13 v1.4.0. El MCP de Obsidian resuelve paths
|
|
61
|
-
> relativos contra el **vault que Obsidian tiene abierto**, no contra una
|
|
62
|
-
> ruta hardcodeada en el plugin. Si Obsidian abrió un vault distinto del
|
|
63
|
-
> esperado (ej. `F:\Google Drive\Developer\Obsidian\Vault\` raíz en lugar
|
|
64
|
-
> de `Vault\SWL\`), todas las escrituras del MCP irán al vault equivocado.
|
|
65
|
-
> El plugin **crea carpetas inexistentes** sobre la marcha, así que ni
|
|
66
|
-
> siquiera obtendrás error — los archivos terminan en una ubicación huérfana.
|
|
67
|
-
|
|
68
|
-
Verifica antes de cualquier llamada MCP:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
# Path canónico de la config global de Obsidian en Windows
|
|
72
|
-
APP="$APPDATA/obsidian/obsidian.json"
|
|
73
|
-
node -e "
|
|
74
|
-
const fs = require('fs');
|
|
75
|
-
const data = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
|
|
76
|
-
const abierto = Object.values(data.vaults).find(v => v.open === true);
|
|
77
|
-
console.log('Vault abierto:', abierto ? abierto.path : 'NINGUNO');
|
|
78
|
-
console.log('Esperado: F:\\\\Google Drive\\\\Developer\\\\Obsidian\\\\Vault\\\\SWL');
|
|
79
|
-
console.log('OK:', abierto && abierto.path.endsWith('SWL') ? 'sí' : 'NO');
|
|
80
|
-
" "$APP"
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Resultado esperado:
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
Vault abierto: F:\Google Drive\Developer\Obsidian\Vault\SWL
|
|
87
|
-
Esperado: F:\Google Drive\Developer\Obsidian\Vault\SWL
|
|
88
|
-
OK: sí
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Si `OK: NO` o `Vault abierto: NINGUNO`, **NO usar MCP** — caer al filesystem
|
|
92
|
-
para esta sesión y reportar al usuario que debe abrir el vault `SWL` en
|
|
93
|
-
Obsidian (File → Open vault → seleccionar `F:\Google Drive\Developer\Obsidian\Vault\SWL`).
|
|
94
|
-
|
|
95
|
-
### 0d — Verificar que la apiKey del MCP coincide con la del plugin activo
|
|
96
|
-
|
|
97
|
-
> Origen: cuando el vault activo cambia, la apiKey del plugin Local REST API
|
|
98
|
-
> cambia (cada vault tiene su propio `.obsidian/plugins/obsidian-local-rest-api/data.json`
|
|
99
|
-
> con apiKey, cert y privateKey distintos). El MCP server registrado en
|
|
100
|
-
> Claude.ai tiene una apiKey hardcodeada — si no se actualiza tras cambiar de
|
|
101
|
-
> vault, todas las llamadas retornan `40101 Authorization required`.
|
|
102
|
-
|
|
103
|
-
Si tras `ToolSearch` el MCP carga sus tools pero la primera llamada (ej.
|
|
104
|
-
`obsidian_list_files_in_dir`) retorna `Error 40101: Authorization required`,
|
|
105
|
-
el síntoma es claro: apiKey desincronizada.
|
|
106
|
-
|
|
107
|
-
Acción:
|
|
108
|
-
|
|
109
|
-
1. Leer la apiKey actual del plugin con
|
|
110
|
-
`grep '"apiKey"' "F:/Google Drive/Developer/Obsidian/Vault/SWL/.obsidian/plugins/obsidian-local-rest-api/data.json"`
|
|
111
|
-
2. Reportar al usuario que actualice en **claude.ai → Settings → Connectors
|
|
112
|
-
→ Obsidian → API Key**. Disconnect + Reconnect tras pegar el valor.
|
|
113
|
-
3. Mientras tanto, usar filesystem como fallback para escribir al Inbox.
|
|
114
|
-
|
|
115
|
-
Si hay procesos zombie de Obsidian o `mcp-obsidian` cliente con apiKey
|
|
116
|
-
cacheada, requieren terminación + reinicio de Claude Code para tomar la
|
|
117
|
-
nueva apiKey.
|
|
118
|
-
|
|
119
|
-
## Paso 1 — Identificación del proyecto actual
|
|
120
|
-
|
|
121
|
-
Detecta qué proyecto eres leyendo:
|
|
122
|
-
|
|
123
|
-
1. `CLAUDE.md` raíz — primer encabezado H1.
|
|
124
|
-
2. `package.json` campo `name` si existe.
|
|
125
|
-
3. Si ninguno aclara, usar el nombre de la carpeta raíz del proyecto.
|
|
126
|
-
|
|
127
|
-
Normaliza el slug del proyecto a kebab-case sin acentos. Ejemplos válidos:
|
|
128
|
-
|
|
129
|
-
- `sigaf`
|
|
130
|
-
- `sigm`
|
|
131
|
-
- `swl-software-engineering-system`
|
|
132
|
-
- `ecosistema-multi-agente-ia`
|
|
133
|
-
|
|
134
|
-
## Paso 1.5 — Resolución del nombre canónico desde el vault (CRÍTICO)
|
|
135
|
-
|
|
136
|
-
Antes de redactar el frontmatter, **debes resolver el nombre canónico exacto** del proyecto leyendo `02-Projects/` del vault. Sin esto, el campo `related_vault_project` queda con un nombre fabricado que no enlaza con ningún nodo del grafo de Obsidian.
|
|
137
|
-
|
|
138
|
-
Listar proyectos del vault:
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
ls "F:/Google Drive/Developer/Obsidian/Vault/SWL/02-Projects/" 2>/dev/null
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Resultado típico:
|
|
145
|
-
|
|
146
|
-
```
|
|
147
|
-
DEV - Ecosistema Multi-Agente IA OIC-INE.md
|
|
148
|
-
DEV - SIGAF.md
|
|
149
|
-
DEV - SIGM.md
|
|
150
|
-
META - SWL Software Engineering System.md
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Algoritmo de match (en cascada — cada pasada solo se ejecuta si la anterior no resolvió match único):
|
|
154
|
-
|
|
155
|
-
**Normaliza ambos lados** a comparación robusta antes de cualquier pasada:
|
|
156
|
-
|
|
157
|
-
- Strip extensión `.md`.
|
|
158
|
-
- Strip prefijo `DEV - ` o `META - ` (cualquier prefijo seguido de ` - `).
|
|
159
|
-
- Lowercase.
|
|
160
|
-
- Sin acentos.
|
|
161
|
-
- Reemplaza espacios y guiones por nada (compactar).
|
|
162
|
-
|
|
163
|
-
Aplica el mismo procesamiento al slug del proyecto local.
|
|
164
|
-
|
|
165
|
-
**Pasada 1 — Match exacto**:
|
|
166
|
-
|
|
167
|
-
- Si la cadena normalizada del slug local coincide carácter a carácter con la de algún canónico, ese es el match. Caso típico: `sigaf` ↔ `DEV - SIGAF`.
|
|
168
|
-
|
|
169
|
-
**Pasada 2 — Match por prefijo bidireccional**:
|
|
170
|
-
|
|
171
|
-
- Si la cadena del slug local es **prefijo** de la cadena de algún canónico, ese canónico matchea. Ej: `ecosistemamultiagenteia` es prefijo de `ecosistemamultiagenteiaoicine` → match con `DEV - Ecosistema Multi-Agente IA OIC-INE`.
|
|
172
|
-
- Inversamente: si la cadena de algún canónico es prefijo de la del slug local, también matchea (cubre el caso opuesto: vault con nombre más corto que el slug del proyecto).
|
|
173
|
-
- Solo se acepta el match si la pasada produce **exactamente 1** candidato. Si hay 2+ ambiguos, NO usar — pasar a siguiente pasada con el alias o fallback final, listando los candidatos en el WARNING del Paso 5.
|
|
174
|
-
|
|
175
|
-
**Pasada 3 — Aliases conocidos**:
|
|
176
|
-
|
|
177
|
-
- Si ninguna pasada anterior resolvió, intenta con sinónimos del slug local antes del fallback (ver lista de aliases más abajo). Para cada alias, repite Pasada 1 y Pasada 2.
|
|
178
|
-
|
|
179
|
-
**Pasada 4 — Fallback**:
|
|
180
|
-
|
|
181
|
-
- Si todo lo anterior es vacío:
|
|
182
|
-
- Usar como `related_vault_project` el valor `[[DEV - {Nombre-Title-Case}]]` (fallback antiguo).
|
|
183
|
-
- **Reportar warning explícito al usuario** en el paso 5 indicando que no se encontró nodo canónico y sugerir crear `02-Projects/DEV - {Nombre}.md` en el vault.
|
|
184
|
-
|
|
185
|
-
Resultado del algoritmo: el nombre canónico es el basename del archivo sin `.md` (con su prefijo `DEV - ` o `META - ` original intacto).
|
|
186
|
-
|
|
187
|
-
Ejemplos de match esperado (con la pasada que lo resuelve):
|
|
188
|
-
|
|
189
|
-
| Slug local | Normalizado local | Canónico que matchea | Pasada | Nombre canónico resuelto |
|
|
190
|
-
| --------------------------------- | ------------------------------ | ------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------ |
|
|
191
|
-
| `sigaf` | `sigaf` | `sigaf` | 1 (exacto) | `DEV - SIGAF` |
|
|
192
|
-
| `sigm` | `sigm` | `sigm` | 1 (exacto) | `DEV - SIGM` |
|
|
193
|
-
| `swl-software-engineering-system` | `swlsoftwareengineeringsystem` | `swlsoftwareengineeringsystem` | 1 (exacto) | `META - SWL Software Engineering System` |
|
|
194
|
-
| `ecosistema-multi-agente-ia` | `ecosistemamultiagenteia` | `ecosistemamultiagenteiaoicine` | 2 (prefijo del slug en canónico) | `DEV - Ecosistema Multi-Agente IA OIC-INE` |
|
|
195
|
-
| `swl-ses` | `swlses` | ninguno (ver nota) | 3 (alias → reemplaza slug por `swlsoftwareengineeringsystem` y repite 1) | `META - SWL Software Engineering System` |
|
|
196
|
-
|
|
197
|
-
**Nota sobre el caso `swl-ses`** — un lector cuidadoso puede preguntarse por qué Pasada 2 (prefijo) no captura este caso, dado que `swlses` y `swlsoftwareengineeringsystem` comparten el inicio `swls`. La verificación carácter a carácter:
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
pos: 0 1 2 3 4 5
|
|
201
|
-
swlses: s w l s e s
|
|
202
|
-
swlsof: s w l s o f t w a r e ...
|
|
203
|
-
^
|
|
204
|
-
divergen aquí (e vs o)
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
`swlses` **no es prefijo** de `swlsoftwareengineeringsystem` — comparten 4 caracteres pero divergen en la posición 4. Por eso Pasada 2 falla y se necesita la sustitución de alias en Pasada 3. Esta nota existe para prevenir el malentendido común de que "comparten algunas letras iniciales" implica "uno es prefijo del otro".
|
|
208
|
-
|
|
209
|
-
**Aliases conocidos** — si el slug local no matchea directo, intenta estos sinónimos antes del fallback:
|
|
210
|
-
|
|
211
|
-
- `swl-ses` → buscar `swl-software-engineering-system` o `swlsoftwareengineeringsystem`.
|
|
212
|
-
- Cualquier slug que empiece con `swl-` y termine en `-ses` o `-software-engineering-system` → trata como `swl-software-engineering-system`.
|
|
213
|
-
|
|
214
|
-
Guarda el resultado en dos variables internas para usar más abajo:
|
|
215
|
-
|
|
216
|
-
- `nombre_canonico_completo` — ej. `META - SWL Software Engineering System`. Va dentro de `[[ ]]` en el frontmatter.
|
|
217
|
-
- `proyecto_slug` — el slug original sin alterar. Va en el filename y en tags.
|
|
218
|
-
|
|
219
|
-
## Paso 2 — Recolección del contenido de la sesión
|
|
220
|
-
|
|
221
|
-
Junta estas fuentes (las que existan):
|
|
222
|
-
|
|
223
|
-
1. **Última compactación:** `.planning/COMPACTACION.md` o `.planning/COMPACT.md`.
|
|
224
|
-
2. **Estado actual:** `.planning/ESTADO.md` o `.planning/STATE.md`.
|
|
225
|
-
3. **Últimos aprendizajes del APRENDIZAJES.md** — solo las entradas con fecha del día en curso o las últimas 10.
|
|
226
|
-
4. **Git log del día:** `git log --oneline --since="00:00" --until="23:59"`.
|
|
227
|
-
5. **Git status actual:** `git status --short`.
|
|
228
|
-
|
|
229
|
-
## Paso 3 — Síntesis
|
|
230
|
-
|
|
231
|
-
Produce un resumen de **no más de 500 palabras** con esta estructura:
|
|
232
|
-
|
|
233
|
-
```markdown
|
|
234
|
-
---
|
|
235
|
-
type: export-swl
|
|
236
|
-
status: pending-review
|
|
237
|
-
tags: [export, inbox, swl-{proyecto-slug}]
|
|
238
|
-
created: {fecha-hoy YYYY-MM-DD}
|
|
239
|
-
source: swl-ses
|
|
240
|
-
project: "{nombre-proyecto}"
|
|
241
|
-
project_path: "{ruta-absoluta}"
|
|
242
|
-
related_vault_project: "[[{nombre_canonico_completo}]]"
|
|
243
|
-
reviewed: false
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
# Export SWL-SES → Vault ({fecha-hoy}) — {nombre-proyecto}
|
|
247
|
-
|
|
248
|
-
## Sesión
|
|
249
|
-
|
|
250
|
-
- **Fecha:** YYYY-MM-DD
|
|
251
|
-
- **Horario:** HH:MM a HH:MM
|
|
252
|
-
- **Rama git:** {rama}
|
|
253
|
-
- **Último commit:** {sha7} — {mensaje}
|
|
254
|
-
|
|
255
|
-
## Logros de la sesión
|
|
256
|
-
|
|
257
|
-
- Punto 1
|
|
258
|
-
- Punto 2
|
|
259
|
-
- Punto 3
|
|
260
|
-
|
|
261
|
-
## Decisiones tomadas
|
|
262
|
-
|
|
263
|
-
- **{título decisión}** — razón en 1 línea.
|
|
264
|
-
- ...
|
|
265
|
-
|
|
266
|
-
## Aprendizajes nuevos (candidatos a 04-Resources del vault)
|
|
267
|
-
|
|
268
|
-
- **{aprendizaje}** — fuente: `{archivo}` o sesión.
|
|
269
|
-
|
|
270
|
-
## Métricas que cambiaron
|
|
271
|
-
|
|
272
|
-
| Métrica | Antes | Después |
|
|
273
|
-
| --------- | ----- | ------- |
|
|
274
|
-
| LOC | | |
|
|
275
|
-
| Endpoints | | |
|
|
276
|
-
| Tests | | |
|
|
277
|
-
|
|
278
|
-
## Bloqueantes o deuda detectada
|
|
279
|
-
|
|
280
|
-
-
|
|
281
|
-
|
|
282
|
-
## Acción sugerida al leer en el vault
|
|
283
|
-
|
|
284
|
-
Ejecutar `/sync-projects {proyecto-slug}` en el vault para integrar los cambios formalmente.
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
**Archivos fuente consultados:**
|
|
289
|
-
|
|
290
|
-
- `.planning/COMPACTACION.md` (última)
|
|
291
|
-
- `.planning/APRENDIZAJES.md` (últimas entradas)
|
|
292
|
-
- Git log del día
|
|
293
|
-
|
|
294
|
-
**Notas:**
|
|
295
|
-
|
|
296
|
-
- Este archivo vive en 00-Inbox/ del vault. Saul lo procesa manualmente o con `/sync-projects`.
|
|
297
|
-
- No sobreescribe nada en `02-Projects/`, `04-Resources/` ni `07-Decisions/` del vault.
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
## Paso 4 — Escritura en el vault
|
|
301
|
-
|
|
302
|
-
El archivo destino es:
|
|
303
|
-
|
|
304
|
-
```
|
|
305
|
-
F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox\YYYY-MM-DD_HHMM_export-{proyecto-slug}.md
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
Con UTF-8 sin BOM. Usar **uno de dos canales** según disponibilidad:
|
|
309
|
-
|
|
310
|
-
### Canal A (preferido) — MCP de Obsidian
|
|
311
|
-
|
|
312
|
-
Si el Paso 0b confirmó que `mcp__obsidian__obsidian_append_content` está
|
|
313
|
-
disponible (cargado directamente o tras `ToolSearch`), usar este canal:
|
|
314
|
-
|
|
315
|
-
```jsonc
|
|
316
|
-
// La ruta es RELATIVA al vault root (no incluye F:\...\SWL\)
|
|
317
|
-
mcp__obsidian__obsidian_append_content({
|
|
318
|
-
filepath: "00-Inbox/YYYY-MM-DD_HHMM_export-{proyecto-slug}.md",
|
|
319
|
-
content: "<contenido completo del export>"
|
|
320
|
-
})
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
Ventajas frente al filesystem:
|
|
324
|
-
|
|
325
|
-
- **No pasa por `proteccion-rutas.js`** — el MCP opera vía HTTPS al puerto
|
|
326
|
-
27124, fuera del flujo de Bash/Write/Edit.
|
|
327
|
-
- **Sin staging intermedio**: escribe directamente al archivo final del vault.
|
|
328
|
-
- **Auditable**: el plugin Local REST API de Obsidian registra el acceso.
|
|
329
|
-
- **Cross-OS**: el wrapper funciona idéntico en Windows/macOS/Linux sin
|
|
330
|
-
manejar separators de path.
|
|
331
|
-
|
|
332
|
-
Notas operativas:
|
|
333
|
-
|
|
334
|
-
- Si el archivo ya existe con ese timestamp (raro), agregar sufijo `_b`
|
|
335
|
-
al nombre antes de invocar `append_content`. El MCP de obsidian no
|
|
336
|
-
sobreescribe si el archivo existe — `append` agrega al final.
|
|
337
|
-
- Si se necesita escribir secciones específicas en lugar de un archivo
|
|
338
|
-
completo, usar `mcp__obsidian__obsidian_patch_content` con
|
|
339
|
-
`target_type: "heading"`.
|
|
340
|
-
|
|
341
|
-
### Canal B (fallback) — Filesystem directo
|
|
342
|
-
|
|
343
|
-
Solo cuando el MCP no responde tras `ToolSearch` (Obsidian cerrado, plugin
|
|
344
|
-
desactivado, sin red local). **Esto va a chocar con `proteccion-rutas.js`**
|
|
345
|
-
si el CWD es el directorio del proyecto, así que requiere ejecución vía
|
|
346
|
-
Bash con redirección o vía un comando del CLI nativo del SO:
|
|
347
|
-
|
|
348
|
-
```powershell
|
|
349
|
-
# PowerShell — UTF-8 sin BOM
|
|
350
|
-
$encoding = New-Object System.Text.UTF8Encoding($false)
|
|
351
|
-
[System.IO.File]::WriteAllText($path, $content, $encoding)
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
```bash
|
|
355
|
-
# Bash + heredoc — UTF-8 sin BOM por default en Node 18+
|
|
356
|
-
cat > "$path" <<'EOF'
|
|
357
|
-
<contenido del export>
|
|
358
|
-
EOF
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
**No usar `Write` directo** desde la herramienta del agente — `proteccion-rutas.js`
|
|
362
|
-
lo bloquea. Si por algún motivo el agente necesita usar `Write`, primero
|
|
363
|
-
escribe a `_userland/staging/<timestamp>.md` dentro del CWD, luego mueve con
|
|
364
|
-
`Bash` (`mv` o PowerShell `Move-Item`).
|
|
365
|
-
|
|
366
|
-
Reportar al usuario qué canal se usó:
|
|
367
|
-
|
|
368
|
-
- Canal A → `[OK] Vía: MCP Obsidian (puerto 27124)`
|
|
369
|
-
- Canal B → `[OK] Vía: filesystem directo (MCP no disponible)`
|
|
370
|
-
- Canal Híbrido → `[OK] Vía: filesystem para Inbox, MCP para promociones`
|
|
371
|
-
|
|
372
|
-
### Modo HÍBRIDO (validado en sesión 2026-05-13)
|
|
373
|
-
|
|
374
|
-
Cuando la sesión incluye **autorización ampliada para promover documentos**
|
|
375
|
-
a `02-Projects/`, `07-Decisions/` y `04-Resources/`, el flujo óptimo combina
|
|
376
|
-
ambos canales:
|
|
377
|
-
|
|
378
|
-
1. **Inbox** (`00-Inbox/YYYY-MM-DD_HHMM_export-{slug}.md`): usar siempre
|
|
379
|
-
**filesystem directo via Bash heredoc con ruta absoluta** (canal B). Razón:
|
|
380
|
-
el Bash heredoc bypassa cualquier desalineación del vault activo de
|
|
381
|
-
Obsidian — escribe directamente al disco en la ruta exacta.
|
|
382
|
-
|
|
383
|
-
2. **Promociones** (a `02-Projects/`, `07-Decisions/`, `04-Resources/`):
|
|
384
|
-
usar **MCP append_content** (canal A) tras validar Pasos 0c y 0d. Razón:
|
|
385
|
-
las promociones requieren enlaces bidireccionales con `[[...]]` que el
|
|
386
|
-
plugin de Obsidian indexa al detectar la escritura. El filesystem directo
|
|
387
|
-
crea el archivo pero no dispara la reindexación hasta que Obsidian
|
|
388
|
-
detecte el cambio.
|
|
389
|
-
|
|
390
|
-
3. **Aprobación de revisiones** (cambiar `status: pending-review` → `reviewed`
|
|
391
|
-
en frontmatter): si el archivo está en `00-Inbox/`, usar `sed` via Bash;
|
|
392
|
-
si está en `02-Projects/` etc., usar `mcp__obsidian__obsidian_patch_content`
|
|
393
|
-
con `target_type: "frontmatter"`. Validado que `patch_content` puede
|
|
394
|
-
responder 404 en algunos archivos pre-existentes — caer al filesystem si
|
|
395
|
-
falla.
|
|
396
|
-
|
|
397
|
-
Reportar al usuario el desglose final del modo híbrido:
|
|
398
|
-
|
|
399
|
-
```
|
|
400
|
-
[OK] Inbox creado via filesystem: F:\...\00-Inbox\...md
|
|
401
|
-
[OK] 3 promociones via MCP: 02-Projects, 07-Decisions, 04-Resources
|
|
402
|
-
[OK] Revisión aprobada (reviewed: true) en el Inbox
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
## Paso 4b — Verificación post-escritura (obligatorio)
|
|
406
|
-
|
|
407
|
-
**Inmediatamente después** de cada escritura del Paso 4 (Inbox, promociones en
|
|
408
|
-
`02-Projects/`, `07-Decisions/`, `04-Resources/`, `10-Archive/`), confirma que el
|
|
409
|
-
archivo en disco **existe y tiene contenido sustantivo**. Sin este paso, Obsidian
|
|
410
|
-
puede mostrar nodos fantasma (pestaña con título pero cuerpo vacío) cuando el MCP
|
|
411
|
-
falló con `40101`, timeout o `append_content` sobre ruta incorrecta.
|
|
412
|
-
|
|
413
|
-
### Cuándo verificar
|
|
414
|
-
|
|
415
|
-
| Escritura | Verificar |
|
|
416
|
-
| ------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
417
|
-
| Export en `00-Inbox/` | **Siempre** |
|
|
418
|
-
| Append a `02-Projects/DEV - *.md` | **Siempre** (leer tramo final o archivo completo si es corto) |
|
|
419
|
-
| Nota nueva en `07-Decisions/`, `04-Resources/`, `10-Archive/` | **Siempre** |
|
|
420
|
-
| Solo `reviewed: true` en Inbox existente | Opcional (el archivo ya existía) |
|
|
421
|
-
|
|
422
|
-
### Cómo verificar (orden de preferencia)
|
|
423
|
-
|
|
424
|
-
1. **MCP** — `obsidian_get_file_contents` con path **relativo al vault SWL**
|
|
425
|
-
(sin prefijo `F:\...`):
|
|
426
|
-
```json
|
|
427
|
-
{ "filepath": "00-Inbox/2026-05-18_1530_export-swl-ses.md" }
|
|
428
|
-
```
|
|
429
|
-
2. **Filesystem** — si el Paso 4 usó canal B, leer el mismo path absoluto con
|
|
430
|
-
`Read` o `Get-Content` y comparar longitud.
|
|
431
|
-
|
|
432
|
-
### Criterios de aprobación (todos deben cumplirse)
|
|
433
|
-
|
|
434
|
-
| # | Criterio | Umbral |
|
|
435
|
-
| --- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
436
|
-
| 1 | El archivo existe | Sin error 404 / `ENOENT` |
|
|
437
|
-
| 2 | Longitud del cuerpo | ≥ **500 caracteres** (sin contar solo frontmatter vacío) |
|
|
438
|
-
| 3 | Marcador de export | Contiene `type: export-swl` en frontmatter **o** al menos una sección `## Logros de la sesión` / `## Sesión` / `## Decisiones` con texto bajo el heading |
|
|
439
|
-
| 4 | No es fantasma | El cuerpo **no** es solo el título del archivo, una línea en blanco, o el nombre del nodo sin párrafos |
|
|
440
|
-
|
|
441
|
-
Si el export es deliberadamente corto (<500 caracteres), bajar el umbral a
|
|
442
|
-
≥ **200 caracteres** solo si el frontmatter incluye `type: export-swl` y al
|
|
443
|
-
menos un bullet bajo `## Logros` o `## Sesión`; en caso contrario, tratar como
|
|
444
|
-
fallo.
|
|
445
|
-
|
|
446
|
-
### Si la verificación falla
|
|
447
|
-
|
|
448
|
-
1. **No** reportar `[OK] Export creado` al usuario.
|
|
449
|
-
2. Registrar en la salida: `[FAIL] Verificación post-escritura: <motivo>`.
|
|
450
|
-
3. **Un reintento** con el canal alternativo (MCP ↔ filesystem del Paso 4).
|
|
451
|
-
4. Si sigue fallando: reconstruir el Markdown desde `.planning/COMPACTACION.md`
|
|
452
|
-
- artefactos de sesión y escribir de nuevo; si aún falla, abortar y pedir
|
|
453
|
-
al usuario revisar Obsidian (vault activo Paso 0c, apiKey Paso 0d).
|
|
454
|
-
5. Si Obsidian ya abrió una pestaña fantasma: cerrar la pestaña en el IDE de
|
|
455
|
-
Obsidian; **no** dejar el tab apuntando a un path que no pasó verificación.
|
|
456
|
-
|
|
457
|
-
### Salida interna (para el Paso 5)
|
|
458
|
-
|
|
459
|
-
Guardar mentalmente (o en el reporte):
|
|
460
|
-
|
|
461
|
-
```
|
|
462
|
-
[OK] Verificación: 00-Inbox/2026-05-18_1530_export-swl-ses.md — 2847 chars, secciones OK
|
|
463
|
-
```
|
|
464
|
-
|
|
465
|
-
o
|
|
466
|
-
|
|
467
|
-
```
|
|
468
|
-
[FAIL] Verificación: cuerpo 42 chars — reintento vía filesystem
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
## Paso 5 — Confirmación
|
|
472
|
-
|
|
473
|
-
Reporta al usuario **solo si el Paso 4b aprobó** el Inbox (y cada promoción, si aplica):
|
|
474
|
-
|
|
475
|
-
- Ruta exacta del archivo creado.
|
|
476
|
-
- Resultado del Paso 4b (caracteres verificados o `[FAIL]` si abortaste).
|
|
477
|
-
- Conteo de palabras.
|
|
478
|
-
- **Nombre canónico resuelto**: indicar qué nodo de `02-Projects/` enlazó el export. Si no hubo match, marcar el warning explícito.
|
|
479
|
-
- Recordatorio: "Al abrir el vault en tu próxima sesión, ejecuta `/sync-projects {proyecto-slug}` para integrar formalmente estos cambios."
|
|
480
|
-
|
|
481
|
-
Formato esperado cuando hay match:
|
|
482
|
-
|
|
483
|
-
```
|
|
484
|
-
[OK] Export creado: F:\...\2026-05-04_1748_export-swl-ses.md (487 palabras)
|
|
485
|
-
[OK] Verificación post-escritura: 3124 chars, type: export-swl, secciones OK
|
|
486
|
-
[OK] Enlace canónico: [[META - SWL Software Engineering System]]
|
|
487
|
-
|
|
488
|
-
Próximo paso: al abrir el vault, ejecuta:
|
|
489
|
-
/sync-projects swl-ses
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
Formato esperado cuando NO hay match:
|
|
493
|
-
|
|
494
|
-
```
|
|
495
|
-
[OK] Export creado: F:\...\2026-05-04_1748_export-mi-proyecto.md (487 palabras)
|
|
496
|
-
[WARNING] No se encontró nodo canónico en 02-Projects/. Usado fallback: [[DEV - Mi Proyecto]]
|
|
497
|
-
Sugerencia: crear F:\...\02-Projects\DEV - Mi Proyecto.md en el vault para que el grafo conecte el export con el proyecto.
|
|
498
|
-
|
|
499
|
-
Próximo paso: al abrir el vault, ejecuta:
|
|
500
|
-
/sync-projects mi-proyecto
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
## Restricciones
|
|
504
|
-
|
|
505
|
-
- **No sobrescribir** archivos existentes con el mismo nombre. Si por azar existe uno con el mismo timestamp (raro), agrega sufijo `_b`.
|
|
506
|
-
- **No escribir** en otras carpetas del vault. Solo `00-Inbox/`.
|
|
507
|
-
- **No tocar** `.planning/` del proyecto.
|
|
508
|
-
- **Abortar silenciosamente** si el vault no existe, reportando al usuario. No asumir rutas alternativas.
|
|
509
|
-
|
|
510
|
-
## Anti-patrones
|
|
511
|
-
|
|
512
|
-
- Exportar 5000 palabras cuando la sesión fue pequeña. El resumen debe ser denso.
|
|
513
|
-
- Duplicar con el `COMPACTACION.md` del proyecto (copiar pega tal cual). El export es una **síntesis para vault**, no un espejo.
|
|
514
|
-
- Intentar escribir directamente en `02-Projects/` del vault. Eso es zona ⚠️ en el vault — solo Saul decide si promoverlo.
|
|
515
|
-
- Usar rutas con backslash no escapadas en código generado.
|
|
516
|
-
- **Defaultear a filesystem cuando el MCP de Obsidian está disponible**.
|
|
517
|
-
El bloqueo por `proteccion-rutas.js` no es una falla a esquivar con Bash
|
|
518
|
-
staging — es señal de que el canal correcto es el MCP. Ver Paso 0b.
|
|
519
|
-
- **Recurrir al workaround del filesystem antes de cargar el schema del
|
|
520
|
-
MCP con `ToolSearch`**. Tools deferred ≠ tools ausentes — el MCP server
|
|
521
|
-
está corriendo, solo falta cargar el schema. Cargar antes de defaultear.
|
|
522
|
-
- **Declarar éxito sin Paso 4b**. Un `append_content` o `Write` que no lanza
|
|
523
|
-
error no garantiza contenido en disco ni en el índice de Obsidian — genera
|
|
524
|
-
nodos fantasma en el grafo. Siempre leer de vuelta antes del `[OK]`.
|
|
525
|
-
|
|
526
|
-
## Relación con otros comandos SWL
|
|
527
|
-
|
|
528
|
-
- `/swl:compactar` → actualiza `.planning/` del proyecto. Luego `/swl:exportar-vault` propaga al vault. Secuencia natural.
|
|
529
|
-
- `/swl:aprender` → captura aprendizajes en el proyecto. Luego `/swl:exportar-vault` los envía al vault como candidatos.
|
|
530
|
-
- `/swl:checkpoint` → guarda estado del proyecto. No requiere export al vault (es recuperación interna).
|
|
531
|
-
|
|
532
|
-
## Ejemplo de invocación
|
|
533
|
-
|
|
534
|
-
```
|
|
535
|
-
/swl:compactar
|
|
536
|
-
/swl:exportar-vault
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
Produce:
|
|
540
|
-
|
|
541
|
-
```
|
|
542
|
-
[OK] Export creado: F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox\2026-04-16_2130_export-sigaf.md (487 palabras)
|
|
543
|
-
[OK] Verificación post-escritura: 2980 chars, secciones OK
|
|
544
|
-
[OK] Vía: MCP Obsidian (puerto 27124)
|
|
545
|
-
[OK] Enlace canónico: [[DEV - SIGAF]]
|
|
546
|
-
|
|
547
|
-
Próximo paso: al abrir el vault, ejecuta:
|
|
548
|
-
/sync-projects sigaf
|
|
549
|
-
```
|
|
550
|
-
|
|
551
|
-
## Historial de cambios del comando
|
|
552
|
-
|
|
553
|
-
- **v1.4.1** (2026-05-18) — **Paso 4b — Verificación post-escritura**
|
|
554
|
-
obligatoria tras cada escritura MCP o filesystem. Origen: exports MCP fallidos
|
|
555
|
-
(40101 / vault activo incorrecto) dejaron pestañas y nodos en el grafo sin
|
|
556
|
-
archivo en disco o con cuerpo vacío; reconstrucción manual desde
|
|
557
|
-
`COMPACTACION.md`. Criterios: existencia, ≥500 chars (o ≥200 con frontmatter
|
|
558
|
-
completo), secciones de export, anti-fantasma; un reintento con canal alternativo;
|
|
559
|
-
no reportar `[OK]` sin verificación. Anti-patrón y ejemplos del Paso 5
|
|
560
|
-
actualizados.
|
|
561
|
-
|
|
562
|
-
- **v1.4.0** (2026-05-13) — Agregados Pasos 0c y 0d con verificación previa
|
|
563
|
-
del vault activo de Obsidian y de la apiKey del MCP. Origen: sesión
|
|
564
|
-
2026-05-13 con autorización ampliada del usuario para promover docs;
|
|
565
|
-
el MCP escribió `02-Projects/DEV - swl-ses.md` en `Vault\` raíz en lugar
|
|
566
|
-
de `Vault\SWL\` porque Obsidian tenía abierto el vault un nivel arriba
|
|
567
|
-
del esperado. Hallazgo crítico: el plugin Local REST API resuelve paths
|
|
568
|
-
relativos contra el vault que Obsidian tiene abierto en `obsidian.json`
|
|
569
|
-
global, no contra una ruta hardcodeada. Si el vault activo está mal,
|
|
570
|
-
el MCP escribe a la ubicación equivocada sin error (el plugin crea
|
|
571
|
-
carpetas inexistentes). Agregado también Paso 0d para apiKey
|
|
572
|
-
desincronizada (síntoma `40101 Authorization required`). Y nuevo
|
|
573
|
-
modo HÍBRIDO en Paso 4: filesystem directo para Inbox + MCP para
|
|
574
|
-
promociones, validado en la misma sesión.
|
|
575
|
-
|
|
576
|
-
- **v1.3.8** (2026-05-11) — Agregado flujo MCP-first en Paso 4 con detección
|
|
577
|
-
en Paso 0b. Origen: en la sesión v1.3.4 → v1.3.8 el comando defaultó a
|
|
578
|
-
`Write` directo al filesystem que fue bloqueado por `proteccion-rutas.js`.
|
|
579
|
-
El fallback al MCP funcionó pero quedó manual. Esta versión documenta
|
|
580
|
-
el orden de preferencia (MCP primero, filesystem como fallback explícito)
|
|
581
|
-
y agrega la nota de "tools deferred ≠ tools ausentes" en anti-patrones.
|
|
582
|
-
Aplicación de la regla `consultar-vault-primero.md § Workflow forzoso
|
|
583
|
-
para escritura al vault`.
|
|
1
|
+
---
|
|
2
|
+
name: swl:exportar-vault
|
|
3
|
+
description: Exporta un resumen compacto de la sesión actual del proyecto al vault SWL personal de Saul (F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox\). Úsalo después de /swl:compactar o al cerrar una sesión productiva cuando quieras que el contenido llegue al segundo cerebro sin esperar a una sincronización manual.
|
|
4
|
+
allowed_tools: ["Read", "Write", "Bash", "Glob"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:exportar-vault — Puente SWL-SES → Vault personal
|
|
8
|
+
|
|
9
|
+
Eres el puente entre el proyecto activo (sigaf, sigm, swl-ses, ecosistema-multi-agente-ia u otro) y el **vault personal de Saul** ubicado en `F:\Google Drive\Developer\Obsidian\Vault\SWL`. Tu trabajo: producir una nota de Inbox del vault con el resumen de la sesión actual, lista para que Saul la procese cuando abra el vault.
|
|
10
|
+
|
|
11
|
+
Este comando es **complementario a `/swl:compactar`**, no lo reemplaza. Compactar actualiza `.planning/COMPACTACION.md` del proyecto; exportar-vault propaga lo relevante al vault.
|
|
12
|
+
|
|
13
|
+
## Señales de que debes usarlo
|
|
14
|
+
|
|
15
|
+
- Acabas de cerrar `/swl:compactar` con decisiones o aprendizajes importantes.
|
|
16
|
+
- Vas a terminar la sesión del día y quieres que los puntos clave queden en el segundo cerebro.
|
|
17
|
+
- Saul lo pide explícitamente.
|
|
18
|
+
- La sesión produjo una decisión arquitectural que afecta a otros proyectos del ecosistema.
|
|
19
|
+
|
|
20
|
+
## Paso 0 — Validación del destino y canal de escritura
|
|
21
|
+
|
|
22
|
+
Hay **dos canales** posibles para escribir al vault. El canal preferido es el
|
|
23
|
+
MCP de Obsidian; el filesystem directo es fallback documentado.
|
|
24
|
+
|
|
25
|
+
### 0a — Validar el vault en filesystem (para lectura y detección)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
test -d "F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox" \
|
|
29
|
+
&& echo "[OK] Vault accesible" \
|
|
30
|
+
|| echo "[ERROR] Vault no accesible — abortar"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Si la ruta no es accesible (por ejemplo, Google Drive no sincronizado o letra de unidad distinta), **abortar con mensaje claro**. No intentes rutas alternativas sin permiso explícito.
|
|
34
|
+
|
|
35
|
+
### 0b — Detectar disponibilidad del MCP de Obsidian
|
|
36
|
+
|
|
37
|
+
Verifica si los tools `mcp__obsidian__obsidian_append_content` o
|
|
38
|
+
`mcp__obsidian__obsidian_patch_content` están cargados o deferidos:
|
|
39
|
+
|
|
40
|
+
- Si aparecen como **deferred** en `<system-reminder>`, cargar el schema con
|
|
41
|
+
`ToolSearch(query="select:mcp__obsidian__obsidian_append_content", ...)`.
|
|
42
|
+
- Si tras `ToolSearch` siguen sin estar disponibles, el MCP server no está
|
|
43
|
+
corriendo (Obsidian cerrado o plugin Local REST API desactivado). En ese
|
|
44
|
+
caso usar canal de fallback (filesystem directo) — ver Paso 4.
|
|
45
|
+
|
|
46
|
+
**Por qué MCP-first**: el hook `proteccion-rutas.js` bloquea la herramienta
|
|
47
|
+
`Write` con destino fuera del CWD del proyecto. La ruta del vault
|
|
48
|
+
(`F:\Google Drive\...`) siempre cae fuera del CWD si trabajas en
|
|
49
|
+
`D:\Python\<proyecto>\`. El MCP de Obsidian opera vía HTTPS al puerto 27124
|
|
50
|
+
del plugin Local REST API — **no pasa por el hook de filesystem**, así que
|
|
51
|
+
nunca dispara el bloqueo.
|
|
52
|
+
|
|
53
|
+
Defaultear a filesystem cuando el MCP está disponible es un anti-patrón
|
|
54
|
+
documentado en `reglas/consultar-vault-primero.md § Workflow forzoso para
|
|
55
|
+
escritura al vault`. El bloqueo por `proteccion-rutas.js` no es una falla a
|
|
56
|
+
esquivar — es una señal de que el canal correcto es el MCP.
|
|
57
|
+
|
|
58
|
+
### 0c — Verificar que el vault activo de Obsidian apunta a `Vault\SWL\` (CRÍTICO)
|
|
59
|
+
|
|
60
|
+
> Origen del paso: sesión 2026-05-13 v1.4.0. El MCP de Obsidian resuelve paths
|
|
61
|
+
> relativos contra el **vault que Obsidian tiene abierto**, no contra una
|
|
62
|
+
> ruta hardcodeada en el plugin. Si Obsidian abrió un vault distinto del
|
|
63
|
+
> esperado (ej. `F:\Google Drive\Developer\Obsidian\Vault\` raíz en lugar
|
|
64
|
+
> de `Vault\SWL\`), todas las escrituras del MCP irán al vault equivocado.
|
|
65
|
+
> El plugin **crea carpetas inexistentes** sobre la marcha, así que ni
|
|
66
|
+
> siquiera obtendrás error — los archivos terminan en una ubicación huérfana.
|
|
67
|
+
|
|
68
|
+
Verifica antes de cualquier llamada MCP:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Path canónico de la config global de Obsidian en Windows
|
|
72
|
+
APP="$APPDATA/obsidian/obsidian.json"
|
|
73
|
+
node -e "
|
|
74
|
+
const fs = require('fs');
|
|
75
|
+
const data = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
|
|
76
|
+
const abierto = Object.values(data.vaults).find(v => v.open === true);
|
|
77
|
+
console.log('Vault abierto:', abierto ? abierto.path : 'NINGUNO');
|
|
78
|
+
console.log('Esperado: F:\\\\Google Drive\\\\Developer\\\\Obsidian\\\\Vault\\\\SWL');
|
|
79
|
+
console.log('OK:', abierto && abierto.path.endsWith('SWL') ? 'sí' : 'NO');
|
|
80
|
+
" "$APP"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Resultado esperado:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
Vault abierto: F:\Google Drive\Developer\Obsidian\Vault\SWL
|
|
87
|
+
Esperado: F:\Google Drive\Developer\Obsidian\Vault\SWL
|
|
88
|
+
OK: sí
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Si `OK: NO` o `Vault abierto: NINGUNO`, **NO usar MCP** — caer al filesystem
|
|
92
|
+
para esta sesión y reportar al usuario que debe abrir el vault `SWL` en
|
|
93
|
+
Obsidian (File → Open vault → seleccionar `F:\Google Drive\Developer\Obsidian\Vault\SWL`).
|
|
94
|
+
|
|
95
|
+
### 0d — Verificar que la apiKey del MCP coincide con la del plugin activo
|
|
96
|
+
|
|
97
|
+
> Origen: cuando el vault activo cambia, la apiKey del plugin Local REST API
|
|
98
|
+
> cambia (cada vault tiene su propio `.obsidian/plugins/obsidian-local-rest-api/data.json`
|
|
99
|
+
> con apiKey, cert y privateKey distintos). El MCP server registrado en
|
|
100
|
+
> Claude.ai tiene una apiKey hardcodeada — si no se actualiza tras cambiar de
|
|
101
|
+
> vault, todas las llamadas retornan `40101 Authorization required`.
|
|
102
|
+
|
|
103
|
+
Si tras `ToolSearch` el MCP carga sus tools pero la primera llamada (ej.
|
|
104
|
+
`obsidian_list_files_in_dir`) retorna `Error 40101: Authorization required`,
|
|
105
|
+
el síntoma es claro: apiKey desincronizada.
|
|
106
|
+
|
|
107
|
+
Acción:
|
|
108
|
+
|
|
109
|
+
1. Leer la apiKey actual del plugin con
|
|
110
|
+
`grep '"apiKey"' "F:/Google Drive/Developer/Obsidian/Vault/SWL/.obsidian/plugins/obsidian-local-rest-api/data.json"`
|
|
111
|
+
2. Reportar al usuario que actualice en **claude.ai → Settings → Connectors
|
|
112
|
+
→ Obsidian → API Key**. Disconnect + Reconnect tras pegar el valor.
|
|
113
|
+
3. Mientras tanto, usar filesystem como fallback para escribir al Inbox.
|
|
114
|
+
|
|
115
|
+
Si hay procesos zombie de Obsidian o `mcp-obsidian` cliente con apiKey
|
|
116
|
+
cacheada, requieren terminación + reinicio de Claude Code para tomar la
|
|
117
|
+
nueva apiKey.
|
|
118
|
+
|
|
119
|
+
## Paso 1 — Identificación del proyecto actual
|
|
120
|
+
|
|
121
|
+
Detecta qué proyecto eres leyendo:
|
|
122
|
+
|
|
123
|
+
1. `CLAUDE.md` raíz — primer encabezado H1.
|
|
124
|
+
2. `package.json` campo `name` si existe.
|
|
125
|
+
3. Si ninguno aclara, usar el nombre de la carpeta raíz del proyecto.
|
|
126
|
+
|
|
127
|
+
Normaliza el slug del proyecto a kebab-case sin acentos. Ejemplos válidos:
|
|
128
|
+
|
|
129
|
+
- `sigaf`
|
|
130
|
+
- `sigm`
|
|
131
|
+
- `swl-software-engineering-system`
|
|
132
|
+
- `ecosistema-multi-agente-ia`
|
|
133
|
+
|
|
134
|
+
## Paso 1.5 — Resolución del nombre canónico desde el vault (CRÍTICO)
|
|
135
|
+
|
|
136
|
+
Antes de redactar el frontmatter, **debes resolver el nombre canónico exacto** del proyecto leyendo `02-Projects/` del vault. Sin esto, el campo `related_vault_project` queda con un nombre fabricado que no enlaza con ningún nodo del grafo de Obsidian.
|
|
137
|
+
|
|
138
|
+
Listar proyectos del vault:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
ls "F:/Google Drive/Developer/Obsidian/Vault/SWL/02-Projects/" 2>/dev/null
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Resultado típico:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
DEV - Ecosistema Multi-Agente IA OIC-INE.md
|
|
148
|
+
DEV - SIGAF.md
|
|
149
|
+
DEV - SIGM.md
|
|
150
|
+
META - SWL Software Engineering System.md
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Algoritmo de match (en cascada — cada pasada solo se ejecuta si la anterior no resolvió match único):
|
|
154
|
+
|
|
155
|
+
**Normaliza ambos lados** a comparación robusta antes de cualquier pasada:
|
|
156
|
+
|
|
157
|
+
- Strip extensión `.md`.
|
|
158
|
+
- Strip prefijo `DEV - ` o `META - ` (cualquier prefijo seguido de ` - `).
|
|
159
|
+
- Lowercase.
|
|
160
|
+
- Sin acentos.
|
|
161
|
+
- Reemplaza espacios y guiones por nada (compactar).
|
|
162
|
+
|
|
163
|
+
Aplica el mismo procesamiento al slug del proyecto local.
|
|
164
|
+
|
|
165
|
+
**Pasada 1 — Match exacto**:
|
|
166
|
+
|
|
167
|
+
- Si la cadena normalizada del slug local coincide carácter a carácter con la de algún canónico, ese es el match. Caso típico: `sigaf` ↔ `DEV - SIGAF`.
|
|
168
|
+
|
|
169
|
+
**Pasada 2 — Match por prefijo bidireccional**:
|
|
170
|
+
|
|
171
|
+
- Si la cadena del slug local es **prefijo** de la cadena de algún canónico, ese canónico matchea. Ej: `ecosistemamultiagenteia` es prefijo de `ecosistemamultiagenteiaoicine` → match con `DEV - Ecosistema Multi-Agente IA OIC-INE`.
|
|
172
|
+
- Inversamente: si la cadena de algún canónico es prefijo de la del slug local, también matchea (cubre el caso opuesto: vault con nombre más corto que el slug del proyecto).
|
|
173
|
+
- Solo se acepta el match si la pasada produce **exactamente 1** candidato. Si hay 2+ ambiguos, NO usar — pasar a siguiente pasada con el alias o fallback final, listando los candidatos en el WARNING del Paso 5.
|
|
174
|
+
|
|
175
|
+
**Pasada 3 — Aliases conocidos**:
|
|
176
|
+
|
|
177
|
+
- Si ninguna pasada anterior resolvió, intenta con sinónimos del slug local antes del fallback (ver lista de aliases más abajo). Para cada alias, repite Pasada 1 y Pasada 2.
|
|
178
|
+
|
|
179
|
+
**Pasada 4 — Fallback**:
|
|
180
|
+
|
|
181
|
+
- Si todo lo anterior es vacío:
|
|
182
|
+
- Usar como `related_vault_project` el valor `[[DEV - {Nombre-Title-Case}]]` (fallback antiguo).
|
|
183
|
+
- **Reportar warning explícito al usuario** en el paso 5 indicando que no se encontró nodo canónico y sugerir crear `02-Projects/DEV - {Nombre}.md` en el vault.
|
|
184
|
+
|
|
185
|
+
Resultado del algoritmo: el nombre canónico es el basename del archivo sin `.md` (con su prefijo `DEV - ` o `META - ` original intacto).
|
|
186
|
+
|
|
187
|
+
Ejemplos de match esperado (con la pasada que lo resuelve):
|
|
188
|
+
|
|
189
|
+
| Slug local | Normalizado local | Canónico que matchea | Pasada | Nombre canónico resuelto |
|
|
190
|
+
| --------------------------------- | ------------------------------ | ------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------ |
|
|
191
|
+
| `sigaf` | `sigaf` | `sigaf` | 1 (exacto) | `DEV - SIGAF` |
|
|
192
|
+
| `sigm` | `sigm` | `sigm` | 1 (exacto) | `DEV - SIGM` |
|
|
193
|
+
| `swl-software-engineering-system` | `swlsoftwareengineeringsystem` | `swlsoftwareengineeringsystem` | 1 (exacto) | `META - SWL Software Engineering System` |
|
|
194
|
+
| `ecosistema-multi-agente-ia` | `ecosistemamultiagenteia` | `ecosistemamultiagenteiaoicine` | 2 (prefijo del slug en canónico) | `DEV - Ecosistema Multi-Agente IA OIC-INE` |
|
|
195
|
+
| `swl-ses` | `swlses` | ninguno (ver nota) | 3 (alias → reemplaza slug por `swlsoftwareengineeringsystem` y repite 1) | `META - SWL Software Engineering System` |
|
|
196
|
+
|
|
197
|
+
**Nota sobre el caso `swl-ses`** — un lector cuidadoso puede preguntarse por qué Pasada 2 (prefijo) no captura este caso, dado que `swlses` y `swlsoftwareengineeringsystem` comparten el inicio `swls`. La verificación carácter a carácter:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
pos: 0 1 2 3 4 5
|
|
201
|
+
swlses: s w l s e s
|
|
202
|
+
swlsof: s w l s o f t w a r e ...
|
|
203
|
+
^
|
|
204
|
+
divergen aquí (e vs o)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
`swlses` **no es prefijo** de `swlsoftwareengineeringsystem` — comparten 4 caracteres pero divergen en la posición 4. Por eso Pasada 2 falla y se necesita la sustitución de alias en Pasada 3. Esta nota existe para prevenir el malentendido común de que "comparten algunas letras iniciales" implica "uno es prefijo del otro".
|
|
208
|
+
|
|
209
|
+
**Aliases conocidos** — si el slug local no matchea directo, intenta estos sinónimos antes del fallback:
|
|
210
|
+
|
|
211
|
+
- `swl-ses` → buscar `swl-software-engineering-system` o `swlsoftwareengineeringsystem`.
|
|
212
|
+
- Cualquier slug que empiece con `swl-` y termine en `-ses` o `-software-engineering-system` → trata como `swl-software-engineering-system`.
|
|
213
|
+
|
|
214
|
+
Guarda el resultado en dos variables internas para usar más abajo:
|
|
215
|
+
|
|
216
|
+
- `nombre_canonico_completo` — ej. `META - SWL Software Engineering System`. Va dentro de `[[ ]]` en el frontmatter.
|
|
217
|
+
- `proyecto_slug` — el slug original sin alterar. Va en el filename y en tags.
|
|
218
|
+
|
|
219
|
+
## Paso 2 — Recolección del contenido de la sesión
|
|
220
|
+
|
|
221
|
+
Junta estas fuentes (las que existan):
|
|
222
|
+
|
|
223
|
+
1. **Última compactación:** `.planning/COMPACTACION.md` o `.planning/COMPACT.md`.
|
|
224
|
+
2. **Estado actual:** `.planning/ESTADO.md` o `.planning/STATE.md`.
|
|
225
|
+
3. **Últimos aprendizajes del APRENDIZAJES.md** — solo las entradas con fecha del día en curso o las últimas 10.
|
|
226
|
+
4. **Git log del día:** `git log --oneline --since="00:00" --until="23:59"`.
|
|
227
|
+
5. **Git status actual:** `git status --short`.
|
|
228
|
+
|
|
229
|
+
## Paso 3 — Síntesis
|
|
230
|
+
|
|
231
|
+
Produce un resumen de **no más de 500 palabras** con esta estructura:
|
|
232
|
+
|
|
233
|
+
```markdown
|
|
234
|
+
---
|
|
235
|
+
type: export-swl
|
|
236
|
+
status: pending-review
|
|
237
|
+
tags: [export, inbox, swl-{proyecto-slug}]
|
|
238
|
+
created: {fecha-hoy YYYY-MM-DD}
|
|
239
|
+
source: swl-ses
|
|
240
|
+
project: "{nombre-proyecto}"
|
|
241
|
+
project_path: "{ruta-absoluta}"
|
|
242
|
+
related_vault_project: "[[{nombre_canonico_completo}]]"
|
|
243
|
+
reviewed: false
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
# Export SWL-SES → Vault ({fecha-hoy}) — {nombre-proyecto}
|
|
247
|
+
|
|
248
|
+
## Sesión
|
|
249
|
+
|
|
250
|
+
- **Fecha:** YYYY-MM-DD
|
|
251
|
+
- **Horario:** HH:MM a HH:MM
|
|
252
|
+
- **Rama git:** {rama}
|
|
253
|
+
- **Último commit:** {sha7} — {mensaje}
|
|
254
|
+
|
|
255
|
+
## Logros de la sesión
|
|
256
|
+
|
|
257
|
+
- Punto 1
|
|
258
|
+
- Punto 2
|
|
259
|
+
- Punto 3
|
|
260
|
+
|
|
261
|
+
## Decisiones tomadas
|
|
262
|
+
|
|
263
|
+
- **{título decisión}** — razón en 1 línea.
|
|
264
|
+
- ...
|
|
265
|
+
|
|
266
|
+
## Aprendizajes nuevos (candidatos a 04-Resources del vault)
|
|
267
|
+
|
|
268
|
+
- **{aprendizaje}** — fuente: `{archivo}` o sesión.
|
|
269
|
+
|
|
270
|
+
## Métricas que cambiaron
|
|
271
|
+
|
|
272
|
+
| Métrica | Antes | Después |
|
|
273
|
+
| --------- | ----- | ------- |
|
|
274
|
+
| LOC | | |
|
|
275
|
+
| Endpoints | | |
|
|
276
|
+
| Tests | | |
|
|
277
|
+
|
|
278
|
+
## Bloqueantes o deuda detectada
|
|
279
|
+
|
|
280
|
+
-
|
|
281
|
+
|
|
282
|
+
## Acción sugerida al leer en el vault
|
|
283
|
+
|
|
284
|
+
Ejecutar `/sync-projects {proyecto-slug}` en el vault para integrar los cambios formalmente.
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
**Archivos fuente consultados:**
|
|
289
|
+
|
|
290
|
+
- `.planning/COMPACTACION.md` (última)
|
|
291
|
+
- `.planning/APRENDIZAJES.md` (últimas entradas)
|
|
292
|
+
- Git log del día
|
|
293
|
+
|
|
294
|
+
**Notas:**
|
|
295
|
+
|
|
296
|
+
- Este archivo vive en 00-Inbox/ del vault. Saul lo procesa manualmente o con `/sync-projects`.
|
|
297
|
+
- No sobreescribe nada en `02-Projects/`, `04-Resources/` ni `07-Decisions/` del vault.
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Paso 4 — Escritura en el vault
|
|
301
|
+
|
|
302
|
+
El archivo destino es:
|
|
303
|
+
|
|
304
|
+
```
|
|
305
|
+
F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox\YYYY-MM-DD_HHMM_export-{proyecto-slug}.md
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Con UTF-8 sin BOM. Usar **uno de dos canales** según disponibilidad:
|
|
309
|
+
|
|
310
|
+
### Canal A (preferido) — MCP de Obsidian
|
|
311
|
+
|
|
312
|
+
Si el Paso 0b confirmó que `mcp__obsidian__obsidian_append_content` está
|
|
313
|
+
disponible (cargado directamente o tras `ToolSearch`), usar este canal:
|
|
314
|
+
|
|
315
|
+
```jsonc
|
|
316
|
+
// La ruta es RELATIVA al vault root (no incluye F:\...\SWL\)
|
|
317
|
+
mcp__obsidian__obsidian_append_content({
|
|
318
|
+
filepath: "00-Inbox/YYYY-MM-DD_HHMM_export-{proyecto-slug}.md",
|
|
319
|
+
content: "<contenido completo del export>"
|
|
320
|
+
})
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Ventajas frente al filesystem:
|
|
324
|
+
|
|
325
|
+
- **No pasa por `proteccion-rutas.js`** — el MCP opera vía HTTPS al puerto
|
|
326
|
+
27124, fuera del flujo de Bash/Write/Edit.
|
|
327
|
+
- **Sin staging intermedio**: escribe directamente al archivo final del vault.
|
|
328
|
+
- **Auditable**: el plugin Local REST API de Obsidian registra el acceso.
|
|
329
|
+
- **Cross-OS**: el wrapper funciona idéntico en Windows/macOS/Linux sin
|
|
330
|
+
manejar separators de path.
|
|
331
|
+
|
|
332
|
+
Notas operativas:
|
|
333
|
+
|
|
334
|
+
- Si el archivo ya existe con ese timestamp (raro), agregar sufijo `_b`
|
|
335
|
+
al nombre antes de invocar `append_content`. El MCP de obsidian no
|
|
336
|
+
sobreescribe si el archivo existe — `append` agrega al final.
|
|
337
|
+
- Si se necesita escribir secciones específicas en lugar de un archivo
|
|
338
|
+
completo, usar `mcp__obsidian__obsidian_patch_content` con
|
|
339
|
+
`target_type: "heading"`.
|
|
340
|
+
|
|
341
|
+
### Canal B (fallback) — Filesystem directo
|
|
342
|
+
|
|
343
|
+
Solo cuando el MCP no responde tras `ToolSearch` (Obsidian cerrado, plugin
|
|
344
|
+
desactivado, sin red local). **Esto va a chocar con `proteccion-rutas.js`**
|
|
345
|
+
si el CWD es el directorio del proyecto, así que requiere ejecución vía
|
|
346
|
+
Bash con redirección o vía un comando del CLI nativo del SO:
|
|
347
|
+
|
|
348
|
+
```powershell
|
|
349
|
+
# PowerShell — UTF-8 sin BOM
|
|
350
|
+
$encoding = New-Object System.Text.UTF8Encoding($false)
|
|
351
|
+
[System.IO.File]::WriteAllText($path, $content, $encoding)
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# Bash + heredoc — UTF-8 sin BOM por default en Node 18+
|
|
356
|
+
cat > "$path" <<'EOF'
|
|
357
|
+
<contenido del export>
|
|
358
|
+
EOF
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**No usar `Write` directo** desde la herramienta del agente — `proteccion-rutas.js`
|
|
362
|
+
lo bloquea. Si por algún motivo el agente necesita usar `Write`, primero
|
|
363
|
+
escribe a `_userland/staging/<timestamp>.md` dentro del CWD, luego mueve con
|
|
364
|
+
`Bash` (`mv` o PowerShell `Move-Item`).
|
|
365
|
+
|
|
366
|
+
Reportar al usuario qué canal se usó:
|
|
367
|
+
|
|
368
|
+
- Canal A → `[OK] Vía: MCP Obsidian (puerto 27124)`
|
|
369
|
+
- Canal B → `[OK] Vía: filesystem directo (MCP no disponible)`
|
|
370
|
+
- Canal Híbrido → `[OK] Vía: filesystem para Inbox, MCP para promociones`
|
|
371
|
+
|
|
372
|
+
### Modo HÍBRIDO (validado en sesión 2026-05-13)
|
|
373
|
+
|
|
374
|
+
Cuando la sesión incluye **autorización ampliada para promover documentos**
|
|
375
|
+
a `02-Projects/`, `07-Decisions/` y `04-Resources/`, el flujo óptimo combina
|
|
376
|
+
ambos canales:
|
|
377
|
+
|
|
378
|
+
1. **Inbox** (`00-Inbox/YYYY-MM-DD_HHMM_export-{slug}.md`): usar siempre
|
|
379
|
+
**filesystem directo via Bash heredoc con ruta absoluta** (canal B). Razón:
|
|
380
|
+
el Bash heredoc bypassa cualquier desalineación del vault activo de
|
|
381
|
+
Obsidian — escribe directamente al disco en la ruta exacta.
|
|
382
|
+
|
|
383
|
+
2. **Promociones** (a `02-Projects/`, `07-Decisions/`, `04-Resources/`):
|
|
384
|
+
usar **MCP append_content** (canal A) tras validar Pasos 0c y 0d. Razón:
|
|
385
|
+
las promociones requieren enlaces bidireccionales con `[[...]]` que el
|
|
386
|
+
plugin de Obsidian indexa al detectar la escritura. El filesystem directo
|
|
387
|
+
crea el archivo pero no dispara la reindexación hasta que Obsidian
|
|
388
|
+
detecte el cambio.
|
|
389
|
+
|
|
390
|
+
3. **Aprobación de revisiones** (cambiar `status: pending-review` → `reviewed`
|
|
391
|
+
en frontmatter): si el archivo está en `00-Inbox/`, usar `sed` via Bash;
|
|
392
|
+
si está en `02-Projects/` etc., usar `mcp__obsidian__obsidian_patch_content`
|
|
393
|
+
con `target_type: "frontmatter"`. Validado que `patch_content` puede
|
|
394
|
+
responder 404 en algunos archivos pre-existentes — caer al filesystem si
|
|
395
|
+
falla.
|
|
396
|
+
|
|
397
|
+
Reportar al usuario el desglose final del modo híbrido:
|
|
398
|
+
|
|
399
|
+
```
|
|
400
|
+
[OK] Inbox creado via filesystem: F:\...\00-Inbox\...md
|
|
401
|
+
[OK] 3 promociones via MCP: 02-Projects, 07-Decisions, 04-Resources
|
|
402
|
+
[OK] Revisión aprobada (reviewed: true) en el Inbox
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
## Paso 4b — Verificación post-escritura (obligatorio)
|
|
406
|
+
|
|
407
|
+
**Inmediatamente después** de cada escritura del Paso 4 (Inbox, promociones en
|
|
408
|
+
`02-Projects/`, `07-Decisions/`, `04-Resources/`, `10-Archive/`), confirma que el
|
|
409
|
+
archivo en disco **existe y tiene contenido sustantivo**. Sin este paso, Obsidian
|
|
410
|
+
puede mostrar nodos fantasma (pestaña con título pero cuerpo vacío) cuando el MCP
|
|
411
|
+
falló con `40101`, timeout o `append_content` sobre ruta incorrecta.
|
|
412
|
+
|
|
413
|
+
### Cuándo verificar
|
|
414
|
+
|
|
415
|
+
| Escritura | Verificar |
|
|
416
|
+
| ------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
417
|
+
| Export en `00-Inbox/` | **Siempre** |
|
|
418
|
+
| Append a `02-Projects/DEV - *.md` | **Siempre** (leer tramo final o archivo completo si es corto) |
|
|
419
|
+
| Nota nueva en `07-Decisions/`, `04-Resources/`, `10-Archive/` | **Siempre** |
|
|
420
|
+
| Solo `reviewed: true` en Inbox existente | Opcional (el archivo ya existía) |
|
|
421
|
+
|
|
422
|
+
### Cómo verificar (orden de preferencia)
|
|
423
|
+
|
|
424
|
+
1. **MCP** — `obsidian_get_file_contents` con path **relativo al vault SWL**
|
|
425
|
+
(sin prefijo `F:\...`):
|
|
426
|
+
```json
|
|
427
|
+
{ "filepath": "00-Inbox/2026-05-18_1530_export-swl-ses.md" }
|
|
428
|
+
```
|
|
429
|
+
2. **Filesystem** — si el Paso 4 usó canal B, leer el mismo path absoluto con
|
|
430
|
+
`Read` o `Get-Content` y comparar longitud.
|
|
431
|
+
|
|
432
|
+
### Criterios de aprobación (todos deben cumplirse)
|
|
433
|
+
|
|
434
|
+
| # | Criterio | Umbral |
|
|
435
|
+
| --- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
436
|
+
| 1 | El archivo existe | Sin error 404 / `ENOENT` |
|
|
437
|
+
| 2 | Longitud del cuerpo | ≥ **500 caracteres** (sin contar solo frontmatter vacío) |
|
|
438
|
+
| 3 | Marcador de export | Contiene `type: export-swl` en frontmatter **o** al menos una sección `## Logros de la sesión` / `## Sesión` / `## Decisiones` con texto bajo el heading |
|
|
439
|
+
| 4 | No es fantasma | El cuerpo **no** es solo el título del archivo, una línea en blanco, o el nombre del nodo sin párrafos |
|
|
440
|
+
|
|
441
|
+
Si el export es deliberadamente corto (<500 caracteres), bajar el umbral a
|
|
442
|
+
≥ **200 caracteres** solo si el frontmatter incluye `type: export-swl` y al
|
|
443
|
+
menos un bullet bajo `## Logros` o `## Sesión`; en caso contrario, tratar como
|
|
444
|
+
fallo.
|
|
445
|
+
|
|
446
|
+
### Si la verificación falla
|
|
447
|
+
|
|
448
|
+
1. **No** reportar `[OK] Export creado` al usuario.
|
|
449
|
+
2. Registrar en la salida: `[FAIL] Verificación post-escritura: <motivo>`.
|
|
450
|
+
3. **Un reintento** con el canal alternativo (MCP ↔ filesystem del Paso 4).
|
|
451
|
+
4. Si sigue fallando: reconstruir el Markdown desde `.planning/COMPACTACION.md`
|
|
452
|
+
- artefactos de sesión y escribir de nuevo; si aún falla, abortar y pedir
|
|
453
|
+
al usuario revisar Obsidian (vault activo Paso 0c, apiKey Paso 0d).
|
|
454
|
+
5. Si Obsidian ya abrió una pestaña fantasma: cerrar la pestaña en el IDE de
|
|
455
|
+
Obsidian; **no** dejar el tab apuntando a un path que no pasó verificación.
|
|
456
|
+
|
|
457
|
+
### Salida interna (para el Paso 5)
|
|
458
|
+
|
|
459
|
+
Guardar mentalmente (o en el reporte):
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
[OK] Verificación: 00-Inbox/2026-05-18_1530_export-swl-ses.md — 2847 chars, secciones OK
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
o
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
[FAIL] Verificación: cuerpo 42 chars — reintento vía filesystem
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
## Paso 5 — Confirmación
|
|
472
|
+
|
|
473
|
+
Reporta al usuario **solo si el Paso 4b aprobó** el Inbox (y cada promoción, si aplica):
|
|
474
|
+
|
|
475
|
+
- Ruta exacta del archivo creado.
|
|
476
|
+
- Resultado del Paso 4b (caracteres verificados o `[FAIL]` si abortaste).
|
|
477
|
+
- Conteo de palabras.
|
|
478
|
+
- **Nombre canónico resuelto**: indicar qué nodo de `02-Projects/` enlazó el export. Si no hubo match, marcar el warning explícito.
|
|
479
|
+
- Recordatorio: "Al abrir el vault en tu próxima sesión, ejecuta `/sync-projects {proyecto-slug}` para integrar formalmente estos cambios."
|
|
480
|
+
|
|
481
|
+
Formato esperado cuando hay match:
|
|
482
|
+
|
|
483
|
+
```
|
|
484
|
+
[OK] Export creado: F:\...\2026-05-04_1748_export-swl-ses.md (487 palabras)
|
|
485
|
+
[OK] Verificación post-escritura: 3124 chars, type: export-swl, secciones OK
|
|
486
|
+
[OK] Enlace canónico: [[META - SWL Software Engineering System]]
|
|
487
|
+
|
|
488
|
+
Próximo paso: al abrir el vault, ejecuta:
|
|
489
|
+
/sync-projects swl-ses
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
Formato esperado cuando NO hay match:
|
|
493
|
+
|
|
494
|
+
```
|
|
495
|
+
[OK] Export creado: F:\...\2026-05-04_1748_export-mi-proyecto.md (487 palabras)
|
|
496
|
+
[WARNING] No se encontró nodo canónico en 02-Projects/. Usado fallback: [[DEV - Mi Proyecto]]
|
|
497
|
+
Sugerencia: crear F:\...\02-Projects\DEV - Mi Proyecto.md en el vault para que el grafo conecte el export con el proyecto.
|
|
498
|
+
|
|
499
|
+
Próximo paso: al abrir el vault, ejecuta:
|
|
500
|
+
/sync-projects mi-proyecto
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
## Restricciones
|
|
504
|
+
|
|
505
|
+
- **No sobrescribir** archivos existentes con el mismo nombre. Si por azar existe uno con el mismo timestamp (raro), agrega sufijo `_b`.
|
|
506
|
+
- **No escribir** en otras carpetas del vault. Solo `00-Inbox/`.
|
|
507
|
+
- **No tocar** `.planning/` del proyecto.
|
|
508
|
+
- **Abortar silenciosamente** si el vault no existe, reportando al usuario. No asumir rutas alternativas.
|
|
509
|
+
|
|
510
|
+
## Anti-patrones
|
|
511
|
+
|
|
512
|
+
- Exportar 5000 palabras cuando la sesión fue pequeña. El resumen debe ser denso.
|
|
513
|
+
- Duplicar con el `COMPACTACION.md` del proyecto (copiar pega tal cual). El export es una **síntesis para vault**, no un espejo.
|
|
514
|
+
- Intentar escribir directamente en `02-Projects/` del vault. Eso es zona ⚠️ en el vault — solo Saul decide si promoverlo.
|
|
515
|
+
- Usar rutas con backslash no escapadas en código generado.
|
|
516
|
+
- **Defaultear a filesystem cuando el MCP de Obsidian está disponible**.
|
|
517
|
+
El bloqueo por `proteccion-rutas.js` no es una falla a esquivar con Bash
|
|
518
|
+
staging — es señal de que el canal correcto es el MCP. Ver Paso 0b.
|
|
519
|
+
- **Recurrir al workaround del filesystem antes de cargar el schema del
|
|
520
|
+
MCP con `ToolSearch`**. Tools deferred ≠ tools ausentes — el MCP server
|
|
521
|
+
está corriendo, solo falta cargar el schema. Cargar antes de defaultear.
|
|
522
|
+
- **Declarar éxito sin Paso 4b**. Un `append_content` o `Write` que no lanza
|
|
523
|
+
error no garantiza contenido en disco ni en el índice de Obsidian — genera
|
|
524
|
+
nodos fantasma en el grafo. Siempre leer de vuelta antes del `[OK]`.
|
|
525
|
+
|
|
526
|
+
## Relación con otros comandos SWL
|
|
527
|
+
|
|
528
|
+
- `/swl:compactar` → actualiza `.planning/` del proyecto. Luego `/swl:exportar-vault` propaga al vault. Secuencia natural.
|
|
529
|
+
- `/swl:aprender` → captura aprendizajes en el proyecto. Luego `/swl:exportar-vault` los envía al vault como candidatos.
|
|
530
|
+
- `/swl:checkpoint` → guarda estado del proyecto. No requiere export al vault (es recuperación interna).
|
|
531
|
+
|
|
532
|
+
## Ejemplo de invocación
|
|
533
|
+
|
|
534
|
+
```
|
|
535
|
+
/swl:compactar
|
|
536
|
+
/swl:exportar-vault
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
Produce:
|
|
540
|
+
|
|
541
|
+
```
|
|
542
|
+
[OK] Export creado: F:\Google Drive\Developer\Obsidian\Vault\SWL\00-Inbox\2026-04-16_2130_export-sigaf.md (487 palabras)
|
|
543
|
+
[OK] Verificación post-escritura: 2980 chars, secciones OK
|
|
544
|
+
[OK] Vía: MCP Obsidian (puerto 27124)
|
|
545
|
+
[OK] Enlace canónico: [[DEV - SIGAF]]
|
|
546
|
+
|
|
547
|
+
Próximo paso: al abrir el vault, ejecuta:
|
|
548
|
+
/sync-projects sigaf
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
## Historial de cambios del comando
|
|
552
|
+
|
|
553
|
+
- **v1.4.1** (2026-05-18) — **Paso 4b — Verificación post-escritura**
|
|
554
|
+
obligatoria tras cada escritura MCP o filesystem. Origen: exports MCP fallidos
|
|
555
|
+
(40101 / vault activo incorrecto) dejaron pestañas y nodos en el grafo sin
|
|
556
|
+
archivo en disco o con cuerpo vacío; reconstrucción manual desde
|
|
557
|
+
`COMPACTACION.md`. Criterios: existencia, ≥500 chars (o ≥200 con frontmatter
|
|
558
|
+
completo), secciones de export, anti-fantasma; un reintento con canal alternativo;
|
|
559
|
+
no reportar `[OK]` sin verificación. Anti-patrón y ejemplos del Paso 5
|
|
560
|
+
actualizados.
|
|
561
|
+
|
|
562
|
+
- **v1.4.0** (2026-05-13) — Agregados Pasos 0c y 0d con verificación previa
|
|
563
|
+
del vault activo de Obsidian y de la apiKey del MCP. Origen: sesión
|
|
564
|
+
2026-05-13 con autorización ampliada del usuario para promover docs;
|
|
565
|
+
el MCP escribió `02-Projects/DEV - swl-ses.md` en `Vault\` raíz en lugar
|
|
566
|
+
de `Vault\SWL\` porque Obsidian tenía abierto el vault un nivel arriba
|
|
567
|
+
del esperado. Hallazgo crítico: el plugin Local REST API resuelve paths
|
|
568
|
+
relativos contra el vault que Obsidian tiene abierto en `obsidian.json`
|
|
569
|
+
global, no contra una ruta hardcodeada. Si el vault activo está mal,
|
|
570
|
+
el MCP escribe a la ubicación equivocada sin error (el plugin crea
|
|
571
|
+
carpetas inexistentes). Agregado también Paso 0d para apiKey
|
|
572
|
+
desincronizada (síntoma `40101 Authorization required`). Y nuevo
|
|
573
|
+
modo HÍBRIDO en Paso 4: filesystem directo para Inbox + MCP para
|
|
574
|
+
promociones, validado en la misma sesión.
|
|
575
|
+
|
|
576
|
+
- **v1.3.8** (2026-05-11) — Agregado flujo MCP-first en Paso 4 con detección
|
|
577
|
+
en Paso 0b. Origen: en la sesión v1.3.4 → v1.3.8 el comando defaultó a
|
|
578
|
+
`Write` directo al filesystem que fue bloqueado por `proteccion-rutas.js`.
|
|
579
|
+
El fallback al MCP funcionó pero quedó manual. Esta versión documenta
|
|
580
|
+
el orden de preferencia (MCP primero, filesystem como fallback explícito)
|
|
581
|
+
y agrega la nota de "tools deferred ≠ tools ausentes" en anti-patrones.
|
|
582
|
+
Aplicación de la regla `consultar-vault-primero.md § Workflow forzoso
|
|
583
|
+
para escritura al vault`.
|