@hasna/skills 0.1.26 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/LICENSE +1 -10
  2. package/README.md +141 -39
  3. package/bin/index.js +30122 -27575
  4. package/bin/mcp.js +22112 -18593
  5. package/dist/cli/cli.test-utils.d.ts +15 -0
  6. package/dist/cli/commands/auth.d.ts +2 -0
  7. package/dist/cli/commands/install.d.ts +1 -1
  8. package/dist/cli/commands/runtime-mcp.d.ts +4 -0
  9. package/dist/index.d.ts +9 -4
  10. package/dist/index.js +11607 -597
  11. package/dist/lib/auth-store.d.ts +13 -0
  12. package/dist/lib/installer.d.ts +58 -55
  13. package/dist/lib/mcp-contracts.d.ts +86 -0
  14. package/dist/lib/project-state.d.ts +43 -0
  15. package/dist/lib/registry-data/business-marketing.d.ts +2 -0
  16. package/dist/lib/registry-data/communication.d.ts +2 -0
  17. package/dist/lib/registry-data/content-generation.d.ts +2 -0
  18. package/dist/lib/registry-data/data-analysis.d.ts +2 -0
  19. package/dist/lib/registry-data/design-branding.d.ts +2 -0
  20. package/dist/lib/registry-data/development-tools.d.ts +2 -0
  21. package/dist/lib/registry-data/education-learning.d.ts +2 -0
  22. package/dist/lib/registry-data/event-management.d.ts +2 -0
  23. package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
  24. package/dist/lib/registry-data/health-wellness.d.ts +2 -0
  25. package/dist/lib/registry-data/index.d.ts +2 -0
  26. package/dist/lib/registry-data/media-processing.d.ts +2 -0
  27. package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
  28. package/dist/lib/registry-data/project-management.d.ts +2 -0
  29. package/dist/lib/registry-data/research-writing.d.ts +2 -0
  30. package/dist/lib/registry-data/science-academic.d.ts +2 -0
  31. package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
  32. package/dist/lib/registry-data/web-browser.d.ts +2 -0
  33. package/dist/lib/registry-types.d.ts +27 -0
  34. package/dist/lib/registry.d.ts +6 -18
  35. package/dist/lib/remote-registry.d.ts +3 -0
  36. package/dist/lib/run-state.d.ts +60 -0
  37. package/dist/lib/skill-aliases.d.ts +17 -0
  38. package/dist/lib/skillinfo.d.ts +5 -1
  39. package/dist/mcp/discovery-tools.d.ts +2 -0
  40. package/dist/mcp/helpers.d.ts +26 -0
  41. package/dist/mcp/http.d.ts +10 -0
  42. package/dist/mcp/index.d.ts +3 -2
  43. package/dist/mcp/operation-tools.d.ts +2 -0
  44. package/dist/mcp/resource-meta-tools.d.ts +2 -0
  45. package/dist/mcp/schedule-tools.d.ts +2 -0
  46. package/dist/mcp/server.d.ts +4 -0
  47. package/dist/types/api.d.ts +7 -4
  48. package/package.json +23 -10
  49. package/skills/_common/http-client.ts +1 -1
  50. package/skills/_common/index.ts +2 -3
  51. package/skills/_common/install.sh +5 -110
  52. package/skills/_common/installer.ts +31 -282
  53. package/skills/_common/skill-install.ts +14 -181
  54. package/skills/ad-creative-pack/SKILL.md +45 -0
  55. package/skills/ad-creative-pack/package.json +14 -0
  56. package/skills/advanced-math/package.json +3 -1
  57. package/skills/advanced-math/src/calculators.ts +118 -0
  58. package/skills/advanced-math/src/cli.ts +130 -0
  59. package/skills/advanced-math/src/conversion.ts +90 -0
  60. package/skills/advanced-math/src/finance.ts +75 -0
  61. package/skills/advanced-math/src/formatting.ts +95 -0
  62. package/skills/advanced-math/src/index.ts +24 -702
  63. package/skills/advanced-math/src/runtime.ts +49 -0
  64. package/skills/advanced-math/src/symbolic.ts +110 -0
  65. package/skills/advanced-math/src/types.ts +36 -0
  66. package/skills/analyze-data/SKILL.md +2 -2
  67. package/skills/analyze-data/src/analysis.ts +401 -0
  68. package/skills/analyze-data/src/cli.ts +66 -0
  69. package/skills/analyze-data/src/formatters.ts +235 -0
  70. package/skills/analyze-data/src/index.ts +6 -1027
  71. package/skills/analyze-data/src/logger.ts +36 -0
  72. package/skills/analyze-data/src/parsers.ts +57 -0
  73. package/skills/analyze-data/src/stats.ts +151 -0
  74. package/skills/analyze-data/src/types.ts +85 -0
  75. package/skills/api-docs-portal/SKILL.md +46 -0
  76. package/skills/api-docs-portal/package.json +9 -0
  77. package/skills/api-test-suite/src/index.ts +13 -0
  78. package/skills/apidocs/package.json +1 -1
  79. package/skills/apidocs/src/index.ts +3 -0
  80. package/skills/audio/package.json +2 -3
  81. package/skills/audio-cleanup-lab/SKILL.md +2 -2
  82. package/skills/audio-extract/CLAUDE.md +1 -1
  83. package/skills/audio-transcript-pack/SKILL.md +43 -0
  84. package/skills/audio-transcript-pack/package.json +10 -0
  85. package/skills/blog-article/CLAUDE.md +12 -0
  86. package/skills/blog-article/SKILL.md +45 -0
  87. package/skills/{create-blog-article → blog-article}/package.json +3 -3
  88. package/skills/brand-kit/SKILL.md +45 -0
  89. package/skills/brand-kit/package.json +14 -0
  90. package/skills/brand-photo-shoot/SKILL.md +28 -0
  91. package/skills/brand-photo-shoot/package.json +10 -0
  92. package/skills/brand-style-guide/SKILL.md +2 -2
  93. package/skills/brand-style-guide/src/index.ts +0 -0
  94. package/skills/budget-variance-analyzer/SKILL.md +2 -2
  95. package/skills/businessactivity/package.json +1 -1
  96. package/skills/businessactivity/src/index.ts +3 -0
  97. package/skills/calendar-events/src/ai-parser.ts +103 -0
  98. package/skills/calendar-events/src/api.ts +157 -0
  99. package/skills/calendar-events/src/auth.ts +22 -0
  100. package/skills/calendar-events/src/config.ts +6 -0
  101. package/skills/calendar-events/src/format.ts +96 -0
  102. package/skills/calendar-events/src/help.ts +54 -0
  103. package/skills/calendar-events/src/index.ts +21 -524
  104. package/skills/calendar-events/src/logger.ts +34 -0
  105. package/skills/calendar-events/src/types.ts +67 -0
  106. package/skills/compress-video/SKILL.md +2 -2
  107. package/skills/consolelog/package.json +1 -1
  108. package/skills/consolelog/src/index.ts +3 -0
  109. package/skills/contract-review-report/SKILL.md +43 -0
  110. package/skills/contract-review-report/package.json +10 -0
  111. package/skills/convert/SKILL.md +2 -3
  112. package/skills/customer-feedback-report/SKILL.md +44 -0
  113. package/skills/customer-feedback-report/package.json +10 -0
  114. package/skills/dashboard-builder/package.json +3 -1
  115. package/skills/database-explorer/package.json +3 -1
  116. package/skills/deepresearch/README.md +4 -13
  117. package/skills/deploy/src/http-client.ts +1 -1
  118. package/skills/diff-viewer/package.json +4 -1
  119. package/skills/doc-generate/package.json +0 -1
  120. package/skills/doc-generate/src/ai.ts +50 -0
  121. package/skills/doc-generate/src/cli.ts +203 -0
  122. package/skills/doc-generate/src/dependencies.ts +44 -0
  123. package/skills/doc-generate/src/document-builder.ts +299 -0
  124. package/skills/doc-generate/src/index.ts +40 -764
  125. package/skills/doc-generate/src/markdown-parser.ts +125 -0
  126. package/skills/doc-generate/src/types.ts +68 -0
  127. package/skills/domainpurchase/SKILL.md +1 -1
  128. package/skills/domainpurchase/package.json +1 -1
  129. package/skills/domainpurchase/src/index.ts +3 -0
  130. package/skills/domainsearch/SKILL.md +1 -1
  131. package/skills/domainsearch/package.json +1 -1
  132. package/skills/domainsearch/src/index.ts +3 -0
  133. package/skills/email-sequence/SKILL.md +44 -0
  134. package/skills/email-sequence/package.json +14 -0
  135. package/skills/excel/CLAUDE.md +2 -2
  136. package/skills/experiment-power-calculator/package.json +3 -1
  137. package/skills/extract-invoice/src/cli.ts +97 -0
  138. package/skills/extract-invoice/src/extractor.ts +170 -0
  139. package/skills/extract-invoice/src/file-utils.ts +46 -0
  140. package/skills/extract-invoice/src/formatters.ts +144 -0
  141. package/skills/extract-invoice/src/index.ts +44 -629
  142. package/skills/extract-invoice/src/runtime.ts +46 -0
  143. package/skills/extract-invoice/src/types.ts +88 -0
  144. package/skills/folder-tree/package.json +3 -1
  145. package/skills/form-filler/package.json +3 -1
  146. package/skills/generate-api-client/package.json +3 -1
  147. package/skills/generate-api-client/src/generator.ts +47 -0
  148. package/skills/generate-api-client/src/index.ts +3 -777
  149. package/skills/generate-api-client/src/logger.ts +34 -0
  150. package/skills/generate-api-client/src/python-generator.ts +245 -0
  151. package/skills/generate-api-client/src/spec-loader.ts +48 -0
  152. package/skills/generate-api-client/src/type-mappers.ts +79 -0
  153. package/skills/generate-api-client/src/types.ts +76 -0
  154. package/skills/generate-api-client/src/typescript-generator.ts +247 -0
  155. package/skills/generate-book-cover/package.json +3 -1
  156. package/skills/generate-dockerfile/src/cli.ts +78 -0
  157. package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
  158. package/skills/generate-dockerfile/src/index.ts +12 -790
  159. package/skills/generate-dockerfile/src/logger.ts +30 -0
  160. package/skills/generate-dockerfile/src/project-detection.ts +68 -0
  161. package/skills/generate-dockerfile/src/support-files.ts +171 -0
  162. package/skills/generate-dockerfile/src/types.ts +29 -0
  163. package/skills/generate-documentation/src/ai.ts +131 -0
  164. package/skills/generate-documentation/src/cli.ts +71 -0
  165. package/skills/generate-documentation/src/code-parser.ts +300 -0
  166. package/skills/generate-documentation/src/file-processing.ts +182 -0
  167. package/skills/generate-documentation/src/index.ts +13 -753
  168. package/skills/generate-documentation/src/runtime.ts +35 -0
  169. package/skills/generate-documentation/src/types.ts +30 -0
  170. package/skills/generate-env/package.json +3 -1
  171. package/skills/generate-env/src/cli.ts +85 -0
  172. package/skills/generate-env/src/detection.ts +161 -0
  173. package/skills/generate-env/src/env-data.ts +66 -0
  174. package/skills/generate-env/src/generators.ts +240 -0
  175. package/skills/generate-env/src/index.ts +76 -676
  176. package/skills/generate-env/src/runtime.ts +30 -0
  177. package/skills/generate-env/src/types.ts +32 -0
  178. package/skills/generate-favicon/package.json +3 -1
  179. package/skills/generate-mock-data/package.json +3 -1
  180. package/skills/generate-mock-data/src/ai.ts +102 -0
  181. package/skills/generate-mock-data/src/formatters.ts +84 -0
  182. package/skills/generate-mock-data/src/generator.ts +377 -0
  183. package/skills/generate-mock-data/src/index.ts +15 -716
  184. package/skills/generate-mock-data/src/logger.ts +37 -0
  185. package/skills/generate-mock-data/src/presets.ts +110 -0
  186. package/skills/generate-mock-data/src/types.ts +21 -0
  187. package/skills/generate-pr-description/src/ai.ts +144 -0
  188. package/skills/generate-pr-description/src/cli.ts +80 -0
  189. package/skills/generate-pr-description/src/clipboard.ts +30 -0
  190. package/skills/generate-pr-description/src/formatters.ts +231 -0
  191. package/skills/generate-pr-description/src/git.ts +153 -0
  192. package/skills/generate-pr-description/src/index.ts +21 -714
  193. package/skills/generate-pr-description/src/types.ts +49 -0
  194. package/skills/generate-presentation/src/ai-clients.ts +61 -0
  195. package/skills/generate-presentation/src/cli.ts +126 -0
  196. package/skills/generate-presentation/src/index.ts +3 -751
  197. package/skills/generate-presentation/src/logger.ts +67 -0
  198. package/skills/generate-presentation/src/presentation-generator.ts +425 -0
  199. package/skills/generate-presentation/src/runtime.ts +6 -0
  200. package/skills/generate-presentation/src/security.ts +12 -0
  201. package/skills/generate-presentation/src/types.ts +28 -0
  202. package/skills/generate-qrcode/package.json +4 -1
  203. package/skills/generate-regex/package.json +3 -1
  204. package/skills/generate-resume/src/cli.ts +157 -0
  205. package/skills/generate-resume/src/index.ts +13 -917
  206. package/skills/generate-resume/src/parsers.ts +95 -0
  207. package/skills/generate-resume/src/renderers.ts +538 -0
  208. package/skills/generate-resume/src/security.ts +39 -0
  209. package/skills/generate-resume/src/types.ts +86 -0
  210. package/skills/generate-social-posts/src/ai.ts +88 -0
  211. package/skills/generate-social-posts/src/cli.ts +118 -0
  212. package/skills/generate-social-posts/src/exporters.ts +126 -0
  213. package/skills/generate-social-posts/src/generator.ts +130 -0
  214. package/skills/generate-social-posts/src/index.ts +19 -709
  215. package/skills/generate-social-posts/src/platforms.ts +39 -0
  216. package/skills/generate-social-posts/src/runtime.ts +34 -0
  217. package/skills/generate-social-posts/src/source.ts +116 -0
  218. package/skills/generate-social-posts/src/types.ts +58 -0
  219. package/skills/gif-maker/package.json +4 -1
  220. package/skills/github-manager/package.json +3 -1
  221. package/skills/gmail/CLAUDE.md +1 -1
  222. package/skills/highlight-reel-generator/src/index.ts +19 -0
  223. package/skills/hook/src/commands/create.ts +20 -845
  224. package/skills/hook/src/templates/root.ts +196 -0
  225. package/skills/hook/src/templates/source.ts +647 -0
  226. package/skills/http-server/package.json +3 -1
  227. package/skills/icon-pack/README.md +28 -0
  228. package/skills/icon-pack/SKILL.md +23 -0
  229. package/skills/icon-pack/package.json +29 -0
  230. package/skills/{audio → icon-pack}/tsconfig.json +10 -12
  231. package/skills/image/package.json +1 -2
  232. package/skills/implementation-agent/package.json +3 -1
  233. package/skills/implementation-agent/src/ai-generation.ts +225 -0
  234. package/skills/implementation-agent/src/index.ts +3 -960
  235. package/skills/implementation-agent/src/minimist.d.ts +15 -0
  236. package/skills/implementation-agent/src/templates.ts +686 -0
  237. package/skills/implementation-agent/src/types.ts +53 -0
  238. package/skills/implementation-plan/package.json +3 -1
  239. package/skills/implementation-todo/package.json +3 -1
  240. package/skills/invoice/package.json +1 -1
  241. package/skills/invoice/src/index.ts +3 -0
  242. package/skills/invoice-reconciliation/SKILL.md +42 -0
  243. package/skills/invoice-reconciliation/package.json +10 -0
  244. package/skills/landing-page-pack/SKILL.md +47 -0
  245. package/skills/landing-page-pack/package.json +14 -0
  246. package/skills/latex-table-generator/package.json +3 -1
  247. package/skills/logo-design/SKILL.md +25 -44
  248. package/skills/logo-design/package.json +3 -15
  249. package/skills/lorem-generator/package.json +3 -1
  250. package/skills/lorem-generator/src/index.ts +13 -0
  251. package/skills/managehook/package.json +1 -1
  252. package/skills/managehook/src/index.ts +3 -0
  253. package/skills/managemcp/package.json +1 -1
  254. package/skills/managemcp/src/index.ts +3 -0
  255. package/skills/manageskill/package.json +1 -1
  256. package/skills/manageskill/src/index.ts +3 -0
  257. package/skills/markdown-validator/package.json +3 -1
  258. package/skills/markdown-validator/src/index.ts +1 -4
  259. package/skills/market-research-report/SKILL.md +41 -0
  260. package/skills/market-research-report/package.json +10 -0
  261. package/skills/mcp-builder/package.json +4 -1
  262. package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
  263. package/skills/mcp-builder/src/generators.ts +513 -0
  264. package/skills/mcp-builder/src/index.ts +7 -908
  265. package/skills/mcp-builder/src/minimist.d.ts +15 -0
  266. package/skills/mcp-builder/src/naming.ts +12 -0
  267. package/skills/mcp-builder/src/options.ts +170 -0
  268. package/skills/mcp-builder/src/templates.ts +149 -0
  269. package/skills/mcp-builder/src/types.ts +42 -0
  270. package/skills/meeting-pack/SKILL.md +43 -0
  271. package/skills/meeting-pack/package.json +10 -0
  272. package/skills/merge-pdfs/package.json +5 -1
  273. package/skills/migration-plan-pack/SKILL.md +45 -0
  274. package/skills/migration-plan-pack/package.json +10 -0
  275. package/skills/music/package.json +2 -3
  276. package/skills/music-album/SKILL.md +37 -0
  277. package/skills/music-album/package.json +10 -0
  278. package/skills/notion-manager/package.json +3 -1
  279. package/skills/npmpublish/CLAUDE.md +5 -8
  280. package/skills/npmpublish/README.md +5 -26
  281. package/skills/npmpublish/src/index.ts +9 -147
  282. package/skills/one-page-website/SKILL.md +46 -0
  283. package/skills/one-page-website/package.json +10 -0
  284. package/skills/one-page-website/tsconfig.json +8 -0
  285. package/skills/pdf-generate/src/cli.ts +162 -0
  286. package/skills/pdf-generate/src/html.ts +84 -0
  287. package/skills/pdf-generate/src/index.ts +11 -800
  288. package/skills/pdf-generate/src/markdown.ts +27 -0
  289. package/skills/pdf-generate/src/pdf-writer.ts +78 -0
  290. package/skills/pdf-generate/src/runtime.ts +34 -0
  291. package/skills/pdf-generate/src/security.ts +37 -0
  292. package/skills/pdf-generate/src/templates.ts +311 -0
  293. package/skills/pdf-generate/src/types.ts +28 -0
  294. package/skills/pdf-read/SKILL.md +10 -10
  295. package/skills/pdf-to-dataset/SKILL.md +45 -0
  296. package/skills/pdf-to-dataset/package.json +10 -0
  297. package/skills/pdf-to-markdown/SKILL.md +49 -0
  298. package/skills/pdf-to-markdown/package.json +10 -0
  299. package/skills/pdf-to-markdown/tsconfig.json +10 -0
  300. package/skills/performance-audit-report/SKILL.md +42 -0
  301. package/skills/performance-audit-report/package.json +10 -0
  302. package/skills/persona-based-adwriter/src/index.ts +19 -0
  303. package/skills/photo-album/SKILL.md +29 -0
  304. package/skills/photo-album/package.json +9 -0
  305. package/skills/photo-album/tsconfig.json +4 -0
  306. package/skills/pitch-deck/SKILL.md +43 -0
  307. package/skills/pitch-deck/package.json +9 -0
  308. package/skills/playlist-maker/SKILL.md +33 -0
  309. package/skills/playlist-maker/package.json +9 -0
  310. package/skills/playlist-maker/tsconfig.json +4 -0
  311. package/skills/product-mockup/SKILL.md +45 -0
  312. package/skills/product-mockup/package.json +3 -20
  313. package/skills/product-mockup/tsconfig.json +3 -5
  314. package/skills/project-retro-companion/src/index.ts +19 -0
  315. package/skills/proposal-pack/SKILL.md +45 -0
  316. package/skills/proposal-pack/package.json +10 -0
  317. package/skills/read-pdf/SKILL.md +5 -4
  318. package/skills/repo-onboarding-report/SKILL.md +42 -0
  319. package/skills/repo-onboarding-report/package.json +10 -0
  320. package/skills/sales-call-recapper/src/index.ts +20 -0
  321. package/skills/salescopy/package.json +1 -1
  322. package/skills/salescopy/src/index.ts +3 -0
  323. package/skills/scaffold-project/src/ai-detect.ts +136 -0
  324. package/skills/scaffold-project/src/file-generators.ts +292 -0
  325. package/skills/scaffold-project/src/index.ts +8 -991
  326. package/skills/scaffold-project/src/project-config.ts +338 -0
  327. package/skills/scaffold-project/src/templates.ts +173 -0
  328. package/skills/scaffold-project/src/types.ts +58 -0
  329. package/skills/scientific-figure-check/package.json +3 -1
  330. package/skills/sdk-generator/SKILL.md +45 -0
  331. package/skills/sdk-generator/package.json +10 -0
  332. package/skills/sdk-generator/tsconfig.json +8 -0
  333. package/skills/security-audit/src/index.ts +25 -6
  334. package/skills/security-audit-report/SKILL.md +40 -0
  335. package/skills/security-audit-report/package.json +10 -0
  336. package/skills/seo-content-pack/SKILL.md +44 -0
  337. package/skills/seo-content-pack/package.json +9 -0
  338. package/skills/short-video-pack/SKILL.md +30 -0
  339. package/skills/short-video-pack/package.json +10 -0
  340. package/skills/slack-assistant/package.json +3 -1
  341. package/skills/slide-deck-generator/SKILL.md +44 -0
  342. package/skills/slide-deck-generator/package.json +10 -0
  343. package/skills/sms/package.json +1 -1
  344. package/skills/sms/src/index.ts +15 -0
  345. package/skills/social-content-calendar/SKILL.md +45 -0
  346. package/skills/social-content-calendar/package.json +14 -0
  347. package/skills/split-pdf/package.json +4 -1
  348. package/skills/subtitle/package.json +2 -1
  349. package/skills/subtitle/src/index.ts +3 -0
  350. package/skills/terraform-generator/package.json +3 -1
  351. package/skills/test-suite-generator/SKILL.md +41 -0
  352. package/skills/test-suite-generator/package.json +10 -0
  353. package/skills/timesheet/package.json +1 -1
  354. package/skills/timesheet/src/index.ts +3 -0
  355. package/skills/transcript/SKILL.md +1 -8
  356. package/skills/validate-config/package.json +3 -1
  357. package/skills/video/package.json +6 -4
  358. package/skills/video-downloader/package.json +3 -1
  359. package/skills/video-highlight-pack/SKILL.md +44 -0
  360. package/skills/video-highlight-pack/package.json +10 -0
  361. package/skills/voiceover-jingle-pack/SKILL.md +28 -0
  362. package/skills/voiceover-jingle-pack/package.json +10 -0
  363. package/skills/watermark/package.json +6 -1
  364. package/skills/webcrawling/package.json +2 -1
  365. package/skills/write/SKILL.md +6 -6
  366. package/dist/server/serve.d.ts +0 -11
  367. package/skills/apidocs/.claude/settings.json +0 -5
  368. package/skills/audio/.env.example +0 -14
  369. package/skills/audio/QUICKSTART.md +0 -158
  370. package/skills/audio/README.md +0 -256
  371. package/skills/audio/src/index-local.ts +0 -206
  372. package/skills/audio/src/index.ts +0 -95
  373. package/skills/audio/src/providers/elevenlabs.ts +0 -115
  374. package/skills/audio/src/providers/google.ts +0 -116
  375. package/skills/audio/src/providers/minimax.ts +0 -83
  376. package/skills/audio/src/providers/openai.ts +0 -115
  377. package/skills/audio/src/types.ts +0 -79
  378. package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
  379. package/skills/audiobook-chapter-proofer/package.json +0 -27
  380. package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
  381. package/skills/browse/src/client.ts +0 -373
  382. package/skills/browse/src/index-local.ts +0 -430
  383. package/skills/browse/src/index.ts +0 -110
  384. package/skills/browse/src/sse-server.ts +0 -919
  385. package/skills/browse/src/types.ts +0 -104
  386. package/skills/consolelog/src/server/index.ts +0 -508
  387. package/skills/create-blog-article/CLAUDE.md +0 -19
  388. package/skills/create-blog-article/src/index.ts +0 -745
  389. package/skills/create-blog-article/tsconfig.json +0 -10
  390. package/skills/deepresearch/src/agents/query-generator.ts +0 -91
  391. package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
  392. package/skills/deepresearch/src/index.ts +0 -224
  393. package/skills/deepresearch/src/research.ts +0 -166
  394. package/skills/deepresearch/src/services/anthropic.ts +0 -69
  395. package/skills/deepresearch/src/services/exa.ts +0 -108
  396. package/skills/deepresearch/src/services/firecrawl.ts +0 -88
  397. package/skills/deepresearch/src/services/openai.ts +0 -81
  398. package/skills/deepresearch/src/types.ts +0 -76
  399. package/skills/deepresearch/src/utils/file.ts +0 -111
  400. package/skills/deepresearch/src/utils/logger.ts +0 -84
  401. package/skills/domainpurchase/src/server/index.ts +0 -332
  402. package/skills/domainsearch/src/server/index.ts +0 -229
  403. package/skills/e2bswarm/README.md +0 -135
  404. package/skills/e2bswarm/SKILL.md +0 -118
  405. package/skills/e2bswarm/examples/tasks-example.json +0 -38
  406. package/skills/e2bswarm/package.json +0 -59
  407. package/skills/e2bswarm/src/commands/collect.ts +0 -135
  408. package/skills/e2bswarm/src/commands/install.ts +0 -164
  409. package/skills/e2bswarm/src/commands/kill.ts +0 -62
  410. package/skills/e2bswarm/src/commands/spawn.ts +0 -134
  411. package/skills/e2bswarm/src/commands/status.ts +0 -90
  412. package/skills/e2bswarm/src/commands/sync.ts +0 -208
  413. package/skills/e2bswarm/src/index.ts +0 -121
  414. package/skills/e2bswarm/src/lib/config.ts +0 -75
  415. package/skills/e2bswarm/src/lib/e2b.ts +0 -490
  416. package/skills/e2bswarm/src/lib/github.ts +0 -253
  417. package/skills/e2bswarm/src/lib/logger.ts +0 -41
  418. package/skills/e2bswarm/src/lib/paths.ts +0 -75
  419. package/skills/e2bswarm/src/lib/tasks.ts +0 -320
  420. package/skills/e2bswarm/src/types/index.ts +0 -107
  421. package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
  422. package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
  423. package/skills/e2bswarm/templates/setup.sh +0 -21
  424. package/skills/e2bswarm/tsconfig.json +0 -19
  425. package/skills/generate-book-cover/src/index.ts +0 -694
  426. package/skills/image/src/index-local.ts +0 -206
  427. package/skills/image/src/index.ts +0 -96
  428. package/skills/image/src/providers/google.ts +0 -79
  429. package/skills/image/src/providers/minimax.ts +0 -94
  430. package/skills/image/src/providers/openai.ts +0 -80
  431. package/skills/image/src/providers/xai.ts +0 -73
  432. package/skills/image/src/types.ts +0 -37
  433. package/skills/logo-design/CLAUDE.md +0 -30
  434. package/skills/logo-design/src/index.ts +0 -322
  435. package/skills/managehook/src/server/index.ts +0 -108
  436. package/skills/managemcp/src/server/index.ts +0 -108
  437. package/skills/manageskill/src/server/index.ts +0 -108
  438. package/skills/music/CLAUDE.md +0 -9
  439. package/skills/music/src/index.ts +0 -94
  440. package/skills/music/tsconfig.json +0 -10
  441. package/skills/pdf-read/src/index.ts +0 -320
  442. package/skills/product-mockup/CLAUDE.md +0 -19
  443. package/skills/product-mockup/src/index.ts +0 -290
  444. package/skills/read-pdf/src/index.ts +0 -388
  445. package/skills/remove-background/src/index.ts +0 -405
  446. package/skills/scaffold-project/my-app/.env.example +0 -2
  447. package/skills/scaffold-project/my-app/README.md +0 -72
  448. package/skills/scaffold-project/my-app/package.json +0 -29
  449. package/skills/scaffold-project/my-app/src/index.ts +0 -23
  450. package/skills/scaffold-project/my-app/tsconfig.json +0 -33
  451. package/skills/sound-effects/SKILL.md +0 -34
  452. package/skills/sound-effects/package.json +0 -21
  453. package/skills/sound-effects/src/index.ts +0 -172
  454. package/skills/sound-effects/tsconfig.json +0 -8
  455. package/skills/transcript/src/chunker.ts +0 -215
  456. package/skills/transcript/src/formatter.ts +0 -134
  457. package/skills/transcript/src/index-local.ts +0 -226
  458. package/skills/transcript/src/index.ts +0 -110
  459. package/skills/transcript/src/providers/elevenlabs.ts +0 -133
  460. package/skills/transcript/src/providers/gemini.ts +0 -192
  461. package/skills/transcript/src/providers/index.ts +0 -54
  462. package/skills/transcript/src/providers/openai.ts +0 -203
  463. package/skills/transcript/src/types.ts +0 -106
  464. package/skills/video/.env.example +0 -14
  465. package/skills/video/EXAMPLES.md +0 -266
  466. package/skills/video/LICENSE +0 -192
  467. package/skills/video/README.md +0 -174
  468. package/skills/video/src/cli.ts +0 -155
  469. package/skills/video/src/index-local.ts +0 -148
  470. package/skills/video/src/index.ts +0 -96
  471. package/skills/video/src/providers/google-veo.ts +0 -126
  472. package/skills/video/src/providers/index.ts +0 -22
  473. package/skills/video/src/providers/minimax.ts +0 -100
  474. package/skills/video/src/providers/openai-sora.ts +0 -164
  475. package/skills/video/src/providers/runway.ts +0 -159
  476. package/skills/video/src/types.ts +0 -35
  477. package/skills/video/tsconfig.json +0 -22
  478. package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
  479. package/skills/voiceover-casting-assistant/package.json +0 -27
  480. package/skills/voiceover-casting-assistant/src/index.ts +0 -255
  481. package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
  482. package/skills/webcrawling/src/commands/config.ts +0 -34
  483. package/skills/webcrawling/src/commands/crawl.ts +0 -33
  484. package/skills/webcrawling/src/commands/scrape.ts +0 -32
  485. package/skills/webcrawling/src/commands/sessions.ts +0 -42
  486. package/skills/webcrawling/src/lib/crawler.ts +0 -174
  487. package/skills/webcrawling/src/lib/storage.ts +0 -130
  488. package/skills/webcrawling/src/types/index.ts +0 -45
  489. package/skills/webcrawling/src/utils/logger.ts +0 -30
  490. package/skills/webcrawling/src/utils/paths.ts +0 -28
  491. /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
@@ -1,694 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- /**
4
- * Generate Book Cover - AI-powered book cover generation
5
- *
6
- * This script generates professional book covers using DALL-E 3 with customizable
7
- * genres, dimensions, styles, and text overlays.
8
- */
9
-
10
- import { parseArgs } from "util";
11
- import { mkdir, writeFile, appendFile } from "fs/promises";
12
- import { join } from "path";
13
- import { existsSync, mkdirSync } from "fs";
14
- import OpenAI from "openai";
15
- import { randomUUID } from "crypto";
16
-
17
- // ============================================================================
18
- // Constants & Logging
19
- // ============================================================================
20
-
21
- const SKILL_NAME = "generate-book-cover";
22
- const SESSION_ID = randomUUID().slice(0, 8);
23
- const SKILLS_OUTPUT_DIR = process.env.SKILLS_OUTPUT_DIR || join(process.cwd(), ".skills");
24
- const LOGS_DIR = join(SKILLS_OUTPUT_DIR, "logs", SKILL_NAME);
25
- const SESSION_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, "_").slice(0, 19);
26
-
27
- function ensureDir(dir: string) {
28
- if (!existsSync(dir)) {
29
- mkdirSync(dir, { recursive: true });
30
- }
31
- }
32
-
33
- async function log(message: string, level: "info" | "error" | "success" | "debug" = "info") {
34
- ensureDir(LOGS_DIR);
35
- const timestamp = new Date().toISOString();
36
- const logFile = join(LOGS_DIR, `log_${SESSION_TIMESTAMP}_${SESSION_ID}.log`);
37
- const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
38
-
39
- try {
40
- await appendFile(logFile, logEntry);
41
- } catch (e) {
42
- // Silent fail for logging
43
- }
44
-
45
- const prefix = level === "error" ? "āŒ" : level === "success" ? "āœ…" : level === "debug" ? "šŸ”" : "ā„¹ļø";
46
- if (level === "error") {
47
- console.error(`${prefix} ${message}`);
48
- } else if (level !== "debug") {
49
- console.log(`${prefix} ${message}`);
50
- }
51
- }
52
-
53
- // ============================================================================
54
- // Types & Interfaces
55
- // ============================================================================
56
-
57
- interface BookCoverOptions {
58
- title: string;
59
- genre: string;
60
- author?: string;
61
- subtitle?: string;
62
- tagline?: string;
63
- series?: string;
64
- style: string;
65
- dimensions: string;
66
- colors?: string;
67
- fontStyle: string;
68
- includeSpine: boolean;
69
- includeBack: boolean;
70
- fullWrap: boolean;
71
- spineWidth?: number;
72
- pageCount: number;
73
- variations: number;
74
- styles?: string[];
75
- quality: "standard" | "hd";
76
- aspectFocus: string;
77
- mood?: string;
78
- output: string;
79
- format: "png" | "jpg" | "both";
80
- prefix?: string;
81
- includeMockup: boolean;
82
- }
83
-
84
- interface DimensionSpec {
85
- format: string;
86
- width: number;
87
- height: number;
88
- dpi: number;
89
- bleed?: number;
90
- }
91
-
92
- interface GeneratedCover {
93
- type: "front" | "spine" | "back" | "full-wrap" | "mockup";
94
- filename: string;
95
- url: string;
96
- prompt: string;
97
- }
98
-
99
- interface CoverMetadata {
100
- title: string;
101
- author?: string;
102
- genre: string;
103
- style: string;
104
- dimensions: DimensionSpec;
105
- colors?: string[];
106
- mood?: string;
107
- generatedAt: string;
108
- aiPrompt: string;
109
- files: {
110
- front?: string;
111
- spine?: string;
112
- back?: string;
113
- fullWrap?: string;
114
- mockup?: string;
115
- };
116
- }
117
-
118
- // ============================================================================
119
- // Constants
120
- // ============================================================================
121
-
122
- const DIMENSIONS: Record<string, DimensionSpec> = {
123
- paperback: { format: "paperback", width: 1800, height: 2700, dpi: 300 },
124
- hardcover: { format: "hardcover", width: 1875, height: 2775, dpi: 300, bleed: 0.125 },
125
- ebook: { format: "ebook", width: 1600, height: 2400, dpi: 300 },
126
- square: { format: "square", width: 2400, height: 2400, dpi: 300 },
127
- trade: { format: "trade", width: 1650, height: 2550, dpi: 300 },
128
- };
129
-
130
- const GENRE_KEYWORDS: Record<string, string[]> = {
131
- fiction: ["literary", "contemporary", "artistic"],
132
- "non-fiction": ["professional", "educational", "informative"],
133
- "sci-fi": ["futuristic", "space", "technology", "alien", "cyberpunk"],
134
- fantasy: ["magical", "medieval", "mystical", "dragons", "enchanted"],
135
- romance: ["romantic", "passionate", "soft lighting", "couples", "flowers"],
136
- thriller: ["dark", "tense", "mysterious", "suspenseful", "urban"],
137
- mystery: ["noir", "detective", "shadows", "clues", "investigation"],
138
- horror: ["dark", "scary", "haunting", "supernatural", "eerie"],
139
- business: ["professional", "corporate", "clean", "modern", "success"],
140
- "self-help": ["uplifting", "inspiring", "peaceful", "transformation"],
141
- biography: ["portrait", "historical", "personal", "legacy"],
142
- history: ["historical", "documentary", "archival", "period"],
143
- children: ["colorful", "playful", "fun", "illustrated", "whimsical"],
144
- "young-adult": ["dynamic", "coming-of-age", "vibrant", "teen"],
145
- literary: ["sophisticated", "artistic", "elegant", "thoughtful"],
146
- };
147
-
148
- const COLOR_PALETTES: Record<string, string[]> = {
149
- ocean: ["deep blue", "turquoise", "white", "sea foam"],
150
- sunset: ["orange", "pink", "purple", "gold"],
151
- monochrome: ["black", "white", "grey"],
152
- forest: ["deep green", "brown", "gold", "moss"],
153
- fire: ["red", "orange", "yellow", "black"],
154
- ice: ["light blue", "white", "silver", "pale purple"],
155
- royal: ["purple", "gold", "deep red", "black"],
156
- earth: ["brown", "tan", "forest green", "terracotta"],
157
- midnight: ["navy", "black", "silver", "deep purple"],
158
- vintage: ["sepia", "cream", "muted gold", "brown"],
159
- };
160
-
161
- // ============================================================================
162
- // Helper Functions
163
- // ============================================================================
164
-
165
- function slugify(text: string): string {
166
- return text
167
- .toLowerCase()
168
- .replace(/[^\w\s-]/g, "")
169
- .replace(/\s+/g, "-")
170
- .replace(/-+/g, "-")
171
- .trim();
172
- }
173
-
174
- function parseColorInput(colorInput?: string): string[] {
175
- if (!colorInput) return [];
176
-
177
- // Check if it's a predefined palette
178
- if (COLOR_PALETTES[colorInput.toLowerCase()]) {
179
- return COLOR_PALETTES[colorInput.toLowerCase()];
180
- }
181
-
182
- // Parse as comma-separated colors
183
- return colorInput.split(",").map(c => c.trim()).filter(Boolean);
184
- }
185
-
186
- function calculateSpineWidth(pageCount: number, paperType: "standard" | "premium" = "standard"): number {
187
- // Standard calculation: pages * paper thickness
188
- // 60# paper = 0.0025 inches per sheet (0.005 per page since it's double-sided)
189
- // 70# paper = 0.003 inches per sheet
190
- const thickness = paperType === "standard" ? 0.0025 : 0.003;
191
- return (pageCount / 2) * thickness;
192
- }
193
-
194
- function generatePrompt(options: BookCoverOptions, coverType: "front" | "spine" | "back" | "full-wrap"): string {
195
- const { title, genre, style, colors, mood, author, subtitle, series, fontStyle } = options;
196
-
197
- // Get genre-specific keywords
198
- const genreKeywords = GENRE_KEYWORDS[genre] || GENRE_KEYWORDS.fiction;
199
-
200
- // Parse colors
201
- const colorList = colors ? parseColorInput(colors) : [];
202
-
203
- let prompt = `Professional ${genre} book cover design, ${style} style. `;
204
-
205
- // Cover type specific
206
- if (coverType === "front") {
207
- prompt += `Front cover only. `;
208
-
209
- // Add title and typography
210
- prompt += `Large bold title "${title}" prominently displayed. `;
211
- if (fontStyle) {
212
- prompt += `${fontStyle} typography. `;
213
- }
214
-
215
- if (author) {
216
- prompt += `Author name "${author}" elegantly placed. `;
217
- }
218
-
219
- if (subtitle) {
220
- prompt += `Subtitle "${subtitle}" in smaller text. `;
221
- }
222
-
223
- if (series) {
224
- prompt += `Series indicator "${series}". `;
225
- }
226
- } else if (coverType === "spine") {
227
- prompt += `Book spine design with vertical text. `;
228
- prompt += `Title "${title}" and author "${author || "Author"}" on spine. `;
229
- } else if (coverType === "back") {
230
- prompt += `Back cover design with space for book description. `;
231
- prompt += `Clean layout with barcode area. `;
232
- } else if (coverType === "full-wrap") {
233
- prompt += `Complete book wraparound cover (front, spine, and back). `;
234
- prompt += `Title "${title}" on front and spine. `;
235
- }
236
-
237
- // Add genre elements
238
- prompt += `Incorporating ${genreKeywords.slice(0, 3).join(", ")} elements. `;
239
-
240
- // Add style specifics
241
- switch (style) {
242
- case "minimalist":
243
- prompt += `Clean, simple design with lots of negative space. Minimal elements. `;
244
- break;
245
- case "illustrated":
246
- prompt += `Hand-drawn or digitally illustrated artwork. Artistic and detailed. `;
247
- break;
248
- case "photographic":
249
- prompt += `High-quality photographic imagery. Realistic and cinematic. `;
250
- break;
251
- case "typographic":
252
- prompt += `Typography-focused design. Bold, creative text treatment as main element. `;
253
- break;
254
- case "abstract":
255
- prompt += `Abstract shapes and patterns. Modern and artistic interpretation. `;
256
- break;
257
- case "vintage":
258
- prompt += `Vintage or retro aesthetic. Classic design elements. `;
259
- break;
260
- case "modern":
261
- prompt += `Contemporary and sleek design. Current trends. `;
262
- break;
263
- case "bold":
264
- prompt += `Strong, impactful design. High contrast and dramatic. `;
265
- break;
266
- case "elegant":
267
- prompt += `Sophisticated and refined. Graceful composition. `;
268
- break;
269
- }
270
-
271
- // Add colors
272
- if (colorList.length > 0) {
273
- prompt += `Color palette: ${colorList.join(", ")}. `;
274
- }
275
-
276
- // Add mood
277
- if (mood) {
278
- prompt += `Overall mood: ${mood}. `;
279
- }
280
-
281
- // Add professional requirements
282
- prompt += `Professional quality, suitable for print. High-resolution, balanced composition. `;
283
- prompt += `Cover should be visually appealing and genre-appropriate.`;
284
-
285
- return prompt;
286
- }
287
-
288
- async function generateImageWithDallE(
289
- openai: OpenAI,
290
- prompt: string,
291
- quality: "standard" | "hd",
292
- dimensions: DimensionSpec
293
- ): Promise<string> {
294
- log(`Generating image with DALL-E 3...`, "debug");
295
- log(`Prompt: ${prompt.substring(0, 100)}...`, "debug");
296
-
297
- try {
298
- // DALL-E 3 only supports 1024x1024, 1024x1792, or 1792x1024
299
- // We'll request the appropriate size and note that post-processing would be needed
300
- const aspectRatio = dimensions.width / dimensions.height;
301
- let size: "1024x1024" | "1024x1792" | "1792x1024" = "1024x1792";
302
-
303
- if (Math.abs(aspectRatio - 1) < 0.1) {
304
- size = "1024x1024"; // Square
305
- } else if (aspectRatio > 1) {
306
- size = "1792x1024"; // Landscape
307
- } else {
308
- size = "1024x1792"; // Portrait
309
- }
310
-
311
- const response = await openai.images.generate({
312
- model: "dall-e-3",
313
- prompt: prompt,
314
- n: 1,
315
- size: size,
316
- quality: quality,
317
- style: "vivid",
318
- });
319
-
320
- const imageUrl = response.data[0]?.url;
321
- if (!imageUrl) {
322
- throw new Error("No image URL returned from DALL-E");
323
- }
324
-
325
- log(`Image generated successfully`, "success");
326
- return imageUrl;
327
- } catch (error) {
328
- log(`Failed to generate image: ${error}`, "error");
329
- throw error;
330
- }
331
- }
332
-
333
- async function downloadImage(url: string, outputPath: string): Promise<void> {
334
- log(`Downloading image...`, "debug");
335
- log(`URL: ${url.substring(0, 50)}...`, "debug");
336
- log(`Output: ${outputPath}`, "debug");
337
-
338
- try {
339
- const response = await fetch(url);
340
- if (!response.ok) {
341
- throw new Error(`Failed to download image: ${response.statusText}`);
342
- }
343
-
344
- const arrayBuffer = await response.arrayBuffer();
345
- const buffer = Buffer.from(arrayBuffer);
346
-
347
- await writeFile(outputPath, buffer);
348
- log(`Image saved successfully`, "success");
349
- } catch (error) {
350
- log(`Failed to download image: ${error}`, "error");
351
- throw error;
352
- }
353
- }
354
-
355
- async function generateCover(
356
- openai: OpenAI,
357
- options: BookCoverOptions,
358
- coverType: "front" | "spine" | "back" | "full-wrap",
359
- outputDir: string,
360
- filePrefix: string
361
- ): Promise<GeneratedCover> {
362
- const prompt = generatePrompt(options, coverType);
363
- const dimensions = DIMENSIONS[options.dimensions];
364
-
365
- const imageUrl = await generateImageWithDallE(openai, prompt, options.quality, dimensions);
366
-
367
- const ext = options.format === "jpg" ? "jpg" : "png";
368
- const filename = `${filePrefix}-${coverType}.${ext}`;
369
- const filepath = join(outputDir, filename);
370
-
371
- await downloadImage(imageUrl, filepath);
372
-
373
- return {
374
- type: coverType,
375
- filename,
376
- url: imageUrl,
377
- prompt,
378
- };
379
- }
380
-
381
- async function generateMockup(
382
- openai: OpenAI,
383
- options: BookCoverOptions,
384
- frontCoverPath: string,
385
- outputDir: string,
386
- filePrefix: string
387
- ): Promise<GeneratedCover> {
388
- log(`Generating 3D book mockup...`, "info");
389
-
390
- const prompt = `3D realistic book mockup, ${options.dimensions} book standing upright at a slight angle,
391
- professional photography, clean white background, soft shadows, studio lighting,
392
- photorealistic rendering, high quality product photography`;
393
-
394
- const dimensions = { format: "mockup", width: 2048, height: 2048, dpi: 300 };
395
-
396
- const imageUrl = await generateImageWithDallE(openai, prompt, "hd", dimensions);
397
-
398
- const ext = options.format === "jpg" ? "jpg" : "png";
399
- const filename = `${filePrefix}-mockup.${ext}`;
400
- const filepath = join(outputDir, filename);
401
-
402
- await downloadImage(imageUrl, filepath);
403
-
404
- return {
405
- type: "mockup",
406
- filename,
407
- url: imageUrl,
408
- prompt,
409
- };
410
- }
411
-
412
- async function saveMetadata(
413
- options: BookCoverOptions,
414
- generatedCovers: GeneratedCover[],
415
- outputDir: string
416
- ): Promise<void> {
417
- const metadata: CoverMetadata = {
418
- title: options.title,
419
- author: options.author,
420
- genre: options.genre,
421
- style: options.style,
422
- dimensions: DIMENSIONS[options.dimensions],
423
- colors: options.colors ? parseColorInput(options.colors) : undefined,
424
- mood: options.mood,
425
- generatedAt: new Date().toISOString(),
426
- aiPrompt: generatedCovers[0]?.prompt || "",
427
- files: {},
428
- };
429
-
430
- for (const cover of generatedCovers) {
431
- metadata.files[cover.type === "full-wrap" ? "fullWrap" : cover.type] = cover.filename;
432
- }
433
-
434
- const metadataPath = join(outputDir, "metadata.json");
435
- await writeFile(metadataPath, JSON.stringify(metadata, null, 2));
436
-
437
- log(`Metadata saved to ${metadataPath}`, "success");
438
- }
439
-
440
- async function generateReadme(outputDir: string): Promise<void> {
441
- const readme = `# Generated Book Covers
442
-
443
- This directory contains AI-generated book covers created with the generate-book-cover skill.
444
-
445
- ## Using Your Covers
446
-
447
- ### For Digital Publishing (Ebook)
448
- - Use the \`*-front.png\` file
449
- - Upload to Amazon KDP, Draft2Digital, or other platforms
450
- - Recommended: 1600x2400px for ebooks
451
-
452
- ### For Print Publishing
453
- - Use the \`*-full-wrap.png\` file if available (includes front, spine, and back)
454
- - Or use individual \`*-front.png\`, \`*-spine.png\`, \`*-back.png\` files
455
- - Ensure 300 DPI resolution for professional printing
456
- - Convert RGB to CMYK before sending to printer
457
-
458
- ### For Marketing
459
- - Use the \`*-mockup.png\` file for promotional materials
460
- - Share on social media, websites, and advertising
461
-
462
- ## File Formats
463
-
464
- - **PNG**: Lossless format, best for editing and archiving
465
- - **JPG**: Smaller file size, suitable for web use
466
-
467
- ## Next Steps
468
-
469
- 1. Review the generated covers in this directory
470
- 2. Edit text overlays if needed (use Photoshop, GIMP, or Canva)
471
- 3. Convert to CMYK for print (use Adobe Photoshop or online tools)
472
- 4. Upload to your publishing platform
473
-
474
- ## Metadata
475
-
476
- Each cover includes a \`metadata.json\` file with:
477
- - Book title and author
478
- - Genre and style used
479
- - Dimensions and specifications
480
- - Color palette
481
- - AI prompt used for generation
482
-
483
- ## Need Help?
484
-
485
- - Regenerate with different options: \`skills run generate-book-cover --help\`
486
- - Visit: https://skills.md/docs/generate-book-cover
487
- - Support: support@skills.md
488
- `;
489
-
490
- const readmePath = join(outputDir, "README.md");
491
- await writeFile(readmePath, readme);
492
-
493
- log(`README saved to ${readmePath}`, "success");
494
- }
495
-
496
- // ============================================================================
497
- // Main Function
498
- // ============================================================================
499
-
500
- async function main() {
501
- log(`Starting ${SKILL_NAME} session: ${SESSION_ID}`, "debug");
502
-
503
- // Parse command-line arguments
504
- const { values, positionals } = parseArgs({
505
- args: process.argv.slice(2),
506
- options: {
507
- genre: { type: "string", default: "fiction" },
508
- author: { type: "string" },
509
- subtitle: { type: "string" },
510
- tagline: { type: "string" },
511
- series: { type: "string" },
512
- style: { type: "string", default: "modern" },
513
- dimensions: { type: "string", default: "paperback" },
514
- colors: { type: "string" },
515
- "font-style": { type: "string", default: "serif" },
516
- "include-spine": { type: "boolean", default: false },
517
- "include-back": { type: "boolean", default: false },
518
- "full-wrap": { type: "boolean", default: false },
519
- "spine-width": { type: "string" },
520
- "page-count": { type: "string", default: "200" },
521
- variations: { type: "string", default: "1" },
522
- styles: { type: "string" },
523
- quality: { type: "string", default: "hd" },
524
- "aspect-focus": { type: "string", default: "center" },
525
- mood: { type: "string" },
526
- output: { type: "string" },
527
- format: { type: "string", default: "png" },
528
- prefix: { type: "string" },
529
- "include-mockup": { type: "boolean", default: false },
530
- help: { type: "boolean", short: "h" },
531
- },
532
- allowPositionals: true,
533
- });
534
-
535
- // Show help
536
- if (values.help) {
537
- console.log(`
538
- Generate Book Cover - AI-Powered Book Cover Design
539
-
540
- Usage:
541
- skills run generate-book-cover -- "Book Title" [options]
542
-
543
- Options:
544
- --genre <string> Genre (fiction, non-fiction, sci-fi, etc.) [default: fiction]
545
- --author <string> Author name
546
- --subtitle <string> Book subtitle
547
- --style <string> Visual style (modern, minimalist, etc.) [default: modern]
548
- --dimensions <string> Format (paperback, hardcover, ebook) [default: paperback]
549
- --colors <string> Color palette
550
- --output <path> Output directory
551
- --help, -h Show this help
552
- `);
553
- process.exit(0);
554
- }
555
-
556
- // Get title from positional argument
557
- const title = positionals[0];
558
- if (!title) {
559
- log("Error: Book title is required", "error");
560
- console.error("Usage: skills run generate-book-cover -- \"Your Book Title\" [options]");
561
- process.exit(1);
562
- }
563
-
564
- // Get OpenAI API key
565
- const apiKey = process.env.OPENAI_API_KEY;
566
- if (!apiKey) {
567
- log("Error: OPENAI_API_KEY environment variable is required", "error");
568
- console.error("\nSet it with: export OPENAI_API_KEY='sk-...'");
569
- process.exit(1);
570
- }
571
-
572
- // Initialize OpenAI client
573
- const openai = new OpenAI({ apiKey });
574
-
575
- // Parse options
576
- const options: BookCoverOptions = {
577
- title,
578
- genre: values.genre as string,
579
- author: values.author as string | undefined,
580
- subtitle: values.subtitle as string | undefined,
581
- tagline: values.tagline as string | undefined,
582
- series: values.series as string | undefined,
583
- style: values.style as string,
584
- dimensions: values.dimensions as string,
585
- colors: values.colors as string | undefined,
586
- fontStyle: values["font-style"] as string,
587
- includeSpine: values["include-spine"] as boolean,
588
- includeBack: values["include-back"] as boolean,
589
- fullWrap: values["full-wrap"] as boolean,
590
- spineWidth: values["spine-width"] ? parseFloat(values["spine-width"] as string) : undefined,
591
- pageCount: parseInt(values["page-count"] as string),
592
- variations: parseInt(values.variations as string),
593
- styles: values.styles ? (values.styles as string).split(",").map(s => s.trim()) : undefined,
594
- quality: (values.quality as "standard" | "hd") || "hd",
595
- aspectFocus: values["aspect-focus"] as string,
596
- mood: values.mood as string | undefined,
597
- output: values.output as string || process.env.SKILLS_OUTPUT_DIR || ".skills/exports/generate-book-cover",
598
- format: (values.format as "png" | "jpg" | "both") || "png",
599
- prefix: values.prefix as string | undefined,
600
- includeMockup: values["include-mockup"] as boolean,
601
- };
602
-
603
- // Validate dimensions
604
- if (!DIMENSIONS[options.dimensions]) {
605
- log(`Error: Invalid dimensions "${options.dimensions}"`, "error");
606
- console.error(`Valid options: ${Object.keys(DIMENSIONS).join(", ")}`);
607
- process.exit(1);
608
- }
609
-
610
- // Calculate spine width if needed
611
- if (options.includeSpine && !options.spineWidth) {
612
- options.spineWidth = calculateSpineWidth(options.pageCount);
613
- }
614
-
615
- // Create output directory
616
- const filePrefix = options.prefix || slugify(title);
617
- const outputDir = join(options.output, filePrefix);
618
- await mkdir(outputDir, { recursive: true });
619
-
620
- log("Configuration:", "info");
621
- log(` Title: ${options.title}`, "info");
622
- log(` Genre: ${options.genre}`, "info");
623
- log(` Style: ${options.style}`, "info");
624
- log(` Output: ${outputDir}`, "info");
625
-
626
- // Generate covers
627
- const generatedCovers: GeneratedCover[] = [];
628
-
629
- try {
630
- // Generate variations if requested
631
- const stylesToGenerate = options.styles || [options.style];
632
- const numVariations = Math.min(options.variations, stylesToGenerate.length);
633
-
634
- for (let i = 0; i < numVariations; i++) {
635
- const variantStyle = stylesToGenerate[i] || options.style;
636
- const variantOptions = { ...options, style: variantStyle };
637
- const variantPrefix = numVariations > 1 ? `${filePrefix}-${i + 1}` : filePrefix;
638
-
639
- log(`Generating variation ${i + 1} of ${numVariations} (${variantStyle} style)`, "info");
640
-
641
- // Generate front cover (always)
642
- const frontCover = await generateCover(openai, variantOptions, "front", outputDir, variantPrefix);
643
- generatedCovers.push(frontCover);
644
-
645
- // Generate spine if requested
646
- if (options.includeSpine) {
647
- const spineCover = await generateCover(openai, variantOptions, "spine", outputDir, variantPrefix);
648
- generatedCovers.push(spineCover);
649
- }
650
-
651
- // Generate back cover if requested
652
- if (options.includeBack) {
653
- const backCover = await generateCover(openai, variantOptions, "back", outputDir, variantPrefix);
654
- generatedCovers.push(backCover);
655
- }
656
-
657
- // Generate full wrap if requested
658
- if (options.fullWrap) {
659
- const fullWrapCover = await generateCover(openai, variantOptions, "full-wrap", outputDir, variantPrefix);
660
- generatedCovers.push(fullWrapCover);
661
- }
662
-
663
- // Generate mockup if requested
664
- if (options.includeMockup) {
665
- const mockup = await generateMockup(openai, variantOptions, frontCover.filename, outputDir, variantPrefix);
666
- generatedCovers.push(mockup);
667
- }
668
-
669
- // Save metadata for this variation
670
- await saveMetadata(variantOptions, generatedCovers, outputDir);
671
- }
672
-
673
- // Generate README
674
- await generateReadme(outputDir);
675
-
676
- // Success summary
677
- log("Book cover generation complete!", "success");
678
- console.log(`\nšŸ“ Output directory: ${outputDir}`);
679
- console.log(`\nšŸ“Š Generated files:`);
680
- for (const cover of generatedCovers) {
681
- console.log(` - ${cover.filename} (${cover.type})`);
682
- }
683
-
684
- } catch (error) {
685
- log(`Error generating book cover: ${error}`, "error");
686
- process.exit(1);
687
- }
688
- }
689
-
690
- // Run the script
691
- main().catch(error => {
692
- console.error("Fatal error:", error);
693
- process.exit(1);
694
- });