@saulwade/swl-ses 1.0.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 (702) hide show
  1. package/CLAUDE.md +238 -0
  2. package/README.md +560 -0
  3. package/_userland/agentes/.gitkeep +0 -0
  4. package/_userland/habilidades/.gitkeep +0 -0
  5. package/agentes/.evolved.json +9 -0
  6. package/agentes/accesibilidad-wcag-swl.md +692 -0
  7. package/agentes/arquitecto-swl.md +238 -0
  8. package/agentes/auto-evolucion-swl.md +854 -0
  9. package/agentes/backend-api-swl.md +470 -0
  10. package/agentes/backend-csharp-swl.md +418 -0
  11. package/agentes/backend-go-swl.md +388 -0
  12. package/agentes/backend-java-swl.md +279 -0
  13. package/agentes/backend-node-swl.md +477 -0
  14. package/agentes/backend-python-swl.md +608 -0
  15. package/agentes/backend-rust-swl.md +362 -0
  16. package/agentes/backend-workers-swl.md +480 -0
  17. package/agentes/cloud-infra-swl.md +485 -0
  18. package/agentes/consolidador-swl.md +539 -0
  19. package/agentes/datos-swl.md +584 -0
  20. package/agentes/depurador-swl.md +349 -0
  21. package/agentes/devops-ci-swl.md +374 -0
  22. package/agentes/disenador-ui-swl.md +558 -0
  23. package/agentes/documentador-swl.md +343 -0
  24. package/agentes/evals/arquitecto-swl.evals.json +56 -0
  25. package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
  26. package/agentes/evals/implementador-swl.evals.json +56 -0
  27. package/agentes/evals/orquestador-swl.evals.json +60 -0
  28. package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
  29. package/agentes/evals/red-team-swl.evals.json +59 -0
  30. package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
  31. package/agentes/frontend-angular-swl.md +627 -0
  32. package/agentes/frontend-css-swl.md +720 -0
  33. package/agentes/frontend-react-swl.md +696 -0
  34. package/agentes/frontend-swl.md +500 -0
  35. package/agentes/frontend-tailwind-swl.md +830 -0
  36. package/agentes/implementador-swl.md +328 -0
  37. package/agentes/investigador-swl.md +430 -0
  38. package/agentes/investigador-ux-swl.md +500 -0
  39. package/agentes/llm-apps-swl.md +276 -0
  40. package/agentes/migrador-swl.md +417 -0
  41. package/agentes/mobile-android-swl.md +509 -0
  42. package/agentes/mobile-cross-swl.md +539 -0
  43. package/agentes/mobile-ios-swl.md +500 -0
  44. package/agentes/mobile-testing-swl.md +300 -0
  45. package/agentes/notificador-swl.md +916 -0
  46. package/agentes/observabilidad-swl.md +436 -0
  47. package/agentes/orquestador-swl.md +884 -0
  48. package/agentes/pagos-swl.md +283 -0
  49. package/agentes/perfilador-usuario-swl.md +306 -0
  50. package/agentes/planificador-swl.md +402 -0
  51. package/agentes/producto-prd-swl.md +587 -0
  52. package/agentes/red-team-swl.md +216 -0
  53. package/agentes/release-manager-swl.md +568 -0
  54. package/agentes/rendimiento-swl.md +714 -0
  55. package/agentes/resolutor-build-swl.md +243 -0
  56. package/agentes/revisor-angular-swl.md +276 -0
  57. package/agentes/revisor-codigo-swl.md +348 -0
  58. package/agentes/revisor-csharp-swl.md +262 -0
  59. package/agentes/revisor-go-swl.md +257 -0
  60. package/agentes/revisor-java-swl.md +255 -0
  61. package/agentes/revisor-kotlin-swl.md +271 -0
  62. package/agentes/revisor-nextjs-swl.md +279 -0
  63. package/agentes/revisor-php-swl.md +269 -0
  64. package/agentes/revisor-react-swl.md +276 -0
  65. package/agentes/revisor-rust-swl.md +344 -0
  66. package/agentes/revisor-seguridad-swl.md +390 -0
  67. package/agentes/revisor-swift-swl.md +266 -0
  68. package/agentes/revisor-typescript-swl.md +344 -0
  69. package/agentes/sre-swl.md +265 -0
  70. package/agentes/tdd-qa-swl.md +354 -0
  71. package/agentes/ux-disenador-swl.md +501 -0
  72. package/bin/lib/bot-comandos.js +1030 -0
  73. package/bin/lib/bot-discovery.js +182 -0
  74. package/bin/lib/bot-git.js +142 -0
  75. package/bin/swl-ses.js +325 -0
  76. package/bin/swl-telegram-bot.js +442 -0
  77. package/bin/swl-telegram-bot.plist +21 -0
  78. package/bin/swl-telegram-bot.service +14 -0
  79. package/comandos/swl/.evolved.json +23 -0
  80. package/comandos/swl/actualizar.md +174 -0
  81. package/comandos/swl/adoptar-proyecto.md +207 -0
  82. package/comandos/swl/aprender.md +701 -0
  83. package/comandos/swl/auditar-deps.md +134 -0
  84. package/comandos/swl/autoresearch.md +170 -0
  85. package/comandos/swl/ayuda.md +224 -0
  86. package/comandos/swl/brainstorm.md +50 -0
  87. package/comandos/swl/checkpoint.md +330 -0
  88. package/comandos/swl/compactar.md +283 -0
  89. package/comandos/swl/configurar-ci.md +227 -0
  90. package/comandos/swl/contexto.md +112 -0
  91. package/comandos/swl/contribuir.md +233 -0
  92. package/comandos/swl/crear-skill.md +292 -0
  93. package/comandos/swl/cron.md +196 -0
  94. package/comandos/swl/dashboard.md +146 -0
  95. package/comandos/swl/discutir-fase.md +230 -0
  96. package/comandos/swl/ejecutar-fase.md +135 -0
  97. package/comandos/swl/evaluar-skill.md +487 -0
  98. package/comandos/swl/evolucion-estado.md +142 -0
  99. package/comandos/swl/evolucionar.md +259 -0
  100. package/comandos/swl/exportar-vault.md +189 -0
  101. package/comandos/swl/gateway.md +158 -0
  102. package/comandos/swl/inbox.md +116 -0
  103. package/comandos/swl/instalar.md +220 -0
  104. package/comandos/swl/instintos.md +86 -0
  105. package/comandos/swl/mapear-codebase.md +312 -0
  106. package/comandos/swl/mcp-status.md +175 -0
  107. package/comandos/swl/metricas.md +270 -0
  108. package/comandos/swl/modelo.md +102 -0
  109. package/comandos/swl/notificaciones.md +396 -0
  110. package/comandos/swl/nuevo-proyecto.md +154 -0
  111. package/comandos/swl/planear-fase.md +221 -0
  112. package/comandos/swl/plugins.md +256 -0
  113. package/comandos/swl/reflect-skills.md +125 -0
  114. package/comandos/swl/release.md +217 -0
  115. package/comandos/swl/revisar-impacto.md +206 -0
  116. package/comandos/swl/revisar.md +330 -0
  117. package/comandos/swl/salud.md +363 -0
  118. package/comandos/swl/sesiones.md +200 -0
  119. package/comandos/swl/skill-search.md +113 -0
  120. package/comandos/swl/verificar.md +585 -0
  121. package/comandos/swl/wiki.md +620 -0
  122. package/contextos/dev.md +32 -0
  123. package/contextos/research.md +30 -0
  124. package/contextos/review.md +31 -0
  125. package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
  126. package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
  127. package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
  128. package/habilidades/agent-browser/SKILL.md +218 -0
  129. package/habilidades/agentes-como-servicio/SKILL.md +218 -0
  130. package/habilidades/ai-runtime-security/SKILL.md +273 -0
  131. package/habilidades/angular-avanzado/SKILL.md +164 -0
  132. package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
  133. package/habilidades/angular-moderno/SKILL.md +186 -0
  134. package/habilidades/angular-moderno/evals/evals.json +45 -0
  135. package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
  136. package/habilidades/api-rest-diseno/SKILL.md +191 -0
  137. package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
  138. package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
  139. package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
  140. package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
  141. package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
  142. package/habilidades/async-python/SKILL.md +149 -0
  143. package/habilidades/async-python/evals/evals.json +47 -0
  144. package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
  145. package/habilidades/auth-patrones/.evolved.json +9 -0
  146. package/habilidades/auth-patrones/SKILL.md +413 -0
  147. package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
  148. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
  149. package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
  150. package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
  151. package/habilidades/autoresearch/SKILL.md +268 -0
  152. package/habilidades/autoresearch/evals/evals.json +41 -0
  153. package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
  154. package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
  155. package/habilidades/azure-cloud/SKILL.md +308 -0
  156. package/habilidades/azure-cloud/recursos/aks.md +327 -0
  157. package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
  158. package/habilidades/backend-production-resilience/SKILL.md +288 -0
  159. package/habilidades/brainstorming/SKILL.md +295 -0
  160. package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
  161. package/habilidades/build-errors-cpp/SKILL.md +270 -0
  162. package/habilidades/build-errors-csharp/SKILL.md +265 -0
  163. package/habilidades/build-errors-go/SKILL.md +306 -0
  164. package/habilidades/build-errors-java/SKILL.md +278 -0
  165. package/habilidades/build-errors-kotlin/SKILL.md +303 -0
  166. package/habilidades/build-errors-nextjs/SKILL.md +312 -0
  167. package/habilidades/build-errors-php/SKILL.md +270 -0
  168. package/habilidades/build-errors-python/SKILL.md +292 -0
  169. package/habilidades/build-errors-rust/SKILL.md +284 -0
  170. package/habilidades/build-errors-swift/SKILL.md +272 -0
  171. package/habilidades/build-errors-typescript/SKILL.md +369 -0
  172. package/habilidades/checklist-calidad/SKILL.md +271 -0
  173. package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
  174. package/habilidades/checklist-seguridad/SKILL.md +285 -0
  175. package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
  176. package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
  177. package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
  178. package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
  179. package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
  180. package/habilidades/cloud-aws/SKILL.md +142 -0
  181. package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
  182. package/habilidades/compactacion-contexto/SKILL.md +247 -0
  183. package/habilidades/contenedores-docker/SKILL.md +137 -0
  184. package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
  185. package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
  186. package/habilidades/context-builder/SKILL.md +170 -0
  187. package/habilidades/control-profundidad/SKILL.md +128 -0
  188. package/habilidades/csharp-experto/SKILL.md +322 -0
  189. package/habilidades/csharp-patrones/SKILL.md +316 -0
  190. package/habilidades/csharp-testing/SKILL.md +286 -0
  191. package/habilidades/css-moderno/SKILL.md +166 -0
  192. package/habilidades/css-moderno/evals/evals.json +43 -0
  193. package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
  194. package/habilidades/datos-etl/SKILL.md +129 -0
  195. package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
  196. package/habilidades/dbml-experto/SKILL.md +339 -0
  197. package/habilidades/dbml-experto/evals/evals.json +56 -0
  198. package/habilidades/dependencias-auditoria/SKILL.md +320 -0
  199. package/habilidades/deprecacion-migracion/SKILL.md +169 -0
  200. package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
  201. package/habilidades/design-tokens/SKILL.md +158 -0
  202. package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
  203. package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
  204. package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
  205. package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
  206. package/habilidades/discutir-fase/SKILL.md +188 -0
  207. package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
  208. package/habilidades/diseno-responsivo/SKILL.md +186 -0
  209. package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
  210. package/habilidades/django-experto/SKILL.md +205 -0
  211. package/habilidades/django-experto/recursos/async-django.md +390 -0
  212. package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
  213. package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
  214. package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
  215. package/habilidades/django-experto/recursos/testing-django.md +415 -0
  216. package/habilidades/doc-sync/SKILL.md +280 -0
  217. package/habilidades/drift-detection/SKILL.md +179 -0
  218. package/habilidades/ejecutar-fase/SKILL.md +468 -0
  219. package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
  220. package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
  221. package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
  222. package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
  223. package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
  224. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
  225. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
  226. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
  227. package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
  228. package/habilidades/evaluacion-agentes/SKILL.md +314 -0
  229. package/habilidades/event-driven/SKILL.md +153 -0
  230. package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
  231. package/habilidades/extraccion-documentos/SKILL.md +221 -0
  232. package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
  233. package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
  234. package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
  235. package/habilidades/fastapi-experto/SKILL.md +221 -0
  236. package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
  237. package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
  238. package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
  239. package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
  240. package/habilidades/filament-admin/SKILL.md +290 -0
  241. package/habilidades/frontend-avanzado/SKILL.md +257 -0
  242. package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
  243. package/habilidades/gcp-cloud/SKILL.md +260 -0
  244. package/habilidades/gcp-cloud/recursos/gke.md +234 -0
  245. package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
  246. package/habilidades/generacion-mermaid/SKILL.md +229 -0
  247. package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
  248. package/habilidades/go-experto/SKILL.md +305 -0
  249. package/habilidades/go-patrones/SKILL.md +299 -0
  250. package/habilidades/go-testing/SKILL.md +291 -0
  251. package/habilidades/graphql-experto/SKILL.md +323 -0
  252. package/habilidades/guardrail-semantico/SKILL.md +282 -0
  253. package/habilidades/harness-claude-code/SKILL.md +299 -0
  254. package/habilidades/iam-secretos/SKILL.md +265 -0
  255. package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
  256. package/habilidades/infra-github-actions/SKILL.md +166 -0
  257. package/habilidades/instalar-sistema/.evolved.json +9 -0
  258. package/habilidades/instalar-sistema/SKILL.md +221 -0
  259. package/habilidades/java-experto/SKILL.md +290 -0
  260. package/habilidades/java-patrones/SKILL.md +275 -0
  261. package/habilidades/java-testing/SKILL.md +288 -0
  262. package/habilidades/kotlin-compose/SKILL.md +278 -0
  263. package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
  264. package/habilidades/kotlin-experto/SKILL.md +318 -0
  265. package/habilidades/kotlin-testing/SKILL.md +267 -0
  266. package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
  267. package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
  268. package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
  269. package/habilidades/langchain-langraph/SKILL.md +386 -0
  270. package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
  271. package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
  272. package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
  273. package/habilidades/legacy-code-rescue/SKILL.md +267 -0
  274. package/habilidades/likec4-experto/SKILL.md +412 -0
  275. package/habilidades/likec4-experto/evals/evals.json +69 -0
  276. package/habilidades/manejo-errores/.evolved.json +9 -0
  277. package/habilidades/manejo-errores/SKILL.md +407 -0
  278. package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
  279. package/habilidades/mapear-codebase/SKILL.md +275 -0
  280. package/habilidades/memoria-busqueda/SKILL.md +194 -0
  281. package/habilidades/memoria-busqueda/evals/evals.json +44 -0
  282. package/habilidades/meta-skills-estandar/SKILL.md +298 -0
  283. package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
  284. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
  285. package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
  286. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
  287. package/habilidades/microservicios/SKILL.md +155 -0
  288. package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
  289. package/habilidades/mobile-flutter/SKILL.md +199 -0
  290. package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
  291. package/habilidades/mobile-react-native/SKILL.md +176 -0
  292. package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
  293. package/habilidades/mongodb-experto/SKILL.md +302 -0
  294. package/habilidades/monitoring-alertas/SKILL.md +201 -0
  295. package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
  296. package/habilidades/nestjs-experto/SKILL.md +307 -0
  297. package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
  298. package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
  299. package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
  300. package/habilidades/nextjs-experto/SKILL.md +335 -0
  301. package/habilidades/nextjs-patrones/SKILL.md +303 -0
  302. package/habilidades/nextjs-testing/SKILL.md +331 -0
  303. package/habilidades/node-experto/.evolved.json +9 -0
  304. package/habilidades/node-experto/SKILL.md +266 -0
  305. package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
  306. package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
  307. package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
  308. package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
  309. package/habilidades/nuevo-proyecto/SKILL.md +204 -0
  310. package/habilidades/orquestacion-async/SKILL.md +303 -0
  311. package/habilidades/paid-media-tracking/SKILL.md +269 -0
  312. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
  313. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
  314. package/habilidades/patrones-python/SKILL.md +228 -0
  315. package/habilidades/patrones-python/evals/evals.json +56 -0
  316. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
  317. package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
  318. package/habilidades/perfil-usuario/SKILL.md +200 -0
  319. package/habilidades/perfil-usuario/evals/evals.json +55 -0
  320. package/habilidades/performance-baseline/SKILL.md +297 -0
  321. package/habilidades/php-experto/SKILL.md +291 -0
  322. package/habilidades/php-patrones/SKILL.md +306 -0
  323. package/habilidades/php-testing/SKILL.md +280 -0
  324. package/habilidades/planear-fase/SKILL.md +269 -0
  325. package/habilidades/postgresql-experto/SKILL.md +151 -0
  326. package/habilidades/postgresql-experto/evals/evals.json +53 -0
  327. package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
  328. package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
  329. package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
  330. package/habilidades/privacy-memoria/SKILL.md +141 -0
  331. package/habilidades/privacy-memoria/evals/evals.json +43 -0
  332. package/habilidades/prompt-engineering/SKILL.md +518 -0
  333. package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
  334. package/habilidades/rag-arquitectura/SKILL.md +338 -0
  335. package/habilidades/rails-experto/SKILL.md +237 -0
  336. package/habilidades/rails-experto/recursos/active-record.md +260 -0
  337. package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
  338. package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
  339. package/habilidades/react-experto/SKILL.md +209 -0
  340. package/habilidades/react-experto/evals/evals.json +55 -0
  341. package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
  342. package/habilidades/react-optimizacion/SKILL.md +174 -0
  343. package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
  344. package/habilidades/redis-experto/SKILL.md +305 -0
  345. package/habilidades/release-semver/.evolved.json +9 -0
  346. package/habilidades/release-semver/SKILL.md +248 -0
  347. package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
  348. package/habilidades/rust-experto/SKILL.md +400 -0
  349. package/habilidades/rust-patrones/SKILL.md +296 -0
  350. package/habilidades/rust-testing/SKILL.md +311 -0
  351. package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
  352. package/habilidades/sql-optimizacion/SKILL.md +200 -0
  353. package/habilidades/sql-optimizacion/evals/evals.json +54 -0
  354. package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
  355. package/habilidades/sre-patrones/SKILL.md +333 -0
  356. package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
  357. package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
  358. package/habilidades/stripe-pagos/SKILL.md +550 -0
  359. package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
  360. package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
  361. package/habilidades/structured-outputs/SKILL.md +343 -0
  362. package/habilidades/swift-experto/SKILL.md +320 -0
  363. package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
  364. package/habilidades/swift-patrones/SKILL.md +313 -0
  365. package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
  366. package/habilidades/swift-testing/SKILL.md +254 -0
  367. package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
  368. package/habilidades/swl-dashboard/SKILL.md +370 -0
  369. package/habilidades/swl-markitdown/SKILL.md +285 -0
  370. package/habilidades/swl-markitdown/evals/evals.json +52 -0
  371. package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
  372. package/habilidades/tailwind-experto/SKILL.md +240 -0
  373. package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
  374. package/habilidades/tdd-workflow/SKILL.md +293 -0
  375. package/habilidades/terraform-experto/SKILL.md +321 -0
  376. package/habilidades/testing-python/SKILL.md +340 -0
  377. package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
  378. package/habilidades/threat-model-lite/SKILL.md +246 -0
  379. package/habilidades/tracing-processor/SKILL.md +212 -0
  380. package/habilidades/tracking-measurement/SKILL.md +239 -0
  381. package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
  382. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
  383. package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
  384. package/habilidades/typescript-avanzado/SKILL.md +144 -0
  385. package/habilidades/typescript-avanzado/evals/evals.json +55 -0
  386. package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
  387. package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
  388. package/habilidades/ux-diseno/SKILL.md +116 -0
  389. package/habilidades/ux-diseno/evals/evals.json +43 -0
  390. package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
  391. package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
  392. package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
  393. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
  394. package/habilidades/verificacion-evidencia/SKILL.md +160 -0
  395. package/habilidades/verificar-trabajo/SKILL.md +303 -0
  396. package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
  397. package/habilidades/wiki-conocimiento/SKILL.md +276 -0
  398. package/habilidades/wireframes-flujos/SKILL.md +212 -0
  399. package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
  400. package/habilidades/workflow-claude-code/SKILL.md +260 -0
  401. package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
  402. package/hooks/_run-hook.sh +57 -0
  403. package/hooks/actualizar-perfil-usuario.js +364 -0
  404. package/hooks/agente-lifecycle.js +71 -0
  405. package/hooks/aiisms-detector.js +173 -0
  406. package/hooks/audit-trail.js +204 -0
  407. package/hooks/auto-background.js +97 -0
  408. package/hooks/auto-consolidacion.js +178 -0
  409. package/hooks/auto-evolucion.js +666 -0
  410. package/hooks/auto-restaurar-settings.js +360 -0
  411. package/hooks/calidad-pre-commit.js +929 -0
  412. package/hooks/calidad-typescript.js +511 -0
  413. package/hooks/captura-feedback-usuario.js +148 -0
  414. package/hooks/check-update.js +211 -0
  415. package/hooks/clasificador-mensajes.js +271 -0
  416. package/hooks/degradacion-instintos.js +272 -0
  417. package/hooks/escaneo-secretos.js +389 -0
  418. package/hooks/extraccion-aprendizajes.js +763 -0
  419. package/hooks/grafo-contexto.js +129 -0
  420. package/hooks/graph-update.js +67 -0
  421. package/hooks/guardrail-modelo.js +247 -0
  422. package/hooks/inbox-aviso.js +75 -0
  423. package/hooks/inyeccion-contexto.js +246 -0
  424. package/hooks/lib/abort-registry.js +214 -0
  425. package/hooks/lib/agent-backend.js +210 -0
  426. package/hooks/lib/agent-comms.js +263 -0
  427. package/hooks/lib/agent-issue-codes.js +284 -0
  428. package/hooks/lib/agent-matcher.js +189 -0
  429. package/hooks/lib/async-hook-registry.js +252 -0
  430. package/hooks/lib/atomic-write.js +130 -0
  431. package/hooks/lib/auto-consolidator.js +335 -0
  432. package/hooks/lib/canary-skills.js +187 -0
  433. package/hooks/lib/consolidation-lock.js +291 -0
  434. package/hooks/lib/context-builder.js +430 -0
  435. package/hooks/lib/context-compressor.js +657 -0
  436. package/hooks/lib/convergence-detector.js +105 -0
  437. package/hooks/lib/delegation-tracker.js +198 -0
  438. package/hooks/lib/detectar-package-manager.js +423 -0
  439. package/hooks/lib/edit-accumulator.js +171 -0
  440. package/hooks/lib/error-classifier.js +308 -0
  441. package/hooks/lib/event-bus.js +112 -0
  442. package/hooks/lib/evolution-tracker.js +442 -0
  443. package/hooks/lib/execution-state.js +316 -0
  444. package/hooks/lib/fingerprint-id.js +135 -0
  445. package/hooks/lib/gateway-notify.js +116 -0
  446. package/hooks/lib/graph-security.js +75 -0
  447. package/hooks/lib/guardrail-metrics.js +202 -0
  448. package/hooks/lib/hook-circuit-breaker.js +206 -0
  449. package/hooks/lib/loop-detector.js +267 -0
  450. package/hooks/lib/mcp-health.js +184 -0
  451. package/hooks/lib/mcp-pool.js +436 -0
  452. package/hooks/lib/memory-search.js +506 -0
  453. package/hooks/lib/merkle-audit.js +96 -0
  454. package/hooks/lib/model-router.js +222 -0
  455. package/hooks/lib/normalize-error.js +324 -0
  456. package/hooks/lib/normalize-input.js +65 -0
  457. package/hooks/lib/nudge-tracker.js +306 -0
  458. package/hooks/lib/otlp-exporter.js +365 -0
  459. package/hooks/lib/performance-marks.js +239 -0
  460. package/hooks/lib/privacy-filter.js +128 -0
  461. package/hooks/lib/prompt-injection-scanner.js +209 -0
  462. package/hooks/lib/provenance-tracker.js +183 -0
  463. package/hooks/lib/rate-limit-tracker.js +253 -0
  464. package/hooks/lib/reflect-classifier.js +164 -0
  465. package/hooks/lib/resource-quota.js +122 -0
  466. package/hooks/lib/retry-jitter.js +165 -0
  467. package/hooks/lib/risk-engine.js +368 -0
  468. package/hooks/lib/run-log.js +408 -0
  469. package/hooks/lib/session-fts.js +379 -0
  470. package/hooks/lib/session-store.js +293 -0
  471. package/hooks/lib/singleton-guard.js +159 -0
  472. package/hooks/lib/skill-auditor.js +588 -0
  473. package/hooks/lib/sync-status.js +228 -0
  474. package/hooks/lib/taint-tracker.js +107 -0
  475. package/hooks/lib/task-service.js +295 -0
  476. package/hooks/lib/tech-skills-map.js +146 -0
  477. package/hooks/lib/telegram-cliente.js +159 -0
  478. package/hooks/lib/telegram-config.js +170 -0
  479. package/hooks/lib/token-budget.js +156 -0
  480. package/hooks/lib/token-estimator.js +420 -0
  481. package/hooks/lib/toon-compressor.js +245 -0
  482. package/hooks/lib/usage-model.js +183 -0
  483. package/hooks/lib/variable-resolver.js +230 -0
  484. package/hooks/linea-estado.js +324 -0
  485. package/hooks/metricas-evolucion.js +209 -0
  486. package/hooks/monitor-contexto.js +325 -0
  487. package/hooks/notificacion-sesion-stop.js +198 -0
  488. package/hooks/notificacion-telegram-notification.js +4 -0
  489. package/hooks/notificacion-telegram-subagent.js +4 -0
  490. package/hooks/notificacion-telegram.js +267 -0
  491. package/hooks/preservar-estado-pre-compact.js +150 -0
  492. package/hooks/proteccion-rutas.js +366 -0
  493. package/hooks/registro-turnos.js +209 -0
  494. package/hooks/resumen-sesion.js +249 -0
  495. package/hooks/risk-scoring.js +323 -0
  496. package/hooks/rotar-audit-auto.js +122 -0
  497. package/hooks/sugerir-regenerar-inventario.js +170 -0
  498. package/hooks/telemetria-agentes.js +167 -0
  499. package/hooks/tracking-costos.js +688 -0
  500. package/instintos/global.yaml +8 -0
  501. package/instintos/perfil-usuario.yaml +53 -0
  502. package/instintos/prompt-appendices.yaml +57 -0
  503. package/instintos/proyecto.yaml +372 -0
  504. package/manifiestos/gateway-config.json +77 -0
  505. package/manifiestos/handoff-context.json +223 -0
  506. package/manifiestos/hook-profiles.json +44 -0
  507. package/manifiestos/hooks-config.json +360 -0
  508. package/manifiestos/modulos.json +1173 -0
  509. package/manifiestos/perfiles.json +404 -0
  510. package/package.json +86 -0
  511. package/plantillas/ESTADO.md +109 -0
  512. package/plantillas/HOJA-RUTA.md +143 -0
  513. package/plantillas/PROYECTO.md +122 -0
  514. package/plantillas/REQUISITOS.md +132 -0
  515. package/plantillas/auditor-veto-template.md +105 -0
  516. package/plantillas/github-workflows/README.md +47 -0
  517. package/plantillas/github-workflows/release-please.yml +44 -0
  518. package/plantillas/github-workflows/swl-ci.yml +107 -0
  519. package/plantillas/github-workflows/swl-security.yml +51 -0
  520. package/plantillas/mcp-mineru.json +13 -0
  521. package/plantillas/research/ARQUITECTURA.md +220 -0
  522. package/plantillas/research/FUNCIONALIDADES.md +175 -0
  523. package/plantillas/research/RESUMEN.md +165 -0
  524. package/plantillas/research/STACK.md +233 -0
  525. package/plantillas/research/TRAMPAS.md +299 -0
  526. package/plantillas/skill-evals-template.json +44 -0
  527. package/plugin.json +343 -0
  528. package/reglas/accesibilidad.md +269 -0
  529. package/reglas/api-diseno.md +400 -0
  530. package/reglas/arquitectura.md +352 -0
  531. package/reglas/brevedad-output.md +124 -0
  532. package/reglas/cloud-infra.md +247 -0
  533. package/reglas/docs.md +245 -0
  534. package/reglas/estilo-codigo.md +201 -0
  535. package/reglas/git-workflow.md +245 -0
  536. package/reglas/gobernanza.md +271 -0
  537. package/reglas/harness-claude-code.md +213 -0
  538. package/reglas/hooks.md +186 -0
  539. package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
  540. package/reglas/lenguajes/csharp/hooks.md +281 -0
  541. package/reglas/lenguajes/csharp/patrones.md +226 -0
  542. package/reglas/lenguajes/csharp/seguridad.md +258 -0
  543. package/reglas/lenguajes/csharp/testing.md +176 -0
  544. package/reglas/lenguajes/go/estilo-codigo.md +195 -0
  545. package/reglas/lenguajes/go/hooks.md +249 -0
  546. package/reglas/lenguajes/go/patrones.md +249 -0
  547. package/reglas/lenguajes/go/seguridad.md +225 -0
  548. package/reglas/lenguajes/go/testing.md +272 -0
  549. package/reglas/lenguajes/java/estilo-codigo.md +217 -0
  550. package/reglas/lenguajes/java/hooks.md +251 -0
  551. package/reglas/lenguajes/java/patrones.md +226 -0
  552. package/reglas/lenguajes/java/seguridad.md +233 -0
  553. package/reglas/lenguajes/java/testing.md +238 -0
  554. package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
  555. package/reglas/lenguajes/kotlin/hooks.md +245 -0
  556. package/reglas/lenguajes/kotlin/patrones.md +201 -0
  557. package/reglas/lenguajes/kotlin/seguridad.md +202 -0
  558. package/reglas/lenguajes/kotlin/testing.md +236 -0
  559. package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
  560. package/reglas/lenguajes/nextjs/hooks.md +186 -0
  561. package/reglas/lenguajes/nextjs/patrones.md +225 -0
  562. package/reglas/lenguajes/nextjs/seguridad.md +216 -0
  563. package/reglas/lenguajes/nextjs/testing.md +193 -0
  564. package/reglas/lenguajes/php/estilo-codigo.md +228 -0
  565. package/reglas/lenguajes/php/hooks.md +165 -0
  566. package/reglas/lenguajes/php/patrones.md +233 -0
  567. package/reglas/lenguajes/php/seguridad.md +186 -0
  568. package/reglas/lenguajes/php/testing.md +205 -0
  569. package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
  570. package/reglas/lenguajes/rust/hooks.md +240 -0
  571. package/reglas/lenguajes/rust/patrones.md +250 -0
  572. package/reglas/lenguajes/rust/seguridad.md +221 -0
  573. package/reglas/lenguajes/rust/testing.md +194 -0
  574. package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
  575. package/reglas/lenguajes/swift/hooks.md +257 -0
  576. package/reglas/lenguajes/swift/patrones.md +235 -0
  577. package/reglas/lenguajes/swift/seguridad.md +248 -0
  578. package/reglas/lenguajes/swift/testing.md +242 -0
  579. package/reglas/markitdown.md +60 -0
  580. package/reglas/memoria-consolidada.md +209 -0
  581. package/reglas/patrones.md +225 -0
  582. package/reglas/performance.md +195 -0
  583. package/reglas/pruebas.md +159 -0
  584. package/reglas/seguridad-agentes.md +351 -0
  585. package/reglas/seguridad.md +151 -0
  586. package/reglas/skills-estandar.md +373 -0
  587. package/reglas/testing.md +193 -0
  588. package/schemas/agent-contract.json +176 -0
  589. package/schemas/agent-frontmatter.schema.json +149 -0
  590. package/schemas/agent-message.schema.json +53 -0
  591. package/schemas/agent-output-implementacion.schema.json +85 -0
  592. package/schemas/agent-output-planificacion.schema.json +113 -0
  593. package/schemas/agent-output-review.schema.json +78 -0
  594. package/schemas/diary-entry.schema.json +80 -0
  595. package/schemas/hook-profiles.schema.json +39 -0
  596. package/schemas/hooks-config.schema.json +74 -0
  597. package/schemas/instinct.schema.json +115 -0
  598. package/schemas/modulos.schema.json +29 -0
  599. package/schemas/perfiles.schema.json +28 -0
  600. package/schemas/plugin.schema.json +64 -0
  601. package/schemas/skill-evals.schema.json +95 -0
  602. package/schemas/skill-frontmatter.schema.json +170 -0
  603. package/scripts/actualizar.js +145 -0
  604. package/scripts/audit-skills.sh +78 -0
  605. package/scripts/auditar-agentes-gaps.js +149 -0
  606. package/scripts/auditar-cobertura-frameworks.js +241 -0
  607. package/scripts/auditar-skills-gaps.js +206 -0
  608. package/scripts/bootstrap-instintos.js +259 -0
  609. package/scripts/check-update.js +109 -0
  610. package/scripts/comandos/agents.js +105 -0
  611. package/scripts/comandos/info.js +108 -0
  612. package/scripts/comandos/install-asistido.js +186 -0
  613. package/scripts/comandos/skills.js +211 -0
  614. package/scripts/configurar-branch-protection.js +418 -0
  615. package/scripts/daemon-swl.py +388 -0
  616. package/scripts/desinstalar.js +130 -0
  617. package/scripts/doctor.js +559 -0
  618. package/scripts/field-report.js +199 -0
  619. package/scripts/generar-inventario.js +317 -0
  620. package/scripts/inbox-tmux-inject.js +161 -0
  621. package/scripts/inferir-herramientas-permitidas.js +586 -0
  622. package/scripts/inicializar.js +133 -0
  623. package/scripts/instalador.js +1031 -0
  624. package/scripts/instalar-git-hook.js +122 -0
  625. package/scripts/lib/agp-frontmatter.js +222 -0
  626. package/scripts/lib/append-con-marcadores.js +199 -0
  627. package/scripts/lib/artefactos-python.js +43 -0
  628. package/scripts/lib/audit-query.js +221 -0
  629. package/scripts/lib/autostart-linux.js +347 -0
  630. package/scripts/lib/autostart-macos.js +360 -0
  631. package/scripts/lib/autostart-windows.js +307 -0
  632. package/scripts/lib/budget-enforcer.js +252 -0
  633. package/scripts/lib/claude-sessions.js +285 -0
  634. package/scripts/lib/configurar-ci.js +380 -0
  635. package/scripts/lib/console-span-exporter.js +92 -0
  636. package/scripts/lib/contadores-inventario.js +217 -0
  637. package/scripts/lib/dashboard-widgets.js +290 -0
  638. package/scripts/lib/detectar-runtime.js +279 -0
  639. package/scripts/lib/detectar-stack.js +187 -0
  640. package/scripts/lib/diary-entry.js +234 -0
  641. package/scripts/lib/drift-detector.js +545 -0
  642. package/scripts/lib/estado.js +124 -0
  643. package/scripts/lib/gestor-componentes.js +243 -0
  644. package/scripts/lib/gitignore-manifest.js +305 -0
  645. package/scripts/lib/graph-analyze.py +556 -0
  646. package/scripts/lib/graph-builder.py +485 -0
  647. package/scripts/lib/graph-cluster.py +259 -0
  648. package/scripts/lib/health-row.js +168 -0
  649. package/scripts/lib/hooks-settings.js +789 -0
  650. package/scripts/lib/manifiestos.js +138 -0
  651. package/scripts/lib/mc-client.js +137 -0
  652. package/scripts/lib/notificaciones-telegram.js +1107 -0
  653. package/scripts/lib/npm-version.js +261 -0
  654. package/scripts/lib/paquetes-conocidos.js +50 -0
  655. package/scripts/lib/preservar-usuario.js +586 -0
  656. package/scripts/lib/prompt-builder.js +264 -0
  657. package/scripts/lib/resolver-externo.js +332 -0
  658. package/scripts/lib/schedule-parser.js +305 -0
  659. package/scripts/lib/scoring-instintos.js +240 -0
  660. package/scripts/lib/seguridad.js +160 -0
  661. package/scripts/lib/selector-interactivo.js +152 -0
  662. package/scripts/lib/semantic-search.js +242 -0
  663. package/scripts/lib/skill-discovery.js +234 -0
  664. package/scripts/lib/skill-metrics.js +246 -0
  665. package/scripts/lib/skill-normalizer.js +112 -0
  666. package/scripts/lib/skills-hub.js +340 -0
  667. package/scripts/lib/span-schema.js +134 -0
  668. package/scripts/lib/tool-cost-analyzer.js +255 -0
  669. package/scripts/lib/tracing-processor-interface.js +286 -0
  670. package/scripts/lib/transformadores/base.js +80 -0
  671. package/scripts/lib/transformadores/claude.js +124 -0
  672. package/scripts/lib/transformadores/codex.js +115 -0
  673. package/scripts/lib/transformadores/copilot.js +106 -0
  674. package/scripts/lib/transformadores/gemini.js +74 -0
  675. package/scripts/lib/transformadores/index.js +35 -0
  676. package/scripts/lib/transformadores/opencode.js +75 -0
  677. package/scripts/lib/ui.js +259 -0
  678. package/scripts/limpiar-artefactos-python.js +131 -0
  679. package/scripts/mcp-orchestrator.py +386 -0
  680. package/scripts/mcp-pool-manager.py +352 -0
  681. package/scripts/mcp-telemetry.py +378 -0
  682. package/scripts/poblar-evolvable.js +226 -0
  683. package/scripts/publicar.js +287 -0
  684. package/scripts/reflect-skills.js +403 -0
  685. package/scripts/rotar-audit-logs.js +185 -0
  686. package/scripts/run-skill-evals.js +242 -0
  687. package/scripts/smoke-test.js +374 -0
  688. package/scripts/token-analysis.py +471 -0
  689. package/scripts/validar-manifest.js +195 -0
  690. package/scripts/validar-memoria.js +321 -0
  691. package/scripts/validar-tests-aislamiento.js +184 -0
  692. package/scripts/validar-tokens-test.js +208 -0
  693. package/scripts/validar.js +147 -0
  694. package/scripts/validate-markdown.py +339 -0
  695. package/scripts/validate-skills.py +385 -0
  696. package/scripts/vendor/claude-usage/README.md +116 -0
  697. package/scripts/vendor/claude-usage/cli.py +334 -0
  698. package/scripts/vendor/claude-usage/dashboard.py +795 -0
  699. package/scripts/vendor/claude-usage/scanner.py +467 -0
  700. package/scripts/vendor/markitdown/cli.py +194 -0
  701. package/scripts/verificar-evolucion.js +289 -0
  702. package/scripts/verificar-release.js +494 -0
@@ -0,0 +1,322 @@
1
+ # Ingeniería de Datos y ETL — Implementaciones Completas
2
+
3
+ ## Calidad de Datos — Validación con Great Expectations
4
+
5
+ ```python
6
+ # Usando Great Expectations para validación declarativa
7
+ import great_expectations as gx
8
+
9
+ def validar_pedidos(df: pd.DataFrame) -> ValidationResult:
10
+ """Valida el DataFrame de pedidos antes de cargar a Silver."""
11
+
12
+ context = gx.get_context()
13
+ suite = context.add_or_update_expectation_suite("pedidos_suite")
14
+
15
+ validator = context.get_validator(
16
+ batch_request=gx.core.BatchRequest(datasource_name="staging"),
17
+ expectation_suite=suite,
18
+ )
19
+
20
+ # Validaciones de integridad
21
+ validator.expect_column_to_exist("pedido_id")
22
+ validator.expect_column_values_to_not_be_null("pedido_id")
23
+ validator.expect_column_values_to_be_unique("pedido_id")
24
+
25
+ # Validaciones de dominio
26
+ validator.expect_column_values_to_be_in_set(
27
+ "estatus", {"PENDIENTE", "PAGADO", "ENVIADO", "CANCELADO"}
28
+ )
29
+ validator.expect_column_values_to_be_between(
30
+ "monto_total", min_value=0.01, max_value=999_999.99
31
+ )
32
+ validator.expect_column_values_to_match_regex(
33
+ "email_cliente", r"^[^@\s]+@[^@\s]+\.[^@\s]+$"
34
+ )
35
+
36
+ # Validación de freshness
37
+ validator.expect_column_max_to_be_between(
38
+ "fecha_pedido",
39
+ min_value=str(date.today() - timedelta(days=1)),
40
+ max_value=str(date.today() + timedelta(days=1)),
41
+ )
42
+
43
+ resultado = validator.validate()
44
+
45
+ if not resultado.success:
46
+ fallos = [
47
+ r for r in resultado.results if not r.success
48
+ ]
49
+ logger.error(
50
+ "validacion_datos_fallida",
51
+ total_expectativas=len(resultado.results),
52
+ total_fallos=len(fallos),
53
+ detalle=[str(f.expectation_config) for f in fallos[:5]],
54
+ )
55
+ raise ErrorCalidadDatos(
56
+ f"{len(fallos)} validaciones fallidas en pedidos",
57
+ {"fallos": len(fallos), "total": len(resultado.results)},
58
+ )
59
+
60
+ return resultado
61
+ ```
62
+
63
+ ---
64
+
65
+ ## CDC — Change Data Capture con Debezium
66
+
67
+ ```yaml
68
+ # debezium-connector.json
69
+ {
70
+ "name": "pedidos-cdc-connector",
71
+ "config": {
72
+ "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
73
+ "database.hostname": "postgres-produccion",
74
+ "database.port": "5432",
75
+ "database.user": "debezium_user",
76
+ "database.password": "${file:/opt/secrets/debezium.properties:password}",
77
+ "database.dbname": "appdb",
78
+ "database.server.name": "appdb",
79
+ "table.include.list": "public.pedidos,public.usuarios",
80
+ "plugin.name": "pgoutput",
81
+ "publication.name": "debezium_pub",
82
+ "slot.name": "debezium_slot",
83
+ "topic.prefix": "cdc",
84
+ "transforms": "route",
85
+ "transforms.route.type": "org.apache.kafka.connect.transforms.ReplaceField$Value",
86
+ "key.converter": "io.confluent.kafka.serializers.KafkaAvroSerializer",
87
+ "value.converter": "io.confluent.kafka.serializers.KafkaAvroSerializer"
88
+ }
89
+ }
90
+ ```
91
+
92
+ ```python
93
+ # Consumidor CDC en Python
94
+ from confluent_kafka import Consumer, KafkaError
95
+ import json
96
+
97
+
98
+ def procesar_evento_cdc(evento: dict) -> None:
99
+ """Procesa un evento CDC de Debezium."""
100
+ operacion = evento.get("op") # c=create, u=update, d=delete, r=snapshot
101
+
102
+ match operacion:
103
+ case "c":
104
+ nuevo = evento["after"]
105
+ silver_pedidos.upsert(transformar_pedido(nuevo))
106
+
107
+ case "u":
108
+ antes = evento["before"]
109
+ despues = evento["after"]
110
+ silver_pedidos.upsert(transformar_pedido(despues))
111
+ auditar_cambio(antes, despues)
112
+
113
+ case "d":
114
+ eliminado = evento["before"]
115
+ silver_pedidos.marcar_eliminado(eliminado["id"])
116
+
117
+ case "r":
118
+ silver_pedidos.upsert(transformar_pedido(evento["after"]))
119
+
120
+
121
+ consumer = Consumer({
122
+ "bootstrap.servers": "kafka:9092",
123
+ "group.id": "cdc-silver-processor",
124
+ "auto.offset.reset": "earliest",
125
+ "enable.auto.commit": False,
126
+ })
127
+
128
+ consumer.subscribe(["cdc.appdb.public.pedidos"])
129
+
130
+ while True:
131
+ msg = consumer.poll(timeout=1.0)
132
+ if msg is None:
133
+ continue
134
+ if msg.error():
135
+ if msg.error().code() == KafkaError._PARTITION_EOF:
136
+ continue
137
+ raise KafkaError(msg.error())
138
+
139
+ try:
140
+ evento = json.loads(msg.value())
141
+ procesar_evento_cdc(evento)
142
+ consumer.commit(asynchronous=False)
143
+ except Exception as exc:
144
+ logger.error("error_procesando_cdc", error=str(exc), exc_info=True)
145
+ enviar_dlq(msg.value(), str(exc))
146
+ consumer.commit(asynchronous=False)
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Evolución de Esquemas — Forward/Backward Compatibility
152
+
153
+ ```python
154
+ # Estrategia: columnas nuevas siempre nullable o con default
155
+ # NUNCA eliminar columnas en producción — deprecar primero
156
+
157
+ # Migración segura — backward compatible
158
+ """
159
+ -- BIEN: columna nueva con default
160
+ ALTER TABLE silver.pedidos
161
+ ADD COLUMN IF NOT EXISTS canal_venta TEXT DEFAULT 'WEB';
162
+
163
+ -- MAL: cambiar tipo de columna existente directamente
164
+ -- ALTER TABLE silver.pedidos ALTER COLUMN monto TYPE BIGINT;
165
+
166
+ -- BIEN: renombrar con período de transición
167
+ ALTER TABLE silver.pedidos ADD COLUMN monto_centavos BIGINT;
168
+ UPDATE silver.pedidos SET monto_centavos = (monto * 100)::BIGINT;
169
+ -- (semana después, cuando todos los consumidores usen la nueva columna)
170
+ ALTER TABLE silver.pedidos DROP COLUMN monto;
171
+ ALTER TABLE silver.pedidos RENAME COLUMN monto_centavos TO monto;
172
+ """
173
+
174
+ # Schema registry con Avro para streaming
175
+ SCHEMA_PEDIDO_V1 = {
176
+ "type": "record",
177
+ "name": "Pedido",
178
+ "fields": [
179
+ {"name": "id", "type": "string"},
180
+ {"name": "monto", "type": "double"},
181
+ {"name": "estatus","type": "string"},
182
+ ]
183
+ }
184
+
185
+ # V2: campo nuevo con default — backward compatible
186
+ SCHEMA_PEDIDO_V2 = {
187
+ "type": "record",
188
+ "name": "Pedido",
189
+ "fields": [
190
+ {"name": "id", "type": "string"},
191
+ {"name": "monto", "type": "double"},
192
+ {"name": "estatus", "type": "string"},
193
+ {"name": "canal_venta", "type": "string", "default": "WEB"},
194
+ ]
195
+ }
196
+ ```
197
+
198
+ ---
199
+
200
+ ## Patrones dbt — Transformaciones Declarativas
201
+
202
+ ```sql
203
+ -- models/silver/pedidos_limpio.sql
204
+ {{
205
+ config(
206
+ materialized='incremental',
207
+ unique_key='pedido_id',
208
+ on_schema_change='append_new_columns',
209
+ partition_by={
210
+ "field": "fecha_pedido",
211
+ "data_type": "date",
212
+ "granularity": "day"
213
+ }
214
+ )
215
+ }}
216
+
217
+ WITH fuente AS (
218
+ SELECT * FROM {{ source('bronze', 'pedidos_raw') }}
219
+ {% if is_incremental() %}
220
+ WHERE _ingestado_en > (SELECT MAX(_ingestado_en) FROM {{ this }})
221
+ {% endif %}
222
+ ),
223
+
224
+ limpieza AS (
225
+ SELECT
226
+ TRIM(pedido_id) AS pedido_id,
227
+ LOWER(TRIM(email_cliente)) AS email_cliente,
228
+ UPPER(TRIM(estatus)) AS estatus,
229
+ ROUND(CAST(monto_total AS NUMERIC), 2) AS monto_total,
230
+ DATE(fecha_pedido) AS fecha_pedido,
231
+ _ingestado_en,
232
+ EXTRACT(YEAR FROM DATE(fecha_pedido)) AS anio,
233
+ EXTRACT(MONTH FROM DATE(fecha_pedido)) AS mes,
234
+ CASE WHEN monto_total < 0 THEN TRUE ELSE FALSE END AS tiene_monto_negativo,
235
+ CASE WHEN email_cliente NOT LIKE '%@%' THEN TRUE ELSE FALSE END AS email_invalido
236
+
237
+ FROM fuente
238
+ WHERE pedido_id IS NOT NULL
239
+ )
240
+
241
+ SELECT * FROM limpieza
242
+ ```
243
+
244
+ ```yaml
245
+ # models/silver/schema.yml
246
+ models:
247
+ - name: pedidos_limpio
248
+ description: "Pedidos normalizados de Bronze, deduplicados y validados"
249
+ columns:
250
+ - name: pedido_id
251
+ tests:
252
+ - not_null
253
+ - unique
254
+ - name: email_cliente
255
+ tests:
256
+ - not_null
257
+ - name: estatus
258
+ tests:
259
+ - accepted_values:
260
+ values: ["PENDIENTE", "PAGADO", "ENVIADO", "CANCELADO"]
261
+ - name: monto_total
262
+ tests:
263
+ - not_null
264
+ - dbt_utils.expression_is_true:
265
+ expression: ">= 0"
266
+ ```
267
+
268
+ ---
269
+
270
+ ## Linaje de Datos
271
+
272
+ ```python
273
+ # linaje.py — registrar transformaciones para auditoría
274
+ from dataclasses import dataclass
275
+ from datetime import datetime, timezone
276
+
277
+
278
+ @dataclass
279
+ class NodoLinaje:
280
+ nombre: str
281
+ tipo: str # "fuente", "transformacion", "destino"
282
+ ubicacion: str
283
+
284
+
285
+ @dataclass
286
+ class EventoLinaje:
287
+ run_id: str
288
+ pipeline: str
289
+ origen: NodoLinaje
290
+ destino: NodoLinaje
291
+ registros_entrada: int
292
+ registros_salida: int
293
+ registros_rechazados: int
294
+ timestamp: datetime
295
+ query_o_script: str | None = None
296
+
297
+
298
+ class RegistroLinaje:
299
+ def registrar(self, evento: EventoLinaje) -> None:
300
+ db.execute("""
301
+ INSERT INTO meta.linaje_datos (
302
+ run_id, pipeline, origen_nombre, origen_tipo, origen_ubicacion,
303
+ destino_nombre, destino_tipo, destino_ubicacion,
304
+ registros_entrada, registros_salida, registros_rechazados,
305
+ timestamp, query_script
306
+ ) VALUES (
307
+ :run_id, :pipeline, :onom, :otipo, :oubic,
308
+ :dnom, :dtipo, :dubic,
309
+ :rent, :rsal, :rrec,
310
+ :ts, :qs
311
+ )
312
+ """, {
313
+ "run_id": evento.run_id, "pipeline": evento.pipeline,
314
+ "onom": evento.origen.nombre, "otipo": evento.origen.tipo,
315
+ "oubic": evento.origen.ubicacion,
316
+ "dnom": evento.destino.nombre, "dtipo": evento.destino.tipo,
317
+ "dubic": evento.destino.ubicacion,
318
+ "rent": evento.registros_entrada, "rsal": evento.registros_salida,
319
+ "rrec": evento.registros_rechazados,
320
+ "ts": evento.timestamp.isoformat(), "qs": evento.query_o_script,
321
+ })
322
+ ```
@@ -0,0 +1,339 @@
1
+ ---
2
+ name: dbml-experto
3
+ description: >
4
+ Experto en DBML (Database Markup Language) — lenguaje declarativo para describir
5
+ esquemas de bases de datos. Cubre sintaxis (tables, refs, enums, indexes, notes,
6
+ projects), parseo programático con @dbml/core cuando está instalado, fallback a
7
+ heurísticas de texto plano cuando no, y casos de uso en proyectos data-heavy:
8
+ análisis de schema, migración entre dialectos (PG/MySQL/MSSQL), detección de
9
+ relaciones huérfanas, generación de DDL. Cargar cuando un proyecto contenga
10
+ archivos .dbml, o cuando el usuario mencione dbdiagram.io, chartdb.io, schema
11
+ as code o DBML explícitamente. NO cargar para SQL plano, Prisma schema, TypeORM
12
+ entities u otros DSLs de schema — son otros skills distintos.
13
+ version: "1.0.0"
14
+ herramientasPermitidas: [Read]
15
+ evolvable: true # default para skill estandar
16
+ exclusiones:
17
+ - "No cargar para SQL plano (DDL, DML, migraciones) — para SQL cargar `postgresql-experto` o `sql-optimizacion`."
18
+ - "No cargar para Prisma schema (.prisma), TypeORM entities o SQLAlchemy declarative — son DSLs incompatibles con DBML."
19
+ - "No cargar para generar diagramas visuales de arquitectura — para diagramas cargar `diagrama-arquitectura` o `generacion-mermaid`."
20
+ - "No cargar para aplicar migraciones a una base de datos real — este skill es análisis estático de DBML, no ejecución de DDL."
21
+ ---
22
+ # DBML Experto — Parseo y análisis de esquemas DBML
23
+
24
+ ## Cuándo cargar esta skill
25
+
26
+ - El proyecto contiene archivos `.dbml` o un directorio `db/` con `.dbml`.
27
+ - El usuario menciona `dbdiagram.io`, `chartdb.io`, "schema as code", "DBML",
28
+ o pide migrar entre dialectos SQL.
29
+ - Un agente `datos-swl` o revisor de lenguaje necesita analizar relaciones
30
+ programáticamente y el proyecto usa DBML como fuente de verdad del schema.
31
+
32
+ **No cargar** cuando:
33
+ - El schema está en SQL plano (usar skills de SQL/backend-* correspondientes).
34
+ - El schema está en Prisma (`.prisma`), TypeORM, SQLAlchemy declarative — son otros DSLs.
35
+ - La tarea es solo leer un diagrama sin modificar ni analizar relaciones.
36
+
37
+ ---
38
+
39
+ ## Dependencia opcional — `@dbml/core`
40
+
41
+ Esta skill **funciona sin dependencias** usando heurísticas de texto plano, pero
42
+ gana precisión si el proyecto del usuario tiene `@dbml/core` instalado.
43
+
44
+ ### Detectar si está disponible
45
+
46
+ ```bash
47
+ # En el proyecto del usuario
48
+ test -d node_modules/@dbml/core && echo "DISPONIBLE" || echo "NO_INSTALADO"
49
+ ```
50
+
51
+ ### Si NO está disponible y la tarea requiere parseo estructural
52
+
53
+ Sugerir al usuario instalarlo en **su** proyecto (nunca en swl-ses):
54
+
55
+ ```bash
56
+ npm install --save-dev @dbml/core
57
+ ```
58
+
59
+ Documentado también en `MANUAL_USO.md` → "Dependencias externas — referencia
60
+ detallada" → `@dbml/core`.
61
+
62
+ ### Si SÍ está disponible — patrón de uso
63
+
64
+ ```javascript
65
+ const fs = require('node:fs');
66
+ const { importer } = require('@dbml/core');
67
+
68
+ const texto = fs.readFileSync('db/schema.dbml', 'utf8');
69
+ const schema = importer.import(texto, 'dbml');
70
+
71
+ // schema.tables[i]
72
+ // .name, .note, .fields[], .indexes[]
73
+ // schema.refs[i]
74
+ // .endpoints[0].tableName, .endpoints[0].fieldNames
75
+ // .endpoints[1].tableName, .endpoints[1].fieldNames
76
+ // .onDelete, .onUpdate
77
+ // schema.enums[i]
78
+ // .name, .values[]
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Sintaxis DBML esencial
84
+
85
+ ### Tabla básica
86
+
87
+ ```dbml
88
+ Table users {
89
+ id int [pk, increment]
90
+ email varchar [unique, not null]
91
+ name varchar
92
+ created_at timestamp [default: `now()`]
93
+ }
94
+ ```
95
+
96
+ | Modificador | Significado |
97
+ |-------------|-------------|
98
+ | `pk` | Primary key |
99
+ | `increment` | Auto-incremento (serial/identity) |
100
+ | `unique` | Restricción UNIQUE |
101
+ | `not null` | NOT NULL |
102
+ | `default: X` | Valor default (usar backticks para expresiones) |
103
+ | `note: 'texto'` | Comentario asociado al campo |
104
+ | `ref: > tabla.campo` | Relación inline |
105
+
106
+ ### Relaciones (refs)
107
+
108
+ Tres formas equivalentes:
109
+
110
+ ```dbml
111
+ # A. Inline en el campo
112
+ Table posts {
113
+ id int [pk]
114
+ user_id int [ref: > users.id] // many-to-one
115
+ }
116
+
117
+ # B. Referencia separada
118
+ Ref: posts.user_id > users.id
119
+
120
+ # C. Bloque de referencias
121
+ Ref user_post {
122
+ users.id < posts.user_id [delete: cascade, update: no action]
123
+ }
124
+ ```
125
+
126
+ Cardinalidades:
127
+ - `>` many-to-one (de hijo hacia padre)
128
+ - `<` one-to-many
129
+ - `-` one-to-one
130
+ - `<>` many-to-many (requiere tabla pivote explícita)
131
+
132
+ ### Índices
133
+
134
+ ```dbml
135
+ Table users {
136
+ id int [pk]
137
+ email varchar
138
+ country varchar
139
+
140
+ Indexes {
141
+ email [unique]
142
+ (country, email) [name: 'idx_country_email']
143
+ `lower(email)` [type: btree]
144
+ }
145
+ }
146
+ ```
147
+
148
+ ### Enums
149
+
150
+ ```dbml
151
+ Enum order_status {
152
+ pending
153
+ paid
154
+ shipped [note: 'el producto salió del almacén']
155
+ cancelled
156
+ }
157
+
158
+ Table orders {
159
+ id int [pk]
160
+ status order_status [not null, default: 'pending']
161
+ }
162
+ ```
163
+
164
+ ### Agrupación en Projects y TableGroups
165
+
166
+ ```dbml
167
+ Project mi_sistema {
168
+ database_type: 'PostgreSQL'
169
+ Note: 'Esquema principal de la aplicación'
170
+ }
171
+
172
+ TableGroup facturacion {
173
+ orders
174
+ order_items
175
+ payments
176
+ }
177
+ ```
178
+
179
+ ---
180
+
181
+ ## Casos de uso en SWL
182
+
183
+ ### 1. Análisis de relaciones huérfanas
184
+
185
+ Detectar refs cuyo endpoint apunta a tablas/campos inexistentes:
186
+
187
+ ```javascript
188
+ const tablas = new Map(schema.tables.map(t => [t.name, new Set(t.fields.map(f => f.name))]));
189
+
190
+ const huérfanas = schema.refs.filter(r => {
191
+ for (const ep of r.endpoints) {
192
+ const cols = tablas.get(ep.tableName);
193
+ if (!cols) return true;
194
+ for (const fn of ep.fieldNames) if (!cols.has(fn)) return true;
195
+ }
196
+ return false;
197
+ });
198
+ ```
199
+
200
+ ### 2. Detección de tablas sin PK
201
+
202
+ ```javascript
203
+ const sinPK = schema.tables.filter(t =>
204
+ !t.fields.some(f => f.pk) &&
205
+ !t.indexes?.some(i => i.pk)
206
+ );
207
+ ```
208
+
209
+ Reportar como anti-patrón (excepto tablas de log append-only declaradas en note).
210
+
211
+ ### 3. Migración entre dialectos
212
+
213
+ Convertir tipos DBML → dialecto específico. Tabla base (extender según necesidad):
214
+
215
+ | DBML | PostgreSQL | MySQL | MSSQL | SQLite |
216
+ |------|-----------|-------|-------|--------|
217
+ | `int` | `integer` | `int` | `int` | `integer` |
218
+ | `bigint` | `bigint` | `bigint` | `bigint` | `integer` |
219
+ | `varchar` | `varchar(255)` | `varchar(255)` | `nvarchar(255)` | `text` |
220
+ | `text` | `text` | `text` | `nvarchar(max)` | `text` |
221
+ | `timestamp` | `timestamp` | `datetime` | `datetime2` | `text` |
222
+ | `boolean` | `boolean` | `tinyint(1)` | `bit` | `integer` |
223
+ | `uuid` | `uuid` | `char(36)` | `uniqueidentifier` | `text` |
224
+ | `json` | `jsonb` | `json` | `nvarchar(max)` | `text` |
225
+
226
+ Reglas al migrar:
227
+ - `timestamp with tz` → `timestamptz` (PG) / `datetime` (MySQL sin tz) / `datetimeoffset` (MSSQL).
228
+ - Defaults con funciones (`` `now()` ``) requieren ajuste por dialecto.
229
+ - `increment` → `SERIAL`/`IDENTITY`/`AUTOINCREMENT` según dialecto.
230
+ - Reglas `on delete cascade` se soportan en todos; `on delete set null` requiere columna nullable.
231
+
232
+ ### 4. Fallback sin `@dbml/core` — heurísticas de texto
233
+
234
+ Si el usuario no puede instalar la dependencia, usar regex conservadoras:
235
+
236
+ ```javascript
237
+ // Extraer nombres de tablas
238
+ const tablas = [...texto.matchAll(/^\s*Table\s+(\w+)\s*\{/gm)].map(m => m[1]);
239
+
240
+ // Extraer refs inline
241
+ const refsInline = [...texto.matchAll(/\[ref:\s*[<>\-]\s*(\w+)\.(\w+)/g)]
242
+ .map(m => ({ tabla: m[1], campo: m[2] }));
243
+
244
+ // Extraer refs separadas
245
+ const refsSep = [...texto.matchAll(/^\s*Ref(?:\s+\w+)?\s*:?\s*(\w+)\.(\w+)\s*([<>\-]+)\s*(\w+)\.(\w+)/gm)]
246
+ .map(m => ({ fromTabla: m[1], fromCampo: m[2], card: m[3], toTabla: m[4], toCampo: m[5] }));
247
+ ```
248
+
249
+ **Limitaciones del fallback**:
250
+ - No resuelve tipos compuestos ni enums referenciados.
251
+ - Puede fallar con comentarios embebidos o strings con llaves.
252
+ - No valida sintaxis.
253
+
254
+ Siempre reportar al usuario: "Análisis hecho sin `@dbml/core` — precisión
255
+ limitada, considera instalarlo si vas a tomar decisiones estructurales."
256
+
257
+ ---
258
+
259
+ ## Patrones buenos y malos en DBML
260
+
261
+ ### BIEN — nombres consistentes
262
+
263
+ ```dbml
264
+ Table users {
265
+ id int [pk, increment]
266
+ organization_id int [ref: > organizations.id]
267
+ }
268
+ ```
269
+
270
+ ### MAL — inconsistencia snake_case vs camelCase
271
+
272
+ ```dbml
273
+ Table users {
274
+ id int [pk]
275
+ organizationId int [ref: > organizations.id] // mezclar convenciones rompe tooling
276
+ }
277
+ ```
278
+
279
+ ### BIEN — documentar decisiones con `Note`
280
+
281
+ ```dbml
282
+ Table events {
283
+ id bigint [pk, increment]
284
+ payload jsonb [not null]
285
+
286
+ Note: 'Append-only. No usar UPDATE. Particionada por mes vía pg_partman.'
287
+ }
288
+ ```
289
+
290
+ ### MAL — relaciones implícitas sin `Ref`
291
+
292
+ ```dbml
293
+ Table orders {
294
+ id int [pk]
295
+ user_id int // sin [ref] ni Ref separada: relación invisible al parser
296
+ }
297
+ ```
298
+
299
+ ---
300
+
301
+ ## Integración con otros skills y agentes
302
+
303
+ - **`datos-swl`** (agente): invoca esta skill al detectar `.dbml` en el proyecto.
304
+ - **`revisor-impacto`** (`/swl:revisar-impacto`): puede cruzar refs DBML con el
305
+ grafo de código para detectar tablas sin consumidores.
306
+ - **`migrador-swl`** (agente): usa la tabla de migración de tipos para generar
307
+ scripts DDL multi-dialecto.
308
+ - **`seguridad.md`** (regla): aplicar revisión de nombres sensibles en columnas
309
+ (email, password, ssn, etc.) independientemente del DSL.
310
+
311
+ ---
312
+
313
+ ## Lo que esta skill NO hace
314
+
315
+ - **No genera diagramas visuales** — para eso usar `dbdiagram.io`, `chartdb.io` o
316
+ el skill `generacion-mermaid` con output ER.
317
+ - **No ejecuta migraciones** — solo analiza y genera SQL como texto. El usuario
318
+ aplica manualmente con su herramienta de migración.
319
+ - **No valida contra una BD real** — es análisis estático del DBML.
320
+ - **No reemplaza** Prisma/TypeORM/SQLAlchemy — esos son ORMs, DBML es solo el
321
+ schema declarativo.
322
+
323
+ ---
324
+
325
+ ## Gotchas / Errores comunes no obvios
326
+
327
+ **Las heurísticas de texto plano (sin `@dbml/core`) fallan al parsear tablas con `Note` multilínea**: el regex `^\s*Table\s+(\w+)\s*\{` no coincide cuando la tabla tiene un bloque `Note: '''...'''` antes de los campos, porque la llave de apertura `{` está en la misma línea que `Note`. Causa: DBML permite bloques de texto multilínea con comillas triples que pueden contener llaves. Fix: al usar heurísticas de fallback, reportar explícitamente al usuario que el análisis puede ser incompleto si el schema usa notas multilínea. Para schemas complejos, insistir en instalar `@dbml/core`.
328
+
329
+ **Las cardinalidades `<>` (many-to-many) en DBML no generan tabla pivote automáticamente**: definir `Ref: users.id <> posts.id` es válido en DBML pero no corresponde a ninguna implementación real de muchos a muchos en SQL — las BDs relacionales requieren tabla intermedia explícita. Causa: DBML permite la cardinalidad `<>` como notación conceptual, pero los parsers de DDL la ignoran o la rechazan. Fix: para relaciones many-to-many, siempre crear la tabla pivote explícita (`user_posts { user_id int [ref: > users.id], post_id int [ref: > posts.id] }`) en lugar de usar `<>` directo.
330
+
331
+ **`@dbml/core` lanza error de parseo en schemas con nombres de tabla que contienen guiones**: `Table mi-tabla { ... }` es inválido en DBML — los identificadores solo permiten letras, números y guión bajo. Causa: DBML sigue convenciones de identificadores SQL donde el guión es un operador de resta, no parte del nombre. Fix: usar snake_case (`mi_tabla`) o PascalCase (`MiTabla`) para nombres de tablas. Si el schema existente tiene guiones, renombrar antes de parsear con `@dbml/core`.
332
+
333
+ **El fallback de heurísticas extrae refs inline pero omite los bloques `Ref` separados al final del archivo**: el regex para refs inline (`\[ref: > tabla.campo\]`) funciona, pero el regex para bloques separados `Ref: tabla1.campo > tabla2.campo` puede no capturar todas las variantes de formato (con nombre de ref, con acción on delete). Causa: el formato de bloques `Ref` tiene más variantes sintácticas que los refs inline. Fix: después del análisis heurístico, buscar explícitamente líneas que empiecen con `Ref` y reportarlas por separado al usuario para revisión manual.
334
+
335
+ ## Referencias
336
+
337
+ - DBML oficial: https://dbml.dbdiagram.io/docs/
338
+ - `@dbml/core` en npm: https://www.npmjs.com/package/@dbml/core
339
+ - Instalación y atribución: `MANUAL_USO.md` → Dependencias externas → `@dbml/core`.