@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,290 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: filament-admin
|
|
3
|
+
description: >
|
|
4
|
+
Laravel Filament v3: optimización de paneles admin, formularios con Tabs y
|
|
5
|
+
Grid, Infolist para vistas de detalle, Tables con filtros avanzados y bulk
|
|
6
|
+
actions, Resources con relaciones anidadas. Cargar cuando se construya o
|
|
7
|
+
rediseñe un panel Filament, se implementen formularios complejos, tablas con
|
|
8
|
+
filtros o Resources con relaciones.
|
|
9
|
+
version: "1.0.0"
|
|
10
|
+
herramientasPermitidas: [Read, Grep]
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
exclusiones:
|
|
13
|
+
- "No cargar para paneles admin genéricos sin Filament (Nova, Voyager, backpack) — cada panel tiene su propia API; cargar el skill del framework correspondiente."
|
|
14
|
+
- "No cargar para formularios frontend en la app pública de Laravel (Livewire sin Filament, Inertia/Vue) — para formularios de usuario final cargar `livewire-avanzado` o el skill del framework JS."
|
|
15
|
+
- "No cargar para migración de datos o seeds de base de datos en proyectos Laravel — para migraciones y seeds cargar `postgresql-experto` o el skill del ORM."
|
|
16
|
+
- "No cargar para autenticación y autorización en Laravel sin relación con paneles Filament — para auth cargar `auth-patrones` o `laravel-auth`."
|
|
17
|
+
---
|
|
18
|
+
# Filament Admin v3 — Paneles, Formularios y Tablas
|
|
19
|
+
|
|
20
|
+
Skill para construir paneles de administración con Laravel Filament v3.
|
|
21
|
+
Cubre optimización de UX, formularios multi-tab, infolistas de detalle,
|
|
22
|
+
tablas con filtros y acciones masivas.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Cuándo NO cargar
|
|
27
|
+
|
|
28
|
+
- El proyecto usa un panel admin diferente (Nova, Voyager, Backpack): cargar el skill del framework correspondiente.
|
|
29
|
+
- Los formularios son de la app pública del usuario final (Livewire sin Filament, Inertia/Vue): cargar `livewire-avanzado` o el skill del framework JS.
|
|
30
|
+
- La tarea es migración de datos, seeds o esquema de BD sin relación con el panel: cargar `postgresql-experto`.
|
|
31
|
+
- La tarea es autenticación y autorización sin relación con el panel Filament: cargar `auth-patrones`.
|
|
32
|
+
|
|
33
|
+
## Cuándo cargar este skill
|
|
34
|
+
|
|
35
|
+
- Al crear o modificar un `Resource` de Filament (formulario, tabla o infolist)
|
|
36
|
+
- Al implementar formularios con más de 6 campos
|
|
37
|
+
- Al configurar filtros, ordenamiento o bulk actions en tablas
|
|
38
|
+
- Al separar modo vista del modo edición en un panel admin
|
|
39
|
+
- Al implementar relaciones anidadas (`HasMany`, `BelongsToMany`) en Forms o Tables
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 1. Jerarquía de optimización de UX (en orden de impacto)
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
1. Separar en Tabs secciones distintas → 60% menos scroll
|
|
47
|
+
2. Grid::make(2) o Grid::make(3) dentro de sección → campos legibles en paralelo
|
|
48
|
+
3. Collapsible en secciones secundarias → foco en lo importante
|
|
49
|
+
4. Infolist separado del formulario → modo lectura sin inputs desactivados
|
|
50
|
+
5. Repeater con itemLabel → listas identificables
|
|
51
|
+
6. Placeholder para campos vacíos frecuentes → contexto sin campos en blanco
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 2. Formulario con Tabs optimizados
|
|
57
|
+
|
|
58
|
+
```php
|
|
59
|
+
use Filament\Forms\Components\{Tabs, Grid, TextInput, Select, Toggle, Section, Placeholder};
|
|
60
|
+
|
|
61
|
+
public static function form(Form $form): Form
|
|
62
|
+
{
|
|
63
|
+
return $form->schema([
|
|
64
|
+
Tabs::make('formulario')
|
|
65
|
+
->tabs([
|
|
66
|
+
Tabs\Tab::make('Datos básicos')
|
|
67
|
+
->icon('heroicon-o-user')
|
|
68
|
+
->schema([
|
|
69
|
+
Grid::make(2)->schema([
|
|
70
|
+
TextInput::make('nombre')
|
|
71
|
+
->required()
|
|
72
|
+
->maxLength(100),
|
|
73
|
+
TextInput::make('email')
|
|
74
|
+
->email()
|
|
75
|
+
->unique(ignoreRecord: true),
|
|
76
|
+
]),
|
|
77
|
+
Grid::make(3)->schema([
|
|
78
|
+
Select::make('rol')
|
|
79
|
+
->options(Rol::class)
|
|
80
|
+
->searchable()
|
|
81
|
+
->preload(),
|
|
82
|
+
Select::make('empresa_id')
|
|
83
|
+
->relationship('empresa', 'nombre')
|
|
84
|
+
->searchable()
|
|
85
|
+
->preload(),
|
|
86
|
+
Toggle::make('activo')
|
|
87
|
+
->default(true),
|
|
88
|
+
]),
|
|
89
|
+
]),
|
|
90
|
+
|
|
91
|
+
Tabs\Tab::make('Configuración')
|
|
92
|
+
->icon('heroicon-o-cog-6-tooth')
|
|
93
|
+
->schema([
|
|
94
|
+
Section::make('Notificaciones')
|
|
95
|
+
->collapsible()
|
|
96
|
+
->collapsed()
|
|
97
|
+
->schema([
|
|
98
|
+
Toggle::make('notif_email')->label('Por correo'),
|
|
99
|
+
Toggle::make('notif_sms')->label('Por SMS'),
|
|
100
|
+
]),
|
|
101
|
+
]),
|
|
102
|
+
|
|
103
|
+
Tabs\Tab::make('Historial')
|
|
104
|
+
->icon('heroicon-o-clock')
|
|
105
|
+
->schema([
|
|
106
|
+
Placeholder::make('creado_en')
|
|
107
|
+
->label('Registrado')
|
|
108
|
+
->content(fn ($record) => $record?->created_at?->diffForHumans() ?? '—'),
|
|
109
|
+
Placeholder::make('ultimo_acceso')
|
|
110
|
+
->content(fn ($record) => $record?->last_login_at?->format('d/m/Y H:i') ?? 'Nunca'),
|
|
111
|
+
]),
|
|
112
|
+
])
|
|
113
|
+
->columnSpanFull(),
|
|
114
|
+
]);
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 3. Infolist para modo vista (separar del formulario)
|
|
121
|
+
|
|
122
|
+
No desactivar inputs para modo lectura. Usar `Infolist` como método dedicado.
|
|
123
|
+
|
|
124
|
+
```php
|
|
125
|
+
use Filament\Infolists\Components\{TextEntry, Section, Grid, IconEntry};
|
|
126
|
+
|
|
127
|
+
public static function infolist(Infolist $infolist): Infolist
|
|
128
|
+
{
|
|
129
|
+
return $infolist->schema([
|
|
130
|
+
Grid::make(3)->schema([
|
|
131
|
+
Section::make('Información personal')->schema([
|
|
132
|
+
TextEntry::make('nombre')->label('Nombre completo'),
|
|
133
|
+
TextEntry::make('email')->copyable(),
|
|
134
|
+
IconEntry::make('activo')
|
|
135
|
+
->boolean()
|
|
136
|
+
->trueColor('success')
|
|
137
|
+
->falseColor('danger'),
|
|
138
|
+
])->columnSpan(2),
|
|
139
|
+
|
|
140
|
+
Section::make('Estadísticas')->schema([
|
|
141
|
+
TextEntry::make('ordenes_count')
|
|
142
|
+
->label('Órdenes')
|
|
143
|
+
->badge()
|
|
144
|
+
->color('primary'),
|
|
145
|
+
TextEntry::make('total_facturado')
|
|
146
|
+
->label('Total facturado')
|
|
147
|
+
->money('MXN'),
|
|
148
|
+
])->columnSpan(1),
|
|
149
|
+
]),
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 4. Table con filtros y bulk actions
|
|
157
|
+
|
|
158
|
+
```php
|
|
159
|
+
use Filament\Tables\Columns\{TextColumn, BadgeColumn, IconColumn};
|
|
160
|
+
use Filament\Tables\Filters\{SelectFilter, TernaryFilter};
|
|
161
|
+
use Filament\Tables\Actions\BulkAction;
|
|
162
|
+
use Illuminate\Support\Collection;
|
|
163
|
+
|
|
164
|
+
public static function table(Table $table): Table
|
|
165
|
+
{
|
|
166
|
+
return $table
|
|
167
|
+
->columns([
|
|
168
|
+
TextColumn::make('nombre')->searchable()->sortable(),
|
|
169
|
+
TextColumn::make('empresa.nombre')->searchable()->toggleable(),
|
|
170
|
+
BadgeColumn::make('rol')
|
|
171
|
+
->colors([
|
|
172
|
+
'primary' => 'admin',
|
|
173
|
+
'success' => 'usuario',
|
|
174
|
+
'warning' => 'editor',
|
|
175
|
+
]),
|
|
176
|
+
IconColumn::make('activo')->boolean(),
|
|
177
|
+
TextColumn::make('created_at')
|
|
178
|
+
->dateTime('d/m/Y')
|
|
179
|
+
->sortable()
|
|
180
|
+
->toggleable(isToggledHiddenByDefault: true),
|
|
181
|
+
])
|
|
182
|
+
->filters([
|
|
183
|
+
SelectFilter::make('rol')->options(Rol::class),
|
|
184
|
+
SelectFilter::make('empresa')
|
|
185
|
+
->relationship('empresa', 'nombre')
|
|
186
|
+
->searchable()
|
|
187
|
+
->preload(),
|
|
188
|
+
TernaryFilter::make('activo'),
|
|
189
|
+
])
|
|
190
|
+
->actions([
|
|
191
|
+
Tables\Actions\EditAction::make(),
|
|
192
|
+
Tables\Actions\DeleteAction::make(),
|
|
193
|
+
])
|
|
194
|
+
->bulkActions([
|
|
195
|
+
Tables\Actions\BulkActionGroup::make([
|
|
196
|
+
Tables\Actions\DeleteBulkAction::make(),
|
|
197
|
+
BulkAction::make('activar')
|
|
198
|
+
->label('Activar seleccionados')
|
|
199
|
+
->icon('heroicon-o-check')
|
|
200
|
+
->action(fn (Collection $records) => $records->each->update(['activo' => true]))
|
|
201
|
+
->requiresConfirmation(),
|
|
202
|
+
]),
|
|
203
|
+
])
|
|
204
|
+
->defaultSort('created_at', 'desc')
|
|
205
|
+
->poll('30s');
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 5. Relaciones anidadas — HasMany con Repeater
|
|
212
|
+
|
|
213
|
+
```php
|
|
214
|
+
use Filament\Forms\Components\Repeater;
|
|
215
|
+
|
|
216
|
+
Repeater::make('telefonos')
|
|
217
|
+
->relationship('telefonos')
|
|
218
|
+
->schema([
|
|
219
|
+
Grid::make(2)->schema([
|
|
220
|
+
Select::make('tipo')
|
|
221
|
+
->options(['movil' => 'Móvil', 'oficina' => 'Oficina', 'casa' => 'Casa'])
|
|
222
|
+
->required(),
|
|
223
|
+
TextInput::make('numero')->tel()->required(),
|
|
224
|
+
]),
|
|
225
|
+
])
|
|
226
|
+
->itemLabel(fn (array $state): ?string => $state['numero'] ?? null)
|
|
227
|
+
->collapsible()
|
|
228
|
+
->defaultItems(1)
|
|
229
|
+
->minItems(1),
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 6. Reglas obligatorias
|
|
235
|
+
|
|
236
|
+
| Regla | Justificación | Verificación |
|
|
237
|
+
|-------|--------------|--------------|
|
|
238
|
+
| Tabs cuando formulario > 8 campos | Scroll interminable degrada UX | Contar campos en `form()` |
|
|
239
|
+
| `Grid::make(2+)` dentro de cada sección | Columna única desperdicia espacio horizontal | Revisar que no haya secciones sin Grid |
|
|
240
|
+
| `Infolist` separado para modo vista | `->disabled()` no es modo lectura real | Verificar que existe método `infolist()` en Resources con vista |
|
|
241
|
+
| `->searchable()->preload()` en selects de relación | Sin preload, el dropdown carga vacío | Revisar todo Select con `->relationship()` |
|
|
242
|
+
| `->unique(ignoreRecord: true)` en campos únicos | Sin esto, la edición siempre falla validación | Revisar campos `->unique()` en formularios de edición |
|
|
243
|
+
| `->collapsible()->collapsed()` en secciones secundarias | Reduce ruido visual en el formulario | Secciones de configuración, historial y metadatos |
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 7. Anti-patrones
|
|
248
|
+
|
|
249
|
+
| MAL | BIEN |
|
|
250
|
+
|-----|------|
|
|
251
|
+
| Formulario de 15 campos en una sola columna | Tabs con Grid::make(2) por sección |
|
|
252
|
+
| `TextInput::make()->disabled()` en modo vista | Método `infolist()` con TextEntry |
|
|
253
|
+
| `Select::make()->relationship()` sin `->preload()` | `->searchable()->preload()` siempre |
|
|
254
|
+
| Hardcodear opciones en Select: `->options(['a' => 'Admin'])` | `->options(Rol::class)` usando Enum |
|
|
255
|
+
| Table con columna de relación sin `->searchable()` | N+1 queries en listados — usar eager loading |
|
|
256
|
+
| `BulkAction` sin `->requiresConfirmation()` en acciones destructivas | Siempre confirmar acciones masivas |
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 8. Checklist de verificación
|
|
261
|
+
|
|
262
|
+
- [ ] Formulario con más de 8 campos usa Tabs
|
|
263
|
+
- [ ] Cada sección tiene Grid::make(2) o Grid::make(3)
|
|
264
|
+
- [ ] Secciones secundarias tienen `->collapsible()->collapsed()`
|
|
265
|
+
- [ ] Resource con vista de detalle implementa `infolist()`
|
|
266
|
+
- [ ] Todos los `Select` con relación usan `->searchable()->preload()`
|
|
267
|
+
- [ ] Campos únicos en edición tienen `->unique(ignoreRecord: true)`
|
|
268
|
+
- [ ] Bulk actions destructivas tienen `->requiresConfirmation()`
|
|
269
|
+
- [ ] Table usa `->defaultSort()` explícito
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 9. Referencias
|
|
274
|
+
|
|
275
|
+
| Tema | Recurso |
|
|
276
|
+
|------|---------|
|
|
277
|
+
| Documentación oficial Forms, Tables, Infolists | [filamentphp.com/docs/3.x](https://filamentphp.com/docs/3.x) |
|
|
278
|
+
| Heroicons para íconos de Tabs y Actions | [heroicons.com](https://heroicons.com) |
|
|
279
|
+
| FluxUI components para UI premium | [fluxui.dev](https://fluxui.dev) |
|
|
280
|
+
| Livewire v3 + Alpine.js integración | [livewire.laravel.com](https://livewire.laravel.com) |
|
|
281
|
+
|
|
282
|
+
## Gotchas / Errores comunes no obvios
|
|
283
|
+
|
|
284
|
+
**`->unique(ignoreRecord: true)` no funciona en formularios de creación cuando el record no existe aún y el campo es único en la BD**: Filament pasa `ignoreRecord: true` para la edición (excluir el propio registro del chequeo), pero en creación este flag no tiene efecto si la regla unique no está configurada correctamente para el modelo. Causa: `ignoreRecord: true` necesita que el Resource tenga acceso al modelo del registro activo. En formularios de creación, el record es `null` y la regla unique valida correctamente, pero si el campo tiene valor `null` en la BD y se permite `nullable`, la validación puede pasar cuando no debería. Fix: usar `->unique(table: 'usuarios', column: 'email', ignorable: fn ($record) => $record)` para asegurarse del comportamiento correcto en creación y edición.
|
|
285
|
+
|
|
286
|
+
**`Select::make()->relationship()->searchable()` hace una query por cada pulsación de tecla sin debounce por defecto**: en producción con tablas grandes (>10,000 registros), el autocompletado del Select dispara una query SQL al servidor en cada keystroke. Con varios usuarios simultáneos, esto satura la BD. Causa: Filament no configura debounce en los selects de relación. Fix: agregar `->searchDebounce(500)` (milisegundos) en todos los Select con `->relationship()` en producción. Verificar con el query log de Laravel (`DB::enableQueryLog()`) cuántas queries se ejecutan al escribir en el campo.
|
|
287
|
+
|
|
288
|
+
**`Infolist` no se actualiza en tiempo real cuando el record cambia en la BD mientras el usuario lo tiene abierto**: Filament usa Livewire para reactividad, pero el `Infolist` carga los datos una sola vez al abrir el panel. Si otro usuario modifica el registro simultáneamente, el primer usuario sigue viendo datos desactualizados sin ninguna advertencia. Causa: los componentes Filament no tienen polling habilitado por defecto. Fix: agregar `->refreshable()` en el `ViewAction` del panel o configurar `->polling('30s')` en el componente de página si la frescura de datos es crítica para el caso de uso.
|
|
289
|
+
|
|
290
|
+
**`BulkAction` en tablas con `->paginated()` aplica la acción solo a los registros de la página actual, no a todos los que coinciden con el filtro**: si el usuario selecciona "todos" en la tabla pero hay filtros aplicados y múltiples páginas, Filament por defecto solo envía los IDs visibles en la página actual. Causa: la selección de "todos" en Filament opera sobre el conjunto paginado, no sobre la query completa. Fix: implementar `->deselectRecordsAfterCompletion()` y procesar la query completa dentro del `->action()` usando el filtro activo directamente en la BD, no la colección recibida por parámetro cuando el volumen puede ser mayor que una página.
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-avanzado
|
|
3
|
+
description: >
|
|
4
|
+
Frontend avanzado: Web Workers, Service Workers, PWA, WebSockets, SSE, IndexedDB,
|
|
5
|
+
Web Components, Shadow DOM, CSS Container Queries, CSS Layers, View Transitions API.
|
|
6
|
+
Patrones de optimización de rendimiento.
|
|
7
|
+
version: "1.1.0"
|
|
8
|
+
evolved: true
|
|
9
|
+
evolved-from: "1.0.0"
|
|
10
|
+
evolved-at: "2026-04-24"
|
|
11
|
+
evolved-by: "aprender"
|
|
12
|
+
evolved-note: "Sección nueva: CSP 'unsafe-inline' como transitorio aceptable con plan de migración a nonce"
|
|
13
|
+
herramientasPermitidas: [Read, Grep]
|
|
14
|
+
evolvable: true # default para skill estandar
|
|
15
|
+
exclusiones:
|
|
16
|
+
- "No cargar para componentes UI estándar con frameworks (React, Angular, Vue) sin necesidad de APIs nativas — para implementación de componentes cargar el skill del framework."
|
|
17
|
+
- "No cargar para diseño responsivo (breakpoints, container queries en Tailwind, mobile-first layouts) — para diseño responsivo cargar `diseno-responsivo`."
|
|
18
|
+
- "No cargar para optimización de bundle (tree shaking, code splitting, Vite, Webpack) — para build optimization cargar el skill del bundler del proyecto."
|
|
19
|
+
- "No cargar para notificaciones push del lado cliente (Push API, Notification API) sin Service Worker completo — para integraciones de notificaciones cargar `notificaciones-multicanal`."
|
|
20
|
+
---
|
|
21
|
+
# Frontend Avanzado — APIs Nativas y Rendimiento
|
|
22
|
+
|
|
23
|
+
## Cuándo NO cargar
|
|
24
|
+
|
|
25
|
+
- La tarea es implementar componentes UI con React, Angular o Vue sin necesitar Web Workers, Service Workers ni IndexedDB: cargar el skill del framework.
|
|
26
|
+
- La tarea es diseño responsivo (breakpoints, Tailwind mobile-first, container queries para layout): cargar `diseno-responsivo`.
|
|
27
|
+
- La tarea es optimización del bundle de build (tree shaking, code splitting, Vite, Webpack): cargar el skill del bundler.
|
|
28
|
+
- La tarea es integración de notificaciones push sin implementar el Service Worker completo: cargar `notificaciones-multicanal`.
|
|
29
|
+
|
|
30
|
+
## Por qué importan las APIs nativas del navegador
|
|
31
|
+
|
|
32
|
+
Los frameworks abstraen muchas APIs del navegador, pero conocerlas directamente permite:
|
|
33
|
+
- Descargar trabajo pesado del hilo principal (Web Workers).
|
|
34
|
+
- Ofrecer experiencias offline (Service Workers + IndexedDB).
|
|
35
|
+
- Actualización en tiempo real sin polling (WebSockets/SSE).
|
|
36
|
+
- Estilos que responden al contenedor, no solo a la pantalla (Container Queries).
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Web Workers — Reglas
|
|
41
|
+
|
|
42
|
+
- Todo cálculo que tome >50ms DEBE ir en un Web Worker.
|
|
43
|
+
- Comunicación tipada con interfaces `MensajeEntrada` / `MensajeSalida`.
|
|
44
|
+
- Reportar progreso para operaciones largas.
|
|
45
|
+
- NUNCA bloquear el hilo principal con operaciones O(n2).
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Service Workers — Estrategias de Caché
|
|
50
|
+
|
|
51
|
+
| Tipo de recurso | Estrategia |
|
|
52
|
+
|----------------|------------|
|
|
53
|
+
| APIs | Network First (fallback a caché) |
|
|
54
|
+
| Recursos estáticos (JS, imágenes) | Cache First |
|
|
55
|
+
| HTML | Stale While Revalidate |
|
|
56
|
+
|
|
57
|
+
Reglas obligatorias:
|
|
58
|
+
- `skipWaiting()` + `clients.claim()` para actualización inmediata.
|
|
59
|
+
- Limpiar cachés viejos en el evento `activate`.
|
|
60
|
+
- Precachear recursos críticos en `install`.
|
|
61
|
+
- Página `/offline.html` como fallback de última instancia.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## WebSockets vs SSE — Cuándo Usar Cuál
|
|
66
|
+
|
|
67
|
+
| Criterio | WebSocket | SSE |
|
|
68
|
+
|----------|-----------|-----|
|
|
69
|
+
| Dirección | Bidireccional | Servidor -> Cliente |
|
|
70
|
+
| Protocolo | ws:// / wss:// | HTTP estándar |
|
|
71
|
+
| Reconexión | Manual | Automática nativa |
|
|
72
|
+
| Complejidad | Mayor | Menor |
|
|
73
|
+
|
|
74
|
+
**Regla**: Si solo necesitas flujo del servidor al cliente, usa SSE. Es más simple.
|
|
75
|
+
|
|
76
|
+
Ambos DEBEN tener:
|
|
77
|
+
- Reconexión automática con backoff exponencial.
|
|
78
|
+
- Manejo de estado (conectando / conectado / desconectado).
|
|
79
|
+
- Cleanup al destruir el componente.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## IndexedDB — Reglas
|
|
84
|
+
|
|
85
|
+
- Esquema versionado con migraciones incrementales en `upgrade`.
|
|
86
|
+
- Índices para queries frecuentes.
|
|
87
|
+
- Patrón offline-first: guardar localmente, sincronizar cuando hay red.
|
|
88
|
+
- NUNCA almacenar datos sensibles sin cifrado adicional.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## CSS Container Queries — Reglas
|
|
93
|
+
|
|
94
|
+
- Preferir container queries sobre media queries para componentes reutilizables.
|
|
95
|
+
- El componente responde a su contenedor, no al viewport.
|
|
96
|
+
- Unidades `cqi` (container query inline) para tipografía fluida dentro del contenedor.
|
|
97
|
+
|
|
98
|
+
```css
|
|
99
|
+
.contenedor { container-type: inline-size; container-name: tarjetas; }
|
|
100
|
+
|
|
101
|
+
@container tarjetas (min-width: 400px) {
|
|
102
|
+
.tarjeta { flex-direction: row; }
|
|
103
|
+
}
|
|
104
|
+
@container tarjetas (max-width: 399px) {
|
|
105
|
+
.tarjeta { flex-direction: column; }
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## CSS Cascade Layers — Reglas
|
|
112
|
+
|
|
113
|
+
- SIEMPRE declarar orden explícito de capas al inicio del archivo.
|
|
114
|
+
- Orden recomendado: `@layer reset, base, componentes, utilidades, sobreescrituras`.
|
|
115
|
+
- Las utilidades siempre ganan sobre componentes (por orden de capa, no especificidad).
|
|
116
|
+
|
|
117
|
+
```css
|
|
118
|
+
@layer reset, base, componentes, utilidades, sobreescrituras;
|
|
119
|
+
|
|
120
|
+
@layer componentes {
|
|
121
|
+
.btn { padding: 0.5rem 1rem; border-radius: 0.25rem; }
|
|
122
|
+
}
|
|
123
|
+
@layer utilidades {
|
|
124
|
+
.hidden { display: none; }
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## View Transitions API — Reglas
|
|
131
|
+
|
|
132
|
+
- SIEMPRE verificar soporte: `if (!("startViewTransition" in document)) return;`
|
|
133
|
+
- Personalizar con `::view-transition-old` y `::view-transition-new`.
|
|
134
|
+
- `view-transition-name` para transiciones específicas de elemento.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Checklist de Revisión
|
|
139
|
+
|
|
140
|
+
- [ ] Cálculos >50ms en Web Worker, no en hilo principal
|
|
141
|
+
- [ ] Service Worker con estrategia correcta por tipo de recurso
|
|
142
|
+
- [ ] IndexedDB con esquema versionado
|
|
143
|
+
- [ ] WebSocket/SSE con reconexión automática y backoff
|
|
144
|
+
- [ ] Container Queries para componentes reutilizables
|
|
145
|
+
- [ ] CSS Layers con orden explícito
|
|
146
|
+
- [ ] View Transitions con fallback
|
|
147
|
+
- [ ] Service Worker actualiza correctamente (`skipWaiting` + `clients.claim`)
|
|
148
|
+
|
|
149
|
+
Para implementaciones completas de cada API (Web Workers, Service Workers, WebSocket, SSE, IndexedDB, View Transitions), ver [recursos/apis-nativas-ejemplos.md](recursos/apis-nativas-ejemplos.md).
|
|
150
|
+
|
|
151
|
+
## Gotchas / Errores comunes no obvios
|
|
152
|
+
|
|
153
|
+
**Un Web Worker falla silenciosamente cuando importa módulos ES que no están disponibles en el contexto del worker**: los Web Workers no tienen acceso al `window`, al DOM ni a módulos que dependan de él. Si el worker importa un módulo que llama a `document.createElement` o `window.fetch` internamente, el worker termina sin mensaje de error visible en la consola principal. Causa: los errores del worker solo se propagan si el código del worker los emite explícitamente. Fix: envolver todo el cuerpo del worker en un `try/catch` y usar `postMessage({ error: e.message })` para reportar fallos al hilo principal. Verificar con `worker.onerror = e => console.error(e)` antes de enviar el primer mensaje.
|
|
154
|
+
|
|
155
|
+
**Service Worker en `skipWaiting` + `clients.claim()` puede forzar una actualización de SW mientras el usuario tiene formularios a medio llenar**: `skipWaiting()` activa el SW nuevo inmediatamente, y `clients.claim()` toma control de todas las pestañas. Si el SW nuevo tiene breaking changes en el caché (versión diferente), las peticiones en vuelo en otras pestañas pueden recibir respuestas inesperadas o el estado local puede quedar inconsistente. Causa: la actualización de SW es asíncrona pero `clients.claim()` es agresivo. Fix: usar `skipWaiting()` solo en SWs que no cambien la estrategia de caché, y comunicar la actualización al cliente con `postMessage({ type: 'SW_UPDATED' })` para que el usuario pueda guardar y recargar voluntariamente.
|
|
156
|
+
|
|
157
|
+
**`IndexedDB` en Safari Private Browsing retorna quota de 0 bytes y cualquier `put()` lanza un error de quota excedida**: Safari en modo privado restringe IndexedDB a 0 bytes disponibles, pero la apertura de la BD (`indexedDB.open()`) no falla — solo las operaciones de escritura. Causa: Safari no comunica el modo privado al API web, y los errores de quota en IDB se lanzan de forma asíncrona en el handler de transacción. Fix: implementar un feature-detect en el `onsuccess` del `open()` intentando una operación de escritura de prueba y manejar el `QuotaExceededError`. Si se detecta, degradar gracefully a `sessionStorage` o a operación solo en memoria con aviso al usuario.
|
|
158
|
+
|
|
159
|
+
**La View Transitions API con `view-transition-name` en listas dinámicas produce transiciones que se solapan si dos elementos tienen el mismo nombre**: si el `view-transition-name` se genera dinámicamente con un valor que puede repetirse (como el tipo de componente en lugar del ID), el browser lanza un error de "duplicate names" y cancela toda la transición sin efecto visual. Causa: la especificación prohíbe tener dos elementos con el mismo `view-transition-name` activos simultáneamente. Fix: usar siempre el ID único del elemento como parte del nombre: `view-transition-name: item-${id}`. Agregar en el CSS `view-transition-name: none` en el `:hover` para deshabilitar la transición del elemento que no se está navegando si hay listas largas.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## CSP con `'unsafe-inline'` es transitorio aceptable; endurecer con nonce
|
|
164
|
+
|
|
165
|
+
### Contexto
|
|
166
|
+
|
|
167
|
+
Content Security Policy (CSP) es un header HTTP que mitiga XSS restringiendo
|
|
168
|
+
qué fuentes de scripts, estilos e imágenes puede cargar el navegador. La
|
|
169
|
+
directiva más estricta es `script-src 'self'` (solo scripts del mismo origen),
|
|
170
|
+
pero muchas UIs legacy o con inyección de estilos dinámicos requieren
|
|
171
|
+
temporalmente `'unsafe-inline'` para funcionar.
|
|
172
|
+
|
|
173
|
+
### Regla
|
|
174
|
+
|
|
175
|
+
`'unsafe-inline'` es **aceptable como paso transitorio** en migraciones hacia
|
|
176
|
+
CSP estricto, **pero nunca como estado final**. Debe venir acompañado de:
|
|
177
|
+
|
|
178
|
+
1. Comentario `TODO: migrar a nonce` en el código que emite el CSP.
|
|
179
|
+
2. Fecha objetivo de remoción (máximo 90 días).
|
|
180
|
+
3. Issue en el tracker referenciando el TODO.
|
|
181
|
+
|
|
182
|
+
### Patrón de migración en 3 fases
|
|
183
|
+
|
|
184
|
+
```python
|
|
185
|
+
# Fase 1 — transitoria: permitir inline con warning claro
|
|
186
|
+
# TODO(2026-07-01): migrar a nonce-based CSP; eliminar 'unsafe-inline'
|
|
187
|
+
# Issue: https://tracker/X-1234
|
|
188
|
+
CSP_TRANSITORIO = "; ".join([
|
|
189
|
+
"default-src 'self'",
|
|
190
|
+
"script-src 'self' 'unsafe-inline'", # ← deuda técnica temporal
|
|
191
|
+
"style-src 'self' 'unsafe-inline'",
|
|
192
|
+
"img-src 'self' data:",
|
|
193
|
+
"connect-src 'self'",
|
|
194
|
+
])
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
# Fase 2 — nonce por request: eliminar 'unsafe-inline' de scripts
|
|
198
|
+
import secrets
|
|
199
|
+
|
|
200
|
+
def construir_csp_con_nonce(nonce: str) -> str:
|
|
201
|
+
return "; ".join([
|
|
202
|
+
"default-src 'self'",
|
|
203
|
+
f"script-src 'self' 'nonce-{nonce}'",
|
|
204
|
+
"style-src 'self' 'unsafe-inline'", # estilos todavía pendientes
|
|
205
|
+
"img-src 'self' data:",
|
|
206
|
+
"connect-src 'self'",
|
|
207
|
+
])
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
# En FastAPI middleware
|
|
211
|
+
@app.middleware("http")
|
|
212
|
+
async def csp_middleware(request: Request, call_next):
|
|
213
|
+
nonce = secrets.token_urlsafe(16)
|
|
214
|
+
request.state.csp_nonce = nonce # disponible para templates
|
|
215
|
+
response = await call_next(request)
|
|
216
|
+
response.headers["Content-Security-Policy"] = construir_csp_con_nonce(nonce)
|
|
217
|
+
return response
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# Template usa el nonce en <script>
|
|
221
|
+
# <script nonce="{{ request.state.csp_nonce }}">...</script>
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
# Fase 3 — final: sin 'unsafe-inline' ni nonce necesario
|
|
225
|
+
CSP_ESTRICTO = "; ".join([
|
|
226
|
+
"default-src 'self'",
|
|
227
|
+
"script-src 'self'",
|
|
228
|
+
"style-src 'self'",
|
|
229
|
+
"img-src 'self' data:",
|
|
230
|
+
"connect-src 'self'",
|
|
231
|
+
])
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Reglas
|
|
235
|
+
|
|
236
|
+
- **Nunca deployar Fase 1 sin fecha de migración a Fase 2/3 comprometida** — sin fecha, la deuda persiste indefinidamente.
|
|
237
|
+
- **`script-src` debe migrar a nonce antes que `style-src`** — los ataques XSS vía `<script>` son mucho más impactantes que vía `<style>`.
|
|
238
|
+
- **El nonce es por-request**, regenerado en cada response. Cachearlo entre requests anula la protección.
|
|
239
|
+
- **Agregar `Content-Security-Policy-Report-Only`** en staging antes de activar en producción para observar violaciones sin romper la UI.
|
|
240
|
+
- **Listar endpoints de report**: `report-uri /csp-report` o `report-to csp-endpoint` para recolectar violaciones y detectar intentos de XSS bloqueados.
|
|
241
|
+
|
|
242
|
+
### Anti-patrón
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
# MAL — 'unsafe-inline' permanente sin TODO ni plan de migración
|
|
246
|
+
CSP = "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
`'unsafe-eval'` es aún más permisivo y habilita ataques de eval() dinámico —
|
|
250
|
+
debe eliminarse inmediatamente, no en fases. `'unsafe-inline'` puede coexistir
|
|
251
|
+
temporalmente.
|
|
252
|
+
|
|
253
|
+
### Frameworks de seguridad
|
|
254
|
+
|
|
255
|
+
- OWASP Top 10 A03:2021 — Injection (XSS).
|
|
256
|
+
- MITRE ATT&CK T1189 — Drive-by Compromise.
|
|
257
|
+
- NIST CSF PR.PS-06 — Communications and control networks are protected.
|