@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,238 @@
|
|
|
1
|
+
# Regla: Estilo de Código Swift
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA para todo código Swift nuevo o modificado.
|
|
4
|
+
Swift moderno (6+) tiene un sistema de tipos y un modelo de concurrencia diseñados
|
|
5
|
+
para eliminar clases enteras de bugs. Usarlos correctamente no es opcional.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Linters obligatorios: SwiftFormat y SwiftLint
|
|
10
|
+
|
|
11
|
+
- **SwiftFormat** aplica formato consistente automáticamente. Corre en CI como verificación bloqueante.
|
|
12
|
+
- **SwiftLint** detecta anti-patrones, violaciones de estilo y código peligroso.
|
|
13
|
+
- Configurar el build phase de Xcode para correr SwiftLint al compilar.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Instalación vía Homebrew
|
|
17
|
+
brew install swiftformat swiftlint
|
|
18
|
+
|
|
19
|
+
# .swiftformat — configuración base
|
|
20
|
+
--indent 4
|
|
21
|
+
--linebreaks lf
|
|
22
|
+
--maxwidth 120
|
|
23
|
+
--wraparguments before-first
|
|
24
|
+
--closingparen balanced
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
# .swiftlint.yml
|
|
29
|
+
opt_in_rules:
|
|
30
|
+
- force_unwrapping
|
|
31
|
+
- implicitly_unwrapped_optional
|
|
32
|
+
- missing_docs
|
|
33
|
+
disabled_rules:
|
|
34
|
+
- todo
|
|
35
|
+
excluded:
|
|
36
|
+
- Pods
|
|
37
|
+
- .build
|
|
38
|
+
line_length: 120
|
|
39
|
+
function_body_length:
|
|
40
|
+
warning: 40
|
|
41
|
+
error: 50
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## let sobre var: inmutabilidad por defecto
|
|
47
|
+
|
|
48
|
+
Declarar `let` siempre que el valor no cambie. `var` solo cuando la mutación es necesaria.
|
|
49
|
+
|
|
50
|
+
```swift
|
|
51
|
+
// MAL — var donde el valor nunca se reasigna
|
|
52
|
+
var nombre = "Juan"
|
|
53
|
+
var total = calcularTotal(items)
|
|
54
|
+
|
|
55
|
+
// BIEN — let comunica inmutabilidad
|
|
56
|
+
let nombre = "Juan"
|
|
57
|
+
let total = calcularTotal(items)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## struct con value semantics, class solo para referencias
|
|
63
|
+
|
|
64
|
+
En Swift, `struct` es el tipo por defecto. Usar `class` solo cuando se necesita
|
|
65
|
+
semántica de referencia (ciclo de vida compartido, herencia obligatoria).
|
|
66
|
+
|
|
67
|
+
```swift
|
|
68
|
+
// BIEN — struct para modelos de datos
|
|
69
|
+
struct Pedido {
|
|
70
|
+
let id: UUID
|
|
71
|
+
let items: [ItemPedido]
|
|
72
|
+
let total: Decimal
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// BIEN — class cuando se necesita referencia compartida
|
|
76
|
+
final class GestorConexion {
|
|
77
|
+
private var conexion: URLSession
|
|
78
|
+
// El gestor se pasa por referencia a múltiples servicios
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// MAL — class donde struct es suficiente
|
|
82
|
+
class UsuarioDto {
|
|
83
|
+
var nombre: String
|
|
84
|
+
var email: String
|
|
85
|
+
init(nombre: String, email: String) { ... }
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Swift 6: actors para estado compartido entre tareas
|
|
92
|
+
|
|
93
|
+
Los `actor`s garantizan acceso exclusivo a su estado. Reemplaza locks, DispatchQueues
|
|
94
|
+
y toda sincronización manual para datos compartidos entre tareas concurrentes.
|
|
95
|
+
|
|
96
|
+
```swift
|
|
97
|
+
// MAL — clase con estado mutable compartido entre hilos (data race)
|
|
98
|
+
class Cache {
|
|
99
|
+
private var datos: [String: Data] = [:]
|
|
100
|
+
func guardar(_ data: Data, clave: String) { datos[clave] = data }
|
|
101
|
+
func obtener(clave: String) -> Data? { datos[clave] }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// BIEN — actor: acceso sincronizado por el compilador
|
|
105
|
+
actor Cache {
|
|
106
|
+
private var datos: [String: Data] = [:]
|
|
107
|
+
func guardar(_ data: Data, clave: String) { datos[clave] = data }
|
|
108
|
+
func obtener(clave: String) -> Data? { datos[clave] }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Uso — el compilador fuerza await para accesos al actor
|
|
112
|
+
let cache = Cache()
|
|
113
|
+
await cache.guardar(data, clave: "perfil")
|
|
114
|
+
let perfil = await cache.obtener(clave: "perfil")
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Concurrencia estructurada: async/await sobre Combine
|
|
120
|
+
|
|
121
|
+
En código nuevo, preferir `async/await` sobre Combine.
|
|
122
|
+
Combine se mantiene para flujos reactivos UI complejos o cuando la base de código
|
|
123
|
+
ya lo usa extensamente.
|
|
124
|
+
|
|
125
|
+
```swift
|
|
126
|
+
// MAL — Combine para una sola operación asíncrona (sobre-ingeniería)
|
|
127
|
+
func obtenerUsuario(id: UUID) -> AnyPublisher<Usuario, Error> {
|
|
128
|
+
URLSession.shared.dataTaskPublisher(for: url)
|
|
129
|
+
.map(\.data)
|
|
130
|
+
.decode(type: Usuario.self, decoder: JSONDecoder())
|
|
131
|
+
.eraseToAnyPublisher()
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// BIEN — async/await: lineal, legible, con propagación de errores tipada
|
|
135
|
+
func obtenerUsuario(id: UUID) async throws -> Usuario {
|
|
136
|
+
let (data, _) = try await URLSession.shared.data(from: url)
|
|
137
|
+
return try JSONDecoder().decode(Usuario.self, from: data)
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## guard let para early return (no if let anidados)
|
|
144
|
+
|
|
145
|
+
```swift
|
|
146
|
+
// MAL — pirámide de la muerte con if let anidados
|
|
147
|
+
func procesarPedido(datos: [String: Any]?) {
|
|
148
|
+
if let datos = datos {
|
|
149
|
+
if let idString = datos["id"] as? String {
|
|
150
|
+
if let id = UUID(uuidString: idString) {
|
|
151
|
+
// lógica principal al nivel 3 de anidamiento
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// BIEN — guard let: early return, lógica principal al nivel 0
|
|
158
|
+
func procesarPedido(datos: [String: Any]?) {
|
|
159
|
+
guard let datos = datos else { return }
|
|
160
|
+
guard let idString = datos["id"] as? String else { return }
|
|
161
|
+
guard let id = UUID(uuidString: idString) else {
|
|
162
|
+
logger.warning("ID inválido en datos de pedido")
|
|
163
|
+
return
|
|
164
|
+
}
|
|
165
|
+
// lógica principal aquí, sin anidamiento
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Sendable para tipos compartidos entre actores
|
|
172
|
+
|
|
173
|
+
Swift 6 hace obligatoria la conformidad con `Sendable` para tipos que cruzan
|
|
174
|
+
fronteras de concurrencia. Los tipos que no son `Sendable` no pueden pasarse
|
|
175
|
+
entre `Task`s o actores sin una copia.
|
|
176
|
+
|
|
177
|
+
```swift
|
|
178
|
+
// BIEN — struct es Sendable por defecto si todos sus campos lo son
|
|
179
|
+
struct Pedido: Sendable {
|
|
180
|
+
let id: UUID
|
|
181
|
+
let total: Decimal
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// BIEN — clase Sendable requiere sincronización interna
|
|
185
|
+
final class ConfiguracionGlobal: @unchecked Sendable {
|
|
186
|
+
private let lock = NSLock()
|
|
187
|
+
private var _configuracion: [String: String] = [:]
|
|
188
|
+
|
|
189
|
+
func obtener(_ clave: String) -> String? {
|
|
190
|
+
lock.withLock { _configuracion[clave] }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Trailing closures solo para el último parámetro
|
|
198
|
+
|
|
199
|
+
```swift
|
|
200
|
+
// MAL — trailing closure cuando no es el último parámetro
|
|
201
|
+
UIView.animate(withDuration: 0.3) {
|
|
202
|
+
self.vista.alpha = 1.0
|
|
203
|
+
} completion: { _ in }
|
|
204
|
+
|
|
205
|
+
// BIEN — trailing closure solo cuando es el último argumento y mejora la legibilidad
|
|
206
|
+
UIView.animate(withDuration: 0.3, animations: {
|
|
207
|
+
self.vista.alpha = 1.0
|
|
208
|
+
}) { _ in
|
|
209
|
+
// completion
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// BIEN — trailing closure natural para el último parámetro
|
|
213
|
+
items.filter { $0.esActivo }
|
|
214
|
+
.map { $0.nombre }
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Límites de tamaño y nombres
|
|
220
|
+
|
|
221
|
+
- Funciones: máxima **40 líneas** (sin contar líneas en blanco y comentarios)
|
|
222
|
+
- Parámetros: máximo **4**. Si se necesitan más, usar un struct de parámetros
|
|
223
|
+
- Tipos (struct/class/enum): `UpperCamelCase`
|
|
224
|
+
- Funciones, propiedades y variables: `lowerCamelCase`
|
|
225
|
+
- Constantes: `lowerCamelCase` (Swift no usa SCREAMING_CASE)
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Checklist de estilo Swift antes de abrir PR
|
|
230
|
+
|
|
231
|
+
- [ ] SwiftFormat aplicado sin errores
|
|
232
|
+
- [ ] SwiftLint pasa con configuración del proyecto
|
|
233
|
+
- [ ] Sin `var` donde `let` es suficiente
|
|
234
|
+
- [ ] `struct` para modelos de datos; `class` justificado cuando se usa
|
|
235
|
+
- [ ] Sin `if let` anidados: usar `guard let` con early return
|
|
236
|
+
- [ ] Concurrencia con `async/await`; actores para estado compartido
|
|
237
|
+
- [ ] Sin force unwrap `!` en `src/` (solo en tests con justificación)
|
|
238
|
+
- [ ] Funciones <= 40 líneas
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Regla: Hooks de Calidad para Swift
|
|
2
|
+
|
|
3
|
+
Esta regla define las verificaciones automáticas obligatorias que corren en cada
|
|
4
|
+
commit y merge para código Swift. SwiftFormat y SwiftLint detectan en segundos
|
|
5
|
+
errores que de otro modo llegan a code review o a producción.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## SwiftFormat antes de commit (pre-commit hook)
|
|
10
|
+
|
|
11
|
+
SwiftFormat aplica formato de manera determinista. El hook corre en modo de formato
|
|
12
|
+
y falla si el archivo queda con cambios sin stagear (significa que había diferencias).
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
#!/bin/sh
|
|
16
|
+
# .git/hooks/pre-commit
|
|
17
|
+
|
|
18
|
+
SWIFT_FILES=$(git diff --cached --name-only | grep "\.swift$")
|
|
19
|
+
|
|
20
|
+
if [ -z "$SWIFT_FILES" ]; then
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
echo "Ejecutando SwiftFormat..."
|
|
25
|
+
echo "$SWIFT_FILES" | xargs swiftformat --config .swiftformat
|
|
26
|
+
|
|
27
|
+
# Si SwiftFormat modificó archivos, abortar para que el dev revise
|
|
28
|
+
if ! git diff --quiet; then
|
|
29
|
+
echo "SwiftFormat modificó archivos. Revisa los cambios y vuelve a hacer commit:"
|
|
30
|
+
git diff --name-only
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
echo "SwiftFormat: OK"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Configuración base `.swiftformat` del proyecto:
|
|
37
|
+
```
|
|
38
|
+
--indent 4
|
|
39
|
+
--linebreaks lf
|
|
40
|
+
--maxwidth 120
|
|
41
|
+
--wraparguments before-first
|
|
42
|
+
--closingparen balanced
|
|
43
|
+
--semicolons never
|
|
44
|
+
--trailingCommas always
|
|
45
|
+
--importgrouping testable-bottom
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## SwiftLint --strict antes de commit
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Pre-commit — continua del hook anterior
|
|
54
|
+
echo "Ejecutando SwiftLint..."
|
|
55
|
+
echo "$SWIFT_FILES" | xargs swiftlint lint --strict --config .swiftlint.yml
|
|
56
|
+
|
|
57
|
+
if [ $? -ne 0 ]; then
|
|
58
|
+
echo "SwiftLint encontro violaciones. Corregir antes de hacer commit."
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
echo "SwiftLint: OK"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Configuración crítica en `.swiftlint.yml` que NUNCA debe desactivarse:
|
|
65
|
+
```yaml
|
|
66
|
+
opt_in_rules:
|
|
67
|
+
- force_unwrapping # detecta ! en producción
|
|
68
|
+
- force_try # detecta try! en producción
|
|
69
|
+
- force_cast # detecta as! en producción
|
|
70
|
+
- implicitly_unwrapped_optional
|
|
71
|
+
- discouraged_optional_boolean
|
|
72
|
+
|
|
73
|
+
custom_rules:
|
|
74
|
+
no_print:
|
|
75
|
+
name: "No print en producción"
|
|
76
|
+
regex: '^\s*print\('
|
|
77
|
+
message: "Usar Logger del proyecto en lugar de print()"
|
|
78
|
+
severity: error
|
|
79
|
+
excluded: ".*Tests.*\\.swift"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## swift build antes de merge (CI obligatorio)
|
|
85
|
+
|
|
86
|
+
El build completo con tests corre en CI antes de aprobar cualquier merge.
|
|
87
|
+
El pipeline bloqueante en GitHub Actions:
|
|
88
|
+
|
|
89
|
+
```yaml
|
|
90
|
+
# .github/workflows/ci.yml
|
|
91
|
+
name: CI Swift
|
|
92
|
+
|
|
93
|
+
on: [push, pull_request]
|
|
94
|
+
|
|
95
|
+
jobs:
|
|
96
|
+
build-and-test:
|
|
97
|
+
runs-on: macos-14
|
|
98
|
+
steps:
|
|
99
|
+
- uses: actions/checkout@v4
|
|
100
|
+
|
|
101
|
+
- name: SwiftLint
|
|
102
|
+
run: swiftlint lint --strict
|
|
103
|
+
|
|
104
|
+
- name: SwiftFormat (verificación)
|
|
105
|
+
run: swiftformat --lint .
|
|
106
|
+
|
|
107
|
+
- name: Build
|
|
108
|
+
run: xcodebuild build-for-testing
|
|
109
|
+
-scheme MiApp
|
|
110
|
+
-destination 'platform=iOS Simulator,name=iPhone 15'
|
|
111
|
+
|
|
112
|
+
- name: Tests
|
|
113
|
+
run: xcodebuild test-without-building
|
|
114
|
+
-scheme MiApp
|
|
115
|
+
-destination 'platform=iOS Simulator,name=iPhone 15'
|
|
116
|
+
-enableCodeCoverage YES
|
|
117
|
+
|
|
118
|
+
- name: Verificar cobertura
|
|
119
|
+
run: |
|
|
120
|
+
COBERTURA=$(xcrun xccov view --report DerivedData/Logs/Test/*.xcresult --json | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['lineCoverage']*100)")
|
|
121
|
+
echo "Cobertura: $COBERTURA%"
|
|
122
|
+
python3 -c "import sys; sys.exit(0 if float('$COBERTURA') >= 80 else 1)"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Detección de print() en código no-test
|
|
128
|
+
|
|
129
|
+
`print()` en producción contamina la consola y puede exponer datos sensibles en logs.
|
|
130
|
+
Solo se permite en archivos que contienen `Tests` en su nombre o ruta.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Script de detección — integrado en pre-commit
|
|
134
|
+
SWIFT_MAIN=$(git diff --cached --name-only | grep "\.swift$" | grep -v -i "test")
|
|
135
|
+
|
|
136
|
+
if [ -n "$SWIFT_MAIN" ]; then
|
|
137
|
+
MATCHES=$(echo "$SWIFT_MAIN" | xargs grep -En "^\s*print\(" 2>/dev/null)
|
|
138
|
+
if [ -n "$MATCHES" ]; then
|
|
139
|
+
echo "ERROR: print() encontrado en código de producción:"
|
|
140
|
+
echo "$MATCHES"
|
|
141
|
+
echo "Usar Logger o os.log en lugar de print()."
|
|
142
|
+
exit 1
|
|
143
|
+
fi
|
|
144
|
+
fi
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Alternativa recomendada al `print()`:
|
|
148
|
+
```swift
|
|
149
|
+
import os.log
|
|
150
|
+
|
|
151
|
+
private let logger = Logger(subsystem: "com.miapp.pedidos", category: "PedidoViewModel")
|
|
152
|
+
|
|
153
|
+
// En lugar de print("Pedido cargado: \(pedido.id)")
|
|
154
|
+
logger.info("Pedido cargado: \(pedido.id, privacy: .public)")
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Detección de force unwrap (!) en src/
|
|
160
|
+
|
|
161
|
+
El force unwrap `!` en producción es equivalente al `!!` de Kotlin: una excepción
|
|
162
|
+
garantizada en el peor momento posible.
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Detección de ! en archivos de producción (excluir tests y comentarios)
|
|
166
|
+
SWIFT_MAIN=$(git diff --cached --name-only | grep "\.swift$" | grep -v -i "test")
|
|
167
|
+
|
|
168
|
+
if [ -n "$SWIFT_MAIN" ]; then
|
|
169
|
+
# Detectar: variable!, as!, try! — excluir !=, !important, comentarios
|
|
170
|
+
MATCHES=$(echo "$SWIFT_MAIN" | xargs grep -En "[a-zA-Z0-9_\)]\![^=]|as\!|try\!" 2>/dev/null \
|
|
171
|
+
| grep -v "//.*!" \
|
|
172
|
+
| grep -v "^\s*//" )
|
|
173
|
+
if [ -n "$MATCHES" ]; then
|
|
174
|
+
echo "ERROR: Force unwrap (!) encontrado en código de producción:"
|
|
175
|
+
echo "$MATCHES"
|
|
176
|
+
echo "Usar guard let, if let, o try? con manejo explícito del nil/error."
|
|
177
|
+
exit 1
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
SwiftLint con `force_unwrapping`, `force_try` y `force_cast` en `opt_in_rules`
|
|
183
|
+
también detecta estos casos.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Detección de fatalError en código no-test
|
|
188
|
+
|
|
189
|
+
`fatalError()` termina la app inmediatamente. Solo se acepta en:
|
|
190
|
+
- Tests (para indicar setup incorrecto)
|
|
191
|
+
- Casos que son literalmente imposibles y son errores de programación (no errores de runtime)
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Detección de fatalError en producción
|
|
195
|
+
SWIFT_MAIN=$(git diff --cached --name-only | grep "\.swift$" | grep -v -i "test")
|
|
196
|
+
|
|
197
|
+
if [ -n "$SWIFT_MAIN" ]; then
|
|
198
|
+
MATCHES=$(echo "$SWIFT_MAIN" | xargs grep -En "fatalError\(" 2>/dev/null | grep -v "//.*fatalError")
|
|
199
|
+
if [ -n "$MATCHES" ]; then
|
|
200
|
+
echo "ADVERTENCIA: fatalError() encontrado en código de producción:"
|
|
201
|
+
echo "$MATCHES"
|
|
202
|
+
echo "Considerar lanzar un error tipado o usar preconditionFailure() con justificación."
|
|
203
|
+
# exit 1 — cambiar a error si el proyecto tiene política estricta
|
|
204
|
+
fi
|
|
205
|
+
fi
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Configuración de pre-commit con pre-commit framework
|
|
211
|
+
|
|
212
|
+
Para equipos que prefieren una herramienta declarativa:
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
# .pre-commit-config.yaml
|
|
216
|
+
repos:
|
|
217
|
+
- repo: local
|
|
218
|
+
hooks:
|
|
219
|
+
- id: swiftformat
|
|
220
|
+
name: SwiftFormat
|
|
221
|
+
entry: swiftformat
|
|
222
|
+
language: system
|
|
223
|
+
types: [swift]
|
|
224
|
+
args: [--config, .swiftformat]
|
|
225
|
+
|
|
226
|
+
- id: swiftlint
|
|
227
|
+
name: SwiftLint
|
|
228
|
+
entry: swiftlint
|
|
229
|
+
language: system
|
|
230
|
+
types: [swift]
|
|
231
|
+
args: [lint, --strict, --config, .swiftlint.yml]
|
|
232
|
+
|
|
233
|
+
- id: no-print
|
|
234
|
+
name: No print() en producción
|
|
235
|
+
entry: bash -c 'grep -En "^\s*print\(" "$@" | grep -v "test" && exit 1 || exit 0'
|
|
236
|
+
language: system
|
|
237
|
+
types: [swift]
|
|
238
|
+
|
|
239
|
+
- id: no-force-unwrap
|
|
240
|
+
name: No force unwrap en producción
|
|
241
|
+
entry: bash -c 'grep -En "[a-zA-Z0-9_\)]\![^=]" "$@" | grep -v "test" | grep -v "//.*!" && exit 1 || exit 0'
|
|
242
|
+
language: system
|
|
243
|
+
types: [swift]
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Checklist de hooks Swift
|
|
249
|
+
|
|
250
|
+
- [ ] SwiftFormat configurado y corriendo en pre-commit
|
|
251
|
+
- [ ] SwiftLint con `--strict` en pre-commit
|
|
252
|
+
- [ ] `force_unwrapping`, `force_try`, `force_cast` en `opt_in_rules` de SwiftLint
|
|
253
|
+
- [ ] swift build y tests corren en CI antes de aprobar merge
|
|
254
|
+
- [ ] Detección de `print()` activa para `src/` (excluye tests)
|
|
255
|
+
- [ ] Detección de `!` (force unwrap) activa para `src/`
|
|
256
|
+
- [ ] Detección de `fatalError()` activa (al menos como advertencia)
|
|
257
|
+
- [ ] pre-commit o lefthook instalado y versionado en el repositorio
|