@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,308 @@
1
+ ---
2
+ name: azure-cloud
3
+ description: >
4
+ Microsoft Azure: Azure Container Apps y AKS para contenedores, Azure SQL y
5
+ Cosmos DB para datos, Azure Functions serverless, Service Bus para mensajería
6
+ async, Azure AD (Entra ID) para autenticación y Key Vault para secretos.
7
+ Cargar cuando se despliegue en Azure, se configure infraestructura con Terraform
8
+ o Bicep, se integre Azure AD o se diseñen soluciones con servicios Azure.
9
+ version: "1.0.0"
10
+ herramientasPermitidas: [Read, Bash, Grep]
11
+ evolvable: true # default para skill estandar
12
+ exclusiones:
13
+ - "No cargar para despliegues en AWS o GCP — para AWS cargar `cloud-aws`, para GCP cargar `gcp-cloud`."
14
+ - "No cargar para configurar Azure DevOps pipelines o GitHub Actions con self-hosted runners en Azure — para CI/CD pipelines cargar el skill de git-workflow y usar la documentación de Azure DevOps directamente."
15
+ - "No cargar para análisis de costos Azure o rightsizing de instancias — para optimización de costos cloud usar Azure Cost Management directamente o el skill de arquitectura cloud."
16
+ - "No cargar para diseño de estrategias de disaster recovery o backup multi-región — este skill cubre despliegue en una región; para DR multi-región consultar la documentación de Azure Site Recovery."
17
+ ---
18
+ # Azure Cloud — Microsoft Azure
19
+
20
+ Skill para desplegar y operar sistemas en Microsoft Azure. Cubre Container Apps,
21
+ AKS, Azure SQL, Service Bus, Azure AD (Entra ID) y Key Vault. Para patrones AWS
22
+ ver `Skill("cloud-aws")`. Para GCP ver `Skill("gcp-cloud")`.
23
+
24
+ ---
25
+
26
+ ## Cuándo NO cargar
27
+
28
+ - La tarea es desplegar en AWS: cargar `cloud-aws`.
29
+ - La tarea es desplegar en GCP: cargar `gcp-cloud`.
30
+ - La tarea es configurar Azure DevOps pipelines o GitHub Actions: usar la documentación de Azure DevOps directamente.
31
+ - La tarea es análisis de costos o rightsizing: usar Azure Cost Management directamente.
32
+
33
+ ## Cuándo cargar este skill
34
+
35
+ - Al desplegar servicios en Azure Container Apps o AKS
36
+ - Al conectar a Azure SQL o Cosmos DB desde Python o Node
37
+ - Al configurar Service Bus para mensajería async entre servicios
38
+ - Al implementar autenticación con Azure AD (Entra ID) en APIs
39
+ - Al gestionar secretos con Key Vault
40
+ - Al escribir Bicep o Terraform para infraestructura Azure
41
+ - Al configurar Managed Identity para acceso sin credenciales explícitas
42
+
43
+ ---
44
+
45
+ ## 1. Azure Container Apps — contenedores serverless con Bicep
46
+
47
+ ```bicep
48
+ // container-app.bicep
49
+ resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
50
+ name: 'mi-api'
51
+ location: location
52
+ identity: {
53
+ type: 'SystemAssigned' // Managed Identity para acceder a Key Vault sin credenciales
54
+ }
55
+ properties: {
56
+ managedEnvironmentId: environment.id
57
+ configuration: {
58
+ ingress: {
59
+ external: true
60
+ targetPort: 8000
61
+ transport: 'http'
62
+ }
63
+ secrets: [
64
+ {
65
+ name: 'db-connection-string'
66
+ keyVaultUrl: dbSecretUri
67
+ identity: 'system' // Usa la Managed Identity para leer el secreto
68
+ }
69
+ ]
70
+ }
71
+ template: {
72
+ scale: {
73
+ minReplicas: 1
74
+ maxReplicas: 10
75
+ rules: [
76
+ {
77
+ name: 'http-scaling'
78
+ http: {
79
+ metadata: { concurrentRequests: '50' }
80
+ }
81
+ }
82
+ ]
83
+ }
84
+ containers: [
85
+ {
86
+ name: 'api'
87
+ image: 'miregistry.azurecr.io/mi-api:latest'
88
+ resources: {
89
+ cpu: json('0.5')
90
+ memory: '1Gi'
91
+ }
92
+ env: [
93
+ { name: 'DATABASE_URL', secretRef: 'db-connection-string' }
94
+ { name: 'AZURE_TENANT_ID', value: tenantId }
95
+ ]
96
+ }
97
+ ]
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ **Puntos clave de Container Apps:**
104
+ - `identity.type: 'SystemAssigned'` habilita Managed Identity automáticamente
105
+ - Los secretos se leen de Key Vault usando la Managed Identity — sin credenciales en código
106
+ - `minReplicas: 1` para APIs REST que no toleran cold starts
107
+
108
+ ---
109
+
110
+ ## 2. Azure Service Bus — mensajería async
111
+
112
+ ```python
113
+ from azure.servicebus.aio import ServiceBusClient, ServiceBusMessage
114
+ from azure.identity.aio import DefaultAzureCredential
115
+ import json
116
+ import uuid
117
+
118
+ # DefaultAzureCredential usa Managed Identity en producción
119
+ # y credenciales del desarrollador localmente (az login)
120
+ credential = DefaultAzureCredential()
121
+
122
+ NAMESPACE = "mi-namespace"
123
+
124
+ async def enviar_mensaje(cola: str, datos: dict) -> None:
125
+ async with ServiceBusClient(
126
+ fully_qualified_namespace=f"{NAMESPACE}.servicebus.windows.net",
127
+ credential=credential,
128
+ ) as client:
129
+ sender = client.get_queue_sender(queue_name=cola)
130
+ async with sender:
131
+ await sender.send_messages(
132
+ ServiceBusMessage(
133
+ json.dumps(datos, ensure_ascii=False),
134
+ content_type="application/json",
135
+ message_id=str(uuid.uuid4()), # Deduplicación de mensajes
136
+ subject=datos.get("tipo_evento", "evento"),
137
+ )
138
+ )
139
+
140
+ async def recibir_mensajes(cola: str, max_mensajes: int = 10) -> None:
141
+ async with ServiceBusClient(
142
+ fully_qualified_namespace=f"{NAMESPACE}.servicebus.windows.net",
143
+ credential=credential,
144
+ ) as client:
145
+ receiver = client.get_queue_receiver(queue_name=cola)
146
+ async with receiver:
147
+ mensajes = await receiver.receive_messages(max_message_count=max_mensajes)
148
+ for mensaje in mensajes:
149
+ try:
150
+ datos = json.loads(str(mensaje))
151
+ await procesar_evento(datos)
152
+ await receiver.complete_message(mensaje)
153
+ except Exception:
154
+ await receiver.abandon_message(mensaje) # Reencola
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 3. Azure AD (Entra ID) — autenticación en APIs FastAPI
160
+
161
+ ```python
162
+ from fastapi import Depends, HTTPException, status
163
+ from fastapi.security import OAuth2AuthorizationCodeBearer
164
+ from jose import jwt, JWTError
165
+ import httpx
166
+
167
+ TENANT_ID = "tu-tenant-id"
168
+ CLIENT_ID = "tu-client-id"
169
+
170
+ # JWKS endpoint de Azure AD para validar firmas
171
+ JWKS_URL = f"https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys"
172
+
173
+ oauth2_scheme = OAuth2AuthorizationCodeBearer(
174
+ authorizationUrl=f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/authorize",
175
+ tokenUrl=f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token",
176
+ )
177
+
178
+ async def obtener_jwks() -> dict:
179
+ async with httpx.AsyncClient() as client:
180
+ resp = await client.get(JWKS_URL)
181
+ return resp.json()
182
+
183
+ async def get_current_user(token: str = Depends(oauth2_scheme)) -> dict:
184
+ try:
185
+ jwks = await obtener_jwks()
186
+ payload = jwt.decode(
187
+ token,
188
+ jwks,
189
+ algorithms=["RS256"],
190
+ audience=CLIENT_ID,
191
+ issuer=f"https://login.microsoftonline.com/{TENANT_ID}/v2.0",
192
+ )
193
+ return payload
194
+ except JWTError:
195
+ raise HTTPException(
196
+ status_code=status.HTTP_401_UNAUTHORIZED,
197
+ detail="Token inválido o expirado",
198
+ headers={"WWW-Authenticate": "Bearer"},
199
+ )
200
+ ```
201
+
202
+ ---
203
+
204
+ ## 4. Key Vault — gestión de secretos
205
+
206
+ ```python
207
+ from azure.keyvault.secrets.aio import SecretClient
208
+ from azure.identity.aio import DefaultAzureCredential
209
+
210
+ KEY_VAULT_URL = "https://mi-vault.vault.azure.net/"
211
+
212
+ async def get_secret(nombre: str) -> str:
213
+ """Obtiene un secreto de Key Vault usando Managed Identity."""
214
+ credential = DefaultAzureCredential()
215
+ client = SecretClient(vault_url=KEY_VAULT_URL, credential=credential)
216
+ try:
217
+ secret = await client.get_secret(nombre)
218
+ return secret.value
219
+ finally:
220
+ await client.close()
221
+ await credential.close()
222
+
223
+ # Patrón recomendado: cachear secrets al inicio para evitar latencia
224
+ # en cada request. Usar Azure App Configuration para config dinámica.
225
+ ```
226
+
227
+ ---
228
+
229
+ ## 5. Managed Identity — principio de mínimo privilegio
230
+
231
+ ```bash
232
+ # Otorgar acceso a Key Vault para la Managed Identity del Container App
233
+ az keyvault set-policy \
234
+ --name mi-vault \
235
+ --object-id $(az containerapp identity show \
236
+ --name mi-api \
237
+ --resource-group mi-rg \
238
+ --query principalId -o tsv) \
239
+ --secret-permissions get list
240
+
241
+ # Para Azure SQL: crear usuario en la base de datos vinculado a la Managed Identity
242
+ # (ejecutar en la base de datos como administrador)
243
+ # CREATE USER [mi-api] FROM EXTERNAL PROVIDER;
244
+ # ALTER ROLE db_datareader ADD MEMBER [mi-api];
245
+ # ALTER ROLE db_datawriter ADD MEMBER [mi-api];
246
+ ```
247
+
248
+ ---
249
+
250
+ ## 6. Reglas obligatorias
251
+
252
+ | Regla | Justificación | Verificación |
253
+ |-------|--------------|--------------|
254
+ | Managed Identity en Container Apps y AKS | Los service principals con secretos rotan y se filtran | Verificar `identity.type: 'SystemAssigned'` en Bicep/Terraform |
255
+ | `DefaultAzureCredential` en el código | Funciona con Managed Identity en producción y `az login` en local sin cambios | Buscar `DefaultAzureCredential` en lugar de cadenas de conexión |
256
+ | Key Vault para todos los secretos | Las connection strings en variables de entorno aparecen en logs y dashboards | Verificar que no hay `SecretKeyRef` con valores hardcodeados |
257
+ | Diagnostic settings en todos los recursos | Sin logs en Log Analytics no hay observabilidad ni alertas | Revisar que cada recurso tiene `diagnosticSettings` en Bicep |
258
+ | Tags en recursos | Sin tags no se puede analizar costo por servicio ni equipo | `tags: { env: 'prod', equipo: 'backend' }` en cada recurso |
259
+
260
+ ---
261
+
262
+ ## 7. Anti-patrones
263
+
264
+ | MAL | BIEN |
265
+ |-----|------|
266
+ | Connection string en variable de entorno de Container App | Secreto en Key Vault + referencia `secretRef` |
267
+ | Service principal con client_secret en código | Managed Identity + `DefaultAzureCredential` |
268
+ | `Owner` o `Contributor` para el identity de CI/CD | Roles específicos: `AcrPush`, `Storage Blob Data Contributor` |
269
+ | `az login --service-principal` con credenciales en código | Workload Identity Federation para GitHub Actions |
270
+ | Puerto 1433 (Azure SQL) abierto a internet en NSG | Private Endpoint o acceso solo desde la VNET |
271
+ | Secretos rotados manualmente | Key Vault + rotación automática activada |
272
+
273
+ ---
274
+
275
+ ## 8. Checklist de verificación
276
+
277
+ - [ ] Container Apps y AKS usan Managed Identity (`SystemAssigned` o `UserAssigned`)
278
+ - [ ] Todos los secretos están en Key Vault, no en variables de entorno planas
279
+ - [ ] El código usa `DefaultAzureCredential` (no strings de conexión con contraseña)
280
+ - [ ] Cada recurso tiene tags `env`, `equipo` y `gestion`
281
+ - [ ] Diagnostic settings apuntan a un Log Analytics Workspace
282
+ - [ ] Network Security Groups no tienen puertos innecesarios abiertos a internet
283
+ - [ ] CI/CD usa Workload Identity Federation (no service principal con secret)
284
+ - [ ] Azure SQL o Cosmos DB tienen Private Endpoint configurado
285
+
286
+ ---
287
+
288
+ ## 9. Referencias
289
+
290
+ | Tema | Recurso |
291
+ |------|---------|
292
+ | AKS: clusters, Workload Identity, HPA, configuración segura | [recursos/aks.md](recursos/aks.md) |
293
+ | Azure Container Apps documentación oficial | [learn.microsoft.com/azure/container-apps](https://learn.microsoft.com/azure/container-apps) |
294
+ | DefaultAzureCredential — flujo de autenticación | [learn.microsoft.com/azure/developer/python/sdk/authentication-overview](https://learn.microsoft.com/azure/developer/python/sdk/authentication-overview) |
295
+ | Key Vault — rotación automática de secretos | [learn.microsoft.com/azure/key-vault/secrets/tutorial-rotation](https://learn.microsoft.com/azure/key-vault/secrets/tutorial-rotation) |
296
+ | Workload Identity Federation para CI/CD | [learn.microsoft.com/azure/active-directory/workload-identities/workload-identity-federation](https://learn.microsoft.com/azure/active-directory/workload-identities/workload-identity-federation) |
297
+
298
+ ---
299
+
300
+ ## Gotchas / Errores comunes no obvios
301
+
302
+ **`DefaultAzureCredential` funciona localmente con `az login` pero falla en el Container App con `CredentialUnavailableError` porque la Managed Identity no tiene acceso al recurso aunque aparezca asignada**: el `az containerapp identity show` confirma que la Managed Identity existe y tiene `principalId`, pero `DefaultAzureCredential` falla al intentar obtener un token de Key Vault con `403 Forbidden`. Causa: asignar la Managed Identity al Container App es diferente a otorgarle permisos en el recurso destino. La identidad existe, pero Key Vault no tiene una política de acceso para ese `principalId`. Fix: ejecutar `az keyvault set-policy --name <vault> --object-id <principalId> --secret-permissions get list` o usar RBAC de Azure con `az role assignment create --role "Key Vault Secrets User" --assignee <principalId> --scope <vault-resource-id>`. Verificar con `az keyvault secret show --vault-name <vault> --name <secret>` usando las credenciales de la identidad.
303
+
304
+ **Service Bus con `abandon_message()` en el handler de errores reencola el mensaje inmediatamente sin backoff, causando que un mensaje con procesamiento fallido se procese cientos de veces por segundo saturando la cola**: un handler que falla por un error transitorio de red hace `await receiver.abandon_message(mensaje)`, y el mensaje vuelve al frente de la cola inmediatamente. Con 10 consumidores procesando el mismo mensaje fallido, se generan 100+ llamadas por segundo al servicio fallido. Causa: Service Bus Basic/Standard tier no tiene dead letter queue automática con backoff exponencial por defecto; `abandon` simplemente reincrementar el `delivery_count`. Fix: verificar `mensaje.delivery_count` antes de procesar; si supera el umbral (ej: 5), llamar `dead_letter_message(mensaje, reason="MaxDeliveryCountExceeded")` en lugar de `abandon`. Configurar el `max_delivery_count` en la cola (por defecto 10) y verificar periódicamente la dead letter queue.
305
+
306
+ **La validación de tokens Azure AD con `jwt.decode()` y el JWKS endpoint falla 1-2 veces por día porque Azure AD rota las claves de firma sin previo aviso y el caché de JWKS en memoria tiene las claves anteriores**: el primer request después de la rotación de claves devuelve `JWTError: Signature verification failed` hasta que se llama de nuevo a `obtener_jwks()`. Los usuarios reciben 401 intermitentes durante los minutos que tardan los workers en refrescar su caché de JWKS. Causa: Azure AD rota las claves de firma periódicamente como parte de su política de seguridad; las aplicaciones deben manejar la rotación sin downtime. Fix: implementar caché de JWKS con TTL de 24 horas, pero con refresh automático cuando la verificación de firma falla con un kid desconocido: `try: verify_with_cached_jwks() except UnknownKid: refresh_jwks_cache(); verify_with_fresh_jwks()`. No hacer el refresh en cada request fallido para evitar loops.
307
+
308
+ **Bicep con `identity.type: 'SystemAssigned'` no propaga automáticamente la Managed Identity a los secretos referenciados en `configuration.secrets` si el Container App y el Key Vault están en resource groups diferentes**: el Bicep despliega sin error, pero el Container App no puede leer los secretos de Key Vault y el contenedor falla al arrancar con `SecretNotFound`. Causa: Bicep crea la Managed Identity al momento del deployment, pero la política de acceso en Key Vault (en otro resource group) no se crea automáticamente; debe ser un recurso separado en el Bicep o un paso post-deployment. Fix: agregar explícitamente el recurso de política en el Bicep del Key Vault: `resource kvPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2022-07-01' = { name: '${keyVaultName}/add' properties: { accessPolicies: [{ objectId: containerApp.identity.principalId ... }] } }`. Usar `dependsOn: [containerApp]` para garantizar el orden de creación.
@@ -0,0 +1,327 @@
1
+ # AKS — Azure Kubernetes Service: Workload Identity, HPA y Configuración Segura
2
+
3
+ Referencia de patrones para clusters AKS con Workload Identity, escalado automático y seguridad.
4
+
5
+ ---
6
+
7
+ ## 1. Crear cluster AKS con configuración segura
8
+
9
+ ```bash
10
+ # Cluster con Workload Identity habilitado (OBLIGATORIO para acceder a servicios Azure)
11
+ az aks create \
12
+ --resource-group mi-rg \
13
+ --name mi-cluster-aks \
14
+ --location eastus \
15
+ --node-count 3 \
16
+ --min-count 2 \
17
+ --max-count 10 \
18
+ --enable-cluster-autoscaler \
19
+ --node-vm-size Standard_D4s_v3 \
20
+ --enable-oidc-issuer \
21
+ --enable-workload-identity \
22
+ --network-plugin azure \
23
+ --network-policy calico \
24
+ --enable-addons monitoring \
25
+ --workspace-resource-id $LOG_ANALYTICS_ID \
26
+ --generate-ssh-keys
27
+ ```
28
+
29
+ **Opciones clave:**
30
+ - `--enable-oidc-issuer` y `--enable-workload-identity`: habilitan Workload Identity
31
+ para que los pods accedan a Azure sin montar archivos de credenciales
32
+ - `--network-policy calico`: habilita NetworkPolicy de Kubernetes para aislar pods
33
+ - `--enable-addons monitoring`: integración automática con Azure Monitor y Log Analytics
34
+ - `--enable-cluster-autoscaler`: escala los nodos según la demanda real
35
+
36
+ ---
37
+
38
+ ## 2. Node Pools — separación de cargas de trabajo
39
+
40
+ ```bash
41
+ # Node pool para producción (siempre disponible)
42
+ az aks nodepool add \
43
+ --resource-group mi-rg \
44
+ --cluster-name mi-cluster-aks \
45
+ --name produccion \
46
+ --node-count 2 \
47
+ --min-count 2 \
48
+ --max-count 20 \
49
+ --enable-cluster-autoscaler \
50
+ --node-vm-size Standard_D4s_v3 \
51
+ --node-taints env=produccion:NoSchedule \
52
+ --labels env=produccion
53
+
54
+ # Node pool para jobs/workers (puede escalar a cero)
55
+ az aks nodepool add \
56
+ --resource-group mi-rg \
57
+ --cluster-name mi-cluster-aks \
58
+ --name workers \
59
+ --node-count 0 \
60
+ --min-count 0 \
61
+ --max-count 10 \
62
+ --enable-cluster-autoscaler \
63
+ --node-vm-size Standard_D8s_v3 \
64
+ --node-taints workload=batch:NoSchedule \
65
+ --labels workload=batch
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 3. Workload Identity — acceso seguro a Azure desde pods
71
+
72
+ Workload Identity vincula una Kubernetes Service Account (KSA) con una
73
+ Azure Managed Identity. Los pods usan la KSA y Azure autentica usando
74
+ la identidad vinculada. Sin archivos de credenciales, sin rotación manual.
75
+
76
+ ```bash
77
+ # 1. Crear User-Assigned Managed Identity
78
+ az identity create \
79
+ --name mi-api-identity \
80
+ --resource-group mi-rg
81
+
82
+ # Capturar IDs necesarios
83
+ IDENTITY_CLIENT_ID=$(az identity show \
84
+ --name mi-api-identity \
85
+ --resource-group mi-rg \
86
+ --query clientId -o tsv)
87
+
88
+ IDENTITY_OBJECT_ID=$(az identity show \
89
+ --name mi-api-identity \
90
+ --resource-group mi-rg \
91
+ --query principalId -o tsv)
92
+
93
+ # 2. Obtener el OIDC Issuer URL del cluster
94
+ OIDC_ISSUER=$(az aks show \
95
+ --resource-group mi-rg \
96
+ --name mi-cluster-aks \
97
+ --query "oidcIssuerProfile.issuerUrl" -o tsv)
98
+
99
+ # 3. Crear la federación entre la KSA y la Managed Identity
100
+ az identity federated-credential create \
101
+ --name mi-api-federated-credential \
102
+ --identity-name mi-api-identity \
103
+ --resource-group mi-rg \
104
+ --issuer $OIDC_ISSUER \
105
+ --subject "system:serviceaccount:mi-namespace:mi-api-ksa" \
106
+ --audience api://AzureADTokenExchange
107
+
108
+ # 4. Otorgar permisos a la Managed Identity
109
+ az keyvault set-policy \
110
+ --name mi-vault \
111
+ --object-id $IDENTITY_OBJECT_ID \
112
+ --secret-permissions get list
113
+ ```
114
+
115
+ ```yaml
116
+ # Kubernetes Service Account con anotación de Workload Identity
117
+ apiVersion: v1
118
+ kind: ServiceAccount
119
+ metadata:
120
+ name: mi-api-ksa
121
+ namespace: mi-namespace
122
+ annotations:
123
+ azure.workload.identity/client-id: "CLIENT_ID_DE_LA_MANAGED_IDENTITY"
124
+ ```
125
+
126
+ ```yaml
127
+ # Deployment con Workload Identity
128
+ apiVersion: apps/v1
129
+ kind: Deployment
130
+ metadata:
131
+ name: mi-api
132
+ namespace: mi-namespace
133
+ spec:
134
+ selector:
135
+ matchLabels:
136
+ app: mi-api
137
+ azure.workload.identity/use: "true" # Label obligatorio
138
+ template:
139
+ metadata:
140
+ labels:
141
+ app: mi-api
142
+ azure.workload.identity/use: "true" # Label obligatorio en el pod
143
+ spec:
144
+ serviceAccountName: mi-api-ksa # SA con anotación de Workload Identity
145
+ containers:
146
+ - name: api
147
+ image: miregistry.azurecr.io/mi-api:latest
148
+ resources:
149
+ requests:
150
+ cpu: "250m"
151
+ memory: "256Mi"
152
+ limits:
153
+ cpu: "1"
154
+ memory: "512Mi"
155
+ env:
156
+ - name: AZURE_TENANT_ID
157
+ valueFrom:
158
+ fieldRef:
159
+ fieldPath: metadata.annotations['azure.workload.identity/tenant-id']
160
+ - name: KEY_VAULT_URL
161
+ value: "https://mi-vault.vault.azure.net/"
162
+ ```
163
+
164
+ ---
165
+
166
+ ## 4. Horizontal Pod Autoscaler (HPA)
167
+
168
+ ```yaml
169
+ # HPA basado en CPU y memoria
170
+ apiVersion: autoscaling/v2
171
+ kind: HorizontalPodAutoscaler
172
+ metadata:
173
+ name: mi-api-hpa
174
+ namespace: mi-namespace
175
+ spec:
176
+ scaleTargetRef:
177
+ apiVersion: apps/v1
178
+ kind: Deployment
179
+ name: mi-api
180
+ minReplicas: 2
181
+ maxReplicas: 20
182
+ metrics:
183
+ - type: Resource
184
+ resource:
185
+ name: cpu
186
+ target:
187
+ type: Utilization
188
+ averageUtilization: 70
189
+ - type: Resource
190
+ resource:
191
+ name: memory
192
+ target:
193
+ type: Utilization
194
+ averageUtilization: 80
195
+ behavior:
196
+ scaleDown:
197
+ stabilizationWindowSeconds: 300 # Evita flapping
198
+ policies:
199
+ - type: Percent
200
+ value: 25
201
+ periodSeconds: 60
202
+ scaleUp:
203
+ stabilizationWindowSeconds: 0 # Escala hacia arriba inmediatamente
204
+ policies:
205
+ - type: Percent
206
+ value: 100
207
+ periodSeconds: 15
208
+ ```
209
+
210
+ ---
211
+
212
+ ## 5. NetworkPolicy — aislar namespaces en AKS
213
+
214
+ ```yaml
215
+ # Denegar todo tráfico por defecto y permitir solo lo necesario
216
+ apiVersion: networking.k8s.io/v1
217
+ kind: NetworkPolicy
218
+ metadata:
219
+ name: denegar-todo-por-defecto
220
+ namespace: mi-namespace
221
+ spec:
222
+ podSelector: {}
223
+ policyTypes:
224
+ - Ingress
225
+ - Egress
226
+
227
+ ---
228
+ # Permitir tráfico desde el ingress controller al API
229
+ apiVersion: networking.k8s.io/v1
230
+ kind: NetworkPolicy
231
+ metadata:
232
+ name: permitir-ingress
233
+ namespace: mi-namespace
234
+ spec:
235
+ podSelector:
236
+ matchLabels:
237
+ app: mi-api
238
+ policyTypes:
239
+ - Ingress
240
+ ingress:
241
+ - from:
242
+ - namespaceSelector:
243
+ matchLabels:
244
+ kubernetes.io/metadata.name: ingress-nginx
245
+ ports:
246
+ - protocol: TCP
247
+ port: 8000
248
+
249
+ ---
250
+ # Permitir DNS (obligatorio para que los pods resuelvan nombres)
251
+ apiVersion: networking.k8s.io/v1
252
+ kind: NetworkPolicy
253
+ metadata:
254
+ name: permitir-dns
255
+ namespace: mi-namespace
256
+ spec:
257
+ podSelector: {}
258
+ policyTypes:
259
+ - Egress
260
+ egress:
261
+ - ports:
262
+ - protocol: UDP
263
+ port: 53
264
+ - protocol: TCP
265
+ port: 53
266
+ ```
267
+
268
+ ---
269
+
270
+ ## 6. Integración con Azure Container Registry (ACR)
271
+
272
+ ```bash
273
+ # Vincular ACR al cluster AKS para pull automático sin credenciales
274
+ az aks update \
275
+ --resource-group mi-rg \
276
+ --name mi-cluster-aks \
277
+ --attach-acr mi-registry
278
+
279
+ # Verificar que el cluster puede hacer pull de imágenes
280
+ az aks check-acr \
281
+ --resource-group mi-rg \
282
+ --name mi-cluster-aks \
283
+ --acr mi-registry.azurecr.io
284
+ ```
285
+
286
+ ---
287
+
288
+ ## 7. Checklist de seguridad AKS
289
+
290
+ - [ ] Workload Identity habilitado (`--enable-oidc-issuer --enable-workload-identity`)
291
+ - [ ] Network Policy habilitada (`--network-policy calico` o `azure`)
292
+ - [ ] Node pools separados para producción y workers/batch
293
+ - [ ] Todos los Deployments tienen `resources.requests` y `resources.limits`
294
+ - [ ] HPA configurado con `minReplicas >= 2` para servicios críticos
295
+ - [ ] ACR vinculado al cluster (no usar credenciales de registro en imagePullSecrets)
296
+ - [ ] Diagnostic settings configurados con Log Analytics (`--enable-addons monitoring`)
297
+ - [ ] Imágenes de contenedor con versión explícita (nunca `:latest` en producción)
298
+ - [ ] Private cluster habilitado para producción (`--enable-private-cluster`)
299
+
300
+ ---
301
+
302
+ ## 8. Comandos frecuentes
303
+
304
+ ```bash
305
+ # Obtener credenciales del cluster
306
+ az aks get-credentials \
307
+ --resource-group mi-rg \
308
+ --name mi-cluster-aks
309
+
310
+ # Ver estado del cluster
311
+ kubectl get nodes -o wide
312
+ kubectl top nodes
313
+
314
+ # Ver pods con service account y namespace
315
+ kubectl get pods -n mi-namespace -o wide
316
+
317
+ # Verificar que Workload Identity está funcionando
318
+ kubectl exec -it deployment/mi-api -n mi-namespace -- \
319
+ printenv | grep AZURE
320
+
321
+ # Ver logs en tiempo real con Azure Monitor
322
+ az aks show --resource-group mi-rg --name mi-cluster-aks \
323
+ --query "addonProfiles.omsagent.config.logAnalyticsWorkspaceResourceID"
324
+
325
+ # Escalar manualmente un deployment (para emergencias)
326
+ kubectl scale deployment mi-api --replicas=5 -n mi-namespace
327
+ ```