@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,170 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://swl-ses.dev/schemas/skill-frontmatter.json",
4
+ "title": "SWL Skill Frontmatter",
5
+ "description": "Schema de validacion para el frontmatter YAML de skills del sistema SWL",
6
+ "type": "object",
7
+ "required": ["name", "description"],
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "pattern": "^[a-z][a-z0-9-]+$",
12
+ "maxLength": 64,
13
+ "description": "Nombre en kebab-case que coincide con el directorio"
14
+ },
15
+ "description": {
16
+ "type": "string",
17
+ "minLength": 20,
18
+ "maxLength": 1024,
19
+ "description": "Descripcion que incluye QUE hace y CUANDO cargarla"
20
+ },
21
+ "version": {
22
+ "type": "string",
23
+ "pattern": "^\\d+\\.\\d+\\.\\d+$"
24
+ },
25
+ "provenance": {
26
+ "type": "object",
27
+ "description": "Campo legacy. Equivalente espanol: 'procedencia'. Si ambos presentes deben coincidir (W010).",
28
+ "properties": {
29
+ "origin": {
30
+ "type": "string",
31
+ "enum": ["manual", "auto-evolution", "imported", "community"]
32
+ },
33
+ "created_at": {
34
+ "type": "string",
35
+ "format": "date"
36
+ },
37
+ "confidence": {
38
+ "type": "number",
39
+ "minimum": 0,
40
+ "maximum": 1
41
+ },
42
+ "author": {
43
+ "type": "string"
44
+ }
45
+ }
46
+ },
47
+ "procedencia": {
48
+ "type": "object",
49
+ "description": "Alias en espanol de 'provenance'. Campo propio de swl-ses. Si ambos presentes, deben coincidir (W010).",
50
+ "properties": {
51
+ "origin": {
52
+ "type": "string",
53
+ "enum": ["manual", "auto-evolution", "imported", "community"]
54
+ },
55
+ "created_at": {
56
+ "type": "string",
57
+ "format": "date"
58
+ },
59
+ "confidence": {
60
+ "type": "number",
61
+ "minimum": 0,
62
+ "maximum": 1
63
+ },
64
+ "author": {
65
+ "type": "string"
66
+ }
67
+ }
68
+ },
69
+ "targets": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "string",
73
+ "enum": ["claude", "openclaude", "copilot", "opencode", "codex", "gemini"]
74
+ },
75
+ "description": "Campo legacy. Equivalente espanol: 'destinos'. Runtimes a los que se sincroniza este skill. Patron adoptado de skillshare (targets.yaml). Si ambos presentes deben coincidir (W010)."
76
+ },
77
+ "destinos": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "string",
81
+ "enum": ["claude", "openclaude", "copilot", "opencode", "codex", "gemini"]
82
+ },
83
+ "description": "Alias en espanol de 'targets'. Campo propio de swl-ses. Runtimes a los que se sincroniza este skill."
84
+ },
85
+ "user-invocable": {
86
+ "type": "boolean",
87
+ "description": "Si el usuario puede invocar este skill directamente con Skill(nombre)"
88
+ },
89
+ "license": {
90
+ "type": "string",
91
+ "description": "Licencia del skill si es externo o adaptado"
92
+ },
93
+ "evolvable": {
94
+ "type": "boolean",
95
+ "description": "Campo legacy. Equivalente espanol: 'evolucionable'. Marca AGP learnability. Si false, el loop de auto-evolucion NO debe proponer cambios a este skill. Recomendado: false para skills criticos. Si ambos presentes deben coincidir (W010)."
96
+ },
97
+ "evolucionable": {
98
+ "type": "boolean",
99
+ "description": "Alias en espanol de 'evolvable'. Campo propio de swl-ses. Marca AGP learnability. Si false, el loop de auto-evolucion NO propone cambios a este skill."
100
+ },
101
+ "evolvable_scope": {
102
+ "type": "array",
103
+ "items": {
104
+ "type": "string",
105
+ "enum": ["description", "content", "examples", "references", "anti-patterns"]
106
+ },
107
+ "description": "Campo legacy. Equivalente espanol: 'evolucionable_alcance'. Si evolvable=true, limita las secciones del SKILL.md que pueden modificarse. Ausente implica 'content' y 'examples' unicamente. Si ambos presentes deben coincidir (W010)."
108
+ },
109
+ "evolucionable_alcance": {
110
+ "type": "array",
111
+ "items": {
112
+ "type": "string",
113
+ "enum": ["description", "content", "examples", "references", "anti-patterns"]
114
+ },
115
+ "description": "Alias en espanol de 'evolvable_scope'. Campo propio de swl-ses. Si evolucionable=true, limita las secciones modificables."
116
+ },
117
+ "when_to_use": {
118
+ "type": "string",
119
+ "maxLength": 512,
120
+ "description": "Campo del protocolo Anthropic. Contexto adicional sobre cuando activar la skill, leido por Claude Code como bloque combinado con description (total max 1536 chars). Usar cuando description ocupa mas de 900 chars y aun hay triggers que no caben."
121
+ },
122
+ "exclusiones": {
123
+ "type": "array",
124
+ "items": { "type": "string" },
125
+ "description": "Situaciones donde esta skill NO debe activarse aunque parezca relevante superficialmente. Campo propio de swl-ses; previene skill hijacking por similitud de terminos. Equivalente estructural de la seccion 'Cuando NO cargar' en el cuerpo de SKILL.md, legible por herramientas de analisis sin parsear markdown."
126
+ },
127
+ "allowed-tools": {
128
+ "type": "array",
129
+ "items": {
130
+ "type": "string",
131
+ "enum": ["Read", "Write", "Edit", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"]
132
+ },
133
+ "description": "Campo del protocolo Anthropic. Pre-aprobacion de UX leida por Claude Code. NO es restriccion de seguridad real. Las restricciones reales provienen de permission rules en .claude/settings.json o del matcher en hooks."
134
+ },
135
+ "herramientasPermitidas": {
136
+ "type": "array",
137
+ "items": {
138
+ "type": "string",
139
+ "enum": ["Read", "Write", "Edit", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"]
140
+ },
141
+ "description": "Campo propio de swl-ses. Alias semantico de allowed-tools, usado por las herramientas internas (evaluar-skill, validadores). Debe coincidir con allowed-tools cuando ambos estan presentes. Si divergen, el validador emite W011. Para skills nuevos en swl-ses, declarar solo este campo; una herramienta de sincronizacion propagara el valor a allowed-tools al construir artefactos para Claude Code."
142
+ },
143
+ "nist_csf": {
144
+ "type": "array",
145
+ "items": { "type": "string", "pattern": "^(GV|ID|PR|DE|RS|RC)\\.[A-Z]{2}(-[0-9]{2})?$" },
146
+ "description": "Campo propio de swl-ses. Mapeo a NIST Cybersecurity Framework 2.0. Cada entrada es un ID de subcategoria tipo 'GV.SC-07', 'PR.PS-01', 'DE.CM-01'. Opcional. Usado para reportes de cobertura en /swl:salud y /swl:dashboard. Referencia: https://www.nist.gov/cyberframework"
147
+ },
148
+ "nist_ai_rmf": {
149
+ "type": "array",
150
+ "items": { "type": "string", "pattern": "^(GOVERN|MAP|MEASURE|MANAGE)(-[0-9]+(\\.[0-9]+)?)?$" },
151
+ "description": "Campo propio de swl-ses. Mapeo a NIST AI Risk Management Framework 1.0. Cada entrada es un ID de subcategoria tipo 'GOVERN-1.1', 'MAP-5.1', 'MEASURE-2.7'. Opcional. Particularmente relevante para skills de seguridad de sistemas agenticos. Referencia: https://airc.nist.gov/AI_RMF"
152
+ },
153
+ "atlas_techniques": {
154
+ "type": "array",
155
+ "items": { "type": "string", "pattern": "^AML\\.T[0-9]{4}(\\.[0-9]{3})?$" },
156
+ "description": "Campo propio de swl-ses. Mapeo a MITRE ATLAS v5.4 (Adversarial Threat Landscape for AI Systems). Cada entrada es una tecnica tipo 'AML.T0051' (LLM Prompt Injection), 'AML.T0080' (AI Agent Context Poisoning). Opcional. Critico para skills que protegen el sistema agentico mismo. Referencia: https://atlas.mitre.org"
157
+ },
158
+ "attack_techniques": {
159
+ "type": "array",
160
+ "items": { "type": "string", "pattern": "^T[0-9]{4}(\\.[0-9]{3})?$" },
161
+ "description": "Campo propio de swl-ses. Mapeo a MITRE ATT&CK v18. Cada entrada es una tecnica tipo 'T1071' (Application Layer Protocol), 'T1190' (Exploit Public-Facing Application). Opcional. Mas aplicable a skills de defensa de infraestructura o deteccion de amenazas en el sistema desplegado. Referencia: https://attack.mitre.org"
162
+ },
163
+ "d3fend_techniques": {
164
+ "type": "array",
165
+ "items": { "type": "string", "pattern": "^D3-[A-Z]+$" },
166
+ "description": "Campo propio de swl-ses. Mapeo a MITRE D3FEND v1.3 (Defensive countermeasures). Cada entrada es una tecnica tipo 'D3-NTA' (Network Traffic Analysis), 'D3-PSA' (Process Spawn Analysis). Opcional. Referencia: https://d3fend.mitre.org"
167
+ }
168
+ },
169
+ "additionalProperties": true
170
+ }
@@ -0,0 +1,145 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * swl-ses update
5
+ * Actualiza componentes instalados preservando _userland/.
6
+ * Interactivo: muestra versiones, pide confirmación, muestra progreso.
7
+ * No-interactivo con --force o sin TTY.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const { detectarRuntimes } = require('./lib/detectar-runtime');
13
+ const { cargarEstado } = require('./lib/estado');
14
+ const {
15
+ color, icono, encabezado, formatearPaso, formatearAdvertencia,
16
+ spinner, preguntarSiNo, lineaSeparadora, ES_TTY,
17
+ } = require('./lib/ui');
18
+ const { versionRemotaParalela } = require('./lib/npm-version');
19
+
20
+ const VERSION_LOCAL = require('../package.json').version;
21
+
22
+ /**
23
+ * Consulta la versión más reciente publicada en npm. Si la consulta falla
24
+ * (sin red, timeout), retorna la versión local como fallback razonable.
25
+ */
26
+ async function obtenerVersionRemota() {
27
+ const r = await versionRemotaParalela({ timeoutMs: 10000 });
28
+ return r.version || VERSION_LOCAL;
29
+ }
30
+
31
+ async function update(opciones) {
32
+ const force = opciones.force || !ES_TTY;
33
+
34
+ // Obtener la versión más reciente del registro npm
35
+ const VERSION = await obtenerVersionRemota();
36
+
37
+ console.log(encabezado('swl-ses update', VERSION_LOCAL));
38
+
39
+ // 1. Detectar runtimes
40
+ const runtimes = detectarRuntimes();
41
+
42
+ if (runtimes.length === 0) {
43
+ console.log(formatearAdvertencia('Runtimes', 'No se detectaron runtimes con instalación SWL'));
44
+ console.log(`\n Ejecuta primero: npx @saulwade/swl-ses@latest install --target claude`);
45
+ process.exit(1);
46
+ }
47
+
48
+ let actualizados = 0;
49
+ let omitidos = 0;
50
+
51
+ // 2. Iterar runtimes
52
+ for (const runtime of runtimes) {
53
+ const dirs = [runtime.global, path.resolve(runtime.local)];
54
+ for (const dir of dirs) {
55
+ if (!fs.existsSync(dir)) continue;
56
+
57
+ const estado = cargarEstado(dir);
58
+ if (!estado) continue;
59
+
60
+ const versionInstalada = estado.versionSistema || 'desconocida';
61
+ const esGlobal = dir === runtime.global;
62
+ const ubicacion = esGlobal ? 'global' : 'proyecto';
63
+
64
+ const necesitaActualizar = versionInstalada !== VERSION;
65
+ const paqueteDesactualizado = VERSION_LOCAL !== VERSION;
66
+
67
+ console.log(` ${color.negrita(`Runtime: ${runtime.nombre}`)} ${color.dim(`(${ubicacion})`)}`);
68
+ console.log(` Versión instalada: ${necesitaActualizar ? color.amarillo(versionInstalada) : color.verde(versionInstalada)}`);
69
+ console.log(` Versión disponible: ${color.verde(VERSION)}${paqueteDesactualizado ? color.dim(` (ejecutando con v${VERSION_LOCAL})`) : ''}`);
70
+ console.log(` Perfil: ${estado.perfil}`);
71
+ console.log(` Componentes: ${estado.componentesInstalados.length}`);
72
+ console.log(` Archivos: ${estado.archivosInstalados.length}`);
73
+ console.log('');
74
+
75
+ // Si la versión disponible es más reciente pero el paquete ejecutándose es viejo,
76
+ // indicar al usuario que use @latest
77
+ if (paqueteDesactualizado && necesitaActualizar) {
78
+ console.log(formatearAdvertencia(runtime.nombre,
79
+ `Este paquete es v${VERSION_LOCAL} pero la v${VERSION} está disponible.\n` +
80
+ ` Para actualizar, ejecuta: npx @saulwade/swl-ses@latest update --force`));
81
+ console.log('');
82
+ omitidos++;
83
+ continue;
84
+ }
85
+
86
+ // Verificar si ya está actualizado
87
+ if (!necesitaActualizar && !force) {
88
+ console.log(formatearPaso(runtime.nombre, 'Ya está en la versión más reciente'));
89
+ console.log('');
90
+ omitidos++;
91
+ continue;
92
+ }
93
+
94
+ // Confirmar
95
+ if (!force) {
96
+ const confirmar = await preguntarSiNo(
97
+ !necesitaActualizar
98
+ ? `¿Re-instalar ${runtime.nombre} v${VERSION}?`
99
+ : `¿Actualizar ${runtime.nombre} de ${versionInstalada} a ${VERSION}?`
100
+ );
101
+ console.log('');
102
+
103
+ if (!confirmar) {
104
+ console.log(formatearAdvertencia(runtime.nombre, 'Actualización cancelada por el usuario'));
105
+ console.log('');
106
+ omitidos++;
107
+ continue;
108
+ }
109
+ }
110
+
111
+ // Ejecutar actualización con spinner
112
+ const sp = spinner(`Actualizando ${runtime.nombre}...`);
113
+
114
+ try {
115
+ const instalador = require('./instalador');
116
+ await instalador({
117
+ target: runtime.id,
118
+ profile: estado.perfil,
119
+ global: estado.global,
120
+ force: true,
121
+ });
122
+
123
+ sp.exito(`${runtime.nombre} actualizado a v${VERSION} (${estado.archivosInstalados.length} archivos)`);
124
+ actualizados++;
125
+ } catch (err) {
126
+ sp.fallo(`Error actualizando ${runtime.nombre}: ${err.message}`);
127
+ }
128
+
129
+ console.log('');
130
+ }
131
+ }
132
+
133
+ // 3. Reporte final
134
+ console.log(` ${lineaSeparadora()}`);
135
+ if (actualizados > 0) {
136
+ console.log(formatearPaso('Resultado', `${actualizados} runtime(s) actualizado(s)${omitidos > 0 ? `, ${omitidos} omitido(s)` : ''}`));
137
+ } else if (omitidos > 0) {
138
+ console.log(formatearPaso('Resultado', 'Todo está actualizado'));
139
+ } else {
140
+ console.log(formatearAdvertencia('Resultado', 'Ningún runtime fue actualizado'));
141
+ }
142
+ console.log('');
143
+ }
144
+
145
+ module.exports = update;
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bash
2
+ # scripts/audit-skills.sh — Auditoría opt-in de skills usando snyk-agent-scan.
3
+ #
4
+ # Analiza el directorio habilidades/ buscando: prompt injection, secretos
5
+ # hardcodeados, URLs sospechosas y estructura inválida de SKILL.md.
6
+ #
7
+ # Opt-in: solo ejecuta si SWL_AUDIT_SKILLS=1.
8
+ # Sin la variable, imprime instrucciones y sale con código 0 (no rompe /swl:salud).
9
+ #
10
+ # Uso:
11
+ # SWL_AUDIT_SKILLS=1 bash scripts/audit-skills.sh
12
+ #
13
+ # Requisito: pip install uv (o pipx install uv)
14
+
15
+ set -euo pipefail
16
+
17
+ PREFIX="[audit-skills]"
18
+
19
+ # ---------------------------------------------------------------------------
20
+ # Guard de opt-in
21
+ # ---------------------------------------------------------------------------
22
+
23
+ if [ -z "${SWL_AUDIT_SKILLS:-}" ]; then
24
+ echo "$PREFIX Auditoría de skills deshabilitada (opt-in)."
25
+ echo "$PREFIX Para activar: SWL_AUDIT_SKILLS=1 bash scripts/audit-skills.sh"
26
+ echo "$PREFIX Requiere: pip install uv"
27
+ exit 0
28
+ fi
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # Verificar disponibilidad de uvx / uv
32
+ # ---------------------------------------------------------------------------
33
+
34
+ if command -v uvx >/dev/null 2>&1; then
35
+ RUNNER="uvx"
36
+ elif command -v uv >/dev/null 2>&1; then
37
+ RUNNER="uv run"
38
+ else
39
+ echo "$PREFIX uvx/uv no disponible."
40
+ echo "$PREFIX Instalar con: pip install uv (o: pipx install uv)"
41
+ echo "$PREFIX La auditoría de skills no se ejecutó — continúa sin error."
42
+ exit 0
43
+ fi
44
+
45
+ # ---------------------------------------------------------------------------
46
+ # Detectar directorio de habilidades
47
+ # ---------------------------------------------------------------------------
48
+
49
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
50
+ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
51
+ SKILLS_DIR="$REPO_ROOT/habilidades"
52
+
53
+ if [ ! -d "$SKILLS_DIR" ]; then
54
+ echo "$PREFIX Directorio habilidades/ no encontrado en $REPO_ROOT"
55
+ echo "$PREFIX La auditoría de skills no se ejecutó — continúa sin error."
56
+ exit 0
57
+ fi
58
+
59
+ echo "$PREFIX Iniciando auditoría de skills en $SKILLS_DIR ..."
60
+ echo "$PREFIX Runner: $RUNNER"
61
+
62
+ # ---------------------------------------------------------------------------
63
+ # Ejecutar snyk-agent-scan inspect
64
+ # ---------------------------------------------------------------------------
65
+
66
+ if ! $RUNNER snyk-agent-scan@latest inspect --skills "$SKILLS_DIR" 2>&1; then
67
+ echo ""
68
+ echo "$PREFIX El comando snyk-agent-scan terminó con error o no está publicado."
69
+ echo "$PREFIX Posibles causas:"
70
+ echo "$PREFIX - El paquete 'snyk-agent-scan' no está disponible en PyPI."
71
+ echo "$PREFIX - Fallo de red durante la descarga."
72
+ echo "$PREFIX - La versión @latest no es compatible con el runtime actual."
73
+ echo "$PREFIX La auditoría de skills no se completó — continúa sin error."
74
+ exit 0
75
+ fi
76
+
77
+ echo ""
78
+ echo "$PREFIX Auditoría completada."
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * scripts/auditar-agentes-gaps.js
6
+ * Audita los agentes de agentes/ y detecta gaps SAP-Agents: Exclusion Clause
7
+ * y Gotchas.
8
+ *
9
+ * Hereda el diseno de scripts/auditar-skills-gaps.js adaptado al dominio de
10
+ * agentes (archivos agentes/X.md en lugar de habilidades/X/SKILL.md).
11
+ *
12
+ * Zero-deps. Salida: JSON por stdout + resumen por stderr.
13
+ *
14
+ * Uso:
15
+ * node scripts/auditar-agentes-gaps.js # JSON a stdout
16
+ * node scripts/auditar-agentes-gaps.js --resumen # tabla a stderr
17
+ * node scripts/auditar-agentes-gaps.js --save # persiste en .planning/
18
+ * node scripts/auditar-agentes-gaps.js --incluir-excepciones
19
+ *
20
+ * Referencia: .planning/knowledge/outputs/propuesta-sap-agents-2026-04-20.md
21
+ * ADR relacionado: ADR-0004.
22
+ */
23
+
24
+ var fs = require('fs');
25
+ var path = require('path');
26
+
27
+ var RAIZ_AGENTES = path.resolve(__dirname, '..', 'agentes');
28
+ var DESTINO_PLANNING = path.resolve(
29
+ __dirname, '..', '.planning', 'evolucion', 'audit-agentes-gaps.json'
30
+ );
31
+
32
+ // Patrones - soportan LF y CRLF (Windows).
33
+ var PATRON_EXCLUSION_CUERPO = /cuando no|cu\u00e1ndo no|no cargar|no invocar|no usar|NO se debe/i;
34
+ var PATRON_GOTCHAS = /gotcha|errores comunes|trampas|errores no obvios|fallas conocidas/i;
35
+ var PATRON_FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---/;
36
+
37
+ var EXCEPCIONES_DOCUMENTADAS = Object.freeze({});
38
+
39
+ function listarAgentes() {
40
+ if (!fs.existsSync(RAIZ_AGENTES)) return [];
41
+ return fs.readdirSync(RAIZ_AGENTES, { withFileTypes: true })
42
+ .filter(function (f) { return f.isFile() && f.name.endsWith('.md'); })
43
+ .map(function (f) { return f.name.replace(/\.md$/, ''); });
44
+ }
45
+
46
+ function leerAgente(nombre) {
47
+ var ruta = path.join(RAIZ_AGENTES, nombre + '.md');
48
+ if (!fs.existsSync(ruta)) return null;
49
+ var contenido = fs.readFileSync(ruta, 'utf8');
50
+ var fmMatch = contenido.match(PATRON_FRONTMATTER);
51
+ var frontmatterRaw = fmMatch ? fmMatch[1] : '';
52
+ var cuerpo = fmMatch ? contenido.slice(fmMatch[0].length) : contenido;
53
+ return { ruta: ruta, contenido: contenido, frontmatterRaw: frontmatterRaw, cuerpo: cuerpo };
54
+ }
55
+
56
+ function detectarGaps(agente) {
57
+ var gaps = [];
58
+ var tieneExclusionFm = /^exclusiones:\s*\[?[^\]]*\]?/im.test(agente.frontmatterRaw);
59
+ var tieneExclusionCuerpo = PATRON_EXCLUSION_CUERPO.test(agente.cuerpo);
60
+ if (!tieneExclusionFm && !tieneExclusionCuerpo) gaps.push('sin-exclusion');
61
+ if (!PATRON_GOTCHAS.test(agente.cuerpo)) gaps.push('sin-gotchas');
62
+ return gaps;
63
+ }
64
+
65
+ function clasificarGaps(nombre, gaps) {
66
+ var excepcion = EXCEPCIONES_DOCUMENTADAS[nombre];
67
+ if (!excepcion) return { reales: gaps, excusados: [] };
68
+ var excusadosSet = new Set(excepcion.gaps_excusados);
69
+ var reales = gaps.filter(function (g) { return !excusadosSet.has(g); });
70
+ var excusados = gaps.filter(function (g) { return excusadosSet.has(g); });
71
+ return { reales: reales, excusados: excusados, adr: excepcion.adr, razon: excepcion.razon };
72
+ }
73
+
74
+ function auditar(opts) {
75
+ opts = opts || {};
76
+ var incluirExcepciones = opts.incluirExcepciones === true;
77
+ var agentes = listarAgentes();
78
+ var resultado = {
79
+ timestamp: new Date().toISOString(),
80
+ total_agentes: agentes.length,
81
+ agentes_con_gaps: [],
82
+ excepciones_documentadas: [],
83
+ resumen: { sin_exclusion: 0, sin_gotchas: 0, excepciones_activas: 0 }
84
+ };
85
+
86
+ for (var i = 0; i < agentes.length; i++) {
87
+ var nombre = agentes[i];
88
+ var agente = leerAgente(nombre);
89
+ if (!agente) continue;
90
+ var gaps = detectarGaps(agente);
91
+ if (gaps.length === 0) continue;
92
+ var clasif = clasificarGaps(nombre, gaps);
93
+ if (clasif.reales.length > 0) {
94
+ resultado.agentes_con_gaps.push({ nombre: nombre, gaps: clasif.reales });
95
+ if (clasif.reales.indexOf('sin-exclusion') !== -1) resultado.resumen.sin_exclusion++;
96
+ if (clasif.reales.indexOf('sin-gotchas') !== -1) resultado.resumen.sin_gotchas++;
97
+ }
98
+ if (clasif.excusados.length > 0) {
99
+ resultado.excepciones_documentadas.push({
100
+ nombre: nombre, gaps_excusados: clasif.excusados, adr: clasif.adr, razon: clasif.razon
101
+ });
102
+ resultado.resumen.excepciones_activas++;
103
+ if (incluirExcepciones) {
104
+ if (clasif.excusados.indexOf('sin-exclusion') !== -1) resultado.resumen.sin_exclusion++;
105
+ if (clasif.excusados.indexOf('sin-gotchas') !== -1) resultado.resumen.sin_gotchas++;
106
+ }
107
+ }
108
+ }
109
+ return resultado;
110
+ }
111
+
112
+ function pct(n, total) {
113
+ if (total <= 0) return '0.0';
114
+ return ((n / total) * 100).toFixed(1);
115
+ }
116
+
117
+ function imprimirResumen(r) {
118
+ var total = r.total_agentes;
119
+ var conGaps = r.agentes_con_gaps.length;
120
+ process.stderr.write('\nAuditoria SAP-Agents - ' + total + ' agentes - ' + r.timestamp + '\n');
121
+ process.stderr.write(' Sin Exclusion Clause: ' + r.resumen.sin_exclusion + '/' + total + ' (' + pct(r.resumen.sin_exclusion, total) + '%)\n');
122
+ process.stderr.write(' Sin Gotchas: ' + r.resumen.sin_gotchas + '/' + total + ' (' + pct(r.resumen.sin_gotchas, total) + '%)\n');
123
+ process.stderr.write(' Agentes con >=1 gap: ' + conGaps + '/' + total + '\n');
124
+ if (r.resumen.excepciones_activas > 0) {
125
+ process.stderr.write(' Excepciones documentadas: ' + r.resumen.excepciones_activas + '\n');
126
+ for (var i = 0; i < r.excepciones_documentadas.length; i++) {
127
+ var e = r.excepciones_documentadas[i];
128
+ process.stderr.write(' - ' + e.nombre + ': ' + e.gaps_excusados.join(', ') + ' [' + e.adr + ']\n');
129
+ }
130
+ }
131
+ process.stderr.write('\n');
132
+ }
133
+
134
+ var argv = process.argv.slice(2);
135
+ var opts = { incluirExcepciones: argv.indexOf('--incluir-excepciones') !== -1 };
136
+ var resultado = auditar(opts);
137
+
138
+ if (argv.indexOf('--resumen') !== -1) {
139
+ imprimirResumen(resultado);
140
+ } else if (argv.indexOf('--save') !== -1) {
141
+ var dir = path.dirname(DESTINO_PLANNING);
142
+ fs.mkdirSync(dir, { recursive: true });
143
+ fs.writeFileSync(DESTINO_PLANNING, JSON.stringify(resultado, null, 2), 'utf8');
144
+ imprimirResumen(resultado);
145
+ process.stderr.write('Inventario persistido en: ' + DESTINO_PLANNING + '\n');
146
+ } else {
147
+ process.stdout.write(JSON.stringify(resultado, null, 2));
148
+ imprimirResumen(resultado);
149
+ }