@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.
- package/CLAUDE.md +238 -0
- package/README.md +560 -0
- package/_userland/agentes/.gitkeep +0 -0
- package/_userland/habilidades/.gitkeep +0 -0
- package/agentes/.evolved.json +9 -0
- package/agentes/accesibilidad-wcag-swl.md +692 -0
- package/agentes/arquitecto-swl.md +238 -0
- package/agentes/auto-evolucion-swl.md +854 -0
- package/agentes/backend-api-swl.md +470 -0
- package/agentes/backend-csharp-swl.md +418 -0
- package/agentes/backend-go-swl.md +388 -0
- package/agentes/backend-java-swl.md +279 -0
- package/agentes/backend-node-swl.md +477 -0
- package/agentes/backend-python-swl.md +608 -0
- package/agentes/backend-rust-swl.md +362 -0
- package/agentes/backend-workers-swl.md +480 -0
- package/agentes/cloud-infra-swl.md +485 -0
- package/agentes/consolidador-swl.md +539 -0
- package/agentes/datos-swl.md +584 -0
- package/agentes/depurador-swl.md +349 -0
- package/agentes/devops-ci-swl.md +374 -0
- package/agentes/disenador-ui-swl.md +558 -0
- package/agentes/documentador-swl.md +343 -0
- package/agentes/evals/arquitecto-swl.evals.json +56 -0
- package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
- package/agentes/evals/implementador-swl.evals.json +56 -0
- package/agentes/evals/orquestador-swl.evals.json +60 -0
- package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
- package/agentes/evals/red-team-swl.evals.json +59 -0
- package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
- package/agentes/frontend-angular-swl.md +627 -0
- package/agentes/frontend-css-swl.md +720 -0
- package/agentes/frontend-react-swl.md +696 -0
- package/agentes/frontend-swl.md +500 -0
- package/agentes/frontend-tailwind-swl.md +830 -0
- package/agentes/implementador-swl.md +328 -0
- package/agentes/investigador-swl.md +430 -0
- package/agentes/investigador-ux-swl.md +500 -0
- package/agentes/llm-apps-swl.md +276 -0
- package/agentes/migrador-swl.md +417 -0
- package/agentes/mobile-android-swl.md +509 -0
- package/agentes/mobile-cross-swl.md +539 -0
- package/agentes/mobile-ios-swl.md +500 -0
- package/agentes/mobile-testing-swl.md +300 -0
- package/agentes/notificador-swl.md +916 -0
- package/agentes/observabilidad-swl.md +436 -0
- package/agentes/orquestador-swl.md +884 -0
- package/agentes/pagos-swl.md +283 -0
- package/agentes/perfilador-usuario-swl.md +306 -0
- package/agentes/planificador-swl.md +402 -0
- package/agentes/producto-prd-swl.md +587 -0
- package/agentes/red-team-swl.md +216 -0
- package/agentes/release-manager-swl.md +568 -0
- package/agentes/rendimiento-swl.md +714 -0
- package/agentes/resolutor-build-swl.md +243 -0
- package/agentes/revisor-angular-swl.md +276 -0
- package/agentes/revisor-codigo-swl.md +348 -0
- package/agentes/revisor-csharp-swl.md +262 -0
- package/agentes/revisor-go-swl.md +257 -0
- package/agentes/revisor-java-swl.md +255 -0
- package/agentes/revisor-kotlin-swl.md +271 -0
- package/agentes/revisor-nextjs-swl.md +279 -0
- package/agentes/revisor-php-swl.md +269 -0
- package/agentes/revisor-react-swl.md +276 -0
- package/agentes/revisor-rust-swl.md +344 -0
- package/agentes/revisor-seguridad-swl.md +390 -0
- package/agentes/revisor-swift-swl.md +266 -0
- package/agentes/revisor-typescript-swl.md +344 -0
- package/agentes/sre-swl.md +265 -0
- package/agentes/tdd-qa-swl.md +354 -0
- package/agentes/ux-disenador-swl.md +501 -0
- package/bin/lib/bot-comandos.js +1030 -0
- package/bin/lib/bot-discovery.js +182 -0
- package/bin/lib/bot-git.js +142 -0
- package/bin/swl-ses.js +325 -0
- package/bin/swl-telegram-bot.js +442 -0
- package/bin/swl-telegram-bot.plist +21 -0
- package/bin/swl-telegram-bot.service +14 -0
- package/comandos/swl/.evolved.json +23 -0
- package/comandos/swl/actualizar.md +174 -0
- package/comandos/swl/adoptar-proyecto.md +207 -0
- package/comandos/swl/aprender.md +701 -0
- package/comandos/swl/auditar-deps.md +134 -0
- package/comandos/swl/autoresearch.md +170 -0
- package/comandos/swl/ayuda.md +224 -0
- package/comandos/swl/brainstorm.md +50 -0
- package/comandos/swl/checkpoint.md +330 -0
- package/comandos/swl/compactar.md +283 -0
- package/comandos/swl/configurar-ci.md +227 -0
- package/comandos/swl/contexto.md +112 -0
- package/comandos/swl/contribuir.md +233 -0
- package/comandos/swl/crear-skill.md +292 -0
- package/comandos/swl/cron.md +196 -0
- package/comandos/swl/dashboard.md +146 -0
- package/comandos/swl/discutir-fase.md +230 -0
- package/comandos/swl/ejecutar-fase.md +135 -0
- package/comandos/swl/evaluar-skill.md +487 -0
- package/comandos/swl/evolucion-estado.md +142 -0
- package/comandos/swl/evolucionar.md +259 -0
- package/comandos/swl/exportar-vault.md +189 -0
- package/comandos/swl/gateway.md +158 -0
- package/comandos/swl/inbox.md +116 -0
- package/comandos/swl/instalar.md +220 -0
- package/comandos/swl/instintos.md +86 -0
- package/comandos/swl/mapear-codebase.md +312 -0
- package/comandos/swl/mcp-status.md +175 -0
- package/comandos/swl/metricas.md +270 -0
- package/comandos/swl/modelo.md +102 -0
- package/comandos/swl/notificaciones.md +396 -0
- package/comandos/swl/nuevo-proyecto.md +154 -0
- package/comandos/swl/planear-fase.md +221 -0
- package/comandos/swl/plugins.md +256 -0
- package/comandos/swl/reflect-skills.md +125 -0
- package/comandos/swl/release.md +217 -0
- package/comandos/swl/revisar-impacto.md +206 -0
- package/comandos/swl/revisar.md +330 -0
- package/comandos/swl/salud.md +363 -0
- package/comandos/swl/sesiones.md +200 -0
- package/comandos/swl/skill-search.md +113 -0
- package/comandos/swl/verificar.md +585 -0
- package/comandos/swl/wiki.md +620 -0
- package/contextos/dev.md +32 -0
- package/contextos/research.md +30 -0
- package/contextos/review.md +31 -0
- package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
- package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
- package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
- package/habilidades/agent-browser/SKILL.md +218 -0
- package/habilidades/agentes-como-servicio/SKILL.md +218 -0
- package/habilidades/ai-runtime-security/SKILL.md +273 -0
- package/habilidades/angular-avanzado/SKILL.md +164 -0
- package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
- package/habilidades/angular-moderno/SKILL.md +186 -0
- package/habilidades/angular-moderno/evals/evals.json +45 -0
- package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
- package/habilidades/api-rest-diseno/SKILL.md +191 -0
- package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
- package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
- package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
- package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
- package/habilidades/async-python/SKILL.md +149 -0
- package/habilidades/async-python/evals/evals.json +47 -0
- package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
- package/habilidades/auth-patrones/.evolved.json +9 -0
- package/habilidades/auth-patrones/SKILL.md +413 -0
- package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
- package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
- package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
- package/habilidades/autoresearch/SKILL.md +268 -0
- package/habilidades/autoresearch/evals/evals.json +41 -0
- package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
- package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
- package/habilidades/azure-cloud/SKILL.md +308 -0
- package/habilidades/azure-cloud/recursos/aks.md +327 -0
- package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -0
- package/habilidades/brainstorming/SKILL.md +295 -0
- package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
- package/habilidades/build-errors-cpp/SKILL.md +270 -0
- package/habilidades/build-errors-csharp/SKILL.md +265 -0
- package/habilidades/build-errors-go/SKILL.md +306 -0
- package/habilidades/build-errors-java/SKILL.md +278 -0
- package/habilidades/build-errors-kotlin/SKILL.md +303 -0
- package/habilidades/build-errors-nextjs/SKILL.md +312 -0
- package/habilidades/build-errors-php/SKILL.md +270 -0
- package/habilidades/build-errors-python/SKILL.md +292 -0
- package/habilidades/build-errors-rust/SKILL.md +284 -0
- package/habilidades/build-errors-swift/SKILL.md +272 -0
- package/habilidades/build-errors-typescript/SKILL.md +369 -0
- package/habilidades/checklist-calidad/SKILL.md +271 -0
- package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
- package/habilidades/checklist-seguridad/SKILL.md +285 -0
- package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
- package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
- package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
- package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
- package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
- package/habilidades/cloud-aws/SKILL.md +142 -0
- package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
- package/habilidades/compactacion-contexto/SKILL.md +247 -0
- package/habilidades/contenedores-docker/SKILL.md +137 -0
- package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
- package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
- package/habilidades/context-builder/SKILL.md +170 -0
- package/habilidades/control-profundidad/SKILL.md +128 -0
- package/habilidades/csharp-experto/SKILL.md +322 -0
- package/habilidades/csharp-patrones/SKILL.md +316 -0
- package/habilidades/csharp-testing/SKILL.md +286 -0
- package/habilidades/css-moderno/SKILL.md +166 -0
- package/habilidades/css-moderno/evals/evals.json +43 -0
- package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
- package/habilidades/datos-etl/SKILL.md +129 -0
- package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
- package/habilidades/dbml-experto/SKILL.md +339 -0
- package/habilidades/dbml-experto/evals/evals.json +56 -0
- package/habilidades/dependencias-auditoria/SKILL.md +320 -0
- package/habilidades/deprecacion-migracion/SKILL.md +169 -0
- package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
- package/habilidades/design-tokens/SKILL.md +158 -0
- package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
- package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
- package/habilidades/discutir-fase/SKILL.md +188 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
- package/habilidades/diseno-responsivo/SKILL.md +186 -0
- package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
- package/habilidades/django-experto/SKILL.md +205 -0
- package/habilidades/django-experto/recursos/async-django.md +390 -0
- package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
- package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
- package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
- package/habilidades/django-experto/recursos/testing-django.md +415 -0
- package/habilidades/doc-sync/SKILL.md +280 -0
- package/habilidades/drift-detection/SKILL.md +179 -0
- package/habilidades/ejecutar-fase/SKILL.md +468 -0
- package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
- package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
- package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
- package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
- package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
- package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
- package/habilidades/evaluacion-agentes/SKILL.md +314 -0
- package/habilidades/event-driven/SKILL.md +153 -0
- package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
- package/habilidades/extraccion-documentos/SKILL.md +221 -0
- package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
- package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
- package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
- package/habilidades/fastapi-experto/SKILL.md +221 -0
- package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
- package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
- package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
- package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
- package/habilidades/filament-admin/SKILL.md +290 -0
- package/habilidades/frontend-avanzado/SKILL.md +257 -0
- package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
- package/habilidades/gcp-cloud/SKILL.md +260 -0
- package/habilidades/gcp-cloud/recursos/gke.md +234 -0
- package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
- package/habilidades/generacion-mermaid/SKILL.md +229 -0
- package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
- package/habilidades/go-experto/SKILL.md +305 -0
- package/habilidades/go-patrones/SKILL.md +299 -0
- package/habilidades/go-testing/SKILL.md +291 -0
- package/habilidades/graphql-experto/SKILL.md +323 -0
- package/habilidades/guardrail-semantico/SKILL.md +282 -0
- package/habilidades/harness-claude-code/SKILL.md +299 -0
- package/habilidades/iam-secretos/SKILL.md +265 -0
- package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
- package/habilidades/infra-github-actions/SKILL.md +166 -0
- package/habilidades/instalar-sistema/.evolved.json +9 -0
- package/habilidades/instalar-sistema/SKILL.md +221 -0
- package/habilidades/java-experto/SKILL.md +290 -0
- package/habilidades/java-patrones/SKILL.md +275 -0
- package/habilidades/java-testing/SKILL.md +288 -0
- package/habilidades/kotlin-compose/SKILL.md +278 -0
- package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
- package/habilidades/kotlin-experto/SKILL.md +318 -0
- package/habilidades/kotlin-testing/SKILL.md +267 -0
- package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
- package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
- package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
- package/habilidades/langchain-langraph/SKILL.md +386 -0
- package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
- package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
- package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
- package/habilidades/legacy-code-rescue/SKILL.md +267 -0
- package/habilidades/likec4-experto/SKILL.md +412 -0
- package/habilidades/likec4-experto/evals/evals.json +69 -0
- package/habilidades/manejo-errores/.evolved.json +9 -0
- package/habilidades/manejo-errores/SKILL.md +407 -0
- package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
- package/habilidades/mapear-codebase/SKILL.md +275 -0
- package/habilidades/memoria-busqueda/SKILL.md +194 -0
- package/habilidades/memoria-busqueda/evals/evals.json +44 -0
- package/habilidades/meta-skills-estandar/SKILL.md +298 -0
- package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
- package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
- package/habilidades/microservicios/SKILL.md +155 -0
- package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
- package/habilidades/mobile-flutter/SKILL.md +199 -0
- package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
- package/habilidades/mobile-react-native/SKILL.md +176 -0
- package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
- package/habilidades/mongodb-experto/SKILL.md +302 -0
- package/habilidades/monitoring-alertas/SKILL.md +201 -0
- package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
- package/habilidades/nestjs-experto/SKILL.md +307 -0
- package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
- package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
- package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
- package/habilidades/nextjs-experto/SKILL.md +335 -0
- package/habilidades/nextjs-patrones/SKILL.md +303 -0
- package/habilidades/nextjs-testing/SKILL.md +331 -0
- package/habilidades/node-experto/.evolved.json +9 -0
- package/habilidades/node-experto/SKILL.md +266 -0
- package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
- package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
- package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
- package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
- package/habilidades/nuevo-proyecto/SKILL.md +204 -0
- package/habilidades/orquestacion-async/SKILL.md +303 -0
- package/habilidades/paid-media-tracking/SKILL.md +269 -0
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
- package/habilidades/patrones-python/SKILL.md +228 -0
- package/habilidades/patrones-python/evals/evals.json +56 -0
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
- package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
- package/habilidades/perfil-usuario/SKILL.md +200 -0
- package/habilidades/perfil-usuario/evals/evals.json +55 -0
- package/habilidades/performance-baseline/SKILL.md +297 -0
- package/habilidades/php-experto/SKILL.md +291 -0
- package/habilidades/php-patrones/SKILL.md +306 -0
- package/habilidades/php-testing/SKILL.md +280 -0
- package/habilidades/planear-fase/SKILL.md +269 -0
- package/habilidades/postgresql-experto/SKILL.md +151 -0
- package/habilidades/postgresql-experto/evals/evals.json +53 -0
- package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
- package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
- package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
- package/habilidades/privacy-memoria/SKILL.md +141 -0
- package/habilidades/privacy-memoria/evals/evals.json +43 -0
- package/habilidades/prompt-engineering/SKILL.md +518 -0
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
- package/habilidades/rag-arquitectura/SKILL.md +338 -0
- package/habilidades/rails-experto/SKILL.md +237 -0
- package/habilidades/rails-experto/recursos/active-record.md +260 -0
- package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
- package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
- package/habilidades/react-experto/SKILL.md +209 -0
- package/habilidades/react-experto/evals/evals.json +55 -0
- package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
- package/habilidades/react-optimizacion/SKILL.md +174 -0
- package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
- package/habilidades/redis-experto/SKILL.md +305 -0
- package/habilidades/release-semver/.evolved.json +9 -0
- package/habilidades/release-semver/SKILL.md +248 -0
- package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
- package/habilidades/rust-experto/SKILL.md +400 -0
- package/habilidades/rust-patrones/SKILL.md +296 -0
- package/habilidades/rust-testing/SKILL.md +311 -0
- package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
- package/habilidades/sql-optimizacion/SKILL.md +200 -0
- package/habilidades/sql-optimizacion/evals/evals.json +54 -0
- package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
- package/habilidades/sre-patrones/SKILL.md +333 -0
- package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
- package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
- package/habilidades/stripe-pagos/SKILL.md +550 -0
- package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
- package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
- package/habilidades/structured-outputs/SKILL.md +343 -0
- package/habilidades/swift-experto/SKILL.md +320 -0
- package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
- package/habilidades/swift-patrones/SKILL.md +313 -0
- package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
- package/habilidades/swift-testing/SKILL.md +254 -0
- package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
- package/habilidades/swl-dashboard/SKILL.md +370 -0
- package/habilidades/swl-markitdown/SKILL.md +285 -0
- package/habilidades/swl-markitdown/evals/evals.json +52 -0
- package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
- package/habilidades/tailwind-experto/SKILL.md +240 -0
- package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
- package/habilidades/tdd-workflow/SKILL.md +293 -0
- package/habilidades/terraform-experto/SKILL.md +321 -0
- package/habilidades/testing-python/SKILL.md +340 -0
- package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
- package/habilidades/threat-model-lite/SKILL.md +246 -0
- package/habilidades/tracing-processor/SKILL.md +212 -0
- package/habilidades/tracking-measurement/SKILL.md +239 -0
- package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
- package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
- package/habilidades/typescript-avanzado/SKILL.md +144 -0
- package/habilidades/typescript-avanzado/evals/evals.json +55 -0
- package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
- package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
- package/habilidades/ux-diseno/SKILL.md +116 -0
- package/habilidades/ux-diseno/evals/evals.json +43 -0
- package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
- package/habilidades/verificacion-evidencia/SKILL.md +160 -0
- package/habilidades/verificar-trabajo/SKILL.md +303 -0
- package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
- package/habilidades/wiki-conocimiento/SKILL.md +276 -0
- package/habilidades/wireframes-flujos/SKILL.md +212 -0
- package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
- package/habilidades/workflow-claude-code/SKILL.md +260 -0
- package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
- package/hooks/_run-hook.sh +57 -0
- package/hooks/actualizar-perfil-usuario.js +364 -0
- package/hooks/agente-lifecycle.js +71 -0
- package/hooks/aiisms-detector.js +173 -0
- package/hooks/audit-trail.js +204 -0
- package/hooks/auto-background.js +97 -0
- package/hooks/auto-consolidacion.js +178 -0
- package/hooks/auto-evolucion.js +666 -0
- package/hooks/auto-restaurar-settings.js +360 -0
- package/hooks/calidad-pre-commit.js +929 -0
- package/hooks/calidad-typescript.js +511 -0
- package/hooks/captura-feedback-usuario.js +148 -0
- package/hooks/check-update.js +211 -0
- package/hooks/clasificador-mensajes.js +271 -0
- package/hooks/degradacion-instintos.js +272 -0
- package/hooks/escaneo-secretos.js +389 -0
- package/hooks/extraccion-aprendizajes.js +763 -0
- package/hooks/grafo-contexto.js +129 -0
- package/hooks/graph-update.js +67 -0
- package/hooks/guardrail-modelo.js +247 -0
- package/hooks/inbox-aviso.js +75 -0
- package/hooks/inyeccion-contexto.js +246 -0
- package/hooks/lib/abort-registry.js +214 -0
- package/hooks/lib/agent-backend.js +210 -0
- package/hooks/lib/agent-comms.js +263 -0
- package/hooks/lib/agent-issue-codes.js +284 -0
- package/hooks/lib/agent-matcher.js +189 -0
- package/hooks/lib/async-hook-registry.js +252 -0
- package/hooks/lib/atomic-write.js +130 -0
- package/hooks/lib/auto-consolidator.js +335 -0
- package/hooks/lib/canary-skills.js +187 -0
- package/hooks/lib/consolidation-lock.js +291 -0
- package/hooks/lib/context-builder.js +430 -0
- package/hooks/lib/context-compressor.js +657 -0
- package/hooks/lib/convergence-detector.js +105 -0
- package/hooks/lib/delegation-tracker.js +198 -0
- package/hooks/lib/detectar-package-manager.js +423 -0
- package/hooks/lib/edit-accumulator.js +171 -0
- package/hooks/lib/error-classifier.js +308 -0
- package/hooks/lib/event-bus.js +112 -0
- package/hooks/lib/evolution-tracker.js +442 -0
- package/hooks/lib/execution-state.js +316 -0
- package/hooks/lib/fingerprint-id.js +135 -0
- package/hooks/lib/gateway-notify.js +116 -0
- package/hooks/lib/graph-security.js +75 -0
- package/hooks/lib/guardrail-metrics.js +202 -0
- package/hooks/lib/hook-circuit-breaker.js +206 -0
- package/hooks/lib/loop-detector.js +267 -0
- package/hooks/lib/mcp-health.js +184 -0
- package/hooks/lib/mcp-pool.js +436 -0
- package/hooks/lib/memory-search.js +506 -0
- package/hooks/lib/merkle-audit.js +96 -0
- package/hooks/lib/model-router.js +222 -0
- package/hooks/lib/normalize-error.js +324 -0
- package/hooks/lib/normalize-input.js +65 -0
- package/hooks/lib/nudge-tracker.js +306 -0
- package/hooks/lib/otlp-exporter.js +365 -0
- package/hooks/lib/performance-marks.js +239 -0
- package/hooks/lib/privacy-filter.js +128 -0
- package/hooks/lib/prompt-injection-scanner.js +209 -0
- package/hooks/lib/provenance-tracker.js +183 -0
- package/hooks/lib/rate-limit-tracker.js +253 -0
- package/hooks/lib/reflect-classifier.js +164 -0
- package/hooks/lib/resource-quota.js +122 -0
- package/hooks/lib/retry-jitter.js +165 -0
- package/hooks/lib/risk-engine.js +368 -0
- package/hooks/lib/run-log.js +408 -0
- package/hooks/lib/session-fts.js +379 -0
- package/hooks/lib/session-store.js +293 -0
- package/hooks/lib/singleton-guard.js +159 -0
- package/hooks/lib/skill-auditor.js +588 -0
- package/hooks/lib/sync-status.js +228 -0
- package/hooks/lib/taint-tracker.js +107 -0
- package/hooks/lib/task-service.js +295 -0
- package/hooks/lib/tech-skills-map.js +146 -0
- package/hooks/lib/telegram-cliente.js +159 -0
- package/hooks/lib/telegram-config.js +170 -0
- package/hooks/lib/token-budget.js +156 -0
- package/hooks/lib/token-estimator.js +420 -0
- package/hooks/lib/toon-compressor.js +245 -0
- package/hooks/lib/usage-model.js +183 -0
- package/hooks/lib/variable-resolver.js +230 -0
- package/hooks/linea-estado.js +324 -0
- package/hooks/metricas-evolucion.js +209 -0
- package/hooks/monitor-contexto.js +325 -0
- package/hooks/notificacion-sesion-stop.js +198 -0
- package/hooks/notificacion-telegram-notification.js +4 -0
- package/hooks/notificacion-telegram-subagent.js +4 -0
- package/hooks/notificacion-telegram.js +267 -0
- package/hooks/preservar-estado-pre-compact.js +150 -0
- package/hooks/proteccion-rutas.js +366 -0
- package/hooks/registro-turnos.js +209 -0
- package/hooks/resumen-sesion.js +249 -0
- package/hooks/risk-scoring.js +323 -0
- package/hooks/rotar-audit-auto.js +122 -0
- package/hooks/sugerir-regenerar-inventario.js +170 -0
- package/hooks/telemetria-agentes.js +167 -0
- package/hooks/tracking-costos.js +688 -0
- package/instintos/global.yaml +8 -0
- package/instintos/perfil-usuario.yaml +53 -0
- package/instintos/prompt-appendices.yaml +57 -0
- package/instintos/proyecto.yaml +372 -0
- package/manifiestos/gateway-config.json +77 -0
- package/manifiestos/handoff-context.json +223 -0
- package/manifiestos/hook-profiles.json +44 -0
- package/manifiestos/hooks-config.json +360 -0
- package/manifiestos/modulos.json +1173 -0
- package/manifiestos/perfiles.json +404 -0
- package/package.json +86 -0
- package/plantillas/ESTADO.md +109 -0
- package/plantillas/HOJA-RUTA.md +143 -0
- package/plantillas/PROYECTO.md +122 -0
- package/plantillas/REQUISITOS.md +132 -0
- package/plantillas/auditor-veto-template.md +105 -0
- package/plantillas/github-workflows/README.md +47 -0
- package/plantillas/github-workflows/release-please.yml +44 -0
- package/plantillas/github-workflows/swl-ci.yml +107 -0
- package/plantillas/github-workflows/swl-security.yml +51 -0
- package/plantillas/mcp-mineru.json +13 -0
- package/plantillas/research/ARQUITECTURA.md +220 -0
- package/plantillas/research/FUNCIONALIDADES.md +175 -0
- package/plantillas/research/RESUMEN.md +165 -0
- package/plantillas/research/STACK.md +233 -0
- package/plantillas/research/TRAMPAS.md +299 -0
- package/plantillas/skill-evals-template.json +44 -0
- package/plugin.json +343 -0
- package/reglas/accesibilidad.md +269 -0
- package/reglas/api-diseno.md +400 -0
- package/reglas/arquitectura.md +352 -0
- package/reglas/brevedad-output.md +124 -0
- package/reglas/cloud-infra.md +247 -0
- package/reglas/docs.md +245 -0
- package/reglas/estilo-codigo.md +201 -0
- package/reglas/git-workflow.md +245 -0
- package/reglas/gobernanza.md +271 -0
- package/reglas/harness-claude-code.md +213 -0
- package/reglas/hooks.md +186 -0
- package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
- package/reglas/lenguajes/csharp/hooks.md +281 -0
- package/reglas/lenguajes/csharp/patrones.md +226 -0
- package/reglas/lenguajes/csharp/seguridad.md +258 -0
- package/reglas/lenguajes/csharp/testing.md +176 -0
- package/reglas/lenguajes/go/estilo-codigo.md +195 -0
- package/reglas/lenguajes/go/hooks.md +249 -0
- package/reglas/lenguajes/go/patrones.md +249 -0
- package/reglas/lenguajes/go/seguridad.md +225 -0
- package/reglas/lenguajes/go/testing.md +272 -0
- package/reglas/lenguajes/java/estilo-codigo.md +217 -0
- package/reglas/lenguajes/java/hooks.md +251 -0
- package/reglas/lenguajes/java/patrones.md +226 -0
- package/reglas/lenguajes/java/seguridad.md +233 -0
- package/reglas/lenguajes/java/testing.md +238 -0
- package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
- package/reglas/lenguajes/kotlin/hooks.md +245 -0
- package/reglas/lenguajes/kotlin/patrones.md +201 -0
- package/reglas/lenguajes/kotlin/seguridad.md +202 -0
- package/reglas/lenguajes/kotlin/testing.md +236 -0
- package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
- package/reglas/lenguajes/nextjs/hooks.md +186 -0
- package/reglas/lenguajes/nextjs/patrones.md +225 -0
- package/reglas/lenguajes/nextjs/seguridad.md +216 -0
- package/reglas/lenguajes/nextjs/testing.md +193 -0
- package/reglas/lenguajes/php/estilo-codigo.md +228 -0
- package/reglas/lenguajes/php/hooks.md +165 -0
- package/reglas/lenguajes/php/patrones.md +233 -0
- package/reglas/lenguajes/php/seguridad.md +186 -0
- package/reglas/lenguajes/php/testing.md +205 -0
- package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
- package/reglas/lenguajes/rust/hooks.md +240 -0
- package/reglas/lenguajes/rust/patrones.md +250 -0
- package/reglas/lenguajes/rust/seguridad.md +221 -0
- package/reglas/lenguajes/rust/testing.md +194 -0
- package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
- package/reglas/lenguajes/swift/hooks.md +257 -0
- package/reglas/lenguajes/swift/patrones.md +235 -0
- package/reglas/lenguajes/swift/seguridad.md +248 -0
- package/reglas/lenguajes/swift/testing.md +242 -0
- package/reglas/markitdown.md +60 -0
- package/reglas/memoria-consolidada.md +209 -0
- package/reglas/patrones.md +225 -0
- package/reglas/performance.md +195 -0
- package/reglas/pruebas.md +159 -0
- package/reglas/seguridad-agentes.md +351 -0
- package/reglas/seguridad.md +151 -0
- package/reglas/skills-estandar.md +373 -0
- package/reglas/testing.md +193 -0
- package/schemas/agent-contract.json +176 -0
- package/schemas/agent-frontmatter.schema.json +149 -0
- package/schemas/agent-message.schema.json +53 -0
- package/schemas/agent-output-implementacion.schema.json +85 -0
- package/schemas/agent-output-planificacion.schema.json +113 -0
- package/schemas/agent-output-review.schema.json +78 -0
- package/schemas/diary-entry.schema.json +80 -0
- package/schemas/hook-profiles.schema.json +39 -0
- package/schemas/hooks-config.schema.json +74 -0
- package/schemas/instinct.schema.json +115 -0
- package/schemas/modulos.schema.json +29 -0
- package/schemas/perfiles.schema.json +28 -0
- package/schemas/plugin.schema.json +64 -0
- package/schemas/skill-evals.schema.json +95 -0
- package/schemas/skill-frontmatter.schema.json +170 -0
- package/scripts/actualizar.js +145 -0
- package/scripts/audit-skills.sh +78 -0
- package/scripts/auditar-agentes-gaps.js +149 -0
- package/scripts/auditar-cobertura-frameworks.js +241 -0
- package/scripts/auditar-skills-gaps.js +206 -0
- package/scripts/bootstrap-instintos.js +259 -0
- package/scripts/check-update.js +109 -0
- package/scripts/comandos/agents.js +105 -0
- package/scripts/comandos/info.js +108 -0
- package/scripts/comandos/install-asistido.js +186 -0
- package/scripts/comandos/skills.js +211 -0
- package/scripts/configurar-branch-protection.js +418 -0
- package/scripts/daemon-swl.py +388 -0
- package/scripts/desinstalar.js +130 -0
- package/scripts/doctor.js +559 -0
- package/scripts/field-report.js +199 -0
- package/scripts/generar-inventario.js +317 -0
- package/scripts/inbox-tmux-inject.js +161 -0
- package/scripts/inferir-herramientas-permitidas.js +586 -0
- package/scripts/inicializar.js +133 -0
- package/scripts/instalador.js +1031 -0
- package/scripts/instalar-git-hook.js +122 -0
- package/scripts/lib/agp-frontmatter.js +222 -0
- package/scripts/lib/append-con-marcadores.js +199 -0
- package/scripts/lib/artefactos-python.js +43 -0
- package/scripts/lib/audit-query.js +221 -0
- package/scripts/lib/autostart-linux.js +347 -0
- package/scripts/lib/autostart-macos.js +360 -0
- package/scripts/lib/autostart-windows.js +307 -0
- package/scripts/lib/budget-enforcer.js +252 -0
- package/scripts/lib/claude-sessions.js +285 -0
- package/scripts/lib/configurar-ci.js +380 -0
- package/scripts/lib/console-span-exporter.js +92 -0
- package/scripts/lib/contadores-inventario.js +217 -0
- package/scripts/lib/dashboard-widgets.js +290 -0
- package/scripts/lib/detectar-runtime.js +279 -0
- package/scripts/lib/detectar-stack.js +187 -0
- package/scripts/lib/diary-entry.js +234 -0
- package/scripts/lib/drift-detector.js +545 -0
- package/scripts/lib/estado.js +124 -0
- package/scripts/lib/gestor-componentes.js +243 -0
- package/scripts/lib/gitignore-manifest.js +305 -0
- package/scripts/lib/graph-analyze.py +556 -0
- package/scripts/lib/graph-builder.py +485 -0
- package/scripts/lib/graph-cluster.py +259 -0
- package/scripts/lib/health-row.js +168 -0
- package/scripts/lib/hooks-settings.js +789 -0
- package/scripts/lib/manifiestos.js +138 -0
- package/scripts/lib/mc-client.js +137 -0
- package/scripts/lib/notificaciones-telegram.js +1107 -0
- package/scripts/lib/npm-version.js +261 -0
- package/scripts/lib/paquetes-conocidos.js +50 -0
- package/scripts/lib/preservar-usuario.js +586 -0
- package/scripts/lib/prompt-builder.js +264 -0
- package/scripts/lib/resolver-externo.js +332 -0
- package/scripts/lib/schedule-parser.js +305 -0
- package/scripts/lib/scoring-instintos.js +240 -0
- package/scripts/lib/seguridad.js +160 -0
- package/scripts/lib/selector-interactivo.js +152 -0
- package/scripts/lib/semantic-search.js +242 -0
- package/scripts/lib/skill-discovery.js +234 -0
- package/scripts/lib/skill-metrics.js +246 -0
- package/scripts/lib/skill-normalizer.js +112 -0
- package/scripts/lib/skills-hub.js +340 -0
- package/scripts/lib/span-schema.js +134 -0
- package/scripts/lib/tool-cost-analyzer.js +255 -0
- package/scripts/lib/tracing-processor-interface.js +286 -0
- package/scripts/lib/transformadores/base.js +80 -0
- package/scripts/lib/transformadores/claude.js +124 -0
- package/scripts/lib/transformadores/codex.js +115 -0
- package/scripts/lib/transformadores/copilot.js +106 -0
- package/scripts/lib/transformadores/gemini.js +74 -0
- package/scripts/lib/transformadores/index.js +35 -0
- package/scripts/lib/transformadores/opencode.js +75 -0
- package/scripts/lib/ui.js +259 -0
- package/scripts/limpiar-artefactos-python.js +131 -0
- package/scripts/mcp-orchestrator.py +386 -0
- package/scripts/mcp-pool-manager.py +352 -0
- package/scripts/mcp-telemetry.py +378 -0
- package/scripts/poblar-evolvable.js +226 -0
- package/scripts/publicar.js +287 -0
- package/scripts/reflect-skills.js +403 -0
- package/scripts/rotar-audit-logs.js +185 -0
- package/scripts/run-skill-evals.js +242 -0
- package/scripts/smoke-test.js +374 -0
- package/scripts/token-analysis.py +471 -0
- package/scripts/validar-manifest.js +195 -0
- package/scripts/validar-memoria.js +321 -0
- package/scripts/validar-tests-aislamiento.js +184 -0
- package/scripts/validar-tokens-test.js +208 -0
- package/scripts/validar.js +147 -0
- package/scripts/validate-markdown.py +339 -0
- package/scripts/validate-skills.py +385 -0
- package/scripts/vendor/claude-usage/README.md +116 -0
- package/scripts/vendor/claude-usage/cli.py +334 -0
- package/scripts/vendor/claude-usage/dashboard.py +795 -0
- package/scripts/vendor/claude-usage/scanner.py +467 -0
- package/scripts/vendor/markitdown/cli.py +194 -0
- package/scripts/verificar-evolucion.js +289 -0
- 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
|