@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,182 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Descubrimiento de proyectos Claude Code desde ~/.claude/projects/
5
+ *
6
+ * Escanea los directorios de proyectos del harness de Claude Code,
7
+ * extrae el `cwd` del .jsonl más reciente de cada proyecto y deriva
8
+ * el nombre del proyecto con path.basename(cwd).
9
+ *
10
+ * @module bin/lib/bot-discovery
11
+ */
12
+
13
+ const fs = require('node:fs');
14
+ const path = require('node:path');
15
+ const os = require('node:os');
16
+
17
+ // Directorio estándar de proyectos de Claude Code
18
+ const DIR_PROYECTOS = path.join(os.homedir(), '.claude', 'projects');
19
+
20
+ /**
21
+ * Extrae el valor `cwd` de una línea del archivo .jsonl de sesión.
22
+ * Busca en el formato de sesiones de Claude Code.
23
+ *
24
+ * @param {string} linea - Una línea JSON del archivo .jsonl.
25
+ * @returns {string|null} El cwd encontrado o null.
26
+ */
27
+ function _extraerCwd(linea) {
28
+ try {
29
+ const obj = JSON.parse(linea);
30
+ // Formato de sesión Claude Code: { cwd: '...' }
31
+ if (obj && typeof obj.cwd === 'string' && obj.cwd.trim()) {
32
+ return obj.cwd.trim();
33
+ }
34
+ } catch (_) {
35
+ // Ignorar líneas malformadas
36
+ }
37
+ return null;
38
+ }
39
+
40
+ /**
41
+ * Busca el cwd en un archivo .jsonl leyendo las primeras N líneas.
42
+ *
43
+ * @param {string} rutaJsonl - Ruta al archivo .jsonl de sesión.
44
+ * @returns {string|null} El cwd encontrado o null.
45
+ */
46
+ function _cwdDeJsonl(rutaJsonl) {
47
+ try {
48
+ const contenido = fs.readFileSync(rutaJsonl, 'utf8');
49
+ const lineas = contenido.split('\n');
50
+ for (const linea of lineas) {
51
+ const recortada = linea.trim();
52
+ if (!recortada) continue;
53
+ const cwd = _extraerCwd(recortada);
54
+ if (cwd) return cwd;
55
+ }
56
+ } catch (_) {
57
+ // Archivo ilegible: ignorar
58
+ }
59
+ return null;
60
+ }
61
+
62
+ /**
63
+ * Obtiene el archivo .jsonl más reciente en un directorio de proyecto.
64
+ *
65
+ * @param {string} dirProyecto - Directorio del proyecto Claude Code.
66
+ * @returns {{ ruta: string, mtime: number }|null} El jsonl más reciente o null.
67
+ */
68
+ function _jsonlMasReciente(dirProyecto) {
69
+ try {
70
+ const archivos = fs.readdirSync(dirProyecto);
71
+ let mejor = null;
72
+
73
+ for (const archivo of archivos) {
74
+ if (!archivo.endsWith('.jsonl')) continue;
75
+ const ruta = path.join(dirProyecto, archivo);
76
+ try {
77
+ const stat = fs.statSync(ruta);
78
+ if (!mejor || stat.mtimeMs > mejor.mtime) {
79
+ mejor = { ruta, mtime: stat.mtimeMs };
80
+ }
81
+ } catch (_) {
82
+ // Si no se puede leer el stat, saltar
83
+ }
84
+ }
85
+
86
+ return mejor;
87
+ } catch (_) {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Descubre proyectos activos de Claude Code.
94
+ *
95
+ * Escanea ~/.claude/projects/, lee el .jsonl más reciente de cada subdirectorio
96
+ * y extrae el cwd para derivar el nombre del proyecto.
97
+ *
98
+ * @returns {Array<{ nombre: string, cwd: string, mtime: number }>}
99
+ * Lista de proyectos ordenada por mtime descendente (más reciente primero).
100
+ */
101
+ function descubrirProyectos() {
102
+ if (!fs.existsSync(DIR_PROYECTOS)) return [];
103
+
104
+ const proyectos = [];
105
+
106
+ let entradas;
107
+ try {
108
+ entradas = fs.readdirSync(DIR_PROYECTOS);
109
+ } catch (_) {
110
+ return [];
111
+ }
112
+
113
+ for (const entrada of entradas) {
114
+ const dirProyecto = path.join(DIR_PROYECTOS, entrada);
115
+ try {
116
+ const stat = fs.statSync(dirProyecto);
117
+ if (!stat.isDirectory()) continue;
118
+ } catch (_) {
119
+ continue;
120
+ }
121
+
122
+ const jsonlInfo = _jsonlMasReciente(dirProyecto);
123
+ if (!jsonlInfo) continue;
124
+
125
+ const cwd = _cwdDeJsonl(jsonlInfo.ruta);
126
+ if (!cwd) continue;
127
+
128
+ const nombre = path.basename(cwd);
129
+ if (!nombre) continue;
130
+
131
+ proyectos.push({ nombre, cwd, mtime: jsonlInfo.mtime });
132
+ }
133
+
134
+ // Ordenar por mtime descendente
135
+ proyectos.sort((a, b) => b.mtime - a.mtime);
136
+
137
+ return proyectos;
138
+ }
139
+
140
+ /**
141
+ * Resuelve un proyecto a partir de un término de búsqueda.
142
+ *
143
+ * Estrategia: match exacto > match por prefijo > match por substring.
144
+ * Si hay ambigüedad retorna la lista de candidatos para pedir aclaración.
145
+ *
146
+ * @param {string} termino - Término de búsqueda ingresado por el usuario.
147
+ * @param {Array<{ nombre: string, cwd: string, mtime: number }>} [proyectos]
148
+ * Lista de proyectos a buscar. Si se omite, llama a descubrirProyectos().
149
+ * @returns {{ proyecto: object|null, candidatos: object[], ambiguo: boolean }}
150
+ */
151
+ function resolverProyecto(termino, proyectos) {
152
+ if (!proyectos) proyectos = descubrirProyectos();
153
+ const t = (termino || '').trim().toLowerCase();
154
+
155
+ if (!t) return { proyecto: null, candidatos: [], ambiguo: false };
156
+
157
+ // Match exacto (case-insensitive)
158
+ const exacto = proyectos.filter((p) => p.nombre.toLowerCase() === t);
159
+ if (exacto.length === 1) return { proyecto: exacto[0], candidatos: exacto, ambiguo: false };
160
+ if (exacto.length > 1) return { proyecto: null, candidatos: exacto, ambiguo: true };
161
+
162
+ // Match por prefijo
163
+ const prefijo = proyectos.filter((p) => p.nombre.toLowerCase().startsWith(t));
164
+ if (prefijo.length === 1) return { proyecto: prefijo[0], candidatos: prefijo, ambiguo: false };
165
+ if (prefijo.length > 1) return { proyecto: null, candidatos: prefijo, ambiguo: true };
166
+
167
+ // Match por substring
168
+ const substring = proyectos.filter((p) => p.nombre.toLowerCase().includes(t));
169
+ if (substring.length === 1) return { proyecto: substring[0], candidatos: substring, ambiguo: false };
170
+ if (substring.length > 1) return { proyecto: null, candidatos: substring, ambiguo: true };
171
+
172
+ return { proyecto: null, candidatos: [], ambiguo: false };
173
+ }
174
+
175
+ module.exports = {
176
+ descubrirProyectos,
177
+ resolverProyecto,
178
+ DIR_PROYECTOS,
179
+ // Exportar para tests
180
+ _cwdDeJsonl,
181
+ _extraerCwd,
182
+ };
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Wrappers git con whitelist estricta para el bot de Telegram.
5
+ *
6
+ * SEGURIDAD: Solo se permiten los subcomandos definidos en WHITELIST_GIT.
7
+ * Toda llamada a git usa child_process.execFileSync con array de argumentos
8
+ * (shell desactivado, args como array) y timeout de 10 segundos.
9
+ *
10
+ * @module bin/lib/bot-git
11
+ */
12
+
13
+ const { execFileSync } = require('node:child_process');
14
+
15
+ // Timeout máximo por llamada git (ms)
16
+ const TIMEOUT_GIT_MS = 10_000;
17
+
18
+ /**
19
+ * Subcomandos git permitidos. Cualquier otro subcomando es rechazado.
20
+ * Solo comandos de lectura — NUNCA escritura.
21
+ */
22
+ const WHITELIST_GIT = new Set([
23
+ 'rev-parse',
24
+ 'status',
25
+ 'log',
26
+ 'diff',
27
+ 'branch',
28
+ ]);
29
+
30
+ /**
31
+ * Ejecuta un comando git en el directorio indicado.
32
+ *
33
+ * @param {string} cwd - Directorio del proyecto (obtenido de discoverProyectos).
34
+ * @param {string[]} args - Argumentos para git (primer elemento = subcomando).
35
+ * @returns {{ ok: boolean, salida: string, error?: string }}
36
+ */
37
+ function ejecutarGit(cwd, args) {
38
+ if (!Array.isArray(args) || args.length === 0) {
39
+ return { ok: false, salida: '', error: 'args vacíos' };
40
+ }
41
+
42
+ const subcomando = args[0];
43
+
44
+ if (!WHITELIST_GIT.has(subcomando)) {
45
+ return {
46
+ ok: false,
47
+ salida: '',
48
+ error: `subcomando no permitido: ${subcomando}`,
49
+ };
50
+ }
51
+
52
+ try {
53
+ const salida = execFileSync('git', ['-C', cwd, ...args], {
54
+ timeout: TIMEOUT_GIT_MS,
55
+ encoding: 'utf8',
56
+ // shell desactivado — args como array previene inyección de comandos
57
+ shell: false,
58
+ // Ignorar stderr para comandos que escriben ahí en algunos OS
59
+ stdio: ['ignore', 'pipe', 'pipe'],
60
+ });
61
+ return { ok: true, salida: salida || '' };
62
+ } catch (err) {
63
+ const msg = err.stdout || err.stderr || err.message || 'error desconocido';
64
+ return { ok: false, salida: '', error: String(msg).trim() };
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Obtiene el estado de un proyecto git.
70
+ *
71
+ * Retorna: rama actual, estado corto (--branch) y último commit (--oneline).
72
+ *
73
+ * @param {string} cwd - Directorio del proyecto.
74
+ * @returns {{ ok: boolean, rama: string, estado: string, ultimoCommit: string, error?: string }}
75
+ */
76
+ function obtenerEstado(cwd) {
77
+ const rama = ejecutarGit(cwd, ['rev-parse', '--abbrev-ref', 'HEAD']);
78
+ const estado = ejecutarGit(cwd, ['status', '--short', '--branch']);
79
+ const ultimoCommit = ejecutarGit(cwd, ['log', '-1', '--format=%h %s']);
80
+
81
+ if (!rama.ok && !estado.ok) {
82
+ return {
83
+ ok: false,
84
+ rama: '',
85
+ estado: '',
86
+ ultimoCommit: '',
87
+ error: rama.error || estado.error,
88
+ };
89
+ }
90
+
91
+ return {
92
+ ok: true,
93
+ rama: (rama.salida || '').trim(),
94
+ estado: (estado.salida || '').trim(),
95
+ ultimoCommit: (ultimoCommit.salida || '').trim(),
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Obtiene el log de commits de un proyecto.
101
+ *
102
+ * @param {string} cwd - Directorio del proyecto.
103
+ * @param {number} n - Número de commits. Máximo 25 (se aplica silenciosamente).
104
+ * @returns {{ ok: boolean, lineas: string[], error?: string }}
105
+ */
106
+ function obtenerLog(cwd, n) {
107
+ const limite = Math.min(Math.max(1, Number(n) || 5), 25);
108
+ const resultado = ejecutarGit(cwd, ['log', `-${limite}`, '--format=%h %s']);
109
+
110
+ if (!resultado.ok) {
111
+ return { ok: false, lineas: [], error: resultado.error };
112
+ }
113
+
114
+ const lineas = resultado.salida.split('\n').filter(Boolean);
115
+ return { ok: true, lineas };
116
+ }
117
+
118
+ /**
119
+ * Obtiene el diff stat de staged y no-staged de un proyecto.
120
+ *
121
+ * @param {string} cwd - Directorio del proyecto.
122
+ * @returns {{ ok: boolean, diffNoStaged: string, diffStaged: string, error?: string }}
123
+ */
124
+ function obtenerDiff(cwd) {
125
+ const noStaged = ejecutarGit(cwd, ['diff', '--stat']);
126
+ const staged = ejecutarGit(cwd, ['diff', '--stat', '--staged']);
127
+
128
+ return {
129
+ ok: true,
130
+ diffNoStaged: (noStaged.salida || '').trim(),
131
+ diffStaged: (staged.salida || '').trim(),
132
+ };
133
+ }
134
+
135
+ module.exports = {
136
+ ejecutarGit,
137
+ obtenerEstado,
138
+ obtenerLog,
139
+ obtenerDiff,
140
+ WHITELIST_GIT,
141
+ TIMEOUT_GIT_MS,
142
+ };
package/bin/swl-ses.js ADDED
@@ -0,0 +1,325 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const path = require('path');
5
+ const fs = require('fs');
6
+ const os = require('os');
7
+
8
+ const VERSION = require('../package.json').version;
9
+ const NOMBRE = 'swl-ses';
10
+
11
+ /**
12
+ * Extrae [major, minor, patch] de una versión semver. Ignora prerelease y build
13
+ * metadata (ej. "5.7.5-beta.1+abc"). Retorna null si el formato es inválido.
14
+ * Nunca produce NaN — si un componente no es numérico, retorna null directamente.
15
+ */
16
+ function parseSemver(v) {
17
+ const m = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(String(v));
18
+ if (!m) return null;
19
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
20
+ }
21
+
22
+ /**
23
+ * Compara dos versiones semver core. Retorna 1 si a > b, -1 si a < b, 0 si iguales.
24
+ * Retorna null si alguna no es parseable — el caller debe manejar el null.
25
+ */
26
+ function compararSemver(a, b) {
27
+ const pa = parseSemver(a);
28
+ const pb = parseSemver(b);
29
+ if (!pa || !pb) return null;
30
+ for (let i = 0; i < 3; i++) {
31
+ if (pa[i] !== pb[i]) return pa[i] > pb[i] ? 1 : -1;
32
+ }
33
+ return 0;
34
+ }
35
+
36
+ /**
37
+ * Detecta si el CLI cacheado de npx es más viejo que la instalación SWL del usuario.
38
+ * El caso típico: el usuario instaló vN vía `@latest` pero `npx swl-ses` sigue
39
+ * apuntando a una versión cacheada anterior sin que lo sepa.
40
+ *
41
+ * Busca `.swl-install-state.json` en las ubicaciones conocidas (global ~/.claude,
42
+ * local .claude y variantes de otros runtimes) y compara `versionSistema`.
43
+ */
44
+ function verificarCoherenciaVersion() {
45
+ try {
46
+ const candidatos = [
47
+ path.join(os.homedir(), '.claude', '.swl-install-state.json'),
48
+ path.join(process.cwd(), '.claude', '.swl-install-state.json'),
49
+ path.join(process.cwd(), '.github', '.swl-install-state.json'),
50
+ path.join(process.cwd(), '.codex', '.swl-install-state.json'),
51
+ path.join(process.cwd(), '.gemini', '.swl-install-state.json'),
52
+ path.join(process.cwd(), '.opencode', '.swl-install-state.json'),
53
+ ];
54
+
55
+ let versionMax = null;
56
+ for (const ruta of candidatos) {
57
+ if (!fs.existsSync(ruta)) continue;
58
+ try {
59
+ const estado = JSON.parse(fs.readFileSync(ruta, 'utf-8'));
60
+ const v = estado.versionSistema;
61
+ if (!parseSemver(v)) continue;
62
+ if (!versionMax || compararSemver(v, versionMax) > 0) versionMax = v;
63
+ } catch { /* silencioso — archivo corrupto no debe romper el CLI */ }
64
+ }
65
+
66
+ if (versionMax && compararSemver(versionMax, VERSION) === 1) {
67
+ process.stderr.write(
68
+ `\n[swl-ses] AVISO: CLI desactualizado — ejecutando v${VERSION}, pero tu instalación SWL es v${versionMax}.\n` +
69
+ `[swl-ses] npm tiene cacheada una versión vieja. Para usar la versión correcta:\n` +
70
+ `[swl-ses] npx @saulwade/swl-ses@latest <comando>\n` +
71
+ `[swl-ses] O limpia la caché de npx:\n` +
72
+ `[swl-ses] npx clear-npx-cache\n\n`
73
+ );
74
+ }
75
+ } catch { /* nunca bloquear el CLI por este check */ }
76
+ }
77
+
78
+ const COMANDOS = {
79
+ init: '../scripts/inicializar.js',
80
+ install: '../scripts/instalador.js',
81
+ doctor: '../scripts/doctor.js',
82
+ update: '../scripts/actualizar.js',
83
+ uninstall: '../scripts/desinstalar.js',
84
+ 'check-update': '../scripts/check-update.js',
85
+ 'install-git-hook': '../scripts/instalar-git-hook.js',
86
+ };
87
+
88
+ // Comandos con subcomandos (nivel 2)
89
+ const SUBCOMANDOS = {
90
+ skills: '../scripts/comandos/skills.js',
91
+ agents: '../scripts/comandos/agents.js',
92
+ info: '../scripts/comandos/info.js',
93
+ };
94
+
95
+ const AYUDA = `
96
+ ${NOMBRE} v${VERSION} — Sistema de Ingeniería de Software SWL
97
+
98
+ USO:
99
+ ${NOMBRE} <comando> [subcomando] [opciones]
100
+
101
+ COMANDOS PRINCIPALES:
102
+ init Inicializa .planning/ y _userland/ en el proyecto actual
103
+ install Instala componentes. Sin flags: modo asistido interactivo.
104
+ Con flags: modo directo (ver OPCIONES DE INSTALL).
105
+ doctor Diagnóstica problemas de instalación
106
+ update Actualiza componentes instalados
107
+ uninstall Desinstala componentes del runtime
108
+ check-update Fuerza consulta inmediata de nueva versión en npm (sin throttle)
109
+ install-git-hook [--force] Instala pre-commit hook que avisa de nuevas versiones.
110
+ Útil para CLIs que no son Claude Code (Codex, Copilot,
111
+ Gemini, OpenCode) donde el hook UserPromptSubmit no aplica.
112
+ info [--target <runtime>] Muestra información del sistema instalado
113
+ help Muestra esta ayuda (alias de --help)
114
+ list [--target <runtime>] Lista todos los agentes y skills instalados
115
+
116
+ GESTIÓN DE COMPONENTES:
117
+ skills list Lista skills instalados
118
+ skills add <fuente> Agrega skill desde repo Git o path local
119
+ skills remove <nombre> Remueve un skill individual
120
+ agents list Lista agentes instalados
121
+ agents add <fuente> Agrega agente desde repo Git o path local
122
+ agents remove <nombre> Remueve un agente individual
123
+
124
+ OPCIONES DE INSTALL:
125
+ --target <runtime> Runtime destino: claude|openclaude|copilot|opencode|codex|gemini (default: claude)
126
+ --profile <perfil> Perfil: core|backend-python|backend-node|frontend-react|frontend-angular|
127
+ fullstack-python-angular|fullstack-node-react|mobile|devops|completo (default: core)
128
+ --with <componentes> Incluir componentes adicionales (separados por coma)
129
+ --without <comps> Excluir componentes (separados por coma)
130
+ --global Instalar en directorio global del runtime (~/.claude, etc.)
131
+ --local Instalar en directorio local del proyecto (.claude/, etc.)
132
+ --dry-run Mostrar plan sin aplicar cambios
133
+ --force Sobreescribir archivos existentes sin confirmar
134
+ --all-langs Instalar reglas de todos los lenguajes (omite detección automática de stack)
135
+ --no-claudemd No modificar el CLAUDE.md del proyecto (solo aplica con --target claude).
136
+ Por defecto el instalador crea o actualiza un bloque delimitado por
137
+ <!-- SWL-BEGIN vX.Y.Z --> / <!-- SWL-END --> preservando el resto del archivo.
138
+
139
+ OPCIONES DE SKILLS/AGENTS:
140
+ --skill <nombre> Nombre del skill a extraer del repo (con skills add)
141
+ --agent <nombre> Nombre del agente a extraer del repo (con agents add)
142
+ --target <runtime> Runtime destino (default: claude)
143
+
144
+ OPCIONES GENERALES:
145
+ --version, -v Muestra la versión
146
+ --help, -h Muestra esta ayuda
147
+
148
+ EJEMPLOS:
149
+ ${NOMBRE} init
150
+ ${NOMBRE} install (modo asistido — recomendado para primera vez)
151
+ ${NOMBRE} install --target claude --profile backend-python
152
+ ${NOMBRE} install --target openclaude --profile fullstack-python-angular
153
+ ${NOMBRE} install --target gemini --profile core
154
+ ${NOMBRE} install --target copilot --profile fullstack-node-react
155
+ ${NOMBRE} skills list --target claude
156
+ ${NOMBRE} skills add https://github.com/user/repo --skill mi-skill
157
+ ${NOMBRE} agents add ./path/local --agent mi-agente
158
+ ${NOMBRE} info --target claude
159
+ ${NOMBRE} doctor
160
+ ${NOMBRE} uninstall --target claude
161
+ `;
162
+
163
+ function main() {
164
+ const args = process.argv.slice(2);
165
+
166
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
167
+ console.log(AYUDA);
168
+ process.exit(0);
169
+ }
170
+
171
+ if (args.includes('--version') || args.includes('-v')) {
172
+ console.log(`${NOMBRE} v${VERSION}`);
173
+ process.exit(0);
174
+ }
175
+
176
+ verificarCoherenciaVersion();
177
+
178
+ const comando = args[0];
179
+
180
+ // Alias de primer nivel: help → --help, list → resumen de componentes
181
+ if (comando === 'help') {
182
+ console.log(AYUDA);
183
+ process.exit(0);
184
+ }
185
+
186
+ if (comando === 'list') {
187
+ const opciones = parsearOpciones(args.slice(1));
188
+ try {
189
+ const { listarComponentes } = require('../scripts/lib/gestor-componentes');
190
+ for (const tipo of ['agents', 'skills']) {
191
+ const resultado = listarComponentes(tipo, opciones);
192
+ const label = tipo === 'agents' ? 'Agentes' : 'Skills';
193
+ console.log(`\n${label} instalados (${resultado.total}):\n`);
194
+ if (resultado.total === 0) {
195
+ console.log(' (ninguno)');
196
+ } else {
197
+ for (const c of resultado.componentes) {
198
+ console.log(` ${c.nombre}`);
199
+ }
200
+ }
201
+ }
202
+ console.log('');
203
+ } catch (err) {
204
+ console.error(`Error listando componentes: ${err.message}`);
205
+ process.exit(1);
206
+ }
207
+ return;
208
+ }
209
+
210
+ // Comandos con subcomandos (skills, agents, info)
211
+ if (SUBCOMANDOS[comando]) {
212
+ const subcomando = args[1] && !args[1].startsWith('-') ? args[1] : null;
213
+ const restoArgs = subcomando ? args.slice(2) : args.slice(1);
214
+ const opciones = parsearOpciones(restoArgs);
215
+
216
+ try {
217
+ const modulo = require(SUBCOMANDOS[comando]);
218
+ const resultado = modulo(subcomando, opciones);
219
+ // Soportar módulos async (e.g. skills add con selector interactivo)
220
+ if (resultado && typeof resultado.then === 'function') {
221
+ resultado.catch(err => {
222
+ console.error(`Error ejecutando "${comando}${subcomando ? ' ' + subcomando : ''}": ${err.message}`);
223
+ if (opciones.verbose) console.error(err.stack);
224
+ process.exit(1);
225
+ });
226
+ return;
227
+ }
228
+ } catch (err) {
229
+ console.error(`Error ejecutando "${comando}${subcomando ? ' ' + subcomando : ''}": ${err.message}`);
230
+ if (opciones.verbose) {
231
+ console.error(err.stack);
232
+ }
233
+ process.exit(1);
234
+ }
235
+ return;
236
+ }
237
+
238
+ // Comandos simples (init, install, doctor, update, uninstall)
239
+ if (!COMANDOS[comando]) {
240
+ console.error(`Error: Comando desconocido "${comando}"`);
241
+ console.error(`Ejecuta "${NOMBRE} --help" para ver los comandos disponibles.`);
242
+ process.exit(1);
243
+ }
244
+
245
+ const opciones = parsearOpciones(args.slice(1));
246
+
247
+ // Modo asistido: `install` sin flags → flujo interactivo
248
+ // (Si el usuario pasa cualquier flag relevante, se asume que sabe lo que hace.)
249
+ if (comando === 'install') {
250
+ const flagsIrrelevantesParaAsistido = ['verbose'];
251
+ const flagsEspecificados = Object.keys(opciones).filter(
252
+ k => k !== '_args' && !flagsIrrelevantesParaAsistido.includes(k)
253
+ );
254
+ if (flagsEspecificados.length === 0) {
255
+ try {
256
+ const asistido = require('../scripts/comandos/install-asistido');
257
+ asistido.main().catch(err => {
258
+ console.error(`Error ejecutando instalación asistida: ${err.message}`);
259
+ if (opciones.verbose) console.error(err.stack);
260
+ process.exit(1);
261
+ });
262
+ return;
263
+ } catch (err) {
264
+ console.error(`Error ejecutando "${comando}": ${err.message}`);
265
+ if (opciones.verbose) console.error(err.stack);
266
+ process.exit(1);
267
+ }
268
+ }
269
+ }
270
+
271
+ try {
272
+ const modulo = require(COMANDOS[comando]);
273
+ const resultado = modulo(opciones);
274
+ // Soportar módulos async (update, doctor con interactividad)
275
+ if (resultado && typeof resultado.then === 'function') {
276
+ resultado.catch(err => {
277
+ console.error(`Error ejecutando "${comando}": ${err.message}`);
278
+ if (opciones.verbose) console.error(err.stack);
279
+ process.exit(1);
280
+ });
281
+ return;
282
+ }
283
+ } catch (err) {
284
+ console.error(`Error ejecutando "${comando}": ${err.message}`);
285
+ if (opciones.verbose) {
286
+ console.error(err.stack);
287
+ }
288
+ process.exit(1);
289
+ }
290
+ }
291
+
292
+ function parsearOpciones(args) {
293
+ const opciones = { _args: [] };
294
+ let i = 0;
295
+
296
+ while (i < args.length) {
297
+ const arg = args[i];
298
+
299
+ if (arg.startsWith('--')) {
300
+ const clave = arg.slice(2);
301
+ // Opciones booleanas
302
+ if (['global', 'local', 'dry-run', 'force', 'verbose', 'all', 'all-langs', 'no-claudemd'].includes(clave)) {
303
+ opciones[clave.replace(/-/g, '_')] = true;
304
+ } else if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
305
+ opciones[clave] = args[i + 1];
306
+ i++;
307
+ } else {
308
+ opciones[clave] = true;
309
+ }
310
+ } else if (arg.startsWith('-')) {
311
+ const clave = arg.slice(1);
312
+ if (clave === 'v') opciones.version = true;
313
+ else if (clave === 'h') opciones.help = true;
314
+ } else {
315
+ // Argumentos posicionales (fuente en skills add, nombre en skills remove)
316
+ opciones._args.push(arg);
317
+ }
318
+
319
+ i++;
320
+ }
321
+
322
+ return opciones;
323
+ }
324
+
325
+ main();