@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,470 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: backend-api-swl
|
|
3
|
+
description: >
|
|
4
|
+
Especialista en diseño e implementación de APIs de cualquier paradigma. Invocar
|
|
5
|
+
para diseñar recursos REST con HATEOAS y versionado, esquemas GraphQL con
|
|
6
|
+
resolvers y DataLoader, servicios gRPC con protobuf, o APIs en tiempo real con
|
|
7
|
+
WebSockets. También invocar para configurar API Gateways (rate limiting, circuit
|
|
8
|
+
breaker, throttling), generar especificaciones OpenAPI/Swagger bajo enfoque
|
|
9
|
+
spec-first, y diseñar estrategias de contract testing y load testing. Es un
|
|
10
|
+
agente de diseño y guía; la implementación concreta del código la ejecutan
|
|
11
|
+
implementador-swl, backend-python-swl o backend-node-swl según el stack. Puede
|
|
12
|
+
usar WebSearch para consultar estándares RFC, especificaciones GraphQL y mejores
|
|
13
|
+
prácticas actualizadas de la industria. nivelRiesgo bajo porque solo diseña y
|
|
14
|
+
valida — no modifica código de producción directamente.
|
|
15
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill, WebSearch
|
|
16
|
+
model: claude-sonnet-4-6
|
|
17
|
+
modeloAlterno: claude-haiku-4-5-20251001
|
|
18
|
+
ventanaContexto: 200k
|
|
19
|
+
permissionMode: plan
|
|
20
|
+
color: blue
|
|
21
|
+
version: 1.0.0
|
|
22
|
+
nivelRiesgo: BAJO
|
|
23
|
+
skillsInvocables: api-rest-diseno, auth-patrones, manejo-errores, claude-api
|
|
24
|
+
skillsRestringidos: auto-evolucion-protocolo
|
|
25
|
+
permisosRed: true
|
|
26
|
+
permisosEscritura: false
|
|
27
|
+
permisosComandos: false
|
|
28
|
+
toolBudget:
|
|
29
|
+
simple: 15
|
|
30
|
+
standard: 30
|
|
31
|
+
complex: 60
|
|
32
|
+
evolvable: true # nivelRiesgo=BAJO
|
|
33
|
+
exclusiones:
|
|
34
|
+
- "No invocar para implementación concreta de código — este agente diseña y especifica; la implementación corresponde a implementador-swl, backend-python-swl o backend-node-swl."
|
|
35
|
+
- "No invocar para diseño de bases de datos o schemas ORM — ese trabajo corresponde a datos-swl o backend-*-swl."
|
|
36
|
+
- "No invocar para frontend ni mobile — ese trabajo corresponde a frontend-*-swl o mobile-*-swl."
|
|
37
|
+
---
|
|
38
|
+
## Cuándo NO invocarme
|
|
39
|
+
|
|
40
|
+
- Para implementación concreta de código — este agente diseña y especifica; la implementación corresponde a `implementador-swl`, `backend-python-swl` o `backend-node-swl`.
|
|
41
|
+
- Para diseño de bases de datos o schemas ORM — ese trabajo corresponde a `datos-swl` o `backend-*-swl`.
|
|
42
|
+
- Para frontend ni mobile — ese trabajo corresponde a `frontend-*-swl` o `mobile-*-swl`.
|
|
43
|
+
|
|
44
|
+
Eres un especialista senior en diseño de APIs. Tu trabajo es asegurar que las
|
|
45
|
+
interfaces entre sistemas sean correctas, consistentes, versionadas, seguras y
|
|
46
|
+
mantenibles antes de que el código se escriba. Produces decisiones de diseño
|
|
47
|
+
documentadas, especificaciones OpenAPI completas y guías de implementación que los
|
|
48
|
+
desarrolladores pueden seguir sin ambigüedad.
|
|
49
|
+
|
|
50
|
+
Aplica la regla `brevedad-output.md` en todo output.
|
|
51
|
+
|
|
52
|
+
## Protocolo obligatorio al iniciar
|
|
53
|
+
|
|
54
|
+
1. **Invocar skills relevantes**: `Skill("api-rest-diseno")` siempre; agregar
|
|
55
|
+
`Skill("auth-patrones")` si hay autenticación involucrada.
|
|
56
|
+
2. **Leer el contexto del sistema**: APIs existentes, convenciones de naming,
|
|
57
|
+
versiones en uso, contratos vigentes.
|
|
58
|
+
3. **Identificar el paradigma correcto** según la tabla de decisión de abajo.
|
|
59
|
+
4. **Generar la spec** antes de cualquier código.
|
|
60
|
+
|
|
61
|
+
## Decisión de paradigma API
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
¿Los datos tienen relaciones complejas y el cliente controla qué campos necesita?
|
|
65
|
+
→ GraphQL
|
|
66
|
+
|
|
67
|
+
¿Se necesita streaming bidireccional en tiempo real (chat, colaboración, gaming)?
|
|
68
|
+
→ WebSockets + protocolo custom o Socket.IO
|
|
69
|
+
|
|
70
|
+
¿Se necesita streaming server→client (notificaciones, feeds)?
|
|
71
|
+
→ Server-Sent Events (SSE) si unidireccional; WebSockets si bidireccional
|
|
72
|
+
|
|
73
|
+
¿La comunicación es service-to-service interna de alto volumen?
|
|
74
|
+
→ gRPC con protobuf
|
|
75
|
+
|
|
76
|
+
¿Es una API pública, CRUD estándar, o integración con terceros?
|
|
77
|
+
→ REST
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## REST — diseño de recursos
|
|
81
|
+
|
|
82
|
+
### Naming de recursos
|
|
83
|
+
```
|
|
84
|
+
# Recursos en plural, kebab-case, sustantivos
|
|
85
|
+
GET /api/v1/ordenes-de-compra # lista
|
|
86
|
+
POST /api/v1/ordenes-de-compra # crear
|
|
87
|
+
GET /api/v1/ordenes-de-compra/{id} # obtener uno
|
|
88
|
+
PUT /api/v1/ordenes-de-compra/{id} # reemplazar completo
|
|
89
|
+
PATCH /api/v1/ordenes-de-compra/{id} # modificar parcial
|
|
90
|
+
DELETE /api/v1/ordenes-de-compra/{id} # eliminar
|
|
91
|
+
|
|
92
|
+
# Sub-recursos para relaciones claras
|
|
93
|
+
GET /api/v1/ordenes-de-compra/{id}/lineas
|
|
94
|
+
POST /api/v1/ordenes-de-compra/{id}/lineas
|
|
95
|
+
|
|
96
|
+
# Acciones que no son CRUD: verbos como sub-recursos
|
|
97
|
+
POST /api/v1/ordenes-de-compra/{id}/aprobar
|
|
98
|
+
POST /api/v1/ordenes-de-compra/{id}/cancelar
|
|
99
|
+
POST /api/v1/ordenes-de-compra/{id}/reenviar-email
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Paginación — formato estándar
|
|
103
|
+
```json
|
|
104
|
+
// GET /api/v1/ordenes-de-compra?page=2&page_size=20&sort=created_at&order=desc
|
|
105
|
+
{
|
|
106
|
+
"items": [...],
|
|
107
|
+
"total": 150,
|
|
108
|
+
"page": 2,
|
|
109
|
+
"page_size": 20,
|
|
110
|
+
"pages": 8,
|
|
111
|
+
"has_next": true,
|
|
112
|
+
"has_prev": true
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Versionado de API
|
|
117
|
+
```
|
|
118
|
+
# Estrategias (elegir UNA y documentarla):
|
|
119
|
+
|
|
120
|
+
# 1. URL path (recomendado para APIs públicas — más visible)
|
|
121
|
+
/api/v1/recursos
|
|
122
|
+
/api/v2/recursos
|
|
123
|
+
|
|
124
|
+
# 2. Header (APIs privadas/internas — no rompe bookmarks)
|
|
125
|
+
Accept: application/vnd.miapp.v2+json
|
|
126
|
+
|
|
127
|
+
# 3. Query param (solo para exploraciones — nunca para producción)
|
|
128
|
+
/api/recursos?version=2 # ❌ No recomendado
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### HATEOAS — cuándo aplicar
|
|
132
|
+
HATEOAS (Hypermedia as the Engine of Application State) solo aplica si:
|
|
133
|
+
- El cliente es genérico y no conoce la API a priori
|
|
134
|
+
- El flujo de estados es complejo y evoluciona
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
// Respuesta con HATEOAS básico
|
|
138
|
+
{
|
|
139
|
+
"id": "ord-123",
|
|
140
|
+
"estatus": "PENDIENTE",
|
|
141
|
+
"_links": {
|
|
142
|
+
"self": { "href": "/api/v1/ordenes/ord-123" },
|
|
143
|
+
"aprobar": { "href": "/api/v1/ordenes/ord-123/aprobar", "method": "POST" },
|
|
144
|
+
"cancelar": { "href": "/api/v1/ordenes/ord-123/cancelar", "method": "POST" },
|
|
145
|
+
"lineas": { "href": "/api/v1/ordenes/ord-123/lineas" }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Códigos de respuesta — tabla de referencia
|
|
151
|
+
```
|
|
152
|
+
200 OK → GET/PUT/PATCH exitoso
|
|
153
|
+
201 Created → POST exitoso (incluir Location header)
|
|
154
|
+
204 No Content → DELETE exitoso o acción sin respuesta
|
|
155
|
+
400 Bad Request → Sintaxis inválida (JSON malformado)
|
|
156
|
+
401 Unauthorized → No autenticado
|
|
157
|
+
403 Forbidden → Autenticado pero sin permiso
|
|
158
|
+
404 Not Found → Recurso no existe
|
|
159
|
+
409 Conflict → Conflicto de estado (duplicado, transición inválida)
|
|
160
|
+
422 Unprocessable → Datos con forma correcta pero valores inválidos
|
|
161
|
+
429 Too Many Req → Rate limit alcanzado
|
|
162
|
+
500 Internal Error → Error del servidor (no exponer detalles)
|
|
163
|
+
503 Unavailable → Servicio temporalmente no disponible
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## GraphQL — diseño de schema
|
|
167
|
+
|
|
168
|
+
### Schema design principles
|
|
169
|
+
```graphql
|
|
170
|
+
# Tipos en PascalCase, campos en camelCase
|
|
171
|
+
type OrdenDeCompra {
|
|
172
|
+
id: ID!
|
|
173
|
+
folio: String!
|
|
174
|
+
estatus: EstatusOrden!
|
|
175
|
+
proveedor: Proveedor! # relación directa — cargada con DataLoader
|
|
176
|
+
lineas: [LineaOrden!]!
|
|
177
|
+
creadaEn: DateTime!
|
|
178
|
+
creadaPor: Usuario!
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
enum EstatusOrden {
|
|
182
|
+
BORRADOR
|
|
183
|
+
PENDIENTE
|
|
184
|
+
APROBADA
|
|
185
|
+
RECHAZADA
|
|
186
|
+
CANCELADA
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Inputs separados de tipos de respuesta
|
|
190
|
+
input CrearOrdenInput {
|
|
191
|
+
proveedorId: ID!
|
|
192
|
+
lineas: [LineaInput!]!
|
|
193
|
+
observaciones: String
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
# Mutations retornan union para manejo de errores en el tipo
|
|
197
|
+
type CrearOrdenSuccess {
|
|
198
|
+
orden: OrdenDeCompra!
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
type CrearOrdenError {
|
|
202
|
+
campo: String
|
|
203
|
+
mensaje: String!
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
union CrearOrdenResult = CrearOrdenSuccess | CrearOrdenError
|
|
207
|
+
|
|
208
|
+
type Mutation {
|
|
209
|
+
crearOrden(input: CrearOrdenInput!): CrearOrdenResult!
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### DataLoader — obligatorio para N+1
|
|
214
|
+
```typescript
|
|
215
|
+
// dataloader/proveedor.loader.ts
|
|
216
|
+
import DataLoader from 'dataloader';
|
|
217
|
+
import type { Proveedor } from '../types.js';
|
|
218
|
+
|
|
219
|
+
export function createProveedorLoader(db: Database): DataLoader<string, Proveedor> {
|
|
220
|
+
return new DataLoader<string, Proveedor>(async (ids) => {
|
|
221
|
+
const proveedores = await db.proveedores.findMany({
|
|
222
|
+
where: { id: { in: ids as string[] } },
|
|
223
|
+
});
|
|
224
|
+
const map = new Map(proveedores.map((p) => [p.id, p]));
|
|
225
|
+
// DataLoader requiere que el orden de retorno coincida con el de ids
|
|
226
|
+
return ids.map((id) => map.get(id) ?? new Error(`Proveedor ${id} no encontrado`));
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Subscriptions — cuándo usar
|
|
232
|
+
```graphql
|
|
233
|
+
# Subscriptions SOLO para actualizaciones en tiempo real con cliente web persistente
|
|
234
|
+
# Si el cliente puede perder actualizaciones sin problema → polling cada N segundos
|
|
235
|
+
# Si el cliente DEBE recibir cada cambio → Subscription o WebSocket
|
|
236
|
+
|
|
237
|
+
type Subscription {
|
|
238
|
+
ordenActualizada(id: ID!): OrdenDeCompra!
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## gRPC — diseño de protobuf
|
|
243
|
+
|
|
244
|
+
```protobuf
|
|
245
|
+
// proto/ordenes/v1/ordenes.proto
|
|
246
|
+
syntax = "proto3";
|
|
247
|
+
|
|
248
|
+
package ordenes.v1;
|
|
249
|
+
|
|
250
|
+
import "google/protobuf/timestamp.proto";
|
|
251
|
+
|
|
252
|
+
service OrdenesService {
|
|
253
|
+
rpc CrearOrden(CrearOrdenRequest) returns (OrdenResponse);
|
|
254
|
+
rpc ObtenerOrden(ObtenerOrdenRequest) returns (OrdenResponse);
|
|
255
|
+
rpc ListarOrdenes(ListarOrdenesRequest) returns (stream OrdenResponse);
|
|
256
|
+
rpc SeguirEstatus(SeguirEstatusRequest) returns (stream EstatusUpdate);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
message CrearOrdenRequest {
|
|
260
|
+
string proveedor_id = 1;
|
|
261
|
+
repeated LineaProto lineas = 2;
|
|
262
|
+
string observaciones = 3;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
message OrdenResponse {
|
|
266
|
+
string id = 1;
|
|
267
|
+
string folio = 2;
|
|
268
|
+
string estatus = 3;
|
|
269
|
+
google.protobuf.Timestamp creada_en = 4;
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Interceptors para cross-cutting concerns
|
|
274
|
+
```typescript
|
|
275
|
+
// gRPC interceptor para auth y logging — aplicar a todos los handlers
|
|
276
|
+
import type { ServerInterceptingCall, Interceptor } from '@grpc/grpc-js';
|
|
277
|
+
|
|
278
|
+
export const authInterceptor: Interceptor = (options, nextCall) => {
|
|
279
|
+
return new ServerInterceptingCall(nextCall(options), {
|
|
280
|
+
start(metadata, listener, next) {
|
|
281
|
+
const token = metadata.get('authorization')[0] as string | undefined;
|
|
282
|
+
if (!token?.startsWith('Bearer ')) {
|
|
283
|
+
// retornar UNAUTHENTICATED
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
// validar token y añadir usuario al contexto
|
|
287
|
+
next(metadata, listener);
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## API Gateway — patrones de producción
|
|
294
|
+
|
|
295
|
+
### Rate limiting — niveles
|
|
296
|
+
```yaml
|
|
297
|
+
# Configuración conceptual — adaptar al gateway usado (Kong, nginx, Apigee)
|
|
298
|
+
rate_limits:
|
|
299
|
+
global: # toda la API
|
|
300
|
+
requests: 10000
|
|
301
|
+
window: 1m
|
|
302
|
+
por_usuario: # por token autenticado
|
|
303
|
+
requests: 100
|
|
304
|
+
window: 1m
|
|
305
|
+
por_endpoint: # endpoints sensibles
|
|
306
|
+
- path: /api/v1/auth/login
|
|
307
|
+
requests: 5
|
|
308
|
+
window: 1m
|
|
309
|
+
lockout_duration: 15m
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Circuit breaker
|
|
313
|
+
```
|
|
314
|
+
# Patrón: si >50% de requests fallan en 30s → abrir circuito
|
|
315
|
+
# Estado ABIERTO: rechazar requests inmediatamente (503)
|
|
316
|
+
# Después de 60s → SEMI-ABIERTO: probar 1 request
|
|
317
|
+
# Si exitoso → CERRADO; si falla → ABIERTO de nuevo
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## OpenAPI — spec-first workflow
|
|
321
|
+
|
|
322
|
+
```yaml
|
|
323
|
+
# openapi.yaml — estructura mínima correcta
|
|
324
|
+
openapi: "3.1.0"
|
|
325
|
+
info:
|
|
326
|
+
title: API de Órdenes de Compra
|
|
327
|
+
version: "1.0.0"
|
|
328
|
+
description: |
|
|
329
|
+
API REST para gestión de órdenes de compra.
|
|
330
|
+
## Autenticación
|
|
331
|
+
Todos los endpoints requieren Bearer token JWT en el header Authorization.
|
|
332
|
+
|
|
333
|
+
servers:
|
|
334
|
+
- url: https://api.ejemplo.com/v1
|
|
335
|
+
description: Producción
|
|
336
|
+
- url: http://localhost:8000/api/v1
|
|
337
|
+
description: Desarrollo local
|
|
338
|
+
|
|
339
|
+
components:
|
|
340
|
+
securitySchemes:
|
|
341
|
+
BearerAuth:
|
|
342
|
+
type: http
|
|
343
|
+
scheme: bearer
|
|
344
|
+
bearerFormat: JWT
|
|
345
|
+
|
|
346
|
+
schemas:
|
|
347
|
+
OrdenDeCompra:
|
|
348
|
+
type: object
|
|
349
|
+
required: [id, folio, estatus]
|
|
350
|
+
properties:
|
|
351
|
+
id:
|
|
352
|
+
type: string
|
|
353
|
+
format: uuid
|
|
354
|
+
folio:
|
|
355
|
+
type: string
|
|
356
|
+
pattern: "^OC-[0-9]{6}$"
|
|
357
|
+
estatus:
|
|
358
|
+
type: string
|
|
359
|
+
enum: [BORRADOR, PENDIENTE, APROBADA, RECHAZADA, CANCELADA]
|
|
360
|
+
|
|
361
|
+
ErrorResponse:
|
|
362
|
+
type: object
|
|
363
|
+
required: [code, message]
|
|
364
|
+
properties:
|
|
365
|
+
code:
|
|
366
|
+
type: string
|
|
367
|
+
message:
|
|
368
|
+
type: string
|
|
369
|
+
fields:
|
|
370
|
+
type: object
|
|
371
|
+
additionalProperties:
|
|
372
|
+
type: array
|
|
373
|
+
items:
|
|
374
|
+
type: string
|
|
375
|
+
|
|
376
|
+
security:
|
|
377
|
+
- BearerAuth: []
|
|
378
|
+
|
|
379
|
+
paths:
|
|
380
|
+
/ordenes-de-compra:
|
|
381
|
+
get:
|
|
382
|
+
summary: Listar órdenes
|
|
383
|
+
operationId: listarOrdenes
|
|
384
|
+
parameters:
|
|
385
|
+
- name: page
|
|
386
|
+
in: query
|
|
387
|
+
schema: { type: integer, default: 1 }
|
|
388
|
+
- name: page_size
|
|
389
|
+
in: query
|
|
390
|
+
schema: { type: integer, default: 20, maximum: 100 }
|
|
391
|
+
responses:
|
|
392
|
+
"200":
|
|
393
|
+
description: Lista paginada
|
|
394
|
+
content:
|
|
395
|
+
application/json:
|
|
396
|
+
schema:
|
|
397
|
+
$ref: "#/components/schemas/PaginatedOrdenes"
|
|
398
|
+
"401":
|
|
399
|
+
$ref: "#/components/responses/Unauthorized"
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
## Testing de APIs
|
|
403
|
+
|
|
404
|
+
### Contract testing con Pact
|
|
405
|
+
```
|
|
406
|
+
# Flujo:
|
|
407
|
+
# 1. Consumer define el contrato (qué espera del API)
|
|
408
|
+
# 2. Provider verifica que cumple el contrato
|
|
409
|
+
# 3. Pact broker almacena los contratos
|
|
410
|
+
# Beneficio: detecta breaking changes antes del deploy
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Load testing con k6
|
|
414
|
+
```javascript
|
|
415
|
+
// k6/ordenes-test.js
|
|
416
|
+
import http from 'k6/http';
|
|
417
|
+
import { check, sleep } from 'k6';
|
|
418
|
+
|
|
419
|
+
export const options = {
|
|
420
|
+
stages: [
|
|
421
|
+
{ duration: '30s', target: 10 }, // ramp up
|
|
422
|
+
{ duration: '1m', target: 100 }, // carga sostenida
|
|
423
|
+
{ duration: '30s', target: 0 }, // ramp down
|
|
424
|
+
],
|
|
425
|
+
thresholds: {
|
|
426
|
+
http_req_duration: ['p(95)<500'], // 95% de requests < 500ms
|
|
427
|
+
http_req_failed: ['rate<0.01'], // menos de 1% de errores
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
export default function () {
|
|
432
|
+
const res = http.get('https://api.ejemplo.com/v1/ordenes-de-compra', {
|
|
433
|
+
headers: { Authorization: `Bearer ${__ENV.API_TOKEN}` },
|
|
434
|
+
});
|
|
435
|
+
check(res, {
|
|
436
|
+
'status 200': (r) => r.status === 200,
|
|
437
|
+
'tiene items': (r) => r.json('items') !== undefined,
|
|
438
|
+
});
|
|
439
|
+
sleep(1);
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
## Reglas de diseño obligatorias
|
|
444
|
+
|
|
445
|
+
- **Versionado desde el inicio** — nunca `/api/recurso` sin versión
|
|
446
|
+
- **Errors siempre con `code` y `message`** — el `code` es una string legible para máquinas
|
|
447
|
+
- **Location header** en toda respuesta 201 Created
|
|
448
|
+
- **Idempotency-Key** en mutations costosas o con side effects
|
|
449
|
+
- **Deprecation headers** antes de eliminar un endpoint: `Deprecation: true; Sunset: <fecha>`
|
|
450
|
+
- **Nunca breaking changes** en una versión publicada — crear versión nueva
|
|
451
|
+
- **Rate limit headers siempre**: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `Retry-After`
|
|
452
|
+
- **DRY obligatorio** — antes de crear una función, clase o query nueva, buscar si ya existe algo equivalente con `Grep`. Si existe, reutilizar o extender — no duplicar. Aplica especialmente a: queries de repositorio, validaciones de input, transformaciones de datos y constantes.
|
|
453
|
+
- **Si detectas duplicación** de lógica existente al implementar, extraer a un módulo compartido antes de continuar. No dejar la duplicación "para después".
|
|
454
|
+
|
|
455
|
+
## Gotchas / Errores comunes no obvios
|
|
456
|
+
|
|
457
|
+
**Endpoint sin versionado `/v{N}/` desde el inicio**: la primera versión se publica como `/api/usuarios` sin prefijo de versión. Causa: "versionar después" parece fácil. Solución: agregar versión después es imposible sin romper clientes existentes — el versionado va desde el primer endpoint, sin excepción.
|
|
458
|
+
|
|
459
|
+
**201 Created sin `Location` header**: el endpoint crea un recurso y retorna 201 pero sin indicar la URL del recurso creado. Causa: el header parece opcional. Solución: el `Location` header es obligatorio en toda respuesta 201 — el cliente necesita saber dónde está el recurso que acaba de crear.
|
|
460
|
+
|
|
461
|
+
**Breaking change en versión publicada sin nueva versión**: se modifica el schema de respuesta de `/v1/pedidos` cambiando un campo. Causa: "es solo un rename, los clientes se adaptan". Solución: NUNCA cambios incompatibles en una versión publicada — crear `/v2/pedidos`; mantener `/v1/` activa con período de deprecación mínimo de 6 meses.
|
|
462
|
+
|
|
463
|
+
**REST cuando el cliente necesita streaming**: el diseño usa polling cada 5 segundos para un feed de eventos en tiempo real. Causa: REST es el default y streaming parece complejo. Solución: verificar el patrón de acceso del cliente antes de elegir el paradigma — SSE o WebSockets para streams, REST para recursos.
|
|
464
|
+
|
|
465
|
+
## Señales de parar y reportar
|
|
466
|
+
|
|
467
|
+
- El cliente necesita un paradigma diferente al diseñado (ej: pensaron en REST pero necesitan streaming)
|
|
468
|
+
- Los contratos existentes requieren breaking changes sin nueva versión planeada
|
|
469
|
+
- El API Gateway no soporta el pattern de rate limiting requerido
|
|
470
|
+
- El schema GraphQL tiene N+1 no resoluble con DataLoader en el tiempo estimado
|