@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,281 @@
|
|
|
1
|
+
# Regla: Hooks de Calidad — C# / .NET
|
|
2
|
+
|
|
3
|
+
Checks automáticos que se ejecutan en puntos clave del ciclo de desarrollo para
|
|
4
|
+
detectar problemas antes de que lleguen al equipo o a producción. Todos los checks
|
|
5
|
+
son obligatorios y bloquean el flujo si detectan un problema.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## dotnet format --verify-no-changes antes de commit
|
|
10
|
+
|
|
11
|
+
**Pre-commit hook** — bloquea el commit si el código no está formateado:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
#!/usr/bin/env bash
|
|
15
|
+
# .git/hooks/pre-commit
|
|
16
|
+
|
|
17
|
+
set -e
|
|
18
|
+
|
|
19
|
+
echo "Verificando formato con dotnet format..."
|
|
20
|
+
dotnet format --verify-no-changes
|
|
21
|
+
|
|
22
|
+
if [ $? -ne 0 ]; then
|
|
23
|
+
echo "ERROR: El código no está formateado."
|
|
24
|
+
echo "Ejecutar: dotnet format"
|
|
25
|
+
exit 1
|
|
26
|
+
fi
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Con el framework `pre-commit`:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
# .pre-commit-config.yaml
|
|
33
|
+
repos:
|
|
34
|
+
- repo: local
|
|
35
|
+
hooks:
|
|
36
|
+
- id: dotnet-format
|
|
37
|
+
name: dotnet format
|
|
38
|
+
language: system
|
|
39
|
+
entry: dotnet format --verify-no-changes
|
|
40
|
+
pass_filenames: false
|
|
41
|
+
types: [c#]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- Si el check falla: ejecutar `dotnet format` sin flags y hacer el commit de nuevo.
|
|
45
|
+
- El archivo `.editorconfig` es la fuente de verdad para las reglas de formato.
|
|
46
|
+
- NUNCA commitear con `--no-verify` para saltarse el formato.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## dotnet build antes de commit
|
|
51
|
+
|
|
52
|
+
**Pre-commit hook** — bloquea el commit si hay errores de compilación:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
echo "Compilando el proyecto..."
|
|
56
|
+
dotnet build --no-restore -warnaserror
|
|
57
|
+
|
|
58
|
+
if [ $? -ne 0 ]; then
|
|
59
|
+
echo "ERROR: La compilación falló."
|
|
60
|
+
echo "Corregir los errores antes de hacer commit."
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- `--no-restore` en el hook — el restore es costoso y debe hacerse manualmente.
|
|
66
|
+
- `-warnaserror` convierte warnings en errores — la misma configuración que CI.
|
|
67
|
+
- El flag `-warnaserror` debe estar también en el `.csproj` para consistencia:
|
|
68
|
+
```xml
|
|
69
|
+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Roslyn analyzers habilitados como errores
|
|
75
|
+
|
|
76
|
+
Los analyzers de Roslyn detectan bugs y problemas de seguridad durante la compilación.
|
|
77
|
+
Configurar en el `.csproj`:
|
|
78
|
+
|
|
79
|
+
```xml
|
|
80
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
81
|
+
<PropertyGroup>
|
|
82
|
+
<!-- Nullable reference types como errores -->
|
|
83
|
+
<Nullable>enable</Nullable>
|
|
84
|
+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
85
|
+
|
|
86
|
+
<!-- Nivel de análisis máximo -->
|
|
87
|
+
<AnalysisLevel>latest</AnalysisLevel>
|
|
88
|
+
<AnalysisMode>All</AnalysisMode>
|
|
89
|
+
|
|
90
|
+
<!-- Security analyzers -->
|
|
91
|
+
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
|
92
|
+
</PropertyGroup>
|
|
93
|
+
|
|
94
|
+
<ItemGroup>
|
|
95
|
+
<!-- Analyzers adicionales de seguridad -->
|
|
96
|
+
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" />
|
|
97
|
+
<PackageReference Include="SecurityCodeScan.VS2019" PrivateAssets="all" />
|
|
98
|
+
<PackageReference Include="Meziantou.Analyzer" PrivateAssets="all" />
|
|
99
|
+
</ItemGroup>
|
|
100
|
+
</Project>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- `SecurityCodeScan` detecta SQL injection, XSS y otras vulnerabilidades OWASP en tiempo de compilación.
|
|
104
|
+
- `Meziantou.Analyzer` detecta patrones problemáticos de async/await, performance y API misuse.
|
|
105
|
+
- Si un analyzer genera un falso positivo: suprimir con `#pragma warning disable CSXXXX`
|
|
106
|
+
en el sitio exacto, con comentario explicando por qué.
|
|
107
|
+
NUNCA suprimir a nivel de proyecto sin revisión del equipo.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Detección de Console.WriteLine en código no-test
|
|
112
|
+
|
|
113
|
+
**En CI como parte del build** — detecta logs de debug que no deben llegar a producción:
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
# .github/workflows/ci.yml
|
|
117
|
+
- name: Verificar ausencia de Console.WriteLine en producción
|
|
118
|
+
run: |
|
|
119
|
+
# Buscar en src/ pero no en archivos de test
|
|
120
|
+
if grep -rn "Console\.Write" src/ --include="*.cs" | \
|
|
121
|
+
grep -v "\.Tests\." | grep -v "// ALLOW-CONSOLE"; then
|
|
122
|
+
echo "ERROR: Console.Write encontrado en código de producción."
|
|
123
|
+
echo "Usar ILogger<T> en su lugar."
|
|
124
|
+
exit 1
|
|
125
|
+
fi
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
O mediante un analyzer de Roslyn configurado en `.editorconfig`:
|
|
129
|
+
|
|
130
|
+
```ini
|
|
131
|
+
# .editorconfig
|
|
132
|
+
[*.cs]
|
|
133
|
+
# Prohibir Console.Write* en código de producción
|
|
134
|
+
dotnet_diagnostic.CA2241.severity = error
|
|
135
|
+
|
|
136
|
+
# Configurar analyzer para detectar Console.WriteLine
|
|
137
|
+
dotnet_diagnostic.MA0003.severity = error # Meziantou: evitar Console.Write
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- `Console.WriteLine` y `Console.Write` permitidos solo en:
|
|
141
|
+
- Proyectos de tipo CLI/consola donde es el output intencionado
|
|
142
|
+
- Archivos `*.Tests.cs` o dentro de proyectos `*.Tests`
|
|
143
|
+
- Código marcado con `// ALLOW-CONSOLE: razón específica`
|
|
144
|
+
- En el resto del código: usar `ILogger<T>` inyectado via DI.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## dotnet test con cobertura en CI
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
# .github/workflows/ci.yml
|
|
152
|
+
jobs:
|
|
153
|
+
test:
|
|
154
|
+
runs-on: ubuntu-latest
|
|
155
|
+
steps:
|
|
156
|
+
- uses: actions/checkout@v4
|
|
157
|
+
|
|
158
|
+
- name: Setup .NET
|
|
159
|
+
uses: actions/setup-dotnet@v4
|
|
160
|
+
with:
|
|
161
|
+
dotnet-version: '8.x'
|
|
162
|
+
|
|
163
|
+
- name: Restaurar dependencias
|
|
164
|
+
run: dotnet restore
|
|
165
|
+
|
|
166
|
+
- name: Compilar
|
|
167
|
+
run: dotnet build --no-restore -warnaserror
|
|
168
|
+
|
|
169
|
+
- name: Ejecutar tests con cobertura
|
|
170
|
+
run: |
|
|
171
|
+
dotnet test --no-build \
|
|
172
|
+
--collect:"XPlat Code Coverage" \
|
|
173
|
+
--results-directory ./coverage
|
|
174
|
+
|
|
175
|
+
- name: Verificar umbral de cobertura
|
|
176
|
+
run: |
|
|
177
|
+
dotnet tool install -g dotnet-reportgenerator-globaltool
|
|
178
|
+
reportgenerator \
|
|
179
|
+
-reports:"./coverage/**/*.xml" \
|
|
180
|
+
-targetdir:./coverage-report \
|
|
181
|
+
-reporttypes:Cobertura
|
|
182
|
+
# Falla si cobertura total < 80%
|
|
183
|
+
python scripts/check-coverage.py ./coverage-report/Cobertura.xml 80
|
|
184
|
+
|
|
185
|
+
- name: Publicar reporte de cobertura
|
|
186
|
+
uses: actions/upload-artifact@v4
|
|
187
|
+
with:
|
|
188
|
+
name: coverage-report
|
|
189
|
+
path: ./coverage-report
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
- `dotnet test` en CI con `--collect:"XPlat Code Coverage"` genera reportes Cobertura XML.
|
|
193
|
+
- Publicar el reporte como artefacto del job para revisión post-ejecución.
|
|
194
|
+
- Cobertura mínima: 80% para proyectos de lógica de negocio.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Security analyzers integrados
|
|
199
|
+
|
|
200
|
+
```yaml
|
|
201
|
+
# Job de seguridad en CI — separado del job de tests
|
|
202
|
+
security:
|
|
203
|
+
runs-on: ubuntu-latest
|
|
204
|
+
steps:
|
|
205
|
+
- uses: actions/checkout@v4
|
|
206
|
+
|
|
207
|
+
- name: Verificar vulnerabilidades en paquetes
|
|
208
|
+
run: dotnet list package --vulnerable --include-transitive
|
|
209
|
+
|
|
210
|
+
- name: Ejecutar CodeQL
|
|
211
|
+
uses: github/codeql-action/analyze@v3
|
|
212
|
+
with:
|
|
213
|
+
languages: csharp
|
|
214
|
+
|
|
215
|
+
- name: Ejecutar OWASP Dependency Check
|
|
216
|
+
uses: dependency-check/Dependency-Check_Action@main
|
|
217
|
+
with:
|
|
218
|
+
format: HTML
|
|
219
|
+
args: >
|
|
220
|
+
--scan . --out reports
|
|
221
|
+
--failOnCVSS 7
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
- `dotnet list package --vulnerable` detecta NuGet packages con CVEs conocidos.
|
|
225
|
+
- CodeQL analiza el código en busca de vulnerabilidades de seguridad.
|
|
226
|
+
- OWASP Dependency Check como capa adicional para detección de CVEs.
|
|
227
|
+
- El job de seguridad corre en cada PR y semanalmente como job independiente.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Configuracion completa del pipeline CI
|
|
232
|
+
|
|
233
|
+
```yaml
|
|
234
|
+
# .github/workflows/ci.yml — pipeline completo
|
|
235
|
+
name: CI
|
|
236
|
+
|
|
237
|
+
on: [push, pull_request]
|
|
238
|
+
|
|
239
|
+
jobs:
|
|
240
|
+
format:
|
|
241
|
+
runs-on: ubuntu-latest
|
|
242
|
+
steps:
|
|
243
|
+
- uses: actions/checkout@v4
|
|
244
|
+
- uses: actions/setup-dotnet@v4
|
|
245
|
+
with: { dotnet-version: '8.x' }
|
|
246
|
+
- run: dotnet format --verify-no-changes
|
|
247
|
+
|
|
248
|
+
build-and-test:
|
|
249
|
+
runs-on: ubuntu-latest
|
|
250
|
+
needs: format
|
|
251
|
+
steps:
|
|
252
|
+
- uses: actions/checkout@v4
|
|
253
|
+
- uses: actions/setup-dotnet@v4
|
|
254
|
+
with: { dotnet-version: '8.x' }
|
|
255
|
+
- run: dotnet restore
|
|
256
|
+
- run: dotnet build --no-restore -warnaserror
|
|
257
|
+
- run: dotnet test --no-build --collect:"XPlat Code Coverage"
|
|
258
|
+
|
|
259
|
+
security:
|
|
260
|
+
runs-on: ubuntu-latest
|
|
261
|
+
needs: build-and-test
|
|
262
|
+
steps:
|
|
263
|
+
- uses: actions/checkout@v4
|
|
264
|
+
- uses: actions/setup-dotnet@v4
|
|
265
|
+
with: { dotnet-version: '8.x' }
|
|
266
|
+
- run: dotnet list package --vulnerable --include-transitive
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Checklist de hooks antes de integrar al proyecto
|
|
272
|
+
|
|
273
|
+
- [ ] Hook de pre-commit instalado con `dotnet format --verify-no-changes`
|
|
274
|
+
- [ ] Hook de pre-commit con `dotnet build -warnaserror`
|
|
275
|
+
- [ ] `<TreatWarningsAsErrors>true</TreatWarningsAsErrors>` en todos los `.csproj`
|
|
276
|
+
- [ ] `<Nullable>enable</Nullable>` en todos los `.csproj`
|
|
277
|
+
- [ ] Roslyn analyzers configurados (`SecurityCodeScan`, `Meziantou.Analyzer`)
|
|
278
|
+
- [ ] Pipeline de CI con job de formato, compilación, tests y seguridad
|
|
279
|
+
- [ ] `dotnet test` con cobertura en CI y verificación del umbral del 80%
|
|
280
|
+
- [ ] `dotnet list package --vulnerable` en CI (cada PR y semanalmente)
|
|
281
|
+
- [ ] Detección de `Console.WriteLine` en código de producción
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Regla: Patrones de Diseño — C# / .NET
|
|
2
|
+
|
|
3
|
+
Patrones establecidos en el ecosistema .NET moderno para código mantenible,
|
|
4
|
+
testeable y con separación clara de responsabilidades. Estos patrones están
|
|
5
|
+
soportados por las herramientas del stack — no reinventar lo que ya existe.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## CQRS con MediatR
|
|
10
|
+
|
|
11
|
+
Separar operaciones de lectura (queries) de escritura (commands):
|
|
12
|
+
|
|
13
|
+
```csharp
|
|
14
|
+
// Command — modifica estado, no retorna datos de negocio
|
|
15
|
+
public record CrearFacturaCommand(string ClienteEmail, decimal Total)
|
|
16
|
+
: IRequest<Guid>;
|
|
17
|
+
|
|
18
|
+
public class CrearFacturaHandler : IRequestHandler<CrearFacturaCommand, Guid>
|
|
19
|
+
{
|
|
20
|
+
public async Task<Guid> Handle(CrearFacturaCommand cmd, CancellationToken ct)
|
|
21
|
+
{
|
|
22
|
+
var factura = new Factura(cmd.ClienteEmail, cmd.Total);
|
|
23
|
+
await _repo.AgregarAsync(factura, ct);
|
|
24
|
+
return factura.Id;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Query — solo lectura, no modifica estado
|
|
29
|
+
public record ObtenerFacturasQuery(string ClienteEmail)
|
|
30
|
+
: IRequest<IReadOnlyList<FacturaDto>>;
|
|
31
|
+
|
|
32
|
+
// En el endpoint
|
|
33
|
+
app.MapPost("/facturas", async (CrearFacturaCommand cmd, IMediator mediator) =>
|
|
34
|
+
Results.Created($"/facturas/{await mediator.Send(cmd)}", null));
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- Cada Command y Query es un record inmutable con los parámetros necesarios.
|
|
38
|
+
- Los Handlers tienen una sola responsabilidad.
|
|
39
|
+
- MediatR permite agregar behaviors (pipeline) para logging, validación y cache
|
|
40
|
+
sin modificar los handlers.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Repository pattern con EF Core
|
|
45
|
+
|
|
46
|
+
```csharp
|
|
47
|
+
// Interfaz — define el contrato, independiente de EF
|
|
48
|
+
public interface IFacturaRepository
|
|
49
|
+
{
|
|
50
|
+
Task<Factura?> ObtenerPorIdAsync(Guid id, CancellationToken ct = default);
|
|
51
|
+
Task<IReadOnlyList<Factura>> ListarPorClienteAsync(string email, CancellationToken ct = default);
|
|
52
|
+
Task AgregarAsync(Factura factura, CancellationToken ct = default);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Implementación con EF Core
|
|
56
|
+
public class FacturaRepository : IFacturaRepository
|
|
57
|
+
{
|
|
58
|
+
private readonly AppDbContext _db;
|
|
59
|
+
|
|
60
|
+
public async Task<Factura?> ObtenerPorIdAsync(Guid id, CancellationToken ct)
|
|
61
|
+
=> await _db.Facturas.FindAsync(new object[] { id }, ct);
|
|
62
|
+
|
|
63
|
+
public async Task AgregarAsync(Factura factura, CancellationToken ct)
|
|
64
|
+
{
|
|
65
|
+
await _db.Facturas.AddAsync(factura, ct);
|
|
66
|
+
// No llama SaveChangesAsync — eso es responsabilidad del servicio/handler
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
- Los repositorios NUNCA llaman `SaveChangesAsync` — eso es del Handler o Service.
|
|
72
|
+
- Inyectar la interfaz (`IFacturaRepository`), no la implementación concreta.
|
|
73
|
+
- `Unit of Work` via `AppDbContext.SaveChangesAsync()` en el Handler, después de
|
|
74
|
+
todas las operaciones de la transacción.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Options pattern para configuración
|
|
79
|
+
|
|
80
|
+
```csharp
|
|
81
|
+
// Clase de configuración fuertemente tipada
|
|
82
|
+
public class SmtpOptions
|
|
83
|
+
{
|
|
84
|
+
public const string SectionName = "Smtp";
|
|
85
|
+
|
|
86
|
+
public string Host { get; init; } = string.Empty;
|
|
87
|
+
public int Puerto { get; init; } = 587;
|
|
88
|
+
public bool UsarTls { get; init; } = true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Registro en Program.cs
|
|
92
|
+
builder.Services.Configure<SmtpOptions>(
|
|
93
|
+
builder.Configuration.GetSection(SmtpOptions.SectionName));
|
|
94
|
+
|
|
95
|
+
// Uso en servicios — IOptions<T> para configuración estática
|
|
96
|
+
public class EmailService(IOptions<SmtpOptions> opts)
|
|
97
|
+
{
|
|
98
|
+
private readonly SmtpOptions _config = opts.Value;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// IOptionsSnapshot<T> para configuración recargable por request
|
|
102
|
+
// IOptionsMonitor<T> para configuración recargable en singletons
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
- NUNCA inyectar `IConfiguration` directamente en servicios — usar Options pattern.
|
|
106
|
+
- Validar la configuración al inicio con `ValidateDataAnnotations()` o `Validate()`.
|
|
107
|
+
- `init` (no `set`) para propiedades de configuración — son inmutables después de cargar.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Dependency injection nativo de .NET
|
|
112
|
+
|
|
113
|
+
```csharp
|
|
114
|
+
// Program.cs — registro de servicios
|
|
115
|
+
builder.Services.AddScoped<IFacturaRepository, FacturaRepository>();
|
|
116
|
+
builder.Services.AddScoped<IEmailService, SmtpEmailService>();
|
|
117
|
+
builder.Services.AddSingleton<ICacheService, RedisCacheService>();
|
|
118
|
+
|
|
119
|
+
// Lifetimes:
|
|
120
|
+
// Scoped — una instancia por request HTTP (la más común para servicios)
|
|
121
|
+
// Transient — nueva instancia cada vez (para servicios sin estado)
|
|
122
|
+
// Singleton — una instancia por toda la vida de la app (caches, configs)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- Usar el DI nativo de .NET — no agregar Autofac, Ninject u otros contenedores
|
|
126
|
+
sin una razón técnica específica documentada.
|
|
127
|
+
- NUNCA usar `ServiceLocator` o `IServiceProvider` directamente en servicios
|
|
128
|
+
de negocio — es un anti-patrón que oculta dependencias.
|
|
129
|
+
- Registrar la interfaz, no la implementación: `AddScoped<IServicio, Implementacion>()`.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Result pattern para errores sin excepciones
|
|
134
|
+
|
|
135
|
+
```csharp
|
|
136
|
+
// MAL — excepciones para flujo de control normal
|
|
137
|
+
public async Task<Factura> ObtenerAsync(Guid id)
|
|
138
|
+
{
|
|
139
|
+
var factura = await _repo.ObtenerPorIdAsync(id);
|
|
140
|
+
if (factura is null)
|
|
141
|
+
throw new FacturaNotFoundException(id); // excepción como flujo normal
|
|
142
|
+
return factura;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// BIEN — Result pattern expresa el error en el tipo de retorno
|
|
146
|
+
public async Task<Result<Factura>> ObtenerAsync(Guid id, CancellationToken ct)
|
|
147
|
+
{
|
|
148
|
+
var factura = await _repo.ObtenerPorIdAsync(id, ct);
|
|
149
|
+
return factura is not null
|
|
150
|
+
? Result.Ok(factura)
|
|
151
|
+
: Result.Fail<Factura>($"Factura {id} no encontrada");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// En el handler/endpoint — manejo explícito
|
|
155
|
+
var resultado = await servicio.ObtenerAsync(id, ct);
|
|
156
|
+
if (resultado.IsFailed)
|
|
157
|
+
return Results.NotFound(resultado.Errors);
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- Usar `FluentResults` o `ErrorOr` para el Result pattern.
|
|
161
|
+
- Las excepciones son para condiciones verdaderamente excepcionales (corrupción de datos,
|
|
162
|
+
fallas de infraestructura) — no para flujos de negocio esperados.
|
|
163
|
+
- Los endpoints mapean `Result<T>` a respuestas HTTP apropiadas.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Channel<T> para productor/consumidor
|
|
168
|
+
|
|
169
|
+
```csharp
|
|
170
|
+
// Para procesar eventos de forma asíncrona sin bloquear el request
|
|
171
|
+
public class ColaProcesamiento<T>
|
|
172
|
+
{
|
|
173
|
+
private readonly Channel<T> _canal = Channel.CreateBounded<T>(
|
|
174
|
+
new BoundedChannelOptions(1000) { FullMode = BoundedChannelFullMode.Wait });
|
|
175
|
+
|
|
176
|
+
public async ValueTask EnqueueAsync(T item, CancellationToken ct)
|
|
177
|
+
=> await _canal.Writer.WriteAsync(item, ct);
|
|
178
|
+
|
|
179
|
+
public async Task ProcesarAsync(
|
|
180
|
+
Func<T, CancellationToken, Task> procesador,
|
|
181
|
+
CancellationToken ct)
|
|
182
|
+
{
|
|
183
|
+
await foreach (var item in _canal.Reader.ReadAllAsync(ct))
|
|
184
|
+
await procesador(item, ct);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
- `Channel<T>` para comunicación asíncrona entre productores y consumidores.
|
|
190
|
+
- `BoundedChannel` con límite de capacidad — evita consumo ilimitado de memoria.
|
|
191
|
+
- Usar `BackgroundService` de .NET para el consumidor.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Minimal APIs vs Controllers: criterio de decisión
|
|
196
|
+
|
|
197
|
+
| Situación | Usar | Razón |
|
|
198
|
+
|-----------|------|-------|
|
|
199
|
+
| APIs simples, pocos endpoints | Minimal APIs | Menos boilerplate, más rápido |
|
|
200
|
+
| APIs grandes con muchos filtros y convenciones | Controllers | Mejor organización con attributes |
|
|
201
|
+
| Versionado de API complejo | Controllers | ApiExplorer integrado más maduro |
|
|
202
|
+
| Alta performance, bajo overhead | Minimal APIs | Menor overhead por request |
|
|
203
|
+
| Equipo familiarizado con MVC | Controllers | Menor curva de aprendizaje |
|
|
204
|
+
|
|
205
|
+
```csharp
|
|
206
|
+
// Minimal API — para servicios simples o microservicios
|
|
207
|
+
app.MapGet("/facturas/{id:guid}", async (Guid id, IMediator mediator, CancellationToken ct)
|
|
208
|
+
=> await mediator.Send(new ObtenerFacturaQuery(id), ct) is { } factura
|
|
209
|
+
? Results.Ok(factura)
|
|
210
|
+
: Results.NotFound())
|
|
211
|
+
.WithName("ObtenerFactura")
|
|
212
|
+
.RequireAuthorization();
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Checklist de patrones antes de hacer merge
|
|
218
|
+
|
|
219
|
+
- [ ] Commands y Queries son records inmutables que implementan `IRequest<T>`
|
|
220
|
+
- [ ] Handlers tienen exactamente una responsabilidad
|
|
221
|
+
- [ ] Repositorios no llaman `SaveChangesAsync` — eso es del handler
|
|
222
|
+
- [ ] Configuración accedida via `IOptions<T>`, no `IConfiguration` directamente
|
|
223
|
+
- [ ] Sin uso de `ServiceLocator` en servicios de negocio
|
|
224
|
+
- [ ] Errores de flujo normal manejados con Result pattern, no excepciones
|
|
225
|
+
- [ ] `CancellationToken` propagado en todas las operaciones async
|
|
226
|
+
- [ ] DI nativo de .NET — sin contenedores externos sin justificación
|