@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,370 @@
1
+ ---
2
+ name: swl-dashboard
3
+ description: >
4
+ Lanza el dashboard web interactivo de uso de Claude Code (claude-usage).
5
+ Muestra métricas históricas de tokens, costos por modelo, sesiones y proyectos
6
+ con gráficos interactivos. Requiere Python 3.8+. Subcomandos: dashboard (web),
7
+ today (resumen de hoy en terminal), stats (estadísticas históricas en terminal).
8
+ Activar cuando el usuario pide ver el dashboard, análisis histórico de costos,
9
+ métricas de sesiones anteriores o comparativa de modelos.
10
+ user-invocable: false
11
+ version: "1.0.0"
12
+ herramientasPermitidas: [Read, Bash, Glob]
13
+ exclusiones:
14
+ - "No cargar para ver métricas de la sesión actual en tiempo real — usar `/swl:metricas`; este skill requiere datos históricos de múltiples sesiones en `~/.claude/projects/**/*.jsonl`."
15
+ - "No cargar si `claude-usage` no está disponible y el objetivo es solo verificar el estado del sistema SWL — usar `/swl:salud` que no depende de la instalación de la herramienta vendor."
16
+ - "No cargar para diagnosticar por qué un agente falló — este skill muestra métricas de tokens y costos, no trazas de error de agentes; para eso usar `tracing-processor` o revisar `.planning/traces/`."
17
+ - "No cargar en entornos CI/headless donde no hay browser para abrir el dashboard web — usar el subcomando `stats` o `today` que salen en terminal sin servidor HTTP."
18
+ evolvable: true # default para skill estandar
19
+ ---
20
+ # Skill: swl-dashboard
21
+
22
+ Lanza el análisis de uso histórico de Claude Code mediante claude-usage
23
+ (scripts/vendor/claude-usage/), una herramienta Python zero-dependencies
24
+ que parsea los JSONL de Claude Code y genera un dashboard web interactivo.
25
+
26
+ ## Subcomandos
27
+
28
+ | Subcomando | Comportamiento |
29
+ |------------|---------------|
30
+ | (vacío) o `dashboard` | Escanea JSONL → abre dashboard web en http://localhost:8080 |
31
+ | `today` | Imprime en terminal el resumen de consumo del día actual |
32
+ | `stats` | Imprime estadísticas históricas completas (all-time) |
33
+ | `scan` | Solo sincroniza JSONL → SQLite sin abrir dashboard |
34
+
35
+ ## Paso 0 — Verificar Python disponible
36
+
37
+ ```bash
38
+ python3 --version 2>/dev/null || python --version 2>/dev/null
39
+ ```
40
+
41
+ Si Python < 3.8 o no está disponible:
42
+ ```
43
+ ⚠ swl-dashboard requiere Python 3.8+. No se encontró intérprete compatible.
44
+ Instala Python desde https://python.org o usa: winget install Python.Python.3
45
+ Alternativa: usa /swl:metricas para métricas de la sesión actual.
46
+ ```
47
+ Detener y mostrar el mensaje anterior.
48
+
49
+ ## Paso 1 — Detectar intérprete y localizar cli.py
50
+
51
+ Localizar `cli.py` con búsqueda en cascada (proyecto → global ~/.claude → npm → caché npx):
52
+
53
+ ```bash
54
+ # 1. Root del proyecto actual
55
+ PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
56
+ CLI_PY="$PROJECT_ROOT/scripts/vendor/claude-usage/cli.py"
57
+
58
+ # 2. Fallback: instalación global de swl-ses en cualquier runtime compatible
59
+ # Copiado automáticamente por `swl-ses install --global --target <runtime>`
60
+ # Cubre: claude, openclaude, opencode, gemini, copilot, codex
61
+ if [ ! -f "$CLI_PY" ]; then
62
+ for RUNTIME_DIR in "$HOME/.claude" "$HOME/.openclaude" "$HOME/.opencode" "$HOME/.gemini" "$HOME/.github" "$HOME/.codex"; do
63
+ CANDIDATE="$RUNTIME_DIR/scripts/vendor/claude-usage/cli.py"
64
+ if [ -f "$CANDIDATE" ]; then
65
+ CLI_PY="$CANDIDATE"
66
+ break
67
+ fi
68
+ done
69
+ fi
70
+
71
+ # 3. Fallback: instalación global de npm (paquete canónico o mirror)
72
+ if [ ! -f "$CLI_PY" ]; then
73
+ NPM_GLOBAL=$(npm root -g 2>/dev/null)
74
+ for SCOPE in "@saulwade/swl-ses" "@saul-wade/swl-ses"; do
75
+ CANDIDATE="$NPM_GLOBAL/$SCOPE/scripts/vendor/claude-usage/cli.py"
76
+ if [ -f "$CANDIDATE" ]; then
77
+ CLI_PY="$CANDIDATE"
78
+ break
79
+ fi
80
+ done
81
+ fi
82
+
83
+ # 4. Fallback: caché de npx (npx swl-ses sin instalar globalmente)
84
+ if [ ! -f "$CLI_PY" ]; then
85
+ NPX_CACHE=$(npm config get cache 2>/dev/null)/_npx
86
+ FOUND=$(find "$NPX_CACHE" -name "cli.py" -path "*/claude-usage/cli.py" 2>/dev/null | sort -r | head -1)
87
+ [ -n "$FOUND" ] && CLI_PY="$FOUND"
88
+ fi
89
+
90
+ echo "CLI_PY=$CLI_PY"
91
+ [ -f "$CLI_PY" ] && echo "OK" || echo "MISSING"
92
+ ```
93
+
94
+ Si el resultado es `MISSING` después de los cuatro intentos:
95
+ ```
96
+ ⚠ claude-usage no encontrado en ninguna ubicación conocida.
97
+
98
+ La herramienta requiere que swl-ses esté instalado globalmente.
99
+ Ejecuta desde el directorio del repo swl-ses:
100
+
101
+ swl-ses install --global --profile completo
102
+
103
+ Esto copia claude-usage a ~/.claude/scripts/vendor/claude-usage/ y lo hace
104
+ disponible en todos los proyectos automáticamente.
105
+
106
+ Alternativa inmediata: /swl:metricas para métricas de la sesión actual.
107
+ ```
108
+
109
+ > **Nota**: guardar `CLI_PY` y el directorio padre `VENDOR_DIR=$(dirname "$CLI_PY")` para usarlos en el Paso 2.
110
+
111
+ ## Paso 2 — Ejecutar según subcomando
112
+
113
+ > Usar `CLI_PY` y `VENDOR_DIR` detectados en el Paso 1.
114
+ > Todos los comandos necesitan `cd "$VENDOR_DIR"` previo para que los imports relativos (scanner.py, dashboard.py) funcionen.
115
+
116
+ ### Subcomando: `today`
117
+
118
+ ```bash
119
+ cd "$VENDOR_DIR"
120
+ python "$CLI_PY" scan 2>/dev/null
121
+ python "$CLI_PY" today
122
+ ```
123
+
124
+ Muestra el consumo del día en terminal. Ejemplo de salida esperada:
125
+ ```
126
+ ------------------------------------------------------------
127
+ Today's Usage (2026-04-08)
128
+ ------------------------------------------------------------
129
+ claude-sonnet-4-6 turns=47 in=125.4K out=42.9K cost=$0.58
130
+ ------------------------------------------------------------
131
+ TOTAL turns=47 in=125.4K out=42.9K cost=$0.58
132
+ Sessions today: 3
133
+ ------------------------------------------------------------
134
+ ```
135
+
136
+ ### Subcomando: `stats`
137
+
138
+ ```bash
139
+ cd "$VENDOR_DIR"
140
+ python "$CLI_PY" scan 2>/dev/null
141
+ python "$CLI_PY" stats
142
+ ```
143
+
144
+ Muestra estadísticas históricas all-time con desglose por modelo y top proyectos.
145
+
146
+ ### Subcomando: `scan`
147
+
148
+ ```bash
149
+ cd "$VENDOR_DIR"
150
+ python "$CLI_PY" scan
151
+ echo "✓ Base de datos actualizada: ~/.claude/usage.db"
152
+ ```
153
+
154
+ ### Subcomando: `dashboard` (o vacío)
155
+
156
+ `cli.py` detecta automáticamente el primer puerto libre (8888 → 9090 → 9191 …).
157
+ **Nota:** 8080 está excluido intencionalmente — suele estar ocupado por Postgres, IIS u otros servicios.
158
+ Si el usuario especificó un puerto con `/swl:dashboard --port 9090`, pasarlo explícitamente.
159
+
160
+ **IMPORTANTE:** No verificar disponibilidad con `curl http://localhost:8080` — ese puerto puede estar
161
+ ocupado por otro servicio y devolvería un falso positivo. Usar el flujo siguiente:
162
+
163
+ ```bash
164
+ cd "$VENDOR_DIR"
165
+ # Scan previo para asegurar datos actualizados
166
+ python "$CLI_PY" scan 2>/dev/null
167
+
168
+ # Detectar qué puerto está libre ANTES de iniciar (para saber cuál reportar al usuario)
169
+ DASHBOARD_PORT=$(python3 -c "
170
+ import socket
171
+ candidates = [8888, 9090, 9191, 7777, 7878, 8181, 8282, 8383]
172
+ for p in candidates:
173
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
174
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
175
+ try:
176
+ s.bind(('localhost', p))
177
+ print(p)
178
+ break
179
+ except OSError:
180
+ pass
181
+ " 2>/dev/null)
182
+
183
+ # Si el usuario especificó un puerto explícito, usarlo en su lugar
184
+ # DASHBOARD_PORT="${PUERTO_EXPLICITO:-$DASHBOARD_PORT}"
185
+
186
+ # Iniciar dashboard en background con el puerto detectado
187
+ python "$CLI_PY" dashboard --port "$DASHBOARD_PORT" &
188
+ sleep 3
189
+ ```
190
+
191
+ Después de ejecutar el último comando, mostrar al usuario:
192
+ ```
193
+ Dashboard iniciando en http://localhost:<DASHBOARD_PORT>
194
+
195
+ Filtros disponibles:
196
+ • Rangos de tiempo: 7d, 30d, 90d, all
197
+ • Selección de modelos: checkboxes interactivos
198
+ • URLs bookmarkeables: ?range=7d&models=claude-sonnet-4-6
199
+
200
+ Presiona Ctrl+C en el terminal para detener el servidor.
201
+ ```
202
+
203
+ > El dashboard se auto-refresca cada 30 segundos. Para sesiones activas,
204
+ > los datos se sincronizan al detener la sesión (Stop hook).
205
+
206
+ ## Paso 3 — Si falla la ejecución
207
+
208
+ Si Python devuelve error al correr cli.py:
209
+
210
+ ```bash
211
+ cd "$VENDOR_DIR"
212
+ python "$CLI_PY" scan 2>&1
213
+ ```
214
+
215
+ Mostrar el error exacto y sugerir según el tipo:
216
+
217
+ | Error | Causa | Solución |
218
+ |-------|-------|----------|
219
+ | `No module named X` | cli.py es zero-dependencies; no debería ocurrir | Verifica integridad: `head -5 "$CLI_PY"` |
220
+ | `No such file ~/.claude/projects/` | Claude Code no ha creado sesiones aún | Inicia una sesión de trabajo normal primero |
221
+ | `PermissionError: [WinError 10013]` | Puerto reservado por Windows (Hyper-V, Docker, IIS) | El auto-detect de puertos debería evitarlo; si persiste: `python "$CLI_PY" dashboard --port 9999` |
222
+ | `No se encontró ningún puerto disponible` | Todos los puertos candidatos bloqueados | Especificar uno manualmente: `--port 9999` |
223
+
224
+ ## Datos que visualiza el dashboard
225
+
226
+ | Métrica | Descripción |
227
+ |---------|-------------|
228
+ | Daily token usage | Gráfico de barras apiladas: input / output / cache read / cache creation por día |
229
+ | By model | Doughnut: distribución de tokens por modelo (sonnet vs opus vs haiku) |
230
+ | Top projects | Barras horizontales: top 10 proyectos por consumo |
231
+ | Sessions table | Tabla con: sesión, proyecto, duración, modelo, turns, tokens, costo estimado |
232
+ | Model cost table | Desglose de costo total por modelo |
233
+
234
+ ## Dónde se almacenan los datos
235
+
236
+ - **Base de datos**: `~/.claude/usage.db` (SQLite, ~cero dependencias)
237
+ - **Fuente de datos**: `~/.claude/projects/**/*.jsonl` (logs de Claude Code)
238
+ - **Actualización**: al ejecutar `scan` o al inicio de cada subcomando
239
+
240
+ ## Subcomando: `guardrails`
241
+
242
+ Muestra en terminal las métricas de activación y bloqueo de los guardrails (hooks bloqueantes)
243
+ de la sesión actual. Los datos provienen de `hooks/lib/guardrail-metrics.js`.
244
+
245
+ ```bash
246
+ # Leer métricas de guardrails de la sesión actual desde /tmp/
247
+ SESSION_ID="${CLAUDE_SESSION_ID:-default}"
248
+ BRIDGE_FILE="/tmp/swl-guardrail-metrics-${SESSION_ID}.json"
249
+
250
+ if [ -f "$BRIDGE_FILE" ]; then
251
+ node -e "
252
+ const m = require('$BRIDGE_FILE');
253
+ const hooks = m.hooks || {};
254
+ const entries = Object.entries(hooks).sort(([,a],[,b]) => b.bloqueos - a.bloqueos);
255
+ if (entries.length === 0) {
256
+ console.log('Ningún guardrail se activó en esta sesión.');
257
+ } else {
258
+ console.log('\\nGuardrails — Activaciones de la sesión\\n');
259
+ console.log('Hook'.padEnd(30) + 'Activaciones'.padStart(13) + 'Bloqueos'.padStart(9) + 'Warnings'.padStart(9) + 'Tasa'.padStart(7));
260
+ console.log('-'.repeat(68));
261
+ for (const [nombre, datos] of entries) {
262
+ const tasa = datos.activaciones > 0 ? Math.round(datos.bloqueos / datos.activaciones * 100) + '%' : '0%';
263
+ console.log(nombre.replace('.js','').padEnd(30) + String(datos.activaciones).padStart(13) + String(datos.bloqueos).padStart(9) + String(datos.warnings).padStart(9) + tasa.padStart(7));
264
+ }
265
+ }
266
+ "
267
+ else
268
+ echo "Sin datos de guardrails para esta sesión. (bridge: $BRIDGE_FILE)"
269
+ echo "Los guardrails registran métricas cuando se activan durante la sesión."
270
+ fi
271
+ ```
272
+
273
+ Después de mostrar la tabla, ejecutar diagnóstico automático:
274
+
275
+ ```bash
276
+ node -e "
277
+ try {
278
+ const { getMetrics, diagnosticar } = require('./hooks/lib/guardrail-metrics');
279
+ const SESSION_ID = process.env.CLAUDE_SESSION_ID || 'default';
280
+ const metricas = getMetrics(SESSION_ID);
281
+ const advertencias = diagnosticar(metricas);
282
+ if (advertencias.length > 0) {
283
+ console.log('\\n⚠ Diagnóstico:');
284
+ advertencias.forEach(a => console.log(' - ' + a));
285
+ } else {
286
+ console.log('\\n✓ Guardrails sin anomalías detectadas.');
287
+ }
288
+ } catch(e) { console.log('(sin datos disponibles)'); }
289
+ "
290
+ ```
291
+
292
+ > El resumen de guardrails también aparece automáticamente al final de cada sesión
293
+ > (hook `resumen-sesion.js`) cuando hay advertencias de tasa anómala.
294
+
295
+ ## Estructura por widgets (v2, inspirado en mission-control)
296
+
297
+ El módulo `scripts/lib/dashboard-widgets.js` define un catálogo estructurado de 19 widgets
298
+ distribuidos en 7 categorías. Permite organizar la salida del dashboard por bloques
299
+ categorizados en lugar del bloque monolítico actual.
300
+
301
+ ### Categorías disponibles
302
+
303
+ | Categoría | Widgets incluidos | Modo |
304
+ |------------|-----------------------------------------------------------------|----------|
305
+ | health | health-score, health-row, health-componentes | offline |
306
+ | agentes | agentes-activos, agentes-top-uso, cadenas-delegacion | mixed |
307
+ | metricas | tokens-hoy, costo-hoy, costo-por-agente, costo-por-modelo | offline |
308
+ | evolucion | nudges-recientes, evoluciones-aplicadas, alertas-persistentes | offline |
309
+ | sesiones | sesiones-activas, sesiones-historial | offline |
310
+ | costos | costos-tendencia, costos-proyectos | offline |
311
+ | seguridad | security-posture, auditoria-reciente | online |
312
+
313
+ Modos: `offline` = funciona leyendo archivos locales; `online` = requiere conexión activa.
314
+
315
+ ### Uso básico
316
+
317
+ ```javascript
318
+ const { listarPorCategoria, listarPorModo, obtenerWidget, obtenerLayoutDefault } =
319
+ require('./scripts/lib/dashboard-widgets');
320
+
321
+ // Todos los widgets de salud disponibles sin conexión
322
+ const widgetsHealth = listarPorCategoria('health');
323
+
324
+ // Layout sugerido para sesión sin gateway
325
+ const layout = obtenerLayoutDefault('offline');
326
+
327
+ // Obtener un widget por ID
328
+ const w = obtenerWidget('health-score');
329
+ // → { id: 'health-score', label: 'Score de Salud', categoria: 'health', modos: ['offline'], tamanoDefault: 'sm', ... }
330
+ ```
331
+
332
+ ### Integración futura en la salida del comando
333
+
334
+ Al generar la salida de `/swl:dashboard`, iterar el layout default del modo detectado
335
+ y renderizar cada widget con su categoría como sección:
336
+
337
+ ```javascript
338
+ const layout = obtenerLayoutDefault('offline');
339
+ for (const id of layout) {
340
+ const widget = obtenerWidget(id);
341
+ // Renderizar sección: `## ${widget.categoria} / ${widget.label}`
342
+ }
343
+ ```
344
+
345
+ La integración real de datos por widget es responsabilidad del código de ejecución del
346
+ comando. El catálogo solo define la estructura — no accede a fuentes de datos.
347
+
348
+ ## Relación con otros componentes SWL
349
+
350
+ | Componente SWL | Scope | Complemento |
351
+ |---------------|-------|-------------|
352
+ | `tracking-costos.js` (hook) | Sesión actual, tiempo real | swl-dashboard añade histórico multi-sesión |
353
+ | `/swl:metricas` (comando) | Sesión actual | swl-dashboard añade visualización gráfica |
354
+ | `.planning/METRICAS.md` | Persistencia por proyecto | swl-dashboard agrega consulta SQL cross-project |
355
+ | `resumen-sesion.js` (hook) | Resumen inline al Stop | swl-dashboard añade análisis post-hoc detallado |
356
+ | `guardrail-metrics.js` (lib) | Sesión actual | swl-dashboard `guardrails` muestra activaciones/bloqueos por hook |
357
+
358
+ ## Cuándo NO cargar
359
+
360
+ - El usuario quiere ver métricas de la sesión activa actual — usar `/swl:metricas`; este skill procesa el historial persisitido en `~/.claude/projects/`, no el stream en tiempo real de la sesión.
361
+ - `claude-usage` no está instalado y el objetivo es diagnosticar la salud del sistema SWL — usar `/swl:salud`; no tiene sentido cargar este skill si la única acción posible sería indicar que hay que instalar la herramienta vendor.
362
+ - Se ejecuta en un entorno CI/headless o en un servidor remoto sin browser — los subcomandos `today` y `stats` funcionan en terminal, pero si el objetivo era el dashboard web interactivo, ese entorno no lo soporta.
363
+ - Se busca trazar el motivo de fallo de un agente específico — este skill visualiza consumo de tokens y costos; los detalles de error de agente están en `.planning/traces/` y se analizan con `tracing-processor`.
364
+
365
+ ## Gotchas / Errores comunes no obvios
366
+
367
+ - **`curl http://localhost:8080` devuelve 200 pero no es el dashboard**: el skill advierte explícitamente que el puerto 8080 suele estar ocupado por Postgres, IIS u otros servicios y puede devolver falso positivo. Causa: verificar disponibilidad en lugar de dejar que `cli.py` detecte el primer puerto libre. Solución: no verificar con `curl` — el flujo correcto es detectar el puerto libre con el script Python de socket binding del Paso 2 y reportar ese puerto al usuario; si el usuario abre ese puerto, verá el dashboard correcto.
368
+ - **`cd "$VENDOR_DIR"` omitido antes de `python "$CLI_PY"`**: el script falla con `ModuleNotFoundError` porque `scanner.py` y `dashboard.py` se importan con rutas relativas. Causa: ejecutar `python $CLI_PY` desde el directorio de trabajo del proyecto en lugar de desde el directorio del vendor. Solución: siempre `cd "$VENDOR_DIR"` antes de cualquier invocación de `cli.py` — es el requisito documentado en el Paso 2 del skill.
369
+ - **Base de datos vacía después de ejecutar el dashboard**: el dashboard muestra gráficos vacíos aunque hay sesiones en `~/.claude/projects/`. Causa: `scan` no se ejecutó antes del subcomando principal. Solución: ejecutar `python "$CLI_PY" scan 2>/dev/null` como paso previo a cualquier subcomando — `scan` es quien parsea los JSONL y puebla `~/.claude/usage.db`.
370
+ - **Fallback a `~/.claude` cuando el repo tiene su propio vendor**: el script busca `CLI_PY` en el directorio del proyecto primero; si no lo encuentra, busca en instalaciones globales. Si el usuario tiene una versión global más antigua que la del repo, el skill usa la versión incorrecta. Causa: el Paso 1 resuelve los 4 fallbacks en orden pero no verifica versiones. Solución: si el repo tiene `scripts/vendor/claude-usage/cli.py`, esa siempre tiene precedencia — verificar con `head -1 "$CLI_PY"` que la versión encontrada es la del repo.
@@ -0,0 +1,285 @@
1
+ ---
2
+ name: swl-markitdown
3
+ description: >
4
+ Convierte cualquier formato de documento a Markdown estructurado para su
5
+ consumo por agentes SWL. Soporta PDF, DOCX, XLSX, PPTX, Jupyter, EPUB,
6
+ ZIP, HTML, CSV, JSON, YouTube URLs y más. Wrapper sobre Microsoft MarkItDown
7
+ (AutoGen Team). Usar cuando el Read tool no soporta el formato del archivo.
8
+ Complementa WebFetch/agent-browser para URLs con contenido estructurado.
9
+ user-invocable: false
10
+ version: "1.0.0"
11
+ herramientasPermitidas: [Read, Bash, Glob, Grep, WebFetch]
12
+ evolved: false
13
+ fuente: "Microsoft AutoGen Team — markitdown v0.1.5 (2025)"
14
+ dependencias: "pip install markitdown[pdf,docx,pptx,xlsx]"
15
+ exclusiones:
16
+ - "No cargar para archivos .md, .txt o código fuente — el Read tool los soporta directamente y es más rápido sin el overhead de conversión."
17
+ - "No cargar para PDFs de ≤20 páginas sin tablas complejas — el Read tool con parámetro `pages:` es suficiente y no requiere la dependencia Python."
18
+ - "No cargar para URLs web genéricas sin contenido estructurado de documento — WebFetch es el camino correcto para HTML; swl-markitdown agrega valor cuando el HTML tiene estructura de documento (Wikipedia, documentación técnica con tablas)."
19
+ - "No cargar cuando el objetivo es buscar un patrón o string dentro de un archivo — Grep sobre el archivo original es más eficiente que convertir a Markdown primero."
20
+ evolvable: true # default para skill estandar
21
+ ---
22
+ # Skill: swl-markitdown
23
+
24
+ Proporciona conversión universal de documentos a Markdown para agentes SWL.
25
+ Es el puente entre archivos en formatos propietarios (DOCX, XLSX, PPTX, PDF)
26
+ y el contexto de los agentes que solo consumen texto Markdown.
27
+
28
+ ## Árbol de decisión: qué herramienta usar
29
+
30
+ | Fuente | Herramienta | Por qué |
31
+ |--------|-------------|---------|
32
+ | `.md`, `.txt` (local) | `Read` | Directo, sin overhead |
33
+ | `.pdf` ≤ 20 páginas (local) | `Read` con `pages:` | Read soporta PDFs nativamente |
34
+ | `.pdf` > 20 páginas o con tablas | **`swl-markitdown`** | Extrae tablas como Markdown |
35
+ | `.docx`, `.pptx` (local) | **`swl-markitdown`** | Read no soporta estos formatos |
36
+ | `.xlsx`, `.xls` (local) | **`swl-markitdown`** | Convierte hojas a tablas Markdown |
37
+ | `.ipynb` Jupyter (local) | **`swl-markitdown`** | Read devuelve JSON crudo |
38
+ | `.csv` (local) | `Read` o **`swl-markitdown`** | Ambos funcionan; MarkItDown da tabla formateada |
39
+ | URL estática (HTML simple) | `WebFetch` | Más rápido, sin overhead |
40
+ | URL dinámica (SPA, JS) | `agent-browser` | Renderiza JavaScript |
41
+ | URL de YouTube | **`swl-markitdown`** | Transcripción automática sin LLM |
42
+ | URL de Wikipedia | `WebFetch` o **`swl-markitdown`** | Ambos; MarkItDown da estructura más limpia |
43
+ | ZIP con documentos mixtos | **`swl-markitdown`** | Descomprime y convierte recursivamente |
44
+
45
+ ## Paso 0 — Verificar disponibilidad
46
+
47
+ ```bash
48
+ # Verificar que markitdown está instalado y funcional
49
+ CLI_PATH=$(git rev-parse --show-toplevel 2>/dev/null)/scripts/vendor/markitdown/cli.py
50
+ python "$CLI_PATH" --check 2>/dev/null | grep "Estado:" || echo "NO_DISPONIBLE"
51
+ ```
52
+
53
+ Si devuelve `NO_DISPONIBLE` o falta el cli.py:
54
+
55
+ ```bash
56
+ # Instalar markitdown con soporte para formatos principales
57
+ pip install markitdown[pdf,docx,pptx,xlsx]
58
+
59
+ # Verificar instalación
60
+ python "$CLI_PATH" --check
61
+ ```
62
+
63
+ Si pip no está disponible, reportar al usuario:
64
+ ```
65
+ swl-markitdown requiere Python 3.10+ y pip.
66
+ pip install markitdown[pdf,docx,pptx,xlsx]
67
+
68
+ El Read tool sigue disponible para .pdf (hasta 20 páginas), .txt y .md.
69
+ WebFetch y agent-browser siguen disponibles para URLs.
70
+ ```
71
+
72
+ ## Paso 1 — Conversión básica
73
+
74
+ ### Archivo local
75
+
76
+ ```bash
77
+ PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
78
+ CLI_PY="$PROJECT_ROOT/scripts/vendor/markitdown/cli.py"
79
+
80
+ # Convertir archivo a Markdown
81
+ OUTPUT=$(python "$CLI_PY" "/ruta/absoluta/al/archivo.docx" 2>/dev/null)
82
+
83
+ # Verificar que la conversión fue exitosa (output no vacío)
84
+ if [ -n "$OUTPUT" ]; then
85
+ echo "$OUTPUT"
86
+ else
87
+ echo "CONVERSION_FAILED — usar Read tool como fallback"
88
+ fi
89
+ ```
90
+
91
+ ### Guardar directamente a raw/ del wiki
92
+
93
+ ```bash
94
+ FECHA=$(date +%Y%m%d)
95
+ NOMBRE=$(basename "ARCHIVO_FUENTE" | sed 's/\.[^.]*$//' | sed 's/[^a-zA-Z0-9]/-/g' | cut -c1-50)
96
+ DESTINO="$PROJECT_ROOT/.planning/knowledge/raw/${FECHA}-${NOMBRE}.md"
97
+
98
+ python "$CLI_PY" "/ruta/al/archivo.docx" > "$DESTINO" 2>/dev/null && \
99
+ echo "Guardado: $DESTINO" || \
100
+ echo "Error de conversion"
101
+ ```
102
+
103
+ ### URL de YouTube (transcripción)
104
+
105
+ ```bash
106
+ # Requiere: pip install youtube-transcript-api
107
+ OUTPUT=$(python "$CLI_PY" "https://www.youtube.com/watch?v=VIDEO_ID" 2>/dev/null)
108
+ [ -n "$OUTPUT" ] && echo "$OUTPUT" | head -50
109
+ ```
110
+
111
+ ## Paso 2 — Patrones de uso frecuentes
112
+
113
+ ### Patrón A: Ingest masivo de documentación existente
114
+
115
+ ```bash
116
+ PROJECT_ROOT=$(git rev-parse --show-toplevel)
117
+ CLI_PY="$PROJECT_ROOT/scripts/vendor/markitdown/cli.py"
118
+ RAW_DIR="$PROJECT_ROOT/.planning/knowledge/raw"
119
+ mkdir -p "$RAW_DIR"
120
+
121
+ # Procesar todos los archivos Office en un directorio
122
+ for FILE in ./docs/**/*.{docx,pptx,xlsx,pdf}; do
123
+ [ -f "$FILE" ] || continue
124
+ FECHA=$(date +%Y%m%d)
125
+ NOMBRE=$(basename "$FILE" | sed 's/\.[^.]*$//' | sed 's/[^a-zA-Z0-9]/-/g' | cut -c1-50)
126
+ DESTINO="$RAW_DIR/${FECHA}-${NOMBRE}.md"
127
+
128
+ if python "$CLI_PY" "$FILE" > "$DESTINO" 2>/dev/null; then
129
+ echo "[OK] $FILE -> $DESTINO"
130
+ else
131
+ echo "[SKIP] $FILE — formato no soportado o dependencia faltante"
132
+ rm -f "$DESTINO"
133
+ fi
134
+ done
135
+ ```
136
+
137
+ ### Patrón B: Comparar con Read tool para PDFs
138
+
139
+ ```bash
140
+ # Para PDFs cortos (≤20 páginas): Read tool es más rápido
141
+ # Para PDFs largos o con tablas: swl-markitdown extrae mejor
142
+
143
+ CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
144
+ OUTPUT=$(python "$CLI_PY" "documento.pdf" 2>/dev/null)
145
+
146
+ # Verificar si hay tablas en el output (MarkItDown las extrae, Read no)
147
+ TIENE_TABLAS=$(echo "$OUTPUT" | grep -c "^|" || echo 0)
148
+ echo "Tablas detectadas: $TIENE_TABLAS"
149
+ ```
150
+
151
+ ### Patrón C: Preprocesamiento antes de invocar agente
152
+
153
+ ```bash
154
+ # Convertir spec de requisitos DOCX a Markdown antes de pasarlo al planificador
155
+ CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
156
+
157
+ SPEC_MD=$(python "$CLI_PY" "requisitos/spec-v2.docx" 2>/dev/null)
158
+ if [ -z "$SPEC_MD" ]; then
159
+ echo "ERROR: no se pudo convertir spec-v2.docx"
160
+ exit 1
161
+ fi
162
+
163
+ # Guardar en .planning/ para que planificador-swl lo lea
164
+ echo "$SPEC_MD" > .planning/SPEC.md
165
+ echo "Spec convertida a .planning/SPEC.md — invocar planificador-swl"
166
+ ```
167
+
168
+ ### Patrón D: Notebook Jupyter para investigador-swl
169
+
170
+ ```bash
171
+ # Jupyter notebooks contienen código, outputs y análisis mezclados
172
+ # swl-markitdown los convierte preservando celdas de código y markdown
173
+
174
+ CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
175
+ OUTPUT=$(python "$CLI_PY" "analisis/experimento.ipynb" 2>/dev/null)
176
+
177
+ # El output incluye:
178
+ # - Celdas markdown como texto normal
179
+ # - Celdas de código en bloques ```python
180
+ # - Outputs de celdas si están guardados en el notebook
181
+ echo "$OUTPUT" | head -100
182
+ ```
183
+
184
+ ## Paso 3 — Manejo de errores
185
+
186
+ | Código de salida | Causa | Acción |
187
+ |-----------------|-------|--------|
188
+ | `0` | Conversión exitosa | Usar el output |
189
+ | `1` | Formato no soportado | Intentar WebFetch o Read |
190
+ | `2` | Dependencia faltante | `pip install markitdown[<formato>]` |
191
+ | `3` | Error de conversión (archivo corrupto) | Reportar al usuario |
192
+ | `4` | Archivo no encontrado | Verificar la ruta |
193
+
194
+ ```bash
195
+ CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
196
+ python "$CLI_PY" "archivo.docx" > output.md 2>error.log
197
+ EXIT_CODE=$?
198
+
199
+ case $EXIT_CODE in
200
+ 0) echo "OK — Markdown en output.md" ;;
201
+ 1) echo "Formato no soportado — usar alternativa" ;;
202
+ 2) cat error.log; echo "Instalar dependencia y reintentar" ;;
203
+ 3) cat error.log; echo "Archivo probablemente corrupto" ;;
204
+ 4) echo "Archivo no encontrado — verificar ruta" ;;
205
+ esac
206
+ ```
207
+
208
+ ## Paso 4 — Formatos soportados
209
+
210
+ ```bash
211
+ # Ver todos los formatos con el estado de dependencias actual
212
+ python "$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py" --formats
213
+ ```
214
+
215
+ ### Formatos siempre disponibles (sin dependencias extra)
216
+
217
+ | Formato | Extensión | Notas |
218
+ |---------|-----------|-------|
219
+ | HTML | `.html` `.htm` | Conversión completa con BeautifulSoup |
220
+ | Texto plano | `.txt` `.md` `.markdown` | Pass-through con detección de charset |
221
+ | CSV | `.csv` | Convertido a tabla Markdown |
222
+ | JSON | `.json` | Formateado estructuralmente |
223
+ | XML / RSS / Atom | `.xml` `.rss` `.atom` | Feeds formateados |
224
+ | ZIP | `.zip` | Descomprime y convierte todo el contenido |
225
+ | EPUB | `.epub` | Libros electrónicos |
226
+ | Jupyter | `.ipynb` | Celdas código + markdown |
227
+ | Wikipedia URLs | `wikipedia.org/*` | Extracción de contenido principal |
228
+
229
+ ### Formatos con dependencias opcionales
230
+
231
+ | Formato | Dependencia | Instalar |
232
+ |---------|-------------|---------|
233
+ | PDF | `pdfminer.six`, `pdfplumber` | `pip install markitdown[pdf]` |
234
+ | Word (.docx) | `mammoth`, `lxml` | `pip install markitdown[docx]` |
235
+ | Excel (.xlsx) | `pandas`, `openpyxl` | `pip install markitdown[xlsx]` |
236
+ | Excel (.xls) | `pandas`, `xlrd` | `pip install markitdown[xls]` |
237
+ | PowerPoint (.pptx) | `python-pptx` | `pip install markitdown[pptx]` |
238
+ | YouTube | `youtube-transcript-api` | `pip install markitdown[youtube-transcription]` |
239
+
240
+ ## Qué NO usar de MarkItDown en swl-ses
241
+
242
+ - **Azure Document Intelligence** — dependencia de nube, costo por página, conflicto con filosofía local-first
243
+ - **Audio transcription** (SpeechRecognition) — sin caso de uso en swl-ses
244
+ - **LLM Vision para imágenes** — Claude ya es multimodal; duplicidad
245
+ - **markitdown-ocr plugin** — requiere GPT-4o explícito; Claude lo haría en el contexto actual
246
+
247
+ ## Integración con /swl:wiki
248
+
249
+ El skill es transparente para `/swl:wiki ingest`: cuando se detecta un formato
250
+ no-Markdown, el comando invoca `swl-markitdown` automáticamente antes de ingerir.
251
+
252
+ ```bash
253
+ # El Paso I.1 del ingest decide la herramienta según extensión:
254
+ # .md .txt → Read tool
255
+ # .pdf .docx .xlsx .pptx .ipynb .epub .zip → swl-markitdown
256
+ # http:// https:// → WebFetch, con agent-browser como fallback
257
+ ```
258
+
259
+ ## Señales de que swl-markitdown completó correctamente
260
+
261
+ - Output tiene >100 palabras de contenido real (no solo metadatos)
262
+ - No hay mensajes de error en stderr
263
+ - El código de salida es 0
264
+ - El contenido tiene estructura Markdown (encabezados, tablas o listas)
265
+
266
+ ## Señales de problema
267
+
268
+ - Output vacío con código 1 → el formato no está registrado (revisar extensión)
269
+ - Output vacío con código 2 → `pip install markitdown[<formato>]`
270
+ - Output solo de metadatos → el archivo puede estar protegido con contraseña
271
+ - Caracteres extraños → el archivo usa encoding no-UTF8; MarkItDown lo maneja internamente
272
+
273
+ ## Cuándo NO cargar
274
+
275
+ - El archivo es `.md`, `.txt`, código fuente o cualquier texto plano — el Read tool lo lee directamente sin overhead de conversión ni dependencia Python.
276
+ - El archivo es un PDF de ≤20 páginas sin tablas complejas — el Read tool con `pages:` es suficiente; swl-markitdown agrega valor principalmente para tablas que Read no puede extraer estructuradamente.
277
+ - Se quiere acceder al contenido de una URL web genérica — WebFetch es el camino; swl-markitdown en URLs solo vale cuando son páginas con estructura de documento (Wikipedia, docs técnicas con tablas).
278
+ - El objetivo es encontrar un patrón específico dentro del documento — Grep sobre el archivo original es más directo que convertir a Markdown primero para luego buscar en el resultado.
279
+
280
+ ## Gotchas / Errores comunes no obvios
281
+
282
+ - **`python "$CLI_PY" archivo.docx` ejecutado sin `cd "$VENDOR_DIR"` previo**: el script falla con `ImportError` porque los módulos auxiliares se importan con rutas relativas al directorio del vendor. Causa: ejecutar el CLI desde el directorio de trabajo del proyecto en lugar del vendor. Solución: siempre ejecutar `CLI_PY` como `cd "$VENDOR_DIR" && python "$CLI_PY" <ruta-absoluta-al-archivo>` — la ruta del archivo debe ser absoluta para que no sea relativa al vendor.
283
+ - **PDF con contraseña devuelve output vacío con código 0**: el agente asume que la conversión fue exitosa y pasa texto vacío al siguiente paso. Causa: algunos PDFs protegidos devuelven salida vacía sin código de error. Solución: verificar que el output tiene más de 100 palabras de contenido real (la sección "Señales de que swl-markitdown completó correctamente" lo documenta) antes de usar el output.
284
+ - **Excel (.xls) no convertido aunque markitdown[xlsx] está instalado**: el agente instala `markitdown[xlsx]` pero `.xls` requiere `xlrd` además de `openpyxl`. Causa: la tabla de dependencias del skill muestra extensiones diferentes para `.xlsx` y `.xls`. Solución: para `.xls` instalar `markitdown[xls]` (incluye `xlrd`), no `markitdown[xlsx]` — son extras distintos.
285
+ - **Ingest masivo con `for FILE in ./docs/**/*.docx` falla en bash sin globstar**: el globbing `**` no expande recursivamente en bash por defecto. Causa: `globstar` no está habilitado. Solución: usar `find ./docs -name "*.docx" -type f` en lugar de `**` glob, o habilitar explícitamente `shopt -s globstar` antes del loop — el Patrón A del skill usa `**` pero no activa globstar.