@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,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: infra-github-actions
|
|
3
|
+
description: >
|
|
4
|
+
GitHub Actions CI/CD para proyectos que usan swl-ses. Cubre los tres workflows
|
|
5
|
+
distribuidos (swl-security.yml, swl-ci.yml, release-please.yml), setup del secret
|
|
6
|
+
CLAUDE_API_KEY, branch protection y troubleshooting. Cargar cuando se configura
|
|
7
|
+
CI/CD con GitHub Actions en un proyecto donde está instalado swl-ses.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# infra-github-actions — GitHub Actions con swl-ses
|
|
11
|
+
|
|
12
|
+
## Cuándo cargar
|
|
13
|
+
|
|
14
|
+
- Al ejecutar `/swl:configurar-ci init` y necesitar guía de setup
|
|
15
|
+
- Al depurar un workflow que no dispara o falla por API key
|
|
16
|
+
- Al configurar branch protection en el proyecto
|
|
17
|
+
- Al decidir si adoptar release-please vs el flujo manual actual
|
|
18
|
+
|
|
19
|
+
## Cuándo NO cargar
|
|
20
|
+
|
|
21
|
+
- El proyecto usa Azure DevOps Pipelines o GitLab CI — esos tienen su propia configuración
|
|
22
|
+
- El objetivo es Kubernetes, Terraform o infraestructura cloud (cargar `kubernetes-orquestacion` o `terraform-experto`)
|
|
23
|
+
- La tarea es solo correr tests localmente sin CI
|
|
24
|
+
- El proyecto no usa GitHub como repositorio
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Workflows distribuidos por swl-ses
|
|
29
|
+
|
|
30
|
+
| Archivo | Propósito | Secrets requeridos |
|
|
31
|
+
|---------|-----------|-------------------|
|
|
32
|
+
| `swl-security.yml` | Revisión semántica de seguridad con Claude en cada PR | `CLAUDE_API_KEY` |
|
|
33
|
+
| `swl-ci.yml` | Lint + tests en push y PRs. Node 22+24, Python/Rust/Go comentados | Ninguno |
|
|
34
|
+
| `release-please.yml` | Release PR automático + tag + GitHub Release | Ninguno (`GITHUB_TOKEN` automático) |
|
|
35
|
+
|
|
36
|
+
Instalación con: `/swl:configurar-ci init`
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Reglas obligatorias
|
|
41
|
+
|
|
42
|
+
**NUNCA** commitear API keys en código ni en archivos de workflow.
|
|
43
|
+
Todo secret va en GitHub Settings → Secrets and variables → Actions.
|
|
44
|
+
|
|
45
|
+
**Permisos mínimos siempre**: declarar solo `contents: read` y `pull-requests: write`
|
|
46
|
+
en el nivel del workflow. Nunca `permissions: write-all`.
|
|
47
|
+
|
|
48
|
+
**Los workflows de forks externos no reciben secrets** por diseño de GitHub.
|
|
49
|
+
La revisión de seguridad con Claude solo funciona en PRs desde ramas del mismo repo,
|
|
50
|
+
no desde repos forked. Es un comportamiento de GitHub, no un bug.
|
|
51
|
+
|
|
52
|
+
**No hardcodear nombres de rama** más allá de `main`. Si el proyecto usa otra rama
|
|
53
|
+
por defecto, editar el `on: push: branches` en los workflows copiados.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Setup de CLAUDE_API_KEY
|
|
58
|
+
|
|
59
|
+
1. Ir a https://console.anthropic.com y crear o copiar la API key
|
|
60
|
+
2. En GitHub: Settings → Secrets and variables → Actions → New repository secret
|
|
61
|
+
- Nombre: `CLAUDE_API_KEY`
|
|
62
|
+
- Valor: la API key
|
|
63
|
+
3. La key necesita permisos tanto para Claude API como para Claude Code
|
|
64
|
+
|
|
65
|
+
Verificar con gh CLI si el secret ya existe:
|
|
66
|
+
```bash
|
|
67
|
+
gh secret list | grep CLAUDE_API_KEY
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Para configurar vía CLI (valor desde stdin, no queda en historial):
|
|
71
|
+
```bash
|
|
72
|
+
gh secret set CLAUDE_API_KEY
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Branch protection
|
|
78
|
+
|
|
79
|
+
Aplicar después de tener CI funcionando. El script del repo swl-ses:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Ver qué haría sin aplicar cambios
|
|
83
|
+
node scripts/configurar-branch-protection.js --dry-run
|
|
84
|
+
|
|
85
|
+
# Aplicar
|
|
86
|
+
node scripts/configurar-branch-protection.js
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Requiere `gh` CLI autenticado y permisos de admin en el repositorio.
|
|
90
|
+
|
|
91
|
+
Configura: require PR, status checks (`test (22)`, `test (24)`, `smoke`),
|
|
92
|
+
1 approval, bloquea force-push y deletions.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Adoptar release-please (opt-in)
|
|
97
|
+
|
|
98
|
+
Ver `docs/RELEASE-PLEASE-MIGRATION.md` para comparativa completa.
|
|
99
|
+
|
|
100
|
+
El flujo actual del repo swl-ses usa `scripts/publicar.js` (manual). release-please
|
|
101
|
+
es una alternativa automática viable para proyectos de usuarios.
|
|
102
|
+
|
|
103
|
+
Instalar:
|
|
104
|
+
```
|
|
105
|
+
/swl:configurar-ci --with-release-please
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Una vez activo, el flujo es:
|
|
109
|
+
1. Hacer merge de commits convencionales a main
|
|
110
|
+
2. release-please abre un "Release PR" automático con bump de versión y CHANGELOG
|
|
111
|
+
3. Al mergear ese PR → tag git + GitHub Release creado automáticamente
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Gotchas / Errores comunes no obvios
|
|
116
|
+
|
|
117
|
+
**GitHub Free + repo privado → 403 en branch protection Y Rulesets**: tanto el endpoint legacy
|
|
118
|
+
`/repos/.../branches/{}/protection` como el endpoint moderno `/repos/.../rulesets` requieren
|
|
119
|
+
**plan de pago** en repos privados (HTTP 403 "Upgrade to GitHub Pro or make this repository public"
|
|
120
|
+
en ambos). Mi documentación inicial afirmó incorrectamente que Rulesets era gratis para repos
|
|
121
|
+
privados Free — verificación empírica posterior confirmó que NO. Ambos endpoints están bloqueados.
|
|
122
|
+
|
|
123
|
+
Planes que destraban la feature en privado:
|
|
124
|
+
- **Pro** ($4/mes): aplica a repos en cuenta personal del titular Pro.
|
|
125
|
+
- **Team** ($4/usuario/mes): aplica solo a repos **de la organización** que paga Team. NO aplica
|
|
126
|
+
a repos en la cuenta personal del admin de la org. Para que Team aplique al repo, transferirlo:
|
|
127
|
+
`gh repo transfer cuenta-personal/repo --new-owner org`.
|
|
128
|
+
|
|
129
|
+
Sin plan de pago y manteniendo repo privado, las opciones son: pre-push hook local
|
|
130
|
+
(bypasseable con `--no-verify`) y workflow advisory (no bloquea push, crea issue post-hoc).
|
|
131
|
+
|
|
132
|
+
**Push directo a main bloqueado tras activar branch protection**: si configuraste
|
|
133
|
+
branch protection antes de que tu usuario tuviera al menos un PR mergeado con los
|
|
134
|
+
status checks pasando, el repo puede quedar en estado donde nadie puede mergear.
|
|
135
|
+
Causa: GitHub verifica los status checks declarados antes de permitir el merge; si
|
|
136
|
+
los checks no han corrido en el branch, el botón de merge queda bloqueado.
|
|
137
|
+
Fix: crear una rama temporal con un cambio trivial, abrir PR, dejar que los checks
|
|
138
|
+
corran, y mergear. Luego ya funciona el flujo normal.
|
|
139
|
+
|
|
140
|
+
**GITHUB_TOKEN no puede aprobar su propio PR** al usar release-please: release-please
|
|
141
|
+
crea un Release PR con el GITHUB_TOKEN del bot — ese mismo token no puede aprobarlo
|
|
142
|
+
si el repo requiere al menos 1 approval humano. Causa: GitHub bloquea la auto-aprobación
|
|
143
|
+
con el token de Actions por defecto.
|
|
144
|
+
Fix: crear un Personal Access Token (PAT) con scope `repo` y usarlo en el workflow:
|
|
145
|
+
`token: ${{ secrets.MY_RELEASE_TOKEN }}`. O reducir el required approvals a 0 para
|
|
146
|
+
el Release PR (no recomendado en repos con múltiples contribuidores).
|
|
147
|
+
|
|
148
|
+
**`anthropics/claude-code-security-review@main` falla con "API key not set"**: el
|
|
149
|
+
secret `CLAUDE_API_KEY` no está configurado o el nombre no coincide exactamente.
|
|
150
|
+
La action es sensible a mayúsculas — `claude_api_key` (minúsculas) no funciona.
|
|
151
|
+
Fix: verificar con `gh secret list`. El nombre debe ser exactamente `CLAUDE_API_KEY`.
|
|
152
|
+
|
|
153
|
+
**El workflow `swl-ci.yml` pasa localmente pero falla en CI con "lint script not found"**:
|
|
154
|
+
el campo `lint` no está definido en `package.json` del proyecto del usuario. La plantilla
|
|
155
|
+
usa `npm run lint --if-present` precisamente para ser tolerante, pero si el proyecto
|
|
156
|
+
tiene un nombre distinto (ej: `eslint`, `check`) el step se salta silenciosamente.
|
|
157
|
+
Fix: agregar el script `"lint": "..."` en `package.json` o editar el workflow para usar
|
|
158
|
+
el nombre correcto.
|
|
159
|
+
|
|
160
|
+
**release-please genera changelog con commits `chore(release)` del repo padre swl-ses**:
|
|
161
|
+
si el proyecto del usuario adoptó los mensajes de commit de swl-ses que incluyen
|
|
162
|
+
`chore(release): v5.X.Y`, release-please los interpreta como commits de release
|
|
163
|
+
y puede generar bumps incorrectos.
|
|
164
|
+
Fix: usar mensajes de commit convencionales estándar para el proyecto del usuario,
|
|
165
|
+
separados del estilo de swl-ses. Los prefijos `feat:`, `fix:`, `chore:` sin el
|
|
166
|
+
patrón `(release): vX.Y.Z` no causan conflicto.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: instalar-sistema
|
|
3
|
+
description: "Instala o actualiza el sistema SWL en el proyecto actual. Usar PROACTIVAMENTE cuando: (1) el usuario pide instalar SWL, (2) se detecta que el proyecto no tiene .claude/agents/ ni .claude/skills/ con componentes SWL, (3) el usuario menciona perfiles de instalación o pide agregar agentes/skills al proyecto. NO usar cuando SWL ya está instalado y funcionando correctamente."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
version: "1.0.1"
|
|
6
|
+
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
7
|
+
exclusiones:
|
|
8
|
+
- "No cargar si SWL ya está instalado y funcionando (`doctor` pasa sin errores); no reinstalar para resolver problemas de uso del sistema."
|
|
9
|
+
- "No cargar para actualizar un skill o agente individual; editar el SKILL.md o agente directamente en `habilidades/` o `agentes/`."
|
|
10
|
+
- "No cargar para diagnosticar integridad del sistema instalado; usar `/swl:salud`."
|
|
11
|
+
- "No cargar para añadir skills de `_userland/` al core; usar `/swl:contribuir`."
|
|
12
|
+
evolvable: true # default para skill estandar
|
|
13
|
+
---
|
|
14
|
+
# Skill: instalar-sistema
|
|
15
|
+
|
|
16
|
+
Gestiona la instalación, actualización y verificación del sistema SWL (swl-ses) dentro de un proyecto mediante Claude Code.
|
|
17
|
+
|
|
18
|
+
## Cuándo se activa
|
|
19
|
+
|
|
20
|
+
Este skill se activa proactivamente cuando:
|
|
21
|
+
|
|
22
|
+
- El usuario dice "instala SWL", "quiero usar el sistema SWL", "configura SWL en este proyecto"
|
|
23
|
+
- El usuario menciona perfiles: "necesito el perfil backend-python", "instala perfil completo"
|
|
24
|
+
- Se detecta que el proyecto no tiene componentes SWL instalados (no hay `.claude/.swl-install-state.json`)
|
|
25
|
+
- El usuario pide actualizar SWL: "actualiza SWL", "quiero la última versión"
|
|
26
|
+
|
|
27
|
+
NO se activa cuando:
|
|
28
|
+
- SWL ya está instalado y el usuario no pidió cambios
|
|
29
|
+
- El usuario está trabajando normalmente con los agentes/skills ya instalados
|
|
30
|
+
|
|
31
|
+
## Cuándo NO cargar
|
|
32
|
+
|
|
33
|
+
- SWL está instalado y `npx swl-ses doctor` pasa sin errores; reinstalar no resuelve problemas de uso.
|
|
34
|
+
- El usuario quiere modificar un skill o agente específico; editar los archivos en `habilidades/` o `agentes/` directamente.
|
|
35
|
+
- Se quiere diagnosticar por qué algo del sistema no funciona; usar `/swl:salud` que ejecuta validaciones sin reinstalar.
|
|
36
|
+
- Se quiere incorporar skills de `_userland/` al core del sistema; ese flujo es `/swl:contribuir`, no una reinstalación.
|
|
37
|
+
|
|
38
|
+
## Paquete npm
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
@saulwade/swl-ses (canónico, npmjs.org — recomendado)
|
|
42
|
+
@saul-wade/swl-ses (mirror, GitHub Packages — requiere token)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Registry canónico: `https://registry.npmjs.org/` (sin auth para instalar)
|
|
46
|
+
Mirror: `https://npm.pkg.github.com` (auth con token de GitHub en `~/.npmrc`)
|
|
47
|
+
Requiere: Node.js >= 22
|
|
48
|
+
|
|
49
|
+
## Comandos CLI disponibles
|
|
50
|
+
|
|
51
|
+
| Comando | Función |
|
|
52
|
+
|---------|---------|
|
|
53
|
+
| `npx @saulwade/swl-ses@latest init` | Crea `.planning/` y `_userland/` |
|
|
54
|
+
| `npx @saulwade/swl-ses@latest install --target claude --profile <perfil>` | Instala componentes |
|
|
55
|
+
| `npx @saulwade/swl-ses@latest doctor` | Verifica instalación |
|
|
56
|
+
| `npx @saulwade/swl-ses@latest update` | Actualiza componentes |
|
|
57
|
+
| `npx @saulwade/swl-ses@latest uninstall --target claude` | Desinstala componentes |
|
|
58
|
+
|
|
59
|
+
## Perfiles
|
|
60
|
+
|
|
61
|
+
| Perfil | Descripción | Componentes |
|
|
62
|
+
|--------|-------------|-------------|
|
|
63
|
+
| `core` | Mínimo viable | 13 agentes, 20 skills, 9 comandos, 5 reglas, 3 hooks |
|
|
64
|
+
| `backend-python` | Python fullstack | Core + 7 skills Python + 3 skills API + 3 skills datos |
|
|
65
|
+
| `backend-node` | Node.js fullstack | Core + 2 skills Node + 3 skills API |
|
|
66
|
+
| `frontend-react` | React frontend | Core + 2 skills React + 5 skills estilos + 3 skills UX |
|
|
67
|
+
| `frontend-angular` | Angular frontend | Core + 2 skills Angular + 5 skills estilos + 3 skills UX |
|
|
68
|
+
| `fullstack-python-angular` | Python + Angular | Backend Python + Frontend Angular |
|
|
69
|
+
| `fullstack-node-react` | Node + React | Backend Node + Frontend React |
|
|
70
|
+
| `mobile` | Mobile dev | Core + 2 skills mobile + frontend agentes |
|
|
71
|
+
| `devops` | Infraestructura | Core + 6 skills infra + 3 skills seguridad |
|
|
72
|
+
| `completo` | Todo SWL | 37 agentes, 60 skills, 14 comandos, 11 reglas, 6 hooks |
|
|
73
|
+
|
|
74
|
+
## Flujo de instalación
|
|
75
|
+
|
|
76
|
+
### Instalación nueva (proyecto sin SWL)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 1. Inicializar estructura
|
|
80
|
+
npx @saulwade/swl-ses@latest init
|
|
81
|
+
|
|
82
|
+
# 2. Instalar componentes (elegir perfil según necesidad)
|
|
83
|
+
npx @saulwade/swl-ses@latest install --target claude --profile <perfil>
|
|
84
|
+
|
|
85
|
+
# 3. Verificar
|
|
86
|
+
npx @saulwade/swl-ses@latest doctor
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Actualización (SWL ya instalado)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Re-instala con el mismo perfil, sobrescribiendo archivos
|
|
93
|
+
npx @saulwade/swl-ses@latest install --target claude --profile <perfil> --force
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Cambio de perfil
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Instalar con nuevo perfil (sobrescribe)
|
|
100
|
+
npx @saulwade/swl-ses@latest install --target claude --profile <nuevo-perfil> --force
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Instalación global (todos los proyectos)
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npx @saulwade/swl-ses@latest install --target claude --profile <perfil> --global
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Detección automática de stack tecnológico
|
|
110
|
+
|
|
111
|
+
El instalador detecta automáticamente los lenguajes presentes en el proyecto y filtra las reglas de lenguaje irrelevantes **antes** de copiarlas a `.claude/rules/`. Esto es crítico porque Claude Code auto-carga todos los `.md` de `.claude/rules/` en cada conversación.
|
|
112
|
+
|
|
113
|
+
**Lenguajes detectados automáticamente:**
|
|
114
|
+
|
|
115
|
+
| Lenguaje | Indicadores |
|
|
116
|
+
|----------|-------------|
|
|
117
|
+
| `java` | `pom.xml`, `build.gradle`, `build.gradle.kts`, archivos `.java` |
|
|
118
|
+
| `go` | `go.mod`, archivos `.go` |
|
|
119
|
+
| `rust` | `Cargo.toml`, archivos `.rs` |
|
|
120
|
+
| `csharp` | Archivos `.csproj`, `.sln`, `.cs` |
|
|
121
|
+
| `kotlin` | Archivos `.kt`, `.kts` |
|
|
122
|
+
| `swift` | `Package.swift`, directorio `Sources/`, archivos `.swift` |
|
|
123
|
+
| `php` | `composer.json`, `artisan`, archivos `.php` |
|
|
124
|
+
| `nextjs` | `next.config.js/ts/mjs/cjs` |
|
|
125
|
+
|
|
126
|
+
**Comportamiento:**
|
|
127
|
+
- En un proyecto Python/Angular/TypeScript: **0 reglas de lenguaje instaladas** (Python/TS/Angular no tienen `reglas/lenguajes/` propias)
|
|
128
|
+
- En un proyecto Java: solo las 5 reglas de `reglas/lenguajes/java/` se instalan
|
|
129
|
+
- Perfil `completo` en proyecto Python: instala `reglas-core` + `reglas-calidad` únicamente (ahorra ~700 líneas de contexto)
|
|
130
|
+
|
|
131
|
+
**Omitir la detección (instalar todos los lenguajes):**
|
|
132
|
+
```bash
|
|
133
|
+
npx swl-ses install --target claude --profile completo --all-langs
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Qué instala y dónde
|
|
137
|
+
|
|
138
|
+
| Componente | Destino | Claude Code lo descubre |
|
|
139
|
+
|------------|---------|------------------------|
|
|
140
|
+
| Agentes (.md) | `.claude/agents/` | Si — disponibles como `subagent_type` |
|
|
141
|
+
| Skills (dirs con SKILL.md) | `.claude/skills/` | Si — aparecen en system reminders, auto-activación |
|
|
142
|
+
| Comandos (.md) | `.claude/commands/swl/` | Si — disponibles como `/swl:*` slash commands |
|
|
143
|
+
| Reglas generales (.md) | `.claude/rules/` | Si — cargadas automáticamente en cada conversación |
|
|
144
|
+
| Reglas de lenguaje (.md) | `.claude/rules/LANG/` | Si — solo para lenguajes detectados en el proyecto |
|
|
145
|
+
| Hooks (.js) | `./hooks/` | Si — registrados automáticamente en `.claude/settings.json` |
|
|
146
|
+
| Plantillas | `.planning/` | N/A — templates para planeación |
|
|
147
|
+
|
|
148
|
+
## Prerrequisitos para instalación remota
|
|
149
|
+
|
|
150
|
+
Si el usuario no tiene el registry configurado:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Configurar registry de GitHub Packages (una vez por máquina)
|
|
154
|
+
npm config set @saul-wade:registry https://npm.pkg.github.com
|
|
155
|
+
|
|
156
|
+
# Configurar token en ~/.npmrc (una vez por máquina)
|
|
157
|
+
# Agregar línea: //npm.pkg.github.com/:_authToken=<GITHUB_CLASSIC_PAT>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
El token debe ser un **GitHub Classic PAT** con scopes `read:packages`.
|
|
161
|
+
|
|
162
|
+
## Detección de instalación existente
|
|
163
|
+
|
|
164
|
+
Para verificar si SWL está instalado:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Verificar archivo de estado
|
|
168
|
+
cat .claude/.swl-install-state.json 2>/dev/null
|
|
169
|
+
|
|
170
|
+
# Verificar agentes SWL
|
|
171
|
+
ls .claude/agents/*-swl.md 2>/dev/null | head -5
|
|
172
|
+
|
|
173
|
+
# Verificar hooks registrados
|
|
174
|
+
cat .claude/settings.json 2>/dev/null | grep -c "hooks/"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Gotchas / Errores comunes no obvios
|
|
178
|
+
|
|
179
|
+
- **Instalación con perfil `completo` en proyecto Python/TypeScript instala reglas de lenguaje innecesarias**: si no se usa la detección automática de stack, el perfil `completo` instala 5 reglas Java + 5 Go + 5 Rust aunque el proyecto no use esos lenguajes, incrementando el contexto base en ~700 líneas por sesión. Causa: no se activó la detección automática de stack. Solución: dejar que el instalador detecte automáticamente o usar `--all-langs` solo si se trabaja con todos los lenguajes; verificar con `ls .claude/rules/` post-instalación.
|
|
180
|
+
- **`~/.npmrc` sin el token configurado bloquea la instalación silenciosamente**: `npx @saulwade/swl-ses@latest init` falla con `401 Unauthorized` desde GitHub Packages. Causa: el token de GitHub Packages no está en `~/.npmrc`. Solución: configurar el `_authToken` en `~/.npmrc` y verificar con `npm whoami --registry https://npm.pkg.github.com` antes de la primera instalación.
|
|
181
|
+
- **Cambio de perfil sin `--force` no actualiza componentes existentes**: el usuario cambia de `backend-python` a `fullstack-python-angular` pero los nuevos skills de Angular no se instalan porque los archivos ya existen. Causa: el instalador no sobreescribe por defecto. Solución: usar `--force` explícitamente en cambios de perfil: `install --target claude --profile <nuevo-perfil> --force`.
|
|
182
|
+
- **markitdown no instalado detectado tardíamente**: el agente intenta convertir un `.docx` en sesión y falla porque `markitdown` no está disponible, interrumpiendo el flujo de trabajo. Causa: el prerequisito de Python se documenta en el skill pero no se verifica automáticamente durante la instalación. Solución: ejecutar `markitdown --version` como parte del checklist post-instalación; si no está disponible, instalarlo antes de iniciar trabajo con documentos Office.
|
|
183
|
+
- **Scripts o hooks que leen `swl-install-state.json` solo en el proyecto actual fallan silenciosamente en instalaciones globales**: un hook intenta detectar la versión instalada leyendo `.claude/.swl-install-state.json` relativo al cwd o relativo al directorio del hook; en instalaciones SWL **solo globales** (la mayoría), ese archivo solo existe en `~/.claude/.swl-install-state.json` y el check sale sin resultado — ninguna alerta, ninguna detección, falla invisible. Causa: el instalador crea el state file en la ubicación del target (`~/.claude/` para `--global`, `./.claude/` para `--local`), pero los consumidores suelen buscar en una sola de esas ubicaciones. Solución: cualquier script/hook que dependa del state del instalador debe buscar en **7 ubicaciones** y tomar la del `mtime` más reciente cuando haya varias:
|
|
184
|
+
```
|
|
185
|
+
~/.claude/.swl-install-state.json (global Claude, mayoría de usuarios)
|
|
186
|
+
./.claude/.swl-install-state.json (local al proyecto)
|
|
187
|
+
./.github/.swl-install-state.json (Copilot)
|
|
188
|
+
./.codex/.swl-install-state.json (Codex CLI)
|
|
189
|
+
./.gemini/.swl-install-state.json (Gemini CLI)
|
|
190
|
+
./.opencode/.swl-install-state.json (OpenCode)
|
|
191
|
+
<dirname-del-script>/../../.claude/.swl-install-state.json (hook instalado en .claude/hooks/)
|
|
192
|
+
```
|
|
193
|
+
Ejemplo canónico: `hooks/check-update.js` versión 5.10.3+ implementa esta búsqueda con prioridad por `mtime` y fallback a `package.json` del repo madre. Nunca asumir una sola ubicación de state — el CLI puede instalarse en combinaciones arbitrarias.
|
|
194
|
+
|
|
195
|
+
## Después de instalar
|
|
196
|
+
|
|
197
|
+
### Prerequisito Python: markitdown
|
|
198
|
+
|
|
199
|
+
SWL instala la regla `markitdown.md` en `.claude/rules/` para que los agentes
|
|
200
|
+
sepan convertir archivos `.docx`, `.xlsx`, `.pptx` e `.ipynb` a Markdown.
|
|
201
|
+
La herramienta en sí requiere instalación manual una vez por máquina:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
pip install markitdown[pdf,docx,pptx,xlsx]
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Verificar que quedó correctamente instalada:
|
|
208
|
+
```bash
|
|
209
|
+
markitdown --version
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
> Sin este prerequisito los agentes pueden pedir al usuario el contenido en texto plano,
|
|
213
|
+
> pero no podrán convertir archivos Office ni Jupyter automáticamente.
|
|
214
|
+
|
|
215
|
+
### Comandos disponibles tras la instalación
|
|
216
|
+
|
|
217
|
+
- `/swl:nuevo-proyecto` — iniciar proyecto desde cero
|
|
218
|
+
- `/swl:mapear-codebase` — analizar código existente
|
|
219
|
+
- `/swl:planear-fase` — planificar una fase de trabajo
|
|
220
|
+
- `/swl:ejecutar-fase` — ejecutar plan con commits atómicos
|
|
221
|
+
- `/swl:salud` — diagnóstico profundo del sistema
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: java-experto
|
|
3
|
+
description: >
|
|
4
|
+
Java moderno con Spring Boot, JPA/Hibernate, records, sealed classes y streams.
|
|
5
|
+
Cargar cuando se implementen servicios Spring Boot, entidades JPA, repositorios
|
|
6
|
+
Spring Data, lógica de negocio Java 17+ o se configure application.yml/profiles.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
herramientasPermitidas: [Read, Grep]
|
|
9
|
+
exclusiones:
|
|
10
|
+
- "No cargar para escribir tests JUnit o de integración Spring — para testing cargar `java-testing`."
|
|
11
|
+
- "No cargar para diseñar patrones Java avanzados (records, sealed classes, pattern matching) — para diseño cargar `java-patrones`."
|
|
12
|
+
- "No cargar para errores de compilación Java o Maven/Gradle — para build errors cargar `build-errors-java`."
|
|
13
|
+
- "No cargar para servicios Kotlin/Android — Kotlin tiene patrones distintos (coroutines, Compose); cargar `kotlin-experto`."
|
|
14
|
+
evolvable: true # default para skill estandar
|
|
15
|
+
---
|
|
16
|
+
# Java Experto — Spring Boot y Java Moderno
|
|
17
|
+
|
|
18
|
+
Cubre el stack Java moderno: Spring Boot 3, JPA/Hibernate, Spring Data, records,
|
|
19
|
+
sealed classes y Stream API avanzado. Aplica a servicios REST, acceso a datos y
|
|
20
|
+
lógica de dominio en proyectos Java 17+.
|
|
21
|
+
|
|
22
|
+
## Cuándo cargar este skill
|
|
23
|
+
|
|
24
|
+
Invoca `Skill("java-experto")` cuando:
|
|
25
|
+
|
|
26
|
+
- Se implementen controllers, services o repositories Spring Boot
|
|
27
|
+
- Se definan entidades JPA o relaciones Hibernate
|
|
28
|
+
- Se usen records como DTOs o value objects
|
|
29
|
+
- Se configure Spring Profiles o application.yml
|
|
30
|
+
- Se use Stream API con collectors, groupingBy o flatMap complejos
|
|
31
|
+
- Se implemente concurrencia con CompletableFuture
|
|
32
|
+
|
|
33
|
+
## Cuándo NO cargar
|
|
34
|
+
|
|
35
|
+
- La tarea es escribir tests JUnit, MockMvc o de integración con TestContainers — para testing cargar `java-testing`.
|
|
36
|
+
- La pregunta es sobre patrones Java modernos (records como value objects, sealed classes, pattern matching) — para diseño cargar `java-patrones`.
|
|
37
|
+
- Los errores son de compilación Java, Maven o Gradle — para build errors cargar `build-errors-java`.
|
|
38
|
+
- El proyecto es Kotlin/Android — Kotlin tiene patrones distintos (coroutines, Hilt, Compose); cargar `kotlin-experto`.
|
|
39
|
+
|
|
40
|
+
## Conceptos clave
|
|
41
|
+
|
|
42
|
+
### Spring Boot Autoconfiguration
|
|
43
|
+
|
|
44
|
+
Spring Boot configura beans automáticamente según el classpath. El desarrollador
|
|
45
|
+
declara dependencias; Spring Boot registra la infraestructura. Sobreescribir solo
|
|
46
|
+
lo necesario con `@Bean` en una `@Configuration`.
|
|
47
|
+
|
|
48
|
+
### JPA Entity Lifecycle
|
|
49
|
+
|
|
50
|
+
Ciclo: Transient -> Managed -> Detached -> Removed. Un entity managed dentro de
|
|
51
|
+
una transacción activa se sincroniza automáticamente al flush. Fuera de transacción
|
|
52
|
+
es Detached y los cambios no persisten.
|
|
53
|
+
|
|
54
|
+
### Records como DTOs
|
|
55
|
+
|
|
56
|
+
Los records son inmutables, ideales para DTOs de request/response. No mezclar
|
|
57
|
+
records con entidades JPA — las entidades requieren estado mutable y constructor
|
|
58
|
+
sin argumentos.
|
|
59
|
+
|
|
60
|
+
### Sealed Classes para dominios cerrados
|
|
61
|
+
|
|
62
|
+
`sealed interface` + `permits` define un conjunto cerrado de subtipos conocidos
|
|
63
|
+
en tiempo de compilación. Permite pattern matching exhaustivo en switch.
|
|
64
|
+
|
|
65
|
+
## Reglas obligatorias
|
|
66
|
+
|
|
67
|
+
### Separar entidad de DTO — NUNCA usar entity como DTO
|
|
68
|
+
|
|
69
|
+
Exponer entidades JPA directamente en la API serializa relaciones no deseadas,
|
|
70
|
+
rompe el encapsulamiento y crea dependencias de schema en el contrato de API.
|
|
71
|
+
|
|
72
|
+
**Correcto**:
|
|
73
|
+
```java
|
|
74
|
+
// Entidad — solo para persistencia
|
|
75
|
+
@Entity
|
|
76
|
+
public class Pedido {
|
|
77
|
+
@Id @GeneratedValue UUID id;
|
|
78
|
+
@ManyToOne(fetch = FetchType.LAZY) Cliente cliente;
|
|
79
|
+
@OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL)
|
|
80
|
+
List<ItemPedido> items;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// DTO — solo para transporte
|
|
84
|
+
public record PedidoResponse(UUID id, String clienteNombre, List<ItemResponse> items) {}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Inyectar por constructor — NUNCA @Autowired en campos
|
|
88
|
+
|
|
89
|
+
La inyección en campos oculta dependencias, impide tests unitarios sin contenedor
|
|
90
|
+
y viola el principio de inversión de dependencias.
|
|
91
|
+
|
|
92
|
+
```java
|
|
93
|
+
// MAL
|
|
94
|
+
@Service
|
|
95
|
+
public class PedidoService {
|
|
96
|
+
@Autowired private PedidoRepository repo; // no testeable sin contexto Spring
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// BIEN
|
|
100
|
+
@Service
|
|
101
|
+
@RequiredArgsConstructor
|
|
102
|
+
public class PedidoService {
|
|
103
|
+
private final PedidoRepository repo; // testeable con mock directo
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Lógica en services — NUNCA en controllers
|
|
108
|
+
|
|
109
|
+
El controller orquesta HTTP: valida input, delega al service, mapea respuesta.
|
|
110
|
+
No contiene if/else de negocio, cálculos ni acceso directo a repositorios.
|
|
111
|
+
|
|
112
|
+
### @Transactional solo donde hay escritura
|
|
113
|
+
|
|
114
|
+
Anotar con `@Transactional(readOnly = true)` los métodos de solo lectura.
|
|
115
|
+
Evitar `@Transactional` en la clase entera — propaga transacciones innecesarias
|
|
116
|
+
y bloquea recursos.
|
|
117
|
+
|
|
118
|
+
### FetchType.LAZY por defecto en relaciones
|
|
119
|
+
|
|
120
|
+
`FetchType.EAGER` en `@ManyToOne` y `@OneToMany` ejecuta JOINs automáticos en
|
|
121
|
+
cada query. Usar LAZY y cargar explícitamente con JOIN FETCH cuando se necesite.
|
|
122
|
+
|
|
123
|
+
## Patrones recomendados
|
|
124
|
+
|
|
125
|
+
### Controller delgado
|
|
126
|
+
|
|
127
|
+
```java
|
|
128
|
+
@RestController
|
|
129
|
+
@RequestMapping("/v1/pedidos")
|
|
130
|
+
@RequiredArgsConstructor
|
|
131
|
+
public class PedidoController {
|
|
132
|
+
private final PedidoService service;
|
|
133
|
+
|
|
134
|
+
@PostMapping
|
|
135
|
+
@ResponseStatus(HttpStatus.CREATED)
|
|
136
|
+
public PedidoResponse crear(@Valid @RequestBody CrearPedidoRequest req) {
|
|
137
|
+
return service.crear(req);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@GetMapping("/{id}")
|
|
141
|
+
public PedidoResponse obtener(@PathVariable UUID id) {
|
|
142
|
+
return service.obtener(id)
|
|
143
|
+
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Record como DTO con validación
|
|
149
|
+
|
|
150
|
+
```java
|
|
151
|
+
public record CrearPedidoRequest(
|
|
152
|
+
@NotNull UUID clienteId,
|
|
153
|
+
@NotEmpty List<@Valid ItemRequest> items
|
|
154
|
+
) {}
|
|
155
|
+
|
|
156
|
+
public record ItemRequest(
|
|
157
|
+
@NotNull UUID productoId,
|
|
158
|
+
@Positive int cantidad
|
|
159
|
+
) {}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Sealed interface para resultados de dominio
|
|
163
|
+
|
|
164
|
+
```java
|
|
165
|
+
public sealed interface ResultadoPago permits ResultadoPago.Aprobado,
|
|
166
|
+
ResultadoPago.Rechazado, ResultadoPago.Pendiente {
|
|
167
|
+
|
|
168
|
+
record Aprobado(String transaccionId) implements ResultadoPago {}
|
|
169
|
+
record Rechazado(String motivo) implements ResultadoPago {}
|
|
170
|
+
record Pendiente(Duration tiempoEstimado) implements ResultadoPago {}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Uso con switch exhaustivo (no requiere default)
|
|
174
|
+
String mensaje = switch (resultado) {
|
|
175
|
+
case ResultadoPago.Aprobado a -> "Aprobado: " + a.transaccionId();
|
|
176
|
+
case ResultadoPago.Rechazado r -> "Rechazado: " + r.motivo();
|
|
177
|
+
case ResultadoPago.Pendiente p -> "Pendiente " + p.tiempoEstimado();
|
|
178
|
+
};
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Stream API con collectors avanzados
|
|
182
|
+
|
|
183
|
+
```java
|
|
184
|
+
// groupingBy con downstream collector
|
|
185
|
+
Map<String, DoubleSummaryStatistics> estadisticasPorCategoria = productos.stream()
|
|
186
|
+
.collect(Collectors.groupingBy(
|
|
187
|
+
Producto::categoria,
|
|
188
|
+
Collectors.summarizingDouble(Producto::precio)
|
|
189
|
+
));
|
|
190
|
+
|
|
191
|
+
// partitioningBy para bifurcar
|
|
192
|
+
Map<Boolean, List<Pedido>> pedidosPorEstado = pedidos.stream()
|
|
193
|
+
.collect(Collectors.partitioningBy(p -> p.estatus() == Estatus.COMPLETADO));
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### CompletableFuture para operaciones paralelas
|
|
197
|
+
|
|
198
|
+
```java
|
|
199
|
+
CompletableFuture<Cliente> clienteFuture = CompletableFuture
|
|
200
|
+
.supplyAsync(() -> clienteService.obtener(clienteId), executor);
|
|
201
|
+
|
|
202
|
+
CompletableFuture<List<Producto>> productosFuture = CompletableFuture
|
|
203
|
+
.supplyAsync(() -> productoService.listar(filtro), executor);
|
|
204
|
+
|
|
205
|
+
return clienteFuture.thenCombine(productosFuture,
|
|
206
|
+
(cliente, productos) -> new ResumenResponse(cliente, productos))
|
|
207
|
+
.get(5, TimeUnit.SECONDS);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Anti-patrones conocidos
|
|
211
|
+
|
|
212
|
+
### Optional.get() sin verificar — NUNCA hacer esto
|
|
213
|
+
|
|
214
|
+
```java
|
|
215
|
+
// MAL — lanza NoSuchElementException si esta vacio
|
|
216
|
+
Optional<Usuario> u = repo.findById(id);
|
|
217
|
+
return u.get(); // excepcion silenciosa
|
|
218
|
+
|
|
219
|
+
// BIEN
|
|
220
|
+
return repo.findById(id)
|
|
221
|
+
.orElseThrow(() -> new NotFoundException("Usuario no encontrado: " + id));
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Transacción demasiado larga
|
|
225
|
+
|
|
226
|
+
```java
|
|
227
|
+
// MAL — transaccion abierta durante llamada HTTP externa
|
|
228
|
+
@Transactional
|
|
229
|
+
public void procesarPedido(UUID id) {
|
|
230
|
+
Pedido pedido = repo.findById(id).orElseThrow();
|
|
231
|
+
String token = pagoExternoClient.obtenerToken(); // llamada HTTP dentro de tx
|
|
232
|
+
pedido.marcarEnProceso(token);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// BIEN — llamada externa fuera de transaccion
|
|
236
|
+
public void procesarPedido(UUID id) {
|
|
237
|
+
String token = pagoExternoClient.obtenerToken(); // fuera de tx
|
|
238
|
+
guardarToken(id, token); // tx minima
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@Transactional
|
|
242
|
+
private void guardarToken(UUID id, String token) {
|
|
243
|
+
Pedido pedido = repo.findById(id).orElseThrow();
|
|
244
|
+
pedido.marcarEnProceso(token);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Null en colecciones
|
|
249
|
+
|
|
250
|
+
```java
|
|
251
|
+
// MAL — NullPointerException en iteracion
|
|
252
|
+
List<String> tags = null;
|
|
253
|
+
tags.forEach(System.out::println);
|
|
254
|
+
|
|
255
|
+
// BIEN — colecciones vacias en lugar de null
|
|
256
|
+
List<String> tags = Collections.emptyList();
|
|
257
|
+
// o en entidad JPA
|
|
258
|
+
@OneToMany
|
|
259
|
+
List<Tag> tags = new ArrayList<>();
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Checklist de verificación
|
|
263
|
+
|
|
264
|
+
- [ ] Entidades JPA no se exponen directamente como response body
|
|
265
|
+
- [ ] Toda inyección es por constructor (no @Autowired en campos)
|
|
266
|
+
- [ ] @Transactional solo en métodos de escritura; readOnly=true en consultas
|
|
267
|
+
- [ ] FetchType.LAZY en todas las relaciones; JOIN FETCH explicito cuando se necesite
|
|
268
|
+
- [ ] Controllers sin lógica de negocio: solo validación + delegación + mapeo
|
|
269
|
+
- [ ] Optional usado con orElseThrow o orElse, nunca con .get() directo
|
|
270
|
+
- [ ] Colecciones inicializadas vacías, nunca null
|
|
271
|
+
|
|
272
|
+
## Referencias
|
|
273
|
+
|
|
274
|
+
- Spring Boot Reference: https://docs.spring.io/spring-boot/docs/current/reference/html/
|
|
275
|
+
- JPA Spec (Jakarta Persistence 3.1): https://jakarta.ee/specifications/persistence/
|
|
276
|
+
- Java Records JEP 395: https://openjdk.org/jeps/395
|
|
277
|
+
- Sealed Classes JEP 409: https://openjdk.org/jeps/409
|
|
278
|
+
|
|
279
|
+
## Gotchas / Errores comunes no obvios
|
|
280
|
+
|
|
281
|
+
**`@Transactional` en un método privado o llamado desde la misma clase no activa la transacción**: Spring implementa `@Transactional` con un proxy AOP — si el método es privado o se llama con `this.metodo()` desde la misma clase, el proxy no intercepta la llamada y no hay transacción. Fix: mover el método anotado a otro bean, o inyectar la misma clase (self-injection) como dependencia para forzar el paso por el proxy.
|
|
282
|
+
|
|
283
|
+
**`FetchType.LAZY` con serialización JSON lanza `LazyInitializationException` en colecciones no cargadas**: si una entidad con relación lazy se serializa a JSON fuera de una sesión Hibernate abierta (por ejemplo, después de que el método `@Transactional` ya retornó), Jackson intenta acceder a la colección lazy y Hibernate lanza la excepción. Fix: usar DTOs y mapear explícitamente los datos necesarios dentro de la transacción, o configurar `spring.jpa.open-in-view=false` y manejar la carga en el service.
|
|
284
|
+
|
|
285
|
+
**`Optional.get()` sin `isPresent()` lanza `NoSuchElementException` en lugar de `NullPointerException`**: el propósito de `Optional` es reemplazar null, pero usar `.get()` directamente reproduce el mismo problema con un tipo de excepción diferente. Fix: usar siempre `.orElseThrow(() -> new EntidadNotFoundException(...))` para dar un mensaje de error semántico, nunca `.get()` directo.
|
|
286
|
+
|
|
287
|
+
**Records no pueden ser entidades JPA**: `@Entity record Producto(String nombre)` compila pero falla en runtime porque JPA requiere un constructor sin parámetros y campos mutables. Cause: los records son inmutables por diseño. Fix: usar records solo como DTOs de transferencia; definir entidades JPA como clases con `@Entity`, `@Id` y campos anotados.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
*Skill creado con swl:crear-skill el 2026-03-31. Versión 1.0.0.*
|