@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,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
- }