@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,247 @@
|
|
|
1
|
+
# Regla: Infraestructura Cloud
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA para todo recurso desplegado en cloud sin excepción.
|
|
4
|
+
Una infraestructura mal configurada puede causar brechas de seguridad, pérdida de datos
|
|
5
|
+
o costos desbocados en cuestión de horas. Ningún recurso cloud se considera listo para
|
|
6
|
+
producción si viola cualquiera de los puntos aquí listados.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Principio de menor privilegio en IAM
|
|
11
|
+
|
|
12
|
+
Cada identidad (usuario, rol, cuenta de servicio) recibe solo los permisos
|
|
13
|
+
estrictamente necesarios para su función, y nada más.
|
|
14
|
+
|
|
15
|
+
- NUNCA asignar políticas de administrador (`AdministratorAccess`, `Owner`, `*:*`)
|
|
16
|
+
a cuentas de servicio, aplicaciones o usuarios que no sean administradores reales.
|
|
17
|
+
- NUNCA asignar permisos de escritura cuando solo se necesita lectura.
|
|
18
|
+
- NUNCA asignar permisos a nivel de cuenta/organización cuando el scope correcto
|
|
19
|
+
es un recurso específico (ej: un bucket S3, no todos los buckets).
|
|
20
|
+
- Crear roles de IAM específicos por función:
|
|
21
|
+
- Rol para la aplicación web (lectura de secrets, escritura en BD, publicar en cola)
|
|
22
|
+
- Rol para el proceso de backup (lectura de BD, escritura en storage)
|
|
23
|
+
- Rol para el pipeline de CI/CD (push de imágenes, despliegue en el servicio)
|
|
24
|
+
Estos roles son diferentes y tienen permisos diferentes.
|
|
25
|
+
- Revisar y limpiar permisos no utilizados cada 90 días.
|
|
26
|
+
AWS tiene `IAM Access Analyzer` para detectar permisos sin uso.
|
|
27
|
+
GCP tiene `IAM Recommender` con el mismo propósito.
|
|
28
|
+
- Las llaves de acceso programático (API keys, service account keys) deben
|
|
29
|
+
rotarse cada 90 días máximo. Preferir roles temporales (STS AssumeRole, Workload Identity)
|
|
30
|
+
sobre llaves de larga duración cuando sea posible.
|
|
31
|
+
- Autenticación multifactor (MFA) obligatoria para todos los usuarios humanos
|
|
32
|
+
de la consola cloud, sin excepción. Incluyendo administradores.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Cifrado en reposo y en tránsito
|
|
37
|
+
|
|
38
|
+
Todos los datos deben estar cifrados, tanto almacenados como en movimiento.
|
|
39
|
+
|
|
40
|
+
### En reposo
|
|
41
|
+
|
|
42
|
+
- Todos los volúmenes de disco (EBS, Persistent Disk, Managed Disks) deben
|
|
43
|
+
tener cifrado habilitado. Verificar que no está desactivado por defecto.
|
|
44
|
+
- Todos los buckets de object storage (S3, GCS, Azure Blob) con cifrado activado.
|
|
45
|
+
Preferir llaves administradas por el cliente (KMS) para datos sensibles.
|
|
46
|
+
- Las bases de datos relacionales y NoSQL con cifrado de almacenamiento habilitado.
|
|
47
|
+
RDS: `StorageEncrypted: true`. Cloud SQL: `diskEncryptionConfiguration`.
|
|
48
|
+
- Los backups cifrados con la misma llave (o llave separada para mayor aislamiento).
|
|
49
|
+
- Los snapshots de volúmenes y AMIs cifrados.
|
|
50
|
+
|
|
51
|
+
### En tránsito
|
|
52
|
+
|
|
53
|
+
- TLS 1.2 mínimo. TLS 1.3 preferido. Deshabilitar TLS 1.0 y TLS 1.1 explícitamente.
|
|
54
|
+
- HTTPS obligatorio para toda comunicación entre servicios, incluyendo comunicación
|
|
55
|
+
interna entre microservicios dentro de la misma VPC.
|
|
56
|
+
- Certificados de TLS renovados automáticamente (ACM, Let's Encrypt con cert-manager,
|
|
57
|
+
Google-managed certificates).
|
|
58
|
+
- HSTS habilitado con `max-age` mínimo de 31536000 (1 año) en servicios públicos.
|
|
59
|
+
- La comunicación con bases de datos debe ser sobre TLS:
|
|
60
|
+
`sslmode=require` en PostgreSQL, `require_secure_transport=ON` en MySQL.
|
|
61
|
+
- Las colas de mensajes (SQS, Pub/Sub, Service Bus) con cifrado de mensajes habilitado.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Prohibición absoluta de credenciales hardcodeadas
|
|
66
|
+
|
|
67
|
+
Las credenciales en código fuente son una de las causas más comunes de brechas de seguridad.
|
|
68
|
+
|
|
69
|
+
- NUNCA hardcodear en código fuente: passwords, API keys, tokens de acceso,
|
|
70
|
+
connection strings, certificados privados, IDs de cuenta, ARNs con cuenta específica.
|
|
71
|
+
- NUNCA hardcodear credenciales en Dockerfiles, docker-compose.yml, manifiestos
|
|
72
|
+
de Kubernetes, archivos de Terraform, scripts de CI/CD.
|
|
73
|
+
- NUNCA commitear archivos `.env` con valores reales. Solo `.env.example` con
|
|
74
|
+
nombres de variables y valores de placeholder.
|
|
75
|
+
- Usar el servicio de gestión de secretos correspondiente al cloud provider:
|
|
76
|
+
- AWS: Secrets Manager o Parameter Store (SSM)
|
|
77
|
+
- GCP: Secret Manager
|
|
78
|
+
- Azure: Key Vault
|
|
79
|
+
- Kubernetes: External Secrets Operator (integrando con el cloud secrets manager)
|
|
80
|
+
- Para variables de entorno en CI/CD, usar las variables de entorno cifradas
|
|
81
|
+
del servicio de CI (GitHub Actions Secrets, GitLab CI Variables, etc.).
|
|
82
|
+
NUNCA escribirlas en archivos de configuración del pipeline.
|
|
83
|
+
- Ejecutar `git-secrets` o `truffleHog` en el pipeline de CI para detectar
|
|
84
|
+
credenciales accidentalmente commiteadas.
|
|
85
|
+
- Si se detecta una credencial comprometida en git:
|
|
86
|
+
1. Revocarla/rotarla INMEDIATAMENTE
|
|
87
|
+
2. Asumir que fue vista por actores maliciosos
|
|
88
|
+
3. Limpiar el historial con `git filter-repo` o BFG Repo Cleaner
|
|
89
|
+
4. No es suficiente con un commit que la borre — el historial es público
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Infraestructura como código (IaC) para todo recurso
|
|
94
|
+
|
|
95
|
+
Ningún recurso cloud se crea manualmente desde la consola en ambientes no locales.
|
|
96
|
+
|
|
97
|
+
- Todo recurso de producción y staging debe estar definido en código:
|
|
98
|
+
Terraform, Pulumi, AWS CDK, AWS CloudFormation, Azure Bicep, o el equivalente.
|
|
99
|
+
- Los recursos creados manualmente no son reproducibles, no son auditables y no
|
|
100
|
+
son recuperables en caso de desastre. Son deuda técnica crítica.
|
|
101
|
+
- El código de IaC vive en el repositorio del proyecto (o en un repositorio
|
|
102
|
+
dedicado de infraestructura si el equipo es grande).
|
|
103
|
+
- Los cambios de infraestructura pasan por code review igual que el código de aplicación.
|
|
104
|
+
- Antes de aplicar cambios: `terraform plan` (o equivalente) debe revisarse
|
|
105
|
+
y aprobarse. NUNCA aplicar IaC sin revisar el plan.
|
|
106
|
+
- Los cambios de infraestructura se despliegan a través del pipeline de CI/CD,
|
|
107
|
+
no manualmente desde la terminal de un desarrollador.
|
|
108
|
+
- Los módulos de Terraform/Pulumi deben tener versiones pinneadas. No usar
|
|
109
|
+
rangos abiertos en módulos de infraestructura.
|
|
110
|
+
- Estado de Terraform almacenado en backend remoto (S3+DynamoDB, GCS, Terraform Cloud)
|
|
111
|
+
con locking habilitado. NUNCA usar estado local en equipos.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Alta disponibilidad y multi-AZ para producción
|
|
116
|
+
|
|
117
|
+
Los servicios de producción deben tolerar la falla de una zona de disponibilidad.
|
|
118
|
+
|
|
119
|
+
- Las bases de datos de producción deben ser multi-AZ:
|
|
120
|
+
RDS con Multi-AZ deployment, Cloud SQL con high availability, Azure SQL con Zone Redundancy.
|
|
121
|
+
- Los servidores de aplicación deben escalar horizontalmente en múltiples AZs.
|
|
122
|
+
NUNCA desplegar en una sola instancia sin failover para servicios de producción.
|
|
123
|
+
- El load balancer debe distribuir tráfico entre múltiples AZs.
|
|
124
|
+
- Los buckets de object storage son multi-AZ por defecto en la mayoría de providers.
|
|
125
|
+
Verificar que la clase de almacenamiento seleccionada sea multi-regional o multi-AZ.
|
|
126
|
+
- Para servicios con SLA de alta disponibilidad: considerar multi-región con
|
|
127
|
+
routing DNS geográfico (Route 53 latency routing, Cloud DNS, Azure Traffic Manager).
|
|
128
|
+
- El objetivo de tiempo de recuperación (RTO) y el objetivo de punto de recuperación (RPO)
|
|
129
|
+
deben estar definidos y documentados para cada servicio de producción.
|
|
130
|
+
- Las fallas de AZ deben probarse periódicamente (Game Days, Chaos Engineering).
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Backups automatizados con retención definida
|
|
135
|
+
|
|
136
|
+
Los datos deben poder recuperarse. Sin backups verificados, no hay recuperación.
|
|
137
|
+
|
|
138
|
+
- Todos los servicios con estado (bases de datos, filesystems, object storage crítico)
|
|
139
|
+
deben tener backups automatizados configurados por IaC.
|
|
140
|
+
- La política de retención debe estar definida explícitamente:
|
|
141
|
+
- Producción: mínimo 30 días de retención, recomendado 90 días
|
|
142
|
+
- Staging: mínimo 7 días
|
|
143
|
+
- Backups de largo plazo (compliance): definir según requisito regulatorio
|
|
144
|
+
- Los backups deben almacenarse en una cuenta o proyecto cloud diferente al de
|
|
145
|
+
producción para protección contra eliminación accidental o ransomware.
|
|
146
|
+
- El cifrado de backups es obligatorio (misma regla que datos en reposo).
|
|
147
|
+
- La restauración de backups debe probarse mensualmente en staging.
|
|
148
|
+
Un backup que no se ha restaurado exitosamente no existe.
|
|
149
|
+
- Configurar alertas cuando un backup falla. NUNCA descubrir la falla en el momento
|
|
150
|
+
en que se necesita restaurar.
|
|
151
|
+
- Para bases de datos: point-in-time recovery (PITR) habilitado en producción.
|
|
152
|
+
Permite restaurar a cualquier momento dentro de la ventana de retención.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Monitoring, alertas y observabilidad obligatorios
|
|
157
|
+
|
|
158
|
+
Si no está monitorizado, no está en producción.
|
|
159
|
+
|
|
160
|
+
- Todo servicio de producción debe tener:
|
|
161
|
+
- **Métricas de infraestructura**: CPU, memoria, disco, red (CloudWatch, Cloud Monitoring, Azure Monitor)
|
|
162
|
+
- **Métricas de aplicación**: latencia p50/p95/p99, tasa de errores, throughput
|
|
163
|
+
- **Logs centralizados**: CloudWatch Logs, Cloud Logging, Azure Log Analytics
|
|
164
|
+
- **Trazas distribuidas**: X-Ray, Cloud Trace, Application Insights (si hay microservicios)
|
|
165
|
+
- Alertas obligatorias con acción definida (no alertas sin destinatario):
|
|
166
|
+
- CPU > 80% por más de 5 minutos
|
|
167
|
+
- Disco > 85% de uso
|
|
168
|
+
- Tasa de errores HTTP 5xx > 1% del tráfico
|
|
169
|
+
- Latencia p95 > umbral definido por SLA
|
|
170
|
+
- Fallo de backup
|
|
171
|
+
- Certificado TLS con vencimiento < 30 días
|
|
172
|
+
- Las alertas deben ir a un canal con responsable activo (PagerDuty, OpsGenie, Slack con on-call).
|
|
173
|
+
NUNCA alertas que van a un buzón que nadie revisa.
|
|
174
|
+
- Implementar dashboards de salud accesibles al equipo completo.
|
|
175
|
+
- Los logs NO deben contener datos sensibles: passwords, tokens, PII, números de tarjeta.
|
|
176
|
+
Configurar filtros de sanitización de logs.
|
|
177
|
+
- Retención de logs: mínimo 90 días en producción. Requisitos de compliance pueden
|
|
178
|
+
requerir más (1-7 años según el sector).
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Tagging obligatorio de recursos
|
|
183
|
+
|
|
184
|
+
Los recursos sin tags son inauditables, sin dueño y sin costo asignable.
|
|
185
|
+
|
|
186
|
+
Los siguientes tags son OBLIGATORIOS en TODOS los recursos cloud:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
proyecto: nombre del proyecto o sistema (ej: "swl-core", "facturacion")
|
|
190
|
+
ambiente: prod | staging | dev | test
|
|
191
|
+
equipo: nombre del equipo responsable (ej: "backend", "infraestructura")
|
|
192
|
+
costo-center: centro de costo para facturación interna (ej: "ing-2024", "cliente-abc")
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Tags adicionales recomendados:
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
owner: correo del responsable técnico
|
|
199
|
+
version: versión del componente (si aplica)
|
|
200
|
+
auto-apagado: "true" para recursos de dev/test que se apagan fuera de horario laboral
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
- Configurar políticas de gobernanza que rechacen la creación de recursos sin los
|
|
204
|
+
tags obligatorios (AWS Service Control Policies, GCP Organization Policies).
|
|
205
|
+
- Los tags deben definirse en el IaC, no agregarse manualmente después.
|
|
206
|
+
- Usar los tags para:
|
|
207
|
+
- Filtrar recursos por proyecto en las consultas de costo
|
|
208
|
+
- Identificar recursos huérfanos (sin equipo asignado)
|
|
209
|
+
- Implementar apagado automático de recursos de no-producción
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Segmentación de red (VPC, subnets, security groups)
|
|
214
|
+
|
|
215
|
+
La red debe estar diseñada con defensa en profundidad.
|
|
216
|
+
|
|
217
|
+
- Cada ambiente (prod, staging, dev) debe tener su propia VPC separada.
|
|
218
|
+
NUNCA mezclar prod y dev en la misma VPC.
|
|
219
|
+
- Las bases de datos y servicios internos NUNCA deben tener IP pública.
|
|
220
|
+
Deben vivir en subnets privadas sin ruta directa a internet.
|
|
221
|
+
- Los security groups deben seguir el principio de menor privilegio:
|
|
222
|
+
- NUNCA `0.0.0.0/0` en reglas de ingreso de puertos de aplicación (80, 443 son excepciones para el LB)
|
|
223
|
+
- NUNCA `0.0.0.0/0` en reglas de ingreso para SSH (22) o RDP (3389) en producción.
|
|
224
|
+
Usar VPN, bastion host o AWS Systems Manager Session Manager.
|
|
225
|
+
- Las reglas de egreso deben ser explícitas — no `0.0.0.0/0` sin justificación.
|
|
226
|
+
- El acceso SSH/RDP a instancias de producción debe ser a través de bastion host
|
|
227
|
+
o VPN corporativa, nunca directamente desde internet.
|
|
228
|
+
- Los balanceadores de carga son los únicos recursos en subnets públicas.
|
|
229
|
+
Las instancias de aplicación van en subnets privadas.
|
|
230
|
+
- VPC Flow Logs habilitados en producción para auditoría de tráfico de red.
|
|
231
|
+
- Network ACLs como capa adicional de defensa para subnets críticas.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Checklist antes de desplegar un nuevo recurso en producción
|
|
236
|
+
|
|
237
|
+
- [ ] Definido en IaC — no creado manualmente en la consola
|
|
238
|
+
- [ ] Tag obligatorio de proyecto, ambiente, equipo y costo-center asignados
|
|
239
|
+
- [ ] Principio de menor privilegio aplicado a los roles IAM asociados
|
|
240
|
+
- [ ] Cifrado en reposo habilitado
|
|
241
|
+
- [ ] Comunicación sobre TLS configurada
|
|
242
|
+
- [ ] Multi-AZ configurado (si es un servicio con estado)
|
|
243
|
+
- [ ] Backups automatizados configurados con política de retención definida
|
|
244
|
+
- [ ] Monitoreo y alertas configuradas
|
|
245
|
+
- [ ] El recurso está en subnet privada (si no es un LB o CDN)
|
|
246
|
+
- [ ] No hay credenciales hardcodeadas en la configuración
|
|
247
|
+
- [ ] El código de IaC pasó code review
|
package/reglas/docs.md
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# Regla: Documentación
|
|
2
|
+
|
|
3
|
+
La documentación es para los humanos que vienen después — incluyendo tú mismo
|
|
4
|
+
en seis meses. Documenta el POR QUÉ, no el QUÉ: el código ya explica el qué.
|
|
5
|
+
La documentación explica el contexto, las restricciones y las decisiones.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Documentar el POR QUÉ, no el QUÉ
|
|
10
|
+
|
|
11
|
+
El código bien escrito es autoexplicativo en el QUÉ. Los comentarios agregan
|
|
12
|
+
valor cuando explican lo que el código no puede expresar por sí solo:
|
|
13
|
+
|
|
14
|
+
- Por qué se tomó esta decisión en lugar de la alternativa obvia
|
|
15
|
+
- Por qué hay una excepción a la regla general
|
|
16
|
+
- Qué restricción externa (API, regulación, legacy) explica una solución poco intuitiva
|
|
17
|
+
- Qué bug histórico motivó este código aparentemente innecesario
|
|
18
|
+
|
|
19
|
+
Mal — documenta el qué (redundante con el código):
|
|
20
|
+
```python
|
|
21
|
+
# Incrementar el contador
|
|
22
|
+
contador += 1
|
|
23
|
+
|
|
24
|
+
# Verificar si el usuario está activo
|
|
25
|
+
if usuario.es_activo:
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Bien — documenta el por qué:
|
|
29
|
+
```python
|
|
30
|
+
# El SAT requiere que el folio fiscal sea consecutivo sin gaps.
|
|
31
|
+
# Usar SEQUENCE de PostgreSQL garantiza atomicidad bajo concurrencia.
|
|
32
|
+
folio = await db.execute(text("SELECT nextval('folio_fiscal_seq')"))
|
|
33
|
+
|
|
34
|
+
# HACK: la API de CFDI devuelve 200 incluso para errores de validación.
|
|
35
|
+
# Detectar el error por la presencia del campo "faultcode" en la respuesta.
|
|
36
|
+
if "faultcode" in respuesta:
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## README actualizado
|
|
42
|
+
|
|
43
|
+
El README es el punto de entrada al proyecto. Debe estar siempre actualizado.
|
|
44
|
+
Un README desactualizado es peor que no tener README — genera confianza falsa.
|
|
45
|
+
|
|
46
|
+
Estructura mínima del README del proyecto:
|
|
47
|
+
```markdown
|
|
48
|
+
# Nombre del Proyecto
|
|
49
|
+
|
|
50
|
+
Descripción en 2-3 líneas: qué hace, para quién, qué problema resuelve.
|
|
51
|
+
|
|
52
|
+
## Requisitos previos
|
|
53
|
+
- Python 3.12+
|
|
54
|
+
- PostgreSQL 15+
|
|
55
|
+
- Node.js 20+
|
|
56
|
+
|
|
57
|
+
## Instalación y setup local
|
|
58
|
+
Instrucciones paso a paso. Que funcionen. Probarlas en una máquina limpia.
|
|
59
|
+
|
|
60
|
+
## Cómo correr los tests
|
|
61
|
+
|
|
62
|
+
## Cómo levantar el entorno de desarrollo
|
|
63
|
+
|
|
64
|
+
## Variables de entorno requeridas
|
|
65
|
+
Lista con descripción de cada variable (nunca valores reales).
|
|
66
|
+
|
|
67
|
+
## Arquitectura
|
|
68
|
+
Link al diagrama o descripción de alto nivel.
|
|
69
|
+
|
|
70
|
+
## Contribuir
|
|
71
|
+
Link al CONTRIBUTING.md o instrucciones básicas.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Reglas del README:
|
|
75
|
+
- Las instrucciones de instalación deben funcionar. Probarlas periódicamente.
|
|
76
|
+
- Actualizar el README en el mismo PR que introduce el cambio que lo hace obsoleto.
|
|
77
|
+
- Sin secciones "TODO" o "próximamente" — si no está listo, no va en el README.
|
|
78
|
+
- Sin secciones genéricas copiadas de templates sin personalizar.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## CHANGELOG con formato Keep a Changelog
|
|
83
|
+
|
|
84
|
+
Formato oficial: https://keepachangelog.com/es/1.0.0/
|
|
85
|
+
|
|
86
|
+
Estructura:
|
|
87
|
+
```markdown
|
|
88
|
+
# Changelog
|
|
89
|
+
|
|
90
|
+
## [Sin publicar]
|
|
91
|
+
|
|
92
|
+
### Agregado
|
|
93
|
+
- Nueva funcionalidad X
|
|
94
|
+
|
|
95
|
+
## [1.2.0] - 2026-01-15
|
|
96
|
+
|
|
97
|
+
### Agregado
|
|
98
|
+
- Soporte para exportación de reportes en PDF
|
|
99
|
+
|
|
100
|
+
### Cambiado
|
|
101
|
+
- El endpoint /facturas ahora devuelve paginación por defecto
|
|
102
|
+
|
|
103
|
+
### Corregido
|
|
104
|
+
- Error al calcular IEPS para productos con tasa 0%
|
|
105
|
+
|
|
106
|
+
### Eliminado
|
|
107
|
+
- Endpoint /facturas/legacy deprecado desde v1.0
|
|
108
|
+
|
|
109
|
+
## [1.1.0] - 2025-11-20
|
|
110
|
+
...
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Reglas del CHANGELOG:
|
|
114
|
+
- Actualizar en cada PR que cambia comportamiento observable por el usuario.
|
|
115
|
+
Cambios internos de refactor o tests: no requieren entrada en CHANGELOG.
|
|
116
|
+
- Sección "Sin publicar" para cambios no lanzados todavía.
|
|
117
|
+
Al lanzar: renombrar la sección con la versión y fecha.
|
|
118
|
+
- Una línea por cambio, redactada para el usuario, no para el desarrollador.
|
|
119
|
+
"Corregido error al exportar PDF con caracteres especiales" > "fix: null pointer en PdfExportService"
|
|
120
|
+
- El CHANGELOG vive en la raíz del repositorio como `CHANGELOG.md`.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## ADRs para decisiones arquitecturales
|
|
125
|
+
|
|
126
|
+
Ver también: `reglas/arquitectura.md`
|
|
127
|
+
|
|
128
|
+
- Directorio: `docs/adr/` en el repositorio.
|
|
129
|
+
- Índice en `docs/adr/README.md` con lista de todos los ADRs y su estado.
|
|
130
|
+
- Buscar en los ADRs existentes antes de proponer una decisión nueva.
|
|
131
|
+
Si ya hay un ADR que la cubre: referenciarlo, no crear uno duplicado.
|
|
132
|
+
- ADRs deprecados o reemplazados: no borrar — actualizar el estado y referenciar
|
|
133
|
+
el ADR nuevo. El historial de decisiones es valioso.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Runbooks para procesos operativos
|
|
138
|
+
|
|
139
|
+
Un runbook es una guía paso a paso para ejecutar un proceso operativo:
|
|
140
|
+
deploy, rollback, migración de datos, respuesta a incidentes.
|
|
141
|
+
|
|
142
|
+
Ubicación: `docs/runbooks/`
|
|
143
|
+
|
|
144
|
+
Estructura mínima de un runbook:
|
|
145
|
+
```markdown
|
|
146
|
+
# Runbook: [Nombre del proceso]
|
|
147
|
+
|
|
148
|
+
**Propósito**: Qué hace este proceso y cuándo ejecutarlo.
|
|
149
|
+
**Tiempo estimado**: N minutos
|
|
150
|
+
**Prerrequisitos**: Qué accesos/herramientas se necesitan
|
|
151
|
+
**Riesgos**: Qué puede salir mal y cómo mitigarlo
|
|
152
|
+
|
|
153
|
+
## Pasos
|
|
154
|
+
|
|
155
|
+
### 1. [Nombre del paso]
|
|
156
|
+
```bash
|
|
157
|
+
comando exacto a ejecutar
|
|
158
|
+
```
|
|
159
|
+
**Resultado esperado**: descripción de qué debe pasar.
|
|
160
|
+
**Si falla**: qué hacer.
|
|
161
|
+
|
|
162
|
+
## Verificación post-ejecución
|
|
163
|
+
- [ ] Paso de verificación 1
|
|
164
|
+
- [ ] Paso de verificación 2
|
|
165
|
+
|
|
166
|
+
## Rollback
|
|
167
|
+
Pasos para deshacer el proceso si algo falla.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Procesos que DEBEN tener runbook:
|
|
171
|
+
- Deploy a producción
|
|
172
|
+
- Rollback de deploy
|
|
173
|
+
- Migraciones de BD en producción
|
|
174
|
+
- Rotación de secrets
|
|
175
|
+
- Respuesta a incidente de seguridad
|
|
176
|
+
- Backup y restore de BD
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Documentación de APIs
|
|
181
|
+
|
|
182
|
+
- Toda API REST tiene documentación OpenAPI/Swagger generada automáticamente
|
|
183
|
+
y disponible en `/docs` (desarrollo) y `/api/docs` (producción con auth).
|
|
184
|
+
- Cada endpoint tiene descripción, parámetros documentados y ejemplos de respuesta.
|
|
185
|
+
- Los campos de schemas Pydantic con `description=` son parte de la spec — no opcionales.
|
|
186
|
+
- Errores posibles documentados (qué regresa en 400, 401, 403, 404, 422, 500).
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Sin documentación vacía o genérica
|
|
191
|
+
|
|
192
|
+
Documentación que no ayuda es ruido que hay que mantener:
|
|
193
|
+
|
|
194
|
+
Señales de documentación vacía a eliminar:
|
|
195
|
+
- `"""Constructor de la clase Factura"""` — obvio del nombre.
|
|
196
|
+
- `"""Parámetros: id (int): el id"""` — sin información nueva.
|
|
197
|
+
- Secciones del README copiadas de un template sin personalizar.
|
|
198
|
+
- Comentarios `# TODO` sin número de ticket y fecha.
|
|
199
|
+
- ADRs con "Contexto: se necesitaba una solución" sin detalles reales.
|
|
200
|
+
|
|
201
|
+
Si no se tiene tiempo de documentar bien: es mejor no poner documentación vacía.
|
|
202
|
+
Marcar explícitamente con `# NODOC: pendiente de documentar (ticket #NNN)`.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Docstrings — cuándo y cómo
|
|
207
|
+
|
|
208
|
+
Python:
|
|
209
|
+
- Docstring obligatorio en módulos, clases públicas y funciones públicas no triviales.
|
|
210
|
+
- Funciones privadas (`_nombre`) y triviales (getters simples): docstring opcional.
|
|
211
|
+
- Formato Google Style:
|
|
212
|
+
```python
|
|
213
|
+
def calcular_iva(precio: Decimal, tasa: float) -> Decimal:
|
|
214
|
+
"""Calcula el IVA sobre el precio dado.
|
|
215
|
+
|
|
216
|
+
No incluye IEPS ni retenciones. Para cálculo completo usar
|
|
217
|
+
`calcular_impuestos_completos()`.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
precio: Precio base sin impuestos.
|
|
221
|
+
tasa: Tasa como decimal (0.16 para 16%).
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
Monto del IVA redondeado a 2 decimales.
|
|
225
|
+
|
|
226
|
+
Raises:
|
|
227
|
+
ValueError: Si la tasa es negativa o mayor que 1.
|
|
228
|
+
"""
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
TypeScript:
|
|
232
|
+
- JSDoc en funciones públicas de services y utilities.
|
|
233
|
+
- Componentes Angular: comentario en el selector explicando el propósito del componente.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Checklist de documentación antes de merge
|
|
238
|
+
|
|
239
|
+
- [ ] README refleja los cambios del PR
|
|
240
|
+
- [ ] CHANGELOG actualizado si hay cambio observable por el usuario
|
|
241
|
+
- [ ] ADR creado si hubo decisión arquitectural significativa
|
|
242
|
+
- [ ] Endpoints nuevos con descripción en el schema OpenAPI
|
|
243
|
+
- [ ] Sin comentarios que explican el qué (solo el por qué)
|
|
244
|
+
- [ ] Sin secciones TODO vacías sin ticket asociado
|
|
245
|
+
- [ ] Runbook creado si se agregó proceso operativo nuevo
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Regla: Estilo de Código
|
|
2
|
+
|
|
3
|
+
El código se lee muchas más veces de las que se escribe. Estas reglas maximizan
|
|
4
|
+
la legibilidad y reducen la carga cognitiva de quien mantiene el código después.
|
|
5
|
+
Aplican a todos los lenguajes del stack salvo indicación contraria.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Nombres descriptivos
|
|
10
|
+
|
|
11
|
+
- Los nombres son documentación. Un nombre que requiere un comentario para
|
|
12
|
+
entenderse es un nombre malo — renombrar.
|
|
13
|
+
- Variables, funciones y clases: nombrar por lo que SON o lo que HACEN,
|
|
14
|
+
no por su tipo ni su implementación.
|
|
15
|
+
- Mal: `d`, `tmp`, `data`, `obj`, `flag`, `result`
|
|
16
|
+
- Bien: `fecha_entrega`, `usuario_autenticado`, `calcular_impuesto()`
|
|
17
|
+
- Booleanos: prefijo `es_`, `tiene_`, `puede_`, `esta_`.
|
|
18
|
+
- Mal: `activo`, `valido`, `habilitado`
|
|
19
|
+
- Bien: `es_activo`, `tiene_permisos`, `puede_editar`
|
|
20
|
+
- Funciones: verbo + sustantivo. Describe la acción y el objeto.
|
|
21
|
+
- Mal: `proceso()`, `handler()`, `manage()`
|
|
22
|
+
- Bien: `procesar_pago()`, `manejar_solicitud_reembolso()`
|
|
23
|
+
- Colecciones: plural del elemento.
|
|
24
|
+
- Mal: `lista`, `items`, `data`
|
|
25
|
+
- Bien: `facturas`, `usuarios_activos`, `errores_validacion`
|
|
26
|
+
- No abreviaciones salvo las universalmente conocidas (`id`, `url`, `http`, `api`).
|
|
27
|
+
Siempre en el contexto del proyecto — si hay duda, escribir completo.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Funciones cortas — límite estricto de 30 líneas
|
|
32
|
+
|
|
33
|
+
- Una función hace UNA sola cosa. Si se necesita "y" para describir lo que hace,
|
|
34
|
+
es candidata a dividirse.
|
|
35
|
+
- Límite de 30 líneas de código efectivo (sin contar comentarios, líneas en blanco
|
|
36
|
+
ni firmas de función).
|
|
37
|
+
- Si una función supera 30 líneas: extraer subfunciones con nombres descriptivos.
|
|
38
|
+
El cuerpo de la función original queda como un sumario legible de pasos.
|
|
39
|
+
- Parámetros: máximo 4. Si se necesitan más, agrupar en un objeto/dataclass.
|
|
40
|
+
- Complejidad ciclomática máxima: 5. Más de 5 ramas → refactorizar.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Un solo nivel de abstracción por función
|
|
45
|
+
|
|
46
|
+
- Cada función opera en un único nivel de abstracción. No mezclar operaciones
|
|
47
|
+
de alto nivel (lógica de negocio) con detalles de bajo nivel (parsing, formateo).
|
|
48
|
+
|
|
49
|
+
Mal — mezcla niveles:
|
|
50
|
+
```python
|
|
51
|
+
def procesar_pedido(pedido_id):
|
|
52
|
+
pedido = db.execute("SELECT * FROM pedidos WHERE id = %s", (pedido_id,))
|
|
53
|
+
if pedido["estatus"] == "pendiente":
|
|
54
|
+
total = sum(item["precio"] * item["cantidad"] for item in pedido["items"])
|
|
55
|
+
db.execute("UPDATE pedidos SET total = %s WHERE id = %s", (total, pedido_id))
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Bien — nivel uniforme:
|
|
59
|
+
```python
|
|
60
|
+
def procesar_pedido(pedido_id):
|
|
61
|
+
pedido = obtener_pedido(pedido_id)
|
|
62
|
+
if esta_pendiente(pedido):
|
|
63
|
+
actualizar_total(pedido)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Early return — evitar anidamiento profundo
|
|
69
|
+
|
|
70
|
+
- Validar precondiciones al inicio y retornar inmediatamente si no se cumplen.
|
|
71
|
+
Nunca anidar la lógica principal dentro de múltiples `if`.
|
|
72
|
+
- Máximo 2 niveles de anidamiento dentro de una función (sin contar el cuerpo
|
|
73
|
+
de la función en sí). Si se llega a 3: early return o extracción de función.
|
|
74
|
+
|
|
75
|
+
Mal:
|
|
76
|
+
```python
|
|
77
|
+
def crear_factura(usuario, items):
|
|
78
|
+
if usuario:
|
|
79
|
+
if items:
|
|
80
|
+
if len(items) > 0:
|
|
81
|
+
# lógica principal aquí, muy adentro
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Bien:
|
|
85
|
+
```python
|
|
86
|
+
def crear_factura(usuario, items):
|
|
87
|
+
if not usuario:
|
|
88
|
+
raise ValueError("Usuario requerido")
|
|
89
|
+
if not items:
|
|
90
|
+
raise ValueError("La factura debe tener al menos un ítem")
|
|
91
|
+
# lógica principal al nivel superior
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Sin código muerto
|
|
97
|
+
|
|
98
|
+
- Eliminar código comentado antes de hacer merge. Si se necesita recuperar algo,
|
|
99
|
+
existe git. El código comentado genera confusión sobre si está activo o no.
|
|
100
|
+
- Eliminar variables declaradas y nunca usadas.
|
|
101
|
+
- Eliminar imports no utilizados.
|
|
102
|
+
- Eliminar funciones que ya no tienen llamadores (verificar con búsqueda global).
|
|
103
|
+
- Eliminar flags de feature que ya no tienen sentido (limpiar deuda técnica).
|
|
104
|
+
- Los linters (flake8, ESLint, Pylance) deben pasar en CI sin warnings de código muerto.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Principio DRY — no duplicar conocimiento
|
|
109
|
+
|
|
110
|
+
- DRY no es solo "no duplicar texto". Es no duplicar conocimiento. Si una regla
|
|
111
|
+
de negocio, una validación, una query o una transformación existe en un lugar,
|
|
112
|
+
no debe existir en otro. Cuando el conocimiento cambia, debe cambiar en un solo sitio.
|
|
113
|
+
- Antes de crear una función, clase o módulo nuevo: buscar si ya existe algo que
|
|
114
|
+
haga lo mismo con Grep o Glob. Si existe, reutilizar o extender — no duplicar.
|
|
115
|
+
- Señales de violación DRY que deben corregirse:
|
|
116
|
+
- Misma query SQL en 2+ lugares → extraer a un método del repositorio
|
|
117
|
+
- Misma validación de input en 2+ endpoints → extraer a un schema/validator compartido
|
|
118
|
+
- Misma transformación de datos en 2+ puntos → extraer a una función helper
|
|
119
|
+
- Misma constante definida en múltiples archivos → mover a un módulo de constantes
|
|
120
|
+
- Mismo bloque try/except en 2+ funciones → extraer a un decorator o context manager
|
|
121
|
+
- Dos funciones que hacen lo mismo pero por razones de negocio distintas NO son
|
|
122
|
+
violaciones DRY. DRY aplica cuando el conocimiento duplicado cambiaría junto:
|
|
123
|
+
si un cambio en un lugar obliga a cambiar el otro, es duplicación.
|
|
124
|
+
- Tres líneas de código similares son mejor que una abstracción prematura. DRY no
|
|
125
|
+
justifica crear helpers de una sola línea que se usan dos veces.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Sin console.log / print en producción
|
|
130
|
+
|
|
131
|
+
- `console.log()`, `print()`, `console.debug()`, `System.out.println()` y
|
|
132
|
+
equivalentes están prohibidos en código que se mergea a main.
|
|
133
|
+
- Usar el logger configurado del proyecto:
|
|
134
|
+
- Python: `import logging; logger = logging.getLogger(__name__)`
|
|
135
|
+
- TypeScript/Angular: servicio de logging centralizado o `LoggingService`
|
|
136
|
+
- Nivel de log apropiado: `DEBUG` para desarrollo, `INFO` para flujos importantes,
|
|
137
|
+
`WARNING` para situaciones inesperadas recuperables, `ERROR` para fallos.
|
|
138
|
+
- Los logs de nivel DEBUG no aparecen en producción — configurar por entorno.
|
|
139
|
+
- CI debe fallar si encuentra `console.log` o `print(` fuera de archivos de test.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Organización de imports
|
|
144
|
+
|
|
145
|
+
Python — orden PEP 8, separados por línea en blanco:
|
|
146
|
+
1. Standard library (`os`, `sys`, `datetime`, etc.)
|
|
147
|
+
2. Dependencias de terceros (`fastapi`, `sqlalchemy`, `pydantic`, etc.)
|
|
148
|
+
3. Módulos propios del proyecto (con rutas absolutas desde la raíz del proyecto)
|
|
149
|
+
|
|
150
|
+
TypeScript/Angular — orden ESLint import/order:
|
|
151
|
+
1. Angular core y common (`@angular/core`, `@angular/common`)
|
|
152
|
+
2. Angular material y otras librerías (`@angular/material/*`)
|
|
153
|
+
3. RxJS (`rxjs`, `rxjs/operators`)
|
|
154
|
+
4. Librerías de terceros
|
|
155
|
+
5. Módulos propios (paths con alias `@app/`, `@core/`, `@shared/`)
|
|
156
|
+
|
|
157
|
+
Reglas adicionales:
|
|
158
|
+
- Sin imports con wildcard (`from module import *`) salvo `__init__.py` explícito.
|
|
159
|
+
- Un import por línea en TypeScript.
|
|
160
|
+
- Usar paths absolutos en imports propios — nunca `../../../../../../modulo`.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Constantes con SCREAMING_CASE
|
|
165
|
+
|
|
166
|
+
- Toda constante con valor literal que se usa en múltiples lugares:
|
|
167
|
+
definir una sola vez con nombre en SCREAMING_CASE.
|
|
168
|
+
- Agrupa constantes relacionadas en un módulo o clase de constantes.
|
|
169
|
+
```python
|
|
170
|
+
# constants.py
|
|
171
|
+
MAX_INTENTOS_LOGIN = 5
|
|
172
|
+
TIEMPO_EXPIRACION_TOKEN_MINUTOS = 60
|
|
173
|
+
ROLES_ADMINISTRADORES = ["ADMIN", "SUPERADMIN"]
|
|
174
|
+
```
|
|
175
|
+
- En TypeScript, usar `const` con SCREAMING_CASE o `enum` con PascalCase.
|
|
176
|
+
- NUNCA magic numbers o magic strings dispersos en el código.
|
|
177
|
+
Si aparece un literal numérico o string no trivial: extraerlo a constante.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Reglas adicionales de legibilidad
|
|
182
|
+
|
|
183
|
+
- Longitud máxima de línea: 100 caracteres (Python), 120 caracteres (TypeScript).
|
|
184
|
+
- Un solo nivel de ternario. Ternarios anidados: prohibidos.
|
|
185
|
+
- No usar `else` después de `return` o `raise` — es redundante y añade anidamiento.
|
|
186
|
+
- Agrupar código relacionado. Separar grupos con una línea en blanco.
|
|
187
|
+
- Comentarios en español (idioma del proyecto). Gramática y ortografía correctas.
|
|
188
|
+
- Comentarios explican el POR QUÉ, no el QUÉ. El código explica el qué.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Checklist de estilo antes de abrir PR
|
|
193
|
+
|
|
194
|
+
- [ ] Sin variables, imports o funciones sin usar
|
|
195
|
+
- [ ] Sin código comentado
|
|
196
|
+
- [ ] Sin console.log/print de debug
|
|
197
|
+
- [ ] Nombres descriptivos en todo el código nuevo
|
|
198
|
+
- [ ] Funciones <= 30 líneas
|
|
199
|
+
- [ ] Sin magic numbers ni magic strings
|
|
200
|
+
- [ ] Sin duplicación de lógica de negocio entre módulos (DRY)
|
|
201
|
+
- [ ] Linter y type-checker pasan sin warnings
|