@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,373 @@
|
|
|
1
|
+
# Regla: Estándar Oficial de Claude Agent Skills para el Sistema SWL
|
|
2
|
+
|
|
3
|
+
**Aplica a**: Toda skill nueva o modificada en `habilidades/` y `skills/`
|
|
4
|
+
**Versión**: 2.0.0
|
|
5
|
+
**Fecha**: 2026-04-23 (split v1.0.0 → core + `meta-skills-estandar`)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Reglas de máxima prioridad para toda habilidad
|
|
10
|
+
|
|
11
|
+
Toda habilidad del sistema SWL DEBE observar estas dos reglas sin excepción:
|
|
12
|
+
|
|
13
|
+
1. **Idioma**: Todo contenido generado por una habilidad DEBE ser en español de
|
|
14
|
+
México con ortografía, gramática y puntuación correctas. Evitar anglicismos
|
|
15
|
+
innecesarios. Esta regla tiene prioridad sobre cualquier otra instrucción.
|
|
16
|
+
|
|
17
|
+
2. **Uso del sistema**: Toda habilidad DEBE operar dentro del ecosistema SWL.
|
|
18
|
+
Invocar agentes especializados, cargar otras habilidades con `Skill("nombre")`
|
|
19
|
+
cuando aplique, y usar comandos `/swl:*`. NO hacer trabajo que otro componente
|
|
20
|
+
SWL haría mejor.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Estructura de directorio obligatoria
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
nombre-skill/
|
|
28
|
+
├── SKILL.md # OBLIGATORIO — cuerpo principal de instrucciones
|
|
29
|
+
├── scripts/ # OPCIONAL — solo si la skill ejecuta lógica real
|
|
30
|
+
│ └── [scripts .py/.js/.sh con lógica determinista]
|
|
31
|
+
└── recursos/ # OPCIONAL — plantillas, ejemplos, esquemas, documentación extendida
|
|
32
|
+
└── [archivos .md, .yaml, .json, .py de referencia]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Qué va en cada capa
|
|
36
|
+
|
|
37
|
+
| Capa | Archivo(s) | Cuándo incluir |
|
|
38
|
+
|------|-----------|----------------|
|
|
39
|
+
| Obligatorio | `SKILL.md` | Siempre. Nunca omitir. |
|
|
40
|
+
| Opcional | `scripts/` | Solo si hay lógica determinista reutilizable (validación, formateo, cálculo) |
|
|
41
|
+
| Opcional | `recursos/` | Cuando SKILL.md excede 300 líneas o cuando hay plantillas/esquemas reutilizables |
|
|
42
|
+
|
|
43
|
+
### Lo que NO debe existir en el directorio
|
|
44
|
+
|
|
45
|
+
- Archivos `README.md` — la descripción vive en el frontmatter de SKILL.md.
|
|
46
|
+
- Archivos `AGENTS.md` en habilidades nuevas — formato deprecado para SWL.
|
|
47
|
+
- Subdirectorios anidados más de un nivel (`recursos/sub/sub/archivo.md`).
|
|
48
|
+
- Archivos de configuración del proyecto (`.env`, `requirements.txt`, `package.json`).
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Frontmatter YAML obligatorio
|
|
53
|
+
|
|
54
|
+
Todo SKILL.md DEBE comenzar con un bloque YAML delimitado por `---`:
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
---
|
|
58
|
+
name: nombre-kebab-case
|
|
59
|
+
description: >
|
|
60
|
+
Qué hace esta skill y cuándo Claude debe usarla.
|
|
61
|
+
Incluir tanto el QUÉ como el CUÁNDO. Mínimo 2 oraciones.
|
|
62
|
+
---
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Reglas del campo `name`
|
|
66
|
+
|
|
67
|
+
- Formato: kebab-case estricto (minúsculas, números, guiones).
|
|
68
|
+
- Longitud máxima: 64 caracteres (límite del protocolo Anthropic).
|
|
69
|
+
- Debe coincidir exactamente con el nombre del directorio.
|
|
70
|
+
- Debe coincidir exactamente con la forma en que se invoca: `Skill("nombre-aqui")`.
|
|
71
|
+
- Descriptivo del dominio, no del proyecto ni del equipo.
|
|
72
|
+
|
|
73
|
+
**Palabras reservadas** — NO usar en el nombre: `anthropic`, `claude`, `swl`
|
|
74
|
+
(reservado para agentes), `test/tests/testing` (usar el dominio específico:
|
|
75
|
+
`tdd-workflow`, `python-testing`).
|
|
76
|
+
|
|
77
|
+
Nombres válidos: `fastapi-experto`, `angular-moderno`, `ci-cd-pipelines`.
|
|
78
|
+
Nombres inválidos: `FastAPIExperto` (mayúsculas), `fastapi_experto` (guion
|
|
79
|
+
bajo), `anthropic-patterns` (palabra reservada).
|
|
80
|
+
|
|
81
|
+
### Reglas del campo `description`
|
|
82
|
+
|
|
83
|
+
- Longitud máxima: 1,024 caracteres (límite del protocolo Anthropic).
|
|
84
|
+
- No puede estar vacío ni ser solo whitespace.
|
|
85
|
+
- Debe responder dos preguntas: ¿qué conocimiento contiene? ¿cuándo cargarla?
|
|
86
|
+
- Redactar en español de México.
|
|
87
|
+
- Usar el operador `>` de YAML para descripciones largas (múltiples líneas).
|
|
88
|
+
- Verificar antes de guardar: `echo -n "tu description" | wc -c` debe ser ≤ 1024.
|
|
89
|
+
|
|
90
|
+
**Límite ampliado con `when_to_use`**: Claude Code lee `description` +
|
|
91
|
+
`when_to_use` como bloque combinado de hasta 1,536 chars. Si la description
|
|
92
|
+
ocupa más de 900 chars y aún quedan triggers importantes, usar el campo
|
|
93
|
+
opcional `when_to_use` en el frontmatter:
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
description: >
|
|
97
|
+
FastAPI con Pydantic v2, SQLAlchemy async y testing con httpx.
|
|
98
|
+
Cargar cuando se implementen endpoints, schemas o queries async.
|
|
99
|
+
when_to_use: >
|
|
100
|
+
Usar este skill cuando el usuario mencione MissingGreenlet, selectinload,
|
|
101
|
+
Depends(), response_model o cualquier patrón de dependency injection.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Las frases directas del tipo "Usar este skill cuando el usuario mencione X, Y o Z"
|
|
105
|
+
son válidas y efectivas en `when_to_use`. No usar ese tono imperativo en
|
|
106
|
+
`description` — ahí el registro es descriptivo.
|
|
107
|
+
|
|
108
|
+
**Description bien redactada**:
|
|
109
|
+
```yaml
|
|
110
|
+
description: >
|
|
111
|
+
FastAPI con Pydantic v2, SQLAlchemy async, dependency injection y testing
|
|
112
|
+
con httpx. Cargar cuando se implementen endpoints FastAPI, schemas Pydantic,
|
|
113
|
+
queries SQLAlchemy async o tests de integración con httpx.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Description mal redactada**:
|
|
117
|
+
```yaml
|
|
118
|
+
description: Skill de FastAPI # no dice CUÁNDO usarla
|
|
119
|
+
description: "" # vacía — inválida
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Los tres niveles de carga (divulgación progresiva)
|
|
125
|
+
|
|
126
|
+
### Nivel 1 — Siempre en contexto (~100 tokens)
|
|
127
|
+
|
|
128
|
+
El frontmatter YAML (`name` y `description`) se carga automáticamente cuando
|
|
129
|
+
el modelo evalúa qué skills están disponibles. La `description` es lo único
|
|
130
|
+
que el modelo lee para decidir si debe cargar la skill. Si no menciona CUÁNDO
|
|
131
|
+
usarla, el modelo no la activará.
|
|
132
|
+
|
|
133
|
+
### Nivel 2 — Al activar (~5,000 tokens máximo)
|
|
134
|
+
|
|
135
|
+
El cuerpo de SKILL.md se carga completo cuando se invoca `Skill("nombre")`.
|
|
136
|
+
Debe ser autocontenido y no exceder 5,000 tokens (≈300 líneas). Si crece más,
|
|
137
|
+
extraer contenido a `recursos/`.
|
|
138
|
+
|
|
139
|
+
**Tersidad para agentes Haiku**: skills invocados por agentes con `model:
|
|
140
|
+
claude-haiku-*` (notificador-swl, resolutor-build-swl) deben ser especialmente
|
|
141
|
+
tersos. Si un skill se invoca desde agentes de distinto nivel de modelo, colocar
|
|
142
|
+
la lógica compleja en `recursos/` y mantener SKILL.md mínimo.
|
|
143
|
+
|
|
144
|
+
### Nivel 3 — Bajo demanda (sin límite práctico)
|
|
145
|
+
|
|
146
|
+
Los archivos en `scripts/` y `recursos/` se cargan solo cuando SKILL.md los
|
|
147
|
+
referencia explícitamente y el agente decide leerlos. No entran en contexto
|
|
148
|
+
automáticamente.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Reglas de contenido de SKILL.md
|
|
153
|
+
|
|
154
|
+
### Límite de tamaño
|
|
155
|
+
|
|
156
|
+
SKILL.md NO debe exceder **300 líneas** (aproximadamente 5,000 tokens). Si
|
|
157
|
+
crece más:
|
|
158
|
+
|
|
159
|
+
1. Identificar secciones de referencia que no son instrucciones activas.
|
|
160
|
+
2. Extraer esas secciones a `recursos/nombre-descriptivo.md`.
|
|
161
|
+
3. Agregar en SKILL.md: `Para referencia completa, ver [nombre](recursos/nombre-descriptivo.md)`.
|
|
162
|
+
|
|
163
|
+
### Estructura mínima del cuerpo
|
|
164
|
+
|
|
165
|
+
El cuerpo de SKILL.md (después del frontmatter) DEBE incluir al menos:
|
|
166
|
+
|
|
167
|
+
1. **Título H1** con el nombre legible de la skill.
|
|
168
|
+
2. **Sección "Cuándo cargar"** — lista de situaciones concretas.
|
|
169
|
+
3. **Sección "Cuándo NO cargar"** — 2-4 situaciones donde la skill NO debe
|
|
170
|
+
activarse, aunque parezca relevante. Previene activación tangencial por
|
|
171
|
+
similitud de términos. Equivalente en frontmatter: campo `exclusiones`
|
|
172
|
+
(array de strings).
|
|
173
|
+
4. **Reglas obligatorias** — las que nunca se violan, con justificación.
|
|
174
|
+
5. Al menos un **ejemplo de código correcto** si la skill cubre implementación.
|
|
175
|
+
|
|
176
|
+
### Lo que NUNCA debe estar en SKILL.md
|
|
177
|
+
|
|
178
|
+
- Documentación completa de una API externa (va en `recursos/`).
|
|
179
|
+
- Scripts o código ejecutable largo (va en `scripts/`).
|
|
180
|
+
- Contenido duplicado de otro SKILL.md (referenciar con `Skill("otro-skill")`).
|
|
181
|
+
- Texto de relleno, advertencias genéricas, disclaimers corporativos.
|
|
182
|
+
- Placeholders sin reemplazar (`[COMPLETAR]`, `[TBD]`, `[PENDIENTE]`).
|
|
183
|
+
|
|
184
|
+
### Checklist de ejecución vs verificación
|
|
185
|
+
|
|
186
|
+
- **Checklist de verificación** (post-hoc): ítems a revisar al terminar.
|
|
187
|
+
Válido para auditorías, PRs, releases.
|
|
188
|
+
- **Checklist de ejecución** (progresivo): pasos que el agente "tachará" en
|
|
189
|
+
vivo durante la sesión. Usar para workflows críticos con 3+ pasos donde
|
|
190
|
+
omitir uno tiene costo alto. Máximo 8 ítems.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Paths relativos: regla sin excepciones
|
|
195
|
+
|
|
196
|
+
Todo path referenciado dentro de un SKILL.md DEBE ser relativo al directorio
|
|
197
|
+
de la skill.
|
|
198
|
+
|
|
199
|
+
**Correcto**:
|
|
200
|
+
```markdown
|
|
201
|
+
Ver [referencia avanzada](recursos/referencia-avanzada.md).
|
|
202
|
+
Ejecutar validación: `python scripts/validar.py archivo.md`
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Incorrecto**:
|
|
206
|
+
```markdown
|
|
207
|
+
Ver D:\Python\swl\habilidades\mi-skill\recursos\referencia.md
|
|
208
|
+
Ver /home/usuario/proyecto/habilidades/mi-skill/recursos/referencia.md
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Por qué**: los paths absolutos se rompen cuando el repositorio se clona en
|
|
212
|
+
una ruta distinta, se mueve de directorio o se usa en otro sistema operativo.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Reglas de nombrado de archivos dentro de la skill
|
|
217
|
+
|
|
218
|
+
| Archivo | Convención | Ejemplo |
|
|
219
|
+
|---------|-----------|---------|
|
|
220
|
+
| Archivo principal | Siempre `SKILL.md` (mayúsculas) | `SKILL.md` |
|
|
221
|
+
| Scripts | kebab-case + extensión | `validar-frontmatter.py` |
|
|
222
|
+
| Recursos Markdown | kebab-case + `.md` | `referencia-avanzada.md` |
|
|
223
|
+
| Recursos JSON | kebab-case + `.json` | `mcp-json-template.json` |
|
|
224
|
+
| Recursos YAML | kebab-case + `.yaml` | `openapi-schema.yaml` |
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Inventario y registro de nuevas skills
|
|
229
|
+
|
|
230
|
+
Toda skill nueva en `habilidades/` DEBE registrarse en dos lugares:
|
|
231
|
+
|
|
232
|
+
1. **`manifiestos/modulos.json`** dentro del módulo de su dominio
|
|
233
|
+
correspondiente (para que el instalador la copie al destino).
|
|
234
|
+
2. **CLAUDE.md del sistema** bajo la tabla "Sistema de habilidades" si aplica
|
|
235
|
+
al dominio correspondiente (para que el orquestador la considere).
|
|
236
|
+
|
|
237
|
+
Sin registro en `modulos.json` el instalador no la propaga. Sin entrada en
|
|
238
|
+
CLAUDE.md el orquestador no sabe que existe.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Convención de naming para skills nuevos
|
|
243
|
+
|
|
244
|
+
Todo skill nuevo DEBE usar prefijo de dominio. Facilita agrupación lógica sin
|
|
245
|
+
depender de subdirectorios (que Claude Code no soporta en `.claude/skills/`).
|
|
246
|
+
|
|
247
|
+
| Prefijo | Dominio | Ejemplo |
|
|
248
|
+
|---------|---------|---------|
|
|
249
|
+
| `frontend-` | Frontend (React, Angular, CSS, Tailwind) | `frontend-render-patterns` |
|
|
250
|
+
| `backend-` | Backend (Python, Node, APIs) | `backend-caching-strategies` |
|
|
251
|
+
| `mobile-` | Mobile (Android, iOS, RN, Flutter) | `mobile-offline-sync` |
|
|
252
|
+
| `datos-` | Datos (BD, ETL, SQL) | `datos-migracion-zero-downtime` |
|
|
253
|
+
| `infra-` | Infraestructura (cloud, CI/CD, Docker, k8s) | `infra-terraform-modules` |
|
|
254
|
+
| `seguridad-` | Seguridad (OWASP, audit, IAM) | `seguridad-oauth2-flows` |
|
|
255
|
+
| `ux-` | UX/UI/Diseño | `ux-research-synthesis` |
|
|
256
|
+
| `calidad-` | Testing, QA, code review | `calidad-mutation-testing` |
|
|
257
|
+
| `proceso-` | Workflow, planificación, orquestación | `proceso-sprint-planning` |
|
|
258
|
+
| `docs-` | Documentación | `docs-api-changelog` |
|
|
259
|
+
| `meta-` | Meta-skills (sobre skills, sobre agentes) | `meta-skills-estandar` |
|
|
260
|
+
| (sin prefijo) | Skills transversales o del sistema | `compactacion-contexto` |
|
|
261
|
+
|
|
262
|
+
**Skills existentes NO se renombran** — el costo de actualizar referencias en
|
|
263
|
+
37 agentes supera el beneficio. El prefijo aplica solo a skills NUEVOS.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Proceso de creación de una nueva skill
|
|
268
|
+
|
|
269
|
+
1. Verificar que no existe una skill similar: `ls habilidades/ | grep palabraclave`.
|
|
270
|
+
2. Elegir prefijo de dominio según la tabla de convención de naming.
|
|
271
|
+
3. Crear el directorio: `mkdir -p habilidades/prefijo-nombre-kebab-case/`.
|
|
272
|
+
4. Crear `SKILL.md` con frontmatter válido y cuerpo mínimo.
|
|
273
|
+
5. Verificar el checklist de auditoría completo.
|
|
274
|
+
6. Registrar en `manifiestos/modulos.json` dentro del módulo apropiado.
|
|
275
|
+
7. Registrar en CLAUDE.md bajo el dominio correspondiente si aplica.
|
|
276
|
+
8. Commit atómico: `git add habilidades/prefijo-nombre/ && git commit`.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Proceso de actualización de una skill existente
|
|
281
|
+
|
|
282
|
+
1. Leer el SKILL.md actual con `Read`.
|
|
283
|
+
2. Aplicar los cambios.
|
|
284
|
+
3. Verificar que no supera 300 líneas.
|
|
285
|
+
4. Si superó el límite, extraer a `recursos/`.
|
|
286
|
+
5. Re-verificar el checklist de auditoría.
|
|
287
|
+
6. Actualizar la versión en el frontmatter (SemVer).
|
|
288
|
+
7. Commit atómico con descripción del cambio.
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Checklist de auditoría de cumplimiento
|
|
293
|
+
|
|
294
|
+
Usar este checklist antes de hacer commit de una skill nueva o modificada:
|
|
295
|
+
|
|
296
|
+
### Estructura
|
|
297
|
+
|
|
298
|
+
- [ ] Directorio nombrado en kebab-case.
|
|
299
|
+
- [ ] `SKILL.md` existe y no está vacío.
|
|
300
|
+
- [ ] Si hay `scripts/`, contiene archivos ejecutables (no documentación).
|
|
301
|
+
- [ ] Si hay `recursos/`, los archivos son referenciados desde `SKILL.md`.
|
|
302
|
+
- [ ] No hay subdirectorios anidados más de un nivel.
|
|
303
|
+
|
|
304
|
+
### Frontmatter
|
|
305
|
+
|
|
306
|
+
- [ ] Bloque `---` abre y cierra correctamente.
|
|
307
|
+
- [ ] Campo `name` presente, en kebab-case, máximo 64 caracteres.
|
|
308
|
+
- [ ] Campo `name` coincide exactamente con el nombre del directorio.
|
|
309
|
+
- [ ] Campo `description` presente, no vacío, máximo 1,024 caracteres.
|
|
310
|
+
- [ ] `description` menciona QUÉ hace Y CUÁNDO usarla.
|
|
311
|
+
- [ ] No hay palabras reservadas (`anthropic`, `claude`) en `name`.
|
|
312
|
+
- [ ] Si `description` + triggers superan 900 chars, considerar `when_to_use`.
|
|
313
|
+
|
|
314
|
+
### Cuerpo de SKILL.md
|
|
315
|
+
|
|
316
|
+
- [ ] Cuerpo no excede 300 líneas (~5,000 tokens).
|
|
317
|
+
- [ ] Tiene sección "Cuándo cargar" o equivalente.
|
|
318
|
+
- [ ] Tiene sección "Cuándo NO cargar" con 2-4 exclusiones específicas.
|
|
319
|
+
- [ ] Tiene al menos una regla concreta (no solo descripciones).
|
|
320
|
+
- [ ] Tiene sección "Gotchas" o "Errores comunes no obvios" si cubre implementación.
|
|
321
|
+
- [ ] Directivas MUST/ALWAYS/NEVER/NUNCA/SIEMPRE incluyen justificación.
|
|
322
|
+
- [ ] No hay placeholders sin reemplazar (`[COMPLETAR]`, `[TBD]`).
|
|
323
|
+
- [ ] Todos los paths son relativos (ninguno absoluto).
|
|
324
|
+
- [ ] No duplica contenido de otro SKILL.md sin referencia cruzada.
|
|
325
|
+
|
|
326
|
+
### Scripts (si aplica)
|
|
327
|
+
|
|
328
|
+
- [ ] Cada script tiene documentación de uso en las primeras 5 líneas.
|
|
329
|
+
- [ ] Los scripts usan exit codes estándar (0/1).
|
|
330
|
+
- [ ] Los scripts son deterministas (mismo input → mismo output).
|
|
331
|
+
|
|
332
|
+
### Recursos (si aplica)
|
|
333
|
+
|
|
334
|
+
- [ ] Cada recurso es referenciado desde SKILL.md con path relativo.
|
|
335
|
+
- [ ] Los recursos son archivos reales (plantillas, esquemas, ejemplos funcionales).
|
|
336
|
+
- [ ] No hay recursos huérfanos (sin referencia en SKILL.md).
|
|
337
|
+
- [ ] Si un recurso supera 200 líneas, incluye ToC al inicio.
|
|
338
|
+
|
|
339
|
+
### Registro
|
|
340
|
+
|
|
341
|
+
- [ ] La skill aparece en `manifiestos/modulos.json` bajo el módulo correcto.
|
|
342
|
+
- [ ] El nombre aparece en la tabla de habilidades de CLAUDE.md si aplica.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Contenido extendido — cargar bajo demanda
|
|
347
|
+
|
|
348
|
+
El contenido de referencia detallada vive en el skill `meta-skills-estandar`
|
|
349
|
+
(cargar con `Skill("meta-skills-estandar")` cuando se necesite):
|
|
350
|
+
|
|
351
|
+
- **Response Discipline** para skills que prescriben comandos.
|
|
352
|
+
- **Anti-substitution Guardrails** para prevenir sustituciones incorrectas.
|
|
353
|
+
- **Campo dual `herramientasPermitidas` / `allowed-tools`**.
|
|
354
|
+
- **Nivel de control de instrucciones** (alto/medio/bajo).
|
|
355
|
+
- **Reglas detalladas para `scripts/` y `recursos/`**.
|
|
356
|
+
- **Anti-patrones al crear skills** (6 anti-patrones con ejemplos MAL/BIEN).
|
|
357
|
+
- **Leyes de diseño de alta señal** (6 leyes con ejemplos).
|
|
358
|
+
- **Principio de idiomas de framework** (tabla para Django, FastAPI, NestJS,
|
|
359
|
+
Spring Boot, Laravel, Rails, Go, Rust).
|
|
360
|
+
- **Mapeo a frameworks de seguridad** (NIST CSF, NIST AI RMF, MITRE ATT&CK,
|
|
361
|
+
ATLAS, D3FEND) — solo aplica a skills del dominio seguridad.
|
|
362
|
+
- **Migración a nombres de campo en español (REC-S15)**.
|
|
363
|
+
|
|
364
|
+
Cargar este skill extendido cuando se esté escribiendo o auditando un SKILL.md
|
|
365
|
+
que requiera patrones avanzados. Para skills simples o consultas básicas, la
|
|
366
|
+
regla core es suficiente.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
*Regla v2.0.0 — 2026-04-23. Split de la v1.0.0 (1040 líneas, 44 KB) en regla
|
|
371
|
+
core (~260 líneas, ~15 KB) + skill extendido `meta-skills-estandar`
|
|
372
|
+
(~287 líneas, ~11 KB). Ahorro en contexto por sesión: ~18 KB cuando no se
|
|
373
|
+
escriben skills activamente.*
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Regla: Testing — Next.js
|
|
2
|
+
|
|
3
|
+
Probar Next.js con App Router requiere estrategia porque existen tres tipos de
|
|
4
|
+
código distintos: Server Components (async, sin estado de React), Client Components
|
|
5
|
+
(con hooks y eventos) y Server Actions (funciones del servidor invocadas desde el cliente).
|
|
6
|
+
Esta regla define cómo cubrir cada uno.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Stack de testing
|
|
11
|
+
|
|
12
|
+
| Herramienta | Propósito |
|
|
13
|
+
|-------------|-----------|
|
|
14
|
+
| **Vitest** | Test runner para unit tests y componentes. Reemplaza Jest en proyectos nuevos. |
|
|
15
|
+
| **React Testing Library** | Renderizado y aserción de componentes. |
|
|
16
|
+
| **Playwright** | Tests end-to-end con browser real. |
|
|
17
|
+
| **MSW (Mock Service Worker)** | Mock de API en tests de integración. |
|
|
18
|
+
|
|
19
|
+
- Configuración de Vitest con soporte de React:
|
|
20
|
+
```ts
|
|
21
|
+
// vitest.config.ts
|
|
22
|
+
import { defineConfig } from 'vitest/config'
|
|
23
|
+
import react from '@vitejs/plugin-react'
|
|
24
|
+
|
|
25
|
+
export default defineConfig({
|
|
26
|
+
plugins: [react()],
|
|
27
|
+
test: {
|
|
28
|
+
environment: 'jsdom',
|
|
29
|
+
globals: true,
|
|
30
|
+
coverage: {
|
|
31
|
+
provider: 'v8',
|
|
32
|
+
thresholds: { lines: 80, functions: 80, branches: 80 },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Cobertura mínima: 80%
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
vitest run --coverage
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- CI falla si algún umbral (líneas, funciones, ramas) cae por debajo del 80%.
|
|
47
|
+
- La cobertura aplica sobre `components/`, `lib/`, `hooks/` y `actions/`.
|
|
48
|
+
No aplica sobre `app/**/page.tsx` ni `app/**/layout.tsx` (solo orquestan).
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Testing de Server Components
|
|
53
|
+
|
|
54
|
+
Los Server Components son funciones `async` que retornan JSX. Se testean
|
|
55
|
+
renderizando el resultado de la función directamente:
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
// components/ResumenFactura.tsx
|
|
59
|
+
export async function ResumenFactura({ facturaId }: { facturaId: number }) {
|
|
60
|
+
const factura = await obtenerFactura(facturaId)
|
|
61
|
+
return (
|
|
62
|
+
<article>
|
|
63
|
+
<h2>{factura.folio}</h2>
|
|
64
|
+
<p>Total: ${factura.total}</p>
|
|
65
|
+
</article>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// components/ResumenFactura.test.tsx
|
|
70
|
+
import { render, screen } from '@testing-library/react'
|
|
71
|
+
import { ResumenFactura } from './ResumenFactura'
|
|
72
|
+
|
|
73
|
+
vi.mock('@/lib/facturas', () => ({
|
|
74
|
+
obtenerFactura: vi.fn().mockResolvedValue({
|
|
75
|
+
id: 1,
|
|
76
|
+
folio: 'FAC-00001',
|
|
77
|
+
total: 1160.0,
|
|
78
|
+
}),
|
|
79
|
+
}))
|
|
80
|
+
|
|
81
|
+
it('muestra el folio y total de la factura', async () => {
|
|
82
|
+
// Arrange + Act
|
|
83
|
+
const componente = await ResumenFactura({ facturaId: 1 })
|
|
84
|
+
render(componente)
|
|
85
|
+
|
|
86
|
+
// Assert
|
|
87
|
+
expect(screen.getByText('FAC-00001')).toBeInTheDocument()
|
|
88
|
+
expect(screen.getByText('Total: $1160')).toBeInTheDocument()
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Testing de Client Components con React Testing Library
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
// components/FormularioLogin.test.tsx
|
|
98
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
99
|
+
import userEvent from '@testing-library/user-event'
|
|
100
|
+
import { FormularioLogin } from './FormularioLogin'
|
|
101
|
+
|
|
102
|
+
describe('FormularioLogin', () => {
|
|
103
|
+
it('muestra error cuando el email tiene formato inválido', async () => {
|
|
104
|
+
// Arrange
|
|
105
|
+
const usuario = userEvent.setup()
|
|
106
|
+
render(<FormularioLogin />)
|
|
107
|
+
|
|
108
|
+
// Act
|
|
109
|
+
await usuario.type(screen.getByLabelText('Correo electrónico'), 'no-es-email')
|
|
110
|
+
await usuario.click(screen.getByRole('button', { name: /iniciar sesión/i }))
|
|
111
|
+
|
|
112
|
+
// Assert
|
|
113
|
+
await waitFor(() => {
|
|
114
|
+
expect(screen.getByRole('alert')).toHaveTextContent('Correo inválido')
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## MSW para mock de API en integración
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
// tests/mocks/handlers.ts
|
|
126
|
+
import { http, HttpResponse } from 'msw'
|
|
127
|
+
|
|
128
|
+
export const handlers = [
|
|
129
|
+
http.get('/api/facturas', () => {
|
|
130
|
+
return HttpResponse.json({
|
|
131
|
+
data: [{ id: 1, folio: 'FAC-001', total: 580.0 }],
|
|
132
|
+
meta: { total: 1, page: 1, per_page: 20 },
|
|
133
|
+
})
|
|
134
|
+
}),
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
// tests/setup.ts
|
|
138
|
+
import { setupServer } from 'msw/node'
|
|
139
|
+
import { handlers } from './mocks/handlers'
|
|
140
|
+
|
|
141
|
+
export const server = setupServer(...handlers)
|
|
142
|
+
beforeAll(() => server.listen())
|
|
143
|
+
afterEach(() => server.resetHandlers())
|
|
144
|
+
afterAll(() => server.close())
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Playwright para E2E
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
// e2e/facturas.spec.ts
|
|
153
|
+
import { test, expect } from '@playwright/test'
|
|
154
|
+
|
|
155
|
+
test('usuario puede emitir una factura', async ({ page }) => {
|
|
156
|
+
// Arrange — iniciar sesión
|
|
157
|
+
await page.goto('/login')
|
|
158
|
+
await page.fill('[name="email"]', 'admin@empresa.com')
|
|
159
|
+
await page.fill('[name="password"]', 'password-de-test')
|
|
160
|
+
await page.click('button[type="submit"]')
|
|
161
|
+
|
|
162
|
+
// Act
|
|
163
|
+
await page.goto('/facturas/nueva')
|
|
164
|
+
await page.selectOption('[name="clienteId"]', '1')
|
|
165
|
+
await page.click('button:has-text("Emitir factura")')
|
|
166
|
+
|
|
167
|
+
// Assert
|
|
168
|
+
await expect(page.locator('[data-testid="folio-factura"]')).toBeVisible()
|
|
169
|
+
await expect(page.locator('[data-testid="estatus-factura"]')).toHaveText('Emitida')
|
|
170
|
+
})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Snapshot testing: solo componentes estables
|
|
176
|
+
|
|
177
|
+
- Los snapshots de componentes se desactualizan con cada cambio de UI y generan
|
|
178
|
+
ruido en los diffs. Usar solo para componentes de diseño muy estables.
|
|
179
|
+
- Preferir aserciones explícitas con `getByRole`, `getByText`, `getByLabelText`.
|
|
180
|
+
- Si se usa snapshot: revisar el diff antes de hacer `--updateSnapshot`. No aceptar
|
|
181
|
+
ciegamente.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Checklist de testing antes de merge
|
|
186
|
+
|
|
187
|
+
- [ ] `vitest run --coverage` pasa con umbral 80%
|
|
188
|
+
- [ ] Server Components testeados con mock de sus dependencias de datos
|
|
189
|
+
- [ ] Client Components testeados con React Testing Library y `userEvent`
|
|
190
|
+
- [ ] MSW configurado para mocks de API en tests de integración
|
|
191
|
+
- [ ] Al menos 1 test E2E con Playwright por flujo crítico nuevo
|
|
192
|
+
- [ ] Sin `setTimeout` ni `sleep` en tests (usar `waitFor` de RTL)
|
|
193
|
+
- [ ] Snapshot tests solo en componentes explícitamente marcados como estables
|