@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,191 @@
1
+ ---
2
+ name: api-rest-diseno
3
+ description: Diseño de APIs REST idiomáticas. Recursos, verbos HTTP, códigos de estado, paginación, filtrado, versionado, HATEOAS y principios de diseño orientado al consumidor.
4
+ version: "1.0.1"
5
+ evolved: true
6
+ evolved-from: "5.0.3"
7
+ evolved-at: "2026-04-23"
8
+ evolved-by: "aprender"
9
+ evolved-note: "Gotcha nuevo: parser detecta estructura pero 0 contenido → 422 es peor UX que fallback con advertencia"
10
+ herramientasPermitidas: [Read, Grep]
11
+ exclusiones:
12
+ - "No cargar para implementación de endpoints FastAPI o Django — el diseño aquí es agnóstico de framework; para implementación cargar `fastapi-experto`."
13
+ - "No cargar para APIs GraphQL (queries, mutations, subscriptions) — GraphQL tiene convenciones propias de diseño; cargar `graphql-experto`."
14
+ - "No cargar para WebSockets o APIs basadas en eventos — este skill es exclusivamente para APIs request-response HTTP/REST."
15
+ - "No cargar para documentación OpenAPI/Swagger — el skill define principios de diseño, no cómo escribir la especificación YAML/JSON."
16
+ evolvable: true # default para skill estandar
17
+ ---
18
+ # Diseño de APIs REST
19
+
20
+ ## Cuándo NO cargar
21
+
22
+ - La tarea es implementar los endpoints en FastAPI o Django — cargar `fastapi-experto`; este skill define principios de diseño agnósticos de framework.
23
+ - La API es GraphQL (queries, mutations, subscriptions) — cargar `graphql-experto`.
24
+ - El protocolo es WebSocket o la API es event-driven — este skill es exclusivamente para APIs HTTP request-response.
25
+ - El trabajo es escribir la especificación OpenAPI/Swagger — este skill define principios, no la sintaxis YAML de la especificación.
26
+
27
+ ## Principios fundamentales
28
+
29
+ Una buena API REST es **predecible**, **consistente** y **centrada en el consumidor**.
30
+ Si el desarrollador que la consume puede intuir cómo funciona un endpoint nuevo antes
31
+ de leer la documentación, la API está bien diseñada.
32
+
33
+ ---
34
+
35
+ ## Nomenclatura de recursos
36
+
37
+ ```
38
+ # BIEN: sustantivos en plural, kebab-case
39
+ GET /facturas
40
+ GET /facturas/{id}
41
+ GET /facturas/{id}/items
42
+ GET /usuarios/{id}/preferencias
43
+
44
+ # MAL: verbos en la URI
45
+ GET /obtener-facturas
46
+ POST /crear-factura
47
+ ```
48
+
49
+ ### Recursos anidados: máximo 2-3 niveles
50
+
51
+ Anidar solo cuando la relación es de pertenencia fuerte:
52
+
53
+ ```
54
+ # BIEN: items no existen sin factura
55
+ GET /facturas/{factura_id}/items
56
+
57
+ # Preferir filtro sobre anidamiento excesivo
58
+ GET /pedidos?usuario_id={id} # En lugar de /usuarios/{id}/pedidos
59
+ ```
60
+
61
+ ---
62
+
63
+ ## Verbos HTTP y su semántica
64
+
65
+ | Verbo | Semántica | Idempotente | Body req. |
66
+ |----------|------------------------------------|-------------|-----------|
67
+ | GET | Obtener recurso (sin efectos) | Sí | No |
68
+ | POST | Crear recurso o acción | No | Sí |
69
+ | PUT | Reemplazar recurso completo | Sí | Sí |
70
+ | PATCH | Actualización parcial | No* | Sí |
71
+ | DELETE | Eliminar recurso | Sí | No |
72
+
73
+ ### Acciones que no son CRUD
74
+
75
+ ```
76
+ POST /facturas/{id}/cancelar
77
+ POST /facturas/{id}/timbrar
78
+ POST /usuarios/{id}/activar
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Códigos de estado HTTP
84
+
85
+ ### 2xx — Éxito
86
+ - `200 OK` — GET, PUT, PATCH exitoso con body
87
+ - `201 Created` — POST exitoso (incluir Location header)
88
+ - `204 No Content` — DELETE exitoso, o PUT sin body
89
+ - `202 Accepted` — Tarea asíncrona aceptada
90
+
91
+ ### 4xx — Error del cliente
92
+ - `400 Bad Request` — Body malformado o parámetros inválidos
93
+ - `401 Unauthorized` — Sin autenticación o token inválido
94
+ - `403 Forbidden` — Autenticado pero sin permisos
95
+ - `404 Not Found` — Recurso no existe
96
+ - `409 Conflict` — Estado incompatible (duplicado, etc.)
97
+ - `422 Unprocessable` — Sintaxis correcta, semántica inválida
98
+ - `429 Too Many Requests` — Rate limit (incluir Retry-After)
99
+
100
+ ### 5xx — Error del servidor
101
+ - `500 Internal Server Error` — Nunca revelar detalles en producción
102
+ - `503 Service Unavailable` — Mantenimiento o sobrecarga
103
+
104
+ ---
105
+
106
+ ## Formato de errores consistente
107
+
108
+ ```json
109
+ {
110
+ "error": {
111
+ "codigo": "VALIDACION_FALLIDA",
112
+ "mensaje": "Los datos proporcionados son inválidos.",
113
+ "detalles": [
114
+ {
115
+ "campo": "fecha",
116
+ "mensaje": "La fecha no puede ser anterior a hoy."
117
+ },
118
+ {
119
+ "campo": "monto",
120
+ "mensaje": "El monto debe ser mayor a cero."
121
+ }
122
+ ],
123
+ "request_id": "550e8400-e29b-41d4-a716-446655440000"
124
+ }
125
+ }
126
+ ```
127
+
128
+ ---
129
+
130
+ ## Paginación
131
+
132
+ Toda colección DEBE tener paginación. Dos estrategias:
133
+ - **Cursor** (recomendada): consistente bajo inserciones, eficiente para grandes datasets.
134
+ - **Offset**: simple, útil para UIs con número de página.
135
+
136
+ Para formatos de respuesta completos de ambas estrategias, ver [recursos/referencia-api.md](recursos/referencia-api.md).
137
+
138
+ ---
139
+
140
+ ## Filtrado y ordenamiento — resumen
141
+
142
+ ```
143
+ GET /facturas?estatus=emitida&fecha_desde=2026-01-01 # filtros
144
+ GET /facturas?orden=-fecha,folio # ordenamiento
145
+ GET /facturas?campos=id,folio,monto_total # proyección
146
+ ```
147
+
148
+ Para convenciones completas de filtrado y query parameters, ver [recursos/referencia-api.md](recursos/referencia-api.md).
149
+
150
+ ---
151
+
152
+ ## Versionado
153
+
154
+ Obligatorio con prefijo en URL: `/v1/`, `/v2/`. Deprecar con mínimo 6 meses de anticipación usando headers `Deprecation` y `Sunset`.
155
+
156
+ Para detalles de estrategias de versionado (URI vs header) y deprecación, ver [recursos/referencia-api.md](recursos/referencia-api.md).
157
+
158
+ ---
159
+
160
+ ## HATEOAS y Headers
161
+
162
+ HATEOAS (links a recursos relacionados) es opcional en APIs internas, recomendado en APIs públicas. Headers importantes: Location, Cache-Control, ETag, X-RateLimit-*, Idempotency-Key.
163
+
164
+ Para ejemplos completos, ver [recursos/referencia-api.md](recursos/referencia-api.md).
165
+
166
+ ---
167
+
168
+ ## Gotchas / Errores comunes no obvios
169
+
170
+ **`PATCH` con cuerpo vacío `{}` es válido semánticamente pero algunos clientes lo rechazan**: un `PATCH {}` significa "actualiza el recurso sin cambiar ningún campo" — es idempotente y debería retornar `200` con el estado actual. Pero algunos frameworks de backend lanzan error 400 si el body tiene validación de `required fields`. Causa: confusión entre "campo requerido para crear" y "campo requerido para actualizar parcialmente". Fix: los schemas de `PATCH` deben tener TODOS los campos como opcionales (`Optional` en Pydantic) — el `required` solo aplica a `POST`/`PUT`.
171
+
172
+ **`204 No Content` en DELETE de un recurso ya eliminado (idempotencia) vs `404`**: si el cliente borra el mismo recurso dos veces, la primera retorna `204` y la segunda debería retornar `404` o `204`. DELETE es idempotente en el resultado (el recurso no existe) pero no necesariamente en el código de respuesta. Causa: idempotencia en REST significa que múltiples requests idénticos tienen el mismo efecto en el servidor, no que retornan el mismo código HTTP. Fix: retornar `404` en el segundo DELETE es semánticamente correcto y más informativo; documentar explícitamente en la API el comportamiento.
173
+
174
+ **Paginación por offset retorna resultados inconsistentes si hay inserciones concurrentes**: `GET /items?offset=20&limit=10` puede devolver un item que ya apareció en la página anterior si se insertó un item nuevo con id < el ítem en offset=20 entre las dos peticiones. Causa: offset-based pagination no tiene un "anchor" — el conjunto de datos cambia entre páginas. Fix: para listas que se actualizan frecuentemente, usar cursor-based pagination con `?after=<cursor>` donde el cursor es un valor estable (timestamp + id) que ancla la posición en el resultado.
175
+
176
+ **El `Location` header en respuestas `201 Created` es obligatorio en REST pero frecuentemente omitido**: POST exitoso sin `Location: /v1/recursos/nuevo-id` obliga al cliente a parsear el body para conocer la URL del recurso creado, acoplando el cliente a la estructura del body. Causa: se considera opcional porque el cliente "ya puede construir la URL". Fix: SIEMPRE incluir `Location` en `201 Created` — `response.headers["Location"] = f"/v1/facturas/{nueva_factura.id}"` es una línea de código que hace la API self-describing.
177
+
178
+ **Endpoint que parsea input estructurado y encuentra "estructura pero 0 contenido" debe preferir fallback con advertencia sobre 422**: un endpoint que extrae ítems desde un documento estructurado puede detectar los bloques marcadores (secciones, encabezados) pero 0 ítems válidos dentro por diferencia de formato. Retornar lista vacía que el endpoint traduce a 422 fuerza al frontend a mostrar un error y al usuario a diagnosticar por su cuenta. Fix preferido: emitir **1 ítem "genérico" con el texto completo + advertencia explícita** en la respuesta 200. El usuario recibe algo accionable y ve en advertencias qué falló. El 422 debe reservarse para input fundamentalmente inválido (archivo corrupto, magic number incorrecto), no para "el parser no pudo inferir la estructura del input válido". Patrón general: cuando un endpoint detecta los marcadores estructurales del documento pero 0 contenido extraíble dentro de ellos, responder 200 con un ítem fallback + advertencia `"se detectaron N bloques pero 0 ítems válidos — revisar formato del documento"`, no 422.
179
+
180
+ ## Checklist de diseño de un nuevo endpoint
181
+
182
+ - [ ] El URI usa sustantivos en plural, sin verbos.
183
+ - [ ] El verbo HTTP refleja la semántica correcta.
184
+ - [ ] El código de estado es el apropiado para cada caso.
185
+ - [ ] Los errores siguen el formato estándar con campo `codigo` y `detalles`.
186
+ - [ ] Las colecciones tienen paginación (nunca devolver listas sin límite).
187
+ - [ ] Los filtros usan query parameters, nunca el body en GET.
188
+ - [ ] El endpoint está versionado bajo `/v{N}/`.
189
+ - [ ] La documentación OpenAPI está actualizada.
190
+ - [ ] Hay validación de entrada que devuelve 400 con detalles de campo.
191
+ - [ ] El endpoint maneja el caso de recurso no encontrado con 404.
@@ -0,0 +1,506 @@
1
+ openapi: "3.1.0"
2
+
3
+ # ─────────────────────────────────────────────────────────────────────────────
4
+ # INSTRUCCIONES DE USO
5
+ # Copiar este archivo a tu proyecto como docs/openapi.yaml
6
+ # Reemplazar todos los valores entre [corchetes] con los reales.
7
+ # Eliminar los comentarios que empiezan con # INSTRUCCIÓN antes de publicar.
8
+ # ─────────────────────────────────────────────────────────────────────────────
9
+
10
+ info:
11
+ title: "[Nombre del API]"
12
+ version: "1.0.0"
13
+ description: |
14
+ [Descripción de 2-3 oraciones: qué hace el API, quién lo consume, qué dominio cubre.]
15
+
16
+ ## Autenticación
17
+ Todos los endpoints (excepto los marcados con `public: true`) requieren
18
+ un token JWT válido en el header `Authorization: Bearer <token>`.
19
+
20
+ ## Versionado
21
+ Esta API sigue SemVer. Los cambios breaking incrementan el segmento MAJOR
22
+ del header `API-Version`.
23
+ contact:
24
+ name: "[Equipo responsable]"
25
+ email: "[email@empresa.com]"
26
+ license:
27
+ name: "Proprietary"
28
+
29
+ servers:
30
+ - url: "https://api.[tu-dominio.com]/v1"
31
+ description: "Producción"
32
+ - url: "https://api-staging.[tu-dominio.com]/v1"
33
+ description: "Staging"
34
+ - url: "http://localhost:8000/v1"
35
+ description: "Desarrollo local"
36
+
37
+ # ─── Seguridad global ──────────────────────────────────────────────────────────
38
+ security:
39
+ - BearerAuth: []
40
+
41
+ components:
42
+ securitySchemes:
43
+ BearerAuth:
44
+ type: http
45
+ scheme: bearer
46
+ bearerFormat: JWT
47
+ description: |
48
+ JWT obtenido del endpoint `POST /auth/login`.
49
+ Expira en 24 horas. Renovar con `POST /auth/refresh`.
50
+
51
+ # ─── Schemas reutilizables ──────────────────────────────────────────────────
52
+ schemas:
53
+
54
+ # Paginación estándar
55
+ PaginatedResponse:
56
+ type: object
57
+ required: [items, total, page, page_size, pages]
58
+ properties:
59
+ items:
60
+ type: array
61
+ description: "Lista de recursos de la página actual"
62
+ total:
63
+ type: integer
64
+ minimum: 0
65
+ description: "Total de registros en todas las páginas"
66
+ example: 247
67
+ page:
68
+ type: integer
69
+ minimum: 1
70
+ description: "Número de página actual (base 1)"
71
+ example: 1
72
+ page_size:
73
+ type: integer
74
+ minimum: 1
75
+ maximum: 100
76
+ description: "Registros por página"
77
+ example: 20
78
+ pages:
79
+ type: integer
80
+ minimum: 0
81
+ description: "Total de páginas disponibles"
82
+ example: 13
83
+
84
+ # Error estándar
85
+ ErrorResponse:
86
+ type: object
87
+ required: [error, message]
88
+ properties:
89
+ error:
90
+ type: string
91
+ description: "Código de error en snake_case"
92
+ example: "recurso_no_encontrado"
93
+ message:
94
+ type: string
95
+ description: "Descripción legible del error"
96
+ example: "El recurso con id '550e8400' no fue encontrado"
97
+ details:
98
+ type: object
99
+ description: "Información adicional de diagnóstico (opcional)"
100
+ additionalProperties: true
101
+ request_id:
102
+ type: string
103
+ format: uuid
104
+ description: "ID único de la request para trazabilidad en logs"
105
+
106
+ # Error de validación (422)
107
+ ValidationErrorResponse:
108
+ type: object
109
+ required: [error, message, fields]
110
+ properties:
111
+ error:
112
+ type: string
113
+ example: "error_de_validacion"
114
+ message:
115
+ type: string
116
+ example: "La request contiene campos inválidos"
117
+ fields:
118
+ type: array
119
+ items:
120
+ type: object
121
+ required: [field, message]
122
+ properties:
123
+ field:
124
+ type: string
125
+ description: "Nombre del campo con error (usa dot notation para anidados)"
126
+ example: "usuario.email"
127
+ message:
128
+ type: string
129
+ description: "Descripción del error de validación"
130
+ example: "Debe ser un email válido"
131
+
132
+ # UUID reutilizable
133
+ UUID:
134
+ type: string
135
+ format: uuid
136
+ example: "550e8400-e29b-41d4-a716-446655440000"
137
+
138
+ # Timestamp ISO 8601
139
+ Timestamp:
140
+ type: string
141
+ format: date-time
142
+ example: "2026-03-25T14:32:00Z"
143
+
144
+ # ─── [Recurso principal] ─────────────────────────────────────────────────
145
+ # INSTRUCCIÓN: Reemplazar [Recurso] con el nombre real (ej: Factura, Usuario)
146
+
147
+ RecursoBase:
148
+ type: object
149
+ required: [id, created_at, updated_at]
150
+ properties:
151
+ id:
152
+ $ref: "#/components/schemas/UUID"
153
+ created_at:
154
+ $ref: "#/components/schemas/Timestamp"
155
+ updated_at:
156
+ $ref: "#/components/schemas/Timestamp"
157
+ created_by:
158
+ type: string
159
+ format: email
160
+ description: "Email del usuario que creó el registro"
161
+
162
+ RecursoCreate:
163
+ type: object
164
+ required: [] # INSTRUCCIÓN: listar campos obligatorios
165
+ properties:
166
+ nombre:
167
+ type: string
168
+ minLength: 1
169
+ maxLength: 255
170
+ description: "[Descripción del campo]"
171
+ example: "[Ejemplo]"
172
+ # INSTRUCCIÓN: agregar más campos según el dominio
173
+
174
+ RecursoUpdate:
175
+ type: object
176
+ description: "Todos los campos son opcionales (PATCH semántico)"
177
+ properties:
178
+ nombre:
179
+ type: string
180
+ minLength: 1
181
+ maxLength: 255
182
+
183
+ RecursoRead:
184
+ allOf:
185
+ - $ref: "#/components/schemas/RecursoBase"
186
+ - $ref: "#/components/schemas/RecursoCreate"
187
+
188
+ # ─── Parámetros reutilizables ────────────────────────────────────────────────
189
+ parameters:
190
+
191
+ PathId:
192
+ name: id
193
+ in: path
194
+ required: true
195
+ schema:
196
+ $ref: "#/components/schemas/UUID"
197
+ description: "Identificador único del recurso"
198
+
199
+ QueryPage:
200
+ name: page
201
+ in: query
202
+ schema:
203
+ type: integer
204
+ minimum: 1
205
+ default: 1
206
+ description: "Número de página (base 1)"
207
+
208
+ QueryPageSize:
209
+ name: page_size
210
+ in: query
211
+ schema:
212
+ type: integer
213
+ minimum: 1
214
+ maximum: 100
215
+ default: 20
216
+ description: "Registros por página (máximo 100)"
217
+
218
+ QuerySearch:
219
+ name: q
220
+ in: query
221
+ schema:
222
+ type: string
223
+ minLength: 2
224
+ description: "Texto de búsqueda libre (busca en campos indexados)"
225
+
226
+ QueryOrderBy:
227
+ name: order_by
228
+ in: query
229
+ schema:
230
+ type: string
231
+ description: |
232
+ Campo de ordenamiento. Prefijo `-` para orden descendente.
233
+ Ejemplos: `created_at`, `-created_at`, `nombre`
234
+
235
+ # ─── Respuestas reutilizables ────────────────────────────────────────────────
236
+ responses:
237
+
238
+ "400BadRequest":
239
+ description: "Request inválida"
240
+ content:
241
+ application/json:
242
+ schema:
243
+ $ref: "#/components/schemas/ErrorResponse"
244
+
245
+ "401Unauthorized":
246
+ description: "Token JWT ausente, inválido o expirado"
247
+ content:
248
+ application/json:
249
+ schema:
250
+ $ref: "#/components/schemas/ErrorResponse"
251
+ example:
252
+ error: "token_invalido"
253
+ message: "El token JWT es inválido o ha expirado"
254
+
255
+ "403Forbidden":
256
+ description: "El usuario no tiene permiso para esta operación"
257
+ content:
258
+ application/json:
259
+ schema:
260
+ $ref: "#/components/schemas/ErrorResponse"
261
+ example:
262
+ error: "permiso_denegado"
263
+ message: "No tienes permiso para realizar esta acción"
264
+
265
+ "404NotFound":
266
+ description: "El recurso no existe"
267
+ content:
268
+ application/json:
269
+ schema:
270
+ $ref: "#/components/schemas/ErrorResponse"
271
+
272
+ "422Unprocessable":
273
+ description: "Error de validación en el cuerpo de la request"
274
+ content:
275
+ application/json:
276
+ schema:
277
+ $ref: "#/components/schemas/ValidationErrorResponse"
278
+
279
+ "500InternalError":
280
+ description: "Error interno del servidor"
281
+ content:
282
+ application/json:
283
+ schema:
284
+ $ref: "#/components/schemas/ErrorResponse"
285
+ example:
286
+ error: "error_interno"
287
+ message: "Ocurrió un error inesperado. Por favor contacta soporte con el request_id."
288
+
289
+ # ─── Paths ────────────────────────────────────────────────────────────────────
290
+ paths:
291
+
292
+ # INSTRUCCIÓN: Reemplazar /recursos con la ruta real del recurso en plural
293
+ # Mantener rutas ESTÁTICAS antes de las PARAMÉTRICAS
294
+
295
+ /recursos:
296
+ get:
297
+ operationId: "listar_recursos"
298
+ summary: "Listar recursos"
299
+ tags: ["[Nombre del recurso]"]
300
+ parameters:
301
+ - $ref: "#/components/parameters/QueryPage"
302
+ - $ref: "#/components/parameters/QueryPageSize"
303
+ - $ref: "#/components/parameters/QuerySearch"
304
+ - $ref: "#/components/parameters/QueryOrderBy"
305
+ # INSTRUCCIÓN: agregar filtros específicos del dominio
306
+ - name: estatus
307
+ in: query
308
+ schema:
309
+ type: string
310
+ enum: ["activo", "inactivo", "borrador"]
311
+ description: "Filtrar por estatus"
312
+ responses:
313
+ "200":
314
+ description: "Lista paginada de recursos"
315
+ content:
316
+ application/json:
317
+ schema:
318
+ allOf:
319
+ - $ref: "#/components/schemas/PaginatedResponse"
320
+ - type: object
321
+ properties:
322
+ items:
323
+ type: array
324
+ items:
325
+ $ref: "#/components/schemas/RecursoRead"
326
+ "401":
327
+ $ref: "#/components/responses/401Unauthorized"
328
+ "500":
329
+ $ref: "#/components/responses/500InternalError"
330
+
331
+ post:
332
+ operationId: "crear_recurso"
333
+ summary: "Crear un nuevo recurso"
334
+ tags: ["[Nombre del recurso]"]
335
+ requestBody:
336
+ required: true
337
+ content:
338
+ application/json:
339
+ schema:
340
+ $ref: "#/components/schemas/RecursoCreate"
341
+ responses:
342
+ "201":
343
+ description: "Recurso creado exitosamente"
344
+ content:
345
+ application/json:
346
+ schema:
347
+ $ref: "#/components/schemas/RecursoRead"
348
+ headers:
349
+ Location:
350
+ description: "URL del recurso creado"
351
+ schema:
352
+ type: string
353
+ format: uri
354
+ "401":
355
+ $ref: "#/components/responses/401Unauthorized"
356
+ "403":
357
+ $ref: "#/components/responses/403Forbidden"
358
+ "422":
359
+ $ref: "#/components/responses/422Unprocessable"
360
+ "500":
361
+ $ref: "#/components/responses/500InternalError"
362
+
363
+ /recursos/{id}:
364
+ parameters:
365
+ - $ref: "#/components/parameters/PathId"
366
+
367
+ get:
368
+ operationId: "obtener_recurso"
369
+ summary: "Obtener un recurso por ID"
370
+ tags: ["[Nombre del recurso]"]
371
+ responses:
372
+ "200":
373
+ description: "Recurso encontrado"
374
+ content:
375
+ application/json:
376
+ schema:
377
+ $ref: "#/components/schemas/RecursoRead"
378
+ "401":
379
+ $ref: "#/components/responses/401Unauthorized"
380
+ "404":
381
+ $ref: "#/components/responses/404NotFound"
382
+
383
+ patch:
384
+ operationId: "actualizar_recurso"
385
+ summary: "Actualizar parcialmente un recurso"
386
+ tags: ["[Nombre del recurso]"]
387
+ requestBody:
388
+ required: true
389
+ content:
390
+ application/json:
391
+ schema:
392
+ $ref: "#/components/schemas/RecursoUpdate"
393
+ responses:
394
+ "200":
395
+ description: "Recurso actualizado"
396
+ content:
397
+ application/json:
398
+ schema:
399
+ $ref: "#/components/schemas/RecursoRead"
400
+ "401":
401
+ $ref: "#/components/responses/401Unauthorized"
402
+ "403":
403
+ $ref: "#/components/responses/403Forbidden"
404
+ "404":
405
+ $ref: "#/components/responses/404NotFound"
406
+ "422":
407
+ $ref: "#/components/responses/422Unprocessable"
408
+
409
+ delete:
410
+ operationId: "eliminar_recurso"
411
+ summary: "Eliminar un recurso"
412
+ tags: ["[Nombre del recurso]"]
413
+ responses:
414
+ "204":
415
+ description: "Recurso eliminado — sin cuerpo de respuesta"
416
+ "401":
417
+ $ref: "#/components/responses/401Unauthorized"
418
+ "403":
419
+ $ref: "#/components/responses/403Forbidden"
420
+ "404":
421
+ $ref: "#/components/responses/404NotFound"
422
+
423
+ # ─── Autenticación (incluida como referencia) ──────────────────────────────
424
+ /auth/login:
425
+ post:
426
+ operationId: "login"
427
+ summary: "Iniciar sesión y obtener tokens JWT"
428
+ tags: ["Autenticación"]
429
+ security: [] # Endpoint público — no requiere token
430
+ requestBody:
431
+ required: true
432
+ content:
433
+ application/json:
434
+ schema:
435
+ type: object
436
+ required: [email, password]
437
+ properties:
438
+ email:
439
+ type: string
440
+ format: email
441
+ password:
442
+ type: string
443
+ format: password
444
+ minLength: 8
445
+ responses:
446
+ "200":
447
+ description: "Login exitoso"
448
+ content:
449
+ application/json:
450
+ schema:
451
+ type: object
452
+ required: [access_token, refresh_token, expires_in]
453
+ properties:
454
+ access_token:
455
+ type: string
456
+ description: "JWT de acceso. Incluir en header Authorization: Bearer <token>"
457
+ refresh_token:
458
+ type: string
459
+ description: "Token para renovar el access_token vía /auth/refresh"
460
+ expires_in:
461
+ type: integer
462
+ description: "Segundos hasta que expira el access_token"
463
+ example: 86400
464
+ "401":
465
+ description: "Credenciales inválidas"
466
+ content:
467
+ application/json:
468
+ schema:
469
+ $ref: "#/components/schemas/ErrorResponse"
470
+
471
+ /auth/refresh:
472
+ post:
473
+ operationId: "refresh_token"
474
+ summary: "Renovar access token usando refresh token"
475
+ tags: ["Autenticación"]
476
+ security: []
477
+ requestBody:
478
+ required: true
479
+ content:
480
+ application/json:
481
+ schema:
482
+ type: object
483
+ required: [refresh_token]
484
+ properties:
485
+ refresh_token:
486
+ type: string
487
+ responses:
488
+ "200":
489
+ description: "Token renovado"
490
+ content:
491
+ application/json:
492
+ schema:
493
+ type: object
494
+ properties:
495
+ access_token:
496
+ type: string
497
+ expires_in:
498
+ type: integer
499
+
500
+ # ─── Tags (para agrupar endpoints en la UI) ───────────────────────────────────
501
+ tags:
502
+ - name: "Autenticación"
503
+ description: "Endpoints para login y renovación de tokens"
504
+ - name: "[Nombre del recurso]"
505
+ description: "[Descripción del grupo de endpoints]"
506
+ # INSTRUCCIÓN: agregar más tags según los dominios del API