@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,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planear-fase
|
|
3
|
+
description: Crea el PLAN.md ejecutable para una fase de desarrollo. Descompone la fase en tareas atómicas con dependencias explícitas, las agrupa en oleadas de ejecución paralela cuando es posible, y aplica verificación goal-backward para garantizar que el plan completo satisface los criterios de éxito definidos en CONTEXTO.md.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar si no existe CONTEXTO.md para la fase — ejecutar `discutir-fase` primero."
|
|
8
|
+
- "No cargar para replanificar una tarea individual dentro de una fase ya en ejecución; eso es desviación moderada, manejar con `ejecutar-fase`."
|
|
9
|
+
- "No cargar para generar backlog de producto o roadmap de alto nivel; usar `nuevo-proyecto` o conversar directamente con el usuario."
|
|
10
|
+
- "No cargar si el usuario pide 'ajustar' el PLAN.md ya aprobado sin nueva información — cada modificación al plan aprobado debe pasar por discusión primero."
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
---
|
|
13
|
+
# Habilidad: Planear Fase de Desarrollo
|
|
14
|
+
|
|
15
|
+
## Propósito
|
|
16
|
+
|
|
17
|
+
Un plan ejecutable no es una lista de tareas — es un grafo de dependencias con
|
|
18
|
+
criterios de verificación por tarea. Esta habilidad transforma el CONTEXTO.md de
|
|
19
|
+
una fase en un PLAN.md que el agente ejecutor puede seguir sin ambigüedad y sin
|
|
20
|
+
interrumpir al usuario para pedir aclaraciones.
|
|
21
|
+
|
|
22
|
+
## Cuándo activar
|
|
23
|
+
|
|
24
|
+
- Después de ejecutar `discutir-fase` y tener CONTEXTO.md listo
|
|
25
|
+
- Cuando el usuario pide "planear la fase N"
|
|
26
|
+
- Cuando un plan existente necesita revisión o replanificación
|
|
27
|
+
|
|
28
|
+
## Cuándo NO cargar
|
|
29
|
+
|
|
30
|
+
- No existe `.planning/fases/0N-CONTEXTO.md`; en ese caso usar `discutir-fase` antes. Un PLAN.md sin contexto es un plan con suposiciones implícitas.
|
|
31
|
+
- El usuario pide ajustar el PLAN.md aprobado solo porque cambia de opinión en mitad de la ejecución — eso es desviación mayor que requiere pausa en `ejecutar-fase`, no re-planificación completa.
|
|
32
|
+
- Se quiere generar únicamente un listado de tareas sin grafo de dependencias ni oleadas; ese backlog plano no es el producto de esta habilidad.
|
|
33
|
+
- La fase ya completó todos sus slices y se busca solo actualizar HOJA-RUTA.md — eso lo hace `ejecutar-fase` al cerrar.
|
|
34
|
+
|
|
35
|
+
## Prerrequisito obligatorio
|
|
36
|
+
|
|
37
|
+
Leer `.planning/fases/0N-CONTEXTO.md` antes de generar cualquier tarea. Si no existe,
|
|
38
|
+
activar primero `discutir-fase`.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Principios de descomposición
|
|
43
|
+
|
|
44
|
+
### 1. Atomicidad
|
|
45
|
+
|
|
46
|
+
Una tarea es atómica si:
|
|
47
|
+
- Puede completarse en una sola sesión de trabajo (< 2 horas de desarrollo)
|
|
48
|
+
- Tiene un único criterio de verificación binario (funciona / no funciona)
|
|
49
|
+
- Puede hacerse commit de forma independiente sin romper el sistema
|
|
50
|
+
|
|
51
|
+
Si una tarea viola alguna de estas condiciones, subdividirla.
|
|
52
|
+
|
|
53
|
+
### 2. Dependencias explícitas
|
|
54
|
+
|
|
55
|
+
Cada tarea declara sus dependencias en formato `[T-XX, T-YY]`. Una tarea sin
|
|
56
|
+
dependencias puede ejecutarse en la primera oleada. El grafo NO puede tener ciclos.
|
|
57
|
+
|
|
58
|
+
### 3. Clasificación AFK / HITL
|
|
59
|
+
|
|
60
|
+
| Tipo | Definición |
|
|
61
|
+
|------|-----------|
|
|
62
|
+
| AFK (autónoma) | El agente puede completarla sin intervención humana |
|
|
63
|
+
| HITL (human-in-the-loop) | Requiere decisión, revisión o input del usuario |
|
|
64
|
+
|
|
65
|
+
Las tareas HITL son puntos de parada obligatoria en la ejecución.
|
|
66
|
+
|
|
67
|
+
### 4. Oleadas de ejecución
|
|
68
|
+
|
|
69
|
+
Agrupa tareas sin dependencias mutuas en la misma oleada. Las tareas de una
|
|
70
|
+
oleada pueden ejecutarse en paralelo (o en secuencia rápida si el contexto lo
|
|
71
|
+
requiere).
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Algoritmo de construcción del plan
|
|
76
|
+
|
|
77
|
+
**Paso 0 — Recopilar inteligencia del codebase (obligatorio)**
|
|
78
|
+
ANTES de planear, investigar el código existente para que el plan sea auto-contenido:
|
|
79
|
+
|
|
80
|
+
1. Ejecutar `Grep` y `Glob` para encontrar archivos relacionados con la feature
|
|
81
|
+
2. Leer los archivos encontrados y extraer:
|
|
82
|
+
- Patrones de implementación reales (con `archivo:línea`)
|
|
83
|
+
- Convenciones de naming, imports, estructura de archivos
|
|
84
|
+
- Tests existentes como referencia de estilo
|
|
85
|
+
3. Documentar en el PLAN.md bajo `## Inteligencia del codebase`:
|
|
86
|
+
- **Patrones a imitar**: snippets reales del código existente con `archivo:línea`
|
|
87
|
+
- **Archivos a modificar**: lista con propósito de cada cambio
|
|
88
|
+
- **Dependencias relevantes**: versiones y APIs que se usarán
|
|
89
|
+
- **Convenciones observadas**: naming, estructura, error handling del proyecto
|
|
90
|
+
|
|
91
|
+
> El plan debe ser auto-contenido: el implementador puede ejecutar cada tarea
|
|
92
|
+
> sin investigar el codebase por su cuenta ni tomar decisiones de diseño.
|
|
93
|
+
|
|
94
|
+
**Paso 1 — Listar entregables**
|
|
95
|
+
Del CONTEXTO.md, extraer todos los entregables (features, endpoints, componentes,
|
|
96
|
+
migraciones, documentos).
|
|
97
|
+
|
|
98
|
+
**Paso 2 — Identificar capas**
|
|
99
|
+
Para cada entregable de software, descomponerlo en capas estándar:
|
|
100
|
+
- Tipos e interfaces / esquemas
|
|
101
|
+
- Modelos de datos y migraciones
|
|
102
|
+
- Lógica de negocio (services)
|
|
103
|
+
- Interfaz externa (endpoints / componentes UI)
|
|
104
|
+
- Tests
|
|
105
|
+
- Documentación
|
|
106
|
+
|
|
107
|
+
**Paso 3 — Asignar dependencias**
|
|
108
|
+
Aplicar regla: una capa no puede implementarse sin las capas de las que depende.
|
|
109
|
+
Orden típico: tipos → modelos → services → endpoints → UI → tests.
|
|
110
|
+
|
|
111
|
+
**Paso 4 — Agrupar en oleadas**
|
|
112
|
+
Usar topological sort mental: la Oleada N contiene todas las tareas cuyas
|
|
113
|
+
dependencias están en oleadas anteriores.
|
|
114
|
+
|
|
115
|
+
**Paso 5 — Verificación goal-backward**
|
|
116
|
+
Preguntar: "Si ejecuto todas las tareas del plan, ¿el criterio de éxito del
|
|
117
|
+
CONTEXTO.md queda satisfecho?" Si la respuesta es no, agregar las tareas faltantes.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Estructura del PLAN.md
|
|
122
|
+
|
|
123
|
+
```markdown
|
|
124
|
+
# PLAN.md — Fase [N]: [Nombre]
|
|
125
|
+
**Generado**: [fecha]
|
|
126
|
+
**Basado en**: 0N-CONTEXTO.md
|
|
127
|
+
**Criterio de éxito**: [copiado del CONTEXTO.md]
|
|
128
|
+
|
|
129
|
+
## Resumen del plan
|
|
130
|
+
- Total de tareas: N
|
|
131
|
+
- Oleadas: M
|
|
132
|
+
- Tareas HITL: K (paradas de revisión)
|
|
133
|
+
- Duración estimada: X horas / Y días
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Inteligencia del codebase
|
|
138
|
+
|
|
139
|
+
### Patrones a imitar
|
|
140
|
+
| Patrón | Archivo:línea | Ejemplo |
|
|
141
|
+
|--------|-------------|---------|
|
|
142
|
+
| [nombre del patrón] | `src/services/ejemplo.py:42` | [snippet real del código] |
|
|
143
|
+
|
|
144
|
+
### Archivos a modificar
|
|
145
|
+
| Archivo | Propósito del cambio |
|
|
146
|
+
|---------|---------------------|
|
|
147
|
+
| `src/...` | [qué se agrega/modifica y por qué] |
|
|
148
|
+
|
|
149
|
+
### Dependencias relevantes
|
|
150
|
+
| Dependencia | Versión | API que se usa |
|
|
151
|
+
|------------|---------|---------------|
|
|
152
|
+
| [nombre] | [versión] | [funciones/clases] |
|
|
153
|
+
|
|
154
|
+
### Convenciones observadas
|
|
155
|
+
- Naming: [convención real del proyecto]
|
|
156
|
+
- Imports: [orden y estilo]
|
|
157
|
+
- Error handling: [patrón usado]
|
|
158
|
+
- Tests: [framework, estructura, naming]
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Oleada 1 — Fundamentos (sin dependencias)
|
|
163
|
+
|
|
164
|
+
### T-01: [Nombre de la tarea]
|
|
165
|
+
- **Tipo**: AFK
|
|
166
|
+
- **Descripción**: [Qué hacer, sin ambigüedad. Incluir nombres de archivos si aplica.]
|
|
167
|
+
- **Entregable verificable**: [Qué existe cuando está completa]
|
|
168
|
+
- **Criterio de verificación**: [Comando de verificación o descripción observable]
|
|
169
|
+
- **Dependencias**: ninguna
|
|
170
|
+
- **Tiempo estimado**: 30 min
|
|
171
|
+
|
|
172
|
+
### T-02: [Nombre]
|
|
173
|
+
- **Tipo**: AFK
|
|
174
|
+
- **Descripción**:
|
|
175
|
+
- **Entregable verificable**:
|
|
176
|
+
- **Criterio de verificación**:
|
|
177
|
+
- **Dependencias**: ninguna
|
|
178
|
+
- **Tiempo estimado**:
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Oleada 2 — [Nombre conceptual]
|
|
183
|
+
|
|
184
|
+
### T-03: [Nombre]
|
|
185
|
+
- **Tipo**: AFK
|
|
186
|
+
- **Descripción**:
|
|
187
|
+
- **Entregable verificable**:
|
|
188
|
+
- **Criterio de verificación**:
|
|
189
|
+
- **Dependencias**: [T-01, T-02]
|
|
190
|
+
- **Tiempo estimado**:
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Oleada N — Verificación y cierre
|
|
195
|
+
|
|
196
|
+
### T-NN: Verificación goal-backward
|
|
197
|
+
- **Tipo**: HITL
|
|
198
|
+
- **Descripción**: Revisar que todos los criterios de éxito del CONTEXTO.md estén
|
|
199
|
+
satisfechos. Presentar evidencia al usuario.
|
|
200
|
+
- **Entregable verificable**: Reporte de verificación firmado
|
|
201
|
+
- **Criterio de verificación**: Usuario confirma aprobación
|
|
202
|
+
- **Dependencias**: [todas las tareas anteriores]
|
|
203
|
+
- **Tiempo estimado**: 30 min
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Matriz de riesgos del plan
|
|
208
|
+
|
|
209
|
+
| Tarea | Riesgo | Probabilidad | Mitigación |
|
|
210
|
+
|-------|--------|-------------|-----------|
|
|
211
|
+
| | | | |
|
|
212
|
+
|
|
213
|
+
## Tareas excluidas explícitamente
|
|
214
|
+
- [Feature X]: diferida a siguiente fase por [razón]
|
|
215
|
+
|
|
216
|
+
## Notas de diseño del plan
|
|
217
|
+
[Decisiones tomadas durante la planeación que el ejecutor debe conocer]
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Anti-patrones a evitar en el plan
|
|
223
|
+
|
|
224
|
+
- **Tarea "Implementar módulo X"**: demasiado vaga, no atómica
|
|
225
|
+
- **Dependencias circulares**: T-03 depende de T-05 que depende de T-03
|
|
226
|
+
- **Tarea sin criterio de verificación**: no se puede saber si está hecha
|
|
227
|
+
- **Plan sin oleada de verificación final**: el plan puede estar completo pero
|
|
228
|
+
los criterios de éxito sin satisfacer
|
|
229
|
+
- **Mezclar implementación y tests en una sola tarea**: deben ser tareas separadas
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Checklist antes de entregar el PLAN.md
|
|
234
|
+
|
|
235
|
+
- [ ] Todas las tareas son atómicas (< 2 horas)
|
|
236
|
+
- [ ] Todas las dependencias forman un DAG (sin ciclos)
|
|
237
|
+
- [ ] Cada tarea tiene criterio de verificación binario
|
|
238
|
+
- [ ] Las tareas HITL están identificadas y justificadas
|
|
239
|
+
- [ ] La verificación goal-backward confirma que el plan satisface CONTEXTO.md
|
|
240
|
+
- [ ] El plan está guardado en `.planning/fases/0N-PLAN.md`
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Gotchas / Errores comunes no obvios
|
|
245
|
+
|
|
246
|
+
- **Plan sin Paso 0 (inteligencia del codebase)**: el agente genera tareas basadas en supuestos de estructura de archivos sin leer el codebase real. Causa: se omite el Paso 0 por urgencia. Solución: ejecutar `Grep` y `Glob` sobre los módulos que la fase tocará antes de escribir la primera tarea; los nombres de archivos en el PLAN.md deben ser rutas reales, no inventadas.
|
|
247
|
+
- **Ciclo en el DAG de dependencias**: T-03 depende de T-05 que depende de T-03, imposibilitando cualquier oleada de inicio. Causa: se asignan dependencias sin verificar acyclicidad. Solución: hacer topological sort mental tras asignar dependencias; si aparece un ciclo, extraer la interfaz compartida como una tarea T-00 sin dependencias.
|
|
248
|
+
- **Oleada de verificación final mezclada con implementación**: la tarea de verificación goal-backward se agrupa en la misma oleada que la última tarea de implementación, permitiendo que el ejecutor la omita. Causa: se trata la verificación como un paso más, no como una oleada separada. Solución: la oleada de verificación siempre es la última, con dependencias de todas las oleadas anteriores.
|
|
249
|
+
- **Criterio de verificación observable por el ejecutor, no por el usuario**: el criterio dice "que funcione correctamente" en lugar de un comando ejecutable. Causa: redacción laxa. Solución: el criterio debe ser un comando concreto (`pytest tests/modulo/ -v`, `curl http://localhost:8000/endpoint`) o una observación binaria ("la tabla X aparece en alembic history").
|
|
250
|
+
- **PLAN.md aprobado sin estado: aprobado en frontmatter**: el ejecutor inicia sin verificar que el plan está aprobado, lo que puede llevar a ejecutar un plan en borrador. Causa: el frontmatter no incluye `estado: aprobado`. Solución: agregar `estado: aprobado` al frontmatter antes de entregar al ejecutor, ya que `seguridad-agentes.md` exige esta verificación.
|
|
251
|
+
|
|
252
|
+
## Reglas anti-placeholder (obligatorio)
|
|
253
|
+
|
|
254
|
+
Un plan con placeholders es un defecto. El implementador debe poder ejecutar cada tarea
|
|
255
|
+
sin tomar decisiones de diseno ni pedir aclaraciones.
|
|
256
|
+
|
|
257
|
+
### Placeholders prohibidos
|
|
258
|
+
- `TBD`, `PENDIENTE`, `por definir`, `implementar despues`
|
|
259
|
+
- "agregar manejo de errores" (debe decir QUE errores y COMO)
|
|
260
|
+
- "agregar validacion" (debe decir CUAL validacion con CUAL regla)
|
|
261
|
+
- "similar a la tarea N" (debe repetir el contenido relevante)
|
|
262
|
+
- "agregar tests apropiados" (debe especificar QUE tests con QUE escenarios)
|
|
263
|
+
- Referencias a tipos/funciones no definidos en el plan
|
|
264
|
+
|
|
265
|
+
### Auto-revision antes de entregar
|
|
266
|
+
1. `grep -rni "TBD\|PENDIENTE\|por definir\|implementar despues" PLAN.md`
|
|
267
|
+
2. Cada tarea: el implementador puede ejecutarla sin preguntas?
|
|
268
|
+
3. Interfaces entre tareas: tipos y nombres consistentes?
|
|
269
|
+
4. Cada requisito tiene al menos una tarea?
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: postgresql-experto
|
|
3
|
+
description: PostgreSQL avanzado. JSONB, arrays, tipos personalizados, búsqueda de texto completo, window functions, CTEs recursivos, Row Level Security y funciones almacenadas.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Grep]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para optimización de queries SQL (EXPLAIN ANALYZE, índices, partitioning) — para optimización cargar `sql-optimizacion`."
|
|
8
|
+
- "No cargar para MongoDB, Redis o bases de datos NoSQL — este skill es específico de PostgreSQL; para Redis cargar `redis-experto`, para MongoDB cargar `mongodb-experto`."
|
|
9
|
+
- "No cargar para ORM de SQLAlchemy o migraciones con Alembic — los ORM tienen patrones propios; para FastAPI/SQLAlchemy cargar `fastapi-experto`."
|
|
10
|
+
- "No cargar para bases de datos MySQL, SQLite o SQL Server — las extensiones JSONB, RLS y funciones almacenadas son específicas de PostgreSQL."
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
---
|
|
13
|
+
# PostgreSQL Experto
|
|
14
|
+
|
|
15
|
+
## Cuándo NO cargar
|
|
16
|
+
|
|
17
|
+
- La tarea es optimización de queries: EXPLAIN ANALYZE, índices B-Tree, particionamiento — cargar `sql-optimizacion`.
|
|
18
|
+
- La base de datos es MongoDB, Redis, DynamoDB u otra NoSQL — para Redis cargar `redis-experto`, para MongoDB cargar `mongodb-experto`.
|
|
19
|
+
- El trabajo es con ORM de SQLAlchemy o migraciones Alembic — para FastAPI/SQLAlchemy cargar `fastapi-experto`.
|
|
20
|
+
- La base de datos es MySQL, SQLite o SQL Server — JSONB, RLS y `gen_random_uuid()` son específicos de PostgreSQL.
|
|
21
|
+
|
|
22
|
+
## JSONB — Datos semiestructurados
|
|
23
|
+
|
|
24
|
+
JSONB almacena JSON en formato binario descompuesto, lo que permite:
|
|
25
|
+
- Indexación eficiente con GIN.
|
|
26
|
+
- Queries directos sobre campos anidados.
|
|
27
|
+
- Operators potentes (`@>`, `?`, `#>>`).
|
|
28
|
+
|
|
29
|
+
### Operadores JSONB esenciales
|
|
30
|
+
|
|
31
|
+
```sql
|
|
32
|
+
-- Crear tabla con columna JSONB
|
|
33
|
+
CREATE TABLE productos (
|
|
34
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
35
|
+
nombre TEXT NOT NULL,
|
|
36
|
+
metadata JSONB NOT NULL DEFAULT '{}'
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
-- Operadores de acceso
|
|
40
|
+
SELECT metadata -> 'marca' AS marca; -- Retorna JSON: "Dell"
|
|
41
|
+
SELECT metadata ->> 'marca' AS marca; -- Retorna texto: Dell
|
|
42
|
+
SELECT metadata #>> '{specs, ram}' AS ram; -- Ruta anidada como texto: 16
|
|
43
|
+
|
|
44
|
+
-- Contención @> : ¿el objeto contiene este subconjunto?
|
|
45
|
+
SELECT * FROM productos
|
|
46
|
+
WHERE metadata @> '{"marca": "Dell"}';
|
|
47
|
+
|
|
48
|
+
-- Existencia de clave ?
|
|
49
|
+
SELECT * FROM productos
|
|
50
|
+
WHERE metadata ? 'descuento';
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Índices para JSONB
|
|
54
|
+
|
|
55
|
+
```sql
|
|
56
|
+
-- GIN genérico: cubre todos los campos y operadores @>, ?, ?|, ?&
|
|
57
|
+
CREATE INDEX idx_productos_metadata ON productos USING GIN(metadata);
|
|
58
|
+
|
|
59
|
+
-- GIN específico para una ruta (más pequeño, más rápido)
|
|
60
|
+
CREATE INDEX idx_productos_marca ON productos
|
|
61
|
+
USING GIN((metadata -> 'marca'));
|
|
62
|
+
|
|
63
|
+
-- B-Tree en campo JSONB específico (para igualdad y rangos)
|
|
64
|
+
CREATE INDEX idx_productos_ram ON productos
|
|
65
|
+
((metadata #>> '{specs, ram}'));
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Modificar JSONB
|
|
69
|
+
|
|
70
|
+
```sql
|
|
71
|
+
-- Agregar/modificar campo
|
|
72
|
+
UPDATE productos
|
|
73
|
+
SET metadata = metadata || '{"precio": 29999.00}'::jsonb
|
|
74
|
+
WHERE id = ?;
|
|
75
|
+
|
|
76
|
+
-- Eliminar campo
|
|
77
|
+
UPDATE productos
|
|
78
|
+
SET metadata = metadata - 'descuento'
|
|
79
|
+
WHERE id = ?;
|
|
80
|
+
|
|
81
|
+
-- Modificar campo anidado
|
|
82
|
+
UPDATE productos
|
|
83
|
+
SET metadata = jsonb_set(metadata, '{specs, ram}', '32', false)
|
|
84
|
+
WHERE id = ?;
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Búsqueda de Texto Completo (Full-Text Search)
|
|
90
|
+
|
|
91
|
+
```sql
|
|
92
|
+
-- Configurar columna de búsqueda (tsvector)
|
|
93
|
+
ALTER TABLE productos ADD COLUMN busqueda_ts tsvector
|
|
94
|
+
GENERATED ALWAYS AS (
|
|
95
|
+
to_tsvector('spanish', coalesce(nombre, '') || ' ' || coalesce(descripcion, ''))
|
|
96
|
+
) STORED;
|
|
97
|
+
|
|
98
|
+
-- Índice GIN para búsqueda rápida
|
|
99
|
+
CREATE INDEX idx_productos_busqueda ON productos USING GIN(busqueda_ts);
|
|
100
|
+
|
|
101
|
+
-- Query de búsqueda con ranking
|
|
102
|
+
SELECT nombre, ts_rank(busqueda_ts, query) AS relevancia
|
|
103
|
+
FROM productos,
|
|
104
|
+
to_tsquery('spanish', 'laptop & (dell | hp)') AS query
|
|
105
|
+
WHERE busqueda_ts @@ query
|
|
106
|
+
ORDER BY relevancia DESC
|
|
107
|
+
LIMIT 20;
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Row Level Security (RLS)
|
|
113
|
+
|
|
114
|
+
RLS permite que PostgreSQL aplique filtros automáticos de seguridad a nivel de fila.
|
|
115
|
+
|
|
116
|
+
```sql
|
|
117
|
+
-- Habilitar RLS en la tabla
|
|
118
|
+
ALTER TABLE facturas ENABLE ROW LEVEL SECURITY;
|
|
119
|
+
ALTER TABLE facturas FORCE ROW LEVEL SECURITY;
|
|
120
|
+
|
|
121
|
+
-- Política: cada usuario ve solo sus facturas
|
|
122
|
+
CREATE POLICY facturas_por_empresa ON facturas
|
|
123
|
+
FOR ALL
|
|
124
|
+
TO app_user
|
|
125
|
+
USING (empresa_id = current_setting('app.empresa_id')::uuid);
|
|
126
|
+
|
|
127
|
+
-- Política separada para admins (pueden ver todo)
|
|
128
|
+
CREATE POLICY facturas_admin ON facturas
|
|
129
|
+
FOR ALL
|
|
130
|
+
TO app_admin
|
|
131
|
+
USING (true);
|
|
132
|
+
|
|
133
|
+
-- En la aplicación: establecer el contexto antes de cada query
|
|
134
|
+
SET LOCAL app.empresa_id = '550e8400-e29b-41d4-a716-446655440000';
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
Para arrays nativos, tipos personalizados (ENUM, compuestos, dominios),
|
|
140
|
+
funciones almacenadas PL/pgSQL, configuración de performance, y extensiones útiles,
|
|
141
|
+
ver [recursos/referencia-completa.md](recursos/referencia-completa.md).
|
|
142
|
+
|
|
143
|
+
## Gotchas / Errores comunes no obvios
|
|
144
|
+
|
|
145
|
+
**`SET LOCAL app.empresa_id` para RLS no persiste fuera de una transacción**: `SET LOCAL` establece la variable solo para la transacción actual — si se ejecuta fuera de `BEGIN/COMMIT`, tiene el mismo efecto que `SET` (sesión completa). En aplicaciones con pooling (PgBouncer en transaction mode), la sesión se reutiliza entre conexiones y la variable puede persistir de una petición anterior. Causa: el pool de conexiones reutiliza sessions sin limpiar el estado. Fix: usar SIEMPRE `SET LOCAL` dentro de una transacción explícita (`async with session.begin()`) y verificar que el pool esté en transaction mode.
|
|
146
|
+
|
|
147
|
+
**GIN index en columna JSONB no se usa con el operador `->>` en una cláusula WHERE**: `WHERE metadata ->> 'marca' = 'Dell'` extrae texto y compara — este operador no usa el índice GIN. Solo los operadores `@>`, `?`, `?|`, `?&` usan el índice GIN. Causa: `->>` convierte JSONB a texto y la comparación es una operación de texto sin índice JSONB. Fix: para búsquedas de igualdad con índice, usar `WHERE metadata @> '{"marca": "Dell"}'` que sí usa el índice GIN, o crear un índice de expresión B-Tree sobre `(metadata ->> 'marca')`.
|
|
148
|
+
|
|
149
|
+
**`FORCE ROW LEVEL SECURITY` no protege al usuario dueño de la tabla (superuser/owner)**: el propietario de la tabla y los superusuarios de PostgreSQL bypasean RLS por defecto aunque esté `FORCE` habilitado. Causa: `FORCE` aplica a todos los usuarios excepto al dueño de la tabla y a superusuarios. Fix: si la aplicación conecta como el dueño de la tabla, cambiar el rol de conexión a un rol de aplicación sin privilegios de dueño (`GRANT CONNECT ON DATABASE ... TO app_user`), no usar el usuario `postgres` para conexiones de aplicación.
|
|
150
|
+
|
|
151
|
+
**`tsvector` `GENERATED ALWAYS AS STORED` no actualiza cuando cambia la configuración de idioma**: si la columna `busqueda_ts` fue generada con `to_tsvector('spanish', ...)` y luego se cambia el contenido con texto en otro idioma, las palabras no se stemmizan correctamente — pero la columna no se regenera. Causa: la columna generada se recalcula solo cuando cambia la fila, no cuando cambia la lógica de la expresión. Fix: si se cambia la expresión de la columna generada, hacer `ALTER TABLE ... DROP COLUMN busqueda_ts; ALTER TABLE ... ADD COLUMN ...` para regenerar todos los valores.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../schemas/skill-evals.schema.json",
|
|
3
|
+
"skill_name": "postgresql-experto",
|
|
4
|
+
"artifact_type": "skill",
|
|
5
|
+
"schema_version": 1,
|
|
6
|
+
"description": "Evals para postgresql-experto — tipos, JSONB, índices especializados, CTE.",
|
|
7
|
+
"evals": [
|
|
8
|
+
{
|
|
9
|
+
"id": 0,
|
|
10
|
+
"prompt": "Almacenar un objeto de configuración flexible — ¿`json` o `jsonb`?",
|
|
11
|
+
"files": [],
|
|
12
|
+
"expectations": [
|
|
13
|
+
"`jsonb` (no `json`).",
|
|
14
|
+
"La respuesta explica: jsonb permite índices GIN y operadores `->`/`@>`, json solo almacena texto.",
|
|
15
|
+
"Excepción aceptable: si solo se lee y preservar formato exacto es crítico."
|
|
16
|
+
],
|
|
17
|
+
"tags": ["types"],
|
|
18
|
+
"weight": 1.5
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "uuid-vs-serial",
|
|
22
|
+
"prompt": "PK de una tabla users en un sistema distribuido. ¿uuid o bigserial?",
|
|
23
|
+
"files": [],
|
|
24
|
+
"expectations": [
|
|
25
|
+
"La respuesta discute ambos: uuid v4/v7 para distribución, bigserial simple.",
|
|
26
|
+
"Menciona que uuid v7 (ordenable por tiempo) es mejor que v4 para índices.",
|
|
27
|
+
"Menciona overhead de uuid vs bigint."
|
|
28
|
+
],
|
|
29
|
+
"tags": ["design"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "index-partial",
|
|
33
|
+
"prompt": "Query frecuente: `SELECT * FROM orders WHERE status = 'pending'` (pending es 2% de la tabla). Índice óptimo?",
|
|
34
|
+
"files": [],
|
|
35
|
+
"expectations": [
|
|
36
|
+
"`CREATE INDEX ON orders (created_at) WHERE status = 'pending'` (índice parcial).",
|
|
37
|
+
"La respuesta justifica: índice pequeño, mantiene performance con tabla grande."
|
|
38
|
+
],
|
|
39
|
+
"tags": ["indexing"]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "anti-pattern-varchar-n",
|
|
43
|
+
"prompt": "¿Debo usar `varchar(255)` o `text` para un campo email?",
|
|
44
|
+
"files": [],
|
|
45
|
+
"expectations": [
|
|
46
|
+
"`text` (o `varchar` sin límite) en PostgreSQL — no hay penalización de performance por varchar sin límite.",
|
|
47
|
+
"Menciona que la validación de longitud va al nivel de aplicación o como CHECK constraint.",
|
|
48
|
+
"Contraste con MySQL donde varchar(255) tiene razones históricas."
|
|
49
|
+
],
|
|
50
|
+
"tags": ["anti-pattern"]
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Referencia Completa — PostgreSQL Experto
|
|
2
|
+
|
|
3
|
+
## Arrays Nativos de PostgreSQL
|
|
4
|
+
|
|
5
|
+
```sql
|
|
6
|
+
-- Columna de array
|
|
7
|
+
CREATE TABLE articulos (
|
|
8
|
+
id SERIAL PRIMARY KEY,
|
|
9
|
+
titulo TEXT NOT NULL,
|
|
10
|
+
etiquetas TEXT[] NOT NULL DEFAULT '{}'
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
-- Insertar con array
|
|
14
|
+
INSERT INTO articulos (titulo, etiquetas)
|
|
15
|
+
VALUES ('Intro a SQL', ARRAY['sql', 'basico', 'tutorial']);
|
|
16
|
+
|
|
17
|
+
-- Operadores de array
|
|
18
|
+
SELECT * FROM articulos WHERE 'sql' = ANY(etiquetas); -- Contiene elemento
|
|
19
|
+
SELECT * FROM articulos WHERE etiquetas @> ARRAY['sql']; -- Contiene subconjunto
|
|
20
|
+
SELECT * FROM articulos WHERE etiquetas && ARRAY['sql', 'python']; -- Intersección
|
|
21
|
+
|
|
22
|
+
-- Índice GIN para arrays
|
|
23
|
+
CREATE INDEX idx_articulos_etiquetas ON articulos USING GIN(etiquetas);
|
|
24
|
+
|
|
25
|
+
-- Unnest de array a filas
|
|
26
|
+
SELECT titulo, unnest(etiquetas) AS etiqueta FROM articulos;
|
|
27
|
+
|
|
28
|
+
-- Funciones de array
|
|
29
|
+
SELECT array_length(etiquetas, 1) AS num_etiquetas FROM articulos;
|
|
30
|
+
SELECT array_append(etiquetas, 'nuevo') FROM articulos WHERE id = 1;
|
|
31
|
+
SELECT array_remove(etiquetas, 'obsoleto') FROM articulos WHERE id = 1;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Tipos Personalizados
|
|
37
|
+
|
|
38
|
+
### ENUM
|
|
39
|
+
|
|
40
|
+
```sql
|
|
41
|
+
-- Crear tipo enum
|
|
42
|
+
CREATE TYPE estatus_factura AS ENUM ('borrador', 'emitida', 'cancelada', 'pagada');
|
|
43
|
+
|
|
44
|
+
-- Usar en tabla
|
|
45
|
+
ALTER TABLE facturas
|
|
46
|
+
ADD COLUMN estatus estatus_factura NOT NULL DEFAULT 'borrador';
|
|
47
|
+
|
|
48
|
+
-- Agregar valor a un enum existente (sin drop/recreate en PostgreSQL 9.1+)
|
|
49
|
+
ALTER TYPE estatus_factura ADD VALUE 'en_revision' AFTER 'borrador';
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Tipos Compuestos
|
|
53
|
+
|
|
54
|
+
```sql
|
|
55
|
+
-- Tipo compuesto para dirección
|
|
56
|
+
CREATE TYPE direccion AS (
|
|
57
|
+
calle TEXT,
|
|
58
|
+
numero TEXT,
|
|
59
|
+
colonia TEXT,
|
|
60
|
+
ciudad TEXT,
|
|
61
|
+
cp CHAR(5)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- Usar en tabla
|
|
65
|
+
ALTER TABLE clientes ADD COLUMN domicilio_fiscal direccion;
|
|
66
|
+
|
|
67
|
+
-- Insertar
|
|
68
|
+
UPDATE clientes
|
|
69
|
+
SET domicilio_fiscal = ROW('Insurgentes Sur', '1234', 'Del Valle', 'CDMX', '03100')::direccion
|
|
70
|
+
WHERE id = ?;
|
|
71
|
+
|
|
72
|
+
-- Acceder a campos
|
|
73
|
+
SELECT (domicilio_fiscal).ciudad FROM clientes WHERE id = ?;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Dominio (tipo con constraint)
|
|
77
|
+
|
|
78
|
+
```sql
|
|
79
|
+
CREATE DOMAIN rfc_mx AS TEXT
|
|
80
|
+
CHECK (VALUE ~ '^[A-Z]{3,4}[0-9]{6}[A-Z0-9]{3}$');
|
|
81
|
+
|
|
82
|
+
CREATE DOMAIN email_valido AS TEXT
|
|
83
|
+
CHECK (VALUE ~ '^[^@]+@[^@]+\.[^@]+$');
|
|
84
|
+
|
|
85
|
+
-- Usar el dominio
|
|
86
|
+
ALTER TABLE clientes
|
|
87
|
+
ALTER COLUMN rfc TYPE rfc_mx USING rfc::rfc_mx,
|
|
88
|
+
ALTER COLUMN email TYPE email_valido USING email::email_valido;
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Funciones Almacenadas (PL/pgSQL)
|
|
94
|
+
|
|
95
|
+
```sql
|
|
96
|
+
-- Función para calcular total de factura
|
|
97
|
+
CREATE OR REPLACE FUNCTION calcular_total_factura(p_factura_id UUID)
|
|
98
|
+
RETURNS DECIMAL(12, 2)
|
|
99
|
+
LANGUAGE plpgsql
|
|
100
|
+
STABLE -- No modifica BD, mismo input = mismo output en la transacción
|
|
101
|
+
AS $$
|
|
102
|
+
DECLARE
|
|
103
|
+
v_subtotal DECIMAL(12, 2);
|
|
104
|
+
v_tasa_iva DECIMAL(4, 2);
|
|
105
|
+
BEGIN
|
|
106
|
+
SELECT
|
|
107
|
+
SUM(cantidad * precio_unitario),
|
|
108
|
+
MAX(tasa_iva)
|
|
109
|
+
INTO v_subtotal, v_tasa_iva
|
|
110
|
+
FROM items_factura
|
|
111
|
+
WHERE factura_id = p_factura_id;
|
|
112
|
+
|
|
113
|
+
IF v_subtotal IS NULL THEN
|
|
114
|
+
RAISE EXCEPTION 'Factura % no encontrada o sin ítems', p_factura_id;
|
|
115
|
+
END IF;
|
|
116
|
+
|
|
117
|
+
RETURN v_subtotal * (1 + v_tasa_iva);
|
|
118
|
+
END;
|
|
119
|
+
$$;
|
|
120
|
+
|
|
121
|
+
-- Trigger para auditoría automática
|
|
122
|
+
CREATE OR REPLACE FUNCTION trigger_auditoria()
|
|
123
|
+
RETURNS TRIGGER
|
|
124
|
+
LANGUAGE plpgsql
|
|
125
|
+
AS $$
|
|
126
|
+
BEGIN
|
|
127
|
+
INSERT INTO auditoria (
|
|
128
|
+
tabla, operacion, fila_anterior, fila_nueva,
|
|
129
|
+
usuario_db, timestamp
|
|
130
|
+
) VALUES (
|
|
131
|
+
TG_TABLE_NAME,
|
|
132
|
+
TG_OP,
|
|
133
|
+
CASE WHEN TG_OP = 'DELETE' THEN row_to_json(OLD) ELSE NULL END,
|
|
134
|
+
CASE WHEN TG_OP IN ('INSERT', 'UPDATE') THEN row_to_json(NEW) ELSE NULL END,
|
|
135
|
+
current_user,
|
|
136
|
+
NOW()
|
|
137
|
+
);
|
|
138
|
+
RETURN COALESCE(NEW, OLD);
|
|
139
|
+
END;
|
|
140
|
+
$$;
|
|
141
|
+
|
|
142
|
+
CREATE TRIGGER auditoria_facturas
|
|
143
|
+
AFTER INSERT OR UPDATE OR DELETE ON facturas
|
|
144
|
+
FOR EACH ROW EXECUTE FUNCTION trigger_auditoria();
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Configuración de Performance
|
|
150
|
+
|
|
151
|
+
```sql
|
|
152
|
+
-- Ver configuración actual
|
|
153
|
+
SHOW shared_buffers; -- Cache de PostgreSQL (recomendado: 25% de RAM)
|
|
154
|
+
SHOW effective_cache_size; -- Estimación de cache total del SO (75% de RAM)
|
|
155
|
+
SHOW work_mem; -- Memoria por operación de sort/hash
|
|
156
|
+
SHOW max_connections;
|
|
157
|
+
|
|
158
|
+
-- Queries lentas en pg_stat_statements
|
|
159
|
+
SELECT
|
|
160
|
+
query,
|
|
161
|
+
calls,
|
|
162
|
+
total_exec_time / 1000 AS total_seg,
|
|
163
|
+
mean_exec_time AS avg_ms,
|
|
164
|
+
rows / calls AS avg_rows
|
|
165
|
+
FROM pg_stat_statements
|
|
166
|
+
ORDER BY total_exec_time DESC
|
|
167
|
+
LIMIT 20;
|
|
168
|
+
|
|
169
|
+
-- Tablas con más seq scans (candidatos para índices)
|
|
170
|
+
SELECT
|
|
171
|
+
schemaname,
|
|
172
|
+
tablename,
|
|
173
|
+
seq_scan,
|
|
174
|
+
idx_scan,
|
|
175
|
+
n_live_tup AS filas
|
|
176
|
+
FROM pg_stat_user_tables
|
|
177
|
+
WHERE seq_scan > idx_scan
|
|
178
|
+
AND n_live_tup > 10000
|
|
179
|
+
ORDER BY seq_scan DESC;
|
|
180
|
+
|
|
181
|
+
-- Índices no usados (candidatos para eliminar)
|
|
182
|
+
SELECT
|
|
183
|
+
schemaname,
|
|
184
|
+
tablename,
|
|
185
|
+
indexname,
|
|
186
|
+
idx_scan AS veces_usado,
|
|
187
|
+
pg_size_pretty(pg_relation_size(indexrelid)) AS tamano
|
|
188
|
+
FROM pg_stat_user_indexes
|
|
189
|
+
WHERE idx_scan = 0
|
|
190
|
+
AND indexname NOT LIKE '%_pkey'
|
|
191
|
+
ORDER BY pg_relation_size(indexrelid) DESC;
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Extensiones Útiles
|
|
197
|
+
|
|
198
|
+
```sql
|
|
199
|
+
-- uuid-ossp o gen_random_uuid() (nativa en PostgreSQL 13+)
|
|
200
|
+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
201
|
+
SELECT uuid_generate_v4(); -- uuid-ossp
|
|
202
|
+
SELECT gen_random_uuid(); -- nativa (preferir esta)
|
|
203
|
+
|
|
204
|
+
-- pg_trgm: búsqueda difusa con LIKE/ILIKE eficiente
|
|
205
|
+
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
|
206
|
+
CREATE INDEX ON clientes USING GIN(nombre gin_trgm_ops);
|
|
207
|
+
SELECT * FROM clientes WHERE nombre % 'empresa acme'; -- similitud
|
|
208
|
+
|
|
209
|
+
-- pgcrypto: hashing y cifrado
|
|
210
|
+
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
211
|
+
SELECT crypt('contraseña', gen_salt('bf')); -- Bcrypt
|
|
212
|
+
|
|
213
|
+
-- pg_stat_statements: monitoreo de queries
|
|
214
|
+
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
|
|
215
|
+
```
|