@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,272 @@
|
|
|
1
|
+
# Regla: Testing Go
|
|
2
|
+
|
|
3
|
+
Go tiene soporte de testing integrado en la toolchain. Esta regla establece
|
|
4
|
+
cómo usarlo correctamente. El runner nativo es suficiente para la mayoría
|
|
5
|
+
de casos — no se necesitan frameworks externos pesados.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## go test como runner nativo
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Correr todos los tests del proyecto
|
|
13
|
+
go test ./...
|
|
14
|
+
|
|
15
|
+
# Con verbose para ver nombres de tests
|
|
16
|
+
go test -v ./...
|
|
17
|
+
|
|
18
|
+
# Tests de un paquete específico
|
|
19
|
+
go test ./internal/factura/...
|
|
20
|
+
|
|
21
|
+
# Detectar data races (OBLIGATORIO en CI)
|
|
22
|
+
go test -race ./...
|
|
23
|
+
|
|
24
|
+
# Con cobertura
|
|
25
|
+
go test -cover -coverprofile=coverage.out ./...
|
|
26
|
+
go tool cover -html=coverage.out -o coverage.html
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## testify/assert para assertions legibles
|
|
32
|
+
|
|
33
|
+
La librería `testify/assert` provee mensajes de error descriptivos cuando
|
|
34
|
+
los tests fallan. Las funciones nativas de `testing.T` son verbosas y sus
|
|
35
|
+
mensajes de error poco informativos.
|
|
36
|
+
|
|
37
|
+
```go
|
|
38
|
+
import (
|
|
39
|
+
"testing"
|
|
40
|
+
"github.com/stretchr/testify/assert"
|
|
41
|
+
"github.com/stretchr/testify/require"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
// assert: el test continúa aunque falle
|
|
45
|
+
// require: el test se detiene si falla (para precondiciones)
|
|
46
|
+
|
|
47
|
+
func TestCrearFactura(t *testing.T) {
|
|
48
|
+
// MAL — testing nativo: mensaje de error pobre
|
|
49
|
+
if factura.Total != 290.00 {
|
|
50
|
+
t.Errorf("expected 290.00, got %v", factura.Total)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// BIEN — testify: mensaje claro con valores esperado y actual
|
|
54
|
+
assert.Equal(t, 290.00, factura.Total)
|
|
55
|
+
assert.NotNil(t, factura.ID)
|
|
56
|
+
assert.Equal(t, "BORRADOR", factura.Estatus)
|
|
57
|
+
|
|
58
|
+
// require para precondiciones: si falla, no tiene sentido continuar
|
|
59
|
+
require.NoError(t, err, "crear factura no debe retornar error")
|
|
60
|
+
require.NotNil(t, factura, "factura no debe ser nil")
|
|
61
|
+
assert.Equal(t, clienteID, factura.ClienteID) // solo si llegamos aquí
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Table-driven tests obligatorios para múltiples casos
|
|
68
|
+
|
|
69
|
+
Este es el patrón idiomático de Go para tests con múltiples entradas/salidas.
|
|
70
|
+
Elimina la duplicación y hace los casos explícitos.
|
|
71
|
+
|
|
72
|
+
```go
|
|
73
|
+
func TestCalcularIva(t *testing.T) {
|
|
74
|
+
// Tabla de casos de prueba
|
|
75
|
+
casos := []struct {
|
|
76
|
+
nombre string
|
|
77
|
+
subtotal float64
|
|
78
|
+
tasa float64
|
|
79
|
+
ivaEsper float64
|
|
80
|
+
debeError bool
|
|
81
|
+
}{
|
|
82
|
+
{
|
|
83
|
+
nombre: "IVA estándar 16% sobre 100",
|
|
84
|
+
subtotal: 100.00, tasa: 0.16, ivaEsper: 16.00,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
nombre: "IVA reducido 8% sobre 100",
|
|
88
|
+
subtotal: 100.00, tasa: 0.08, ivaEsper: 8.00,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
nombre: "IVA tasa cero",
|
|
92
|
+
subtotal: 100.00, tasa: 0.00, ivaEsper: 0.00,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
nombre: "Subtotal negativo retorna error",
|
|
96
|
+
subtotal: -10.00, tasa: 0.16, debeError: true,
|
|
97
|
+
},
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
for _, c := range casos {
|
|
101
|
+
t.Run(c.nombre, func(t *testing.T) {
|
|
102
|
+
// Arrange
|
|
103
|
+
calc := NuevoCalculadorIva()
|
|
104
|
+
|
|
105
|
+
// Act
|
|
106
|
+
resultado, err := calc.Calcular(c.subtotal, c.tasa)
|
|
107
|
+
|
|
108
|
+
// Assert
|
|
109
|
+
if c.debeError {
|
|
110
|
+
require.Error(t, err)
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
require.NoError(t, err)
|
|
114
|
+
assert.InDelta(t, c.ivaEsper, resultado, 0.001)
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## go test -race para detectar data races
|
|
123
|
+
|
|
124
|
+
Las data races son bugs no deterministas y difíciles de reproducir en producción.
|
|
125
|
+
Correr con `-race` en CI es obligatorio.
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# En CI — falla si detecta data race
|
|
129
|
+
go test -race ./...
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```go
|
|
133
|
+
// Ejemplo de data race que -race detecta
|
|
134
|
+
func TestContadorConcurrente(t *testing.T) {
|
|
135
|
+
contador := &Contador{}
|
|
136
|
+
var wg sync.WaitGroup
|
|
137
|
+
|
|
138
|
+
for i := 0; i < 1000; i++ {
|
|
139
|
+
wg.Add(1)
|
|
140
|
+
go func() {
|
|
141
|
+
defer wg.Done()
|
|
142
|
+
contador.Incrementar() // -race detecta si Incrementar no es thread-safe
|
|
143
|
+
}()
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
wg.Wait()
|
|
147
|
+
assert.Equal(t, 1000, contador.Valor())
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Mocks con interfaces — sin frameworks pesados
|
|
154
|
+
|
|
155
|
+
Go no necesita frameworks de mocking pesados. Las interfaces permiten mocks simples.
|
|
156
|
+
Para mocks generados automáticamente: `mockery` o `moq`.
|
|
157
|
+
|
|
158
|
+
```go
|
|
159
|
+
// Interface del repositorio
|
|
160
|
+
type FacturaRepository interface {
|
|
161
|
+
Guardar(ctx context.Context, f *Factura) error
|
|
162
|
+
BuscarPorID(ctx context.Context, id uuid.UUID) (*Factura, error)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Mock manual para tests simples
|
|
166
|
+
type MockFacturaRepository struct {
|
|
167
|
+
GuardarFn func(ctx context.Context, f *Factura) error
|
|
168
|
+
BuscarPorIDFn func(ctx context.Context, id uuid.UUID) (*Factura, error)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
func (m *MockFacturaRepository) Guardar(ctx context.Context, f *Factura) error {
|
|
172
|
+
return m.GuardarFn(ctx, f)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
func (m *MockFacturaRepository) BuscarPorID(ctx context.Context, id uuid.UUID) (*Factura, error) {
|
|
176
|
+
return m.BuscarPorIDFn(ctx, id)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Uso en test
|
|
180
|
+
func TestCrearFactura_GuardaYRetorna(t *testing.T) {
|
|
181
|
+
facturaGuardada := &Factura{ID: uuid.New()}
|
|
182
|
+
repo := &MockFacturaRepository{
|
|
183
|
+
GuardarFn: func(ctx context.Context, f *Factura) error {
|
|
184
|
+
return nil
|
|
185
|
+
},
|
|
186
|
+
}
|
|
187
|
+
servicio := NuevoFacturaService(repo, zap.NewNop())
|
|
188
|
+
|
|
189
|
+
resultado, err := servicio.Crear(context.Background(), CrearRequest{})
|
|
190
|
+
|
|
191
|
+
require.NoError(t, err)
|
|
192
|
+
assert.NotNil(t, resultado)
|
|
193
|
+
assert.Equal(t, facturaGuardada.ID, resultado.ID)
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## httptest para testing de handlers HTTP
|
|
200
|
+
|
|
201
|
+
```go
|
|
202
|
+
func TestHandlerCrearFactura_Exitoso(t *testing.T) {
|
|
203
|
+
// Arrange
|
|
204
|
+
servicio := &MockFacturaService{...}
|
|
205
|
+
handler := NuevoFacturaHandler(servicio)
|
|
206
|
+
body := `{"clienteId": "...","lineas": [...]}`
|
|
207
|
+
|
|
208
|
+
req := httptest.NewRequest(http.MethodPost, "/v1/facturas",
|
|
209
|
+
strings.NewReader(body))
|
|
210
|
+
req.Header.Set("Content-Type", "application/json")
|
|
211
|
+
rec := httptest.NewRecorder()
|
|
212
|
+
|
|
213
|
+
// Act
|
|
214
|
+
handler.ServeHTTP(rec, req)
|
|
215
|
+
|
|
216
|
+
// Assert
|
|
217
|
+
assert.Equal(t, http.StatusCreated, rec.Code)
|
|
218
|
+
var respuesta map[string]any
|
|
219
|
+
require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &respuesta))
|
|
220
|
+
assert.NotNil(t, respuesta["id"])
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## TestMain para setup/teardown global
|
|
227
|
+
|
|
228
|
+
```go
|
|
229
|
+
func TestMain(m *testing.M) {
|
|
230
|
+
// Setup — ejecutado antes de todos los tests del paquete
|
|
231
|
+
contenedor := iniciarContenedorPostgres()
|
|
232
|
+
configurarDB(contenedor.ConnectionString())
|
|
233
|
+
|
|
234
|
+
codigo := m.Run() // ejecutar tests
|
|
235
|
+
|
|
236
|
+
// Teardown — ejecutado después de todos los tests
|
|
237
|
+
contenedor.Terminar()
|
|
238
|
+
os.Exit(codigo)
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Cobertura: go test -cover -coverprofile
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# Generar reporte de cobertura
|
|
248
|
+
go test -cover -coverprofile=coverage.out ./...
|
|
249
|
+
|
|
250
|
+
# Ver cobertura por función
|
|
251
|
+
go tool cover -func=coverage.out
|
|
252
|
+
|
|
253
|
+
# Ver umbral — falla si cobertura < 80%
|
|
254
|
+
COBERTURA=$(go tool cover -func=coverage.out | grep total | awk '{print $3}' | tr -d '%')
|
|
255
|
+
if (( $(echo "$COBERTURA < 80" | bc -l) )); then
|
|
256
|
+
echo "Cobertura $COBERTURA% está por debajo del mínimo de 80%"
|
|
257
|
+
exit 1
|
|
258
|
+
fi
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Checklist de testing Go antes de abrir PR
|
|
264
|
+
|
|
265
|
+
- [ ] `go test ./...` pasa sin errores
|
|
266
|
+
- [ ] `go test -race ./...` pasa sin data races
|
|
267
|
+
- [ ] Table-driven tests para funciones con múltiples casos
|
|
268
|
+
- [ ] Mocks implementados como interfaces, no con frameworks invasivos
|
|
269
|
+
- [ ] Cobertura del paquete >= 80%
|
|
270
|
+
- [ ] Handlers HTTP testeados con httptest
|
|
271
|
+
- [ ] Sin time.Sleep() en tests — usar canales o contextos con timeout
|
|
272
|
+
- [ ] Tests son deterministas (mismo resultado en cada ejecución)
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Regla: Estilo de Código Java (Java 17+)
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA para todo código Java nuevo o modificado.
|
|
4
|
+
Java moderno (17+) ofrece construcciones que eliminan verbosidad sin sacrificar
|
|
5
|
+
claridad. Usarlas no es opcional: reducen bugs y aumentan legibilidad.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Formateador obligatorio
|
|
10
|
+
|
|
11
|
+
- Usar **google-java-format** o **Spotless** con perfil AOSP (4 espacios).
|
|
12
|
+
Alternativa aceptable: Checkstyle con configuración de Google Style Guide.
|
|
13
|
+
- El formateador corre en CI como verificación bloqueante. Un PR que no formatea
|
|
14
|
+
no pasa la pipeline sin importar el resto.
|
|
15
|
+
- Configurar el IDE para formatear al guardar. No formatear manualmente.
|
|
16
|
+
|
|
17
|
+
```xml
|
|
18
|
+
<!-- pom.xml — Spotless obligatorio -->
|
|
19
|
+
<plugin>
|
|
20
|
+
<groupId>com.diffplug.spotless</groupId>
|
|
21
|
+
<artifactId>spotless-maven-plugin</artifactId>
|
|
22
|
+
<version>2.43.0</version>
|
|
23
|
+
<configuration>
|
|
24
|
+
<java>
|
|
25
|
+
<googleJavaFormat>
|
|
26
|
+
<version>1.19.2</version>
|
|
27
|
+
<style>AOSP</style>
|
|
28
|
+
</googleJavaFormat>
|
|
29
|
+
</java>
|
|
30
|
+
</configuration>
|
|
31
|
+
</plugin>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Records para DTOs inmutables (Java 16+)
|
|
37
|
+
|
|
38
|
+
Los records eliminan el boilerplate de DTOs. Todo DTO inmutable DEBE ser record.
|
|
39
|
+
|
|
40
|
+
```java
|
|
41
|
+
// MAL — clase tradicional con boilerplate innecesario
|
|
42
|
+
public class UsuarioDto {
|
|
43
|
+
private final String nombre;
|
|
44
|
+
private final String email;
|
|
45
|
+
public UsuarioDto(String nombre, String email) { ... }
|
|
46
|
+
public String getNombre() { return nombre; }
|
|
47
|
+
// ... equals, hashCode, toString
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// BIEN — record: inmutable, compacto, con equals/hashCode/toString automáticos
|
|
51
|
+
public record UsuarioDto(String nombre, String email) {}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Sealed classes para jerarquías cerradas (Java 17+)
|
|
57
|
+
|
|
58
|
+
Cuando una jerarquía tiene un número fijo conocido de subtipos, usar `sealed`.
|
|
59
|
+
Permite al compilador verificar exhaustividad en switch expressions.
|
|
60
|
+
|
|
61
|
+
```java
|
|
62
|
+
// BIEN
|
|
63
|
+
public sealed interface ResultadoPago
|
|
64
|
+
permits PagoAprobado, PagoRechazado, PagoPendiente {}
|
|
65
|
+
|
|
66
|
+
public record PagoAprobado(String transaccionId) implements ResultadoPago {}
|
|
67
|
+
public record PagoRechazado(String motivo) implements ResultadoPago {}
|
|
68
|
+
public record PagoPendiente(Instant expiracion) implements ResultadoPago {}
|
|
69
|
+
|
|
70
|
+
// Switch exhaustivo — el compilador verifica que todos los casos están cubiertos
|
|
71
|
+
String mensaje = switch (resultado) {
|
|
72
|
+
case PagoAprobado a -> "Aprobado: " + a.transaccionId();
|
|
73
|
+
case PagoRechazado r -> "Rechazado: " + r.motivo();
|
|
74
|
+
case PagoPendiente p -> "Pendiente hasta " + p.expiracion();
|
|
75
|
+
};
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Pattern matching para instanceof (Java 16+)
|
|
81
|
+
|
|
82
|
+
```java
|
|
83
|
+
// MAL — cast manual redundante
|
|
84
|
+
if (objeto instanceof Factura) {
|
|
85
|
+
Factura factura = (Factura) objeto;
|
|
86
|
+
procesar(factura);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// BIEN — pattern matching elimina el cast
|
|
90
|
+
if (objeto instanceof Factura factura) {
|
|
91
|
+
procesar(factura);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Text blocks para strings multilínea (Java 15+)
|
|
98
|
+
|
|
99
|
+
```java
|
|
100
|
+
// MAL — concatenación ilegible
|
|
101
|
+
String sql = "SELECT f.id, f.total\n" +
|
|
102
|
+
"FROM facturas f\n" +
|
|
103
|
+
"WHERE f.estatus = 'ACTIVA'\n" +
|
|
104
|
+
"ORDER BY f.fecha_emision DESC";
|
|
105
|
+
|
|
106
|
+
// BIEN — text block preserva indentación y legibilidad
|
|
107
|
+
String sql = """
|
|
108
|
+
SELECT f.id, f.total
|
|
109
|
+
FROM facturas f
|
|
110
|
+
WHERE f.estatus = 'ACTIVA'
|
|
111
|
+
ORDER BY f.fecha_emision DESC
|
|
112
|
+
""";
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Optional: uso correcto
|
|
118
|
+
|
|
119
|
+
- `Optional` es para valores de RETORNO que pueden estar ausentes. Solo ahí.
|
|
120
|
+
- NUNCA como parámetro de método — usar sobrecarga o valor por defecto.
|
|
121
|
+
- NUNCA como campo de clase — usar null con documentación o valor centinela.
|
|
122
|
+
|
|
123
|
+
```java
|
|
124
|
+
// MAL — Optional como parámetro
|
|
125
|
+
public void enviarCorreo(String destinatario, Optional<String> asunto) { ... }
|
|
126
|
+
|
|
127
|
+
// MAL — Optional como campo
|
|
128
|
+
public class Pedido {
|
|
129
|
+
private Optional<String> notas; // serialización rota, null es suficiente
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// BIEN — Optional solo en retorno
|
|
133
|
+
public Optional<Usuario> buscarPorEmail(String email) {
|
|
134
|
+
return repositorio.findByEmail(email);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// BIEN — consumir con métodos funcionales, no con isPresent()/get()
|
|
138
|
+
buscarPorEmail(email)
|
|
139
|
+
.map(Usuario::getNombre)
|
|
140
|
+
.orElse("Anónimo");
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## var para variables locales con tipo obvio
|
|
146
|
+
|
|
147
|
+
```java
|
|
148
|
+
// MAL — tipo redundante cuando el constructor lo hace obvio
|
|
149
|
+
HashMap<String, List<Factura>> facturasPorCliente = new HashMap<String, List<Factura>>();
|
|
150
|
+
|
|
151
|
+
// BIEN — var elimina redundancia sin perder claridad
|
|
152
|
+
var facturasPorCliente = new HashMap<String, List<Factura>>();
|
|
153
|
+
|
|
154
|
+
// MAL — var donde el tipo no es obvio (reduce legibilidad)
|
|
155
|
+
var resultado = procesarPedido(id); // ¿Qué tipo retorna procesarPedido?
|
|
156
|
+
|
|
157
|
+
// BIEN — tipo explícito cuando no es obvio del lado derecho
|
|
158
|
+
ResultadoProcesamiento resultado = procesarPedido(id);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Campos final y nombres
|
|
164
|
+
|
|
165
|
+
- Declarar `final` todo campo que no cambia después de la construcción.
|
|
166
|
+
- Declarar `final` todo parámetro de método cuando el método es largo.
|
|
167
|
+
- Clases: `PascalCase`. Métodos y variables: `camelCase`.
|
|
168
|
+
- Constantes: `SCREAMING_CASE` con `static final`.
|
|
169
|
+
- Sin abreviaciones salvo las universalmente conocidas (`id`, `dto`, `url`).
|
|
170
|
+
|
|
171
|
+
```java
|
|
172
|
+
// MAL
|
|
173
|
+
private String n; // nombre críptico
|
|
174
|
+
private int contadorTemporalLogs; // hungarian notation innecesaria
|
|
175
|
+
static final int maxReintentos = 3; // constante en camelCase
|
|
176
|
+
|
|
177
|
+
// BIEN
|
|
178
|
+
private final String nombre;
|
|
179
|
+
private int contadorLogs;
|
|
180
|
+
static final int MAX_REINTENTOS = 3;
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Límites de tamaño
|
|
186
|
+
|
|
187
|
+
- Máximo **40 líneas** por método (sin contar líneas en blanco y comentarios).
|
|
188
|
+
- Máximo **300 líneas** por clase. Si crece más: extraer clases colaboradoras.
|
|
189
|
+
- Máximo **5 parámetros** por método. Si se necesitan más: crear un objeto de parámetros.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Organización de imports
|
|
194
|
+
|
|
195
|
+
Orden estricto, separados por línea en blanco:
|
|
196
|
+
1. `java.*`
|
|
197
|
+
2. `javax.*`
|
|
198
|
+
3. `jakarta.*`
|
|
199
|
+
4. `org.*`
|
|
200
|
+
5. `com.*` (librerías externas)
|
|
201
|
+
6. Paquetes del proyecto propio
|
|
202
|
+
|
|
203
|
+
Sin imports con wildcard (`import java.util.*`). Un tipo por línea.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Checklist de estilo Java antes de abrir PR
|
|
208
|
+
|
|
209
|
+
- [ ] google-java-format / Spotless aplicado — el CI no fallará por formato
|
|
210
|
+
- [ ] DTOs inmutables convertidos a records
|
|
211
|
+
- [ ] Jerarquías cerradas usan sealed interfaces
|
|
212
|
+
- [ ] instanceof con pattern matching (sin cast manual)
|
|
213
|
+
- [ ] Optional solo en valores de retorno
|
|
214
|
+
- [ ] Constantes en SCREAMING_CASE con static final
|
|
215
|
+
- [ ] Sin imports wildcard
|
|
216
|
+
- [ ] Métodos <= 40 líneas, clases <= 300 líneas
|
|
217
|
+
- [ ] Campos inmutables marcados como final
|