@hasna/skills 0.1.27 → 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 (488) hide show
  1. package/LICENSE +1 -10
  2. package/README.md +141 -39
  3. package/bin/index.js +30121 -27576
  4. package/bin/mcp.js +22073 -18556
  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 +11606 -598
  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 +22 -11
  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/exports/products-2025-12-14T13-50-53-041Z.csv +16 -0
  108. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.json +227 -0
  109. package/skills/consolelog/package.json +1 -1
  110. package/skills/consolelog/src/index.ts +3 -0
  111. package/skills/contract-review-report/SKILL.md +43 -0
  112. package/skills/contract-review-report/package.json +10 -0
  113. package/skills/convert/SKILL.md +2 -3
  114. package/skills/customer-feedback-report/SKILL.md +44 -0
  115. package/skills/customer-feedback-report/package.json +10 -0
  116. package/skills/dashboard-builder/package.json +3 -1
  117. package/skills/database-explorer/package.json +3 -1
  118. package/skills/deepresearch/README.md +4 -13
  119. package/skills/deploy/src/http-client.ts +1 -1
  120. package/skills/diff-viewer/package.json +4 -1
  121. package/skills/doc-generate/package.json +0 -1
  122. package/skills/doc-generate/src/ai.ts +50 -0
  123. package/skills/doc-generate/src/cli.ts +203 -0
  124. package/skills/doc-generate/src/dependencies.ts +44 -0
  125. package/skills/doc-generate/src/document-builder.ts +299 -0
  126. package/skills/doc-generate/src/index.ts +40 -764
  127. package/skills/doc-generate/src/markdown-parser.ts +125 -0
  128. package/skills/doc-generate/src/types.ts +68 -0
  129. package/skills/domainpurchase/SKILL.md +1 -1
  130. package/skills/domainpurchase/package.json +1 -1
  131. package/skills/domainpurchase/src/index.ts +3 -0
  132. package/skills/domainsearch/SKILL.md +1 -1
  133. package/skills/domainsearch/package.json +1 -1
  134. package/skills/domainsearch/src/index.ts +3 -0
  135. package/skills/email-sequence/SKILL.md +44 -0
  136. package/skills/email-sequence/package.json +14 -0
  137. package/skills/excel/CLAUDE.md +2 -2
  138. package/skills/experiment-power-calculator/package.json +3 -1
  139. package/skills/extract-invoice/src/cli.ts +97 -0
  140. package/skills/extract-invoice/src/extractor.ts +170 -0
  141. package/skills/extract-invoice/src/file-utils.ts +46 -0
  142. package/skills/extract-invoice/src/formatters.ts +144 -0
  143. package/skills/extract-invoice/src/index.ts +44 -629
  144. package/skills/extract-invoice/src/runtime.ts +46 -0
  145. package/skills/extract-invoice/src/types.ts +88 -0
  146. package/skills/folder-tree/package.json +3 -1
  147. package/skills/form-filler/package.json +3 -1
  148. package/skills/generate-api-client/package.json +3 -1
  149. package/skills/generate-api-client/src/generator.ts +47 -0
  150. package/skills/generate-api-client/src/index.ts +3 -777
  151. package/skills/generate-api-client/src/logger.ts +34 -0
  152. package/skills/generate-api-client/src/python-generator.ts +245 -0
  153. package/skills/generate-api-client/src/spec-loader.ts +48 -0
  154. package/skills/generate-api-client/src/type-mappers.ts +79 -0
  155. package/skills/generate-api-client/src/types.ts +76 -0
  156. package/skills/generate-api-client/src/typescript-generator.ts +247 -0
  157. package/skills/generate-book-cover/package.json +3 -1
  158. package/skills/generate-dockerfile/src/cli.ts +78 -0
  159. package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
  160. package/skills/generate-dockerfile/src/index.ts +12 -790
  161. package/skills/generate-dockerfile/src/logger.ts +30 -0
  162. package/skills/generate-dockerfile/src/project-detection.ts +68 -0
  163. package/skills/generate-dockerfile/src/support-files.ts +171 -0
  164. package/skills/generate-dockerfile/src/types.ts +29 -0
  165. package/skills/generate-documentation/src/ai.ts +131 -0
  166. package/skills/generate-documentation/src/cli.ts +71 -0
  167. package/skills/generate-documentation/src/code-parser.ts +300 -0
  168. package/skills/generate-documentation/src/file-processing.ts +182 -0
  169. package/skills/generate-documentation/src/index.ts +13 -753
  170. package/skills/generate-documentation/src/runtime.ts +35 -0
  171. package/skills/generate-documentation/src/types.ts +30 -0
  172. package/skills/generate-env/package.json +3 -1
  173. package/skills/generate-env/src/cli.ts +85 -0
  174. package/skills/generate-env/src/detection.ts +161 -0
  175. package/skills/generate-env/src/env-data.ts +66 -0
  176. package/skills/generate-env/src/generators.ts +240 -0
  177. package/skills/generate-env/src/index.ts +76 -676
  178. package/skills/generate-env/src/runtime.ts +30 -0
  179. package/skills/generate-env/src/types.ts +32 -0
  180. package/skills/generate-favicon/package.json +3 -1
  181. package/skills/generate-mock-data/package.json +3 -1
  182. package/skills/generate-mock-data/src/ai.ts +102 -0
  183. package/skills/generate-mock-data/src/formatters.ts +84 -0
  184. package/skills/generate-mock-data/src/generator.ts +377 -0
  185. package/skills/generate-mock-data/src/index.ts +15 -716
  186. package/skills/generate-mock-data/src/logger.ts +37 -0
  187. package/skills/generate-mock-data/src/presets.ts +110 -0
  188. package/skills/generate-mock-data/src/types.ts +21 -0
  189. package/skills/generate-pr-description/src/ai.ts +144 -0
  190. package/skills/generate-pr-description/src/cli.ts +80 -0
  191. package/skills/generate-pr-description/src/clipboard.ts +30 -0
  192. package/skills/generate-pr-description/src/formatters.ts +231 -0
  193. package/skills/generate-pr-description/src/git.ts +153 -0
  194. package/skills/generate-pr-description/src/index.ts +21 -714
  195. package/skills/generate-pr-description/src/types.ts +49 -0
  196. package/skills/generate-presentation/src/ai-clients.ts +61 -0
  197. package/skills/generate-presentation/src/cli.ts +126 -0
  198. package/skills/generate-presentation/src/index.ts +3 -751
  199. package/skills/generate-presentation/src/logger.ts +67 -0
  200. package/skills/generate-presentation/src/presentation-generator.ts +425 -0
  201. package/skills/generate-presentation/src/runtime.ts +6 -0
  202. package/skills/generate-presentation/src/security.ts +12 -0
  203. package/skills/generate-presentation/src/types.ts +28 -0
  204. package/skills/generate-qrcode/package.json +4 -1
  205. package/skills/generate-regex/package.json +3 -1
  206. package/skills/generate-resume/src/cli.ts +157 -0
  207. package/skills/generate-resume/src/index.ts +13 -917
  208. package/skills/generate-resume/src/parsers.ts +95 -0
  209. package/skills/generate-resume/src/renderers.ts +538 -0
  210. package/skills/generate-resume/src/security.ts +39 -0
  211. package/skills/generate-resume/src/types.ts +86 -0
  212. package/skills/generate-social-posts/src/ai.ts +88 -0
  213. package/skills/generate-social-posts/src/cli.ts +118 -0
  214. package/skills/generate-social-posts/src/exporters.ts +126 -0
  215. package/skills/generate-social-posts/src/generator.ts +130 -0
  216. package/skills/generate-social-posts/src/index.ts +19 -709
  217. package/skills/generate-social-posts/src/platforms.ts +39 -0
  218. package/skills/generate-social-posts/src/runtime.ts +34 -0
  219. package/skills/generate-social-posts/src/source.ts +116 -0
  220. package/skills/generate-social-posts/src/types.ts +58 -0
  221. package/skills/gif-maker/package.json +4 -1
  222. package/skills/github-manager/package.json +3 -1
  223. package/skills/gmail/CLAUDE.md +1 -1
  224. package/skills/highlight-reel-generator/src/index.ts +19 -0
  225. package/skills/hook/src/commands/create.ts +20 -845
  226. package/skills/hook/src/templates/root.ts +196 -0
  227. package/skills/hook/src/templates/source.ts +647 -0
  228. package/skills/http-server/package.json +3 -1
  229. package/skills/icon-pack/README.md +28 -0
  230. package/skills/icon-pack/SKILL.md +23 -0
  231. package/skills/icon-pack/package.json +29 -0
  232. package/skills/{audio → icon-pack}/tsconfig.json +10 -12
  233. package/skills/image/package.json +1 -2
  234. package/skills/implementation-agent/package.json +3 -1
  235. package/skills/implementation-agent/src/ai-generation.ts +225 -0
  236. package/skills/implementation-agent/src/index.ts +3 -960
  237. package/skills/implementation-agent/src/minimist.d.ts +15 -0
  238. package/skills/implementation-agent/src/templates.ts +686 -0
  239. package/skills/implementation-agent/src/types.ts +53 -0
  240. package/skills/implementation-plan/package.json +3 -1
  241. package/skills/implementation-todo/package.json +3 -1
  242. package/skills/invoice/package.json +1 -1
  243. package/skills/invoice/src/index.ts +3 -0
  244. package/skills/invoice-reconciliation/SKILL.md +42 -0
  245. package/skills/invoice-reconciliation/package.json +10 -0
  246. package/skills/landing-page-pack/SKILL.md +47 -0
  247. package/skills/landing-page-pack/package.json +14 -0
  248. package/skills/latex-table-generator/package.json +3 -1
  249. package/skills/logo-design/SKILL.md +25 -44
  250. package/skills/logo-design/package.json +3 -15
  251. package/skills/lorem-generator/package.json +3 -1
  252. package/skills/lorem-generator/src/index.ts +13 -0
  253. package/skills/managehook/package.json +1 -1
  254. package/skills/managehook/src/index.ts +3 -0
  255. package/skills/managemcp/package.json +1 -1
  256. package/skills/managemcp/src/index.ts +3 -0
  257. package/skills/manageskill/package.json +1 -1
  258. package/skills/manageskill/src/index.ts +3 -0
  259. package/skills/markdown-validator/package.json +3 -1
  260. package/skills/markdown-validator/src/index.ts +1 -4
  261. package/skills/market-research-report/SKILL.md +41 -0
  262. package/skills/market-research-report/package.json +10 -0
  263. package/skills/mcp-builder/package.json +4 -1
  264. package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
  265. package/skills/mcp-builder/src/generators.ts +513 -0
  266. package/skills/mcp-builder/src/index.ts +7 -908
  267. package/skills/mcp-builder/src/minimist.d.ts +15 -0
  268. package/skills/mcp-builder/src/naming.ts +12 -0
  269. package/skills/mcp-builder/src/options.ts +170 -0
  270. package/skills/mcp-builder/src/templates.ts +149 -0
  271. package/skills/mcp-builder/src/types.ts +42 -0
  272. package/skills/meeting-pack/SKILL.md +43 -0
  273. package/skills/meeting-pack/package.json +10 -0
  274. package/skills/merge-pdfs/package.json +5 -1
  275. package/skills/migration-plan-pack/SKILL.md +45 -0
  276. package/skills/migration-plan-pack/package.json +10 -0
  277. package/skills/music/package.json +2 -3
  278. package/skills/music-album/SKILL.md +37 -0
  279. package/skills/music-album/package.json +10 -0
  280. package/skills/notion-manager/package.json +3 -1
  281. package/skills/npmpublish/CLAUDE.md +5 -8
  282. package/skills/npmpublish/README.md +5 -26
  283. package/skills/npmpublish/src/index.ts +9 -147
  284. package/skills/one-page-website/SKILL.md +46 -0
  285. package/skills/one-page-website/package.json +10 -0
  286. package/skills/one-page-website/tsconfig.json +8 -0
  287. package/skills/pdf-generate/src/cli.ts +162 -0
  288. package/skills/pdf-generate/src/html.ts +84 -0
  289. package/skills/pdf-generate/src/index.ts +11 -800
  290. package/skills/pdf-generate/src/markdown.ts +27 -0
  291. package/skills/pdf-generate/src/pdf-writer.ts +78 -0
  292. package/skills/pdf-generate/src/runtime.ts +34 -0
  293. package/skills/pdf-generate/src/security.ts +37 -0
  294. package/skills/pdf-generate/src/templates.ts +311 -0
  295. package/skills/pdf-generate/src/types.ts +28 -0
  296. package/skills/pdf-read/SKILL.md +10 -10
  297. package/skills/pdf-to-dataset/SKILL.md +45 -0
  298. package/skills/pdf-to-dataset/package.json +10 -0
  299. package/skills/pdf-to-markdown/SKILL.md +49 -0
  300. package/skills/pdf-to-markdown/package.json +10 -0
  301. package/skills/pdf-to-markdown/tsconfig.json +10 -0
  302. package/skills/performance-audit-report/SKILL.md +42 -0
  303. package/skills/performance-audit-report/package.json +10 -0
  304. package/skills/persona-based-adwriter/src/index.ts +19 -0
  305. package/skills/photo-album/SKILL.md +29 -0
  306. package/skills/photo-album/package.json +9 -0
  307. package/skills/photo-album/tsconfig.json +4 -0
  308. package/skills/pitch-deck/SKILL.md +43 -0
  309. package/skills/pitch-deck/package.json +9 -0
  310. package/skills/playlist-maker/SKILL.md +33 -0
  311. package/skills/playlist-maker/package.json +9 -0
  312. package/skills/playlist-maker/tsconfig.json +4 -0
  313. package/skills/product-mockup/SKILL.md +45 -0
  314. package/skills/product-mockup/package.json +3 -20
  315. package/skills/product-mockup/tsconfig.json +3 -5
  316. package/skills/project-retro-companion/src/index.ts +19 -0
  317. package/skills/proposal-pack/SKILL.md +45 -0
  318. package/skills/proposal-pack/package.json +10 -0
  319. package/skills/read-pdf/SKILL.md +5 -4
  320. package/skills/repo-onboarding-report/SKILL.md +42 -0
  321. package/skills/repo-onboarding-report/package.json +10 -0
  322. package/skills/sales-call-recapper/src/index.ts +20 -0
  323. package/skills/salescopy/package.json +1 -1
  324. package/skills/salescopy/src/index.ts +3 -0
  325. package/skills/scaffold-project/src/ai-detect.ts +136 -0
  326. package/skills/scaffold-project/src/file-generators.ts +292 -0
  327. package/skills/scaffold-project/src/index.ts +8 -991
  328. package/skills/scaffold-project/src/project-config.ts +338 -0
  329. package/skills/scaffold-project/src/templates.ts +173 -0
  330. package/skills/scaffold-project/src/types.ts +58 -0
  331. package/skills/scientific-figure-check/package.json +3 -1
  332. package/skills/sdk-generator/SKILL.md +45 -0
  333. package/skills/sdk-generator/package.json +10 -0
  334. package/skills/sdk-generator/tsconfig.json +8 -0
  335. package/skills/security-audit/src/index.ts +25 -6
  336. package/skills/security-audit-report/SKILL.md +40 -0
  337. package/skills/security-audit-report/package.json +10 -0
  338. package/skills/seo-content-pack/SKILL.md +44 -0
  339. package/skills/seo-content-pack/package.json +9 -0
  340. package/skills/short-video-pack/SKILL.md +30 -0
  341. package/skills/short-video-pack/package.json +10 -0
  342. package/skills/slack-assistant/package.json +3 -1
  343. package/skills/slide-deck-generator/SKILL.md +44 -0
  344. package/skills/slide-deck-generator/package.json +10 -0
  345. package/skills/sms/package.json +1 -1
  346. package/skills/sms/src/index.ts +15 -0
  347. package/skills/social-content-calendar/SKILL.md +45 -0
  348. package/skills/social-content-calendar/package.json +14 -0
  349. package/skills/split-pdf/package.json +4 -1
  350. package/skills/subtitle/package.json +2 -1
  351. package/skills/subtitle/src/index.ts +3 -0
  352. package/skills/terraform-generator/package.json +3 -1
  353. package/skills/test-suite-generator/SKILL.md +41 -0
  354. package/skills/test-suite-generator/package.json +10 -0
  355. package/skills/timesheet/package.json +1 -1
  356. package/skills/timesheet/src/index.ts +3 -0
  357. package/skills/transcript/SKILL.md +1 -8
  358. package/skills/validate-config/package.json +3 -1
  359. package/skills/video/package.json +6 -4
  360. package/skills/video-downloader/package.json +3 -1
  361. package/skills/video-highlight-pack/SKILL.md +44 -0
  362. package/skills/video-highlight-pack/package.json +10 -0
  363. package/skills/voiceover-jingle-pack/SKILL.md +28 -0
  364. package/skills/voiceover-jingle-pack/package.json +10 -0
  365. package/skills/watermark/package.json +6 -1
  366. package/skills/webcrawling/package.json +2 -1
  367. package/skills/write/SKILL.md +6 -6
  368. package/dist/server/serve.d.ts +0 -11
  369. package/skills/apidocs/.claude/settings.json +0 -5
  370. package/skills/audio/.env.example +0 -14
  371. package/skills/audio/QUICKSTART.md +0 -158
  372. package/skills/audio/README.md +0 -256
  373. package/skills/audio/src/index-local.ts +0 -206
  374. package/skills/audio/src/index.ts +0 -95
  375. package/skills/audio/src/providers/elevenlabs.ts +0 -115
  376. package/skills/audio/src/providers/google.ts +0 -116
  377. package/skills/audio/src/providers/minimax.ts +0 -83
  378. package/skills/audio/src/providers/openai.ts +0 -115
  379. package/skills/audio/src/types.ts +0 -79
  380. package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
  381. package/skills/audiobook-chapter-proofer/package.json +0 -27
  382. package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
  383. package/skills/browse/src/client.ts +0 -373
  384. package/skills/browse/src/index-local.ts +0 -430
  385. package/skills/browse/src/index.ts +0 -110
  386. package/skills/browse/src/sse-server.ts +0 -919
  387. package/skills/browse/src/types.ts +0 -104
  388. package/skills/consolelog/src/server/index.ts +0 -508
  389. package/skills/create-blog-article/CLAUDE.md +0 -19
  390. package/skills/create-blog-article/src/index.ts +0 -745
  391. package/skills/create-blog-article/tsconfig.json +0 -10
  392. package/skills/deepresearch/src/agents/query-generator.ts +0 -91
  393. package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
  394. package/skills/deepresearch/src/index.ts +0 -224
  395. package/skills/deepresearch/src/research.ts +0 -166
  396. package/skills/deepresearch/src/services/anthropic.ts +0 -69
  397. package/skills/deepresearch/src/services/exa.ts +0 -108
  398. package/skills/deepresearch/src/services/firecrawl.ts +0 -88
  399. package/skills/deepresearch/src/services/openai.ts +0 -81
  400. package/skills/deepresearch/src/types.ts +0 -76
  401. package/skills/deepresearch/src/utils/file.ts +0 -111
  402. package/skills/deepresearch/src/utils/logger.ts +0 -84
  403. package/skills/domainpurchase/src/server/index.ts +0 -332
  404. package/skills/domainsearch/src/server/index.ts +0 -229
  405. package/skills/e2bswarm/README.md +0 -135
  406. package/skills/e2bswarm/SKILL.md +0 -118
  407. package/skills/e2bswarm/examples/tasks-example.json +0 -38
  408. package/skills/e2bswarm/package.json +0 -59
  409. package/skills/e2bswarm/src/commands/collect.ts +0 -135
  410. package/skills/e2bswarm/src/commands/install.ts +0 -164
  411. package/skills/e2bswarm/src/commands/kill.ts +0 -62
  412. package/skills/e2bswarm/src/commands/spawn.ts +0 -134
  413. package/skills/e2bswarm/src/commands/status.ts +0 -90
  414. package/skills/e2bswarm/src/commands/sync.ts +0 -208
  415. package/skills/e2bswarm/src/index.ts +0 -121
  416. package/skills/e2bswarm/src/lib/config.ts +0 -75
  417. package/skills/e2bswarm/src/lib/e2b.ts +0 -490
  418. package/skills/e2bswarm/src/lib/github.ts +0 -253
  419. package/skills/e2bswarm/src/lib/logger.ts +0 -41
  420. package/skills/e2bswarm/src/lib/paths.ts +0 -75
  421. package/skills/e2bswarm/src/lib/tasks.ts +0 -320
  422. package/skills/e2bswarm/src/types/index.ts +0 -107
  423. package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
  424. package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
  425. package/skills/e2bswarm/templates/setup.sh +0 -21
  426. package/skills/e2bswarm/tsconfig.json +0 -19
  427. package/skills/generate-book-cover/src/index.ts +0 -694
  428. package/skills/image/src/index-local.ts +0 -206
  429. package/skills/image/src/index.ts +0 -96
  430. package/skills/image/src/providers/google.ts +0 -79
  431. package/skills/image/src/providers/minimax.ts +0 -94
  432. package/skills/image/src/providers/openai.ts +0 -80
  433. package/skills/image/src/providers/xai.ts +0 -73
  434. package/skills/image/src/types.ts +0 -37
  435. package/skills/logo-design/CLAUDE.md +0 -30
  436. package/skills/logo-design/src/index.ts +0 -322
  437. package/skills/managehook/src/server/index.ts +0 -108
  438. package/skills/managemcp/src/server/index.ts +0 -108
  439. package/skills/manageskill/src/server/index.ts +0 -108
  440. package/skills/music/CLAUDE.md +0 -9
  441. package/skills/music/src/index.ts +0 -94
  442. package/skills/music/tsconfig.json +0 -10
  443. package/skills/pdf-read/src/index.ts +0 -320
  444. package/skills/product-mockup/CLAUDE.md +0 -19
  445. package/skills/product-mockup/src/index.ts +0 -290
  446. package/skills/read-pdf/src/index.ts +0 -388
  447. package/skills/remove-background/src/index.ts +0 -405
  448. package/skills/sound-effects/SKILL.md +0 -34
  449. package/skills/sound-effects/package.json +0 -21
  450. package/skills/sound-effects/src/index.ts +0 -172
  451. package/skills/sound-effects/tsconfig.json +0 -8
  452. package/skills/transcript/src/chunker.ts +0 -215
  453. package/skills/transcript/src/formatter.ts +0 -134
  454. package/skills/transcript/src/index-local.ts +0 -226
  455. package/skills/transcript/src/index.ts +0 -110
  456. package/skills/transcript/src/providers/elevenlabs.ts +0 -133
  457. package/skills/transcript/src/providers/gemini.ts +0 -192
  458. package/skills/transcript/src/providers/index.ts +0 -54
  459. package/skills/transcript/src/providers/openai.ts +0 -203
  460. package/skills/transcript/src/types.ts +0 -106
  461. package/skills/video/.env.example +0 -14
  462. package/skills/video/EXAMPLES.md +0 -266
  463. package/skills/video/LICENSE +0 -192
  464. package/skills/video/README.md +0 -174
  465. package/skills/video/src/cli.ts +0 -155
  466. package/skills/video/src/index-local.ts +0 -148
  467. package/skills/video/src/index.ts +0 -96
  468. package/skills/video/src/providers/google-veo.ts +0 -126
  469. package/skills/video/src/providers/index.ts +0 -22
  470. package/skills/video/src/providers/minimax.ts +0 -100
  471. package/skills/video/src/providers/openai-sora.ts +0 -164
  472. package/skills/video/src/providers/runway.ts +0 -159
  473. package/skills/video/src/types.ts +0 -35
  474. package/skills/video/tsconfig.json +0 -22
  475. package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
  476. package/skills/voiceover-casting-assistant/package.json +0 -27
  477. package/skills/voiceover-casting-assistant/src/index.ts +0 -255
  478. package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
  479. package/skills/webcrawling/src/commands/config.ts +0 -34
  480. package/skills/webcrawling/src/commands/crawl.ts +0 -33
  481. package/skills/webcrawling/src/commands/scrape.ts +0 -32
  482. package/skills/webcrawling/src/commands/sessions.ts +0 -42
  483. package/skills/webcrawling/src/lib/crawler.ts +0 -174
  484. package/skills/webcrawling/src/lib/storage.ts +0 -130
  485. package/skills/webcrawling/src/types/index.ts +0 -45
  486. package/skills/webcrawling/src/utils/logger.ts +0 -30
  487. package/skills/webcrawling/src/utils/paths.ts +0 -28
  488. /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
@@ -1,34 +0,0 @@
1
- import type { Command } from "commander";
2
- import chalk from "chalk";
3
- import { loadConfig, saveConfig, getConfigPath } from "../lib/storage.js";
4
- import * as logger from "../utils/logger.js";
5
-
6
- export function registerConfigCommand(program: Command): void {
7
- const configCmd = program.command("config").description("View and edit configuration");
8
-
9
- configCmd
10
- .command("view")
11
- .option("--json", "Output as JSON")
12
- .action((options) => {
13
- const config = loadConfig();
14
- const hasApiKey = !!(config.firecrawlApiKey || process.env.FIRECRAWL_API_KEY);
15
-
16
- if (options.json) {
17
- console.log(JSON.stringify({ ...config, hasApiKey }, null, 2));
18
- return;
19
- }
20
-
21
- logger.heading("Configuration");
22
- logger.table([
23
- ["Output directory", config.outputDir],
24
- ["Firecrawl API key", hasApiKey ? chalk.green("configured") : chalk.red("not set")],
25
- ]);
26
- });
27
-
28
- configCmd
29
- .command("set <key> <value>")
30
- .action((key: string, value: string) => {
31
- saveConfig({ [key]: value });
32
- logger.success(`Set ${key} = ${key.includes("Key") ? "***" : value}`);
33
- });
34
- }
@@ -1,33 +0,0 @@
1
- import type { Command } from "commander";
2
- import { crawlAndSave } from "../lib/crawler.js";
3
- import * as logger from "../utils/logger.js";
4
-
5
- export function registerCrawlCommand(program: Command): void {
6
- program
7
- .command("crawl <url>")
8
- .description("Crawl an entire website")
9
- .option("-d, --depth <number>", "Maximum crawl depth", "2")
10
- .option("-l, --limit <number>", "Maximum pages to crawl", "10")
11
- .option("--exclude <paths>", "Exclude paths (comma-separated)")
12
- .option("--include <paths>", "Include only paths (comma-separated)")
13
- .action(async (url: string, options) => {
14
- try {
15
- const { sessionId, result } = await crawlAndSave(url, {
16
- maxDepth: parseInt(options.depth),
17
- limit: parseInt(options.limit),
18
- excludePaths: options.exclude?.split(","),
19
- includePaths: options.include?.split(","),
20
- });
21
-
22
- logger.heading("Crawl Complete");
23
- logger.table([
24
- ["Session ID", sessionId],
25
- ["URL", result.url],
26
- ["Pages", result.totalPages.toString()],
27
- ]);
28
- } catch (err) {
29
- logger.error(`Crawl failed: ${err}`);
30
- process.exit(1);
31
- }
32
- });
33
- }
@@ -1,32 +0,0 @@
1
- import type { Command } from "commander";
2
- import { scrapeUrl } from "../lib/crawler.js";
3
- import * as logger from "../utils/logger.js";
4
-
5
- export function registerScrapeCommand(program: Command): void {
6
- program
7
- .command("scrape <url>")
8
- .description("Scrape a single URL")
9
- .option("-f, --format <format>", "Output format: markdown, html, json", "markdown")
10
- .option("--full-page", "Include full page content (not just main)")
11
- .action(async (url: string, options) => {
12
- try {
13
- const result = await scrapeUrl(url, {
14
- formats: options.format === "html" ? ["html"] : ["markdown"],
15
- onlyMainContent: !options.fullPage,
16
- });
17
-
18
- if (options.format === "json") {
19
- console.log(JSON.stringify(result, null, 2));
20
- } else if (options.format === "html") {
21
- console.log(result.html || "No HTML content");
22
- } else {
23
- console.log(result.markdown || "No content");
24
- }
25
-
26
- logger.success("Scrape complete");
27
- } catch (err) {
28
- logger.error(`Scrape failed: ${err}`);
29
- process.exit(1);
30
- }
31
- });
32
- }
@@ -1,42 +0,0 @@
1
- import type { Command } from "commander";
2
- import chalk from "chalk";
3
- import { listSessions } from "../lib/storage.js";
4
- import * as logger from "../utils/logger.js";
5
-
6
- export function registerSessionsCommand(program: Command): void {
7
- program
8
- .command("sessions")
9
- .alias("ls")
10
- .description("List crawl sessions")
11
- .option("--json", "Output as JSON")
12
- .action(async (options) => {
13
- try {
14
- const sessions = listSessions();
15
-
16
- if (sessions.length === 0) {
17
- logger.info("No crawl sessions yet");
18
- return;
19
- }
20
-
21
- if (options.json) {
22
- console.log(JSON.stringify(sessions, null, 2));
23
- return;
24
- }
25
-
26
- logger.heading("Crawl Sessions");
27
-
28
- for (const session of sessions) {
29
- console.log(chalk.cyan(session.id));
30
- console.log(` ${chalk.dim("URL:")} ${session.url}`);
31
- console.log(` ${chalk.dim("Pages:")} ${session.pages}`);
32
- console.log(` ${chalk.dim("Date:")} ${new Date(session.createdAt).toLocaleDateString()}`);
33
- console.log();
34
- }
35
-
36
- logger.info(`${sessions.length} session(s)`);
37
- } catch (err) {
38
- logger.error(`Failed to list sessions: ${err}`);
39
- process.exit(1);
40
- }
41
- });
42
- }
@@ -1,174 +0,0 @@
1
- /**
2
- * Web crawler using Firecrawl API
3
- */
4
-
5
- import * as logger from "../utils/logger.js";
6
- import { loadConfig, createSession, saveSession } from "./storage.js";
7
- import type { ScrapeOptions, CrawlOptions, ScrapeResult, CrawlResult } from "../types/index.js";
8
-
9
- /**
10
- * Get Firecrawl API key
11
- */
12
- function getApiKey(): string {
13
- const config = loadConfig();
14
- const apiKey = config.firecrawlApiKey || process.env.FIRECRAWL_API_KEY;
15
-
16
- if (!apiKey) {
17
- throw new Error("FIRECRAWL_API_KEY not set. Set it in environment or config.");
18
- }
19
-
20
- return apiKey;
21
- }
22
-
23
- /**
24
- * Scrape a single URL
25
- */
26
- export async function scrapeUrl(
27
- url: string,
28
- options: ScrapeOptions = {}
29
- ): Promise<ScrapeResult> {
30
- const apiKey = getApiKey();
31
-
32
- logger.info(`Scraping: ${url}`);
33
-
34
- const response = await fetch("https://api.firecrawl.dev/v1/scrape", {
35
- method: "POST",
36
- headers: {
37
- "Content-Type": "application/json",
38
- Authorization: `Bearer ${apiKey}`,
39
- },
40
- body: JSON.stringify({
41
- url,
42
- formats: options.formats || ["markdown"],
43
- onlyMainContent: options.onlyMainContent ?? true,
44
- waitFor: options.waitFor,
45
- }),
46
- });
47
-
48
- if (!response.ok) {
49
- const error = await response.text();
50
- throw new Error(`Firecrawl API error: ${error}`);
51
- }
52
-
53
- const data = (await response.json()) as any;
54
-
55
- if (!data.success) {
56
- throw new Error(data.error || "Scrape failed");
57
- }
58
-
59
- return {
60
- url,
61
- markdown: data.data?.markdown,
62
- html: data.data?.html,
63
- links: data.data?.links,
64
- metadata: data.data?.metadata,
65
- };
66
- }
67
-
68
- /**
69
- * Crawl an entire website
70
- */
71
- export async function crawlWebsite(
72
- url: string,
73
- options: CrawlOptions = {}
74
- ): Promise<CrawlResult> {
75
- const apiKey = getApiKey();
76
-
77
- logger.info(`Starting crawl: ${url}`);
78
- logger.info(`Max depth: ${options.maxDepth || 2}, Limit: ${options.limit || 10}`);
79
-
80
- // Start crawl job
81
- const startResponse = await fetch("https://api.firecrawl.dev/v1/crawl", {
82
- method: "POST",
83
- headers: {
84
- "Content-Type": "application/json",
85
- Authorization: `Bearer ${apiKey}`,
86
- },
87
- body: JSON.stringify({
88
- url,
89
- maxDepth: options.maxDepth || 2,
90
- limit: options.limit || 10,
91
- excludePaths: options.excludePaths,
92
- includePaths: options.includePaths,
93
- scrapeOptions: {
94
- formats: ["markdown"],
95
- onlyMainContent: true,
96
- },
97
- }),
98
- });
99
-
100
- if (!startResponse.ok) {
101
- const error = await startResponse.text();
102
- throw new Error(`Failed to start crawl: ${error}`);
103
- }
104
-
105
- const startData = (await startResponse.json()) as any;
106
-
107
- if (!startData.success) {
108
- throw new Error(startData.error || "Failed to start crawl");
109
- }
110
-
111
- const jobId = startData.id;
112
- logger.info(`Crawl job started: ${jobId}`);
113
-
114
- // Poll for results
115
- const pages: ScrapeResult[] = [];
116
- let completed = false;
117
-
118
- while (!completed) {
119
- await new Promise((r) => setTimeout(r, 2000));
120
-
121
- const statusResponse = await fetch(`https://api.firecrawl.dev/v1/crawl/${jobId}`, {
122
- headers: {
123
- Authorization: `Bearer ${apiKey}`,
124
- },
125
- });
126
-
127
- if (!statusResponse.ok) {
128
- throw new Error("Failed to check crawl status");
129
- }
130
-
131
- const statusData = (await statusResponse.json()) as any;
132
-
133
- if (statusData.status === "completed") {
134
- completed = true;
135
-
136
- for (const page of statusData.data || []) {
137
- pages.push({
138
- url: page.url,
139
- markdown: page.markdown,
140
- html: page.html,
141
- metadata: page.metadata,
142
- });
143
- }
144
- } else if (statusData.status === "failed") {
145
- throw new Error(statusData.error || "Crawl failed");
146
- } else {
147
- logger.info(`Crawling... (${statusData.completed || 0}/${statusData.total || "?"} pages)`);
148
- }
149
- }
150
-
151
- logger.success(`Crawl complete: ${pages.length} pages`);
152
-
153
- return {
154
- url,
155
- pages,
156
- totalPages: pages.length,
157
- };
158
- }
159
-
160
- /**
161
- * Crawl and save to session
162
- */
163
- export async function crawlAndSave(
164
- url: string,
165
- options: CrawlOptions = {}
166
- ): Promise<{ sessionId: string; result: CrawlResult }> {
167
- const { sessionId, sessionDir } = createSession(url);
168
-
169
- const result = await crawlWebsite(url, options);
170
-
171
- saveSession(sessionDir, result);
172
-
173
- return { sessionId, result };
174
- }
@@ -1,130 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from "fs";
2
- import { join } from "path";
3
- import { getDataDir, getConfigPath, getSessionsDir, generateSessionId, getDomain } from "../utils/paths.js";
4
- import type { Config, Session, CrawlResult } from "../types/index.js";
5
-
6
- const DEFAULT_CONFIG: Config = {
7
- outputDir: getSessionsDir(),
8
- };
9
-
10
- export function ensureDataDir(): void {
11
- const dir = getDataDir();
12
- if (!existsSync(dir)) {
13
- mkdirSync(dir, { recursive: true });
14
- }
15
- }
16
-
17
- export function loadConfig(): Config {
18
- ensureDataDir();
19
- const configPath = getConfigPath();
20
-
21
- if (existsSync(configPath)) {
22
- try {
23
- return { ...DEFAULT_CONFIG, ...JSON.parse(readFileSync(configPath, "utf-8")) };
24
- } catch {
25
- return DEFAULT_CONFIG;
26
- }
27
- }
28
-
29
- return DEFAULT_CONFIG;
30
- }
31
-
32
- export function saveConfig(config: Partial<Config>): void {
33
- ensureDataDir();
34
- const current = loadConfig();
35
- writeFileSync(getConfigPath(), JSON.stringify({ ...current, ...config }, null, 2));
36
- }
37
-
38
- export { getConfigPath };
39
-
40
- export function createSession(url: string): { sessionId: string; sessionDir: string } {
41
- const config = loadConfig();
42
- const sessionId = generateSessionId();
43
- const domain = getDomain(url);
44
- const sessionDir = join(config.outputDir, domain, sessionId);
45
-
46
- mkdirSync(sessionDir, { recursive: true });
47
-
48
- return { sessionId, sessionDir };
49
- }
50
-
51
- export function saveSession(sessionDir: string, result: CrawlResult): void {
52
- // Save metadata
53
- const metadataPath = join(sessionDir, "metadata.json");
54
- writeFileSync(
55
- metadataPath,
56
- JSON.stringify(
57
- {
58
- url: result.url,
59
- totalPages: result.totalPages,
60
- crawledAt: new Date().toISOString(),
61
- },
62
- null,
63
- 2
64
- )
65
- );
66
-
67
- // Save each page
68
- for (let i = 0; i < result.pages.length; i++) {
69
- const page = result.pages[i];
70
- const pageDir = join(sessionDir, `page_${i}`);
71
- mkdirSync(pageDir, { recursive: true });
72
-
73
- if (page.markdown) {
74
- writeFileSync(join(pageDir, "content.md"), page.markdown);
75
- }
76
- if (page.html) {
77
- writeFileSync(join(pageDir, "content.html"), page.html);
78
- }
79
- writeFileSync(
80
- join(pageDir, "metadata.json"),
81
- JSON.stringify({ url: page.url, ...page.metadata }, null, 2)
82
- );
83
- }
84
-
85
- // Generate llms.txt
86
- const llmsTxt = result.pages.map((p) => p.markdown || "").join("\n\n---\n\n");
87
- writeFileSync(join(sessionDir, "llms.txt"), llmsTxt);
88
- }
89
-
90
- export function listSessions(): Session[] {
91
- const config = loadConfig();
92
-
93
- if (!existsSync(config.outputDir)) {
94
- return [];
95
- }
96
-
97
- const sessions: Session[] = [];
98
- const domains = readdirSync(config.outputDir, { withFileTypes: true })
99
- .filter((d) => d.isDirectory())
100
- .map((d) => d.name);
101
-
102
- for (const domain of domains) {
103
- const domainDir = join(config.outputDir, domain);
104
- const sessionDirs = readdirSync(domainDir, { withFileTypes: true })
105
- .filter((d) => d.isDirectory())
106
- .map((d) => d.name);
107
-
108
- for (const sessionId of sessionDirs) {
109
- const metadataPath = join(domainDir, sessionId, "metadata.json");
110
- if (existsSync(metadataPath)) {
111
- try {
112
- const metadata = JSON.parse(readFileSync(metadataPath, "utf-8"));
113
- sessions.push({
114
- id: sessionId,
115
- url: metadata.url,
116
- createdAt: metadata.crawledAt,
117
- pages: metadata.totalPages,
118
- });
119
- } catch {
120
- // Skip invalid sessions
121
- }
122
- }
123
- }
124
- }
125
-
126
- // Sort by date, newest first
127
- sessions.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
128
-
129
- return sessions;
130
- }
@@ -1,45 +0,0 @@
1
- /**
2
- * Types for web crawling service
3
- */
4
-
5
- export interface ScrapeOptions {
6
- formats?: ("markdown" | "html" | "links")[];
7
- onlyMainContent?: boolean;
8
- waitFor?: number;
9
- }
10
-
11
- export interface CrawlOptions {
12
- maxDepth?: number;
13
- limit?: number;
14
- excludePaths?: string[];
15
- includePaths?: string[];
16
- }
17
-
18
- export interface ScrapeResult {
19
- url: string;
20
- markdown?: string;
21
- html?: string;
22
- links?: string[];
23
- metadata?: {
24
- title?: string;
25
- description?: string;
26
- };
27
- }
28
-
29
- export interface CrawlResult {
30
- url: string;
31
- pages: ScrapeResult[];
32
- totalPages: number;
33
- }
34
-
35
- export interface Session {
36
- id: string;
37
- url: string;
38
- createdAt: string;
39
- pages: number;
40
- }
41
-
42
- export interface Config {
43
- outputDir: string;
44
- firecrawlApiKey?: string;
45
- }
@@ -1,30 +0,0 @@
1
- import chalk from "chalk";
2
-
3
- export function info(message: string): void {
4
- console.log(chalk.blue("ℹ"), message);
5
- }
6
-
7
- export function success(message: string): void {
8
- console.log(chalk.green("✓"), message);
9
- }
10
-
11
- export function warn(message: string): void {
12
- console.log(chalk.yellow("⚠"), message);
13
- }
14
-
15
- export function error(message: string): void {
16
- console.log(chalk.red("✗"), message);
17
- }
18
-
19
- export function heading(message: string): void {
20
- console.log();
21
- console.log(chalk.bold.underline(message));
22
- console.log();
23
- }
24
-
25
- export function table(rows: [string, string][]): void {
26
- const maxKeyLen = Math.max(...rows.map(([k]) => k.length));
27
- for (const [key, value] of rows) {
28
- console.log(` ${chalk.dim(key.padEnd(maxKeyLen))} ${value}`);
29
- }
30
- }
@@ -1,28 +0,0 @@
1
- import { homedir } from "os";
2
- import { join } from "path";
3
-
4
- export function getDataDir(): string {
5
- return process.env.DATA_DIR || join(homedir(), ".service", "service-webcrawling");
6
- }
7
-
8
- export function getSessionsDir(): string {
9
- return join(getDataDir(), "sessions");
10
- }
11
-
12
- export function getConfigPath(): string {
13
- return join(getDataDir(), "config.json");
14
- }
15
-
16
- export function getDomain(url: string): string {
17
- try {
18
- return new URL(url).hostname;
19
- } catch {
20
- return url;
21
- }
22
- }
23
-
24
- export function generateSessionId(): string {
25
- const date = new Date().toISOString().split("T")[0].replace(/-/g, "");
26
- const random = Math.random().toString(36).substring(2, 8);
27
- return `${date}_${random}`;
28
- }