@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,157 @@
1
+ ---
2
+ name: ci-cd-pipelines
3
+ description: CI/CD con GitHub Actions y GitLab CI. Stages de lint, test, build, deploy. Caching, artifacts, matrix builds, secrets management, deployment strategies, monorepos y quality gates.
4
+ version: "1.0.0"
5
+ herramientasPermitidas: [Read, Bash]
6
+ exclusiones:
7
+ - "No cargar para Kubernetes Deployments o Helm releases — para Kubernetes cargar `kubernetes-orquestacion`."
8
+ - "No cargar para Terraform o infraestructura como código — para IaC cargar `terraform-experto`."
9
+ - "No cargar para SRE, SLOs, runbooks o post-mortems — para operaciones en producción cargar `sre-patrones`."
10
+ - "No cargar para Git workflow (branching, commits, PRs) — para workflow de git cargar la regla `git-workflow.md`."
11
+ evolvable: true # default para skill estandar
12
+ ---
13
+ # CI/CD Pipelines — Integración y Entrega Continua
14
+
15
+ ## Cuándo NO cargar
16
+
17
+ - La tarea es Kubernetes: manifiestos de Deployment, Helm releases, kubectl — cargar `kubernetes-orquestacion`.
18
+ - El trabajo es infraestructura como código con Terraform — cargar `terraform-experto`.
19
+ - El tema es SRE: SLOs, runbooks, alertas, post-mortems — cargar `sre-patrones`.
20
+ - La tarea es Git workflow: branching strategy, mensajes de commit, revisión de PRs — cargar la regla `git-workflow.md`.
21
+
22
+ Un pipeline bien diseñado detecta errores antes de producción, entrega valor continuamente
23
+ y construye confianza en el equipo. Este skill cubre patrones para Python, Node y containers.
24
+
25
+ ---
26
+
27
+ ## Reglas Obligatorias
28
+
29
+ 1. **Lint como primer gate** — no ejecutar tests si el código no formatea.
30
+ 2. **Cobertura mínima como quality gate** — `--cov-fail-under=80`.
31
+ 3. **Security scanning** — código, dependencias e imagen Docker.
32
+ 4. **NUNCA credenciales hardcodeadas** en YAML — usar GitHub Secrets / GitLab CI Variables.
33
+ 5. **`concurrency: cancel-in-progress: true`** — evitar deploys simultáneos.
34
+ 6. **Imagen Docker con tag de versión exacta** — NUNCA `:latest` en producción.
35
+ 7. **Smoke tests post-deploy** — verificar health endpoint después de cada deploy.
36
+ 8. **Staging antes de producción** — sin excepción.
37
+
38
+ ---
39
+
40
+ ## Estructura de Pipeline (GitHub Actions)
41
+
42
+ ```yaml
43
+ # Orden de jobs con dependencias
44
+ jobs:
45
+ lint: # Primero: formato y types
46
+ test: # Segundo: requiere lint
47
+ needs: lint
48
+ security: # Paralelo a test: requiere lint
49
+ needs: lint
50
+ build: # Tercero: requiere test + security
51
+ needs: [test, security]
52
+ deploy-staging:
53
+ needs: build
54
+ if: github.ref == 'refs/heads/develop'
55
+ deploy-production:
56
+ needs: build
57
+ if: github.ref == 'refs/heads/main'
58
+ ```
59
+
60
+ Patrón clave: `concurrency` para cancelar runs previos del mismo PR:
61
+
62
+ ```yaml
63
+ concurrency:
64
+ group: ${{ github.workflow }}-${{ github.ref }}
65
+ cancel-in-progress: true
66
+ ```
67
+
68
+ ---
69
+
70
+ ## Quality Gates — No Negociables
71
+
72
+ ```bash
73
+ # 1. Cobertura mínima
74
+ pytest --cov-fail-under=80
75
+
76
+ # 2. Sin vulnerabilidades críticas
77
+ trivy image --exit-code 1 --severity CRITICAL mi-imagen:latest
78
+
79
+ # 3. Lint sin errores
80
+ ruff check . --exit-non-zero-on-fix
81
+
82
+ # 4. Type checking
83
+ mypy app/ --strict
84
+
85
+ # 5. No secrets en código
86
+ trufflehog filesystem --fail ./
87
+ ```
88
+
89
+ ---
90
+
91
+ ## Caching — Reducir Tiempo de Pipeline
92
+
93
+ ```yaml
94
+ # Cache automático de pip
95
+ - uses: actions/setup-python@v5
96
+ with:
97
+ python-version: "3.12"
98
+ cache: pip
99
+
100
+ # Docker layer cache
101
+ - uses: docker/build-push-action@v5
102
+ with:
103
+ cache-from: type=gha
104
+ cache-to: type=gha,mode=max
105
+ ```
106
+
107
+ ---
108
+
109
+ ## Secrets — Gestión Correcta
110
+
111
+ - SIEMPRE usar secrets del CI, NUNCA en código ni archivos de pipeline.
112
+ - Environment-scoped secrets: staging y prod tienen valores distintos.
113
+ - Rotar secrets periódicamente via CLI: `gh secret set API_KEY --env production`.
114
+
115
+ ---
116
+
117
+ ## Anti-patrones de CI/CD
118
+
119
+ | Anti-patrón | Corrección |
120
+ |-------------|------------|
121
+ | Tests que dependen de orden | Tests independientes con fixtures |
122
+ | Credenciales en YAML | GitHub Secrets + env vars |
123
+ | Pipeline sin caché | `cache:` en dependencias |
124
+ | Deploy sin smoke tests | Health check post-deploy |
125
+ | Un solo job gigante | Jobs separados con `needs:` |
126
+ | Sin `concurrency:` | `cancel-in-progress: true` |
127
+ | `:latest` en producción | SHA o semver en imagen |
128
+
129
+ ---
130
+
131
+ ## Checklist de Pipeline Productivo
132
+
133
+ - [ ] Lint y format check como primer gate
134
+ - [ ] Tests con BD real (no solo mocks)
135
+ - [ ] Cobertura mínima como quality gate
136
+ - [ ] Security scanning (código + deps + imagen)
137
+ - [ ] Docker build con cache habilitado
138
+ - [ ] Deploy a staging antes de producción
139
+ - [ ] Smoke tests post-deploy
140
+ - [ ] Notificaciones de fallo en canal de alertas
141
+ - [ ] Secrets en el sistema de CI (no en código)
142
+ - [ ] `concurrency` configurado
143
+ - [ ] Tiempo total < 15 minutos
144
+
145
+ Para pipelines completos de GitHub Actions y GitLab CI, matrix builds, monorepo y notificaciones, ver [recursos/pipelines-completos.md](recursos/pipelines-completos.md).
146
+
147
+ Para template de GitHub Actions reutilizable, ver [recursos/github-actions-template.yaml](recursos/github-actions-template.yaml).
148
+
149
+ ## Gotchas / Errores comunes no obvios
150
+
151
+ **`actions/cache` no hace hit si el lock file cambia en la misma PR que agrega la dependencia**: la clave del cache incluye el hash del `package-lock.json` o `requirements.txt` — cuando el PR agrega una nueva dependencia, la clave cambia y el cache no existe aún, causando una instalación completa. Causa: es el comportamiento correcto y esperado, pero sorprende en PRs de "solo agrego una dependencia". Fix: aceptar que el primer build de una nueva dependencia siempre es lento — el cache se llenará en builds subsiguientes. Optimizar usando `restore-keys` para hit parcial.
152
+
153
+ **`concurrency: cancel-in-progress: true` cancela el deploy de staging cuando se pushea al PR antes de que el deploy termine**: si alguien hace dos pushes rápidos al mismo PR, el primer deploy de staging se cancela a la mitad. Causa: `cancel-in-progress` cancela cualquier run del mismo grupo de concurrencia, incluyendo deploys en progreso. Fix: para jobs de deploy, usar una concurrencia diferente: `group: deploy-staging-${{ github.ref }}` para agrupar solo deploys del mismo branch, y considerar `cancel-in-progress: false` para deploys que no deben cancelarse a la mitad.
154
+
155
+ **Secrets definidos en GitHub Actions no están disponibles en workflows de forks en PRs externas**: los workflows disparados por un PR de un fork (contribuidor externo) no tienen acceso a los secrets del repositorio por seguridad. Causa: prevención de exfiltración de secrets a forks maliciosos. Fix: usar el evento `pull_request_target` con cuidado para acceder a secrets en PRs de forks, pero solo para jobs que no ejecutan código del PR — los jobs de lint/test pueden correr sin secrets; los de deploy sí necesitan el evento `push` al branch base.
156
+
157
+ **`docker/build-push-action` con `cache-from: type=gha` puede hacer el build más lento si el cache es muy grande**: el cache de GitHub Actions (10GB límite) se llena con layers de Docker — si se usan imágenes base grandes y muchos stages, el cache puede alcanzar el límite y las layers más antiguas se evictan, causando rebuilds completos. Causa: el cache de GHA tiene límite de 10GB por repositorio. Fix: usar `cache-from: type=registry,ref=ghcr.io/org/app:cache` con un registro de contenedores para cache ilimitado, o usar `mode=min` en el cache para solo guardar las layers finales en lugar de todas las intermedias.
@@ -0,0 +1,403 @@
1
+ # ═══════════════════════════════════════════════════════════════════════════════
2
+ # Template de GitHub Actions CI/CD
3
+ # Cubre: lint, type-check, tests, build de Docker, deploy a staging y producción.
4
+ #
5
+ # INSTRUCCIONES DE USO:
6
+ # 1. Copiar a .github/workflows/ci-cd.yml
7
+ # 2. Reemplazar todos los valores entre [corchetes] con los reales
8
+ # 3. Configurar los secrets en Settings → Secrets and variables → Actions
9
+ # 4. Ajustar los jobs según el stack del proyecto (ver comentarios INSTRUCCIÓN)
10
+ #
11
+ # SECRETS REQUERIDOS (configurar en el repo antes de hacer push):
12
+ # REGISTRY_USERNAME Usuario del container registry
13
+ # REGISTRY_PASSWORD Token del container registry
14
+ # STAGING_DEPLOY_KEY SSH key o token para deploy a staging
15
+ # PRODUCTION_DEPLOY_KEY SSH key o token para deploy a producción
16
+ # SLACK_WEBHOOK_URL (opcional) para notificaciones de deploy
17
+ # ═══════════════════════════════════════════════════════════════════════════════
18
+
19
+ name: CI/CD Pipeline
20
+
21
+ on:
22
+ push:
23
+ branches:
24
+ - main
25
+ - develop
26
+ tags:
27
+ - "v*.*.*"
28
+ pull_request:
29
+ branches:
30
+ - main
31
+ - develop
32
+
33
+ # Cancelar runs previos del mismo PR o branch (ahorra minutos de CI)
34
+ concurrency:
35
+ group: ${{ github.workflow }}-${{ github.ref }}
36
+ cancel-in-progress: true
37
+
38
+ # ─── Variables globales ────────────────────────────────────────────────────────
39
+ env:
40
+ PYTHON_VERSION: "3.12"
41
+ NODE_VERSION: "20"
42
+ # INSTRUCCIÓN: reemplazar con el registry real (ghcr.io, docker.io, etc.)
43
+ REGISTRY: "ghcr.io"
44
+ IMAGE_NAME: "${{ github.repository }}"
45
+
46
+ # ═══════════════════════════════════════════════════════════════════════════════
47
+ jobs:
48
+
49
+ # ─── Job 1: Lint y type-check ────────────────────────────────────────────────
50
+ lint:
51
+ name: "Lint y Type Check"
52
+ runs-on: ubuntu-latest
53
+ timeout-minutes: 10
54
+
55
+ steps:
56
+ - name: "Checkout"
57
+ uses: actions/checkout@v4
58
+
59
+ - name: "Setup Python ${{ env.PYTHON_VERSION }}"
60
+ uses: actions/setup-python@v5
61
+ with:
62
+ python-version: ${{ env.PYTHON_VERSION }}
63
+ cache: pip
64
+
65
+ - name: "Instalar herramientas de lint"
66
+ run: pip install ruff mypy types-requests
67
+
68
+ # INSTRUCCIÓN: ajustar según las herramientas que uses
69
+ - name: "Ruff — linter y formatter"
70
+ run: |
71
+ ruff check . --output-format=github
72
+ ruff format . --check
73
+
74
+ - name: "Mypy — type checking"
75
+ run: mypy . --ignore-missing-imports
76
+
77
+ # INSTRUCCIÓN: si hay frontend Angular/Node, agregar este bloque
78
+ # - name: "Setup Node ${{ env.NODE_VERSION }}"
79
+ # uses: actions/setup-node@v4
80
+ # with:
81
+ # node-version: ${{ env.NODE_VERSION }}
82
+ # cache: npm
83
+ # - name: "npm install"
84
+ # run: npm ci
85
+ # - name: "ESLint"
86
+ # run: npm run lint
87
+
88
+ # ─── Job 2: Tests ────────────────────────────────────────────────────────────
89
+ test:
90
+ name: "Tests"
91
+ runs-on: ubuntu-latest
92
+ timeout-minutes: 15
93
+ needs: [lint]
94
+
95
+ # INSTRUCCIÓN: ajustar los servicios según el stack del proyecto
96
+ services:
97
+ postgres:
98
+ image: postgres:16-alpine
99
+ env:
100
+ POSTGRES_USER: test_user
101
+ POSTGRES_PASSWORD: test_password
102
+ POSTGRES_DB: test_db
103
+ options: >-
104
+ --health-cmd pg_isready
105
+ --health-interval 10s
106
+ --health-timeout 5s
107
+ --health-retries 5
108
+ ports:
109
+ - 5432:5432
110
+
111
+ # INSTRUCCIÓN: descomentar si usas Redis
112
+ # redis:
113
+ # image: redis:7-alpine
114
+ # options: >-
115
+ # --health-cmd "redis-cli ping"
116
+ # --health-interval 10s
117
+ # --health-timeout 5s
118
+ # --health-retries 5
119
+ # ports:
120
+ # - 6379:6379
121
+
122
+ steps:
123
+ - name: "Checkout"
124
+ uses: actions/checkout@v4
125
+
126
+ - name: "Setup Python ${{ env.PYTHON_VERSION }}"
127
+ uses: actions/setup-python@v5
128
+ with:
129
+ python-version: ${{ env.PYTHON_VERSION }}
130
+ cache: pip
131
+
132
+ - name: "Instalar dependencias"
133
+ run: pip install -r requirements.txt -r requirements-test.txt
134
+
135
+ - name: "Aplicar migraciones de base de datos"
136
+ env:
137
+ DATABASE_URL: "postgresql://test_user:test_password@localhost:5432/test_db"
138
+ run: |
139
+ # INSTRUCCIÓN: ajustar al sistema de migraciones del proyecto
140
+ alembic upgrade head
141
+
142
+ - name: "Ejecutar tests con cobertura"
143
+ env:
144
+ DATABASE_URL: "postgresql://test_user:test_password@localhost:5432/test_db"
145
+ # INSTRUCCIÓN: agregar más variables de entorno que necesiten los tests
146
+ APP_ENV: "test"
147
+ SECRET_KEY: "test-secret-key-no-usar-en-produccion"
148
+ run: |
149
+ pytest \
150
+ --cov=[nombre-del-modulo] \
151
+ --cov-report=term-missing \
152
+ --cov-report=xml:coverage.xml \
153
+ --cov-fail-under=80 \
154
+ -v \
155
+ --tb=short
156
+
157
+ - name: "Subir reporte de cobertura"
158
+ uses: actions/upload-artifact@v4
159
+ if: always()
160
+ with:
161
+ name: coverage-report
162
+ path: coverage.xml
163
+ retention-days: 7
164
+
165
+ # INSTRUCCIÓN: descomentar para integración con Codecov
166
+ # - name: "Subir cobertura a Codecov"
167
+ # uses: codecov/codecov-action@v4
168
+ # with:
169
+ # file: ./coverage.xml
170
+ # fail_ci_if_error: true
171
+
172
+ # ─── Job 3: Build de imagen Docker ───────────────────────────────────────────
173
+ build:
174
+ name: "Build Docker Image"
175
+ runs-on: ubuntu-latest
176
+ timeout-minutes: 20
177
+ needs: [test]
178
+ # Solo construir en push a branches principales o en tags de release
179
+ if: github.event_name == 'push'
180
+
181
+ outputs:
182
+ image-tag: ${{ steps.meta.outputs.tags }}
183
+ image-digest: ${{ steps.build.outputs.digest }}
184
+
185
+ steps:
186
+ - name: "Checkout"
187
+ uses: actions/checkout@v4
188
+
189
+ - name: "Configurar Docker Buildx"
190
+ uses: docker/setup-buildx-action@v3
191
+
192
+ - name: "Login al container registry"
193
+ uses: docker/login-action@v3
194
+ with:
195
+ registry: ${{ env.REGISTRY }}
196
+ username: ${{ secrets.REGISTRY_USERNAME }}
197
+ password: ${{ secrets.REGISTRY_PASSWORD }}
198
+
199
+ - name: "Extraer metadata para el tag"
200
+ id: meta
201
+ uses: docker/metadata-action@v5
202
+ with:
203
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
204
+ tags: |
205
+ type=ref,event=branch
206
+ type=semver,pattern={{version}}
207
+ type=semver,pattern={{major}}.{{minor}}
208
+ type=sha,prefix=sha-,format=short
209
+ labels: |
210
+ org.opencontainers.image.title=[Nombre de la aplicación]
211
+ org.opencontainers.image.description=[Descripción corta]
212
+
213
+ - name: "Build y Push"
214
+ id: build
215
+ uses: docker/build-push-action@v6
216
+ with:
217
+ context: .
218
+ push: true
219
+ tags: ${{ steps.meta.outputs.tags }}
220
+ labels: ${{ steps.meta.outputs.labels }}
221
+ # Cache: reutilizar capas de builds anteriores
222
+ cache-from: type=gha
223
+ cache-to: type=gha,mode=max
224
+ # Build args si el Dockerfile los necesita
225
+ build-args: |
226
+ PYTHON_VERSION=${{ env.PYTHON_VERSION }}
227
+
228
+ - name: "Escanear imagen por vulnerabilidades"
229
+ uses: aquasecurity/trivy-action@master
230
+ with:
231
+ image-ref: "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}"
232
+ format: "sarif"
233
+ output: "trivy-results.sarif"
234
+ exit-code: "1"
235
+ severity: "CRITICAL,HIGH"
236
+
237
+ - name: "Subir resultados de Trivy a GitHub Security"
238
+ uses: github/codeql-action/upload-sarif@v3
239
+ if: always()
240
+ with:
241
+ sarif_file: "trivy-results.sarif"
242
+
243
+ # ─── Job 4: Deploy a Staging ─────────────────────────────────────────────────
244
+ deploy-staging:
245
+ name: "Deploy → Staging"
246
+ runs-on: ubuntu-latest
247
+ timeout-minutes: 15
248
+ needs: [build]
249
+ # Solo desplegar en el branch develop
250
+ if: github.ref == 'refs/heads/develop' && github.event_name == 'push'
251
+ environment:
252
+ name: staging
253
+ url: "https://[tu-app-staging.com]"
254
+
255
+ steps:
256
+ - name: "Checkout"
257
+ uses: actions/checkout@v4
258
+
259
+ # INSTRUCCIÓN: ajustar según la estrategia de deploy del proyecto
260
+ # Opción A: Deploy via SSH
261
+ - name: "Deploy via SSH a staging"
262
+ uses: appleboy/ssh-action@v1
263
+ with:
264
+ host: "[staging-server.com]"
265
+ username: "deploy"
266
+ key: ${{ secrets.STAGING_DEPLOY_KEY }}
267
+ script: |
268
+ cd /opt/[nombre-app]
269
+ docker compose pull
270
+ docker compose up -d --no-deps --force-recreate [nombre-servicio]
271
+ docker compose exec -T [nombre-servicio] alembic upgrade head
272
+ docker system prune -f
273
+
274
+ # INSTRUCCIÓN: Opción B: Deploy via kubectl (Kubernetes)
275
+ # - name: "Setup kubectl"
276
+ # uses: azure/setup-kubectl@v4
277
+ # - name: "Deploy a Kubernetes staging"
278
+ # run: |
279
+ # kubectl set image deployment/[nombre-app] \
280
+ # [nombre-app]=${{ needs.build.outputs.image-tag }} \
281
+ # -n staging
282
+
283
+ - name: "Verificar health check"
284
+ run: |
285
+ sleep 15
286
+ curl -f https://[tu-app-staging.com]/health || exit 1
287
+
288
+ - name: "Notificar deploy exitoso"
289
+ if: success()
290
+ run: |
291
+ curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
292
+ -H "Content-Type: application/json" \
293
+ -d "{\"text\": \"Deploy a staging exitoso: ${{ github.sha }} — <https://[tu-app-staging.com]|Ver staging>\"}"
294
+
295
+ # ─── Job 5: Deploy a Producción ──────────────────────────────────────────────
296
+ deploy-production:
297
+ name: "Deploy → Producción"
298
+ runs-on: ubuntu-latest
299
+ timeout-minutes: 20
300
+ needs: [build]
301
+ # Solo desplegar en tags de release (v*.*.*)
302
+ if: startsWith(github.ref, 'refs/tags/v')
303
+ environment:
304
+ name: production
305
+ url: "https://[tu-app-produccion.com]"
306
+ # Requiere aprobación manual en GitHub Environments antes de ejecutar
307
+
308
+ steps:
309
+ - name: "Checkout"
310
+ uses: actions/checkout@v4
311
+
312
+ - name: "Validar que el tag coincide con el changelog"
313
+ run: |
314
+ VERSION="${GITHUB_REF#refs/tags/v}"
315
+ if ! grep -q "## \[${VERSION}\]" CHANGELOG.md 2>/dev/null; then
316
+ echo "ERROR: CHANGELOG.md no tiene entrada para la versión ${VERSION}"
317
+ echo "Ejecuta: bash habilidades/release-semver/scripts/generar-changelog.sh"
318
+ exit 1
319
+ fi
320
+
321
+ # INSTRUCCIÓN: misma estrategia que staging pero apuntando a producción
322
+ - name: "Deploy via SSH a producción"
323
+ uses: appleboy/ssh-action@v1
324
+ with:
325
+ host: "[prod-server.com]"
326
+ username: "deploy"
327
+ key: ${{ secrets.PRODUCTION_DEPLOY_KEY }}
328
+ script: |
329
+ set -e
330
+ cd /opt/[nombre-app]
331
+
332
+ # Backup de la base de datos antes del deploy
333
+ docker compose exec -T postgres pg_dump -U [db_user] [db_name] \
334
+ > /backups/pre-deploy-$(date +%Y%m%d-%H%M%S).sql
335
+
336
+ # Deploy con zero-downtime (rolling update)
337
+ docker compose pull
338
+ docker compose up -d --no-deps --force-recreate [nombre-servicio]
339
+
340
+ # Migraciones
341
+ docker compose exec -T [nombre-servicio] alembic upgrade head
342
+
343
+ # Limpiar imágenes antiguas
344
+ docker system prune -f --filter "until=24h"
345
+
346
+ - name: "Verificar health check de producción"
347
+ run: |
348
+ sleep 20
349
+ for i in {1..5}; do
350
+ curl -f https://[tu-app-produccion.com]/health && break
351
+ echo "Intento $i fallido, esperando 10s..."
352
+ sleep 10
353
+ done
354
+
355
+ - name: "Crear GitHub Release"
356
+ uses: softprops/action-gh-release@v2
357
+ with:
358
+ generate_release_notes: false
359
+ body_path: CHANGELOG.md
360
+ # INSTRUCCIÓN: agregar artefactos del release si corresponde
361
+ # files: |
362
+ # dist/*.whl
363
+ # dist/*.tar.gz
364
+
365
+ - name: "Notificar release a producción"
366
+ if: success()
367
+ run: |
368
+ VERSION="${GITHUB_REF#refs/tags/v}"
369
+ curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
370
+ -H "Content-Type: application/json" \
371
+ -d "{\"text\": \"Release v${VERSION} desplegado a producción exitosamente\"}"
372
+
373
+ - name: "Rollback automático si el health check falla"
374
+ if: failure()
375
+ uses: appleboy/ssh-action@v1
376
+ with:
377
+ host: "[prod-server.com]"
378
+ username: "deploy"
379
+ key: ${{ secrets.PRODUCTION_DEPLOY_KEY }}
380
+ script: |
381
+ cd /opt/[nombre-app]
382
+ # Revertir a la imagen anterior
383
+ docker compose up -d --no-deps --force-recreate [nombre-servicio]
384
+ echo "ROLLBACK ejecutado — revisar logs manualmente"
385
+
386
+ # ═══════════════════════════════════════════════════════════════════════════════
387
+ # CONFIGURACIÓN ADICIONAL RECOMENDADA:
388
+ #
389
+ # 1. Branch protection rules (Settings → Branches → Add rule para 'main'):
390
+ # - Require status checks: lint, test
391
+ # - Require pull request reviews before merging
392
+ # - Require signed commits
393
+ # - Do not allow bypassing
394
+ #
395
+ # 2. Environments (Settings → Environments):
396
+ # - staging: sin restricciones de revisores
397
+ # - production: required reviewers = [tu usuario]
398
+ #
399
+ # 3. Secrets necesarios (Settings → Secrets → Actions):
400
+ # REGISTRY_USERNAME, REGISTRY_PASSWORD
401
+ # STAGING_DEPLOY_KEY, PRODUCTION_DEPLOY_KEY
402
+ # SLACK_WEBHOOK_URL (opcional)
403
+ # ═══════════════════════════════════════════════════════════════════════════════