@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,316 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * execution-state.js — Estado de ejecución serializable para planes multi-agente.
5
+ *
6
+ * Inspirado en el patrón ExecutionSnapshot de Sim Studio (simstudioai/sim).
7
+ * Permite pausar y reanudar planes multi-agente con estado preciso,
8
+ * eliminando la reconstrucción de contexto a partir de texto libre.
9
+ *
10
+ * Archivo producido: .planning/execution-state.json
11
+ *
12
+ * Estructura del estado:
13
+ * {
14
+ * planId: string — identificador del plan activo
15
+ * fase: string — nombre de la fase actual
16
+ * timestamp: string — ISO 8601 de la última actualización
17
+ * agentesEjecutados: AgentEntry[]
18
+ * agenteActual: AgentRef | null
19
+ * proximoAgente: AgentRef | null
20
+ * contextoCompartido: SharedContext
21
+ * metadatos: { sessionId, cwd }
22
+ * }
23
+ *
24
+ * Uso desde el orquestador o skill ejecutar-fase:
25
+ * const es = require('./lib/execution-state');
26
+ * es.iniciarAgente(cwd, 'implementador-swl', 'api-endpoints');
27
+ * // ... esperar output del agente ...
28
+ * es.completarAgente(cwd, 'implementador-swl', 'api-endpoints', { archivos: ['src/api.py'] });
29
+ * es.establecerProximo(cwd, 'tdd-qa-swl', 'tests-unitarios');
30
+ *
31
+ * @module hooks/lib/execution-state
32
+ */
33
+
34
+ const fs = require('fs');
35
+ const path = require('path');
36
+
37
+ const { atomicWriteJSON } = require('./atomic-write');
38
+
39
+ // ---------------------------------------------------------------------------
40
+ // Constantes
41
+ // ---------------------------------------------------------------------------
42
+
43
+ const NOMBRE_ARCHIVO = 'execution-state.json';
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // Fábrica de estado vacío
47
+ // ---------------------------------------------------------------------------
48
+
49
+ /**
50
+ * Crea un estado de ejecución nuevo y vacío.
51
+ *
52
+ * @param {string} [planId='plan-sin-nombre'] — Identificador del plan
53
+ * @param {string} [fase='sin-fase'] — Nombre de la fase
54
+ * @returns {object}
55
+ */
56
+ function nuevo(planId = 'plan-sin-nombre', fase = 'sin-fase') {
57
+ return {
58
+ planId,
59
+ fase,
60
+ timestamp: new Date().toISOString(),
61
+ agentesEjecutados: [],
62
+ agenteActual: null,
63
+ proximoAgente: null,
64
+ contextoCompartido: {
65
+ archivosModificados: [],
66
+ testsStatus: 'desconocido',
67
+ decisiones: [],
68
+ erroresDetectados: [],
69
+ },
70
+ metadatos: {
71
+ sessionId: '',
72
+ cwd: '',
73
+ },
74
+ };
75
+ }
76
+
77
+ // ---------------------------------------------------------------------------
78
+ // I/O — Lectura y escritura atómica
79
+ // ---------------------------------------------------------------------------
80
+
81
+ /**
82
+ * Devuelve la ruta absoluta del archivo de estado para el directorio dado.
83
+ *
84
+ * @param {string} cwd — Directorio raíz del proyecto.
85
+ * @returns {string}
86
+ */
87
+ function rutaArchivo(cwd) {
88
+ return path.join(cwd, '.planning', NOMBRE_ARCHIVO);
89
+ }
90
+
91
+ /**
92
+ * Lee el estado de ejecución del disco.
93
+ * Si el archivo no existe o está corrupto, devuelve un estado vacío.
94
+ *
95
+ * @param {string} cwd — Directorio raíz del proyecto.
96
+ * @returns {object}
97
+ */
98
+ function leer(cwd) {
99
+ try {
100
+ const ruta = rutaArchivo(cwd);
101
+ if (!fs.existsSync(ruta)) return nuevo();
102
+ const raw = fs.readFileSync(ruta, 'utf8');
103
+ const parsed = JSON.parse(raw);
104
+ // Garantizar campos opcionales (compatibilidad con versiones previas del archivo)
105
+ parsed.agentesEjecutados = parsed.agentesEjecutados || [];
106
+ parsed.contextoCompartido = parsed.contextoCompartido || {
107
+ archivosModificados: [],
108
+ testsStatus: 'desconocido',
109
+ decisiones: [],
110
+ erroresDetectados: [],
111
+ };
112
+ parsed.metadatos = parsed.metadatos || { sessionId: '', cwd: '' };
113
+ return parsed;
114
+ } catch (_) {
115
+ return nuevo();
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Persiste el estado en disco de forma atómica.
121
+ *
122
+ * @param {string} cwd — Directorio raíz del proyecto.
123
+ * @param {object} estado — Estado a persistir.
124
+ */
125
+ function escribir(cwd, estado) {
126
+ estado.timestamp = new Date().toISOString();
127
+ atomicWriteJSON(rutaArchivo(cwd), estado);
128
+ }
129
+
130
+ // ---------------------------------------------------------------------------
131
+ // Mutaciones — API de alto nivel
132
+ // ---------------------------------------------------------------------------
133
+
134
+ /**
135
+ * Marca un agente como actualmente en ejecución (agenteActual).
136
+ * No bloquea; solo registra el estado para auditoría y resumption.
137
+ *
138
+ * @param {string} cwd
139
+ * @param {string} agente — Nombre del agente (ej: "implementador-swl")
140
+ * @param {string} slice — Nombre del slice que ejecuta (ej: "api-endpoints")
141
+ * @param {object} [opts] — { sessionId, cwd: rutaProyecto }
142
+ */
143
+ function iniciarAgente(cwd, agente, slice, opts = {}) {
144
+ const estado = leer(cwd);
145
+ estado.agenteActual = { agente, slice, iniciadoEn: new Date().toISOString() };
146
+ if (opts.sessionId) estado.metadatos.sessionId = opts.sessionId;
147
+ if (opts.cwd) estado.metadatos.cwd = opts.cwd;
148
+ escribir(cwd, estado);
149
+ }
150
+
151
+ /**
152
+ * Marca el agente actual como completado y lo agrega a agentesEjecutados.
153
+ * Es idempotente: si el agente/slice ya existe, reemplaza la entrada.
154
+ *
155
+ * @param {string} cwd
156
+ * @param {string} agente — Nombre del agente
157
+ * @param {string} slice — Nombre del slice completado
158
+ * @param {object} [outputResumen={}] — Resumen libre del output (max ~500 chars)
159
+ * @param {object} [opts]
160
+ * @param {number} [opts.duracionMs] — Duración en ms
161
+ * @param {number} [opts.tokensEst] — Tokens estimados consumidos
162
+ */
163
+ function completarAgente(cwd, agente, slice, outputResumen = {}, opts = {}) {
164
+ const estado = leer(cwd);
165
+
166
+ const entrada = {
167
+ agente,
168
+ slice,
169
+ status: 'done',
170
+ outputResumen,
171
+ duracionMs: opts.duracionMs || 0,
172
+ tokensEst: opts.tokensEst || 0,
173
+ completadoEn: new Date().toISOString(),
174
+ };
175
+
176
+ // Idempotente: reemplaza si ya existe
177
+ const idx = estado.agentesEjecutados.findIndex(a => a.agente === agente && a.slice === slice);
178
+ if (idx >= 0) {
179
+ estado.agentesEjecutados[idx] = entrada;
180
+ } else {
181
+ estado.agentesEjecutados.push(entrada);
182
+ }
183
+
184
+ // Limpiar agenteActual si coincide
185
+ if (estado.agenteActual?.agente === agente && estado.agenteActual?.slice === slice) {
186
+ estado.agenteActual = null;
187
+ }
188
+
189
+ escribir(cwd, estado);
190
+ }
191
+
192
+ /**
193
+ * Registra el próximo agente a ejecutar en el plan.
194
+ *
195
+ * @param {string} cwd
196
+ * @param {string} agente — Nombre del agente
197
+ * @param {string} slice — Nombre del slice
198
+ */
199
+ function establecerProximo(cwd, agente, slice) {
200
+ const estado = leer(cwd);
201
+ estado.proximoAgente = { agente, slice };
202
+ escribir(cwd, estado);
203
+ }
204
+
205
+ /**
206
+ * Actualiza el contexto compartido entre agentes con merge (no reemplaza).
207
+ * Los arrays se deduplicam automáticamente.
208
+ *
209
+ * @param {string} cwd
210
+ * @param {object} delta — Campos a fusionar en contextoCompartido
211
+ */
212
+ function actualizarContexto(cwd, delta) {
213
+ const estado = leer(cwd);
214
+ const ctx = estado.contextoCompartido;
215
+
216
+ // Arrays — merge con deduplicación
217
+ if (Array.isArray(delta.archivosModificados)) {
218
+ const s = new Set(ctx.archivosModificados);
219
+ for (const f of delta.archivosModificados) s.add(f);
220
+ ctx.archivosModificados = [...s];
221
+ }
222
+ if (Array.isArray(delta.decisiones)) {
223
+ const s = new Set(ctx.decisiones);
224
+ for (const d of delta.decisiones) s.add(d);
225
+ ctx.decisiones = [...s];
226
+ }
227
+ if (Array.isArray(delta.erroresDetectados)) {
228
+ ctx.erroresDetectados = [...(ctx.erroresDetectados || []), ...delta.erroresDetectados];
229
+ }
230
+
231
+ // Escalares directos
232
+ if (delta.testsStatus !== undefined) ctx.testsStatus = delta.testsStatus;
233
+
234
+ // Campos extra (extensible)
235
+ for (const [k, v] of Object.entries(delta)) {
236
+ if (!['archivosModificados', 'decisiones', 'erroresDetectados', 'testsStatus'].includes(k)) {
237
+ ctx[k] = v;
238
+ }
239
+ }
240
+
241
+ estado.contextoCompartido = ctx;
242
+ escribir(cwd, estado);
243
+ }
244
+
245
+ /**
246
+ * Elimina el archivo de estado (al completar un plan o al iniciar uno nuevo).
247
+ *
248
+ * @param {string} cwd
249
+ */
250
+ function limpiar(cwd) {
251
+ try {
252
+ const ruta = rutaArchivo(cwd);
253
+ if (fs.existsSync(ruta)) fs.unlinkSync(ruta);
254
+ } catch (_) {}
255
+ }
256
+
257
+ /**
258
+ * Genera un resumen textual del estado para incluir en prompts o en continue-here.md.
259
+ *
260
+ * @param {string} cwd
261
+ * @returns {string}
262
+ */
263
+ function formatearResumen(cwd) {
264
+ const estado = leer(cwd);
265
+ const { planId, fase, agentesEjecutados, proximoAgente, agenteActual, contextoCompartido } = estado;
266
+
267
+ if (!agentesEjecutados.length && !agenteActual && !proximoAgente) {
268
+ return '(sin estado de ejecución activo)';
269
+ }
270
+
271
+ const lineas = [
272
+ `Plan: ${planId} — Fase: ${fase}`,
273
+ '',
274
+ 'Agentes completados:',
275
+ ...(agentesEjecutados.length
276
+ ? agentesEjecutados.map(a => ` ✓ ${a.agente} / ${a.slice}`)
277
+ : [' (ninguno)']),
278
+ ];
279
+
280
+ if (agenteActual) {
281
+ lineas.push(` ⟳ ${agenteActual.agente} / ${agenteActual.slice} (en progreso)`);
282
+ }
283
+ if (proximoAgente) {
284
+ lineas.push(` → ${proximoAgente.agente} / ${proximoAgente.slice} (próximo)`);
285
+ }
286
+
287
+ const ctx = contextoCompartido || {};
288
+ if (ctx.archivosModificados?.length) {
289
+ lineas.push('', `Archivos modificados: ${ctx.archivosModificados.join(', ')}`);
290
+ }
291
+ if (ctx.decisiones?.length) {
292
+ lineas.push(`Decisiones: ${ctx.decisiones.join(' | ')}`);
293
+ }
294
+ if (ctx.testsStatus && ctx.testsStatus !== 'desconocido') {
295
+ lineas.push(`Tests: ${ctx.testsStatus}`);
296
+ }
297
+
298
+ return lineas.join('\n');
299
+ }
300
+
301
+ // ---------------------------------------------------------------------------
302
+ // Exports
303
+ // ---------------------------------------------------------------------------
304
+
305
+ module.exports = {
306
+ nuevo,
307
+ leer,
308
+ escribir,
309
+ iniciarAgente,
310
+ completarAgente,
311
+ establecerProximo,
312
+ actualizarContexto,
313
+ limpiar,
314
+ formatearResumen,
315
+ rutaArchivo,
316
+ };
@@ -0,0 +1,135 @@
1
+ /**
2
+ * fingerprint-id.js — Deduplicación de contenido por hash
3
+ *
4
+ * Genera IDs deterministas basados en el contenido para detectar duplicados.
5
+ * Inspirado en el patrón fingerprintId de agentmemory.
6
+ * Zero dependencias externas — usa crypto nativo de Node.js.
7
+ *
8
+ * Uso:
9
+ * const { fingerprintId, isDuplicate, generateId } = require('./fingerprint-id');
10
+ * const id = fingerprintId('mem', 'contenido a deduplicar');
11
+ * // → "mem_a1b2c3d4e5f6g7h8"
12
+ */
13
+
14
+ 'use strict';
15
+
16
+ const crypto = require('crypto');
17
+
18
+ /**
19
+ * Genera un ID determinista basado en el contenido (content-addressable).
20
+ * El mismo contenido siempre produce el mismo ID.
21
+ *
22
+ * @param {string} prefix - Prefijo para el ID (ej: 'mem', 'obs', 'learn')
23
+ * @param {string} content - Contenido a hashear
24
+ * @param {number} [length=16] - Longitud del hash truncado (max 64)
25
+ * @returns {string} ID en formato "prefix_hash"
26
+ */
27
+ function fingerprintId(prefix, content, length) {
28
+ const len = Math.min(Math.max(length || 16, 4), 64);
29
+ const hash = crypto
30
+ .createHash('sha256')
31
+ .update(content, 'utf8')
32
+ .digest('hex')
33
+ .slice(0, len);
34
+ return prefix + '_' + hash;
35
+ }
36
+
37
+ /**
38
+ * Genera un ID único temporal (no determinista).
39
+ * Combina timestamp en base36 + bytes aleatorios.
40
+ *
41
+ * @param {string} prefix - Prefijo para el ID
42
+ * @returns {string} ID en formato "prefix_timestamp36_random"
43
+ */
44
+ function generateId(prefix) {
45
+ const ts = Date.now().toString(36);
46
+ const rand = crypto.randomBytes(6).toString('hex');
47
+ return prefix + '_' + ts + '_' + rand;
48
+ }
49
+
50
+ /**
51
+ * Verifica si un contenido ya existe en un conjunto de fingerprints.
52
+ *
53
+ * @param {string} content - Contenido a verificar
54
+ * @param {Set<string>|Map<string,*>|Object} knownFingerprints - Conjunto de IDs conocidos
55
+ * @param {string} [prefix='dup'] - Prefijo para generar el fingerprint
56
+ * @returns {{ duplicate: boolean, id: string }} Resultado con el ID generado
57
+ */
58
+ function isDuplicate(content, knownFingerprints, prefix) {
59
+ const id = fingerprintId(prefix || 'dup', content);
60
+
61
+ let exists = false;
62
+ if (knownFingerprints instanceof Set) {
63
+ exists = knownFingerprints.has(id);
64
+ } else if (knownFingerprints instanceof Map) {
65
+ exists = knownFingerprints.has(id);
66
+ } else if (typeof knownFingerprints === 'object' && knownFingerprints !== null) {
67
+ exists = Object.prototype.hasOwnProperty.call(knownFingerprints, id);
68
+ }
69
+
70
+ return { duplicate: exists, id };
71
+ }
72
+
73
+ /**
74
+ * Calcula similitud Jaccard entre dos textos (tokenizados por palabras).
75
+ * Útil para detectar contenido casi-duplicado cuando el hash exacto no coincide.
76
+ *
77
+ * @param {string} textA - Primer texto
78
+ * @param {string} textB - Segundo texto
79
+ * @returns {number} Similitud entre 0.0 y 1.0
80
+ */
81
+ function jaccardSimilarity(textA, textB) {
82
+ const tokenize = (text) => new Set(
83
+ text.toLowerCase().split(/\s+/).filter(Boolean)
84
+ );
85
+ const setA = tokenize(textA);
86
+ const setB = tokenize(textB);
87
+
88
+ if (setA.size === 0 && setB.size === 0) return 1.0;
89
+ if (setA.size === 0 || setB.size === 0) return 0.0;
90
+
91
+ let intersection = 0;
92
+ for (const token of setA) {
93
+ if (setB.has(token)) intersection++;
94
+ }
95
+
96
+ const union = setA.size + setB.size - intersection;
97
+ return union === 0 ? 0.0 : intersection / union;
98
+ }
99
+
100
+ /**
101
+ * Detecta si un contenido es casi-duplicado de alguno existente.
102
+ * Usa similitud Jaccard con umbral configurable (default: 0.7).
103
+ *
104
+ * @param {string} content - Contenido nuevo a verificar
105
+ * @param {string[]} existingContents - Lista de contenidos existentes
106
+ * @param {number} [threshold=0.7] - Umbral de similitud (0.0-1.0)
107
+ * @returns {{ nearDuplicate: boolean, bestMatch: number, similarity: number }}
108
+ */
109
+ function isNearDuplicate(content, existingContents, threshold) {
110
+ const thr = typeof threshold === 'number' ? threshold : 0.7;
111
+ let bestMatch = -1;
112
+ let bestSimilarity = 0;
113
+
114
+ for (let i = 0; i < existingContents.length; i++) {
115
+ const sim = jaccardSimilarity(content, existingContents[i]);
116
+ if (sim > bestSimilarity) {
117
+ bestSimilarity = sim;
118
+ bestMatch = i;
119
+ }
120
+ }
121
+
122
+ return {
123
+ nearDuplicate: bestSimilarity >= thr,
124
+ bestMatch,
125
+ similarity: Math.round(bestSimilarity * 1000) / 1000
126
+ };
127
+ }
128
+
129
+ module.exports = {
130
+ fingerprintId,
131
+ generateId,
132
+ isDuplicate,
133
+ jaccardSimilarity,
134
+ isNearDuplicate
135
+ };
@@ -0,0 +1,116 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Gateway Notify — Helper para encolar notificaciones al gateway multi-plataforma.
5
+ *
6
+ * Escribe un archivo JSON en .planning/comms/ que el GatewayRunner consume
7
+ * mediante polling (ver gateway/index.js _pollComms). Zero-deps, escritura
8
+ * atómica, opt-in por configuración en manifiestos/gateway-config.json.
9
+ *
10
+ * Uso:
11
+ * const { notificarGateway } = require('./lib/gateway-notify');
12
+ * notificarGateway({ tipo: 'session-stop', titulo: 'Sesión terminada', texto: '...' });
13
+ *
14
+ * No bloquea ni lanza: si el gateway está deshabilitado o no hay comms dir,
15
+ * retorna silenciosamente.
16
+ *
17
+ * @module hooks/lib/gateway-notify
18
+ */
19
+
20
+ const fs = require('fs');
21
+ const path = require('path');
22
+ const { atomicWriteJSON } = require('./atomic-write');
23
+
24
+ const COMMS_DIR = '.planning/comms';
25
+ const CONFIG_PATH = 'manifiestos/gateway-config.json';
26
+
27
+ /**
28
+ * Verifica si el gateway está habilitado en configuración.
29
+ * @returns {boolean}
30
+ */
31
+ function gatewayHabilitado() {
32
+ try {
33
+ const cfgPath = path.join(process.cwd(), CONFIG_PATH);
34
+ if (!fs.existsSync(cfgPath)) return false;
35
+ const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
36
+ return cfg && cfg.enabled === true;
37
+ } catch (_) {
38
+ return false;
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Verifica si un tipo de notificación está habilitado.
44
+ * Lee el mapa notifications de gateway-config.json.
45
+ * @param {string} tipo - session-stop, checkpoint, error, release, build-fail
46
+ * @returns {boolean}
47
+ */
48
+ function tipoHabilitado(tipo) {
49
+ try {
50
+ const cfgPath = path.join(process.cwd(), CONFIG_PATH);
51
+ if (!fs.existsSync(cfgPath)) return true;
52
+ const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
53
+ const map = cfg.notifications || {};
54
+ const claves = {
55
+ 'session-stop': 'onSessionComplete',
56
+ 'checkpoint': 'onCheckpoint',
57
+ 'error': 'onError',
58
+ 'release': 'onRelease',
59
+ 'build-fail': 'onBuildFail',
60
+ };
61
+ const clave = claves[tipo];
62
+ if (!clave) return true;
63
+ return map[clave] !== false;
64
+ } catch (_) {
65
+ return true;
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Encola una notificación para el gateway.
71
+ * No bloquea ni lanza. Retorna true si se encoló, false si fue descartada.
72
+ *
73
+ * @param {object} params
74
+ * @param {string} params.tipo - session-stop, checkpoint, error, release, build-fail, custom
75
+ * @param {string} [params.titulo] - Título corto.
76
+ * @param {string} [params.texto] - Texto del mensaje (soporta Markdown).
77
+ * @param {string} [params.to='all'] - Destino: 'all', 'telegram', 'discord', etc.
78
+ * @param {object} [params.payload] - Payload adicional para el adaptador.
79
+ * @returns {boolean}
80
+ */
81
+ function notificarGateway(params) {
82
+ try {
83
+ if (!gatewayHabilitado()) return false;
84
+ if (!tipoHabilitado(params.tipo)) return false;
85
+
86
+ const commsDir = path.join(process.cwd(), COMMS_DIR);
87
+ if (!fs.existsSync(commsDir)) {
88
+ fs.mkdirSync(commsDir, { recursive: true });
89
+ }
90
+
91
+ const id = `msg-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
92
+ const msg = {
93
+ id,
94
+ type: 'gateway_notification',
95
+ from: 'swl-system',
96
+ to: params.to || 'all',
97
+ payload: {
98
+ tipo: params.tipo,
99
+ titulo: params.titulo || '',
100
+ texto: params.texto || '',
101
+ ...(params.payload || {}),
102
+ },
103
+ text: params.texto || '',
104
+ timestamp: new Date().toISOString(),
105
+ status: 'pending',
106
+ };
107
+
108
+ const filePath = path.join(commsDir, `${id}.json`);
109
+ atomicWriteJSON(filePath, msg);
110
+ return true;
111
+ } catch (_) {
112
+ return false;
113
+ }
114
+ }
115
+
116
+ module.exports = { notificarGateway, gatewayHabilitado, tipoHabilitado };
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * graph-security.js — Utilidades de seguridad para el grafo de dependencias SWL.
6
+ *
7
+ * Portado desde graphify-3/graphify/security.py (validate_graph_path, sanitize_label).
8
+ * Zero-dependencies: solo módulos nativos de Node.js.
9
+ *
10
+ * API:
11
+ * validateGraphPath(filePath, allowedRoot) → resolvedPath (string) | throws Error
12
+ * sanitizeLabel(text, maxLen?) → string
13
+ *
14
+ * @module hooks/lib/graph-security
15
+ */
16
+
17
+ const path = require('path');
18
+ const fs = require('fs');
19
+
20
+ const MAX_LABEL_LEN = 256;
21
+ const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/g;
22
+
23
+ // ---------------------------------------------------------------------------
24
+ // Path validation
25
+ // ---------------------------------------------------------------------------
26
+
27
+ /**
28
+ * Resuelve `filePath` y verifica que permanezca dentro de `allowedRoot`.
29
+ * Previene path traversal cuando se leen archivos del grafo desde fuentes externas.
30
+ *
31
+ * @param {string} filePath - Ruta a validar (absoluta o relativa)
32
+ * @param {string} allowedRoot - Directorio raíz permitido (ej: process.cwd())
33
+ * @returns {string} Ruta resuelta y validada
34
+ * @throws {Error} Si la ruta escapa del directorio permitido o no existe
35
+ */
36
+ function validateGraphPath(filePath, allowedRoot) {
37
+ const root = path.resolve(allowedRoot);
38
+ const resolved = path.resolve(filePath);
39
+
40
+ if (!resolved.startsWith(root + path.sep) && resolved !== root) {
41
+ throw new Error(
42
+ `[graph-security] Ruta "${filePath}" escapa del directorio permitido "${root}". ` +
43
+ 'Solo rutas dentro del proyecto están permitidas.'
44
+ );
45
+ }
46
+
47
+ if (!fs.existsSync(resolved)) {
48
+ throw new Error(`[graph-security] Ruta no encontrada: "${resolved}"`);
49
+ }
50
+
51
+ return resolved;
52
+ }
53
+
54
+ // ---------------------------------------------------------------------------
55
+ // Label sanitisation
56
+ // ---------------------------------------------------------------------------
57
+
58
+ /**
59
+ * Elimina caracteres de control y limita longitud del texto.
60
+ * Seguro para embeber en JSON y texto plano.
61
+ *
62
+ * @param {string} text
63
+ * @param {number} [maxLen=256]
64
+ * @returns {string}
65
+ */
66
+ function sanitizeLabel(text, maxLen = MAX_LABEL_LEN) {
67
+ const clean = String(text).replace(CONTROL_CHAR_RE, '');
68
+ return clean.length > maxLen ? clean.slice(0, maxLen) : clean;
69
+ }
70
+
71
+ // ---------------------------------------------------------------------------
72
+ // Exports
73
+ // ---------------------------------------------------------------------------
74
+
75
+ module.exports = { validateGraphPath, sanitizeLabel };