@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,122 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Instala un pre-commit hook en el proyecto actual que ejecuta
6
+ * `swl-ses check-update` en cada commit. Sirve para avisar de nuevas
7
+ * versiones de SWL independientemente del CLI de IA que use el
8
+ * desarrollador (Codex, Copilot, Gemini, OpenCode). En Claude Code
9
+ * ya se cubre vía el hook UserPromptSubmit — este pre-commit es
10
+ * complementario para los demás runtimes.
11
+ *
12
+ * Comportamiento:
13
+ * - Detecta .husky/ primero (proyectos con husky) y escribe ahí.
14
+ * - Si no hay husky, escribe directamente a .git/hooks/pre-commit.
15
+ * - Es idempotente: si ya existe un pre-commit con el marcador
16
+ * SWL_CHECK_UPDATE, no duplica. Si existe sin el marcador, NO
17
+ * sobreescribe — pide al usuario añadir la línea manualmente.
18
+ * - NUNCA bloquea el commit: la línea termina con `|| true` y
19
+ * redirige stderr para que falle silenciosamente.
20
+ *
21
+ * Uso:
22
+ * npx swl-ses@latest install-git-hook
23
+ * npx swl-ses@latest install-git-hook --force (reemplaza hook existente)
24
+ */
25
+
26
+ const fs = require('fs');
27
+ const path = require('path');
28
+
29
+ const MARCADOR = '# SWL_CHECK_UPDATE — no borrar esta línea';
30
+ const LINEA_CHECK =
31
+ 'npx --no-install swl-ses@latest check-update 2>&1 || true';
32
+
33
+ function log(msg) { process.stdout.write(msg + '\n'); }
34
+ function warn(msg) { process.stderr.write(msg + '\n'); }
35
+
36
+ function detectarContexto(cwd) {
37
+ const gitDir = path.join(cwd, '.git');
38
+ const huskyDir = path.join(cwd, '.husky');
39
+
40
+ if (!fs.existsSync(gitDir)) {
41
+ return { error: 'No se detectó repo git (.git/ no existe).' };
42
+ }
43
+
44
+ if (fs.existsSync(huskyDir) && fs.statSync(huskyDir).isDirectory()) {
45
+ return { tipo: 'husky', ruta: path.join(huskyDir, 'pre-commit') };
46
+ }
47
+
48
+ return { tipo: 'git-hooks', ruta: path.join(gitDir, 'hooks', 'pre-commit') };
49
+ }
50
+
51
+ function plantillaHusky() {
52
+ return [
53
+ '#!/usr/bin/env sh',
54
+ '. "$(dirname -- "$0")/_/husky.sh"',
55
+ '',
56
+ MARCADOR,
57
+ LINEA_CHECK,
58
+ '',
59
+ ].join('\n');
60
+ }
61
+
62
+ function plantillaGit() {
63
+ return [
64
+ '#!/bin/sh',
65
+ MARCADOR,
66
+ LINEA_CHECK,
67
+ '',
68
+ ].join('\n');
69
+ }
70
+
71
+ function instalar({ force = false, cwd = process.cwd() } = {}) {
72
+ const ctx = detectarContexto(cwd);
73
+ if (ctx.error) {
74
+ warn('[swl-ses] ' + ctx.error);
75
+ return { ok: false, codigo: 'NO_GIT' };
76
+ }
77
+
78
+ const plantilla = ctx.tipo === 'husky' ? plantillaHusky() : plantillaGit();
79
+
80
+ // Caso 1: no existe → crear directo
81
+ if (!fs.existsSync(ctx.ruta)) {
82
+ fs.mkdirSync(path.dirname(ctx.ruta), { recursive: true });
83
+ fs.writeFileSync(ctx.ruta, plantilla, { mode: 0o755 });
84
+ log(`[swl-ses] pre-commit creado: ${ctx.ruta}`);
85
+ log('[swl-ses] Este hook avisará de nuevas versiones al hacer commit.');
86
+ log('[swl-ses] NUNCA bloquea el commit — solo imprime aviso.');
87
+ return { ok: true, codigo: 'CREADO', ruta: ctx.ruta };
88
+ }
89
+
90
+ const contenido = fs.readFileSync(ctx.ruta, 'utf8');
91
+
92
+ // Caso 2: ya instalado → idempotente
93
+ if (contenido.includes(MARCADOR)) {
94
+ log(`[swl-ses] pre-commit ya tiene el check de versión: ${ctx.ruta}`);
95
+ return { ok: true, codigo: 'YA_INSTALADO', ruta: ctx.ruta };
96
+ }
97
+
98
+ // Caso 3: existe pero sin marcador → anexar o reemplazar según force
99
+ if (force) {
100
+ fs.writeFileSync(ctx.ruta, plantilla, { mode: 0o755 });
101
+ log(`[swl-ses] pre-commit reemplazado (--force): ${ctx.ruta}`);
102
+ return { ok: true, codigo: 'REEMPLAZADO', ruta: ctx.ruta };
103
+ }
104
+
105
+ const anexo =
106
+ contenido.trimEnd() + '\n\n' + MARCADOR + '\n' + LINEA_CHECK + '\n';
107
+ fs.writeFileSync(ctx.ruta, anexo, { mode: 0o755 });
108
+ log(`[swl-ses] check de versión anexado a pre-commit existente: ${ctx.ruta}`);
109
+ log('[swl-ses] Si quieres revertir, borra las dos últimas líneas del hook.');
110
+ return { ok: true, codigo: 'ANEXADO', ruta: ctx.ruta };
111
+ }
112
+
113
+ function main() {
114
+ const args = process.argv.slice(2);
115
+ const force = args.includes('--force');
116
+ const resultado = instalar({ force });
117
+ process.exit(resultado.ok ? 0 : 1);
118
+ }
119
+
120
+ if (require.main === module) main();
121
+
122
+ module.exports = { instalar, MARCADOR, LINEA_CHECK };
@@ -0,0 +1,222 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * agp-frontmatter.js
5
+ *
6
+ * Parser YAML minimalista y validador de safety invariants para el loop
7
+ * AGP (Autogenesis Protocol) adoptado por swl-ses.
8
+ *
9
+ * Funciones:
10
+ * parsearFrontmatter(rutaArchivo) - lee archivo .md, extrae --- ... ---
11
+ * parsearCuerpoYaml(cuerpo) - parsea solo el cuerpo YAML crudo
12
+ * aplicarOperador(actual, op, esp) - eq/neq/lte/gte/in/not_in
13
+ * validarInvariantesDeAgente(nombre, dirs?)
14
+ * - valida que el frontmatter cumpla
15
+ * los invariantes declarados
16
+ *
17
+ * Zero-deps. Idempotente. Reutilizable por run-skill-evals.js,
18
+ * hooks/*, y tests unitarios.
19
+ *
20
+ * @module scripts/lib/agp-frontmatter
21
+ */
22
+
23
+ const fs = require('fs');
24
+ const path = require('path');
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // Parser YAML
28
+ // ---------------------------------------------------------------------------
29
+
30
+ /**
31
+ * Lee un archivo .md y extrae su frontmatter YAML como objeto.
32
+ * @param {string} rutaArchivo ruta absoluta o relativa al archivo
33
+ * @returns {object|null} objeto del frontmatter, o null si no hay
34
+ */
35
+ function parsearFrontmatter(rutaArchivo) {
36
+ let raw;
37
+ try {
38
+ raw = fs.readFileSync(rutaArchivo, 'utf8');
39
+ } catch {
40
+ return null;
41
+ }
42
+ const match = raw.match(/^---\s*\r?\n([\s\S]*?)\r?\n---\s*(?:\r?\n|$)/);
43
+ if (!match) return null;
44
+ return parsearCuerpoYaml(match[1]);
45
+ }
46
+
47
+ /**
48
+ * Parsea un cuerpo YAML (sin los delimitadores `---`).
49
+ * Soporta escalares, listas inline, listas multilinea y listas de objetos.
50
+ *
51
+ * @param {string} cuerpo
52
+ * @returns {object}
53
+ */
54
+ function parsearCuerpoYaml(cuerpo) {
55
+ const lineas = cuerpo.split(/\r?\n/);
56
+ const obj = {};
57
+ let claveLista = null;
58
+ let lista = null;
59
+ let itemObjeto = null;
60
+ let sangriaItem = null;
61
+
62
+ const cerrarItemObjeto = () => {
63
+ if (itemObjeto && lista) {
64
+ lista.push(itemObjeto);
65
+ itemObjeto = null;
66
+ }
67
+ };
68
+
69
+ const cerrarLista = () => {
70
+ cerrarItemObjeto();
71
+ if (claveLista && lista) obj[claveLista] = lista;
72
+ claveLista = null;
73
+ lista = null;
74
+ sangriaItem = null;
75
+ };
76
+
77
+ for (const linea of lineas) {
78
+ if (!linea.trim() || /^\s*#/.test(linea)) continue;
79
+ const lineaSinComentario = despedirComentario(linea);
80
+ if (!lineaSinComentario.trim()) continue;
81
+
82
+ const mItem = lineaSinComentario.match(/^(\s+)-\s+(.+?)\s*$/);
83
+ if (mItem && claveLista) {
84
+ cerrarItemObjeto();
85
+ sangriaItem = mItem[1].length;
86
+ const resto = mItem[2];
87
+ const mKV = resto.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);
88
+ if (mKV) {
89
+ itemObjeto = {};
90
+ const [, k, v] = mKV;
91
+ itemObjeto[k] = v.trim() === '' ? null : convertirValor(v.trim());
92
+ } else {
93
+ lista.push(convertirValor(resto));
94
+ }
95
+ continue;
96
+ }
97
+
98
+ const mSub = lineaSinComentario.match(/^(\s+)([a-zA-Z_][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);
99
+ if (mSub && itemObjeto && sangriaItem !== null && mSub[1].length > sangriaItem) {
100
+ const [, , k, v] = mSub;
101
+ itemObjeto[k] = parsearValorConListaInline(v.trim());
102
+ continue;
103
+ }
104
+
105
+ const mCampo = lineaSinComentario.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);
106
+ if (!mCampo) continue;
107
+ cerrarLista();
108
+ const [, clave, valorRaw] = mCampo;
109
+ const valorTrim = valorRaw.trim();
110
+ if (valorTrim === '') {
111
+ claveLista = clave;
112
+ lista = [];
113
+ itemObjeto = null;
114
+ sangriaItem = null;
115
+ continue;
116
+ }
117
+ obj[clave] = parsearValorConListaInline(valorTrim);
118
+ }
119
+ cerrarLista();
120
+ return obj;
121
+ }
122
+
123
+ function parsearValorConListaInline(s) {
124
+ if (s === '' || s === null || s === undefined) return null;
125
+ if (s.startsWith('[') && s.endsWith(']')) {
126
+ const contenido = s.slice(1, -1).trim();
127
+ if (contenido === '') return [];
128
+ return contenido.split(',').map(x => convertirValor(x.trim()));
129
+ }
130
+ return convertirValor(s);
131
+ }
132
+
133
+ function despedirComentario(linea) {
134
+ const m = linea.match(/^(.*?)(?:\s+#\s.*)?$/);
135
+ return m ? m[1] : linea;
136
+ }
137
+
138
+ function convertirValor(s) {
139
+ if (s === 'true') return true;
140
+ if (s === 'false') return false;
141
+ if (s === 'null' || s === '~') return null;
142
+ if (/^-?\d+(\.\d+)?$/.test(s)) return parseFloat(s);
143
+ return s.replace(/^['"]|['"]$/g, '');
144
+ }
145
+
146
+ // ---------------------------------------------------------------------------
147
+ // Validador de safety invariants (AGP Commit operator)
148
+ // ---------------------------------------------------------------------------
149
+
150
+ /**
151
+ * @param {*} actual valor actual del campo en el frontmatter
152
+ * @param {string} operador eq|neq|lte|gte|in|not_in
153
+ * @param {*} esperado valor esperado
154
+ * @returns {boolean}
155
+ */
156
+ function aplicarOperador(actual, operador, esperado) {
157
+ switch (operador) {
158
+ case 'eq': return actual === esperado;
159
+ case 'neq': return actual !== esperado;
160
+ case 'lte': return typeof actual === 'number' && typeof esperado === 'number' && actual <= esperado;
161
+ case 'gte': return typeof actual === 'number' && typeof esperado === 'number' && actual >= esperado;
162
+ case 'in': return Array.isArray(esperado) && esperado.includes(actual);
163
+ case 'not_in': return Array.isArray(esperado) && !esperado.includes(actual);
164
+ default: return false;
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Busca el agente/skill por nombre y valida los invariantes declarados en su
170
+ * frontmatter. Si el frontmatter no existe, no tiene campo `invariantes`, o
171
+ * el archivo no se encuentra, devuelve { ok: true, ... skipped: "..." }.
172
+ *
173
+ * @param {string} nombre ej "notificador-swl" o "ux-diseno"
174
+ * @param {object} [opts]
175
+ * @param {string} [opts.cwd] directorio base (default: process.cwd())
176
+ * @returns {{ ok: boolean, violaciones: Array, skipped?: string }}
177
+ */
178
+ function validarInvariantesDeAgente(nombre, opts = {}) {
179
+ const base = opts.cwd || process.cwd();
180
+ const candidatos = [
181
+ path.join(base, 'agentes', `${nombre}.md`),
182
+ path.join(base, 'habilidades', nombre, 'SKILL.md'),
183
+ ];
184
+ let rutaArchivo = null;
185
+ for (const c of candidatos) {
186
+ if (fs.existsSync(c)) { rutaArchivo = c; break; }
187
+ }
188
+ if (!rutaArchivo) {
189
+ return { ok: true, violaciones: [], skipped: `archivo no encontrado para ${nombre}` };
190
+ }
191
+ const fm = parsearFrontmatter(rutaArchivo);
192
+ if (!fm) {
193
+ return { ok: true, violaciones: [], skipped: `frontmatter no parseable en ${rutaArchivo}` };
194
+ }
195
+ const invariantes = Array.isArray(fm.invariantes) ? fm.invariantes : [];
196
+ if (invariantes.length === 0) {
197
+ return { ok: true, violaciones: [], skipped: 'sin invariantes declarados' };
198
+ }
199
+ const violaciones = [];
200
+ for (const inv of invariantes) {
201
+ if (!inv || typeof inv !== 'object') continue;
202
+ const actual = fm[inv.campo];
203
+ if (!aplicarOperador(actual, inv.operador, inv.valor)) {
204
+ violaciones.push({
205
+ campo: inv.campo,
206
+ operador: inv.operador,
207
+ esperado: inv.valor,
208
+ actual,
209
+ razon: inv.razon || null,
210
+ });
211
+ }
212
+ }
213
+ return { ok: violaciones.length === 0, violaciones };
214
+ }
215
+
216
+ module.exports = {
217
+ parsearFrontmatter,
218
+ parsearCuerpoYaml,
219
+ aplicarOperador,
220
+ validarInvariantesDeAgente,
221
+ convertirValor,
222
+ };
@@ -0,0 +1,199 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * append-con-marcadores.js — Gestión idempotente de bloques dentro de archivos
5
+ * markdown del usuario.
6
+ *
7
+ * Inserta o reemplaza un bloque delimitado por `beginTag` y `endTag` dentro
8
+ * de un archivo, sin tocar el resto del contenido. Cubre 4 escenarios:
9
+ *
10
+ * 1. El archivo no existe → crearlo con solo el bloque.
11
+ * 2. El archivo existe sin marcadores → hacer append del bloque al final.
12
+ * 3. El archivo existe con marcadores → reemplazar solo el contenido entre ellos.
13
+ * 4. Marcadores mal formados → error explícito, no se toca el archivo.
14
+ *
15
+ * Escritura atómica vía rename. Nunca corrompe el archivo original.
16
+ *
17
+ * Uso típico:
18
+ * const { mergeConMarcadores } = require('./lib/append-con-marcadores');
19
+ * const resultado = mergeConMarcadores('/ruta/CLAUDE.md', contenidoBloque, {
20
+ * beginTag: '<!-- SWL-BEGIN v5.11.0 -->',
21
+ * endTag: '<!-- SWL-END -->',
22
+ * });
23
+ * // resultado.accion: 'creado' | 'append' | 'reemplazado' | 'sin-cambios' | 'error'
24
+ *
25
+ * Zero-deps, Node 18+, CRLF-safe.
26
+ *
27
+ * @module scripts/lib/append-con-marcadores
28
+ */
29
+
30
+ const fs = require('fs');
31
+ const path = require('path');
32
+ const crypto = require('crypto');
33
+
34
+ const DEFAULT_BEGIN_PREFIX = '<!-- SWL-BEGIN';
35
+ const DEFAULT_END_TAG = '<!-- SWL-END -->';
36
+
37
+ /**
38
+ * Escapa una cadena para uso literal en regex.
39
+ */
40
+ function escapeRegex(s) {
41
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
42
+ }
43
+
44
+ /**
45
+ * Construye el bloque completo con marcadores y contenido.
46
+ * Incluye salto de línea antes/después para separarlo del resto.
47
+ */
48
+ function ensamblarBloque(beginTag, endTag, contenido) {
49
+ return `${beginTag}\n${contenido.trimEnd()}\n${endTag}`;
50
+ }
51
+
52
+ /**
53
+ * Detecta si el archivo ya contiene un bloque SWL previo (de cualquier versión).
54
+ * Devuelve el rango { start, end } (índices de caracteres en el texto), o null.
55
+ *
56
+ * Busca líneas que empiecen con beginPrefix (p.ej. `<!-- SWL-BEGIN`) y terminen
57
+ * con endTag literal. El regex cubre varias versiones intermedias.
58
+ */
59
+ function localizarBloquePrevio(texto, beginPrefix, endTag) {
60
+ const rePatron = new RegExp(
61
+ `${escapeRegex(beginPrefix)}[^\\r\\n]*[\\r\\n]+[\\s\\S]*?${escapeRegex(endTag)}`,
62
+ 'm',
63
+ );
64
+ const m = texto.match(rePatron);
65
+ if (!m) return null;
66
+ return { start: m.index, end: m.index + m[0].length };
67
+ }
68
+
69
+ /**
70
+ * Escribe contenido de forma atómica (temp file + rename).
71
+ * El rename es atómico en el mismo filesystem.
72
+ */
73
+ function escrituraAtomica(archivoPath, contenido) {
74
+ const dir = path.dirname(archivoPath);
75
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
76
+
77
+ const suffix = crypto.randomBytes(4).toString('hex');
78
+ const tmpPath = path.join(dir, `.${path.basename(archivoPath)}.${suffix}.tmp`);
79
+
80
+ try {
81
+ fs.writeFileSync(tmpPath, contenido, 'utf8');
82
+ fs.renameSync(tmpPath, archivoPath);
83
+ } catch (err) {
84
+ try { fs.unlinkSync(tmpPath); } catch {}
85
+ throw err;
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Fusiona `contenidoBloque` dentro de `archivoPath` gestionando los marcadores.
91
+ *
92
+ * @param {string} archivoPath - Ruta absoluta del archivo destino.
93
+ * @param {string} contenidoBloque - Contenido a colocar entre los marcadores (sin incluirlos).
94
+ * @param {object} [opciones]
95
+ * @param {string} [opciones.beginTag=`<!-- SWL-BEGIN -->`] - Marcador de inicio.
96
+ * @param {string} [opciones.endTag=`<!-- SWL-END -->`] - Marcador de fin.
97
+ * @param {string} [opciones.beginPrefix=`<!-- SWL-BEGIN`] - Prefijo usado para
98
+ * detectar bloques de versiones previas. Útil cuando beginTag incluye versión
99
+ * (p.ej. `<!-- SWL-BEGIN v5.11.0 -->`) y quieres que la próxima actualización
100
+ * reemplace también `<!-- SWL-BEGIN v5.10.5 -->`.
101
+ * @param {boolean} [opciones.crearSiNoExiste=true] - Si el archivo no existe, créalo.
102
+ * @returns {{accion: string, archivo: string, bytesEscritos?: number, detalle?: string}}
103
+ * accion ∈ { 'creado', 'append', 'reemplazado', 'sin-cambios', 'error' }
104
+ */
105
+ function mergeConMarcadores(archivoPath, contenidoBloque, opciones = {}) {
106
+ const beginTag = opciones.beginTag || `${DEFAULT_BEGIN_PREFIX} -->`;
107
+ const endTag = opciones.endTag || DEFAULT_END_TAG;
108
+ const beginPrefix = opciones.beginPrefix || DEFAULT_BEGIN_PREFIX;
109
+ const crearSiNoExiste = opciones.crearSiNoExiste !== false;
110
+
111
+ const bloqueCompleto = ensamblarBloque(beginTag, endTag, contenidoBloque);
112
+
113
+ // Caso 1: archivo no existe
114
+ if (!fs.existsSync(archivoPath)) {
115
+ if (!crearSiNoExiste) {
116
+ return { accion: 'error', archivo: archivoPath, detalle: 'archivo-no-existe-y-crear-deshabilitado' };
117
+ }
118
+ try {
119
+ escrituraAtomica(archivoPath, bloqueCompleto + '\n');
120
+ return { accion: 'creado', archivo: archivoPath, bytesEscritos: Buffer.byteLength(bloqueCompleto, 'utf8') };
121
+ } catch (err) {
122
+ return { accion: 'error', archivo: archivoPath, detalle: err.message };
123
+ }
124
+ }
125
+
126
+ // Leer contenido actual
127
+ let texto;
128
+ try {
129
+ texto = fs.readFileSync(archivoPath, 'utf8');
130
+ } catch (err) {
131
+ return { accion: 'error', archivo: archivoPath, detalle: 'read-error: ' + err.message };
132
+ }
133
+
134
+ // Caso 3: ya hay un bloque SWL (cualquier versión)
135
+ const rango = localizarBloquePrevio(texto, beginPrefix, endTag);
136
+ if (rango) {
137
+ const bloqueActual = texto.slice(rango.start, rango.end);
138
+ if (bloqueActual === bloqueCompleto) {
139
+ return { accion: 'sin-cambios', archivo: archivoPath };
140
+ }
141
+ const nuevo = texto.slice(0, rango.start) + bloqueCompleto + texto.slice(rango.end);
142
+ try {
143
+ escrituraAtomica(archivoPath, nuevo);
144
+ return { accion: 'reemplazado', archivo: archivoPath, bytesEscritos: Buffer.byteLength(nuevo, 'utf8') };
145
+ } catch (err) {
146
+ return { accion: 'error', archivo: archivoPath, detalle: 'write-error: ' + err.message };
147
+ }
148
+ }
149
+
150
+ // Caso 2: archivo existe sin marcadores — append al final
151
+ const sep = texto.endsWith('\n\n') ? '' : (texto.endsWith('\n') ? '\n' : '\n\n');
152
+ const nuevo = texto + sep + bloqueCompleto + '\n';
153
+ try {
154
+ escrituraAtomica(archivoPath, nuevo);
155
+ return { accion: 'append', archivo: archivoPath, bytesEscritos: Buffer.byteLength(nuevo, 'utf8') };
156
+ } catch (err) {
157
+ return { accion: 'error', archivo: archivoPath, detalle: 'write-error: ' + err.message };
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Elimina un bloque SWL existente del archivo (útil para /swl:uninstall).
163
+ * Si no hay bloque, retorna sin-cambios. Si el bloque queda como único
164
+ * contenido del archivo, elimina el archivo.
165
+ */
166
+ function eliminarBloque(archivoPath, opciones = {}) {
167
+ const endTag = opciones.endTag || DEFAULT_END_TAG;
168
+ const beginPrefix = opciones.beginPrefix || DEFAULT_BEGIN_PREFIX;
169
+
170
+ if (!fs.existsSync(archivoPath)) {
171
+ return { accion: 'sin-cambios', archivo: archivoPath, detalle: 'archivo-no-existe' };
172
+ }
173
+ let texto;
174
+ try {
175
+ texto = fs.readFileSync(archivoPath, 'utf8');
176
+ } catch (err) {
177
+ return { accion: 'error', archivo: archivoPath, detalle: err.message };
178
+ }
179
+
180
+ const rango = localizarBloquePrevio(texto, beginPrefix, endTag);
181
+ if (!rango) return { accion: 'sin-cambios', archivo: archivoPath };
182
+
183
+ const antes = texto.slice(0, rango.start).trimEnd();
184
+ const despues = texto.slice(rango.end).trimStart();
185
+ const nuevo = (antes && despues) ? `${antes}\n\n${despues}\n` : (antes || despues || '');
186
+
187
+ if (!nuevo.trim()) {
188
+ try { fs.unlinkSync(archivoPath); } catch {}
189
+ return { accion: 'archivo-eliminado', archivo: archivoPath };
190
+ }
191
+ try {
192
+ escrituraAtomica(archivoPath, nuevo.endsWith('\n') ? nuevo : nuevo + '\n');
193
+ return { accion: 'bloque-eliminado', archivo: archivoPath };
194
+ } catch (err) {
195
+ return { accion: 'error', archivo: archivoPath, detalle: err.message };
196
+ }
197
+ }
198
+
199
+ module.exports = { mergeConMarcadores, eliminarBloque, localizarBloquePrevio };
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * artefactos-python.js — fuente única de verdad para los artefactos
5
+ * Python que NO deben distribuirse en el paquete npm.
6
+ *
7
+ * Por qué existe:
8
+ * Tanto `scripts/limpiar-artefactos-python.js` (prepack) como
9
+ * `scripts/publicar.js` (copiarDir hacia tmpDir del mirror GH)
10
+ * necesitan saber qué directorios y extensiones excluir. Tener la
11
+ * lista hardcodeada en cada archivo es violación DRY de conocimiento
12
+ * — agregar `.pyd` o `.mypy_cache_v2` exigiría editar dos archivos
13
+ * y mantenerlos sincronizados.
14
+ */
15
+
16
+ const DIRS_ARTEFACTOS_PYTHON = Object.freeze(new Set([
17
+ '__pycache__',
18
+ '.pytest_cache',
19
+ '.mypy_cache',
20
+ '.ruff_cache',
21
+ ]));
22
+
23
+ const EXTS_ARTEFACTOS_PYTHON = Object.freeze(new Set([
24
+ '.pyc',
25
+ '.pyo',
26
+ ]));
27
+
28
+ function esDirArtefacto(nombre) {
29
+ return DIRS_ARTEFACTOS_PYTHON.has(nombre);
30
+ }
31
+
32
+ function esArchivoArtefacto(nombre) {
33
+ const dot = nombre.lastIndexOf('.');
34
+ if (dot < 0) return false;
35
+ return EXTS_ARTEFACTOS_PYTHON.has(nombre.slice(dot).toLowerCase());
36
+ }
37
+
38
+ module.exports = {
39
+ DIRS_ARTEFACTOS_PYTHON,
40
+ EXTS_ARTEFACTOS_PYTHON,
41
+ esDirArtefacto,
42
+ esArchivoArtefacto,
43
+ };