@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.
Files changed (435) hide show
  1. package/CLAUDE.md +209 -197
  2. package/README.md +647 -600
  3. package/agentes/accesibilidad-wcag-swl.md +690 -690
  4. package/agentes/arquitecto-swl.md +267 -267
  5. package/agentes/auto-evolucion-swl.md +932 -932
  6. package/agentes/backend-csharp-swl.md +420 -420
  7. package/agentes/backend-go-swl.md +390 -390
  8. package/agentes/backend-java-swl.md +281 -281
  9. package/agentes/backend-rust-swl.md +364 -364
  10. package/agentes/backend-workers-swl.md +482 -482
  11. package/agentes/cloud-infra-swl.md +509 -509
  12. package/agentes/consolidador-swl.md +541 -541
  13. package/agentes/depurador-swl.md +352 -352
  14. package/agentes/devops-ci-swl.md +400 -400
  15. package/agentes/disenador-ui-swl.md +569 -569
  16. package/agentes/documentador-swl.md +345 -345
  17. package/agentes/frontend-angular-swl.md +621 -621
  18. package/agentes/frontend-css-swl.md +716 -716
  19. package/agentes/frontend-react-swl.md +692 -692
  20. package/agentes/frontend-swl.md +496 -496
  21. package/agentes/frontend-tailwind-swl.md +826 -826
  22. package/agentes/investigador-swl.md +432 -432
  23. package/agentes/investigador-ux-swl.md +505 -505
  24. package/agentes/migrador-swl.md +442 -442
  25. package/agentes/mobile-android-swl.md +511 -511
  26. package/agentes/mobile-cross-swl.md +541 -541
  27. package/agentes/mobile-ios-swl.md +502 -502
  28. package/agentes/mobile-testing-swl.md +302 -302
  29. package/agentes/nemesis-auditor-swl.md +285 -285
  30. package/agentes/observabilidad-swl.md +438 -438
  31. package/agentes/pagos-swl.md +310 -310
  32. package/agentes/perfilador-usuario-swl.md +321 -321
  33. package/agentes/planificador-swl.md +399 -399
  34. package/agentes/producto-prd-swl.md +589 -589
  35. package/agentes/red-team-swl.md +218 -218
  36. package/agentes/release-manager-swl.md +590 -590
  37. package/agentes/rendimiento-swl.md +713 -713
  38. package/agentes/revisor-angular-swl.md +278 -278
  39. package/agentes/revisor-csharp-swl.md +264 -264
  40. package/agentes/revisor-go-swl.md +259 -259
  41. package/agentes/revisor-java-swl.md +257 -257
  42. package/agentes/revisor-kotlin-swl.md +273 -273
  43. package/agentes/revisor-nextjs-swl.md +281 -281
  44. package/agentes/revisor-php-swl.md +271 -271
  45. package/agentes/revisor-react-swl.md +278 -278
  46. package/agentes/revisor-rust-swl.md +346 -346
  47. package/agentes/revisor-seguridad-swl.md +399 -399
  48. package/agentes/revisor-swift-swl.md +268 -268
  49. package/agentes/revisor-typescript-swl.md +346 -346
  50. package/agentes/tdd-qa-swl.md +393 -393
  51. package/bin/swl-ses.js +10 -0
  52. package/comandos/swl/actualizar.md +174 -174
  53. package/comandos/swl/adoptar-proyecto.md +265 -265
  54. package/comandos/swl/aprender.md +836 -836
  55. package/comandos/swl/aprobar-plan.md +146 -146
  56. package/comandos/swl/auditar-deps.md +134 -134
  57. package/comandos/swl/autoresearch.md +264 -264
  58. package/comandos/swl/ayuda.md +224 -224
  59. package/comandos/swl/brainstorm.md +52 -51
  60. package/comandos/swl/checkpoint.md +325 -325
  61. package/comandos/swl/claudemd.md +234 -234
  62. package/comandos/swl/compactar.md +310 -310
  63. package/comandos/swl/configurar-ci.md +235 -235
  64. package/comandos/swl/contexto.md +110 -110
  65. package/comandos/swl/crear-skill.md +292 -292
  66. package/comandos/swl/cron.md +194 -194
  67. package/comandos/swl/deuda-codigo.md +97 -97
  68. package/comandos/swl/discutir-fase.md +169 -169
  69. package/comandos/swl/ejecutar-fase.md +233 -233
  70. package/comandos/swl/evaluar-skill.md +520 -520
  71. package/comandos/swl/evolucion-continua.md +73 -73
  72. package/comandos/swl/evolucionar.md +267 -267
  73. package/comandos/swl/exportar-vault.md +583 -583
  74. package/comandos/swl/fix.md +118 -118
  75. package/comandos/swl/gateway.md +158 -158
  76. package/comandos/swl/inbox.md +116 -116
  77. package/comandos/swl/instalar.md +220 -220
  78. package/comandos/swl/instintos.md +86 -86
  79. package/comandos/swl/mapear-codebase.md +312 -312
  80. package/comandos/swl/mcp-status.md +176 -175
  81. package/comandos/swl/modelo.md +100 -100
  82. package/comandos/swl/nemesis.md +433 -433
  83. package/comandos/swl/notificaciones.md +299 -299
  84. package/comandos/swl/nuevo-proyecto.md +251 -251
  85. package/comandos/swl/planear-fase.md +263 -263
  86. package/comandos/swl/plugins.md +256 -256
  87. package/comandos/swl/predecir.md +169 -169
  88. package/comandos/swl/reflect-skills.md +125 -125
  89. package/comandos/swl/release.md +450 -450
  90. package/comandos/swl/revisar-impacto.md +201 -201
  91. package/comandos/swl/revisar.md +330 -330
  92. package/comandos/swl/seguridad.md +189 -189
  93. package/comandos/swl/sesiones.md +200 -200
  94. package/comandos/swl/skill-search.md +113 -113
  95. package/comandos/swl/status.md +345 -345
  96. package/comandos/swl/verificar.md +817 -817
  97. package/comandos/swl/wiki.md +620 -620
  98. package/gateway/cron/jobs.example.json +12 -12
  99. package/gateway/lib/event-channel.js +191 -191
  100. package/habilidades/agent-deep-links/SKILL.md +148 -148
  101. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -294
  102. package/habilidades/backend-async-postgres-testing/SKILL.md +216 -215
  103. package/habilidades/backend-error-design/SKILL.md +221 -221
  104. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  105. package/habilidades/calidad-anti-patrones-universales/SKILL.md +105 -1
  106. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  107. package/habilidades/calidad-mutation-testing/SKILL.md +25 -1
  108. package/habilidades/changelog-generator/SKILL.md +174 -174
  109. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  110. package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
  111. package/habilidades/compactacion-contexto/SKILL.md +2 -1
  112. package/habilidades/contenedores-docker/SKILL.md +4 -2
  113. package/habilidades/css-moderno/SKILL.md +7 -1
  114. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  115. package/habilidades/doubt-driven-review/SKILL.md +207 -207
  116. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  117. package/habilidades/drift-detection/SKILL.md +1 -1
  118. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  119. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  120. package/habilidades/extractor-de-aprendizajes/SKILL.md +12 -2
  121. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  122. package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
  123. package/habilidades/harness-claude-code/SKILL.md +315 -314
  124. package/habilidades/instalar-sistema/SKILL.md +227 -227
  125. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  126. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  127. package/habilidades/perfil-usuario/SKILL.md +200 -200
  128. package/habilidades/planear-fase/SKILL.md +358 -358
  129. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  130. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  131. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  132. package/habilidades/proceso-dynamic-workflows/SKILL.md +60 -0
  133. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  134. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  135. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -147
  136. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  137. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  138. package/habilidades/release-semver/SKILL.md +2 -2
  139. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  140. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  141. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  142. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  143. package/habilidades/tdd-workflow/SKILL.md +749 -749
  144. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  145. package/hooks/agente-lifecycle.js +1 -1
  146. package/hooks/audit-trail.js +1 -1
  147. package/hooks/auto-consolidacion.js +1 -1
  148. package/hooks/calidad-pre-commit.js +159 -10
  149. package/hooks/captura-acciones-post.js +1 -1
  150. package/hooks/captura-acciones-session.js +1 -1
  151. package/hooks/captura-feedback-usuario.js +1 -1
  152. package/hooks/ciclo-evolucion-subagente.js +26 -26
  153. package/hooks/ciclo-evolucion.js +26 -26
  154. package/hooks/contexto-iteracion.js +1 -1
  155. package/hooks/degradacion-instintos.js +1 -1
  156. package/hooks/grafo-contexto.js +1 -1
  157. package/hooks/guardrail-modelo.js +1 -1
  158. package/hooks/inbox-aviso.js +1 -1
  159. package/hooks/inyeccion-contexto.js +1 -1
  160. package/hooks/lib/agent-matcher.js +1 -1
  161. package/hooks/lib/agent-routing.js +1 -1
  162. package/hooks/lib/auto-consolidator.js +335 -335
  163. package/hooks/lib/captura-acciones.js +1 -1
  164. package/hooks/lib/ciclo-evolucion.js +47 -47
  165. package/hooks/lib/deep-links.js +185 -185
  166. package/hooks/lib/error-classifier.js +308 -308
  167. package/hooks/lib/etapa-metricas.js +1 -1
  168. package/hooks/lib/evolution-tracker.js +1 -1
  169. package/hooks/lib/gateway-notify.js +193 -193
  170. package/hooks/lib/mcp-health.js +1 -1
  171. package/hooks/lib/notificacion-formato.js +92 -0
  172. package/hooks/lib/nudge-tracker.js +1 -1
  173. package/hooks/lib/otlp-exporter.js +1 -1
  174. package/hooks/lib/propose-step.js +1 -1
  175. package/hooks/lib/provenance-tracker.js +191 -191
  176. package/hooks/lib/raiz-proyecto.js +158 -102
  177. package/hooks/lib/resource-quota.js +122 -122
  178. package/hooks/lib/retry-jitter.js +165 -165
  179. package/hooks/lib/run-log.js +1 -1
  180. package/hooks/lib/security-net.js +201 -201
  181. package/hooks/lib/singleton-guard.js +20 -13
  182. package/hooks/lib/skill-auditor.js +588 -588
  183. package/hooks/lib/sync-status.js +228 -228
  184. package/hooks/lib/taint-tracker.js +107 -107
  185. package/hooks/lib/telegram-cliente.js +11 -3
  186. package/hooks/lib/text-similarity.js +241 -241
  187. package/hooks/lib/toon-compressor.js +245 -245
  188. package/hooks/notificacion-telegram.js +17 -13
  189. package/hooks/preservar-estado-pre-compact.js +1 -1
  190. package/hooks/registro-turnos.js +1 -1
  191. package/hooks/resumen-sesion.js +1 -1
  192. package/hooks/risk-scoring.js +1 -1
  193. package/hooks/session-briefing.js +13 -5
  194. package/hooks/spec-gate.js +1 -1
  195. package/hooks/sugerir-regenerar-inventario.js +1 -1
  196. package/hooks/tdd-gate.js +1 -1
  197. package/hooks/telemetria-agentes.js +1 -1
  198. package/hooks/telemetria-skill-routing.js +1 -1
  199. package/hooks/tracking-costos.js +1 -1
  200. package/hooks/validar-formato-post-subagente.js +1 -1
  201. package/hooks/validar-intent-spec.js +1 -1
  202. package/hooks/validar-planning-paths.js +1 -1
  203. package/instintos/autonomia.yaml +27 -27
  204. package/instintos/prompt-appendices.yaml +57 -57
  205. package/llms.txt +29 -29
  206. package/manifiestos/agent-output-schemas.json +57 -57
  207. package/manifiestos/canonical-hashes.json +6250 -5257
  208. package/manifiestos/harness-ir.json +47536 -0
  209. package/manifiestos/modulos.json +1429 -1428
  210. package/manifiestos/policy-bundle.json +2065 -0
  211. package/manifiestos/policy-corpus-w2.json +3926 -0
  212. package/manifiestos/runtime-adapters-core3.json +208 -0
  213. package/manifiestos/runtime-conformance.json +139 -0
  214. package/manifiestos/skills-lock.json +1275 -1275
  215. package/package.json +94 -94
  216. package/plantillas/auditor-veto-template.md +105 -105
  217. package/plantillas/github-workflows/release-please.yml +44 -44
  218. package/plantillas/github-workflows/swl-ci.yml +107 -107
  219. package/plantillas/github-workflows/swl-security.yml +51 -51
  220. package/plugin.json +369 -369
  221. package/reglas/accesibilidad.md +10 -10
  222. package/reglas/auditorias-documentales-estructurales.md +7 -7
  223. package/reglas/cloud-infra.md +8 -8
  224. package/reglas/consultar-vault-primero.md +195 -195
  225. package/reglas/git-workflow.md +1 -0
  226. package/reglas/hooks.md +6 -6
  227. package/reglas/intent-engineering.md +218 -218
  228. package/reglas/markitdown.md +8 -8
  229. package/reglas/monitor-ci.md +12 -0
  230. package/reglas/patrones.md +6 -6
  231. package/reglas/testing.md +7 -7
  232. package/reglas/tests-cleanup.md +224 -224
  233. package/schemas/agent-message.schema.json +73 -73
  234. package/schemas/agent-output-implementacion.schema.json +114 -114
  235. package/schemas/agent-output-planificacion.schema.json +150 -150
  236. package/schemas/agent-output-review.schema.json +98 -98
  237. package/schemas/diary-entry.schema.json +112 -112
  238. package/schemas/gate-state.schema.json +76 -0
  239. package/schemas/harness-ir.schema.json +369 -0
  240. package/schemas/hook-profiles.schema.json +54 -54
  241. package/schemas/hooks-config.schema.json +89 -89
  242. package/schemas/legacy-gates.schema.json +45 -0
  243. package/schemas/modulos.schema.json +38 -38
  244. package/schemas/perfiles.schema.json +36 -36
  245. package/schemas/plugin.schema.json +77 -77
  246. package/schemas/policy-bundle.schema.json +140 -0
  247. package/schemas/policy-enforcement.schema.json +117 -0
  248. package/schemas/policy-operation.schema.json +261 -0
  249. package/schemas/runtime-adapter.schema.json +176 -0
  250. package/schemas/runtime-build-attestation.schema.json +100 -0
  251. package/schemas/runtime-conformance.schema.json +239 -0
  252. package/schemas/runtime-diagnostic.schema.json +395 -0
  253. package/schemas/skill-evals.schema.json +119 -119
  254. package/schemas/skill-frontmatter.schema.json +245 -245
  255. package/schemas/w4-certification-request.schema.json +72 -0
  256. package/schemas/w4-certification-verdict.schema.json +224 -0
  257. package/schemas/w4-corpus.schema.json +172 -0
  258. package/schemas/w4-mutation-report.schema.json +116 -0
  259. package/schemas/w4-replay-result.schema.json +164 -0
  260. package/schemas/w4-scoring-report.schema.json +89 -0
  261. package/scripts/audit-tools/audit-history.js +330 -330
  262. package/scripts/audit-tools/bundle-tracker.js +290 -290
  263. package/scripts/audit-tools/canary-monitor.js +352 -352
  264. package/scripts/audit-tools/code-profiler.js +605 -605
  265. package/scripts/audit-tools/dep-doctor.js +320 -320
  266. package/scripts/audit-tools/env-validator.js +206 -206
  267. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  268. package/scripts/audit-tools/lib/output.js +23 -23
  269. package/scripts/audit-tools/migration-checker.js +392 -392
  270. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  271. package/scripts/auditar-clases-conocidas.js +134 -134
  272. package/scripts/bootstrap-instintos.js +88 -14
  273. package/scripts/canario-hooks.js +166 -166
  274. package/scripts/cli/aprobar-plan.js +73 -73
  275. package/scripts/cli/autonomia.js +23 -23
  276. package/scripts/cli/benchmark-memoria.js +37 -37
  277. package/scripts/cli/briefing.js +23 -23
  278. package/scripts/cli/ciclo-autonomo.js +73 -73
  279. package/scripts/cli/ciclo-evolucion.js +26 -26
  280. package/scripts/cli/ciclo-fase-b.js +102 -102
  281. package/scripts/cli/derivar-feature-list.js +25 -25
  282. package/scripts/cli/detectar-host.js +27 -27
  283. package/scripts/cli/diary-entry.js +69 -69
  284. package/scripts/cli/execution-state.js +18 -18
  285. package/scripts/cli/gateway-notify.js +41 -41
  286. package/scripts/cli/guardrail-metrics.js +39 -39
  287. package/scripts/cli/liberar-fase.js +42 -42
  288. package/scripts/cli/mark-evolved.js +56 -56
  289. package/scripts/cli/memoria-search.js +69 -69
  290. package/scripts/cli/metricas-dora.js +26 -26
  291. package/scripts/cli/near-duplicate.js +55 -55
  292. package/scripts/cli/notificaciones.js +123 -123
  293. package/scripts/cli/nudge-accionar.js +39 -39
  294. package/scripts/cli/propose-step.js +29 -29
  295. package/scripts/cli/run-eval.js +38 -38
  296. package/scripts/cli/schedule-parse.js +19 -19
  297. package/scripts/cli/sugerir-modelo.js +20 -20
  298. package/scripts/cli/verificar-plan.js +36 -36
  299. package/scripts/cli/verificar-trazabilidad.js +35 -35
  300. package/scripts/comandos/install-asistido.js +8 -7
  301. package/scripts/configurar-branch-protection.js +418 -418
  302. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  303. package/scripts/doctor.js +61 -13
  304. package/scripts/evidencia-valor.js +101 -101
  305. package/scripts/field-report.js +16 -16
  306. package/scripts/generar-checklists-consolidados.js +273 -273
  307. package/scripts/generar-claims-runtime.js +1342 -0
  308. package/scripts/generar-harness-ir.js +257 -0
  309. package/scripts/generar-inventario.js +52 -54
  310. package/scripts/generar-policy-bundle.js +202 -0
  311. package/scripts/instalador.js +39 -7
  312. package/scripts/lib/activar-hooks-proyecto.js +116 -116
  313. package/scripts/lib/approval-receipts.js +190 -0
  314. package/scripts/lib/artefactos-python.js +43 -43
  315. package/scripts/lib/benchmark-metrics.js +160 -160
  316. package/scripts/lib/budget-enforcer.js +252 -252
  317. package/scripts/lib/certificacion-loop-state.js +421 -0
  318. package/scripts/lib/ci-reader.js +193 -193
  319. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -174
  320. package/scripts/lib/ciclo-autonomo/config.js +165 -165
  321. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -174
  322. package/scripts/lib/ciclo-autonomo/fallback.js +77 -77
  323. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -139
  324. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -112
  325. package/scripts/lib/ciclo-autonomo/index.js +301 -301
  326. package/scripts/lib/ciclo-autonomo/lock.js +124 -124
  327. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -122
  328. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -240
  329. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -248
  330. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -190
  331. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +591 -535
  332. package/scripts/lib/clasificar-directorio.js +92 -0
  333. package/scripts/lib/contadores-inventario.js +217 -217
  334. package/scripts/lib/detectar-host-swl.js +175 -175
  335. package/scripts/lib/detectar-runtime.js +29 -20
  336. package/scripts/lib/detectar-stack-detallado.js +307 -307
  337. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  338. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  339. package/scripts/lib/eval-metrics-store.js +218 -218
  340. package/scripts/lib/eval-quality.js +171 -171
  341. package/scripts/lib/eval-schemas.js +144 -144
  342. package/scripts/lib/eval-self-correct.js +106 -106
  343. package/scripts/lib/eval-validator.js +185 -185
  344. package/scripts/lib/evidence-verifier.js +192 -0
  345. package/scripts/lib/evidencia-release.js +322 -322
  346. package/scripts/lib/evidencia-valor.js +228 -228
  347. package/scripts/lib/expandir-targets.js +71 -71
  348. package/scripts/lib/frontmatter-canonico.js +509 -0
  349. package/scripts/lib/gate-engine.js +871 -0
  350. package/scripts/lib/gate-hooks-requires.js +249 -249
  351. package/scripts/lib/gate-licencias.js +212 -212
  352. package/scripts/lib/git-config-preflight.js +48 -0
  353. package/scripts/lib/git-metricas.js +257 -257
  354. package/scripts/lib/harness-ir.js +778 -0
  355. package/scripts/lib/harness-source-snapshot.js +309 -0
  356. package/scripts/lib/integrity-ledger.js +1147 -0
  357. package/scripts/lib/jaccard-similarity.js +98 -98
  358. package/scripts/lib/legacy-gate-migration.js +324 -0
  359. package/scripts/lib/limpiar-basura-global.js +204 -0
  360. package/scripts/lib/longmemeval-runner.js +125 -125
  361. package/scripts/lib/metricas-dora.js +204 -204
  362. package/scripts/lib/notificaciones-telegram.js +1 -0
  363. package/scripts/lib/npm-version.js +1 -0
  364. package/scripts/lib/paquetes-conocidos.js +50 -50
  365. package/scripts/lib/plan-lock.js +61 -13
  366. package/scripts/lib/policy-broker.js +338 -0
  367. package/scripts/lib/policy-bundle.js +342 -0
  368. package/scripts/lib/policy-context-provider.js +310 -0
  369. package/scripts/lib/policy-contract.js +479 -0
  370. package/scripts/lib/policy-verifier-utils.js +65 -0
  371. package/scripts/lib/pr-analyzer.js +399 -399
  372. package/scripts/lib/principal-verifier.js +178 -0
  373. package/scripts/lib/prompt-builder.js +264 -264
  374. package/scripts/lib/resolver-plan-fase.js +37 -37
  375. package/scripts/lib/rrf-fusion.js +175 -175
  376. package/scripts/lib/runtime-adapter-contract.js +267 -0
  377. package/scripts/lib/runtime-artifact-verifier.js +426 -0
  378. package/scripts/lib/runtime-build-attestation.js +127 -0
  379. package/scripts/lib/runtime-bundle-installer.js +586 -0
  380. package/scripts/lib/runtime-compiler.js +327 -0
  381. package/scripts/lib/runtime-conformance.js +202 -0
  382. package/scripts/lib/runtime-doctor-core3.js +567 -0
  383. package/scripts/lib/runtime-doctor-input.js +59 -0
  384. package/scripts/lib/runtime-operation-adapter.js +267 -0
  385. package/scripts/lib/schema-version.js +164 -164
  386. package/scripts/lib/semantic-search.js +252 -252
  387. package/scripts/lib/signed-envelope.js +545 -0
  388. package/scripts/lib/single-use-store.js +359 -0
  389. package/scripts/lib/skills-externas.js +31 -0
  390. package/scripts/lib/toml-merge.js +204 -204
  391. package/scripts/lib/transformadores/codex.js +15 -8
  392. package/scripts/lib/transformadores/gemini.js +79 -5
  393. package/scripts/lib/w4-attestation-adapter.js +158 -0
  394. package/scripts/lib/w4-canario.js +337 -0
  395. package/scripts/lib/w4-claims.js +182 -0
  396. package/scripts/lib/w4-corpus-generador.js +542 -0
  397. package/scripts/lib/w4-gate-c5.js +115 -0
  398. package/scripts/lib/w4-harness-bajo-prueba.js +155 -0
  399. package/scripts/lib/w4-matriz-combos.js +55 -0
  400. package/scripts/lib/w4-motor-mutacion.js +1348 -0
  401. package/scripts/lib/w4-motor-replay.js +735 -0
  402. package/scripts/lib/w4-pin-origen.js +54 -0
  403. package/scripts/lib/w4-publicar-request.js +132 -0
  404. package/scripts/lib/w4-revocacion.js +62 -0
  405. package/scripts/lib/w4-runtimes-core3.js +38 -0
  406. package/scripts/lib/w4-scorer-certificacion.js +692 -0
  407. package/scripts/lib/w4-superficie-candidato.js +49 -0
  408. package/scripts/lib/w4-veredicto.js +452 -0
  409. package/scripts/lib/w4-verificar-veredicto.js +302 -0
  410. package/scripts/limpiar-artefactos-python.js +131 -131
  411. package/scripts/mcp-server/auth.js +105 -105
  412. package/scripts/mcp-server/cache.js +106 -106
  413. package/scripts/migrar-csv-a-array.js +168 -168
  414. package/scripts/migrar-fase-dominio.js +200 -200
  415. package/scripts/migrar-gates-legacy.js +108 -0
  416. package/scripts/publicar-certification-request.js +115 -0
  417. package/scripts/runtime-doctor.js +107 -0
  418. package/scripts/tui/componentes/selector-multi.js +189 -189
  419. package/scripts/tui/componentes/selector-unico.js +158 -158
  420. package/scripts/tui/ejecutores.js +375 -375
  421. package/scripts/tui/lib/colores.js +129 -129
  422. package/scripts/tui/lib/render.js +264 -264
  423. package/scripts/tui/lib/teclas.js +113 -113
  424. package/scripts/tui/pantallas/install-wizard.js +408 -403
  425. package/scripts/tui/pantallas/menu-principal.js +52 -52
  426. package/scripts/tui/pantallas/progreso.js +274 -274
  427. package/scripts/tui/pantallas/resumen.js +132 -132
  428. package/scripts/validar-userland-vacio.js +110 -110
  429. package/scripts/verificar-aislamiento-swl-eval.js +87 -0
  430. package/scripts/verificar-empaquetado-downstream.js +375 -0
  431. package/scripts/verificar-loop-constructor.js +215 -0
  432. package/scripts/verificar-trazabilidad.js +13 -6
  433. package/scripts/verificar-veredicto-real.js +84 -0
  434. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +0 -53
  435. 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`.