@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,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: redis-experto
|
|
3
|
+
description: >
|
|
4
|
+
Redis: caching patterns (cache-aside, write-through), data structures, pub/sub
|
|
5
|
+
vs streams, rate limiting, distributed locks con Redlock y pipelining. Cargar
|
|
6
|
+
cuando se implemente caching, rate limiting o comunicación en tiempo real.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
herramientasPermitidas: [Read, Write]
|
|
9
|
+
evolvable: true # default para skill estandar
|
|
10
|
+
exclusiones:
|
|
11
|
+
- "No cargar para mensajería async entre microservicios con garantías de durabilidad y reintentos — para colas duraderas con dead letter queue usar `kafka-experto` o SQS/Service Bus."
|
|
12
|
+
- "No cargar para almacenamiento de sesiones distribuidas en aplicaciones Angular/Next.js — para manejo de sesiones en el frontend el estado vive en el cliente; Redis aplica al backend."
|
|
13
|
+
- "No cargar para caché de assets estáticos o CDN — para caché de archivos estáticos usar CloudFront, Nginx o similar; Redis es para datos de aplicación."
|
|
14
|
+
- "No cargar para búsqueda de texto completo — Redis tiene módulos de búsqueda (RediSearch) pero para full-text search general cargar `postgresql-experto` con `tsvector` o usar Elasticsearch."
|
|
15
|
+
---
|
|
16
|
+
# Redis Experto — Caching, Estructuras y Tiempo Real
|
|
17
|
+
|
|
18
|
+
## Cuándo NO cargar
|
|
19
|
+
|
|
20
|
+
- La tarea es cola de mensajes con garantías de durabilidad fuerte y DLQ: usar Kafka, SQS o Azure Service Bus.
|
|
21
|
+
- La tarea es caché de assets estáticos o CDN: usar CloudFront, Nginx o un CDN dedicado.
|
|
22
|
+
- La tarea es full-text search: cargar `postgresql-experto` (tsvector) o Elasticsearch.
|
|
23
|
+
- La tarea es base de datos primaria de documentos: Redis no reemplaza a MongoDB o PostgreSQL.
|
|
24
|
+
|
|
25
|
+
Redis es una estructura de datos en memoria con persistencia. Su velocidad lo
|
|
26
|
+
hace ideal para caching, rate limiting, colas ligeras y pub/sub. Este skill
|
|
27
|
+
cubre los patrones de caching, las estructuras de datos correctas para cada
|
|
28
|
+
caso, y las operaciones atómicas con Lua para garantizar consistencia.
|
|
29
|
+
|
|
30
|
+
## Cuándo cargar este skill
|
|
31
|
+
|
|
32
|
+
Invoca `Skill("redis-experto")` cuando:
|
|
33
|
+
|
|
34
|
+
- Se implemente caching con estrategia cache-aside o write-through
|
|
35
|
+
- Se diseñe rate limiting para endpoints o usuarios
|
|
36
|
+
- Se implemente distributed lock para evitar race conditions
|
|
37
|
+
- Se use pub/sub o Streams para mensajeria
|
|
38
|
+
- Se diseñan claves con TTL y namespacing
|
|
39
|
+
- Se configure connection pooling o Redis Cluster
|
|
40
|
+
|
|
41
|
+
## Conceptos clave
|
|
42
|
+
|
|
43
|
+
### Tres estrategias de caching
|
|
44
|
+
|
|
45
|
+
Cache-aside (lazy loading): la aplicación lee cache primero; si no existe, lee
|
|
46
|
+
la BD y llena el cache. Write-through: al escribir en BD, también se escribe
|
|
47
|
+
en cache. Write-behind: se escribe en cache primero, la BD se actualiza
|
|
48
|
+
asincrónamente. Cache-aside es el patrón más común y seguro.
|
|
49
|
+
|
|
50
|
+
### Atomicidad con Lua scripts
|
|
51
|
+
|
|
52
|
+
Redis es single-threaded para comandos. Un script Lua se ejecuta atómicamente:
|
|
53
|
+
ningún otro comando puede interferir entre las instrucciones del script. Usar
|
|
54
|
+
para operaciones que requieren "leer y escribir" sin race conditions.
|
|
55
|
+
|
|
56
|
+
### Pub/Sub vs Streams
|
|
57
|
+
|
|
58
|
+
Pub/Sub es fire-and-forget: si un consumidor está desconectado, pierde mensajes.
|
|
59
|
+
Streams (XADD/XREAD) persisten mensajes, soportan consumer groups y permiten
|
|
60
|
+
replay. Usar Streams para eventos importantes; Pub/Sub para notificaciones efímeras.
|
|
61
|
+
|
|
62
|
+
## Reglas obligatorias
|
|
63
|
+
|
|
64
|
+
### SIEMPRE definir TTL al crear claves — nunca claves permanentes en produccion
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// MAL — clave sin TTL que vive para siempre
|
|
68
|
+
await redis.set(`usuario:${id}`, JSON.stringify(usuario));
|
|
69
|
+
|
|
70
|
+
// BIEN — TTL explicito segun la naturaleza del dato
|
|
71
|
+
await redis.setex(`usuario:${id}`, 3600, JSON.stringify(usuario)); // 1 hora
|
|
72
|
+
// O con la API moderna:
|
|
73
|
+
await redis.set(`usuario:${id}`, JSON.stringify(usuario), { EX: 3600 });
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Por qué**: Claves sin TTL consumen memoria indefinidamente. En producción,
|
|
77
|
+
la memoria de Redis es limitada y cara.
|
|
78
|
+
|
|
79
|
+
### Namespacing obligatorio en todas las claves
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// MAL — colisión entre ambientes y módulos
|
|
83
|
+
await redis.set('usuario:123', data);
|
|
84
|
+
await redis.set('sesion:abc', token);
|
|
85
|
+
|
|
86
|
+
// BIEN — prefijo de ambiente y modulo
|
|
87
|
+
const PREFIJO = `${process.env.NODE_ENV}:miapp`;
|
|
88
|
+
await redis.set(`${PREFIJO}:usuario:123`, data, { EX: 3600 });
|
|
89
|
+
await redis.set(`${PREFIJO}:sesion:abc`, token, { EX: 86400 });
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### NUNCA usar KEYS * en produccion
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# MAL — bloquea Redis mientras escanea toda la keyspace
|
|
96
|
+
KEYS usuario:*
|
|
97
|
+
|
|
98
|
+
# BIEN — SCAN con cursor, no bloquea
|
|
99
|
+
SCAN 0 MATCH usuario:* COUNT 100
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
En código:
|
|
103
|
+
```typescript
|
|
104
|
+
// Usar scan iterativo, nunca keys()
|
|
105
|
+
for await (const key of redis.scanIterator({ MATCH: 'prod:usuario:*', COUNT: 100 })) {
|
|
106
|
+
// procesar key
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Distributed Lock con TTL de seguridad — NUNCA lock sin expiracion
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// MAL — lock sin TTL, si el proceso muere queda bloqueado para siempre
|
|
114
|
+
await redis.set('lock:proceso-critico', '1');
|
|
115
|
+
|
|
116
|
+
// BIEN — lock con TTL (NX = solo si no existe, EX = TTL en segundos)
|
|
117
|
+
const adquirido = await redis.set(
|
|
118
|
+
'lock:proceso-critico',
|
|
119
|
+
tokenUnico, // valor único para verificar propiedad al liberar
|
|
120
|
+
{ NX: true, EX: 30 } // TTL de 30s como safety net
|
|
121
|
+
);
|
|
122
|
+
if (!adquirido) throw new Error('No se pudo adquirir el lock');
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Patrones recomendados
|
|
126
|
+
|
|
127
|
+
### Cache-aside con helper tipado
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
class CacheService {
|
|
131
|
+
constructor(private readonly redis: Redis) {}
|
|
132
|
+
|
|
133
|
+
async obtenerOCargar<T>(
|
|
134
|
+
clave: string,
|
|
135
|
+
ttlSegundos: number,
|
|
136
|
+
cargador: () => Promise<T>,
|
|
137
|
+
): Promise<T> {
|
|
138
|
+
const cached = await this.redis.get(clave);
|
|
139
|
+
if (cached) return JSON.parse(cached) as T;
|
|
140
|
+
|
|
141
|
+
const valor = await cargador();
|
|
142
|
+
await this.redis.setex(clave, ttlSegundos, JSON.stringify(valor));
|
|
143
|
+
return valor;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async invalidar(patron: string): Promise<void> {
|
|
147
|
+
for await (const clave of this.redis.scanIterator({ MATCH: patron })) {
|
|
148
|
+
await this.redis.del(clave);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Uso
|
|
154
|
+
const producto = await cache.obtenerOCargar(
|
|
155
|
+
`prod:producto:${id}`,
|
|
156
|
+
3600,
|
|
157
|
+
() => db.producto.findUnique({ where: { id } }),
|
|
158
|
+
);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Rate limiting con Sorted Sets (sliding window)
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
async function verificarRateLimit(
|
|
165
|
+
usuarioId: string,
|
|
166
|
+
limite: number,
|
|
167
|
+
ventanaMs: number,
|
|
168
|
+
): Promise<{ permitido: boolean; restantes: number }> {
|
|
169
|
+
const clave = `prod:ratelimit:${usuarioId}`;
|
|
170
|
+
const ahora = Date.now();
|
|
171
|
+
const ventanaInicio = ahora - ventanaMs;
|
|
172
|
+
|
|
173
|
+
const [, , conteo] = await redis
|
|
174
|
+
.multi()
|
|
175
|
+
.zremrangebyscore(clave, 0, ventanaInicio) // limpiar entradas viejas
|
|
176
|
+
.zadd(clave, { score: ahora, value: `${ahora}-${Math.random()}` })
|
|
177
|
+
.zcard(clave)
|
|
178
|
+
.expire(clave, Math.ceil(ventanaMs / 1000))
|
|
179
|
+
.exec();
|
|
180
|
+
|
|
181
|
+
const permitido = (conteo as number) <= limite;
|
|
182
|
+
return { permitido, restantes: Math.max(0, limite - (conteo as number)) };
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Lua script para operación atómica
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
// Decrementar stock solo si hay suficiente — atomico
|
|
190
|
+
const luaDecrementarStock = `
|
|
191
|
+
local stock = tonumber(redis.call('GET', KEYS[1]))
|
|
192
|
+
if stock == nil then return -1 end
|
|
193
|
+
if stock < tonumber(ARGV[1]) then return -2 end
|
|
194
|
+
return redis.call('DECRBY', KEYS[1], ARGV[1])
|
|
195
|
+
`;
|
|
196
|
+
|
|
197
|
+
const resultado = await redis.eval(luaDecrementarStock, {
|
|
198
|
+
keys: [`prod:stock:${productoId}`],
|
|
199
|
+
arguments: [cantidad.toString()],
|
|
200
|
+
});
|
|
201
|
+
// -1: clave no existe, -2: stock insuficiente, >=0: nuevo valor
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Streams para cola de eventos con consumer groups
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
// Productor: agregar evento al stream
|
|
208
|
+
await redis.xadd('prod:eventos:pedidos', '*', {
|
|
209
|
+
pedidoId: pedido.id,
|
|
210
|
+
tipo: 'CREADO',
|
|
211
|
+
datos: JSON.stringify(pedido),
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Consumidor con consumer group (tolerante a fallos)
|
|
215
|
+
await redis.xgroupCreate('prod:eventos:pedidos', 'procesadores', '0', { MKSTREAM: true });
|
|
216
|
+
|
|
217
|
+
while (true) {
|
|
218
|
+
const mensajes = await redis.xreadgroup(
|
|
219
|
+
'procesadores', 'worker-1',
|
|
220
|
+
[{ key: 'prod:eventos:pedidos', id: '>' }],
|
|
221
|
+
{ COUNT: 10, BLOCK: 2000 }
|
|
222
|
+
);
|
|
223
|
+
for (const { id, message } of mensajes?.[0]?.messages ?? []) {
|
|
224
|
+
await procesarEvento(message);
|
|
225
|
+
await redis.xack('prod:eventos:pedidos', 'procesadores', id);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Pipelining para operaciones masivas
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
// MAL — round trip por cada operación
|
|
234
|
+
for (const id of ids) {
|
|
235
|
+
await redis.get(`prod:usuario:${id}`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// BIEN — pipeline envia todo de una vez
|
|
239
|
+
const pipeline = redis.multi();
|
|
240
|
+
for (const id of ids) {
|
|
241
|
+
pipeline.get(`prod:usuario:${id}`);
|
|
242
|
+
}
|
|
243
|
+
const resultados = await pipeline.exec();
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Anti-patrones conocidos
|
|
247
|
+
|
|
248
|
+
### Single Point of Failure — usar Redis Sentinel o Cluster en producción
|
|
249
|
+
|
|
250
|
+
Un único nodo Redis que falla detiene la aplicación si no hay fallback.
|
|
251
|
+
Configurar Redis Sentinel para alta disponibilidad o Redis Cluster para
|
|
252
|
+
escalabilidad horizontal.
|
|
253
|
+
|
|
254
|
+
### Cache sin invalidacion al mutar datos
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
// MAL — actualiza la BD pero no invalida el cache
|
|
258
|
+
await db.producto.update({ where: { id }, data: { precio } });
|
|
259
|
+
// El cache sigue devolviendo el precio viejo
|
|
260
|
+
|
|
261
|
+
// BIEN — invalidar el cache inmediatamente después de la mutación
|
|
262
|
+
await db.producto.update({ where: { id }, data: { precio } });
|
|
263
|
+
await redis.del(`prod:producto:${id}`);
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Hash grandes con HGETALL completo
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// MAL — carga todo el hash aunque solo se necesite un campo
|
|
270
|
+
const datos = await redis.hgetall(`prod:usuario:${id}`);
|
|
271
|
+
const nombre = datos.nombre;
|
|
272
|
+
|
|
273
|
+
// BIEN — obtener solo el campo necesario
|
|
274
|
+
const nombre = await redis.hget(`prod:usuario:${id}`, 'nombre');
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Checklist de verificación
|
|
278
|
+
|
|
279
|
+
- [ ] Todas las claves tienen TTL definido explícitamente
|
|
280
|
+
- [ ] Namespacing con prefijo de ambiente en todas las claves
|
|
281
|
+
- [ ] Sin KEYS * — usar SCAN con cursor
|
|
282
|
+
- [ ] Distributed locks con TTL de seguridad y valor único para verificar propiedad
|
|
283
|
+
- [ ] Operaciones "leer-modificar-escribir" con Lua script o transacciones MULTI/EXEC
|
|
284
|
+
- [ ] Pipelining para operaciones masivas
|
|
285
|
+
- [ ] Redis Sentinel o Cluster configurado en producción
|
|
286
|
+
|
|
287
|
+
## Referencias
|
|
288
|
+
|
|
289
|
+
- [Redis Commands](https://redis.io/docs/latest/commands/)
|
|
290
|
+
- [Redis Patterns](https://redis.io/docs/latest/develop/use/patterns/)
|
|
291
|
+
- [node-redis](https://github.com/redis/node-redis)
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Gotchas / Errores comunes no obvios
|
|
296
|
+
|
|
297
|
+
**`redis.del(key)` en Node.js `node-redis` v4 no lanza error si la clave no existe — devuelve `0` en lugar de fallar, causando que la invalidación de caché silencie errores de lógica**: un servicio que llama `await redis.del("prod:usuario:123")` después de una mutación asume que la clave existía, pero si la clave ya había expirado o nunca se creó (por un bug en write-through), el `0` pasa desapercibido y el código continúa sin invalidar nada en realidad. Causa: `DEL` en Redis devuelve el número de claves eliminadas; la API de node-redis expone ese número, no un error. Fix: cuando la invalidación es crítica, usar `EXISTS` antes del `DEL` o verificar que el retorno sea `> 0`. Para caché convencional cache-aside, el `0` es aceptable (la clave ya expiró), pero documentar explícitamente la decisión.
|
|
298
|
+
|
|
299
|
+
**El patrón Redlock con 3 nodos falla en escenarios de split-brain cuando los nodos Redis están en diferentes zonas de disponibilidad con latencia asimétrica**: si el cliente adquiere el lock en 2 de 3 nodos (mayoría), pero el tercer nodo reaparece antes de que expire el TTL del lock, otro cliente puede adquirir el lock en ese nodo tardío y los dos primeros, creando dos titulares del lock simultáneamente. Causa: Redlock asume relojes sincronizados y latencia simétrica entre nodos; en producción cloud con múltiples AZs ambas suposiciones son aproximadas. Fix: usar TTLs de lock generosos (10-30s para operaciones rápidas) y diseñar el trabajo protegido por el lock para ser idempotente — si dos workers ejecutan simultáneamente, el sistema debe tolerarlo o detectarlo y revertir.
|
|
300
|
+
|
|
301
|
+
**`redis.xreadgroup` con `BLOCK: 2000` bloquea la conexión del pool durante 2 segundos y agota el pool si hay más consumidores concurrentes que conexiones disponibles**: con un pool de 10 conexiones y 8 workers de Streams que bloquean durante 2s esperando mensajes, los requests de la API que llegan durante ese tiempo no encuentran conexiones disponibles y fallan. Causa: las operaciones bloqueantes de Redis (BLPOP, BRPOP, XREAD con BLOCK) mantienen una conexión del pool ocupada durante el período de bloqueo. Fix: usar un pool de conexiones separado exclusivamente para los consumers de Streams, independiente del pool de la API. Configurar el pool de Streams con `max: N_workers + buffer`, donde buffer = 20% para tolerancia.
|
|
302
|
+
|
|
303
|
+
**`KEYS *` en producción con 1M+ claves congela Redis durante varios segundos porque es una operación O(N) que bloquea el event loop de Redis**: un script de diagnóstico que ejecuta `await redis.keys("prod:session:*")` para contar sesiones activas hace que todas las operaciones del servidor queden en cola durante 3-8 segundos. Causa: Redis es single-threaded para comandos; `KEYS` escanea todo el keyspace sin pausas. Fix: usar siempre `SCAN` con cursor: `for await (const key of redis.scanIterator({ MATCH: "prod:session:*", COUNT: 100 }))` — procesa lotes de 100 claves, cediendo el event loop entre lotes.
|
|
304
|
+
|
|
305
|
+
*Skill creado con swl:crear-skill el 2026-03-31. Versión 1.0.0.*
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-semver
|
|
3
|
+
description: Versionado semántico (SemVer). Cuándo bumpar major/minor/patch, changelogs convencionales, estrategia de tags y proceso de release completo.
|
|
4
|
+
version: "1.0.1"
|
|
5
|
+
herramientasPermitidas: [Read, Bash]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para versionar el sistema SWL — el bump de versión de swl-ses sigue el checklist de 15 ubicaciones documentado en `/swl:release`; este skill cubre SemVer general para proyectos de usuario, no el proceso interno de release del sistema."
|
|
8
|
+
- "No cargar para decidir el tipo de commit individual (feat/fix/refactor) — el mensaje de commit se elige al hacer commit; este skill se carga cuando se necesita decidir el número de versión del release o crear el proceso completo de release."
|
|
9
|
+
- "No cargar para proyectos internos sin versionado público ni consumidores externos — si no hay consumidores del paquete que dependen de compatibilidad, la disciplina SemVer completa puede ser excesiva; usar `git-workflow.md` para el flujo de commits."
|
|
10
|
+
- "No cargar si el proceso de release ya está automatizado en CI con `semantic-release` — en ese caso el número de versión se calcula automáticamente desde los commits y cargar este skill solo agrega duplicación."
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
---
|
|
13
|
+
# Versionado Semántico (SemVer)
|
|
14
|
+
|
|
15
|
+
## Principio fundamental
|
|
16
|
+
|
|
17
|
+
Un número de versión tiene la forma `MAJOR.MINOR.PATCH` (ej. `2.4.1`). Cada segmento comunica
|
|
18
|
+
intención de compatibilidad a los consumidores del paquete o servicio.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Cuándo bumpar cada segmento
|
|
23
|
+
|
|
24
|
+
### PATCH — arreglos compatibles hacia atrás
|
|
25
|
+
|
|
26
|
+
Incrementa PATCH cuando:
|
|
27
|
+
- Se corrige un bug sin cambiar la interfaz pública.
|
|
28
|
+
- Se corrige documentación o typos en código que afectan comportamiento.
|
|
29
|
+
- Se mejoran mensajes de error sin cambiar el tipo de excepción.
|
|
30
|
+
- Se actualizan dependencias de parche (`requests 2.31.0 → 2.31.1`).
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
1.4.2 → 1.4.3 # fix: corrige cálculo incorrecto en factura
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### MINOR — funcionalidad nueva compatible hacia atrás
|
|
37
|
+
|
|
38
|
+
Incrementa MINOR cuando:
|
|
39
|
+
- Se agrega un endpoint, método o parámetro opcional nuevo.
|
|
40
|
+
- Se agrega una funcionalidad que los consumidores pueden ignorar.
|
|
41
|
+
- Se depreca algo (pero aún funciona).
|
|
42
|
+
- Se actualiza una dependencia minor que agrega capacidades.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
1.4.3 → 1.5.0 # feat: agrega exportación a PDF
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Al subir MINOR, el PATCH siempre regresa a 0.
|
|
49
|
+
|
|
50
|
+
### MAJOR — cambios incompatibles hacia atrás (breaking changes)
|
|
51
|
+
|
|
52
|
+
Incrementa MAJOR cuando:
|
|
53
|
+
- Se elimina un endpoint, método o campo.
|
|
54
|
+
- Se cambia el tipo o contrato de un parámetro existente.
|
|
55
|
+
- Se cambia el comportamiento esperado de forma que rompe integraciones existentes.
|
|
56
|
+
- Se cambia la autenticación/autorización de forma incompatible.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
1.5.0 → 2.0.0 # feat!: migra autenticación de JWT a OAuth2
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Al subir MAJOR, MINOR y PATCH regresan a 0.
|
|
63
|
+
|
|
64
|
+
### Versión 0.x.y — desarrollo inicial
|
|
65
|
+
|
|
66
|
+
Mientras la versión MAJOR sea `0`, la API se considera inestable. Cualquier MINOR puede
|
|
67
|
+
contener breaking changes. Cuando el software está listo para producción, se lanza `1.0.0`.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Commits Convencionales
|
|
72
|
+
|
|
73
|
+
Los commits convencionales generan el changelog automáticamente y determinan el bump.
|
|
74
|
+
|
|
75
|
+
### Formato
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
<tipo>[scope opcional][! para breaking]: <descripción corta>
|
|
79
|
+
|
|
80
|
+
[cuerpo opcional]
|
|
81
|
+
|
|
82
|
+
[footer opcional: BREAKING CHANGE: descripción]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Tipos y su impacto en versión
|
|
86
|
+
|
|
87
|
+
| Tipo | Impacto versión | Descripción |
|
|
88
|
+
|------------|----------------|--------------------------------------------------|
|
|
89
|
+
| `fix` | PATCH | Corrección de bug |
|
|
90
|
+
| `feat` | MINOR | Nueva funcionalidad |
|
|
91
|
+
| `feat!` | MAJOR | Nueva funcionalidad con breaking change |
|
|
92
|
+
| `fix!` | MAJOR | Fix con breaking change |
|
|
93
|
+
| `refactor` | ninguno | Refactorización sin cambio de comportamiento |
|
|
94
|
+
| `chore` | ninguno | Tareas de mantenimiento (CI, deps, config) |
|
|
95
|
+
| `docs` | ninguno | Documentación únicamente |
|
|
96
|
+
| `test` | ninguno | Agregar o corregir tests |
|
|
97
|
+
| `perf` | PATCH | Mejora de rendimiento sin cambio de interfaz |
|
|
98
|
+
| `ci` | ninguno | Cambios en pipelines de CI/CD |
|
|
99
|
+
| `style` | ninguno | Formato, espacios, punto y coma (sin lógica) |
|
|
100
|
+
|
|
101
|
+
### Ejemplos de commits bien escritos
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
git commit -m "fix(auth): corrige expiración incorrecta de tokens de refresco"
|
|
105
|
+
git commit -m "feat(reportes): agrega exportación a Excel con formato condicional"
|
|
106
|
+
git commit -m "feat(api)!: cambia paginación de offset a cursor
|
|
107
|
+
|
|
108
|
+
BREAKING CHANGE: el parámetro 'page' fue reemplazado por 'cursor'.
|
|
109
|
+
Los clientes deben actualizar sus integraciones."
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Proceso de release
|
|
115
|
+
|
|
116
|
+
### Paso 1 — Preparar la rama de release
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# En main, crear rama release
|
|
120
|
+
git checkout -b release/2.1.0
|
|
121
|
+
|
|
122
|
+
# Actualizar versión en archivos del proyecto
|
|
123
|
+
# Python: pyproject.toml, __version__
|
|
124
|
+
# Node: package.json
|
|
125
|
+
# Java: pom.xml o build.gradle
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Paso 2 — Generar CHANGELOG
|
|
129
|
+
|
|
130
|
+
Usar `conventional-changelog` o `git-cliff` para generar el changelog automáticamente:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Con git-cliff (recomendado)
|
|
134
|
+
git cliff --tag v2.1.0 --output CHANGELOG.md
|
|
135
|
+
|
|
136
|
+
# Con conventional-changelog
|
|
137
|
+
npx conventional-changelog -p conventionalcommits -i CHANGELOG.md -s
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Estructura esperada del CHANGELOG:
|
|
141
|
+
|
|
142
|
+
```markdown
|
|
143
|
+
## [2.1.0] - 2026-03-25
|
|
144
|
+
|
|
145
|
+
### Nuevas funcionalidades
|
|
146
|
+
- feat(reportes): agrega exportación a Excel (#234)
|
|
147
|
+
- feat(usuarios): agrega campo de foto de perfil (#241)
|
|
148
|
+
|
|
149
|
+
### Correcciones
|
|
150
|
+
- fix(auth): corrige expiración incorrecta de tokens (#238)
|
|
151
|
+
- fix(factura): redondeo incorrecto en descuentos (#240)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Paso 3 — Commit de versión y tag
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Commit del bump de versión
|
|
158
|
+
git add pyproject.toml CHANGELOG.md
|
|
159
|
+
git commit -m "chore(release): v2.1.0"
|
|
160
|
+
|
|
161
|
+
# Crear tag anotado (no ligero)
|
|
162
|
+
git tag -a v2.1.0 -m "Release v2.1.0"
|
|
163
|
+
|
|
164
|
+
# Subir rama y tag
|
|
165
|
+
git push origin release/2.1.0
|
|
166
|
+
git push origin v2.1.0
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Paso 4 — Merge a main y develop
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
git checkout main
|
|
173
|
+
git merge --no-ff release/2.1.0
|
|
174
|
+
git push origin main
|
|
175
|
+
|
|
176
|
+
git checkout develop
|
|
177
|
+
git merge --no-ff release/2.1.0
|
|
178
|
+
git push origin develop
|
|
179
|
+
|
|
180
|
+
git branch -d release/2.1.0
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Estrategia de tags
|
|
186
|
+
|
|
187
|
+
### Tags anotados vs. ligeros
|
|
188
|
+
|
|
189
|
+
Siempre usar **tags anotados** (`git tag -a`) para releases. Los tags ligeros son solo para
|
|
190
|
+
marcado temporal interno. Los tags anotados incluyen autor, fecha y mensaje — esto es esencial
|
|
191
|
+
para `git describe` y herramientas de release.
|
|
192
|
+
|
|
193
|
+
### Convención de nombres
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
v{MAJOR}.{MINOR}.{PATCH} # release estable: v2.1.0
|
|
197
|
+
v{MAJOR}.{MINOR}.{PATCH}-rc.{N} # release candidate: v2.1.0-rc.1
|
|
198
|
+
v{MAJOR}.{MINOR}.{PATCH}-beta.{N} # beta pública: v2.1.0-beta.2
|
|
199
|
+
v{MAJOR}.{MINOR}.{PATCH}-alpha.{N} # alpha interna: v2.1.0-alpha.1
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Listar y filtrar tags
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
git tag --sort=-v:refname # Lista tags en orden semver descendente
|
|
206
|
+
git tag -l "v2.*" # Solo tags de la serie 2.x
|
|
207
|
+
git describe --tags --abbrev=0 # Último tag del commit actual
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Herramientas recomendadas
|
|
213
|
+
|
|
214
|
+
| Herramienta | Uso |
|
|
215
|
+
|------------------------|----------------------------------------------|
|
|
216
|
+
| `git-cliff` | Generación de CHANGELOG desde commits |
|
|
217
|
+
| `commitizen` | Wizard interactivo para commits convencionales |
|
|
218
|
+
| `semantic-release` | Release automatizado desde CI |
|
|
219
|
+
| `bump2version` | Bump de versión en archivos Python |
|
|
220
|
+
| `conventional-commits` | Spec oficial de commits convencionales |
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Anti-patrones a evitar
|
|
225
|
+
|
|
226
|
+
- **Nunca reutilizar un tag**: Si el release `v2.1.0` se publicó, no se puede mover ese tag.
|
|
227
|
+
Si hay un error, publicar `v2.1.1`.
|
|
228
|
+
- **Nunca usar tags ligeros en releases**: No aportan metadata y dificultan trazabilidad.
|
|
229
|
+
- **Nunca saltarse MAJOR por miedo**: Si hay breaking change, es MAJOR. Ocultarlo como MINOR
|
|
230
|
+
rompe la confianza de los consumidores.
|
|
231
|
+
- **No mezclar tipos de commit en uno solo**: Un commit = un cambio lógico = un tipo.
|
|
232
|
+
- **No escribir changelogs manuales sin estructura**: Usar el formato estándar para que las
|
|
233
|
+
herramientas puedan procesarlos.
|
|
234
|
+
|
|
235
|
+
## Cuándo NO cargar
|
|
236
|
+
|
|
237
|
+
- Se versiona el sistema SWL propio — ese proceso usa el checklist de 15 ubicaciones de `/swl:release`; este skill cubre SemVer general para proyectos de aplicación, no el flujo interno del sistema.
|
|
238
|
+
- Se elige el tipo de commit para un cambio individual — el tipo (`feat`, `fix`, `refactor`) se decide al redactar el mensaje del commit; cargar este skill es excesivo para esa decisión puntual.
|
|
239
|
+
- `semantic-release` ya está configurado en CI — si el release está automatizado, el número de versión se calcula desde los commits sin intervención manual; cargar este skill duplicaría el trabajo.
|
|
240
|
+
- El proyecto es una herramienta interna sin consumidores que dependan de compatibilidad de versión — SemVer completo compensa cuando hay consumidores que confían en los números de versión para evaluar breaking changes.
|
|
241
|
+
|
|
242
|
+
## Gotchas / Errores comunes no obvios
|
|
243
|
+
|
|
244
|
+
- **Tag ligero creado en lugar de anotado para el release**: `git tag v2.1.0` sin la flag `-a` crea un tag ligero que no incluye metadata de autor, fecha ni mensaje. Causa: olvidar la flag `-a` o la costumbre de usar tags ligeros para marcado temporal. Solución: siempre `git tag -a v2.1.0 -m "Release v2.1.0"` para releases — los tags anotados son los que `git describe` y las herramientas de changelog usan correctamente.
|
|
245
|
+
- **MAJOR evitado por considerar el breaking change "pequeño"**: el equipo sube de `1.4.2` a `1.5.0` un endpoint que cambió su contrato de respuesta. Causa: subestimar el impacto del breaking change para evitar el salto de versión mayor. Solución: si un consumidor tiene que actualizar su código para seguir funcionando, es MAJOR sin importar el tamaño del cambio — el anti-patrón "Nunca saltarse MAJOR por miedo" es explícito en el skill.
|
|
246
|
+
- **Changelog generado con `git cliff` sin configuración personalizada incluye commits de chore y docs**: el CHANGELOG.md resultante tiene 80% de entradas de limpieza que no interesan a los consumidores. Causa: `git cliff` sin `.cliff.toml` incluye todos los tipos de commit. Solución: crear `.cliff.toml` en el repo con la sección `[git]` filtrando solo `feat`, `fix`, `perf` y `BREAKING CHANGE` para el changelog de release público.
|
|
247
|
+
- **Rama `release/2.1.0` mergeada a `main` pero no a `develop`**: el próximo desarrollo parte de `develop` sin incluir los commits del release, generando conflictos en la siguiente rama de feature. Causa: el Paso 4 requiere merge a ambas ramas pero se omite el merge a `develop` por considerar que el release ya está en `main`. Solución: el proceso de release de 4 pasos del skill requiere merge a `main` Y a `develop` antes de eliminar la rama de release — ambos merges son parte del mismo paso atómico.
|
|
248
|
+
- **`npx <paquete> <comando>` sin `@latest` usa caché stale indefinidamente**: tras publicar una nueva versión, `npx swl-ses doctor` sigue ejecutando la primera versión que el usuario cacheó (por ejemplo v5.7.0 cuando ya hay v5.10.3 instalada). Causa: npx resuelve a la primera versión disponible y la cachea; sin `@latest` nunca vuelve a consultar el registry. Solución: SIEMPRE usar `npx paquete@latest <comando>` en mensajes post-install, hooks de alerta de nueva versión, docs del README, ejemplos en CHANGELOG y scripts de inicialización. Nunca `npx paquete <comando>` desnudo — incluso si el paquete acaba de publicarse; el caché de un desarrollador vecino puede tener una versión anterior desde hace meses. Un bump sin `@latest` en los mensajes post-install perpetúa el problema para todos los usuarios nuevos.
|