@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,213 @@
|
|
|
1
|
+
# Regla: Harness de Claude Code — disciplina operacional
|
|
2
|
+
|
|
3
|
+
Esta regla aplica al uso operativo de Claude Code (CLI / Desktop / IDE).
|
|
4
|
+
Define las prácticas que protegen la economía de tokens, el cache de prompt y
|
|
5
|
+
la calidad de las respuestas. Origen: artículo "Claude Code's Limits Are
|
|
6
|
+
Generous. The Problem Is Your Harness." más experiencia operativa SWL.
|
|
7
|
+
|
|
8
|
+
El harness es el conjunto de configuración + sesión + tools + modelo que
|
|
9
|
+
rodea a Claude. Anthropic provee el modelo; el harness lo provees tú. Una
|
|
10
|
+
mala disciplina del harness convierte una suscripción Max generosa en
|
|
11
|
+
"se acabó la cuota en 2 días".
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Disciplina del cache de prompt
|
|
16
|
+
|
|
17
|
+
El prompt cache es la palanca económica más grande de Claude Code:
|
|
18
|
+
|
|
19
|
+
- **Cache read**: 0.1× del precio de input (90% de descuento).
|
|
20
|
+
- **Cache write 5min TTL**: 1.25×.
|
|
21
|
+
- **Cache write 1h TTL**: 2× (solo API, no incluido en Pro/Max/Team).
|
|
22
|
+
- **Cache refresh on hit**: gratis (se cobra al precio read).
|
|
23
|
+
|
|
24
|
+
Cada hit en un prefijo cacheado resetea su TTL sin costo. Una sesión larga
|
|
25
|
+
con uso constante de tools mantiene el prefijo caliente indefinidamente
|
|
26
|
+
**siempre que el prefijo no cambie**.
|
|
27
|
+
|
|
28
|
+
### Reglas de cache discipline
|
|
29
|
+
|
|
30
|
+
- **NUNCA agregues o quites MCP servers a mitad de sesión.** Modifica
|
|
31
|
+
`.claude/settings.json` antes de iniciar Claude Code, no durante.
|
|
32
|
+
- **NUNCA uses `/model` a mitad de sesión.** Cambiar de modelo invalida
|
|
33
|
+
el prefijo cacheado y fuerza una re-lectura completa.
|
|
34
|
+
- **NUNCA modifiques la lista de tools permitidos a mitad de sesión.**
|
|
35
|
+
Agregar o quitar tools cambia el prefijo del system prompt.
|
|
36
|
+
- **Lock-at-session-start**: define configuración, modelo, MCP servers y
|
|
37
|
+
tools permitidos antes de iniciar. Si necesitas cambiar algo, abre una
|
|
38
|
+
sesión nueva con `/clear` o cierra y reinicia.
|
|
39
|
+
- **Hit rate sano**: ~90% en el TTL de 5 minutos por defecto. Si el hit
|
|
40
|
+
rate cae por debajo del 80%, hay algo en el harness que invalida el
|
|
41
|
+
prefijo entre turnos.
|
|
42
|
+
|
|
43
|
+
### Cuándo SÍ es OK abrir nueva sesión
|
|
44
|
+
|
|
45
|
+
- Cambio de proyecto / repo.
|
|
46
|
+
- Cambio entre tareas no relacionadas (frontend vs. backend).
|
|
47
|
+
- Tras un turno que salió mal y quiere descartarse (`/rewind` o `/clear`).
|
|
48
|
+
- Cada 30+ turnos en sesiones de exploración para evitar context-rot.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Manejo de contexto
|
|
53
|
+
|
|
54
|
+
### Variables de entorno opt-in (recomendadas para sesiones largas)
|
|
55
|
+
|
|
56
|
+
```jsonc
|
|
57
|
+
// .claude/settings.json (sección env)
|
|
58
|
+
{
|
|
59
|
+
"env": {
|
|
60
|
+
"CLAUDE_CODE_DISABLE_1M_CONTEXT": "1", // forzar 200K en lugar de 1M
|
|
61
|
+
"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "80" // disparar auto-compact al 80%
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- **`CLAUDE_CODE_DISABLE_1M_CONTEXT=1`** desactiva la variante 1M de Opus
|
|
67
|
+
4.7 y vuelve al techo histórico de 200K. Útil cuando el codebase del
|
|
68
|
+
usuario no requiere 1M y se quiere reducir costo de tokens. **NO se
|
|
69
|
+
recomienda como default universal** — solo si el usuario detecta
|
|
70
|
+
context bloat real.
|
|
71
|
+
- **`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=80`** ajusta el umbral del
|
|
72
|
+
auto-compact. Disparar al 80% en lugar del default permite que la
|
|
73
|
+
compactación ocurra antes de que el contexto sature.
|
|
74
|
+
|
|
75
|
+
### Cinco movimientos de sesión
|
|
76
|
+
|
|
77
|
+
- **`/compact` al 50% de uso o tras cada tarea grande.** No esperes al
|
|
78
|
+
auto. La compactación tardía empuja el contexto encima del threshold y
|
|
79
|
+
obliga a recargar prefijo.
|
|
80
|
+
- **`/clear` entre tareas no relacionadas.** Sesión nueva = prefijo
|
|
81
|
+
fresco, sin lastre acumulado.
|
|
82
|
+
- **`/rewind` cuando un turno salió mal.** Más barato que pelear con
|
|
83
|
+
contexto contaminado.
|
|
84
|
+
- **Sub-agentes** para trabajo bulk-mecánico, búsqueda en codebase, o
|
|
85
|
+
procesamiento de archivos grandes (PDF→TLDR). El padre conserva
|
|
86
|
+
contexto limpio.
|
|
87
|
+
- **Tag files con `@`**: en lugar de pedirle a Claude que busque, pásale
|
|
88
|
+
la ruta directamente. `@docs/diseno.md` evita un round-trip de grep.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Routing de modelos y effort
|
|
93
|
+
|
|
94
|
+
### Escoger el modelo al inicio (no a media sesión)
|
|
95
|
+
|
|
96
|
+
- **Sonnet session**: más barato, sin acceso a Opus en el padre. Bueno
|
|
97
|
+
cuando se sabe que el trabajo cabe en Sonnet.
|
|
98
|
+
- **Opus session + delegate**: pagar Opus solo en el padre (planning,
|
|
99
|
+
tradeoffs); delegar trabajo táctico a sub-agentes Sonnet/Haiku. Default
|
|
100
|
+
para trabajo mixto.
|
|
101
|
+
- Cambiar de modelo a media sesión invalida el cache (regla de cache
|
|
102
|
+
discipline arriba). Si necesitas otro modelo, abre nueva sesión.
|
|
103
|
+
|
|
104
|
+
### `/effort` per-prompt (no per-session)
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
/effort low # fixes rápidos, tareas mecánicas
|
|
108
|
+
/effort medium # la mayoría de prompts (gran ahorro vs default)
|
|
109
|
+
/effort high # razonamiento exigente
|
|
110
|
+
/effort xhigh # default para coding agéntico (4.7)
|
|
111
|
+
/effort max # diminishing returns, raramente vale el ~2× costo extra
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
El effort se aplica al **prompt** que lo necesita, no al resto de la
|
|
115
|
+
sesión. Subir a `max` por reflejo en cada turno duplica el costo sin
|
|
116
|
+
mejora observable.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Disciplina de input format
|
|
121
|
+
|
|
122
|
+
Algunos formatos consumen muchos más tokens de los necesarios:
|
|
123
|
+
|
|
124
|
+
- **PDFs**: usar `pdftotext` o `markitdown` ANTES, no el Read tool con
|
|
125
|
+
PDF directo (Read carga PDF como imágenes). Ver `reglas/markitdown.md`.
|
|
126
|
+
- **Páginas web dinámicas**: `agent-browser` (vía accessibility tree)
|
|
127
|
+
reduce ~82% tokens vs Playwright MCP / screenshots.
|
|
128
|
+
- **Repos grandes (>500 archivos)**: considerar `code-review-graph` pip
|
|
129
|
+
(opt-in) que reduce 6.8-49× tokens por review al leer solo blast
|
|
130
|
+
radius. Documentado en `MANUAL_USO.md` sección "Dependencias externas".
|
|
131
|
+
- **Spec prompts > vague prompts**: incluir rutas de archivo, componentes
|
|
132
|
+
esperados, I/O y restricciones. Vago = más turnos = más tokens.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Carga lean de componentes
|
|
137
|
+
|
|
138
|
+
- Desactivar MCP servers no usados en `.claude/settings.json`.
|
|
139
|
+
- Mover reglas largas de CLAUDE.md a skills cargados bajo demanda
|
|
140
|
+
(progressive disclosure SWL ya hace esto).
|
|
141
|
+
- Comandos slash `/swl:*` que no usas no cuestan tokens si no se invocan.
|
|
142
|
+
- Skills oficiales de Anthropic: solo agregar los que aplican al
|
|
143
|
+
proyecto (Office docs solo si trabajas con Office, etc.).
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Anti-patrones
|
|
148
|
+
|
|
149
|
+
- **Invocar Claude Code y luego decidir el modelo**: invalida cache cada
|
|
150
|
+
vez que cambias de opinión.
|
|
151
|
+
- **Agregar un MCP server "temporal" durante la sesión**: el costo de
|
|
152
|
+
invalidar el prefijo cacheado supera lo que el server agrega.
|
|
153
|
+
- **Re-leer manualmente archivos que ya están en contexto**: si Claude
|
|
154
|
+
ya leyó X, pedirle que lo lea de nuevo es token waste.
|
|
155
|
+
- **No usar `/compact` y esperar al auto-compact**: el auto dispara
|
|
156
|
+
TARDE. Compactar proactivamente al 50% es siempre más eficiente.
|
|
157
|
+
- **`/effort max` por reflejo**: 2× costo de xhigh con mejora marginal
|
|
158
|
+
fuera de tareas que requieran razonamiento profundo.
|
|
159
|
+
- **PDFs vía Read tool sin extraer texto antes**: 10× más tokens que
|
|
160
|
+
pasar por `markitdown` o `pdftotext`.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Observabilidad — watch the number
|
|
165
|
+
|
|
166
|
+
SWL incluye:
|
|
167
|
+
|
|
168
|
+
- **`/swl:dashboard`** — dashboard histórico de uso (basado en
|
|
169
|
+
`phuryn/claude-usage`).
|
|
170
|
+
- **`/swl:metricas`** — métricas de la sesión actual (tokens, costo
|
|
171
|
+
estimado, modelos usados).
|
|
172
|
+
- **`hooks/linea-estado.js`** — barra de estado con porcentaje de
|
|
173
|
+
contexto consumido (con detección dinámica del techo según modelo —
|
|
174
|
+
ver fix v5.12.4).
|
|
175
|
+
- **`hooks/monitor-contexto.js`** — alertas WARNING (≥65%) y CRITICAL
|
|
176
|
+
(≥75%) cuando el contexto se llena.
|
|
177
|
+
|
|
178
|
+
Si no ves el hit rate de cache, no puedes optimizarlo. Para uso intenso
|
|
179
|
+
considera dashboard externo en `platform.claude.com/usage/cache` (solo
|
|
180
|
+
API users).
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Checklist de harness antes de empezar una sesión larga
|
|
185
|
+
|
|
186
|
+
- [ ] `.claude/settings.json` con MCP servers necesarios YA configurado
|
|
187
|
+
- [ ] Modelo elegido y bloqueado (no se cambiará durante la sesión)
|
|
188
|
+
- [ ] Tools permitidos definidos en `.claude/settings.json`, no se
|
|
189
|
+
modificarán mid-session
|
|
190
|
+
- [ ] Variables de entorno (`CLAUDE_CODE_DISABLE_1M_CONTEXT`,
|
|
191
|
+
`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE`) configuradas si es sesión larga
|
|
192
|
+
- [ ] CLAUDE.md del proyecto referencia archivos clave para que Claude
|
|
193
|
+
no haga grep innecesario
|
|
194
|
+
- [ ] Para repos grandes: `code-review-graph` instalado (opt-in)
|
|
195
|
+
- [ ] Estrategia de delegación clara: qué se manda a sub-agente y qué
|
|
196
|
+
se mantiene en el padre
|
|
197
|
+
- [ ] PDFs / Office docs serán pre-procesados con `markitdown` antes de
|
|
198
|
+
Read
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Cómo cargar esta regla
|
|
203
|
+
|
|
204
|
+
Esta regla no es de carga obligatoria global. Cargar cuando:
|
|
205
|
+
|
|
206
|
+
- El usuario reporta "se acabó la cuota antes de tiempo".
|
|
207
|
+
- Se diagnostica context-rot u alertas críticas falsas/persistentes.
|
|
208
|
+
- Se prepara una sesión de trabajo larga (>2h) con Opus.
|
|
209
|
+
- Se planifica adopción de MCP servers nuevos en un proyecto.
|
|
210
|
+
|
|
211
|
+
Para detalles operacionales adicionales (workflow de las 5 session moves,
|
|
212
|
+
cuándo usar cada effort level, integración con SWL), cargar también
|
|
213
|
+
`Skill("harness-claude-code")`.
|
package/reglas/hooks.md
ADDED
|
@@ -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,231 @@
|
|
|
1
|
+
# Regla: Estilo de Código — C# / .NET
|
|
2
|
+
|
|
3
|
+
Aplica a todo código C# del proyecto. Estas reglas aprovechan las características
|
|
4
|
+
modernas de C# (10+) y .NET 6+ para escribir código más expresivo, seguro y con
|
|
5
|
+
menos ruido sintáctico. El objetivo es código que el IDE y el compilador puedan
|
|
6
|
+
analizar estáticamente con la mayor cobertura posible.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## dotnet format (obligatorio)
|
|
11
|
+
|
|
12
|
+
- `dotnet format` es el formateador oficial y su uso es obligatorio.
|
|
13
|
+
- Verificar sin modificar: `dotnet format --verify-no-changes`
|
|
14
|
+
- CI falla si `dotnet format --verify-no-changes` detecta diferencias.
|
|
15
|
+
- El archivo `.editorconfig` en la raíz del proyecto define las reglas de formato.
|
|
16
|
+
Versionar `.editorconfig` junto con el código.
|
|
17
|
+
- NUNCA editar manualmente el indentado — dejar que `dotnet format` decida.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Nullable reference types (obligatorio)
|
|
22
|
+
|
|
23
|
+
- Habilitar nullable reference types en todos los proyectos nuevos:
|
|
24
|
+
```xml
|
|
25
|
+
<!-- En el .csproj -->
|
|
26
|
+
<Nullable>enable</Nullable>
|
|
27
|
+
```
|
|
28
|
+
- O a nivel de archivo: `#nullable enable` al inicio del archivo.
|
|
29
|
+
- El compilador emite warnings cuando un nullable puede ser null sin verificación.
|
|
30
|
+
Tratar estos warnings como errores en CI:
|
|
31
|
+
```xml
|
|
32
|
+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
33
|
+
```
|
|
34
|
+
- No usar `!` (null-forgiving operator) para suprimir el warning sin verificar:
|
|
35
|
+
```csharp
|
|
36
|
+
// MAL — suprime el warning sin garantizar que no es null
|
|
37
|
+
string nombre = usuario.Nombre!;
|
|
38
|
+
|
|
39
|
+
// BIEN — verificar antes de usar
|
|
40
|
+
string nombre = usuario.Nombre ?? throw new InvalidOperationException("Nombre requerido");
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Records para DTOs inmutables
|
|
46
|
+
|
|
47
|
+
```csharp
|
|
48
|
+
// MAL — clase mutable con boilerplate
|
|
49
|
+
public class FacturaDto
|
|
50
|
+
{
|
|
51
|
+
public Guid Id { get; set; }
|
|
52
|
+
public decimal Total { get; set; }
|
|
53
|
+
public string ClienteEmail { get; set; } = string.Empty;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// BIEN — record inmutable, con/without para crear variantes
|
|
57
|
+
public record FacturaDto(
|
|
58
|
+
Guid Id,
|
|
59
|
+
decimal Total,
|
|
60
|
+
string ClienteEmail
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
// Crear variante modificada sin mutar el original
|
|
64
|
+
var actualizada = factura with { Total = 1500.0m };
|
|
65
|
+
|
|
66
|
+
// record struct para tipos de valor pequeños (sin heap allocation)
|
|
67
|
+
public record struct Coordenadas(double Latitud, double Longitud);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- Usar `record class` (o simplemente `record`) para DTOs de respuesta y eventos.
|
|
71
|
+
- Usar `record struct` para tipos de valor pequeños e inmutables.
|
|
72
|
+
- Los records implementan `Equals`, `GetHashCode` y `ToString` automáticamente.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Pattern matching con switch expressions
|
|
77
|
+
|
|
78
|
+
```csharp
|
|
79
|
+
// MAL — switch statement verboso
|
|
80
|
+
string DescribirEstatus(EstadoPedido estado)
|
|
81
|
+
{
|
|
82
|
+
switch (estado)
|
|
83
|
+
{
|
|
84
|
+
case EstadoPedido.Pendiente: return "En espera de confirmación";
|
|
85
|
+
case EstadoPedido.Confirmado: return "Confirmado, preparando envío";
|
|
86
|
+
case EstadoPedido.Enviado: return "En camino";
|
|
87
|
+
default: return "Estado desconocido";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// BIEN — switch expression conciso
|
|
92
|
+
string DescribirEstatus(EstadoPedido estado) => estado switch
|
|
93
|
+
{
|
|
94
|
+
EstadoPedido.Pendiente => "En espera de confirmación",
|
|
95
|
+
EstadoPedido.Confirmado => "Confirmado, preparando envío",
|
|
96
|
+
EstadoPedido.Enviado => "En camino",
|
|
97
|
+
_ => throw new ArgumentOutOfRangeException(nameof(estado))
|
|
98
|
+
};
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- Usar switch expressions para mapeos exhaustivos — el compilador detecta casos no cubiertos.
|
|
102
|
+
- Usar `_` como default solo cuando hay un caso genuinamente inesperado (y lanzar excepción).
|
|
103
|
+
- Pattern matching con `is`, `when` y destructuring para condiciones complejas.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## async/await: siempre propagar CancellationToken
|
|
108
|
+
|
|
109
|
+
```csharp
|
|
110
|
+
// MAL — no soporta cancelación
|
|
111
|
+
public async Task<Factura> ObtenerAsync(Guid id)
|
|
112
|
+
{
|
|
113
|
+
return await _repo.ObtenerAsync(id);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// BIEN — permite al llamador cancelar la operación
|
|
117
|
+
public async Task<Factura> ObtenerAsync(Guid id, CancellationToken ct = default)
|
|
118
|
+
{
|
|
119
|
+
return await _repo.ObtenerAsync(id, ct);
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
- `CancellationToken` en todos los métodos `async` públicos — siempre como último parámetro.
|
|
124
|
+
- Parámetro con valor por defecto `= default` para no romper llamadores existentes.
|
|
125
|
+
- NUNCA usar `Task.Result` ni `Task.Wait()` — bloquean el hilo y causan deadlocks en ASP.NET.
|
|
126
|
+
- NUNCA usar `async void` — solo `async Task` o `async Task<T>`.
|
|
127
|
+
Excepción: event handlers de UI (WinForms/WPF) donde el tipo está forzado.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Convenciones de nombres
|
|
132
|
+
|
|
133
|
+
| Elemento | Convención | Ejemplo |
|
|
134
|
+
|----------|-----------|---------|
|
|
135
|
+
| Clases, records, interfaces | `PascalCase` | `FacturaService`, `IRepositorio` |
|
|
136
|
+
| Métodos y propiedades públicas | `PascalCase` | `ObtenerFactura()`, `TotalImpuestos` |
|
|
137
|
+
| Parámetros y variables locales | `camelCase` | `facturaId`, `totalCalculado` |
|
|
138
|
+
| Campos privados | `_camelCase` (prefijo guion bajo) | `_repositorio`, `_logger` |
|
|
139
|
+
| Constantes | `PascalCase` (no SCREAMING) | `MaxReintentos`, `TiempoEsperaMs` |
|
|
140
|
+
| Interfaces | `I` + `PascalCase` | `IFacturaRepository`, `IEmailService` |
|
|
141
|
+
| Parámetros genéricos | `T`, `TKey`, `TValue`, o nombre descriptivo | `TEntidad`, `TResultado` |
|
|
142
|
+
|
|
143
|
+
- NUNCA prefijo `m_` ni `s_` para campos — son convenciones de C++ que no aplican.
|
|
144
|
+
- Las interfaces siempre empiezan con `I` — es una convención universal en C#.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Using declarations para IDisposable
|
|
149
|
+
|
|
150
|
+
```csharp
|
|
151
|
+
// MAL — bloque using con llaves innecesarias
|
|
152
|
+
using (var conexion = new SqlConnection(connectionString))
|
|
153
|
+
{
|
|
154
|
+
using (var comando = conexion.CreateCommand())
|
|
155
|
+
{
|
|
156
|
+
// ... código ...
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// BIEN — using declaration sin llaves (C# 8+)
|
|
161
|
+
using var conexion = new SqlConnection(connectionString);
|
|
162
|
+
using var comando = conexion.CreateCommand();
|
|
163
|
+
// ... código ...
|
|
164
|
+
// Dispose se llama automáticamente al final del scope del método
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
- `using var` para todos los `IDisposable` — el compilador inserta el `Dispose()`.
|
|
168
|
+
- El scope es el método completo — si se necesita scope más corto, usar el bloque `using { }`.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## File-scoped namespaces y top-level statements
|
|
173
|
+
|
|
174
|
+
```csharp
|
|
175
|
+
// MAL — namespace con bloque (C# antiguo)
|
|
176
|
+
namespace MiProyecto.Facturacion
|
|
177
|
+
{
|
|
178
|
+
public class FacturaService { ... }
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// BIEN — file-scoped namespace (C# 10+, reduce un nivel de indentación)
|
|
182
|
+
namespace MiProyecto.Facturacion;
|
|
183
|
+
|
|
184
|
+
public class FacturaService { ... }
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- File-scoped namespaces en todos los archivos nuevos.
|
|
188
|
+
- Top-level statements solo en `Program.cs` — no en clases de negocio.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## LINQ: method syntax preferido
|
|
193
|
+
|
|
194
|
+
```csharp
|
|
195
|
+
// MAL — query syntax (más verboso, mezcla SQL con C#)
|
|
196
|
+
var facturasPagadas = from f in facturas
|
|
197
|
+
where f.Estatus == EstadoFactura.Pagada
|
|
198
|
+
orderby f.FechaPago descending
|
|
199
|
+
select f;
|
|
200
|
+
|
|
201
|
+
// BIEN — method syntax (consistente con el resto de C# moderno)
|
|
202
|
+
var facturasPagadas = facturas
|
|
203
|
+
.Where(f => f.Estatus == EstadoFactura.Pagada)
|
|
204
|
+
.OrderByDescending(f => f.FechaPago);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
- Method syntax en todo el código nuevo — es más consistente con el estilo moderno.
|
|
208
|
+
- Query syntax solo cuando mejora la legibilidad en joins complejos (caso raro).
|
|
209
|
+
- NUNCA LINQ en bucles críticos de performance — medir antes de optimizar.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Longitud máxima de método: 40 líneas
|
|
214
|
+
|
|
215
|
+
- Los métodos no deben exceder 40 líneas de código efectivo.
|
|
216
|
+
- Si un método supera 40 líneas: extraer métodos privados con nombres descriptivos.
|
|
217
|
+
- Constructores con mucha inicialización: considerar el patrón Factory.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Checklist de estilo antes de abrir PR
|
|
222
|
+
|
|
223
|
+
- [ ] `dotnet format --verify-no-changes` pasa sin diferencias
|
|
224
|
+
- [ ] Nullable reference types habilitados y sin `!` sin justificación
|
|
225
|
+
- [ ] DTOs inmutables definidos como `record`
|
|
226
|
+
- [ ] Todos los métodos `async` reciben `CancellationToken`
|
|
227
|
+
- [ ] Sin `Task.Result` ni `Task.Wait()` en código async
|
|
228
|
+
- [ ] Sin `async void` fuera de event handlers
|
|
229
|
+
- [ ] File-scoped namespaces en archivos nuevos
|
|
230
|
+
- [ ] LINQ en method syntax
|
|
231
|
+
- [ ] Métodos <= 40 líneas
|