@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.
Files changed (702) hide show
  1. package/CLAUDE.md +238 -0
  2. package/README.md +560 -0
  3. package/_userland/agentes/.gitkeep +0 -0
  4. package/_userland/habilidades/.gitkeep +0 -0
  5. package/agentes/.evolved.json +9 -0
  6. package/agentes/accesibilidad-wcag-swl.md +692 -0
  7. package/agentes/arquitecto-swl.md +238 -0
  8. package/agentes/auto-evolucion-swl.md +854 -0
  9. package/agentes/backend-api-swl.md +470 -0
  10. package/agentes/backend-csharp-swl.md +418 -0
  11. package/agentes/backend-go-swl.md +388 -0
  12. package/agentes/backend-java-swl.md +279 -0
  13. package/agentes/backend-node-swl.md +477 -0
  14. package/agentes/backend-python-swl.md +608 -0
  15. package/agentes/backend-rust-swl.md +362 -0
  16. package/agentes/backend-workers-swl.md +480 -0
  17. package/agentes/cloud-infra-swl.md +485 -0
  18. package/agentes/consolidador-swl.md +539 -0
  19. package/agentes/datos-swl.md +584 -0
  20. package/agentes/depurador-swl.md +349 -0
  21. package/agentes/devops-ci-swl.md +374 -0
  22. package/agentes/disenador-ui-swl.md +558 -0
  23. package/agentes/documentador-swl.md +343 -0
  24. package/agentes/evals/arquitecto-swl.evals.json +56 -0
  25. package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
  26. package/agentes/evals/implementador-swl.evals.json +56 -0
  27. package/agentes/evals/orquestador-swl.evals.json +60 -0
  28. package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
  29. package/agentes/evals/red-team-swl.evals.json +59 -0
  30. package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
  31. package/agentes/frontend-angular-swl.md +627 -0
  32. package/agentes/frontend-css-swl.md +720 -0
  33. package/agentes/frontend-react-swl.md +696 -0
  34. package/agentes/frontend-swl.md +500 -0
  35. package/agentes/frontend-tailwind-swl.md +830 -0
  36. package/agentes/implementador-swl.md +328 -0
  37. package/agentes/investigador-swl.md +430 -0
  38. package/agentes/investigador-ux-swl.md +500 -0
  39. package/agentes/llm-apps-swl.md +276 -0
  40. package/agentes/migrador-swl.md +417 -0
  41. package/agentes/mobile-android-swl.md +509 -0
  42. package/agentes/mobile-cross-swl.md +539 -0
  43. package/agentes/mobile-ios-swl.md +500 -0
  44. package/agentes/mobile-testing-swl.md +300 -0
  45. package/agentes/notificador-swl.md +916 -0
  46. package/agentes/observabilidad-swl.md +436 -0
  47. package/agentes/orquestador-swl.md +884 -0
  48. package/agentes/pagos-swl.md +283 -0
  49. package/agentes/perfilador-usuario-swl.md +306 -0
  50. package/agentes/planificador-swl.md +402 -0
  51. package/agentes/producto-prd-swl.md +587 -0
  52. package/agentes/red-team-swl.md +216 -0
  53. package/agentes/release-manager-swl.md +568 -0
  54. package/agentes/rendimiento-swl.md +714 -0
  55. package/agentes/resolutor-build-swl.md +243 -0
  56. package/agentes/revisor-angular-swl.md +276 -0
  57. package/agentes/revisor-codigo-swl.md +348 -0
  58. package/agentes/revisor-csharp-swl.md +262 -0
  59. package/agentes/revisor-go-swl.md +257 -0
  60. package/agentes/revisor-java-swl.md +255 -0
  61. package/agentes/revisor-kotlin-swl.md +271 -0
  62. package/agentes/revisor-nextjs-swl.md +279 -0
  63. package/agentes/revisor-php-swl.md +269 -0
  64. package/agentes/revisor-react-swl.md +276 -0
  65. package/agentes/revisor-rust-swl.md +344 -0
  66. package/agentes/revisor-seguridad-swl.md +390 -0
  67. package/agentes/revisor-swift-swl.md +266 -0
  68. package/agentes/revisor-typescript-swl.md +344 -0
  69. package/agentes/sre-swl.md +265 -0
  70. package/agentes/tdd-qa-swl.md +354 -0
  71. package/agentes/ux-disenador-swl.md +501 -0
  72. package/bin/lib/bot-comandos.js +1030 -0
  73. package/bin/lib/bot-discovery.js +182 -0
  74. package/bin/lib/bot-git.js +142 -0
  75. package/bin/swl-ses.js +325 -0
  76. package/bin/swl-telegram-bot.js +442 -0
  77. package/bin/swl-telegram-bot.plist +21 -0
  78. package/bin/swl-telegram-bot.service +14 -0
  79. package/comandos/swl/.evolved.json +23 -0
  80. package/comandos/swl/actualizar.md +174 -0
  81. package/comandos/swl/adoptar-proyecto.md +207 -0
  82. package/comandos/swl/aprender.md +701 -0
  83. package/comandos/swl/auditar-deps.md +134 -0
  84. package/comandos/swl/autoresearch.md +170 -0
  85. package/comandos/swl/ayuda.md +224 -0
  86. package/comandos/swl/brainstorm.md +50 -0
  87. package/comandos/swl/checkpoint.md +330 -0
  88. package/comandos/swl/compactar.md +283 -0
  89. package/comandos/swl/configurar-ci.md +227 -0
  90. package/comandos/swl/contexto.md +112 -0
  91. package/comandos/swl/contribuir.md +233 -0
  92. package/comandos/swl/crear-skill.md +292 -0
  93. package/comandos/swl/cron.md +196 -0
  94. package/comandos/swl/dashboard.md +146 -0
  95. package/comandos/swl/discutir-fase.md +230 -0
  96. package/comandos/swl/ejecutar-fase.md +135 -0
  97. package/comandos/swl/evaluar-skill.md +487 -0
  98. package/comandos/swl/evolucion-estado.md +142 -0
  99. package/comandos/swl/evolucionar.md +259 -0
  100. package/comandos/swl/exportar-vault.md +189 -0
  101. package/comandos/swl/gateway.md +158 -0
  102. package/comandos/swl/inbox.md +116 -0
  103. package/comandos/swl/instalar.md +220 -0
  104. package/comandos/swl/instintos.md +86 -0
  105. package/comandos/swl/mapear-codebase.md +312 -0
  106. package/comandos/swl/mcp-status.md +175 -0
  107. package/comandos/swl/metricas.md +270 -0
  108. package/comandos/swl/modelo.md +102 -0
  109. package/comandos/swl/notificaciones.md +396 -0
  110. package/comandos/swl/nuevo-proyecto.md +154 -0
  111. package/comandos/swl/planear-fase.md +221 -0
  112. package/comandos/swl/plugins.md +256 -0
  113. package/comandos/swl/reflect-skills.md +125 -0
  114. package/comandos/swl/release.md +217 -0
  115. package/comandos/swl/revisar-impacto.md +206 -0
  116. package/comandos/swl/revisar.md +330 -0
  117. package/comandos/swl/salud.md +363 -0
  118. package/comandos/swl/sesiones.md +200 -0
  119. package/comandos/swl/skill-search.md +113 -0
  120. package/comandos/swl/verificar.md +585 -0
  121. package/comandos/swl/wiki.md +620 -0
  122. package/contextos/dev.md +32 -0
  123. package/contextos/research.md +30 -0
  124. package/contextos/review.md +31 -0
  125. package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
  126. package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
  127. package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
  128. package/habilidades/agent-browser/SKILL.md +218 -0
  129. package/habilidades/agentes-como-servicio/SKILL.md +218 -0
  130. package/habilidades/ai-runtime-security/SKILL.md +273 -0
  131. package/habilidades/angular-avanzado/SKILL.md +164 -0
  132. package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
  133. package/habilidades/angular-moderno/SKILL.md +186 -0
  134. package/habilidades/angular-moderno/evals/evals.json +45 -0
  135. package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
  136. package/habilidades/api-rest-diseno/SKILL.md +191 -0
  137. package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
  138. package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
  139. package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
  140. package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
  141. package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
  142. package/habilidades/async-python/SKILL.md +149 -0
  143. package/habilidades/async-python/evals/evals.json +47 -0
  144. package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
  145. package/habilidades/auth-patrones/.evolved.json +9 -0
  146. package/habilidades/auth-patrones/SKILL.md +413 -0
  147. package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
  148. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
  149. package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
  150. package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
  151. package/habilidades/autoresearch/SKILL.md +268 -0
  152. package/habilidades/autoresearch/evals/evals.json +41 -0
  153. package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
  154. package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
  155. package/habilidades/azure-cloud/SKILL.md +308 -0
  156. package/habilidades/azure-cloud/recursos/aks.md +327 -0
  157. package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
  158. package/habilidades/backend-production-resilience/SKILL.md +288 -0
  159. package/habilidades/brainstorming/SKILL.md +295 -0
  160. package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
  161. package/habilidades/build-errors-cpp/SKILL.md +270 -0
  162. package/habilidades/build-errors-csharp/SKILL.md +265 -0
  163. package/habilidades/build-errors-go/SKILL.md +306 -0
  164. package/habilidades/build-errors-java/SKILL.md +278 -0
  165. package/habilidades/build-errors-kotlin/SKILL.md +303 -0
  166. package/habilidades/build-errors-nextjs/SKILL.md +312 -0
  167. package/habilidades/build-errors-php/SKILL.md +270 -0
  168. package/habilidades/build-errors-python/SKILL.md +292 -0
  169. package/habilidades/build-errors-rust/SKILL.md +284 -0
  170. package/habilidades/build-errors-swift/SKILL.md +272 -0
  171. package/habilidades/build-errors-typescript/SKILL.md +369 -0
  172. package/habilidades/checklist-calidad/SKILL.md +271 -0
  173. package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
  174. package/habilidades/checklist-seguridad/SKILL.md +285 -0
  175. package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
  176. package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
  177. package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
  178. package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
  179. package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
  180. package/habilidades/cloud-aws/SKILL.md +142 -0
  181. package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
  182. package/habilidades/compactacion-contexto/SKILL.md +247 -0
  183. package/habilidades/contenedores-docker/SKILL.md +137 -0
  184. package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
  185. package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
  186. package/habilidades/context-builder/SKILL.md +170 -0
  187. package/habilidades/control-profundidad/SKILL.md +128 -0
  188. package/habilidades/csharp-experto/SKILL.md +322 -0
  189. package/habilidades/csharp-patrones/SKILL.md +316 -0
  190. package/habilidades/csharp-testing/SKILL.md +286 -0
  191. package/habilidades/css-moderno/SKILL.md +166 -0
  192. package/habilidades/css-moderno/evals/evals.json +43 -0
  193. package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
  194. package/habilidades/datos-etl/SKILL.md +129 -0
  195. package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
  196. package/habilidades/dbml-experto/SKILL.md +339 -0
  197. package/habilidades/dbml-experto/evals/evals.json +56 -0
  198. package/habilidades/dependencias-auditoria/SKILL.md +320 -0
  199. package/habilidades/deprecacion-migracion/SKILL.md +169 -0
  200. package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
  201. package/habilidades/design-tokens/SKILL.md +158 -0
  202. package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
  203. package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
  204. package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
  205. package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
  206. package/habilidades/discutir-fase/SKILL.md +188 -0
  207. package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
  208. package/habilidades/diseno-responsivo/SKILL.md +186 -0
  209. package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
  210. package/habilidades/django-experto/SKILL.md +205 -0
  211. package/habilidades/django-experto/recursos/async-django.md +390 -0
  212. package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
  213. package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
  214. package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
  215. package/habilidades/django-experto/recursos/testing-django.md +415 -0
  216. package/habilidades/doc-sync/SKILL.md +280 -0
  217. package/habilidades/drift-detection/SKILL.md +179 -0
  218. package/habilidades/ejecutar-fase/SKILL.md +468 -0
  219. package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
  220. package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
  221. package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
  222. package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
  223. package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
  224. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
  225. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
  226. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
  227. package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
  228. package/habilidades/evaluacion-agentes/SKILL.md +314 -0
  229. package/habilidades/event-driven/SKILL.md +153 -0
  230. package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
  231. package/habilidades/extraccion-documentos/SKILL.md +221 -0
  232. package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
  233. package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
  234. package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
  235. package/habilidades/fastapi-experto/SKILL.md +221 -0
  236. package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
  237. package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
  238. package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
  239. package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
  240. package/habilidades/filament-admin/SKILL.md +290 -0
  241. package/habilidades/frontend-avanzado/SKILL.md +257 -0
  242. package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
  243. package/habilidades/gcp-cloud/SKILL.md +260 -0
  244. package/habilidades/gcp-cloud/recursos/gke.md +234 -0
  245. package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
  246. package/habilidades/generacion-mermaid/SKILL.md +229 -0
  247. package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
  248. package/habilidades/go-experto/SKILL.md +305 -0
  249. package/habilidades/go-patrones/SKILL.md +299 -0
  250. package/habilidades/go-testing/SKILL.md +291 -0
  251. package/habilidades/graphql-experto/SKILL.md +323 -0
  252. package/habilidades/guardrail-semantico/SKILL.md +282 -0
  253. package/habilidades/harness-claude-code/SKILL.md +299 -0
  254. package/habilidades/iam-secretos/SKILL.md +265 -0
  255. package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
  256. package/habilidades/infra-github-actions/SKILL.md +166 -0
  257. package/habilidades/instalar-sistema/.evolved.json +9 -0
  258. package/habilidades/instalar-sistema/SKILL.md +221 -0
  259. package/habilidades/java-experto/SKILL.md +290 -0
  260. package/habilidades/java-patrones/SKILL.md +275 -0
  261. package/habilidades/java-testing/SKILL.md +288 -0
  262. package/habilidades/kotlin-compose/SKILL.md +278 -0
  263. package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
  264. package/habilidades/kotlin-experto/SKILL.md +318 -0
  265. package/habilidades/kotlin-testing/SKILL.md +267 -0
  266. package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
  267. package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
  268. package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
  269. package/habilidades/langchain-langraph/SKILL.md +386 -0
  270. package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
  271. package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
  272. package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
  273. package/habilidades/legacy-code-rescue/SKILL.md +267 -0
  274. package/habilidades/likec4-experto/SKILL.md +412 -0
  275. package/habilidades/likec4-experto/evals/evals.json +69 -0
  276. package/habilidades/manejo-errores/.evolved.json +9 -0
  277. package/habilidades/manejo-errores/SKILL.md +407 -0
  278. package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
  279. package/habilidades/mapear-codebase/SKILL.md +275 -0
  280. package/habilidades/memoria-busqueda/SKILL.md +194 -0
  281. package/habilidades/memoria-busqueda/evals/evals.json +44 -0
  282. package/habilidades/meta-skills-estandar/SKILL.md +298 -0
  283. package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
  284. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
  285. package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
  286. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
  287. package/habilidades/microservicios/SKILL.md +155 -0
  288. package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
  289. package/habilidades/mobile-flutter/SKILL.md +199 -0
  290. package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
  291. package/habilidades/mobile-react-native/SKILL.md +176 -0
  292. package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
  293. package/habilidades/mongodb-experto/SKILL.md +302 -0
  294. package/habilidades/monitoring-alertas/SKILL.md +201 -0
  295. package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
  296. package/habilidades/nestjs-experto/SKILL.md +307 -0
  297. package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
  298. package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
  299. package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
  300. package/habilidades/nextjs-experto/SKILL.md +335 -0
  301. package/habilidades/nextjs-patrones/SKILL.md +303 -0
  302. package/habilidades/nextjs-testing/SKILL.md +331 -0
  303. package/habilidades/node-experto/.evolved.json +9 -0
  304. package/habilidades/node-experto/SKILL.md +266 -0
  305. package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
  306. package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
  307. package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
  308. package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
  309. package/habilidades/nuevo-proyecto/SKILL.md +204 -0
  310. package/habilidades/orquestacion-async/SKILL.md +303 -0
  311. package/habilidades/paid-media-tracking/SKILL.md +269 -0
  312. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
  313. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
  314. package/habilidades/patrones-python/SKILL.md +228 -0
  315. package/habilidades/patrones-python/evals/evals.json +56 -0
  316. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
  317. package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
  318. package/habilidades/perfil-usuario/SKILL.md +200 -0
  319. package/habilidades/perfil-usuario/evals/evals.json +55 -0
  320. package/habilidades/performance-baseline/SKILL.md +297 -0
  321. package/habilidades/php-experto/SKILL.md +291 -0
  322. package/habilidades/php-patrones/SKILL.md +306 -0
  323. package/habilidades/php-testing/SKILL.md +280 -0
  324. package/habilidades/planear-fase/SKILL.md +269 -0
  325. package/habilidades/postgresql-experto/SKILL.md +151 -0
  326. package/habilidades/postgresql-experto/evals/evals.json +53 -0
  327. package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
  328. package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
  329. package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
  330. package/habilidades/privacy-memoria/SKILL.md +141 -0
  331. package/habilidades/privacy-memoria/evals/evals.json +43 -0
  332. package/habilidades/prompt-engineering/SKILL.md +518 -0
  333. package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
  334. package/habilidades/rag-arquitectura/SKILL.md +338 -0
  335. package/habilidades/rails-experto/SKILL.md +237 -0
  336. package/habilidades/rails-experto/recursos/active-record.md +260 -0
  337. package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
  338. package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
  339. package/habilidades/react-experto/SKILL.md +209 -0
  340. package/habilidades/react-experto/evals/evals.json +55 -0
  341. package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
  342. package/habilidades/react-optimizacion/SKILL.md +174 -0
  343. package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
  344. package/habilidades/redis-experto/SKILL.md +305 -0
  345. package/habilidades/release-semver/.evolved.json +9 -0
  346. package/habilidades/release-semver/SKILL.md +248 -0
  347. package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
  348. package/habilidades/rust-experto/SKILL.md +400 -0
  349. package/habilidades/rust-patrones/SKILL.md +296 -0
  350. package/habilidades/rust-testing/SKILL.md +311 -0
  351. package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
  352. package/habilidades/sql-optimizacion/SKILL.md +200 -0
  353. package/habilidades/sql-optimizacion/evals/evals.json +54 -0
  354. package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
  355. package/habilidades/sre-patrones/SKILL.md +333 -0
  356. package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
  357. package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
  358. package/habilidades/stripe-pagos/SKILL.md +550 -0
  359. package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
  360. package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
  361. package/habilidades/structured-outputs/SKILL.md +343 -0
  362. package/habilidades/swift-experto/SKILL.md +320 -0
  363. package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
  364. package/habilidades/swift-patrones/SKILL.md +313 -0
  365. package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
  366. package/habilidades/swift-testing/SKILL.md +254 -0
  367. package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
  368. package/habilidades/swl-dashboard/SKILL.md +370 -0
  369. package/habilidades/swl-markitdown/SKILL.md +285 -0
  370. package/habilidades/swl-markitdown/evals/evals.json +52 -0
  371. package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
  372. package/habilidades/tailwind-experto/SKILL.md +240 -0
  373. package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
  374. package/habilidades/tdd-workflow/SKILL.md +293 -0
  375. package/habilidades/terraform-experto/SKILL.md +321 -0
  376. package/habilidades/testing-python/SKILL.md +340 -0
  377. package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
  378. package/habilidades/threat-model-lite/SKILL.md +246 -0
  379. package/habilidades/tracing-processor/SKILL.md +212 -0
  380. package/habilidades/tracking-measurement/SKILL.md +239 -0
  381. package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
  382. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
  383. package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
  384. package/habilidades/typescript-avanzado/SKILL.md +144 -0
  385. package/habilidades/typescript-avanzado/evals/evals.json +55 -0
  386. package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
  387. package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
  388. package/habilidades/ux-diseno/SKILL.md +116 -0
  389. package/habilidades/ux-diseno/evals/evals.json +43 -0
  390. package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
  391. package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
  392. package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
  393. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
  394. package/habilidades/verificacion-evidencia/SKILL.md +160 -0
  395. package/habilidades/verificar-trabajo/SKILL.md +303 -0
  396. package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
  397. package/habilidades/wiki-conocimiento/SKILL.md +276 -0
  398. package/habilidades/wireframes-flujos/SKILL.md +212 -0
  399. package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
  400. package/habilidades/workflow-claude-code/SKILL.md +260 -0
  401. package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
  402. package/hooks/_run-hook.sh +57 -0
  403. package/hooks/actualizar-perfil-usuario.js +364 -0
  404. package/hooks/agente-lifecycle.js +71 -0
  405. package/hooks/aiisms-detector.js +173 -0
  406. package/hooks/audit-trail.js +204 -0
  407. package/hooks/auto-background.js +97 -0
  408. package/hooks/auto-consolidacion.js +178 -0
  409. package/hooks/auto-evolucion.js +666 -0
  410. package/hooks/auto-restaurar-settings.js +360 -0
  411. package/hooks/calidad-pre-commit.js +929 -0
  412. package/hooks/calidad-typescript.js +511 -0
  413. package/hooks/captura-feedback-usuario.js +148 -0
  414. package/hooks/check-update.js +211 -0
  415. package/hooks/clasificador-mensajes.js +271 -0
  416. package/hooks/degradacion-instintos.js +272 -0
  417. package/hooks/escaneo-secretos.js +389 -0
  418. package/hooks/extraccion-aprendizajes.js +763 -0
  419. package/hooks/grafo-contexto.js +129 -0
  420. package/hooks/graph-update.js +67 -0
  421. package/hooks/guardrail-modelo.js +247 -0
  422. package/hooks/inbox-aviso.js +75 -0
  423. package/hooks/inyeccion-contexto.js +246 -0
  424. package/hooks/lib/abort-registry.js +214 -0
  425. package/hooks/lib/agent-backend.js +210 -0
  426. package/hooks/lib/agent-comms.js +263 -0
  427. package/hooks/lib/agent-issue-codes.js +284 -0
  428. package/hooks/lib/agent-matcher.js +189 -0
  429. package/hooks/lib/async-hook-registry.js +252 -0
  430. package/hooks/lib/atomic-write.js +130 -0
  431. package/hooks/lib/auto-consolidator.js +335 -0
  432. package/hooks/lib/canary-skills.js +187 -0
  433. package/hooks/lib/consolidation-lock.js +291 -0
  434. package/hooks/lib/context-builder.js +430 -0
  435. package/hooks/lib/context-compressor.js +657 -0
  436. package/hooks/lib/convergence-detector.js +105 -0
  437. package/hooks/lib/delegation-tracker.js +198 -0
  438. package/hooks/lib/detectar-package-manager.js +423 -0
  439. package/hooks/lib/edit-accumulator.js +171 -0
  440. package/hooks/lib/error-classifier.js +308 -0
  441. package/hooks/lib/event-bus.js +112 -0
  442. package/hooks/lib/evolution-tracker.js +442 -0
  443. package/hooks/lib/execution-state.js +316 -0
  444. package/hooks/lib/fingerprint-id.js +135 -0
  445. package/hooks/lib/gateway-notify.js +116 -0
  446. package/hooks/lib/graph-security.js +75 -0
  447. package/hooks/lib/guardrail-metrics.js +202 -0
  448. package/hooks/lib/hook-circuit-breaker.js +206 -0
  449. package/hooks/lib/loop-detector.js +267 -0
  450. package/hooks/lib/mcp-health.js +184 -0
  451. package/hooks/lib/mcp-pool.js +436 -0
  452. package/hooks/lib/memory-search.js +506 -0
  453. package/hooks/lib/merkle-audit.js +96 -0
  454. package/hooks/lib/model-router.js +222 -0
  455. package/hooks/lib/normalize-error.js +324 -0
  456. package/hooks/lib/normalize-input.js +65 -0
  457. package/hooks/lib/nudge-tracker.js +306 -0
  458. package/hooks/lib/otlp-exporter.js +365 -0
  459. package/hooks/lib/performance-marks.js +239 -0
  460. package/hooks/lib/privacy-filter.js +128 -0
  461. package/hooks/lib/prompt-injection-scanner.js +209 -0
  462. package/hooks/lib/provenance-tracker.js +183 -0
  463. package/hooks/lib/rate-limit-tracker.js +253 -0
  464. package/hooks/lib/reflect-classifier.js +164 -0
  465. package/hooks/lib/resource-quota.js +122 -0
  466. package/hooks/lib/retry-jitter.js +165 -0
  467. package/hooks/lib/risk-engine.js +368 -0
  468. package/hooks/lib/run-log.js +408 -0
  469. package/hooks/lib/session-fts.js +379 -0
  470. package/hooks/lib/session-store.js +293 -0
  471. package/hooks/lib/singleton-guard.js +159 -0
  472. package/hooks/lib/skill-auditor.js +588 -0
  473. package/hooks/lib/sync-status.js +228 -0
  474. package/hooks/lib/taint-tracker.js +107 -0
  475. package/hooks/lib/task-service.js +295 -0
  476. package/hooks/lib/tech-skills-map.js +146 -0
  477. package/hooks/lib/telegram-cliente.js +159 -0
  478. package/hooks/lib/telegram-config.js +170 -0
  479. package/hooks/lib/token-budget.js +156 -0
  480. package/hooks/lib/token-estimator.js +420 -0
  481. package/hooks/lib/toon-compressor.js +245 -0
  482. package/hooks/lib/usage-model.js +183 -0
  483. package/hooks/lib/variable-resolver.js +230 -0
  484. package/hooks/linea-estado.js +324 -0
  485. package/hooks/metricas-evolucion.js +209 -0
  486. package/hooks/monitor-contexto.js +325 -0
  487. package/hooks/notificacion-sesion-stop.js +198 -0
  488. package/hooks/notificacion-telegram-notification.js +4 -0
  489. package/hooks/notificacion-telegram-subagent.js +4 -0
  490. package/hooks/notificacion-telegram.js +267 -0
  491. package/hooks/preservar-estado-pre-compact.js +150 -0
  492. package/hooks/proteccion-rutas.js +366 -0
  493. package/hooks/registro-turnos.js +209 -0
  494. package/hooks/resumen-sesion.js +249 -0
  495. package/hooks/risk-scoring.js +323 -0
  496. package/hooks/rotar-audit-auto.js +122 -0
  497. package/hooks/sugerir-regenerar-inventario.js +170 -0
  498. package/hooks/telemetria-agentes.js +167 -0
  499. package/hooks/tracking-costos.js +688 -0
  500. package/instintos/global.yaml +8 -0
  501. package/instintos/perfil-usuario.yaml +53 -0
  502. package/instintos/prompt-appendices.yaml +57 -0
  503. package/instintos/proyecto.yaml +372 -0
  504. package/manifiestos/gateway-config.json +77 -0
  505. package/manifiestos/handoff-context.json +223 -0
  506. package/manifiestos/hook-profiles.json +44 -0
  507. package/manifiestos/hooks-config.json +360 -0
  508. package/manifiestos/modulos.json +1173 -0
  509. package/manifiestos/perfiles.json +404 -0
  510. package/package.json +86 -0
  511. package/plantillas/ESTADO.md +109 -0
  512. package/plantillas/HOJA-RUTA.md +143 -0
  513. package/plantillas/PROYECTO.md +122 -0
  514. package/plantillas/REQUISITOS.md +132 -0
  515. package/plantillas/auditor-veto-template.md +105 -0
  516. package/plantillas/github-workflows/README.md +47 -0
  517. package/plantillas/github-workflows/release-please.yml +44 -0
  518. package/plantillas/github-workflows/swl-ci.yml +107 -0
  519. package/plantillas/github-workflows/swl-security.yml +51 -0
  520. package/plantillas/mcp-mineru.json +13 -0
  521. package/plantillas/research/ARQUITECTURA.md +220 -0
  522. package/plantillas/research/FUNCIONALIDADES.md +175 -0
  523. package/plantillas/research/RESUMEN.md +165 -0
  524. package/plantillas/research/STACK.md +233 -0
  525. package/plantillas/research/TRAMPAS.md +299 -0
  526. package/plantillas/skill-evals-template.json +44 -0
  527. package/plugin.json +343 -0
  528. package/reglas/accesibilidad.md +269 -0
  529. package/reglas/api-diseno.md +400 -0
  530. package/reglas/arquitectura.md +352 -0
  531. package/reglas/brevedad-output.md +124 -0
  532. package/reglas/cloud-infra.md +247 -0
  533. package/reglas/docs.md +245 -0
  534. package/reglas/estilo-codigo.md +201 -0
  535. package/reglas/git-workflow.md +245 -0
  536. package/reglas/gobernanza.md +271 -0
  537. package/reglas/harness-claude-code.md +213 -0
  538. package/reglas/hooks.md +186 -0
  539. package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
  540. package/reglas/lenguajes/csharp/hooks.md +281 -0
  541. package/reglas/lenguajes/csharp/patrones.md +226 -0
  542. package/reglas/lenguajes/csharp/seguridad.md +258 -0
  543. package/reglas/lenguajes/csharp/testing.md +176 -0
  544. package/reglas/lenguajes/go/estilo-codigo.md +195 -0
  545. package/reglas/lenguajes/go/hooks.md +249 -0
  546. package/reglas/lenguajes/go/patrones.md +249 -0
  547. package/reglas/lenguajes/go/seguridad.md +225 -0
  548. package/reglas/lenguajes/go/testing.md +272 -0
  549. package/reglas/lenguajes/java/estilo-codigo.md +217 -0
  550. package/reglas/lenguajes/java/hooks.md +251 -0
  551. package/reglas/lenguajes/java/patrones.md +226 -0
  552. package/reglas/lenguajes/java/seguridad.md +233 -0
  553. package/reglas/lenguajes/java/testing.md +238 -0
  554. package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
  555. package/reglas/lenguajes/kotlin/hooks.md +245 -0
  556. package/reglas/lenguajes/kotlin/patrones.md +201 -0
  557. package/reglas/lenguajes/kotlin/seguridad.md +202 -0
  558. package/reglas/lenguajes/kotlin/testing.md +236 -0
  559. package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
  560. package/reglas/lenguajes/nextjs/hooks.md +186 -0
  561. package/reglas/lenguajes/nextjs/patrones.md +225 -0
  562. package/reglas/lenguajes/nextjs/seguridad.md +216 -0
  563. package/reglas/lenguajes/nextjs/testing.md +193 -0
  564. package/reglas/lenguajes/php/estilo-codigo.md +228 -0
  565. package/reglas/lenguajes/php/hooks.md +165 -0
  566. package/reglas/lenguajes/php/patrones.md +233 -0
  567. package/reglas/lenguajes/php/seguridad.md +186 -0
  568. package/reglas/lenguajes/php/testing.md +205 -0
  569. package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
  570. package/reglas/lenguajes/rust/hooks.md +240 -0
  571. package/reglas/lenguajes/rust/patrones.md +250 -0
  572. package/reglas/lenguajes/rust/seguridad.md +221 -0
  573. package/reglas/lenguajes/rust/testing.md +194 -0
  574. package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
  575. package/reglas/lenguajes/swift/hooks.md +257 -0
  576. package/reglas/lenguajes/swift/patrones.md +235 -0
  577. package/reglas/lenguajes/swift/seguridad.md +248 -0
  578. package/reglas/lenguajes/swift/testing.md +242 -0
  579. package/reglas/markitdown.md +60 -0
  580. package/reglas/memoria-consolidada.md +209 -0
  581. package/reglas/patrones.md +225 -0
  582. package/reglas/performance.md +195 -0
  583. package/reglas/pruebas.md +159 -0
  584. package/reglas/seguridad-agentes.md +351 -0
  585. package/reglas/seguridad.md +151 -0
  586. package/reglas/skills-estandar.md +373 -0
  587. package/reglas/testing.md +193 -0
  588. package/schemas/agent-contract.json +176 -0
  589. package/schemas/agent-frontmatter.schema.json +149 -0
  590. package/schemas/agent-message.schema.json +53 -0
  591. package/schemas/agent-output-implementacion.schema.json +85 -0
  592. package/schemas/agent-output-planificacion.schema.json +113 -0
  593. package/schemas/agent-output-review.schema.json +78 -0
  594. package/schemas/diary-entry.schema.json +80 -0
  595. package/schemas/hook-profiles.schema.json +39 -0
  596. package/schemas/hooks-config.schema.json +74 -0
  597. package/schemas/instinct.schema.json +115 -0
  598. package/schemas/modulos.schema.json +29 -0
  599. package/schemas/perfiles.schema.json +28 -0
  600. package/schemas/plugin.schema.json +64 -0
  601. package/schemas/skill-evals.schema.json +95 -0
  602. package/schemas/skill-frontmatter.schema.json +170 -0
  603. package/scripts/actualizar.js +145 -0
  604. package/scripts/audit-skills.sh +78 -0
  605. package/scripts/auditar-agentes-gaps.js +149 -0
  606. package/scripts/auditar-cobertura-frameworks.js +241 -0
  607. package/scripts/auditar-skills-gaps.js +206 -0
  608. package/scripts/bootstrap-instintos.js +259 -0
  609. package/scripts/check-update.js +109 -0
  610. package/scripts/comandos/agents.js +105 -0
  611. package/scripts/comandos/info.js +108 -0
  612. package/scripts/comandos/install-asistido.js +186 -0
  613. package/scripts/comandos/skills.js +211 -0
  614. package/scripts/configurar-branch-protection.js +418 -0
  615. package/scripts/daemon-swl.py +388 -0
  616. package/scripts/desinstalar.js +130 -0
  617. package/scripts/doctor.js +559 -0
  618. package/scripts/field-report.js +199 -0
  619. package/scripts/generar-inventario.js +317 -0
  620. package/scripts/inbox-tmux-inject.js +161 -0
  621. package/scripts/inferir-herramientas-permitidas.js +586 -0
  622. package/scripts/inicializar.js +133 -0
  623. package/scripts/instalador.js +1031 -0
  624. package/scripts/instalar-git-hook.js +122 -0
  625. package/scripts/lib/agp-frontmatter.js +222 -0
  626. package/scripts/lib/append-con-marcadores.js +199 -0
  627. package/scripts/lib/artefactos-python.js +43 -0
  628. package/scripts/lib/audit-query.js +221 -0
  629. package/scripts/lib/autostart-linux.js +347 -0
  630. package/scripts/lib/autostart-macos.js +360 -0
  631. package/scripts/lib/autostart-windows.js +307 -0
  632. package/scripts/lib/budget-enforcer.js +252 -0
  633. package/scripts/lib/claude-sessions.js +285 -0
  634. package/scripts/lib/configurar-ci.js +380 -0
  635. package/scripts/lib/console-span-exporter.js +92 -0
  636. package/scripts/lib/contadores-inventario.js +217 -0
  637. package/scripts/lib/dashboard-widgets.js +290 -0
  638. package/scripts/lib/detectar-runtime.js +279 -0
  639. package/scripts/lib/detectar-stack.js +187 -0
  640. package/scripts/lib/diary-entry.js +234 -0
  641. package/scripts/lib/drift-detector.js +545 -0
  642. package/scripts/lib/estado.js +124 -0
  643. package/scripts/lib/gestor-componentes.js +243 -0
  644. package/scripts/lib/gitignore-manifest.js +305 -0
  645. package/scripts/lib/graph-analyze.py +556 -0
  646. package/scripts/lib/graph-builder.py +485 -0
  647. package/scripts/lib/graph-cluster.py +259 -0
  648. package/scripts/lib/health-row.js +168 -0
  649. package/scripts/lib/hooks-settings.js +789 -0
  650. package/scripts/lib/manifiestos.js +138 -0
  651. package/scripts/lib/mc-client.js +137 -0
  652. package/scripts/lib/notificaciones-telegram.js +1107 -0
  653. package/scripts/lib/npm-version.js +261 -0
  654. package/scripts/lib/paquetes-conocidos.js +50 -0
  655. package/scripts/lib/preservar-usuario.js +586 -0
  656. package/scripts/lib/prompt-builder.js +264 -0
  657. package/scripts/lib/resolver-externo.js +332 -0
  658. package/scripts/lib/schedule-parser.js +305 -0
  659. package/scripts/lib/scoring-instintos.js +240 -0
  660. package/scripts/lib/seguridad.js +160 -0
  661. package/scripts/lib/selector-interactivo.js +152 -0
  662. package/scripts/lib/semantic-search.js +242 -0
  663. package/scripts/lib/skill-discovery.js +234 -0
  664. package/scripts/lib/skill-metrics.js +246 -0
  665. package/scripts/lib/skill-normalizer.js +112 -0
  666. package/scripts/lib/skills-hub.js +340 -0
  667. package/scripts/lib/span-schema.js +134 -0
  668. package/scripts/lib/tool-cost-analyzer.js +255 -0
  669. package/scripts/lib/tracing-processor-interface.js +286 -0
  670. package/scripts/lib/transformadores/base.js +80 -0
  671. package/scripts/lib/transformadores/claude.js +124 -0
  672. package/scripts/lib/transformadores/codex.js +115 -0
  673. package/scripts/lib/transformadores/copilot.js +106 -0
  674. package/scripts/lib/transformadores/gemini.js +74 -0
  675. package/scripts/lib/transformadores/index.js +35 -0
  676. package/scripts/lib/transformadores/opencode.js +75 -0
  677. package/scripts/lib/ui.js +259 -0
  678. package/scripts/limpiar-artefactos-python.js +131 -0
  679. package/scripts/mcp-orchestrator.py +386 -0
  680. package/scripts/mcp-pool-manager.py +352 -0
  681. package/scripts/mcp-telemetry.py +378 -0
  682. package/scripts/poblar-evolvable.js +226 -0
  683. package/scripts/publicar.js +287 -0
  684. package/scripts/reflect-skills.js +403 -0
  685. package/scripts/rotar-audit-logs.js +185 -0
  686. package/scripts/run-skill-evals.js +242 -0
  687. package/scripts/smoke-test.js +374 -0
  688. package/scripts/token-analysis.py +471 -0
  689. package/scripts/validar-manifest.js +195 -0
  690. package/scripts/validar-memoria.js +321 -0
  691. package/scripts/validar-tests-aislamiento.js +184 -0
  692. package/scripts/validar-tokens-test.js +208 -0
  693. package/scripts/validar.js +147 -0
  694. package/scripts/validate-markdown.py +339 -0
  695. package/scripts/validate-skills.py +385 -0
  696. package/scripts/vendor/claude-usage/README.md +116 -0
  697. package/scripts/vendor/claude-usage/cli.py +334 -0
  698. package/scripts/vendor/claude-usage/dashboard.py +795 -0
  699. package/scripts/vendor/claude-usage/scanner.py +467 -0
  700. package/scripts/vendor/markitdown/cli.py +194 -0
  701. package/scripts/verificar-evolucion.js +289 -0
  702. package/scripts/verificar-release.js +494 -0
@@ -0,0 +1,442 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Daemon long-polling del bot de Telegram para swl-ses.
6
+ *
7
+ * SEGURIDAD:
8
+ * - Filtro hardcoded por TELEGRAM_CHAT_ID. Todo mensaje de otro chat_id
9
+ * recibe "Acceso denegado" y se registra en bot.log.
10
+ * - Whitelist git estricta: solo rev-parse, status, log, diff, branch.
11
+ * - Sin eval, exec ni shell habilitado. Solo execFileSync con array de argumentos.
12
+ * - Sin secretos en logs — token nunca se escribe en bot.log ni en respuestas.
13
+ * - Solo escribe en ~/.claude/notifications/ (offset, pid, log).
14
+ *
15
+ * Comandos heredados:
16
+ * /help /start /proyectos /estado /log /diff /ultimo /resumen
17
+ * /silencio /activar /mutes /quien
18
+ *
19
+ * Los comandos /inbox /costo /salud se agregan en Slice 007.
20
+ *
21
+ * @module bin/swl-telegram-bot
22
+ */
23
+
24
+ const https = require('node:https');
25
+ const fs = require('node:fs');
26
+ const path = require('node:path');
27
+ const os = require('node:os');
28
+
29
+ const { cargarConfig } = require('../hooks/lib/telegram-config');
30
+ const { enviarMensaje } = require('../hooks/lib/telegram-cliente');
31
+ const { despachar } = require('./lib/bot-comandos');
32
+
33
+ // -----------------------------------------------------------------
34
+ // Configuración de paths de estado del daemon
35
+ // -----------------------------------------------------------------
36
+ const DIR_NOTIFICACIONES = path.join(os.homedir(), '.claude', 'notifications');
37
+ const RUTA_OFFSET = path.join(DIR_NOTIFICACIONES, 'bot.offset');
38
+ const RUTA_PID = path.join(DIR_NOTIFICACIONES, 'bot.pid');
39
+ const RUTA_LOG = path.join(DIR_NOTIFICACIONES, 'bot.log');
40
+
41
+ // -----------------------------------------------------------------
42
+ // Configuración de long-polling
43
+ // -----------------------------------------------------------------
44
+ const TIMEOUT_POLL_S = 50; // Timeout del request getUpdates (segundos)
45
+ const TIMEOUT_POLL_MS = (TIMEOUT_POLL_S + 5) * 1000; // +5s para timeout de red
46
+ const BACKOFF_INICIAL = 1000; // 1s
47
+ const BACKOFF_MAX_NORMAL = 16_000; // 16s
48
+ const BACKOFF_CIRCUIT = 60_000; // 60s — circuit breaker abierto
49
+ const MAX_FALLOS_CIRCUITO = 5;
50
+
51
+ // -----------------------------------------------------------------
52
+ // Estado del daemon
53
+ // -----------------------------------------------------------------
54
+ let fallosConsecutivos = 0;
55
+ let circuitAbierto = false;
56
+ let corriendo = true;
57
+
58
+ // -----------------------------------------------------------------
59
+ // Logger sin PII — token nunca se loggea
60
+ // -----------------------------------------------------------------
61
+
62
+ /**
63
+ * Asegura que el directorio de notificaciones existe.
64
+ */
65
+ function _asegurarDir() {
66
+ if (!fs.existsSync(DIR_NOTIFICACIONES)) {
67
+ fs.mkdirSync(DIR_NOTIFICACIONES, { recursive: true });
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Escribe una línea al log del bot.
73
+ *
74
+ * @param {string} nivel - Nivel: INFO, WARN, ERROR.
75
+ * @param {string} mensaje - Mensaje sin secretos.
76
+ */
77
+ function log(nivel, mensaje) {
78
+ const linea = `[${new Date().toISOString()}] [${nivel}] ${mensaje}\n`;
79
+ try {
80
+ _asegurarDir();
81
+ fs.appendFileSync(RUTA_LOG, linea, 'utf8');
82
+ } catch (_) {
83
+ // Si no se puede escribir el log, ignorar silenciosamente
84
+ }
85
+ // También imprimir a stderr para facilitar depuración al arrancar
86
+ process.stderr.write(linea);
87
+ }
88
+
89
+ // -----------------------------------------------------------------
90
+ // Gestión de offset persistente
91
+ // -----------------------------------------------------------------
92
+
93
+ /**
94
+ * Lee el offset guardado en disco.
95
+ *
96
+ * @returns {number} El offset persistido, o 0 si no existe.
97
+ */
98
+ function leerOffset() {
99
+ try {
100
+ if (fs.existsSync(RUTA_OFFSET)) {
101
+ const val = parseInt(fs.readFileSync(RUTA_OFFSET, 'utf8').trim(), 10);
102
+ if (!isNaN(val) && val >= 0) return val;
103
+ }
104
+ } catch (_) {}
105
+ return 0;
106
+ }
107
+
108
+ /**
109
+ * Guarda el offset en disco.
110
+ *
111
+ * @param {number} offset - El offset a persistir.
112
+ */
113
+ function guardarOffset(offset) {
114
+ try {
115
+ _asegurarDir();
116
+ fs.writeFileSync(RUTA_OFFSET, String(offset), 'utf8');
117
+ } catch (err) {
118
+ log('WARN', `No se pudo guardar offset: ${err.message}`);
119
+ }
120
+ }
121
+
122
+ // -----------------------------------------------------------------
123
+ // Gestión del PID file
124
+ // -----------------------------------------------------------------
125
+
126
+ /**
127
+ * Escribe el PID del proceso actual en el archivo pid.
128
+ */
129
+ function escribirPid() {
130
+ try {
131
+ _asegurarDir();
132
+ fs.writeFileSync(RUTA_PID, String(process.pid), 'utf8');
133
+ } catch (err) {
134
+ log('WARN', `No se pudo escribir PID file: ${err.message}`);
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Elimina el PID file al terminar el daemon.
140
+ */
141
+ function eliminarPid() {
142
+ try {
143
+ if (fs.existsSync(RUTA_PID)) {
144
+ fs.unlinkSync(RUTA_PID);
145
+ }
146
+ } catch (_) {}
147
+ }
148
+
149
+ // -----------------------------------------------------------------
150
+ // Long-polling: getUpdates
151
+ // -----------------------------------------------------------------
152
+
153
+ /**
154
+ * Llama a getUpdates de la API de Telegram.
155
+ *
156
+ * @param {string} token - Token del bot.
157
+ * @param {number} offset - Offset para evitar procesar updates ya vistos.
158
+ * @returns {Promise<{ ok: boolean, updates: object[], error?: string }>}
159
+ */
160
+ function getUpdates(token, offset) {
161
+ const payload = JSON.stringify({
162
+ offset,
163
+ timeout: TIMEOUT_POLL_S,
164
+ allowed_updates: ['message'],
165
+ });
166
+
167
+ return new Promise((resolve) => {
168
+ const req = https.request(
169
+ {
170
+ method: 'POST',
171
+ hostname: 'api.telegram.org',
172
+ path: `/bot${token}/getUpdates`,
173
+ headers: {
174
+ 'Content-Type': 'application/json',
175
+ 'Content-Length': Buffer.byteLength(payload),
176
+ },
177
+ timeout: TIMEOUT_POLL_MS,
178
+ },
179
+ (res) => {
180
+ let cuerpo = '';
181
+ res.on('data', (chunk) => { cuerpo += chunk; });
182
+ res.on('end', () => {
183
+ try {
184
+ const datos = JSON.parse(cuerpo);
185
+ if (datos.ok && Array.isArray(datos.result)) {
186
+ resolve({ ok: true, updates: datos.result, statusCode: res.statusCode });
187
+ } else {
188
+ resolve({ ok: false, updates: [], error: datos.description || 'respuesta no-ok', statusCode: res.statusCode });
189
+ }
190
+ } catch (parseErr) {
191
+ resolve({ ok: false, updates: [], error: `JSON inválido: ${parseErr.message}`, statusCode: res.statusCode });
192
+ }
193
+ });
194
+ }
195
+ );
196
+
197
+ req.on('timeout', () => {
198
+ req.destroy();
199
+ resolve({ ok: false, updates: [], error: 'timeout', statusCode: 0 });
200
+ });
201
+
202
+ req.on('error', (err) => {
203
+ resolve({ ok: false, updates: [], error: err.message, statusCode: 0 });
204
+ });
205
+
206
+ req.write(payload);
207
+ req.end();
208
+ });
209
+ }
210
+
211
+ // -----------------------------------------------------------------
212
+ // Pausa para backoff
213
+ // -----------------------------------------------------------------
214
+
215
+ /**
216
+ * Pausa durante `ms` milisegundos.
217
+ *
218
+ * @param {number} ms - Milisegundos a esperar.
219
+ * @returns {Promise<void>}
220
+ */
221
+ function esperar(ms) {
222
+ return new Promise((resolve) => setTimeout(resolve, ms));
223
+ }
224
+
225
+ /**
226
+ * Calcula el backoff exponencial con techo.
227
+ *
228
+ * @param {number} fallos - Número de fallos consecutivos.
229
+ * @returns {number} Milisegundos a esperar.
230
+ */
231
+ function calcularBackoff(fallos) {
232
+ if (circuitAbierto) return BACKOFF_CIRCUIT;
233
+ const delay = BACKOFF_INICIAL * Math.pow(2, fallos - 1);
234
+ return Math.min(delay, BACKOFF_MAX_NORMAL);
235
+ }
236
+
237
+ // -----------------------------------------------------------------
238
+ // Procesamiento de un update individual
239
+ // -----------------------------------------------------------------
240
+
241
+ /**
242
+ * Procesa un update recibido de getUpdates.
243
+ *
244
+ * @param {object} update - Update de Telegram.
245
+ * @param {string} token - Token del bot.
246
+ * @param {string} ownerChatId - Chat ID autorizado.
247
+ */
248
+ async function procesarUpdate(update, token, ownerChatId) {
249
+ const mensaje = update.message;
250
+ if (!mensaje) return; // Ignorar updates sin message (edited_message, etc.)
251
+
252
+ const chatId = String(mensaje.chat?.id || '');
253
+ const texto = String(mensaje.text || '');
254
+ // Solo loggear los últimos 4 dígitos del chat_id para proteger PII
255
+ const chatIdOculto = chatId.length > 4 ? `***${chatId.slice(-4)}` : `***${chatId}`;
256
+
257
+ if (chatId !== String(ownerChatId)) {
258
+ log('WARN', `rechazado chat_id: ${chatIdOculto}`);
259
+ // Responder con acceso denegado
260
+ try {
261
+ await enviarMensaje(token, chatId, 'Acceso denegado');
262
+ } catch (_) {}
263
+ return;
264
+ }
265
+
266
+ // Extraer solo el nombre del comando para el log (no el texto completo por PII)
267
+ const primerToken = texto.trim().split(/\s+/)[0] || '';
268
+ const comandoLog = primerToken.startsWith('/') ? primerToken.split('@')[0] : '(mensaje)';
269
+ log('INFO', `comando recibido: ${comandoLog} de chat_id: ${chatIdOculto}`);
270
+
271
+ const { respuesta } = despachar(mensaje, ownerChatId);
272
+
273
+ if (!respuesta) return; // Mensaje sin comando — ignorar
274
+
275
+ try {
276
+ const resultado = await enviarMensaje(token, chatId, respuesta);
277
+ if (!resultado.ok) {
278
+ log('WARN', `fallo al enviar respuesta: ${resultado.error || resultado.statusCode}`);
279
+ }
280
+ } catch (err) {
281
+ log('ERROR', `excepción al enviar respuesta: ${err.message}`);
282
+ }
283
+ }
284
+
285
+ // -----------------------------------------------------------------
286
+ // Bucle principal del daemon
287
+ // -----------------------------------------------------------------
288
+
289
+ /**
290
+ * Bucle principal de long-polling.
291
+ *
292
+ * @param {string} token - Token del bot.
293
+ * @param {string} ownerChatId - Chat ID autorizado.
294
+ */
295
+ async function buclePolling(token, ownerChatId) {
296
+ let offset = leerOffset();
297
+ log('INFO', `daemon iniciado — PID ${process.pid} — offset inicial: ${offset}`);
298
+
299
+ while (corriendo) {
300
+ const resultado = await getUpdates(token, offset);
301
+
302
+ if (!resultado.ok) {
303
+ fallosConsecutivos++;
304
+
305
+ const esError4xx = resultado.statusCode >= 400 && resultado.statusCode < 500;
306
+
307
+ if (esError4xx) {
308
+ // Errores 4xx: credenciales inválidas u otro error cliente — fatal
309
+ log('ERROR', `error ${resultado.statusCode} de Telegram (cliente). Posible token inválido. Deteniendo daemon.`);
310
+ corriendo = false;
311
+ process.exitCode = 1;
312
+ break;
313
+ }
314
+
315
+ if (fallosConsecutivos >= MAX_FALLOS_CIRCUITO) {
316
+ if (!circuitAbierto) {
317
+ log('WARN', `circuit breaker abierto tras ${fallosConsecutivos} fallos consecutivos. Backoff: ${BACKOFF_CIRCUIT / 1000}s`);
318
+ circuitAbierto = true;
319
+ }
320
+ }
321
+
322
+ const backoff = calcularBackoff(fallosConsecutivos);
323
+ log('WARN', `fallo getUpdates (${fallosConsecutivos}/${MAX_FALLOS_CIRCUITO}): ${resultado.error}. Reintentando en ${backoff}ms`);
324
+
325
+ if (corriendo) await esperar(backoff);
326
+ continue;
327
+ }
328
+
329
+ // Éxito: resetear contadores de fallo
330
+ if (fallosConsecutivos > 0) {
331
+ log('INFO', `conexión restaurada tras ${fallosConsecutivos} fallos`);
332
+ fallosConsecutivos = 0;
333
+ circuitAbierto = false;
334
+ }
335
+
336
+ // Procesar cada update
337
+ for (const update of resultado.updates) {
338
+ if (!corriendo) break;
339
+ try {
340
+ await procesarUpdate(update, token, ownerChatId);
341
+ } catch (err) {
342
+ log('ERROR', `error inesperado procesando update ${update.update_id}: ${err.message}`);
343
+ }
344
+ // Avanzar offset: update_id + 1 para marcar como procesado
345
+ if (typeof update.update_id === 'number') {
346
+ offset = update.update_id + 1;
347
+ guardarOffset(offset);
348
+ }
349
+ }
350
+ }
351
+ }
352
+
353
+ // -----------------------------------------------------------------
354
+ // Cleanup en señales de terminación
355
+ // -----------------------------------------------------------------
356
+
357
+ /**
358
+ * Handler de shutdown limpio.
359
+ *
360
+ * @param {string} señal - Nombre de la señal recibida.
361
+ */
362
+ function cleanup(señal) {
363
+ log('INFO', `señal ${señal} recibida — apagando daemon`);
364
+ corriendo = false;
365
+ eliminarPid();
366
+ process.exit(0);
367
+ }
368
+
369
+ process.on('SIGTERM', () => cleanup('SIGTERM'));
370
+ process.on('SIGINT', () => cleanup('SIGINT'));
371
+
372
+ process.on('uncaughtException', (err) => {
373
+ log('ERROR', `uncaughtException: ${err.message}\n${err.stack || ''}`);
374
+ eliminarPid();
375
+ process.exit(1);
376
+ });
377
+
378
+ process.on('unhandledRejection', (reason) => {
379
+ const msg = reason instanceof Error ? reason.message : String(reason);
380
+ log('ERROR', `unhandledRejection: ${msg}`);
381
+ // No terminar — best-effort
382
+ });
383
+
384
+ // -----------------------------------------------------------------
385
+ // Punto de entrada
386
+ // -----------------------------------------------------------------
387
+
388
+ /**
389
+ * Arranca el daemon de Telegram.
390
+ * Separado para facilitar tests de importación sin efecto lateral.
391
+ */
392
+ async function runDaemon() {
393
+ // Verificar credenciales
394
+ const { config, valido, errores } = cargarConfig();
395
+
396
+ if (!valido) {
397
+ process.stderr.write(
398
+ `[ERROR] Faltan credenciales de Telegram: ${errores.join(', ')}\n` +
399
+ `Configura ~/.claude/notifications/.env con TELEGRAM_BOT_TOKEN y TELEGRAM_CHAT_ID.\n` +
400
+ `Puedes usar /swl:notificaciones init para configurarlas.\n`
401
+ );
402
+ process.exit(1);
403
+ }
404
+
405
+ const token = config.TELEGRAM_BOT_TOKEN;
406
+ const ownerChatId = String(config.TELEGRAM_CHAT_ID).trim();
407
+
408
+ // Escribir PID file
409
+ _asegurarDir();
410
+ escribirPid();
411
+
412
+ try {
413
+ await buclePolling(token, ownerChatId);
414
+ } finally {
415
+ eliminarPid();
416
+ }
417
+ }
418
+
419
+ // Patrón dual-use: librería importable para tests + CLI ejecutable
420
+ if (require.main === module) {
421
+ runDaemon().catch((err) => {
422
+ log('ERROR', `error fatal en daemon: ${err.message}`);
423
+ eliminarPid();
424
+ process.exit(1);
425
+ });
426
+ }
427
+
428
+ module.exports = {
429
+ // Exportar funciones puras para tests
430
+ leerOffset,
431
+ guardarOffset,
432
+ getUpdates,
433
+ procesarUpdate,
434
+ cleanup,
435
+ esperar,
436
+ calcularBackoff,
437
+ // Para tests de integración
438
+ runDaemon,
439
+ RUTA_OFFSET,
440
+ RUTA_PID,
441
+ RUTA_LOG,
442
+ };
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>com.swl.telegram-bot</string>
7
+ <key>ProgramArguments</key>
8
+ <array>
9
+ <string>{{NODE_PATH}}</string>
10
+ <string>{{BIN_PATH}}</string>
11
+ </array>
12
+ <key>RunAtLoad</key>
13
+ <true/>
14
+ <key>KeepAlive</key>
15
+ <true/>
16
+ <key>StandardOutPath</key>
17
+ <string>{{HOME}}/.claude/notifications/bot.stdout.log</string>
18
+ <key>StandardErrorPath</key>
19
+ <string>{{HOME}}/.claude/notifications/bot.stderr.log</string>
20
+ </dict>
21
+ </plist>
@@ -0,0 +1,14 @@
1
+ [Unit]
2
+ Description=SWL Telegram Bot Daemon
3
+ After=network-online.target
4
+
5
+ [Service]
6
+ Type=simple
7
+ ExecStart={{NODE_PATH}} {{BIN_PATH}}
8
+ Restart=on-failure
9
+ RestartSec=5s
10
+ StandardOutput=append:{{HOME}}/.claude/notifications/bot.stdout.log
11
+ StandardError=append:{{HOME}}/.claude/notifications/bot.stderr.log
12
+
13
+ [Install]
14
+ WantedBy=default.target
@@ -0,0 +1,23 @@
1
+ {
2
+ "release.md": {
3
+ "evolved": true,
4
+ "evolvedFrom": "5.4.0",
5
+ "evolvedAt": "2026-04-11",
6
+ "evolvedBy": "aprender",
7
+ "evolvedNote": "mejora de metodología: checklist obligatoria de archivos de versión en paso 6"
8
+ },
9
+ "aprender.md": {
10
+ "evolved": true,
11
+ "evolvedFrom": "5.12.3",
12
+ "evolvedAt": "2026-04-25",
13
+ "evolvedBy": "aprender",
14
+ "evolvedNote": "Paso 2 — filtro crítico obligatorio sobre reportes de sub-agentes Explore para evitar sobre-ingeniería al analizar papers académicos"
15
+ },
16
+ "verificar.md": {
17
+ "evolved": true,
18
+ "evolvedFrom": "5.12.3",
19
+ "evolvedAt": "2026-04-26",
20
+ "evolvedBy": "evolucionar",
21
+ "evolvedNote": "flag --until-converge para iterar verificar→corregir→re-verificar hasta 0 hallazgos CRÍTICO+ALTO+MAYOR (max-iter=5, --no-prompt CI, detección adversarial ≥5 hallazgos nuevos)"
22
+ }
23
+ }
@@ -0,0 +1,174 @@
1
+ ---
2
+ name: swl:actualizar
3
+ description: Actualiza el sistema SWL a la última versión disponible. Detecta automáticamente el perfil instalado y re-instala con --force preservando la configuración del usuario. No requiere desinstalar primero.
4
+ allowed_tools: ["Read", "Bash", "Glob"]
5
+ ---
6
+
7
+ # /swl:actualizar — Actualizar sistema SWL
8
+
9
+ Eres el actualizador del sistema SWL dentro de Claude Code. Tu misión es actualizar los componentes instalados a la última versión disponible sin perder la configuración del usuario ni requerir desinstalación previa.
10
+
11
+ ## Cuándo usar este comando
12
+
13
+ - Cuando se publicó una nueva versión del sistema SWL y quieres obtener las mejoras
14
+ - Después de que `/swl:salud` reporta que la versión instalada está desactualizada
15
+ - Cuando otro miembro del equipo indica que hay actualización disponible
16
+ - Para re-instalar el mismo perfil después de modificaciones manuales que dejaron el sistema inconsistente
17
+
18
+ No usar si SWL no está instalado — en ese caso usar `/swl:instalar`.
19
+
20
+ ## Paso 0 — Verificar que SWL está instalado
21
+
22
+ ```bash
23
+ cat .claude/.swl-install-state.json 2>/dev/null
24
+ ```
25
+
26
+ Si NO existe archivo de estado:
27
+ - Informa: "No se encontró una instalación de SWL en este proyecto."
28
+ - Sugiere: "Usa `/swl:instalar` para instalar SWL por primera vez."
29
+ - DETENTE.
30
+
31
+ Si existe, extrae:
32
+ - `perfil`: el perfil actualmente instalado
33
+ - `versionSistema`: la versión instalada
34
+ - `global`: si fue instalación global
35
+ - `archivosInstalados`: cantidad de archivos
36
+
37
+ Informa al usuario:
38
+ ```
39
+ SWL instalado:
40
+ Versión: <versionSistema>
41
+ Perfil: <perfil>
42
+ Archivos: <N>
43
+ Tipo: <local|global>
44
+ ```
45
+
46
+ ## Paso 1 — Verificar versión disponible
47
+
48
+ ```bash
49
+ npm view @saulwade/swl-ses version 2>/dev/null \
50
+ || npm view @saul-wade/swl-ses version --registry=https://npm.pkg.github.com 2>/dev/null
51
+ ```
52
+
53
+ Si hay una versión más nueva, informa:
54
+ - "Versión instalada: **X**. Versión disponible: **Y**."
55
+
56
+ Si ya está en la última versión:
57
+ - "Ya tienes la última versión (**X**). ¿Deseas re-instalar de todos modos?"
58
+ - Si el usuario dice no, DETENTE.
59
+
60
+ ## Paso 1.5 — Descubrimiento de features nuevas
61
+
62
+ Cuando hay una versión nueva disponible, mostrar qué cambió entre la versión
63
+ instalada y la disponible para que el usuario tome una decisión informada.
64
+
65
+ ```bash
66
+ # Obtener changelog entre versiones (si está disponible localmente o via npm)
67
+ CURRENT="<version_instalada>"
68
+ AVAILABLE="<version_disponible>"
69
+
70
+ # Opción 1: Si el repo SWL está disponible como referencia
71
+ if [ -f "CHANGELOG.md" ]; then
72
+ # Extraer entradas del changelog entre las dos versiones
73
+ sed -n "/## \[$AVAILABLE\]/,/## \[$CURRENT\]/p" CHANGELOG.md | head -50
74
+ fi
75
+ ```
76
+
77
+ Presentar al usuario un resumen categorizado:
78
+
79
+ ```
80
+ === Novedades entre v<CURRENT> y v<AVAILABLE> ===
81
+
82
+ 📦 Componentes nuevos:
83
+ - [agentes/skills/hooks/comandos nuevos]
84
+
85
+ 🔧 Mejoras:
86
+ - [mejoras a componentes existentes]
87
+
88
+ 🐛 Correcciones:
89
+ - [bugs corregidos]
90
+
91
+ ⚠ Cambios que requieren atención:
92
+ - [breaking changes o migraciones necesarias]
93
+ - [reglas nuevas obligatorias]
94
+ - [hooks nuevos que podrían afectar el flujo]
95
+
96
+ 💡 Guía de migración:
97
+ - [Si hay cambios breaking, pasos concretos para adaptar el proyecto]
98
+ - [Si hay hooks nuevos, cómo configurarlos]
99
+ ```
100
+
101
+ Si no se puede obtener el changelog, informar:
102
+ ```
103
+ No se pudo obtener el detalle de cambios entre versiones.
104
+ Consulta el CHANGELOG.md del repositorio SWL para ver las novedades.
105
+ ```
106
+
107
+ ## Paso 2 — Confirmar actualización
108
+
109
+ ```
110
+ === Actualización SWL ===
111
+
112
+ Versión actual: <version instalada>
113
+ Versión disponible: <version nueva>
114
+ Perfil: <perfil>
115
+ Tipo: <local|global>
116
+
117
+ La actualización:
118
+ - Sobrescribe agentes, skills, comandos, reglas y hooks
119
+ - Actualiza hooks en settings.json
120
+ - Preserva _userland/ (extensiones del usuario)
121
+ - Preserva .planning/ (estado del proyecto)
122
+
123
+ ¿Proceder?
124
+ ```
125
+
126
+ Espera confirmación del usuario.
127
+
128
+ ## Paso 3 — Ejecutar actualización
129
+
130
+ ```bash
131
+ npx @saulwade/swl-ses@latest install --target claude --profile <PERFIL> [--global] --force
132
+ ```
133
+
134
+ Usa el mismo perfil y ubicación de la instalación original.
135
+
136
+ ## Paso 4 — Ejecutar doctor
137
+
138
+ ```bash
139
+ npx @saulwade/swl-ses@latest doctor
140
+ ```
141
+
142
+ ## Paso 5 — Reportar resultado
143
+
144
+ ```
145
+ === Actualización SWL completada ===
146
+
147
+ Versión anterior: <X>
148
+ Versión nueva: <Y>
149
+ Perfil: <perfil>
150
+ Archivos: <N> actualizados
151
+
152
+ Doctor: <resultado>
153
+ ```
154
+
155
+ ## Cambio de perfil durante actualización
156
+
157
+ Si el usuario dice algo como "actualiza y cambia a perfil completo", ejecuta:
158
+
159
+ ```bash
160
+ npx @saulwade/swl-ses@latest install --target claude --profile <NUEVO_PERFIL> [--global] --force
161
+ ```
162
+
163
+ Informa que el cambio de perfil puede agregar componentes nuevos pero no elimina los del perfil anterior. Si quiere una instalación limpia con otro perfil, sugiere:
164
+ 1. `npx swl-ses uninstall --target claude`
165
+ 2. `/swl:instalar` con el nuevo perfil
166
+
167
+ ## Reglas de comportamiento
168
+
169
+ - SIEMPRE verifica que SWL está instalado antes de intentar actualizar.
170
+ - SIEMPRE muestra versión actual vs disponible.
171
+ - SIEMPRE confirma antes de ejecutar.
172
+ - NUNCA cambia el perfil sin que el usuario lo pida explícitamente.
173
+ - Preserva `_userland/` y `.planning/` siempre.
174
+ - Si la actualización falla, el sistema queda en el estado anterior (los archivos existentes no se borran antes de copiar los nuevos).