@hasna/skills 0.1.26 → 0.1.29

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 (491) hide show
  1. package/LICENSE +1 -10
  2. package/README.md +141 -39
  3. package/bin/index.js +30122 -27575
  4. package/bin/mcp.js +22112 -18593
  5. package/dist/cli/cli.test-utils.d.ts +15 -0
  6. package/dist/cli/commands/auth.d.ts +2 -0
  7. package/dist/cli/commands/install.d.ts +1 -1
  8. package/dist/cli/commands/runtime-mcp.d.ts +4 -0
  9. package/dist/index.d.ts +9 -4
  10. package/dist/index.js +11607 -597
  11. package/dist/lib/auth-store.d.ts +13 -0
  12. package/dist/lib/installer.d.ts +58 -55
  13. package/dist/lib/mcp-contracts.d.ts +86 -0
  14. package/dist/lib/project-state.d.ts +43 -0
  15. package/dist/lib/registry-data/business-marketing.d.ts +2 -0
  16. package/dist/lib/registry-data/communication.d.ts +2 -0
  17. package/dist/lib/registry-data/content-generation.d.ts +2 -0
  18. package/dist/lib/registry-data/data-analysis.d.ts +2 -0
  19. package/dist/lib/registry-data/design-branding.d.ts +2 -0
  20. package/dist/lib/registry-data/development-tools.d.ts +2 -0
  21. package/dist/lib/registry-data/education-learning.d.ts +2 -0
  22. package/dist/lib/registry-data/event-management.d.ts +2 -0
  23. package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
  24. package/dist/lib/registry-data/health-wellness.d.ts +2 -0
  25. package/dist/lib/registry-data/index.d.ts +2 -0
  26. package/dist/lib/registry-data/media-processing.d.ts +2 -0
  27. package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
  28. package/dist/lib/registry-data/project-management.d.ts +2 -0
  29. package/dist/lib/registry-data/research-writing.d.ts +2 -0
  30. package/dist/lib/registry-data/science-academic.d.ts +2 -0
  31. package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
  32. package/dist/lib/registry-data/web-browser.d.ts +2 -0
  33. package/dist/lib/registry-types.d.ts +27 -0
  34. package/dist/lib/registry.d.ts +6 -18
  35. package/dist/lib/remote-registry.d.ts +3 -0
  36. package/dist/lib/run-state.d.ts +60 -0
  37. package/dist/lib/skill-aliases.d.ts +17 -0
  38. package/dist/lib/skillinfo.d.ts +5 -1
  39. package/dist/mcp/discovery-tools.d.ts +2 -0
  40. package/dist/mcp/helpers.d.ts +26 -0
  41. package/dist/mcp/http.d.ts +10 -0
  42. package/dist/mcp/index.d.ts +3 -2
  43. package/dist/mcp/operation-tools.d.ts +2 -0
  44. package/dist/mcp/resource-meta-tools.d.ts +2 -0
  45. package/dist/mcp/schedule-tools.d.ts +2 -0
  46. package/dist/mcp/server.d.ts +4 -0
  47. package/dist/types/api.d.ts +7 -4
  48. package/package.json +23 -10
  49. package/skills/_common/http-client.ts +1 -1
  50. package/skills/_common/index.ts +2 -3
  51. package/skills/_common/install.sh +5 -110
  52. package/skills/_common/installer.ts +31 -282
  53. package/skills/_common/skill-install.ts +14 -181
  54. package/skills/ad-creative-pack/SKILL.md +45 -0
  55. package/skills/ad-creative-pack/package.json +14 -0
  56. package/skills/advanced-math/package.json +3 -1
  57. package/skills/advanced-math/src/calculators.ts +118 -0
  58. package/skills/advanced-math/src/cli.ts +130 -0
  59. package/skills/advanced-math/src/conversion.ts +90 -0
  60. package/skills/advanced-math/src/finance.ts +75 -0
  61. package/skills/advanced-math/src/formatting.ts +95 -0
  62. package/skills/advanced-math/src/index.ts +24 -702
  63. package/skills/advanced-math/src/runtime.ts +49 -0
  64. package/skills/advanced-math/src/symbolic.ts +110 -0
  65. package/skills/advanced-math/src/types.ts +36 -0
  66. package/skills/analyze-data/SKILL.md +2 -2
  67. package/skills/analyze-data/src/analysis.ts +401 -0
  68. package/skills/analyze-data/src/cli.ts +66 -0
  69. package/skills/analyze-data/src/formatters.ts +235 -0
  70. package/skills/analyze-data/src/index.ts +6 -1027
  71. package/skills/analyze-data/src/logger.ts +36 -0
  72. package/skills/analyze-data/src/parsers.ts +57 -0
  73. package/skills/analyze-data/src/stats.ts +151 -0
  74. package/skills/analyze-data/src/types.ts +85 -0
  75. package/skills/api-docs-portal/SKILL.md +46 -0
  76. package/skills/api-docs-portal/package.json +9 -0
  77. package/skills/api-test-suite/src/index.ts +13 -0
  78. package/skills/apidocs/package.json +1 -1
  79. package/skills/apidocs/src/index.ts +3 -0
  80. package/skills/audio/package.json +2 -3
  81. package/skills/audio-cleanup-lab/SKILL.md +2 -2
  82. package/skills/audio-extract/CLAUDE.md +1 -1
  83. package/skills/audio-transcript-pack/SKILL.md +43 -0
  84. package/skills/audio-transcript-pack/package.json +10 -0
  85. package/skills/blog-article/CLAUDE.md +12 -0
  86. package/skills/blog-article/SKILL.md +45 -0
  87. package/skills/{create-blog-article → blog-article}/package.json +3 -3
  88. package/skills/brand-kit/SKILL.md +45 -0
  89. package/skills/brand-kit/package.json +14 -0
  90. package/skills/brand-photo-shoot/SKILL.md +28 -0
  91. package/skills/brand-photo-shoot/package.json +10 -0
  92. package/skills/brand-style-guide/SKILL.md +2 -2
  93. package/skills/brand-style-guide/src/index.ts +0 -0
  94. package/skills/budget-variance-analyzer/SKILL.md +2 -2
  95. package/skills/businessactivity/package.json +1 -1
  96. package/skills/businessactivity/src/index.ts +3 -0
  97. package/skills/calendar-events/src/ai-parser.ts +103 -0
  98. package/skills/calendar-events/src/api.ts +157 -0
  99. package/skills/calendar-events/src/auth.ts +22 -0
  100. package/skills/calendar-events/src/config.ts +6 -0
  101. package/skills/calendar-events/src/format.ts +96 -0
  102. package/skills/calendar-events/src/help.ts +54 -0
  103. package/skills/calendar-events/src/index.ts +21 -524
  104. package/skills/calendar-events/src/logger.ts +34 -0
  105. package/skills/calendar-events/src/types.ts +67 -0
  106. package/skills/compress-video/SKILL.md +2 -2
  107. package/skills/consolelog/package.json +1 -1
  108. package/skills/consolelog/src/index.ts +3 -0
  109. package/skills/contract-review-report/SKILL.md +43 -0
  110. package/skills/contract-review-report/package.json +10 -0
  111. package/skills/convert/SKILL.md +2 -3
  112. package/skills/customer-feedback-report/SKILL.md +44 -0
  113. package/skills/customer-feedback-report/package.json +10 -0
  114. package/skills/dashboard-builder/package.json +3 -1
  115. package/skills/database-explorer/package.json +3 -1
  116. package/skills/deepresearch/README.md +4 -13
  117. package/skills/deploy/src/http-client.ts +1 -1
  118. package/skills/diff-viewer/package.json +4 -1
  119. package/skills/doc-generate/package.json +0 -1
  120. package/skills/doc-generate/src/ai.ts +50 -0
  121. package/skills/doc-generate/src/cli.ts +203 -0
  122. package/skills/doc-generate/src/dependencies.ts +44 -0
  123. package/skills/doc-generate/src/document-builder.ts +299 -0
  124. package/skills/doc-generate/src/index.ts +40 -764
  125. package/skills/doc-generate/src/markdown-parser.ts +125 -0
  126. package/skills/doc-generate/src/types.ts +68 -0
  127. package/skills/domainpurchase/SKILL.md +1 -1
  128. package/skills/domainpurchase/package.json +1 -1
  129. package/skills/domainpurchase/src/index.ts +3 -0
  130. package/skills/domainsearch/SKILL.md +1 -1
  131. package/skills/domainsearch/package.json +1 -1
  132. package/skills/domainsearch/src/index.ts +3 -0
  133. package/skills/email-sequence/SKILL.md +44 -0
  134. package/skills/email-sequence/package.json +14 -0
  135. package/skills/excel/CLAUDE.md +2 -2
  136. package/skills/experiment-power-calculator/package.json +3 -1
  137. package/skills/extract-invoice/src/cli.ts +97 -0
  138. package/skills/extract-invoice/src/extractor.ts +170 -0
  139. package/skills/extract-invoice/src/file-utils.ts +46 -0
  140. package/skills/extract-invoice/src/formatters.ts +144 -0
  141. package/skills/extract-invoice/src/index.ts +44 -629
  142. package/skills/extract-invoice/src/runtime.ts +46 -0
  143. package/skills/extract-invoice/src/types.ts +88 -0
  144. package/skills/folder-tree/package.json +3 -1
  145. package/skills/form-filler/package.json +3 -1
  146. package/skills/generate-api-client/package.json +3 -1
  147. package/skills/generate-api-client/src/generator.ts +47 -0
  148. package/skills/generate-api-client/src/index.ts +3 -777
  149. package/skills/generate-api-client/src/logger.ts +34 -0
  150. package/skills/generate-api-client/src/python-generator.ts +245 -0
  151. package/skills/generate-api-client/src/spec-loader.ts +48 -0
  152. package/skills/generate-api-client/src/type-mappers.ts +79 -0
  153. package/skills/generate-api-client/src/types.ts +76 -0
  154. package/skills/generate-api-client/src/typescript-generator.ts +247 -0
  155. package/skills/generate-book-cover/package.json +3 -1
  156. package/skills/generate-dockerfile/src/cli.ts +78 -0
  157. package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
  158. package/skills/generate-dockerfile/src/index.ts +12 -790
  159. package/skills/generate-dockerfile/src/logger.ts +30 -0
  160. package/skills/generate-dockerfile/src/project-detection.ts +68 -0
  161. package/skills/generate-dockerfile/src/support-files.ts +171 -0
  162. package/skills/generate-dockerfile/src/types.ts +29 -0
  163. package/skills/generate-documentation/src/ai.ts +131 -0
  164. package/skills/generate-documentation/src/cli.ts +71 -0
  165. package/skills/generate-documentation/src/code-parser.ts +300 -0
  166. package/skills/generate-documentation/src/file-processing.ts +182 -0
  167. package/skills/generate-documentation/src/index.ts +13 -753
  168. package/skills/generate-documentation/src/runtime.ts +35 -0
  169. package/skills/generate-documentation/src/types.ts +30 -0
  170. package/skills/generate-env/package.json +3 -1
  171. package/skills/generate-env/src/cli.ts +85 -0
  172. package/skills/generate-env/src/detection.ts +161 -0
  173. package/skills/generate-env/src/env-data.ts +66 -0
  174. package/skills/generate-env/src/generators.ts +240 -0
  175. package/skills/generate-env/src/index.ts +76 -676
  176. package/skills/generate-env/src/runtime.ts +30 -0
  177. package/skills/generate-env/src/types.ts +32 -0
  178. package/skills/generate-favicon/package.json +3 -1
  179. package/skills/generate-mock-data/package.json +3 -1
  180. package/skills/generate-mock-data/src/ai.ts +102 -0
  181. package/skills/generate-mock-data/src/formatters.ts +84 -0
  182. package/skills/generate-mock-data/src/generator.ts +377 -0
  183. package/skills/generate-mock-data/src/index.ts +15 -716
  184. package/skills/generate-mock-data/src/logger.ts +37 -0
  185. package/skills/generate-mock-data/src/presets.ts +110 -0
  186. package/skills/generate-mock-data/src/types.ts +21 -0
  187. package/skills/generate-pr-description/src/ai.ts +144 -0
  188. package/skills/generate-pr-description/src/cli.ts +80 -0
  189. package/skills/generate-pr-description/src/clipboard.ts +30 -0
  190. package/skills/generate-pr-description/src/formatters.ts +231 -0
  191. package/skills/generate-pr-description/src/git.ts +153 -0
  192. package/skills/generate-pr-description/src/index.ts +21 -714
  193. package/skills/generate-pr-description/src/types.ts +49 -0
  194. package/skills/generate-presentation/src/ai-clients.ts +61 -0
  195. package/skills/generate-presentation/src/cli.ts +126 -0
  196. package/skills/generate-presentation/src/index.ts +3 -751
  197. package/skills/generate-presentation/src/logger.ts +67 -0
  198. package/skills/generate-presentation/src/presentation-generator.ts +425 -0
  199. package/skills/generate-presentation/src/runtime.ts +6 -0
  200. package/skills/generate-presentation/src/security.ts +12 -0
  201. package/skills/generate-presentation/src/types.ts +28 -0
  202. package/skills/generate-qrcode/package.json +4 -1
  203. package/skills/generate-regex/package.json +3 -1
  204. package/skills/generate-resume/src/cli.ts +157 -0
  205. package/skills/generate-resume/src/index.ts +13 -917
  206. package/skills/generate-resume/src/parsers.ts +95 -0
  207. package/skills/generate-resume/src/renderers.ts +538 -0
  208. package/skills/generate-resume/src/security.ts +39 -0
  209. package/skills/generate-resume/src/types.ts +86 -0
  210. package/skills/generate-social-posts/src/ai.ts +88 -0
  211. package/skills/generate-social-posts/src/cli.ts +118 -0
  212. package/skills/generate-social-posts/src/exporters.ts +126 -0
  213. package/skills/generate-social-posts/src/generator.ts +130 -0
  214. package/skills/generate-social-posts/src/index.ts +19 -709
  215. package/skills/generate-social-posts/src/platforms.ts +39 -0
  216. package/skills/generate-social-posts/src/runtime.ts +34 -0
  217. package/skills/generate-social-posts/src/source.ts +116 -0
  218. package/skills/generate-social-posts/src/types.ts +58 -0
  219. package/skills/gif-maker/package.json +4 -1
  220. package/skills/github-manager/package.json +3 -1
  221. package/skills/gmail/CLAUDE.md +1 -1
  222. package/skills/highlight-reel-generator/src/index.ts +19 -0
  223. package/skills/hook/src/commands/create.ts +20 -845
  224. package/skills/hook/src/templates/root.ts +196 -0
  225. package/skills/hook/src/templates/source.ts +647 -0
  226. package/skills/http-server/package.json +3 -1
  227. package/skills/icon-pack/README.md +28 -0
  228. package/skills/icon-pack/SKILL.md +23 -0
  229. package/skills/icon-pack/package.json +29 -0
  230. package/skills/{audio → icon-pack}/tsconfig.json +10 -12
  231. package/skills/image/package.json +1 -2
  232. package/skills/implementation-agent/package.json +3 -1
  233. package/skills/implementation-agent/src/ai-generation.ts +225 -0
  234. package/skills/implementation-agent/src/index.ts +3 -960
  235. package/skills/implementation-agent/src/minimist.d.ts +15 -0
  236. package/skills/implementation-agent/src/templates.ts +686 -0
  237. package/skills/implementation-agent/src/types.ts +53 -0
  238. package/skills/implementation-plan/package.json +3 -1
  239. package/skills/implementation-todo/package.json +3 -1
  240. package/skills/invoice/package.json +1 -1
  241. package/skills/invoice/src/index.ts +3 -0
  242. package/skills/invoice-reconciliation/SKILL.md +42 -0
  243. package/skills/invoice-reconciliation/package.json +10 -0
  244. package/skills/landing-page-pack/SKILL.md +47 -0
  245. package/skills/landing-page-pack/package.json +14 -0
  246. package/skills/latex-table-generator/package.json +3 -1
  247. package/skills/logo-design/SKILL.md +25 -44
  248. package/skills/logo-design/package.json +3 -15
  249. package/skills/lorem-generator/package.json +3 -1
  250. package/skills/lorem-generator/src/index.ts +13 -0
  251. package/skills/managehook/package.json +1 -1
  252. package/skills/managehook/src/index.ts +3 -0
  253. package/skills/managemcp/package.json +1 -1
  254. package/skills/managemcp/src/index.ts +3 -0
  255. package/skills/manageskill/package.json +1 -1
  256. package/skills/manageskill/src/index.ts +3 -0
  257. package/skills/markdown-validator/package.json +3 -1
  258. package/skills/markdown-validator/src/index.ts +1 -4
  259. package/skills/market-research-report/SKILL.md +41 -0
  260. package/skills/market-research-report/package.json +10 -0
  261. package/skills/mcp-builder/package.json +4 -1
  262. package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
  263. package/skills/mcp-builder/src/generators.ts +513 -0
  264. package/skills/mcp-builder/src/index.ts +7 -908
  265. package/skills/mcp-builder/src/minimist.d.ts +15 -0
  266. package/skills/mcp-builder/src/naming.ts +12 -0
  267. package/skills/mcp-builder/src/options.ts +170 -0
  268. package/skills/mcp-builder/src/templates.ts +149 -0
  269. package/skills/mcp-builder/src/types.ts +42 -0
  270. package/skills/meeting-pack/SKILL.md +43 -0
  271. package/skills/meeting-pack/package.json +10 -0
  272. package/skills/merge-pdfs/package.json +5 -1
  273. package/skills/migration-plan-pack/SKILL.md +45 -0
  274. package/skills/migration-plan-pack/package.json +10 -0
  275. package/skills/music/package.json +2 -3
  276. package/skills/music-album/SKILL.md +37 -0
  277. package/skills/music-album/package.json +10 -0
  278. package/skills/notion-manager/package.json +3 -1
  279. package/skills/npmpublish/CLAUDE.md +5 -8
  280. package/skills/npmpublish/README.md +5 -26
  281. package/skills/npmpublish/src/index.ts +9 -147
  282. package/skills/one-page-website/SKILL.md +46 -0
  283. package/skills/one-page-website/package.json +10 -0
  284. package/skills/one-page-website/tsconfig.json +8 -0
  285. package/skills/pdf-generate/src/cli.ts +162 -0
  286. package/skills/pdf-generate/src/html.ts +84 -0
  287. package/skills/pdf-generate/src/index.ts +11 -800
  288. package/skills/pdf-generate/src/markdown.ts +27 -0
  289. package/skills/pdf-generate/src/pdf-writer.ts +78 -0
  290. package/skills/pdf-generate/src/runtime.ts +34 -0
  291. package/skills/pdf-generate/src/security.ts +37 -0
  292. package/skills/pdf-generate/src/templates.ts +311 -0
  293. package/skills/pdf-generate/src/types.ts +28 -0
  294. package/skills/pdf-read/SKILL.md +10 -10
  295. package/skills/pdf-to-dataset/SKILL.md +45 -0
  296. package/skills/pdf-to-dataset/package.json +10 -0
  297. package/skills/pdf-to-markdown/SKILL.md +49 -0
  298. package/skills/pdf-to-markdown/package.json +10 -0
  299. package/skills/pdf-to-markdown/tsconfig.json +10 -0
  300. package/skills/performance-audit-report/SKILL.md +42 -0
  301. package/skills/performance-audit-report/package.json +10 -0
  302. package/skills/persona-based-adwriter/src/index.ts +19 -0
  303. package/skills/photo-album/SKILL.md +29 -0
  304. package/skills/photo-album/package.json +9 -0
  305. package/skills/photo-album/tsconfig.json +4 -0
  306. package/skills/pitch-deck/SKILL.md +43 -0
  307. package/skills/pitch-deck/package.json +9 -0
  308. package/skills/playlist-maker/SKILL.md +33 -0
  309. package/skills/playlist-maker/package.json +9 -0
  310. package/skills/playlist-maker/tsconfig.json +4 -0
  311. package/skills/product-mockup/SKILL.md +45 -0
  312. package/skills/product-mockup/package.json +3 -20
  313. package/skills/product-mockup/tsconfig.json +3 -5
  314. package/skills/project-retro-companion/src/index.ts +19 -0
  315. package/skills/proposal-pack/SKILL.md +45 -0
  316. package/skills/proposal-pack/package.json +10 -0
  317. package/skills/read-pdf/SKILL.md +5 -4
  318. package/skills/repo-onboarding-report/SKILL.md +42 -0
  319. package/skills/repo-onboarding-report/package.json +10 -0
  320. package/skills/sales-call-recapper/src/index.ts +20 -0
  321. package/skills/salescopy/package.json +1 -1
  322. package/skills/salescopy/src/index.ts +3 -0
  323. package/skills/scaffold-project/src/ai-detect.ts +136 -0
  324. package/skills/scaffold-project/src/file-generators.ts +292 -0
  325. package/skills/scaffold-project/src/index.ts +8 -991
  326. package/skills/scaffold-project/src/project-config.ts +338 -0
  327. package/skills/scaffold-project/src/templates.ts +173 -0
  328. package/skills/scaffold-project/src/types.ts +58 -0
  329. package/skills/scientific-figure-check/package.json +3 -1
  330. package/skills/sdk-generator/SKILL.md +45 -0
  331. package/skills/sdk-generator/package.json +10 -0
  332. package/skills/sdk-generator/tsconfig.json +8 -0
  333. package/skills/security-audit/src/index.ts +25 -6
  334. package/skills/security-audit-report/SKILL.md +40 -0
  335. package/skills/security-audit-report/package.json +10 -0
  336. package/skills/seo-content-pack/SKILL.md +44 -0
  337. package/skills/seo-content-pack/package.json +9 -0
  338. package/skills/short-video-pack/SKILL.md +30 -0
  339. package/skills/short-video-pack/package.json +10 -0
  340. package/skills/slack-assistant/package.json +3 -1
  341. package/skills/slide-deck-generator/SKILL.md +44 -0
  342. package/skills/slide-deck-generator/package.json +10 -0
  343. package/skills/sms/package.json +1 -1
  344. package/skills/sms/src/index.ts +15 -0
  345. package/skills/social-content-calendar/SKILL.md +45 -0
  346. package/skills/social-content-calendar/package.json +14 -0
  347. package/skills/split-pdf/package.json +4 -1
  348. package/skills/subtitle/package.json +2 -1
  349. package/skills/subtitle/src/index.ts +3 -0
  350. package/skills/terraform-generator/package.json +3 -1
  351. package/skills/test-suite-generator/SKILL.md +41 -0
  352. package/skills/test-suite-generator/package.json +10 -0
  353. package/skills/timesheet/package.json +1 -1
  354. package/skills/timesheet/src/index.ts +3 -0
  355. package/skills/transcript/SKILL.md +1 -8
  356. package/skills/validate-config/package.json +3 -1
  357. package/skills/video/package.json +6 -4
  358. package/skills/video-downloader/package.json +3 -1
  359. package/skills/video-highlight-pack/SKILL.md +44 -0
  360. package/skills/video-highlight-pack/package.json +10 -0
  361. package/skills/voiceover-jingle-pack/SKILL.md +28 -0
  362. package/skills/voiceover-jingle-pack/package.json +10 -0
  363. package/skills/watermark/package.json +6 -1
  364. package/skills/webcrawling/package.json +2 -1
  365. package/skills/write/SKILL.md +6 -6
  366. package/dist/server/serve.d.ts +0 -11
  367. package/skills/apidocs/.claude/settings.json +0 -5
  368. package/skills/audio/.env.example +0 -14
  369. package/skills/audio/QUICKSTART.md +0 -158
  370. package/skills/audio/README.md +0 -256
  371. package/skills/audio/src/index-local.ts +0 -206
  372. package/skills/audio/src/index.ts +0 -95
  373. package/skills/audio/src/providers/elevenlabs.ts +0 -115
  374. package/skills/audio/src/providers/google.ts +0 -116
  375. package/skills/audio/src/providers/minimax.ts +0 -83
  376. package/skills/audio/src/providers/openai.ts +0 -115
  377. package/skills/audio/src/types.ts +0 -79
  378. package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
  379. package/skills/audiobook-chapter-proofer/package.json +0 -27
  380. package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
  381. package/skills/browse/src/client.ts +0 -373
  382. package/skills/browse/src/index-local.ts +0 -430
  383. package/skills/browse/src/index.ts +0 -110
  384. package/skills/browse/src/sse-server.ts +0 -919
  385. package/skills/browse/src/types.ts +0 -104
  386. package/skills/consolelog/src/server/index.ts +0 -508
  387. package/skills/create-blog-article/CLAUDE.md +0 -19
  388. package/skills/create-blog-article/src/index.ts +0 -745
  389. package/skills/create-blog-article/tsconfig.json +0 -10
  390. package/skills/deepresearch/src/agents/query-generator.ts +0 -91
  391. package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
  392. package/skills/deepresearch/src/index.ts +0 -224
  393. package/skills/deepresearch/src/research.ts +0 -166
  394. package/skills/deepresearch/src/services/anthropic.ts +0 -69
  395. package/skills/deepresearch/src/services/exa.ts +0 -108
  396. package/skills/deepresearch/src/services/firecrawl.ts +0 -88
  397. package/skills/deepresearch/src/services/openai.ts +0 -81
  398. package/skills/deepresearch/src/types.ts +0 -76
  399. package/skills/deepresearch/src/utils/file.ts +0 -111
  400. package/skills/deepresearch/src/utils/logger.ts +0 -84
  401. package/skills/domainpurchase/src/server/index.ts +0 -332
  402. package/skills/domainsearch/src/server/index.ts +0 -229
  403. package/skills/e2bswarm/README.md +0 -135
  404. package/skills/e2bswarm/SKILL.md +0 -118
  405. package/skills/e2bswarm/examples/tasks-example.json +0 -38
  406. package/skills/e2bswarm/package.json +0 -59
  407. package/skills/e2bswarm/src/commands/collect.ts +0 -135
  408. package/skills/e2bswarm/src/commands/install.ts +0 -164
  409. package/skills/e2bswarm/src/commands/kill.ts +0 -62
  410. package/skills/e2bswarm/src/commands/spawn.ts +0 -134
  411. package/skills/e2bswarm/src/commands/status.ts +0 -90
  412. package/skills/e2bswarm/src/commands/sync.ts +0 -208
  413. package/skills/e2bswarm/src/index.ts +0 -121
  414. package/skills/e2bswarm/src/lib/config.ts +0 -75
  415. package/skills/e2bswarm/src/lib/e2b.ts +0 -490
  416. package/skills/e2bswarm/src/lib/github.ts +0 -253
  417. package/skills/e2bswarm/src/lib/logger.ts +0 -41
  418. package/skills/e2bswarm/src/lib/paths.ts +0 -75
  419. package/skills/e2bswarm/src/lib/tasks.ts +0 -320
  420. package/skills/e2bswarm/src/types/index.ts +0 -107
  421. package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
  422. package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
  423. package/skills/e2bswarm/templates/setup.sh +0 -21
  424. package/skills/e2bswarm/tsconfig.json +0 -19
  425. package/skills/generate-book-cover/src/index.ts +0 -694
  426. package/skills/image/src/index-local.ts +0 -206
  427. package/skills/image/src/index.ts +0 -96
  428. package/skills/image/src/providers/google.ts +0 -79
  429. package/skills/image/src/providers/minimax.ts +0 -94
  430. package/skills/image/src/providers/openai.ts +0 -80
  431. package/skills/image/src/providers/xai.ts +0 -73
  432. package/skills/image/src/types.ts +0 -37
  433. package/skills/logo-design/CLAUDE.md +0 -30
  434. package/skills/logo-design/src/index.ts +0 -322
  435. package/skills/managehook/src/server/index.ts +0 -108
  436. package/skills/managemcp/src/server/index.ts +0 -108
  437. package/skills/manageskill/src/server/index.ts +0 -108
  438. package/skills/music/CLAUDE.md +0 -9
  439. package/skills/music/src/index.ts +0 -94
  440. package/skills/music/tsconfig.json +0 -10
  441. package/skills/pdf-read/src/index.ts +0 -320
  442. package/skills/product-mockup/CLAUDE.md +0 -19
  443. package/skills/product-mockup/src/index.ts +0 -290
  444. package/skills/read-pdf/src/index.ts +0 -388
  445. package/skills/remove-background/src/index.ts +0 -405
  446. package/skills/scaffold-project/my-app/.env.example +0 -2
  447. package/skills/scaffold-project/my-app/README.md +0 -72
  448. package/skills/scaffold-project/my-app/package.json +0 -29
  449. package/skills/scaffold-project/my-app/src/index.ts +0 -23
  450. package/skills/scaffold-project/my-app/tsconfig.json +0 -33
  451. package/skills/sound-effects/SKILL.md +0 -34
  452. package/skills/sound-effects/package.json +0 -21
  453. package/skills/sound-effects/src/index.ts +0 -172
  454. package/skills/sound-effects/tsconfig.json +0 -8
  455. package/skills/transcript/src/chunker.ts +0 -215
  456. package/skills/transcript/src/formatter.ts +0 -134
  457. package/skills/transcript/src/index-local.ts +0 -226
  458. package/skills/transcript/src/index.ts +0 -110
  459. package/skills/transcript/src/providers/elevenlabs.ts +0 -133
  460. package/skills/transcript/src/providers/gemini.ts +0 -192
  461. package/skills/transcript/src/providers/index.ts +0 -54
  462. package/skills/transcript/src/providers/openai.ts +0 -203
  463. package/skills/transcript/src/types.ts +0 -106
  464. package/skills/video/.env.example +0 -14
  465. package/skills/video/EXAMPLES.md +0 -266
  466. package/skills/video/LICENSE +0 -192
  467. package/skills/video/README.md +0 -174
  468. package/skills/video/src/cli.ts +0 -155
  469. package/skills/video/src/index-local.ts +0 -148
  470. package/skills/video/src/index.ts +0 -96
  471. package/skills/video/src/providers/google-veo.ts +0 -126
  472. package/skills/video/src/providers/index.ts +0 -22
  473. package/skills/video/src/providers/minimax.ts +0 -100
  474. package/skills/video/src/providers/openai-sora.ts +0 -164
  475. package/skills/video/src/providers/runway.ts +0 -159
  476. package/skills/video/src/types.ts +0 -35
  477. package/skills/video/tsconfig.json +0 -22
  478. package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
  479. package/skills/voiceover-casting-assistant/package.json +0 -27
  480. package/skills/voiceover-casting-assistant/src/index.ts +0 -255
  481. package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
  482. package/skills/webcrawling/src/commands/config.ts +0 -34
  483. package/skills/webcrawling/src/commands/crawl.ts +0 -33
  484. package/skills/webcrawling/src/commands/scrape.ts +0 -32
  485. package/skills/webcrawling/src/commands/sessions.ts +0 -42
  486. package/skills/webcrawling/src/lib/crawler.ts +0 -174
  487. package/skills/webcrawling/src/lib/storage.ts +0 -130
  488. package/skills/webcrawling/src/types/index.ts +0 -45
  489. package/skills/webcrawling/src/utils/logger.ts +0 -30
  490. package/skills/webcrawling/src/utils/paths.ts +0 -28
  491. /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
@@ -1,490 +0,0 @@
1
- import { Sandbox } from 'e2b';
2
- import { mkdir, readdir, stat } from 'node:fs/promises';
3
- import { join, relative } from 'node:path';
4
- import type { SwarmInstance, SwarmConfig, Task } from '../types';
5
- import { logger } from './logger';
6
- import { paths } from './paths';
7
-
8
- // Default patterns to exclude when uploading local files
9
- const DEFAULT_EXCLUDE = [
10
- 'node_modules',
11
- '.git',
12
- '.next',
13
- '.turbo',
14
- 'dist',
15
- 'build',
16
- '.cache',
17
- '*.log',
18
- '.DS_Store',
19
- '.env',
20
- '.env.local',
21
- '.env*.local',
22
- ];
23
-
24
- export class E2BSwarm {
25
- private config: SwarmConfig;
26
-
27
- constructor(config: SwarmConfig) {
28
- this.config = config;
29
- }
30
-
31
- /**
32
- * Spawn a new E2B sandbox instance
33
- */
34
- async spawn(options: {
35
- source: string;
36
- sourceType: 'repo' | 'local';
37
- tasks: Task[];
38
- prompt: string;
39
- branch?: string;
40
- newBranch?: string;
41
- include?: string[];
42
- exclude?: string[];
43
- // GitHub options
44
- autoCommit?: boolean;
45
- autoPush?: boolean;
46
- createPr?: boolean;
47
- prTitle?: string;
48
- prBase?: string;
49
- }): Promise<SwarmInstance> {
50
- const instanceId = crypto.randomUUID();
51
- const shortId = instanceId.slice(0, 8);
52
-
53
- // Create instance-specific directories
54
- const instancePaths = paths.getInstance(shortId);
55
- await mkdir(instancePaths.exports, { recursive: true });
56
- await mkdir(instancePaths.logs, { recursive: true });
57
-
58
- const instance: SwarmInstance = {
59
- id: instanceId,
60
- sandboxId: '',
61
- template: this.config.template,
62
- status: 'starting',
63
- source: options.source,
64
- sourceType: options.sourceType,
65
- branch: options.branch,
66
- newBranch: options.newBranch,
67
- tasks: options.tasks,
68
- prompt: options.prompt,
69
- startedAt: new Date().toISOString(),
70
- exportDir: instancePaths.exports,
71
- logFile: `${instancePaths.logs}/execution.log`,
72
- // GitHub integration options
73
- autoCommit: options.autoCommit,
74
- autoPush: options.autoPush,
75
- createPr: options.createPr,
76
- prTitle: options.prTitle,
77
- prBase: options.prBase,
78
- };
79
-
80
- try {
81
- logger.instance(instanceId, 'starting', `Using template: ${this.config.template}`);
82
-
83
- // Create the sandbox with specified template
84
- const sandbox = await Sandbox.create(this.config.template, {
85
- apiKey: this.config.apiKey,
86
- timeoutMs: this.config.timeout,
87
- });
88
-
89
- instance.sandboxId = sandbox.sandboxId;
90
- logger.instance(instanceId, 'starting', `Sandbox ID: ${sandbox.sandboxId}`);
91
-
92
- // Setup the instance based on source type
93
- if (options.sourceType === 'local') {
94
- await this.setupInstanceFromLocal(sandbox, instance, options.include, options.exclude);
95
- } else {
96
- await this.setupInstanceFromRepo(sandbox, instance);
97
- }
98
-
99
- return instance;
100
- } catch (error) {
101
- instance.status = 'failed';
102
- instance.error = error instanceof Error ? error.message : String(error);
103
- logger.instance(instanceId, 'failed', instance.error);
104
-
105
- // Log error to file
106
- await this.appendLog(instance, `ERROR: ${instance.error}`);
107
-
108
- return instance;
109
- }
110
- }
111
-
112
- /**
113
- * Load Anthropic API key from ~/.secrets
114
- */
115
- private async loadAnthropicKey(): Promise<string | undefined> {
116
- try {
117
- const secrets = await Bun.file(`${process.env.HOME}/.secrets`).text();
118
- const match = secrets.match(/ANTHROPIC_API_KEY=["']?([^"'\n]+)["']?/);
119
- return match?.[1];
120
- } catch {
121
- return undefined;
122
- }
123
- }
124
-
125
- /**
126
- * Append to instance log file
127
- */
128
- private async appendLog(instance: SwarmInstance, message: string): Promise<void> {
129
- if (!instance.logFile) return;
130
- const timestamp = new Date().toISOString();
131
- const logLine = `[${timestamp}] ${message}\n`;
132
- try {
133
- const existing = await Bun.file(instance.logFile).text().catch(() => '');
134
- await Bun.write(instance.logFile, existing + logLine);
135
- } catch {
136
- // Ignore log write errors
137
- }
138
- }
139
-
140
- /**
141
- * Setup instance by uploading local files
142
- */
143
- private async setupInstanceFromLocal(
144
- sandbox: Sandbox,
145
- instance: SwarmInstance,
146
- include?: string[],
147
- exclude?: string[]
148
- ): Promise<void> {
149
- const localPath = instance.source;
150
- const excludePatterns = [...DEFAULT_EXCLUDE, ...(exclude || [])];
151
-
152
- instance.status = 'uploading';
153
- logger.instance(instance.id, 'uploading', localPath);
154
- await this.appendLog(instance, `Uploading local files from: ${localPath}`);
155
-
156
- // Create workspace directory
157
- await sandbox.commands.run('mkdir -p /home/user/workspace');
158
-
159
- // Get all files to upload
160
- const files = await this.getFilesToUpload(localPath, excludePatterns, include);
161
- await this.appendLog(instance, `Found ${files.length} files to upload`);
162
-
163
- // Upload files in batches
164
- let uploaded = 0;
165
- for (const file of files) {
166
- const relativePath = relative(localPath, file);
167
- const remotePath = `/home/user/workspace/${relativePath}`;
168
-
169
- try {
170
- const content = await Bun.file(file).text();
171
- await sandbox.files.write(remotePath, content);
172
- uploaded++;
173
-
174
- if (uploaded % 50 === 0) {
175
- logger.instance(instance.id, 'uploading', `${uploaded}/${files.length} files`);
176
- }
177
- } catch (error) {
178
- // Skip binary files or files that fail to read
179
- await this.appendLog(instance, `Skipped: ${relativePath} (${error})`);
180
- }
181
- }
182
-
183
- await this.appendLog(instance, `Uploaded ${uploaded} files`);
184
- logger.instance(instance.id, 'uploading', `${uploaded} files uploaded`);
185
-
186
- // Continue with common setup
187
- await this.finishSetup(sandbox, instance);
188
- }
189
-
190
- /**
191
- * Setup instance by cloning from git repo
192
- */
193
- private async setupInstanceFromRepo(sandbox: Sandbox, instance: SwarmInstance): Promise<void> {
194
- const { source: repo, branch } = instance;
195
-
196
- await this.appendLog(instance, `Starting setup for repo: ${repo}`);
197
-
198
- // Clone the repository
199
- instance.status = 'cloning';
200
- logger.instance(instance.id, 'cloning', repo);
201
- await this.appendLog(instance, `Cloning repository...`);
202
-
203
- const cloneCmd = branch
204
- ? `git clone --branch ${branch} --depth 1 ${repo} /home/user/workspace`
205
- : `git clone --depth 1 ${repo} /home/user/workspace`;
206
-
207
- const cloneResult = await sandbox.commands.run(cloneCmd, { timeoutMs: 120000 });
208
- if (cloneResult.exitCode !== 0) {
209
- throw new Error(`Failed to clone repo: ${cloneResult.stderr}`);
210
- }
211
- await this.appendLog(instance, `Clone successful`);
212
-
213
- // Continue with common setup
214
- await this.finishSetup(sandbox, instance);
215
- }
216
-
217
- /**
218
- * Common setup after files are in place
219
- */
220
- private async finishSetup(sandbox: Sandbox, instance: SwarmInstance): Promise<void> {
221
- const { tasks, prompt } = instance;
222
-
223
- // Setup directories
224
- instance.status = 'setting-up';
225
- logger.instance(instance.id, 'setting-up', 'Creating task files...');
226
- await this.appendLog(instance, `Setting up task files...`);
227
-
228
- await sandbox.commands.run('mkdir -p /home/user/workspace/.claude/tasks/swarm');
229
-
230
- // Write individual task files (matching Claude Code format)
231
- for (const task of tasks) {
232
- const taskJson = JSON.stringify(task, null, 2);
233
- await sandbox.files.write(
234
- `/home/user/workspace/.claude/tasks/swarm/${task.id}.json`,
235
- taskJson
236
- );
237
- }
238
- await this.appendLog(instance, `Created ${tasks.length} task files`);
239
-
240
- // Write the prompt file
241
- const promptContent = `# Swarm Task Execution
242
-
243
- ${prompt}
244
-
245
- ## Assigned Tasks
246
-
247
- ${tasks.map(t => `- [${t.id}] ${t.subject}`).join('\n')}
248
-
249
- ## Instructions
250
-
251
- 1. Read each task using TaskGet
252
- 2. Set task status to in_progress when starting
253
- 3. Complete the task following its description
254
- 4. Set task status to completed when done
255
- 5. Move to the next task
256
-
257
- Work through all assigned tasks systematically.
258
- `;
259
-
260
- await sandbox.files.write('/home/user/workspace/.claude/swarm-prompt.md', promptContent);
261
-
262
- // Install dependencies
263
- logger.instance(instance.id, 'setting-up', 'Installing dependencies...');
264
- await this.appendLog(instance, `Installing dependencies...`);
265
- await sandbox.commands.run('cd /home/user/workspace && bun install 2>/dev/null || npm install 2>/dev/null || true', {
266
- timeoutMs: 180000,
267
- });
268
-
269
- // Start Claude Code (non-blocking, runs in background)
270
- instance.status = 'running';
271
- logger.instance(instance.id, 'running', 'Starting Claude Code...');
272
- await this.appendLog(instance, `Starting Claude Code...`);
273
-
274
- // Get Anthropic API key for Claude Code
275
- const anthropicKey = process.env.ANTHROPIC_API_KEY || await this.loadAnthropicKey();
276
- if (!anthropicKey) {
277
- throw new Error(
278
- 'ANTHROPIC_API_KEY not found. Add it to ~/.secrets:\n' +
279
- ' export ANTHROPIC_API_KEY="your-api-key"\n\n' +
280
- 'Get your API key at: https://console.anthropic.com'
281
- );
282
- }
283
-
284
- // Run Claude Code with the task list
285
- const claudeCmd = `
286
- cd /home/user/workspace && \
287
- export ANTHROPIC_API_KEY="${anthropicKey}" && \
288
- export CLAUDE_CODE_TASK_LIST_ID=swarm && \
289
- claude --print "$(cat .claude/swarm-prompt.md)" \
290
- --dangerously-skip-permissions \
291
- --output-format json \
292
- > /home/user/workspace/.claude/swarm-output.json 2>&1 &
293
- echo $! > /home/user/workspace/.claude/swarm-pid
294
- `;
295
-
296
- await sandbox.commands.run(claudeCmd);
297
- logger.instance(instance.id, 'running', 'Claude Code started');
298
- await this.appendLog(instance, `Claude Code process started`);
299
- }
300
-
301
- /**
302
- * Get list of files to upload, respecting exclude patterns
303
- */
304
- private async getFilesToUpload(
305
- dir: string,
306
- exclude: string[],
307
- include?: string[]
308
- ): Promise<string[]> {
309
- const files: string[] = [];
310
-
311
- const walk = async (currentDir: string) => {
312
- const entries = await readdir(currentDir, { withFileTypes: true });
313
-
314
- for (const entry of entries) {
315
- const fullPath = join(currentDir, entry.name);
316
- const relativePath = relative(dir, fullPath);
317
-
318
- // Check if excluded
319
- if (this.shouldExclude(relativePath, entry.name, exclude)) {
320
- continue;
321
- }
322
-
323
- // Check if included (if include patterns specified)
324
- if (include && include.length > 0 && !this.matchesAny(relativePath, include)) {
325
- if (!entry.isDirectory()) continue;
326
- }
327
-
328
- if (entry.isDirectory()) {
329
- await walk(fullPath);
330
- } else if (entry.isFile()) {
331
- // Skip large files (> 1MB)
332
- const stats = await stat(fullPath);
333
- if (stats.size < 1024 * 1024) {
334
- files.push(fullPath);
335
- }
336
- }
337
- }
338
- };
339
-
340
- await walk(dir);
341
- return files;
342
- }
343
-
344
- /**
345
- * Check if path should be excluded
346
- */
347
- private shouldExclude(relativePath: string, name: string, patterns: string[]): boolean {
348
- for (const pattern of patterns) {
349
- // Exact match
350
- if (name === pattern || relativePath === pattern) return true;
351
-
352
- // Glob pattern (simple)
353
- if (pattern.includes('*')) {
354
- const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
355
- if (regex.test(name) || regex.test(relativePath)) return true;
356
- }
357
-
358
- // Directory match
359
- if (relativePath.startsWith(pattern + '/')) return true;
360
- }
361
- return false;
362
- }
363
-
364
- /**
365
- * Check if path matches any pattern
366
- */
367
- private matchesAny(path: string, patterns: string[]): boolean {
368
- for (const pattern of patterns) {
369
- if (pattern.includes('*')) {
370
- const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
371
- if (regex.test(path)) return true;
372
- } else if (path.startsWith(pattern)) {
373
- return true;
374
- }
375
- }
376
- return false;
377
- }
378
-
379
- /**
380
- * Check the status of a running instance
381
- */
382
- async checkInstance(instance: SwarmInstance): Promise<SwarmInstance> {
383
- if (!instance.sandboxId || instance.status === 'failed') {
384
- return instance;
385
- }
386
-
387
- try {
388
- const sandbox = await Sandbox.connect(instance.sandboxId, {
389
- apiKey: this.config.apiKey,
390
- });
391
-
392
- // Check if Claude Code is still running
393
- const pidResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-pid 2>/dev/null || echo ""');
394
- const pid = pidResult.stdout.trim();
395
-
396
- if (pid) {
397
- const psResult = await sandbox.commands.run(`ps -p ${pid} -o pid= 2>/dev/null || echo ""`);
398
- if (!psResult.stdout.trim()) {
399
- // Process completed
400
- instance.status = 'completed';
401
- instance.completedAt = new Date().toISOString();
402
-
403
- // Read output
404
- const outputResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-output.json 2>/dev/null || echo "{}"');
405
- instance.output = outputResult.stdout;
406
-
407
- await this.appendLog(instance, `Execution completed`);
408
- }
409
- }
410
-
411
- return instance;
412
- } catch (error) {
413
- // Sandbox might have been closed
414
- if (instance.status === 'running') {
415
- instance.status = 'failed';
416
- instance.error = error instanceof Error ? error.message : 'Sandbox connection lost';
417
- await this.appendLog(instance, `ERROR: ${instance.error}`);
418
- }
419
- return instance;
420
- }
421
- }
422
-
423
- /**
424
- * Collect results from a completed instance
425
- */
426
- async collectResults(instance: SwarmInstance): Promise<{
427
- output: string;
428
- tasks: Task[];
429
- logs: string;
430
- }> {
431
- if (!instance.sandboxId) {
432
- throw new Error('Instance has no sandbox ID');
433
- }
434
-
435
- const sandbox = await Sandbox.connect(instance.sandboxId, {
436
- apiKey: this.config.apiKey,
437
- });
438
-
439
- // Read output
440
- const outputResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-output.json 2>/dev/null || echo "{}"');
441
-
442
- // Read updated task files
443
- const tasksResult = await sandbox.commands.run('cat /home/user/workspace/.claude/tasks/swarm/*.json 2>/dev/null');
444
- const taskLines = tasksResult.stdout.split('\n').filter(Boolean);
445
- const tasks: Task[] = [];
446
-
447
- for (const line of taskLines) {
448
- try {
449
- tasks.push(JSON.parse(line));
450
- } catch {
451
- // Skip invalid JSON
452
- }
453
- }
454
-
455
- // Read any logs
456
- const logsResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-output.json 2>/dev/null || echo ""');
457
-
458
- await this.appendLog(instance, `Results collected: ${tasks.length} tasks`);
459
-
460
- return {
461
- output: outputResult.stdout,
462
- tasks,
463
- logs: logsResult.stdout,
464
- };
465
- }
466
-
467
- /**
468
- * Kill a sandbox instance
469
- */
470
- async kill(instance: SwarmInstance): Promise<void> {
471
- if (!instance.sandboxId) {
472
- return;
473
- }
474
-
475
- try {
476
- const sandbox = await Sandbox.connect(instance.sandboxId, {
477
- apiKey: this.config.apiKey,
478
- });
479
- await sandbox.kill();
480
- instance.status = 'failed';
481
- instance.error = 'Killed by user';
482
- instance.completedAt = new Date().toISOString();
483
- logger.instance(instance.id, 'failed', 'Killed');
484
- await this.appendLog(instance, `Instance killed by user`);
485
- } catch (error) {
486
- // Sandbox might already be dead
487
- logger.debug(`Failed to kill sandbox ${instance.sandboxId}: ${error}`);
488
- }
489
- }
490
- }