@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,175 @@
|
|
|
1
|
+
# Regla: Estilo de Código — Next.js
|
|
2
|
+
|
|
3
|
+
Aplica a todo código Next.js del proyecto. El App Router introduce un modelo
|
|
4
|
+
mental distinto al Pages Router: los componentes son Server Components por defecto
|
|
5
|
+
y el cliente es la excepción. Estas reglas establecen cuándo cruzar esa frontera
|
|
6
|
+
y cómo mantener el código legible y navegable.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## ESLint + eslint-config-next (obligatorio)
|
|
11
|
+
|
|
12
|
+
- `eslint-config-next` se instala con `create-next-app` y es obligatorio.
|
|
13
|
+
- Ningún PR se aprueba con warnings de ESLint activos.
|
|
14
|
+
- Ejecutar antes de cada commit:
|
|
15
|
+
```bash
|
|
16
|
+
next lint
|
|
17
|
+
```
|
|
18
|
+
- CI falla si `next lint` reporta errores o warnings.
|
|
19
|
+
- Reglas adicionales recomendadas en `.eslintrc.json`:
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"extends": ["next/core-web-vitals"],
|
|
23
|
+
"rules": {
|
|
24
|
+
"no-console": "error",
|
|
25
|
+
"prefer-const": "error"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Prettier como formateador
|
|
33
|
+
|
|
34
|
+
- Prettier define el estilo de formato. No se debate sobre indentado o comillas.
|
|
35
|
+
- Configuración mínima en `.prettierrc`:
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"semi": false,
|
|
39
|
+
"singleQuote": true,
|
|
40
|
+
"tabWidth": 2,
|
|
41
|
+
"trailingComma": "all",
|
|
42
|
+
"printWidth": 100
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
- Ejecutar `prettier --check .` en CI. Bloquear merge si hay diferencias.
|
|
46
|
+
- Integrar con el editor: guardar debe formatear automáticamente.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## App Router como patrón principal
|
|
51
|
+
|
|
52
|
+
- Todo proyecto nuevo usa **App Router** (`app/`). No usar Pages Router (`pages/`)
|
|
53
|
+
para proyectos iniciados con Next.js 13.4+.
|
|
54
|
+
- La migración de Pages a App Router no se hace parcialmente en un PR —
|
|
55
|
+
documentar como ADR si se decide migrar.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## "use client" solo cuando es estrictamente necesario
|
|
60
|
+
|
|
61
|
+
- Los componentes son **Server Components por defecto**. No agregar `"use client"`
|
|
62
|
+
por costumbre o para evitar errores que aún no ocurrieron.
|
|
63
|
+
|
|
64
|
+
**Cuándo SÍ usar `"use client"`:**
|
|
65
|
+
- El componente usa `useState`, `useReducer`, `useContext`
|
|
66
|
+
- El componente usa `useEffect`, `useLayoutEffect`
|
|
67
|
+
- El componente usa event handlers (`onClick`, `onChange`, `onSubmit`)
|
|
68
|
+
- El componente usa APIs del browser (`window`, `document`, `navigator`)
|
|
69
|
+
- El componente usa librerías que solo funcionan en el cliente
|
|
70
|
+
|
|
71
|
+
**Cuándo NO usar `"use client"`:**
|
|
72
|
+
- Solo para hacer fetch de datos (usar Server Component con `async/await`)
|
|
73
|
+
- Solo para leer variables de entorno del servidor
|
|
74
|
+
- Solo para acceder a la BD o servicios internos
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
// MAL — "use client" innecesario para solo mostrar datos
|
|
78
|
+
'use client'
|
|
79
|
+
|
|
80
|
+
export default function ListaFacturas() {
|
|
81
|
+
const [facturas, setFacturas] = useState([])
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
fetch('/api/facturas').then(r => r.json()).then(setFacturas)
|
|
84
|
+
}, [])
|
|
85
|
+
return <ul>{facturas.map(f => <li key={f.id}>{f.folio}</li>)}</ul>
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// BIEN — Server Component, fetch en el servidor
|
|
89
|
+
export default async function ListaFacturas() {
|
|
90
|
+
const facturas = await obtenerFacturas()
|
|
91
|
+
return <ul>{facturas.map(f => <li key={f.id}>{f.folio}</li>)}</ul>
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Convenciones de archivos del App Router
|
|
98
|
+
|
|
99
|
+
| Archivo | Propósito |
|
|
100
|
+
|---------|-----------|
|
|
101
|
+
| `page.tsx` | Ruta pública de la URL |
|
|
102
|
+
| `layout.tsx` | Layout compartido entre páginas del segmento |
|
|
103
|
+
| `loading.tsx` | UI de carga con Suspense automático |
|
|
104
|
+
| `error.tsx` | Boundary de error del segmento (`"use client"` obligatorio) |
|
|
105
|
+
| `not-found.tsx` | UI para `notFound()` |
|
|
106
|
+
| `route.ts` | Route handler (API endpoint) |
|
|
107
|
+
| `middleware.ts` | Middleware (solo en raíz del proyecto) |
|
|
108
|
+
|
|
109
|
+
- NUNCA crear un `page.tsx` con lógica de negocio. `page.tsx` solo orquesta
|
|
110
|
+
componentes y pasa datos.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Metadata API para SEO
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
// MAL — Head component del Pages Router, obsoleto en App Router
|
|
118
|
+
import Head from 'next/head'
|
|
119
|
+
export default function Page() {
|
|
120
|
+
return <><Head><title>Mi página</title></Head>...</>
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// BIEN — Metadata API estática
|
|
124
|
+
export const metadata: Metadata = {
|
|
125
|
+
title: 'Mi página',
|
|
126
|
+
description: 'Descripción de la página',
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// BIEN — Metadata API dinámica
|
|
130
|
+
export async function generateMetadata({ params }): Promise<Metadata> {
|
|
131
|
+
const producto = await obtenerProducto(params.id)
|
|
132
|
+
return { title: producto.nombre }
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Image y Link components obligatorios
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
// MAL — <img> nativo sin optimización
|
|
142
|
+
<img src="/logo.png" alt="Logo" />
|
|
143
|
+
|
|
144
|
+
// BIEN — Image con optimización automática
|
|
145
|
+
import Image from 'next/image'
|
|
146
|
+
<Image src="/logo.png" alt="Logo" width={120} height={40} priority />
|
|
147
|
+
|
|
148
|
+
// MAL — <a> nativo sin prefetch
|
|
149
|
+
<a href="/facturas">Ver facturas</a>
|
|
150
|
+
|
|
151
|
+
// BIEN — Link con prefetch automático
|
|
152
|
+
import Link from 'next/link'
|
|
153
|
+
<Link href="/facturas">Ver facturas</Link>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Longitud máxima: 100 líneas por componente
|
|
159
|
+
|
|
160
|
+
- Un componente que supera 100 líneas hace demasiado. Extraer subcomponentes.
|
|
161
|
+
- Colocar los subcomponentes en el mismo directorio que el componente padre si
|
|
162
|
+
solo se usan ahí. Mover a `components/shared/` solo cuando se reutilizan.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Checklist de estilo antes de hacer commit
|
|
167
|
+
|
|
168
|
+
- [ ] `next lint` pasa sin errores ni warnings
|
|
169
|
+
- [ ] `prettier --check .` pasa sin diferencias
|
|
170
|
+
- [ ] Sin `"use client"` que pueda eliminarse
|
|
171
|
+
- [ ] Imágenes con `<Image>`, no `<img>`
|
|
172
|
+
- [ ] Navegación con `<Link>`, no `<a>`
|
|
173
|
+
- [ ] SEO con Metadata API, no con `<Head>`
|
|
174
|
+
- [ ] Archivos nombrados según convenciones del App Router
|
|
175
|
+
- [ ] Componentes <= 100 líneas
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Regla: Hooks de Pre-commit y CI — Next.js
|
|
2
|
+
|
|
3
|
+
Los hooks de pre-commit y las verificaciones de CI detectan los errores más
|
|
4
|
+
comunes en Next.js App Router: código cliente innecesario, fetch sin caché
|
|
5
|
+
configurado, imágenes sin optimizar y errores de compilación.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## next lint — verificación de linting
|
|
10
|
+
|
|
11
|
+
Ejecutar antes de cada commit:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
next lint
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Si reporta errores o warnings: **bloquear el commit**.
|
|
18
|
+
- La configuración de ESLint debe incluir `next/core-web-vitals` que cubre
|
|
19
|
+
reglas específicas de Next.js sobre Image, Link y rendimiento.
|
|
20
|
+
- En proyectos con monorepo: `next lint --dir apps/web`.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## next build — verificación de compilación
|
|
25
|
+
|
|
26
|
+
En CI, en cada PR:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
next build
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- Si el build falla: **bloquear el merge**.
|
|
33
|
+
- Los errores de TypeScript con `strict: true` también fallan el build.
|
|
34
|
+
El flag `ignoreBuildErrors: true` en `next.config.js` está prohibido en producción.
|
|
35
|
+
- El build también valida que todos los Server Components son correctamente `async`
|
|
36
|
+
y que los `"use client"` no intentan importar módulos solo del servidor.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Detección de console.log en código no-test
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# En hook pre-commit o CI
|
|
44
|
+
git diff --cached --name-only \
|
|
45
|
+
| grep -E '\.(ts|tsx)$' \
|
|
46
|
+
| grep -v '\.test\.' \
|
|
47
|
+
| grep -v '\.spec\.' \
|
|
48
|
+
| grep -v '__tests__' \
|
|
49
|
+
| xargs grep -n 'console\.log\|console\.debug\|console\.warn' 2>/dev/null
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- Si encuentra `console.log` fuera de archivos de test: **bloquear el commit**.
|
|
53
|
+
- `console.error` en catch de errores inesperados es aceptable si viene acompañado
|
|
54
|
+
de un comentario y va a ser reemplazado por el logger del proyecto.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Verificación de "use client" potencialmente innecesario
|
|
59
|
+
|
|
60
|
+
Detectar archivos con `"use client"` que no contienen hooks de estado ni eventos:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Script de verificación — reporta como advertencia, no bloquea
|
|
64
|
+
git diff --cached --name-only | grep '\.tsx$' | while read archivo; do
|
|
65
|
+
if grep -q '"use client"' "$archivo"; then
|
|
66
|
+
if ! grep -qE 'useState|useReducer|useEffect|useRef|onClick|onChange|onSubmit|useContext' "$archivo"; then
|
|
67
|
+
echo "ADVERTENCIA: $archivo tiene \"use client\" pero no usa hooks ni eventos. Verificar si es necesario."
|
|
68
|
+
fi
|
|
69
|
+
fi
|
|
70
|
+
done
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Este check genera **advertencia**, no bloquea. El desarrollador revisa y decide.
|
|
74
|
+
- El revisor del PR verifica la justificación antes de aprobar.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Verificación de fetch() sin configuración de caché
|
|
79
|
+
|
|
80
|
+
En Next.js App Router, un `fetch()` sin configuración de caché usa el valor por
|
|
81
|
+
defecto que puede cambiar entre versiones. Configurar explícitamente:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Detectar fetch sin next: o cache: configurado
|
|
85
|
+
grep -rn "fetch(" app/ lib/ --include='*.ts' --include='*.tsx' \
|
|
86
|
+
| grep -v '\.test\.' \
|
|
87
|
+
| grep -v 'next:\|cache:' \
|
|
88
|
+
| grep -v '// no-cache-ok'
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- Si encuentra `fetch(` sin `{ next: { revalidate: N } }` ni `{ cache: 'no-store' }`:
|
|
92
|
+
**reportar como advertencia en el PR**.
|
|
93
|
+
- El desarrollador agrega la configuración correcta o el comentario `// no-cache-ok`
|
|
94
|
+
con justificación.
|
|
95
|
+
|
|
96
|
+
**Referencia rápida de cuándo usar qué:**
|
|
97
|
+
|
|
98
|
+
| Situación | Configuración |
|
|
99
|
+
|-----------|--------------|
|
|
100
|
+
| Datos que cambian frecuentemente | `{ cache: 'no-store' }` |
|
|
101
|
+
| Datos semi-estáticos (catálogos) | `{ next: { revalidate: 3600 } }` |
|
|
102
|
+
| Datos que cambian por evento | `{ next: { tags: ['nombre-tag'] } }` |
|
|
103
|
+
| Datos completamente estáticos | Sin config (caché indefinido en build) |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Verificación de imágenes sin Image component
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Detectar <img> nativo en archivos TSX (excluir comentarios y strings)
|
|
111
|
+
git diff --cached --name-only | grep '\.tsx$' | xargs grep -n '<img ' 2>/dev/null \
|
|
112
|
+
| grep -v '^\s*//' \
|
|
113
|
+
| grep -v 'data-testid'
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- Si encuentra `<img` en archivos `.tsx`: **bloquear el commit**.
|
|
117
|
+
- Excepción: imágenes dentro de `dangerouslySetInnerHTML` (ya tienen su propio problema).
|
|
118
|
+
- El componente `<Image>` de `next/image` optimiza automáticamente el formato,
|
|
119
|
+
el tamaño y la carga lazy. Usar siempre.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Script de pre-commit completo (referencia)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
#!/usr/bin/env bash
|
|
127
|
+
set -e
|
|
128
|
+
|
|
129
|
+
echo "==> Verificando linting (next lint)..."
|
|
130
|
+
npx next lint --quiet || {
|
|
131
|
+
echo "ERROR: Errores de ESLint. Corregir antes de commitear."
|
|
132
|
+
exit 1
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
echo "==> Verificando formato (Prettier)..."
|
|
136
|
+
npx prettier --check . || {
|
|
137
|
+
echo "ERROR: Hay archivos sin formatear. Ejecutar: npx prettier --write ."
|
|
138
|
+
exit 1
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
echo "==> Verificando console.log fuera de tests..."
|
|
142
|
+
ARCHIVOS=$(git diff --cached --name-only | grep -E '\.(ts|tsx)$' | grep -v '\.test\.\|\.spec\.\|__tests__' || true)
|
|
143
|
+
if [ -n "$ARCHIVOS" ]; then
|
|
144
|
+
if echo "$ARCHIVOS" | xargs grep -ln 'console\.log\|console\.debug' 2>/dev/null; then
|
|
145
|
+
echo "ERROR: Eliminar console.log/debug antes de commitear."
|
|
146
|
+
exit 1
|
|
147
|
+
fi
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
echo "==> Verificando <img> sin next/image..."
|
|
151
|
+
ARCHIVOS_TSX=$(git diff --cached --name-only | grep '\.tsx$' || true)
|
|
152
|
+
if [ -n "$ARCHIVOS_TSX" ]; then
|
|
153
|
+
if echo "$ARCHIVOS_TSX" | xargs grep -ln '<img ' 2>/dev/null; then
|
|
154
|
+
echo "ERROR: Usar <Image> de next/image en lugar de <img>."
|
|
155
|
+
exit 1
|
|
156
|
+
fi
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
echo "==> Pre-commit: OK"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Resumen de qué bloquea qué
|
|
165
|
+
|
|
166
|
+
| Verificación | Pre-commit | CI / PR | Severidad |
|
|
167
|
+
|-------------|-----------|---------|-----------|
|
|
168
|
+
| `next lint` | Bloquea | Bloquea | Error |
|
|
169
|
+
| Prettier | Bloquea | Bloquea | Error |
|
|
170
|
+
| `console.log` | Bloquea | Bloquea | Error |
|
|
171
|
+
| `<img>` nativo | Bloquea | Bloquea | Error |
|
|
172
|
+
| `next build` | No | Bloquea merge | Error |
|
|
173
|
+
| `"use client"` sin hooks | Advertencia | Advertencia | Warning |
|
|
174
|
+
| `fetch()` sin caché config | Advertencia | Advertencia | Warning |
|
|
175
|
+
| `npm audit` HIGH/CRITICAL | No | Bloquea merge | Error |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Checklist de hooks antes de activar en un proyecto nuevo
|
|
180
|
+
|
|
181
|
+
- [ ] `next lint` configurado y ejecutado en pre-commit
|
|
182
|
+
- [ ] Prettier configurado con `.prettierrc` versionado
|
|
183
|
+
- [ ] Script de pre-commit instalado con `husky` o similar
|
|
184
|
+
- [ ] Pipeline de CI tiene los pasos: lint, prettier, build, test, audit
|
|
185
|
+
- [ ] `strict: true` en `tsconfig.json` para que el build detecte errores de tipos
|
|
186
|
+
- [ ] `ignoreBuildErrors` NO está en `next.config.js`
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Regla: Patrones de Arquitectura — Next.js (App Router)
|
|
2
|
+
|
|
3
|
+
El App Router de Next.js cambia fundamentalmente dónde y cómo se cargan datos.
|
|
4
|
+
Estos patrones aprovechan el modelo de Server Components para reducir el JavaScript
|
|
5
|
+
enviado al cliente, mejorar el rendimiento y simplificar la lógica de estado.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Server Components: fetch en el servidor
|
|
10
|
+
|
|
11
|
+
La forma correcta de cargar datos es en el servidor, no en el cliente con `useEffect`.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
// MAL — useEffect para cargar datos (patrón del Pages Router)
|
|
15
|
+
'use client'
|
|
16
|
+
export default function PaginaFacturas() {
|
|
17
|
+
const [facturas, setFacturas] = useState<Factura[]>([])
|
|
18
|
+
const [cargando, setCargando] = useState(true)
|
|
19
|
+
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
fetch('/api/facturas')
|
|
22
|
+
.then(r => r.json())
|
|
23
|
+
.then(data => { setFacturas(data); setCargando(false) })
|
|
24
|
+
}, [])
|
|
25
|
+
|
|
26
|
+
if (cargando) return <p>Cargando...</p>
|
|
27
|
+
return <ListaFacturas facturas={facturas} />
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// BIEN — Server Component, fetch directo en el servidor
|
|
31
|
+
export default async function PaginaFacturas() {
|
|
32
|
+
const facturas = await obtenerFacturas() // llama directamente a la BD o API interna
|
|
33
|
+
return <ListaFacturas facturas={facturas} />
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- `obtenerFacturas()` puede llamar directamente a la BD, a un ORM o a un servicio
|
|
38
|
+
interno. No necesita pasar por una API REST si está en el mismo servidor.
|
|
39
|
+
- Next.js deduplica y cachea las llamadas automáticamente dentro del mismo render.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Server Actions para mutaciones
|
|
44
|
+
|
|
45
|
+
Las mutaciones de datos van en Server Actions, no en Route Handlers cuando
|
|
46
|
+
son invocadas desde formularios o componentes del mismo servidor.
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// app/facturas/actions.ts
|
|
50
|
+
'use server'
|
|
51
|
+
|
|
52
|
+
import { revalidatePath } from 'next/cache'
|
|
53
|
+
import { redirect } from 'next/navigation'
|
|
54
|
+
import { z } from 'zod'
|
|
55
|
+
|
|
56
|
+
const EmitirFacturaSchema = z.object({
|
|
57
|
+
clienteId: z.coerce.number().int().positive(),
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
export async function emitirFactura(formData: FormData) {
|
|
61
|
+
const validado = EmitirFacturaSchema.safeParse({
|
|
62
|
+
clienteId: formData.get('clienteId'),
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
if (!validado.success) {
|
|
66
|
+
return { error: validado.error.flatten().fieldErrors }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
await facturaService.emitir(validado.data.clienteId)
|
|
70
|
+
revalidatePath('/facturas')
|
|
71
|
+
redirect('/facturas')
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- Las Server Actions validan sus inputs server-side con zod. NUNCA asumir que
|
|
76
|
+
el cliente envió datos válidos.
|
|
77
|
+
- `revalidatePath()` o `revalidateTag()` para invalidar el caché después de mutaciones.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Streaming con Suspense
|
|
82
|
+
|
|
83
|
+
- Envolver partes lentas del UI en `<Suspense>` para no bloquear el render completo:
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
import { Suspense } from 'react'
|
|
87
|
+
|
|
88
|
+
export default function Dashboard() {
|
|
89
|
+
return (
|
|
90
|
+
<main>
|
|
91
|
+
<ResumenRapido /> {/* datos rápidos, sin Suspense */}
|
|
92
|
+
<Suspense fallback={<EsqueletoGrafica />}>
|
|
93
|
+
<GraficaVentasMensuales /> {/* query lenta */}
|
|
94
|
+
</Suspense>
|
|
95
|
+
<Suspense fallback={<EsqueletoTabla />}>
|
|
96
|
+
<TablaTopClientes /> {/* query lenta independiente */}
|
|
97
|
+
</Suspense>
|
|
98
|
+
</main>
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- Cada `<Suspense>` permite que los demás componentes se rendericen sin esperar.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## ISR para contenido semi-estático
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
// Revalidar cada hora — ideal para catálogos de productos, precios, etc.
|
|
111
|
+
export const revalidate = 3600
|
|
112
|
+
|
|
113
|
+
// Revalidar bajo demanda con tag
|
|
114
|
+
fetch(url, { next: { tags: ['catalogo-productos'] } })
|
|
115
|
+
|
|
116
|
+
// En una Server Action o Route Handler:
|
|
117
|
+
revalidateTag('catalogo-productos')
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
- Usar ISR para contenido que cambia con menos frecuencia que las visitas.
|
|
121
|
+
- No usar ISR para datos que deben estar en tiempo real (inventario en compra,
|
|
122
|
+
saldo bancario). Para esos casos, `cache: 'no-store'`.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Parallel Routes para dashboards
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
app/dashboard/
|
|
130
|
+
@resumen/
|
|
131
|
+
page.tsx
|
|
132
|
+
@alertas/
|
|
133
|
+
page.tsx
|
|
134
|
+
@actividad/
|
|
135
|
+
page.tsx
|
|
136
|
+
layout.tsx ← recibe los tres slots en paralelo
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
// layout.tsx
|
|
141
|
+
export default function DashboardLayout({
|
|
142
|
+
resumen, alertas, actividad
|
|
143
|
+
}: {
|
|
144
|
+
resumen: React.ReactNode
|
|
145
|
+
alertas: React.ReactNode
|
|
146
|
+
actividad: React.ReactNode
|
|
147
|
+
}) {
|
|
148
|
+
return (
|
|
149
|
+
<div className="grid grid-cols-3 gap-4">
|
|
150
|
+
{resumen}
|
|
151
|
+
{alertas}
|
|
152
|
+
{actividad}
|
|
153
|
+
</div>
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Intercepting Routes para modales
|
|
161
|
+
|
|
162
|
+
- Para modales que muestran contenido de otra ruta sin navegar completamente:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
app/
|
|
166
|
+
facturas/
|
|
167
|
+
page.tsx
|
|
168
|
+
[id]/
|
|
169
|
+
page.tsx ← vista completa de la factura
|
|
170
|
+
@modal/
|
|
171
|
+
(.)facturas/[id]/
|
|
172
|
+
page.tsx ← modal al hacer clic en la lista
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Route Handlers para API endpoints
|
|
178
|
+
|
|
179
|
+
- Usar `route.ts` para endpoints que son consumidos por clientes externos, móvil,
|
|
180
|
+
o por webhooks. No para datos internos del mismo servidor.
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
// app/api/facturas/route.ts
|
|
184
|
+
export async function GET(request: Request) {
|
|
185
|
+
const { searchParams } = new URL(request.url)
|
|
186
|
+
const pagina = Number(searchParams.get('pagina') ?? '1')
|
|
187
|
+
|
|
188
|
+
const facturas = await obtenerFacturasPaginadas(pagina)
|
|
189
|
+
return Response.json(facturas)
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Middleware para auth, redirects, i18n
|
|
196
|
+
|
|
197
|
+
```ts
|
|
198
|
+
// middleware.ts (raíz del proyecto)
|
|
199
|
+
export function middleware(request: NextRequest) {
|
|
200
|
+
const token = request.cookies.get('session')?.value
|
|
201
|
+
|
|
202
|
+
if (!token && request.nextUrl.pathname.startsWith('/app')) {
|
|
203
|
+
return NextResponse.redirect(new URL('/login', request.url))
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export const config = {
|
|
208
|
+
matcher: ['/app/:path*', '/api/:path*'],
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
- El middleware solo lee cookies y headers. No llama a la BD directamente.
|
|
213
|
+
- Para verificación de sesión pesada, usar la función `auth()` del framework
|
|
214
|
+
de autenticación dentro del Server Component, no en el middleware.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Checklist de patrones antes de merge
|
|
219
|
+
|
|
220
|
+
- [ ] Sin `useEffect` para carga de datos que pueden ir en Server Component
|
|
221
|
+
- [ ] Mutaciones en Server Actions con validación zod server-side
|
|
222
|
+
- [ ] Secciones lentas del dashboard envueltas en `<Suspense>`
|
|
223
|
+
- [ ] `revalidatePath` o `revalidateTag` después de toda mutación
|
|
224
|
+
- [ ] Route Handlers solo para APIs externas, no para datos internos
|
|
225
|
+
- [ ] Middleware sin llamadas a BD directas
|