@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
@@ -0,0 +1,67 @@
1
+ import { mkdir, writeFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import { envConfig } from "./runtime";
4
+
5
+ // Logging Utility
6
+ // ============================================================================
7
+
8
+ export class Logger {
9
+ private logFile: string;
10
+ private sessionId: string;
11
+
12
+ constructor(private config = envConfig) {
13
+ this.sessionId = new Date().toISOString().replace(/[:.]/g, "-");
14
+ this.logFile = join(
15
+ this.config.SKILLS_PROJECT_ROOT,
16
+ this.config.SKILLS_OUTPUT_DIR,
17
+ "logs",
18
+ "generate-presentation",
19
+ `${this.sessionId}.log`
20
+ );
21
+ this.initLogFile();
22
+ }
23
+
24
+ private async initLogFile() {
25
+ const logDir = join(
26
+ this.config.SKILLS_PROJECT_ROOT,
27
+ this.config.SKILLS_OUTPUT_DIR,
28
+ "logs",
29
+ "generate-presentation"
30
+ );
31
+ await mkdir(logDir, { recursive: true });
32
+ }
33
+
34
+ private timestamp(): string {
35
+ return new Date().toISOString().replace("T", " ").split(".")[0];
36
+ }
37
+
38
+ async log(message: string) {
39
+ const logMessage = `[${this.timestamp()}] ${message}`;
40
+ console.log(logMessage);
41
+ try {
42
+ await writeFile(this.logFile, logMessage + "\n", { flag: "a" });
43
+ } catch (error) {
44
+ // Silent fail for logging
45
+ }
46
+ }
47
+
48
+ async error(message: string) {
49
+ const errorMessage = `[${this.timestamp()}] ERROR: ${message}`;
50
+ console.error(errorMessage);
51
+ try {
52
+ await writeFile(this.logFile, errorMessage + "\n", { flag: "a" });
53
+ } catch (error) {
54
+ // Silent fail for logging
55
+ }
56
+ }
57
+
58
+ async success(message: string) {
59
+ const successMessage = `[${this.timestamp()}] SUCCESS: ${message}`;
60
+ console.log(successMessage);
61
+ try {
62
+ await writeFile(this.logFile, successMessage + "\n", { flag: "a" });
63
+ } catch (error) {
64
+ // Silent fail for logging
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,425 @@
1
+ import { access, mkdir, readFile, writeFile } from "fs/promises";
2
+ import { constants } from "fs";
3
+ import { join } from "path";
4
+ import { AnthropicClient, OpenAIClient } from "./ai-clients";
5
+ import { Logger } from "./logger";
6
+ import { envConfig } from "./runtime";
7
+ import { escapeHtml } from "./security";
8
+ import type { PresentationStructure, SkillOptions, SlideContent } from "./types";
9
+
10
+ // Presentation Generator
11
+ // ============================================================================
12
+
13
+ export class PresentationGenerator {
14
+ private logger: Logger;
15
+ private options: SkillOptions;
16
+ private outputDir: string;
17
+ private openaiClient?: OpenAIClient;
18
+ private anthropicClient?: AnthropicClient;
19
+
20
+ constructor(options: SkillOptions, logger: Logger) {
21
+ this.logger = logger;
22
+ this.options = options;
23
+ this.outputDir = join(envConfig.SKILLS_PROJECT_ROOT, options.output);
24
+
25
+ // Initialize AI clients
26
+ if (options.aiProvider === "openai" && envConfig.OPENAI_API_KEY) {
27
+ this.openaiClient = new OpenAIClient(envConfig.OPENAI_API_KEY);
28
+ } else if (options.aiProvider === "anthropic" && envConfig.ANTHROPIC_API_KEY) {
29
+ this.anthropicClient = new AnthropicClient(envConfig.ANTHROPIC_API_KEY);
30
+ }
31
+ }
32
+
33
+ async generate(): Promise<void> {
34
+ await this.logger.log(`Starting presentation generation: "${this.options.input}"`);
35
+
36
+ // Step 1: Load or prepare input content
37
+ const inputContent = await this.loadInput();
38
+ await this.logger.success(`Input content loaded`);
39
+
40
+ // Step 2: Generate presentation structure
41
+ const structure = await this.generateStructure(inputContent);
42
+ await this.logger.success(`Generated presentation structure (${structure.slides.length} slides)`);
43
+
44
+ // Step 3: Generate content for each slide
45
+ await this.logger.log("Generating slide content...");
46
+ for (let i = 0; i < structure.slides.length; i++) {
47
+ const slide = structure.slides[i];
48
+ await this.generateSlideContent(slide, inputContent);
49
+ await this.logger.success(`Generated slide ${i + 1}/${structure.slides.length}: ${slide.title}`);
50
+ }
51
+
52
+ // Step 4: Compile presentation
53
+ await this.logger.log("Compiling presentation...");
54
+ const markdown = this.compileMarpMarkdown(structure);
55
+
56
+ // Step 5: Save output
57
+ await mkdir(this.outputDir, { recursive: true });
58
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").split("T").join("-").substring(0, 19);
59
+ const baseName = `presentation-${timestamp}`;
60
+
61
+ const markdownPath = join(this.outputDir, `${baseName}.md`);
62
+ await writeFile(markdownPath, markdown);
63
+ await this.logger.success(`Saved Markdown: ${markdownPath}`);
64
+
65
+ // Step 6: Convert to other formats if requested
66
+ if (this.options.format === "html") {
67
+ await this.convertToHTML(markdown, baseName);
68
+ } else if (this.options.format === "pdf") {
69
+ await this.convertToPDF(markdownPath, baseName);
70
+ }
71
+
72
+ // Save metadata
73
+ const metadata = {
74
+ title: structure.title,
75
+ author: structure.author,
76
+ date: structure.date,
77
+ slides: structure.slides.length,
78
+ style: this.options.style,
79
+ format: this.options.format,
80
+ generated: new Date().toISOString(),
81
+ };
82
+ await writeFile(
83
+ join(this.outputDir, "metadata.json"),
84
+ JSON.stringify(metadata, null, 2)
85
+ );
86
+
87
+ await this.logger.success("Presentation generation complete!");
88
+ console.log(`\nOutput: ${markdownPath}`);
89
+ console.log(`Slides: ${structure.slides.length}`);
90
+ console.log(`Style: ${this.options.style}`);
91
+
92
+ if (this.options.format === "markdown") {
93
+ console.log("\nTo convert to PowerPoint or PDF, install Marp CLI:");
94
+ console.log(" npm install -g @marp-team/marp-cli");
95
+ console.log(` marp ${baseName}.md -o ${baseName}.pptx`);
96
+ console.log(` marp ${baseName}.md -o ${baseName}.pdf`);
97
+ }
98
+ }
99
+
100
+ private async loadInput(): Promise<string> {
101
+ if (this.options.isFile) {
102
+ try {
103
+ await access(this.options.input, constants.R_OK);
104
+ const content = await readFile(this.options.input, "utf-8");
105
+ return content;
106
+ } catch (error) {
107
+ throw new Error(`Cannot read file: ${this.options.input}`);
108
+ }
109
+ }
110
+ return this.options.input;
111
+ }
112
+
113
+ private async generateStructure(inputContent: string): Promise<PresentationStructure> {
114
+ const systemPrompt = this.buildSystemPrompt();
115
+ const prompt = `Generate a presentation structure for ${this.options.slides} slides about:
116
+
117
+ ${inputContent}
118
+
119
+ Requirements:
120
+ - Style: ${this.options.style}
121
+ - Total slides: ${this.options.slides} (including title, agenda, summary, and Q&A)
122
+ - Language: ${this.options.language}
123
+ - Structure: Title slide + Agenda + Content slides + Summary + Q&A
124
+
125
+ Return ONLY a valid JSON object (no markdown, no code blocks):
126
+ {
127
+ "title": "Presentation Title",
128
+ "subtitle": "Optional subtitle",
129
+ "author": "skills.md",
130
+ "date": "${new Date().toISOString().split('T')[0]}",
131
+ "slides": [
132
+ {
133
+ "number": 1,
134
+ "title": "Title",
135
+ "content": [],
136
+ "type": "title"
137
+ },
138
+ {
139
+ "number": 2,
140
+ "title": "Agenda",
141
+ "content": ["Topic 1", "Topic 2", "Topic 3"],
142
+ "type": "agenda"
143
+ },
144
+ {
145
+ "number": 3,
146
+ "title": "Content Slide Title",
147
+ "content": ["Point 1", "Point 2", "Point 3"],
148
+ "type": "content"
149
+ }
150
+ ]
151
+ }`;
152
+
153
+ const response = await this.generateText(prompt, systemPrompt);
154
+
155
+ // Clean response
156
+ let cleanedResponse = response.trim();
157
+ if (cleanedResponse.startsWith("```")) {
158
+ cleanedResponse = cleanedResponse
159
+ .replace(/```json\n?/, "")
160
+ .replace(/```\n?$/, "")
161
+ .trim();
162
+ }
163
+
164
+ return JSON.parse(cleanedResponse);
165
+ }
166
+
167
+ private async generateSlideContent(slide: SlideContent, inputContent: string): Promise<void> {
168
+ // Title and Q&A slides don't need AI-generated content
169
+ if (slide.type === "title" || slide.type === "qa") {
170
+ return;
171
+ }
172
+
173
+ const systemPrompt = this.buildSystemPrompt();
174
+ const notesPrompt = this.options.includeNotes
175
+ ? "\n\nAlso provide speaker notes (max 500 characters) for this slide."
176
+ : "";
177
+
178
+ const prompt = `Generate content for slide ${slide.number}: "${slide.title}"
179
+
180
+ Context: ${inputContent.substring(0, 1000)}
181
+
182
+ Requirements:
183
+ - Style: ${this.options.style}
184
+ - Type: ${slide.type}
185
+ - 3-5 concise bullet points
186
+ - Each point should be clear and impactful
187
+ - Language: ${this.options.language}${notesPrompt}
188
+
189
+ Return ONLY a valid JSON object (no markdown, no code blocks):
190
+ {
191
+ "content": ["Point 1", "Point 2", "Point 3"],
192
+ "notes": "Speaker notes here"
193
+ }`;
194
+
195
+ const response = await this.generateText(prompt, systemPrompt);
196
+
197
+ // Clean response
198
+ let cleanedResponse = response.trim();
199
+ if (cleanedResponse.startsWith("```")) {
200
+ cleanedResponse = cleanedResponse
201
+ .replace(/```json\n?/, "")
202
+ .replace(/```\n?$/, "")
203
+ .trim();
204
+ }
205
+
206
+ const result = JSON.parse(cleanedResponse);
207
+ slide.content = result.content;
208
+ if (this.options.includeNotes && result.notes) {
209
+ slide.notes = result.notes;
210
+ }
211
+ }
212
+
213
+ private compileMarpMarkdown(structure: PresentationStructure): string {
214
+ const themeConfig = this.getThemeConfig();
215
+
216
+ let markdown = `---
217
+ marp: true
218
+ theme: ${themeConfig.theme}
219
+ paginate: true
220
+ ${themeConfig.backgroundColor ? `backgroundColor: ${themeConfig.backgroundColor}` : ""}
221
+ ${themeConfig.color ? `color: ${themeConfig.color}` : ""}
222
+ ---
223
+
224
+ `;
225
+
226
+ for (const slide of structure.slides) {
227
+ if (slide.type === "title") {
228
+ markdown += `# ${structure.title}\n\n`;
229
+ if (structure.subtitle) {
230
+ markdown += `${structure.subtitle}\n\n`;
231
+ }
232
+ markdown += `${structure.author}\n`;
233
+ markdown += `${structure.date}\n\n`;
234
+ } else if (slide.type === "qa") {
235
+ markdown += `## ${slide.title}\n\n`;
236
+ markdown += `Thank you for your attention\n\n`;
237
+ markdown += `Questions?\n\n`;
238
+ } else {
239
+ markdown += `## ${slide.title}\n\n`;
240
+
241
+ if (slide.content && slide.content.length > 0) {
242
+ for (const point of slide.content) {
243
+ markdown += `- ${point}\n`;
244
+ }
245
+ markdown += `\n`;
246
+ }
247
+ }
248
+
249
+ if (slide.notes && this.options.includeNotes) {
250
+ markdown += `<!--\nSpeaker Notes:\n${slide.notes}\n-->\n\n`;
251
+ }
252
+
253
+ markdown += `---\n\n`;
254
+ }
255
+
256
+ return markdown.trim();
257
+ }
258
+
259
+ private getThemeConfig(): { theme: string; backgroundColor?: string; color?: string } {
260
+ const configs: Record<SkillOptions["template"], { theme: string; backgroundColor?: string; color?: string }> = {
261
+ default: { theme: "default" },
262
+ modern: { theme: "default", backgroundColor: "#f8f9fa" },
263
+ dark: { theme: "gaia", backgroundColor: "#1a1a1a", color: "#ffffff" },
264
+ minimal: { theme: "uncover" },
265
+ corporate: { theme: "default", backgroundColor: "#ffffff" },
266
+ };
267
+
268
+ return configs[this.options.template] || configs.default;
269
+ }
270
+
271
+ private async convertToHTML(markdown: string, baseName: string): Promise<void> {
272
+ await this.logger.log("Converting to HTML...");
273
+
274
+ // Generate a simple Reveal.js HTML
275
+ const html = `<!DOCTYPE html>
276
+ <html lang="en">
277
+ <head>
278
+ <meta charset="UTF-8">
279
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
280
+ <title>Presentation</title>
281
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reveal.js@5.0.4/dist/reveal.css">
282
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reveal.js@5.0.4/dist/theme/white.css">
283
+ <style>
284
+ .reveal h1 { font-size: 2.5em; }
285
+ .reveal h2 { font-size: 2em; }
286
+ .reveal ul { font-size: 1.2em; }
287
+ </style>
288
+ </head>
289
+ <body>
290
+ <div class="reveal">
291
+ <div class="slides">
292
+ ${this.markdownToRevealJS(markdown)}
293
+ </div>
294
+ </div>
295
+ <script src="https://cdn.jsdelivr.net/npm/reveal.js@5.0.4/dist/reveal.js"></script>
296
+ <script>
297
+ Reveal.initialize({
298
+ hash: true,
299
+ slideNumber: true,
300
+ transition: 'slide'
301
+ });
302
+ </script>
303
+ </body>
304
+ </html>`;
305
+
306
+ const htmlPath = join(this.outputDir, `${baseName}.html`);
307
+ await writeFile(htmlPath, html);
308
+ await this.logger.success(`Saved HTML: ${htmlPath}`);
309
+ }
310
+
311
+ private markdownToRevealJS(markdown: string): string {
312
+ const slides = markdown.split("---\n");
313
+ let html = "";
314
+
315
+ for (const slide of slides) {
316
+ const trimmed = slide.trim();
317
+ if (!trimmed || trimmed.startsWith("marp:") || trimmed.startsWith("theme:")) {
318
+ continue;
319
+ }
320
+
321
+ // Remove speaker notes
322
+ const content = trimmed.replace(/<!--[\s\S]*?-->/g, "");
323
+
324
+ // Convert markdown to HTML with proper escaping
325
+ // First escape all content, then process markdown syntax
326
+ const lines = content.split("\n");
327
+ let slideHTML = "";
328
+
329
+ for (const line of lines) {
330
+ const trimmedLine = line.trim();
331
+ if (!trimmedLine) continue;
332
+
333
+ if (trimmedLine.startsWith("# ")) {
334
+ // H1 heading
335
+ slideHTML += `<h1>${escapeHtml(trimmedLine.slice(2))}</h1>\n`;
336
+ } else if (trimmedLine.startsWith("## ")) {
337
+ // H2 heading
338
+ slideHTML += `<h2>${escapeHtml(trimmedLine.slice(3))}</h2>\n`;
339
+ } else if (trimmedLine.startsWith("- ")) {
340
+ // List item - collect consecutive list items
341
+ slideHTML += `<li>${escapeHtml(trimmedLine.slice(2))}</li>\n`;
342
+ } else {
343
+ // Regular text
344
+ slideHTML += `<p>${escapeHtml(trimmedLine)}</p>\n`;
345
+ }
346
+ }
347
+
348
+ // Wrap consecutive list items in ul tags
349
+ slideHTML = slideHTML.replace(/(<li>[\s\S]*?<\/li>\n)+/g, (match) => `<ul>\n${match}</ul>\n`);
350
+
351
+ html += ` <section>\n${slideHTML} </section>\n`;
352
+ }
353
+
354
+ return html;
355
+ }
356
+
357
+ private async convertToPDF(markdownPath: string, baseName: string): Promise<void> {
358
+ await this.logger.log("Converting to PDF...");
359
+
360
+ // Check if Marp CLI is available
361
+ const marpCheck = Bun.spawn(["which", "marp"]);
362
+ await marpCheck.exited;
363
+
364
+ if (marpCheck.exitCode === 0) {
365
+ // Use Marp CLI
366
+ const pdfPath = join(this.outputDir, `${baseName}.pdf`);
367
+ const marp = Bun.spawn(["marp", markdownPath, "-o", pdfPath, "--allow-local-files"]);
368
+ await marp.exited;
369
+
370
+ if (marp.exitCode === 0) {
371
+ await this.logger.success(`Saved PDF: ${pdfPath}`);
372
+ return;
373
+ }
374
+ }
375
+
376
+ // Fallback to Pandoc
377
+ const pandocCheck = Bun.spawn(["which", "pandoc"]);
378
+ await pandocCheck.exited;
379
+
380
+ if (pandocCheck.exitCode !== 0) {
381
+ throw new Error("PDF conversion requires either Marp CLI or Pandoc. Install with: npm install -g @marp-team/marp-cli");
382
+ }
383
+
384
+ const pdfPath = join(this.outputDir, `${baseName}.pdf`);
385
+ const pandoc = Bun.spawn([
386
+ "pandoc",
387
+ markdownPath,
388
+ "-o",
389
+ pdfPath,
390
+ "-t",
391
+ "beamer",
392
+ "--pdf-engine=xelatex",
393
+ ]);
394
+
395
+ await pandoc.exited;
396
+
397
+ if (pandoc.exitCode !== 0) {
398
+ throw new Error(`PDF conversion failed with exit code ${pandoc.exitCode}`);
399
+ }
400
+
401
+ await this.logger.success(`Saved PDF: ${pdfPath}`);
402
+ }
403
+
404
+ private async generateText(prompt: string, systemPrompt?: string): Promise<string> {
405
+ if (this.openaiClient) {
406
+ return this.openaiClient.generateText(prompt, systemPrompt);
407
+ } else if (this.anthropicClient) {
408
+ return this.anthropicClient.generateText(prompt, systemPrompt);
409
+ } else {
410
+ throw new Error("No AI provider configured. Set OPENAI_API_KEY or ANTHROPIC_API_KEY");
411
+ }
412
+ }
413
+
414
+ private buildSystemPrompt(): string {
415
+ const styleContext = {
416
+ business: "Create professional, corporate-style content. Focus on metrics, ROI, and business value. Use formal language.",
417
+ educational: "Create clear, instructional content. Focus on teaching and explaining. Use simple, accessible language.",
418
+ "pitch-deck": "Create compelling, persuasive content. Focus on problem-solution and opportunity. Use engaging, impactful language.",
419
+ technical: "Create detailed, technical content. Focus on architecture, implementation, and best practices. Use precise terminology.",
420
+ minimal: "Create concise, impactful content. Focus on key points only. Use brief, powerful statements.",
421
+ };
422
+
423
+ return `You are an expert presentation designer. ${styleContext[this.options.style]} Create content optimized for slides with 3-5 bullet points per slide. Each point should be concise yet meaningful. Write in ${this.options.language} language.`;
424
+ }
425
+ }
@@ -0,0 +1,6 @@
1
+ export const envConfig = {
2
+ OPENAI_API_KEY: process.env.OPENAI_API_KEY || "",
3
+ ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY || "",
4
+ SKILLS_OUTPUT_DIR: process.env.SKILLS_OUTPUT_DIR || ".skills",
5
+ SKILLS_PROJECT_ROOT: process.env.SKILLS_PROJECT_ROOT || process.cwd(),
6
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Escape HTML special characters to prevent XSS attacks
3
+ */
4
+ export function escapeHtml(str: string | undefined | null): string {
5
+ if (str === undefined || str === null) return "";
6
+ return String(str)
7
+ .replace(/&/g, "&amp;")
8
+ .replace(/</g, "&lt;")
9
+ .replace(/>/g, "&gt;")
10
+ .replace(/"/g, "&quot;")
11
+ .replace(/'/g, "&#x27;");
12
+ }
@@ -0,0 +1,28 @@
1
+ export interface SkillOptions {
2
+ input: string;
3
+ isFile: boolean;
4
+ slides: number;
5
+ style: "business" | "educational" | "pitch-deck" | "technical" | "minimal";
6
+ format: "markdown" | "html" | "pdf";
7
+ includeNotes: boolean;
8
+ template: "default" | "modern" | "dark" | "minimal" | "corporate";
9
+ aiProvider: "openai" | "anthropic";
10
+ output: string;
11
+ language: string;
12
+ }
13
+
14
+ export interface SlideContent {
15
+ number: number;
16
+ title: string;
17
+ content: string[];
18
+ notes?: string;
19
+ type: "title" | "agenda" | "content" | "summary" | "qa";
20
+ }
21
+
22
+ export interface PresentationStructure {
23
+ title: string;
24
+ subtitle?: string;
25
+ author: string;
26
+ date: string;
27
+ slides: SlideContent[];
28
+ }
@@ -11,7 +11,10 @@
11
11
  "build": "bun build src/index.ts --outdir dist --target node",
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
- "dependencies": {},
14
+ "dependencies": {
15
+ "qrcode": "^1.5.4",
16
+ "sharp": "^0.33.5"
17
+ },
15
18
  "devDependencies": {
16
19
  "@types/bun": "latest",
17
20
  "typescript": "^5.7.0"
@@ -11,7 +11,9 @@
11
11
  "build": "bun build src/index.ts --outdir dist --target node",
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
- "dependencies": {},
14
+ "dependencies": {
15
+ "openai": "^4.77.0"
16
+ },
15
17
  "devDependencies": {
16
18
  "@types/bun": "latest",
17
19
  "typescript": "^5.7.0"