@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,10 +0,0 @@
1
- {
2
- "extends": "../tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "dist"
5
- },
6
- "include": [
7
- "src/**/*",
8
- "bin/**/*"
9
- ]
10
- }
@@ -1,91 +0,0 @@
1
- import type { ModelProvider, QueryGenerationResult } from "../types";
2
- import * as anthropic from "../services/anthropic";
3
- import * as openai from "../services/openai";
4
-
5
- const SYSTEM_PROMPT = `You are a research query generation expert. Your task is to generate diverse, effective search queries that will help gather comprehensive information on a given topic.
6
-
7
- Generate queries that cover different aspects:
8
- - Definitions and fundamentals
9
- - How it works / technical implementation
10
- - Best practices and recommendations
11
- - Common problems, challenges, and solutions
12
- - Comparisons with alternatives
13
- - Recent developments and trends
14
- - Expert opinions and case studies
15
- - Real-world applications and examples
16
-
17
- Make each query specific and searchable. Avoid overly generic queries.`;
18
-
19
- function buildUserPrompt(topic: string, queryCount: number): string {
20
- return `Research Topic: "${topic}"
21
-
22
- Generate exactly ${queryCount} diverse search queries that will help gather comprehensive information on this topic. The queries should cover different angles and aspects to ensure thorough research.
23
-
24
- Respond with a JSON object in this exact format:
25
- {
26
- "queries": ["query1", "query2", ...],
27
- "reasoning": "Brief explanation of the query strategy"
28
- }`;
29
- }
30
-
31
- export async function generateQueries(
32
- topic: string,
33
- queryCount: number,
34
- model: ModelProvider
35
- ): Promise<QueryGenerationResult> {
36
- const userPrompt = buildUserPrompt(topic, queryCount);
37
-
38
- if (model === "claude") {
39
- return anthropic.generateJson<QueryGenerationResult>(
40
- SYSTEM_PROMPT,
41
- userPrompt,
42
- { temperature: 0.5 }
43
- );
44
- } else {
45
- return openai.generateJson<QueryGenerationResult>(
46
- SYSTEM_PROMPT,
47
- userPrompt,
48
- { temperature: 0.5 }
49
- );
50
- }
51
- }
52
-
53
- export async function generateFollowUpQueries(
54
- topic: string,
55
- existingFindings: string,
56
- queryCount: number,
57
- model: ModelProvider
58
- ): Promise<QueryGenerationResult> {
59
- const followUpPrompt = `Research Topic: "${topic}"
60
-
61
- Based on initial research findings, generate ${queryCount} follow-up queries to fill gaps and explore deeper.
62
-
63
- Initial Findings Summary:
64
- ${existingFindings}
65
-
66
- Generate queries that:
67
- 1. Explore areas not covered in initial findings
68
- 2. Go deeper into important subtopics
69
- 3. Find contradicting viewpoints or alternative perspectives
70
- 4. Discover more recent information
71
-
72
- Respond with a JSON object in this exact format:
73
- {
74
- "queries": ["query1", "query2", ...],
75
- "reasoning": "Brief explanation of what gaps these queries address"
76
- }`;
77
-
78
- if (model === "claude") {
79
- return anthropic.generateJson<QueryGenerationResult>(
80
- SYSTEM_PROMPT,
81
- followUpPrompt,
82
- { temperature: 0.6 }
83
- );
84
- } else {
85
- return openai.generateJson<QueryGenerationResult>(
86
- SYSTEM_PROMPT,
87
- followUpPrompt,
88
- { temperature: 0.6 }
89
- );
90
- }
91
- }
@@ -1,111 +0,0 @@
1
- import type { ModelProvider, Source, SynthesisResult } from "../types";
2
- import * as anthropic from "../services/anthropic";
3
- import * as openai from "../services/openai";
4
-
5
- const SYSTEM_PROMPT = `You are an expert research analyst who synthesizes information from multiple sources into comprehensive, well-structured reports.
6
-
7
- Your reports should:
8
- - Be factual and objective
9
- - Cite sources using [1], [2], etc. notation
10
- - Present multiple perspectives when they exist
11
- - Highlight areas of consensus and disagreement
12
- - Use clear markdown formatting
13
- - Be thorough but concise`;
14
-
15
- function formatSources(sources: Source[]): string {
16
- return sources
17
- .map(
18
- (s) => `
19
- [Source ${s.id}] ${s.title}
20
- URL: ${s.url}
21
- ${s.publishedDate ? `Published: ${s.publishedDate}` : ""}
22
- ${s.author ? `Author: ${s.author}` : ""}
23
-
24
- Content:
25
- ${s.content.slice(0, 2500)}${s.content.length > 2500 ? "..." : ""}
26
- `
27
- )
28
- .join("\n---\n");
29
- }
30
-
31
- function buildSynthesisPrompt(topic: string, sources: Source[]): string {
32
- return `Create a comprehensive research report on: "${topic}"
33
-
34
- Based on the following ${sources.length} sources:
35
-
36
- ${formatSources(sources)}
37
-
38
- Write a research report with these sections:
39
-
40
- ## Executive Summary
41
- A 2-3 paragraph overview of the key findings.
42
-
43
- ## Key Findings
44
- Bullet points of the most important discoveries.
45
-
46
- ## Detailed Analysis
47
- Organized by subtopic, with in-depth coverage. Use headers for each major subtopic.
48
-
49
- ## Conclusions
50
- Summary of insights and any recommendations.
51
-
52
- Requirements:
53
- - Cite sources inline using [1], [2], etc.
54
- - Be objective and factual
55
- - Present conflicting viewpoints if they exist
56
- - Use markdown formatting
57
- - Aim for thoroughness while staying focused`;
58
- }
59
-
60
- export async function synthesizeReport(
61
- topic: string,
62
- sources: Source[],
63
- model: ModelProvider
64
- ): Promise<SynthesisResult> {
65
- if (sources.length === 0) {
66
- return {
67
- report:
68
- "## No Sources Found\n\nNo relevant sources were found for this research topic. Please try refining your query or using different search terms.",
69
- };
70
- }
71
-
72
- const userPrompt = buildSynthesisPrompt(topic, sources);
73
-
74
- const report =
75
- model === "claude"
76
- ? await anthropic.generateText(SYSTEM_PROMPT, userPrompt, {
77
- maxTokens: 16384,
78
- temperature: 0.4,
79
- })
80
- : await openai.generateText(SYSTEM_PROMPT, userPrompt, {
81
- maxTokens: 16384,
82
- temperature: 0.4,
83
- });
84
-
85
- return { report };
86
- }
87
-
88
- export async function generateFindingsSummary(
89
- sources: Source[],
90
- model: ModelProvider
91
- ): Promise<string> {
92
- if (sources.length === 0) {
93
- return "No findings yet.";
94
- }
95
-
96
- const prompt = `Summarize the key themes and findings from these sources in 2-3 paragraphs:
97
-
98
- ${sources.slice(0, 15).map((s) => `- ${s.title}: ${s.content.slice(0, 500)}`).join("\n")}
99
-
100
- Focus on:
101
- 1. Main themes covered
102
- 2. Key facts and findings
103
- 3. Any gaps or areas needing more research`;
104
-
105
- const systemPrompt =
106
- "You are a research assistant. Provide concise summaries of research findings.";
107
-
108
- return model === "claude"
109
- ? anthropic.generateText(systemPrompt, prompt, { maxTokens: 1000 })
110
- : openai.generateText(systemPrompt, prompt, { maxTokens: 1000 });
111
- }
@@ -1,224 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { program } from "commander";
4
- import { mkdir, writeFile } from "fs/promises";
5
- import { join } from "path";
6
- import { homedir } from "os";
7
- import { runResearch } from "./research";
8
- import type { DepthLevel, ModelProvider, ResearchConfig } from "./types";
9
- import logger from "./utils/logger";
10
-
11
- type Platform = "claude" | "codex";
12
-
13
- // ============================================================================
14
- // Install Command
15
- // ============================================================================
16
-
17
- const SKILL_MD_CONTENT = `---
18
- name: deepresearch
19
- description: Perform deep research on any topic using Exa.ai for parallel semantic search and Claude/OpenAI for synthesis. Use when you need comprehensive research reports with citations, analysis of topics from multiple angles, or thorough investigation of technical subjects.
20
- ---
21
-
22
- # Deep Research
23
-
24
- Agentic deep research skill using Exa.ai for search and Claude/OpenAI for synthesis.
25
-
26
- ## CLI Usage
27
-
28
- Run the CLI directly:
29
-
30
- \`\`\`bash
31
- # Basic usage
32
- deepresearch "What are the best practices for building RAG systems?"
33
-
34
- # Quick research (6 queries)
35
- deepresearch "What is vector search?" --depth quick
36
-
37
- # Normal research (15 queries, default)
38
- deepresearch "Best practices for ML systems" --depth normal
39
-
40
- # Deep research (30 queries, 2 iterations)
41
- deepresearch "Compare React vs Vue" --depth deep
42
-
43
- # Use OpenAI instead of Claude
44
- deepresearch "State of AI in 2024" --model openai
45
-
46
- # Custom output location
47
- deepresearch "Kubernetes best practices" --output ./k8s-research.md
48
-
49
- # Include raw sources JSON
50
- deepresearch "GraphQL vs REST APIs" --json
51
- \`\`\`
52
-
53
- ## Options
54
-
55
- | Option | Description | Default |
56
- |--------|-------------|---------|
57
- | \`-d, --depth <level>\` | Research depth: quick, normal, deep | normal |
58
- | \`-m, --model <provider>\` | LLM: claude or openai | claude |
59
- | \`-o, --output <path>\` | Custom output path | exports/ |
60
- | \`-j, --json\` | Also save sources as JSON | false |
61
- | \`--no-firecrawl\` | Skip deep scraping | false |
62
-
63
- ## Depth Levels
64
-
65
- | Level | Queries | Iterations | Use Case |
66
- |-------|---------|------------|----------|
67
- | quick | 6 | 1 | Fast overview |
68
- | normal | 15 | 1 | Standard research |
69
- | deep | 30 | 2 | Thorough analysis |
70
-
71
- ## Data Directories
72
-
73
- - **exports/** - Generated research reports
74
- - **uploads/** - User-provided files for context
75
- - **logs/** - Execution logs
76
-
77
- ## Requirements
78
-
79
- - \`EXA_API_KEY\` in \`~/.secrets\` - Required for search
80
- - \`ANTHROPIC_API_KEY\` in \`~/.secrets\` - Required for Claude synthesis
81
- - \`OPENAI_API_KEY\` in \`~/.secrets\` - Required for OpenAI synthesis
82
- - \`FIRECRAWL_API_KEY\` in \`~/.secrets\` - Optional for deep scraping
83
- - Bun runtime with \`deepresearch\` installed globally
84
-
85
- ## Install CLI
86
-
87
- \`\`\`bash
88
- bun add -g @hasnaxyz/deepresearch
89
- \`\`\`
90
- `;
91
-
92
- async function ensureDir(dir: string): Promise<void> {
93
- await mkdir(dir, { recursive: true });
94
- }
95
-
96
- function getSkillsDir(platform: Platform, local: boolean): string {
97
- if (local) {
98
- return platform === "claude" ? ".claude/skills" : ".codex/skills";
99
- }
100
- const home = homedir();
101
- return platform === "claude"
102
- ? join(home, ".claude", "skills")
103
- : join(home, ".codex", "skills");
104
- }
105
-
106
- async function installSkill(options: {
107
- platform: Platform;
108
- local: boolean;
109
- }): Promise<void> {
110
- const skillName = "deepresearch";
111
- const baseDir = getSkillsDir(options.platform, options.local);
112
- const skillDir = join(baseDir, skillName);
113
-
114
- try {
115
- logger.startSpinner(`Installing skill to ${options.platform === "claude" ? "Claude Code" : "Codex"}...`);
116
-
117
- // Create skill directory structure
118
- await ensureDir(skillDir);
119
- await ensureDir(join(skillDir, "exports"));
120
- await ensureDir(join(skillDir, "uploads"));
121
- await ensureDir(join(skillDir, "logs"));
122
-
123
- // Write SKILL.md
124
- const skillMdPath = join(skillDir, "SKILL.md");
125
- await writeFile(skillMdPath, SKILL_MD_CONTENT, "utf-8");
126
-
127
- logger.succeedSpinner(`Installed to ${skillDir}`);
128
-
129
- console.log();
130
- logger.success(`Skill ${skillName} installed successfully`);
131
- console.log();
132
- console.log("Created structure:");
133
- console.log(` ${skillDir}/`);
134
- console.log(` ├── SKILL.md`);
135
- console.log(` ├── exports/`);
136
- console.log(` ├── uploads/`);
137
- console.log(` └── logs/`);
138
- console.log();
139
- console.log(`Invoke with: /${skillName}`);
140
-
141
- } catch (error) {
142
- logger.failSpinner("Install failed");
143
- if (error instanceof Error) {
144
- logger.error(error.message);
145
- }
146
- process.exit(1);
147
- }
148
- }
149
-
150
- // ============================================================================
151
- // CLI Setup
152
- // ============================================================================
153
-
154
- program
155
- .name("deepresearch")
156
- .description("Agentic deep research using Exa.ai search and LLM synthesis")
157
- .version("0.1.1");
158
-
159
- // Install subcommand
160
- program
161
- .command("install")
162
- .description("Install this skill to Claude Code or Codex")
163
- .option("--claude", "Install to Claude Code (~/.claude/skills/)")
164
- .option("--codex", "Install to OpenAI Codex (~/.codex/skills/)")
165
- .option("--local", "Install to local repo (.claude/skills/ or .codex/skills/)")
166
- .action(async (options) => {
167
- if (!options.claude && !options.codex) {
168
- logger.error("Please specify --claude or --codex");
169
- process.exit(1);
170
- }
171
-
172
- const platforms: Platform[] = [];
173
- if (options.claude) platforms.push("claude");
174
- if (options.codex) platforms.push("codex");
175
-
176
- for (const platform of platforms) {
177
- await installSkill({
178
- platform,
179
- local: options.local || false,
180
- });
181
- }
182
- });
183
-
184
- // Research command (default)
185
- program
186
- .argument("<topic>", "Research topic or question")
187
- .option("-d, --depth <level>", "Research depth: quick, normal, deep", "normal")
188
- .option("-m, --model <provider>", "LLM for synthesis: claude, openai", "claude")
189
- .option("-o, --output <path>", "Custom output path for report")
190
- .option("-j, --json", "Also output sources as JSON")
191
- .option("--no-firecrawl", "Skip Firecrawl deep scraping")
192
- .action(async (topic: string, options) => {
193
- const validDepths: DepthLevel[] = ["quick", "normal", "deep"];
194
- const validModels: ModelProvider[] = ["claude", "openai"];
195
-
196
- if (!validDepths.includes(options.depth as DepthLevel)) {
197
- logger.error(`Invalid depth: ${options.depth}. Use: ${validDepths.join(", ")}`);
198
- process.exit(1);
199
- }
200
-
201
- if (!validModels.includes(options.model as ModelProvider)) {
202
- logger.error(`Invalid model: ${options.model}. Use: ${validModels.join(", ")}`);
203
- process.exit(1);
204
- }
205
-
206
- const config: ResearchConfig = {
207
- topic,
208
- depth: options.depth as DepthLevel,
209
- model: options.model as ModelProvider,
210
- output: options.output,
211
- json: options.json,
212
- firecrawl: options.firecrawl,
213
- };
214
-
215
- try {
216
- await runResearch(config);
217
- } catch (error) {
218
- logger.stopSpinner();
219
- logger.error(error instanceof Error ? error.message : "Unknown error");
220
- process.exit(1);
221
- }
222
- });
223
-
224
- program.parse();
@@ -1,166 +0,0 @@
1
- import type { ResearchConfig, ResearchReport, Source, DepthLevel } from "./types";
2
- import { DEPTH_CONFIG } from "./types";
3
- import { generateQueries, generateFollowUpQueries } from "./agents/query-generator";
4
- import { synthesizeReport, generateFindingsSummary } from "./agents/synthesizer";
5
- import { searchInBatches, isExaConfigured } from "./services/exa";
6
- import { scrapeUrls, isFirecrawlConfigured } from "./services/firecrawl";
7
- import { isAnthropicConfigured } from "./services/anthropic";
8
- import { isOpenAIConfigured } from "./services/openai";
9
- import { saveReport, saveSourcesJson } from "./utils/file";
10
- import logger from "./utils/logger";
11
-
12
- export function validateConfig(config: ResearchConfig): void {
13
- if (!isExaConfigured()) {
14
- throw new Error("EXA_API_KEY is required for search. Set it in ~/.secrets");
15
- }
16
-
17
- if (config.model === "claude" && !isAnthropicConfigured()) {
18
- throw new Error("ANTHROPIC_API_KEY is required for Claude synthesis. Set it in ~/.secrets");
19
- }
20
-
21
- if (config.model === "openai" && !isOpenAIConfigured()) {
22
- throw new Error("OPENAI_API_KEY is required for OpenAI synthesis. Set it in ~/.secrets");
23
- }
24
-
25
- if (config.firecrawl && !isFirecrawlConfigured()) {
26
- logger.warn("FIRECRAWL_API_KEY not set. Skipping deep scraping.");
27
- }
28
- }
29
-
30
- async function runSearchIteration(
31
- topic: string,
32
- depth: DepthLevel,
33
- model: ResearchConfig["model"],
34
- existingSources: Source[],
35
- iterationNum: number
36
- ): Promise<Source[]> {
37
- const settings = DEPTH_CONFIG[depth];
38
- const queryCount = iterationNum === 1
39
- ? settings.queryCount
40
- : Math.floor(settings.queryCount / 2);
41
-
42
- logger.startSpinner(`Generating ${queryCount} search queries (iteration ${iterationNum})...`);
43
-
44
- let queries: string[];
45
- if (iterationNum === 1) {
46
- const result = await generateQueries(topic, queryCount, model);
47
- queries = result.queries;
48
- } else {
49
- const summary = await generateFindingsSummary(existingSources, model);
50
- const result = await generateFollowUpQueries(topic, summary, queryCount, model);
51
- queries = result.queries;
52
- }
53
-
54
- logger.succeedSpinner(`Generated ${queries.length} queries`);
55
-
56
- logger.startSpinner("Searching...");
57
- const newSources = await searchInBatches(queries, settings.resultsPerQuery);
58
- logger.succeedSpinner(`Found ${newSources.length} unique sources`);
59
-
60
- return newSources;
61
- }
62
-
63
- async function deepScrapeTopSources(
64
- sources: Source[],
65
- maxScrape: number = 5
66
- ): Promise<Source[]> {
67
- if (!isFirecrawlConfigured()) {
68
- return sources;
69
- }
70
-
71
- const topSources = sources
72
- .sort((a, b) => (b.relevanceScore || 0) - (a.relevanceScore || 0))
73
- .slice(0, maxScrape);
74
-
75
- logger.startSpinner(`Deep scraping top ${topSources.length} sources with Firecrawl...`);
76
-
77
- const scrapeResults = await scrapeUrls(topSources.map((s) => s.url));
78
-
79
- let enhancedCount = 0;
80
- for (const result of scrapeResults) {
81
- if (result.success && result.markdown) {
82
- const source = sources.find((s) => s.url === result.url);
83
- if (source && result.markdown.length > source.content.length) {
84
- source.content = result.markdown.slice(0, 8000);
85
- enhancedCount++;
86
- }
87
- }
88
- }
89
-
90
- logger.succeedSpinner(`Enhanced ${enhancedCount} sources with deeper content`);
91
-
92
- return sources;
93
- }
94
-
95
- export async function runResearch(config: ResearchConfig): Promise<ResearchReport> {
96
- const { topic, depth, model, firecrawl, output, json } = config;
97
- const settings = DEPTH_CONFIG[depth];
98
-
99
- logger.header("Deep Research");
100
- logger.stats("Topic", topic);
101
- logger.stats("Depth", `${depth} (${settings.queryCount} queries, ${settings.iterations} iteration${settings.iterations > 1 ? "s" : ""})`);
102
- logger.stats("Model", model);
103
- logger.divider();
104
-
105
- validateConfig(config);
106
-
107
- let allSources: Source[] = [];
108
-
109
- for (let iteration = 1; iteration <= settings.iterations; iteration++) {
110
- if (settings.iterations > 1) {
111
- logger.info(`Starting iteration ${iteration} of ${settings.iterations}`);
112
- }
113
-
114
- const newSources = await runSearchIteration(
115
- topic,
116
- depth,
117
- model,
118
- allSources,
119
- iteration
120
- );
121
-
122
- const existingUrls = new Set(allSources.map((s) => s.url));
123
- const uniqueNewSources = newSources.filter((s) => !existingUrls.has(s.url));
124
-
125
- let nextId = allSources.length + 1;
126
- for (const source of uniqueNewSources) {
127
- source.id = nextId++;
128
- }
129
-
130
- allSources = [...allSources, ...uniqueNewSources];
131
- logger.info(`Total unique sources: ${allSources.length}`);
132
- }
133
-
134
- if (firecrawl !== false && isFirecrawlConfigured()) {
135
- allSources = await deepScrapeTopSources(allSources);
136
- }
137
-
138
- logger.startSpinner("Synthesizing report...");
139
- const synthesis = await synthesizeReport(topic, allSources, model);
140
- logger.succeedSpinner("Report synthesized");
141
-
142
- const report: ResearchReport = {
143
- topic,
144
- depth,
145
- generatedAt: new Date().toISOString(),
146
- queryCount: settings.queryCount * settings.iterations,
147
- sourceCount: allSources.length,
148
- report: synthesis.report,
149
- sources: allSources,
150
- };
151
-
152
- const reportPath = await saveReport(report, output);
153
- logger.success(`Report saved: ${reportPath}`);
154
-
155
- if (json) {
156
- const sourcesPath = await saveSourcesJson(allSources, topic, output);
157
- logger.success(`Sources JSON saved: ${sourcesPath}`);
158
- }
159
-
160
- logger.divider();
161
- logger.header("Research Complete");
162
- logger.stats("Sources analyzed", allSources.length);
163
- logger.stats("Output", reportPath);
164
-
165
- return report;
166
- }
@@ -1,69 +0,0 @@
1
- import Anthropic from "@anthropic-ai/sdk";
2
-
3
- let client: Anthropic | null = null;
4
-
5
- function getClient(): Anthropic {
6
- if (!client) {
7
- const apiKey = process.env.ANTHROPIC_API_KEY;
8
- if (!apiKey) {
9
- throw new Error(
10
- "ANTHROPIC_API_KEY not found. Please set it in ~/.secrets or environment."
11
- );
12
- }
13
- client = new Anthropic({ apiKey });
14
- }
15
- return client;
16
- }
17
-
18
- export async function generateText(
19
- systemPrompt: string,
20
- userPrompt: string,
21
- options?: {
22
- maxTokens?: number;
23
- temperature?: number;
24
- }
25
- ): Promise<string> {
26
- const anthropic = getClient();
27
-
28
- const response = await anthropic.messages.create({
29
- model: "claude-sonnet-4-20250514",
30
- max_tokens: options?.maxTokens || 8192,
31
- temperature: options?.temperature ?? 0.7,
32
- system: systemPrompt,
33
- messages: [{ role: "user", content: userPrompt }],
34
- });
35
-
36
- const textBlock = response.content.find((block) => block.type === "text");
37
- if (!textBlock || textBlock.type !== "text") {
38
- throw new Error("No text response from Claude");
39
- }
40
-
41
- return textBlock.text;
42
- }
43
-
44
- export async function generateJson<T>(
45
- systemPrompt: string,
46
- userPrompt: string,
47
- options?: {
48
- maxTokens?: number;
49
- temperature?: number;
50
- }
51
- ): Promise<T> {
52
- const text = await generateText(systemPrompt, userPrompt, {
53
- ...options,
54
- temperature: options?.temperature ?? 0.3,
55
- });
56
-
57
- const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
58
- const jsonStr = jsonMatch ? jsonMatch[1].trim() : text.trim();
59
-
60
- try {
61
- return JSON.parse(jsonStr) as T;
62
- } catch {
63
- throw new Error(`Failed to parse JSON from Claude response: ${text.slice(0, 200)}`);
64
- }
65
- }
66
-
67
- export function isAnthropicConfigured(): boolean {
68
- return !!process.env.ANTHROPIC_API_KEY;
69
- }