@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
@@ -5,1000 +5,17 @@
5
5
  * Generates complete project boilerplates from plain English descriptions
6
6
  */
7
7
 
8
- import { parseArgs } from "util";
9
- import { existsSync, mkdirSync, writeFileSync } from "fs";
10
8
  import { spawnSync } from "child_process";
11
- import { join } from "path";
12
-
13
- // ============================================================================
14
- // Security: Allowlist for Package Managers
15
- // ============================================================================
16
-
17
- const ALLOWED_PACKAGE_MANAGERS = ['npm', 'yarn', 'pnpm', 'bun'] as const;
18
-
19
- function validatePackageManager(pm: string): asserts pm is PackageManager {
20
- if (!ALLOWED_PACKAGE_MANAGERS.includes(pm as PackageManager)) {
21
- throw new Error(
22
- `Invalid package manager: "${pm}". Must be one of: ${ALLOWED_PACKAGE_MANAGERS.join(', ')}`
23
- );
24
- }
25
- }
26
-
27
- // ============================================================================
28
- // Types & Interfaces
29
- // ============================================================================
30
-
31
- type Template =
32
- | 'next' | 'react' | 'vue' | 'svelte' | 'astro' | 'remix'
33
- | 'express' | 'fastapi' | 'hono' | 'elysia' | 'nestjs'
34
- | 't3' | 'nextjs-supabase' | 'remix-prisma'
35
- | 'rest-api' | 'graphql' | 'trpc'
36
- | 'cli' | 'chrome-extension' | 'electron' | 'react-native' | 'tauri' | 'monorepo';
37
-
38
- type Database = 'prisma' | 'drizzle' | 'supabase' | 'none';
39
- type Auth = 'nextauth' | 'clerk' | 'lucia' | 'supabase' | 'none';
40
- type Testing = 'vitest' | 'playwright' | 'both' | 'none';
41
- type State = 'zustand' | 'jotai' | 'redux' | 'none';
42
- type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';
43
-
44
- interface ScaffoldOptions {
45
- description?: string;
46
- template?: Template;
47
- name?: string;
48
- output?: string;
49
- typescript: boolean;
50
- tailwind: boolean;
51
- shadcn: boolean;
52
- database: Database;
53
- auth: Auth;
54
- testing: Testing;
55
- state: State;
56
- git: boolean;
57
- install: boolean;
58
- pm: PackageManager;
59
- dryRun: boolean;
60
- verbose: boolean;
61
- }
62
-
63
- interface ProjectConfig {
64
- name: string;
65
- template: Template;
66
- outputDir: string;
67
- dependencies: string[];
68
- devDependencies: string[];
69
- scripts: Record<string, string>;
70
- files: Array<{ path: string; content: string }>;
71
- features: string[];
72
- }
73
-
74
- // ============================================================================
75
- // Template Definitions
76
- // ============================================================================
77
-
78
- const TEMPLATES: Record<Template, {
79
- name: string;
80
- description: string;
81
- category: string;
82
- defaultDeps: string[];
83
- defaultDevDeps: string[];
84
- }> = {
85
- next: {
86
- name: 'Next.js 15',
87
- description: 'Next.js 15 App Router with React, TypeScript, and Tailwind',
88
- category: 'frontend',
89
- defaultDeps: ['next', 'react', 'react-dom'],
90
- defaultDevDeps: ['@types/node', '@types/react', '@types/react-dom', 'typescript'],
91
- },
92
- react: {
93
- name: 'React + Vite',
94
- description: 'Vite + React + TypeScript',
95
- category: 'frontend',
96
- defaultDeps: ['react', 'react-dom'],
97
- defaultDevDeps: ['@types/react', '@types/react-dom', '@vitejs/plugin-react', 'typescript', 'vite'],
98
- },
99
- vue: {
100
- name: 'Vue 3 + Vite',
101
- description: 'Vite + Vue 3 + TypeScript',
102
- category: 'frontend',
103
- defaultDeps: ['vue'],
104
- defaultDevDeps: ['@vitejs/plugin-vue', 'typescript', 'vite', 'vue-tsc'],
105
- },
106
- svelte: {
107
- name: 'SvelteKit',
108
- description: 'SvelteKit + TypeScript',
109
- category: 'frontend',
110
- defaultDeps: ['svelte'],
111
- defaultDevDeps: ['@sveltejs/adapter-auto', '@sveltejs/kit', 'typescript', 'vite'],
112
- },
113
- astro: {
114
- name: 'Astro',
115
- description: 'Astro + TypeScript',
116
- category: 'frontend',
117
- defaultDeps: ['astro'],
118
- defaultDevDeps: ['@astrojs/tailwind', 'typescript'],
119
- },
120
- remix: {
121
- name: 'Remix',
122
- description: 'Remix + TypeScript',
123
- category: 'frontend',
124
- defaultDeps: ['@remix-run/node', '@remix-run/react', '@remix-run/serve', 'react', 'react-dom'],
125
- defaultDevDeps: ['@remix-run/dev', '@types/react', '@types/react-dom', 'typescript'],
126
- },
127
- express: {
128
- name: 'Express.js',
129
- description: 'Express + TypeScript',
130
- category: 'backend',
131
- defaultDeps: ['express', 'cors', 'dotenv'],
132
- defaultDevDeps: ['@types/express', '@types/cors', '@types/node', 'typescript', 'tsx'],
133
- },
134
- fastapi: {
135
- name: 'FastAPI',
136
- description: 'FastAPI + Python',
137
- category: 'backend',
138
- defaultDeps: ['fastapi', 'uvicorn', 'pydantic'],
139
- defaultDevDeps: ['black', 'pytest'],
140
- },
141
- hono: {
142
- name: 'Hono',
143
- description: 'Hono + TypeScript (edge-ready)',
144
- category: 'backend',
145
- defaultDeps: ['hono'],
146
- defaultDevDeps: ['@types/node', 'typescript'],
147
- },
148
- elysia: {
149
- name: 'Elysia',
150
- description: 'Elysia + Bun + TypeScript',
151
- category: 'backend',
152
- defaultDeps: ['elysia'],
153
- defaultDevDeps: ['bun-types'],
154
- },
155
- nestjs: {
156
- name: 'NestJS',
157
- description: 'NestJS + TypeScript',
158
- category: 'backend',
159
- defaultDeps: ['@nestjs/common', '@nestjs/core', '@nestjs/platform-express', 'reflect-metadata', 'rxjs'],
160
- defaultDevDeps: ['@nestjs/cli', '@types/node', 'typescript'],
161
- },
162
- t3: {
163
- name: 'T3 Stack',
164
- description: 'Next.js + tRPC + Prisma + NextAuth',
165
- category: 'fullstack',
166
- defaultDeps: ['next', 'react', 'react-dom', '@trpc/client', '@trpc/server', '@trpc/react-query', '@tanstack/react-query', 'zod'],
167
- defaultDevDeps: ['@types/node', '@types/react', '@types/react-dom', 'typescript'],
168
- },
169
- 'nextjs-supabase': {
170
- name: 'Next.js + Supabase',
171
- description: 'Next.js + Supabase',
172
- category: 'fullstack',
173
- defaultDeps: ['next', 'react', 'react-dom', '@supabase/supabase-js'],
174
- defaultDevDeps: ['@types/node', '@types/react', '@types/react-dom', 'typescript'],
175
- },
176
- 'remix-prisma': {
177
- name: 'Remix + Prisma',
178
- description: 'Remix + Prisma ORM',
179
- category: 'fullstack',
180
- defaultDeps: ['@remix-run/node', '@remix-run/react', '@remix-run/serve', 'react', 'react-dom', '@prisma/client'],
181
- defaultDevDeps: ['@remix-run/dev', '@types/react', '@types/react-dom', 'typescript', 'prisma'],
182
- },
183
- 'rest-api': {
184
- name: 'REST API',
185
- description: 'REST API boilerplate',
186
- category: 'api',
187
- defaultDeps: ['express', 'cors', 'dotenv'],
188
- defaultDevDeps: ['@types/express', '@types/cors', '@types/node', 'typescript', 'tsx'],
189
- },
190
- graphql: {
191
- name: 'GraphQL API',
192
- description: 'GraphQL API (Apollo Server)',
193
- category: 'api',
194
- defaultDeps: ['@apollo/server', 'graphql'],
195
- defaultDevDeps: ['@types/node', 'typescript'],
196
- },
197
- trpc: {
198
- name: 'tRPC API',
199
- description: 'tRPC API',
200
- category: 'api',
201
- defaultDeps: ['@trpc/server', 'zod'],
202
- defaultDevDeps: ['@types/node', 'typescript'],
203
- },
204
- cli: {
205
- name: 'CLI Tool',
206
- description: 'CLI tool with Commander.js or Bun',
207
- category: 'other',
208
- defaultDeps: ['commander'],
209
- defaultDevDeps: ['@types/node', 'typescript'],
210
- },
211
- 'chrome-extension': {
212
- name: 'Chrome Extension',
213
- description: 'Chrome extension boilerplate',
214
- category: 'other',
215
- defaultDeps: [],
216
- defaultDevDeps: ['@types/chrome', 'typescript'],
217
- },
218
- electron: {
219
- name: 'Electron',
220
- description: 'Electron desktop app',
221
- category: 'other',
222
- defaultDeps: ['electron'],
223
- defaultDevDeps: ['@types/node', 'typescript'],
224
- },
225
- 'react-native': {
226
- name: 'React Native',
227
- description: 'React Native mobile app',
228
- category: 'other',
229
- defaultDeps: ['react', 'react-native'],
230
- defaultDevDeps: ['@types/react', 'typescript'],
231
- },
232
- tauri: {
233
- name: 'Tauri',
234
- description: 'Tauri desktop app',
235
- category: 'other',
236
- defaultDeps: ['@tauri-apps/api'],
237
- defaultDevDeps: ['@tauri-apps/cli', 'typescript'],
238
- },
239
- monorepo: {
240
- name: 'Turborepo Monorepo',
241
- description: 'Turborepo monorepo',
242
- category: 'other',
243
- defaultDeps: [],
244
- defaultDevDeps: ['turbo'],
245
- },
246
- };
247
-
248
- // ============================================================================
249
- // AI Template Detection
250
- // ============================================================================
251
-
252
- async function detectTemplate(description: string, verbose: boolean): Promise<{ template: Template; features: string[] }> {
253
- const apiKey = process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY;
254
-
255
- if (!apiKey) {
256
- console.error('❌ No API key found for AI detection.');
257
- console.error('Set OPENAI_API_KEY or ANTHROPIC_API_KEY, or use --template to specify manually.');
258
- process.exit(1);
259
- }
260
-
261
- if (verbose) {
262
- console.log('🤖 Analyzing description with AI...');
263
- }
264
-
265
- const prompt = `Analyze this project description and select the BEST matching template from the list below.
266
-
267
- Project Description: "${description}"
268
-
269
- Available Templates:
270
- ${Object.entries(TEMPLATES).map(([key, val]) => `- ${key}: ${val.description}`).join('\n')}
271
-
272
- Also suggest which of these features to include:
273
- - database: prisma, drizzle, supabase, none
274
- - auth: nextauth, clerk, lucia, supabase, none
275
- - testing: vitest, playwright, both, none
276
- - state: zustand, jotai, redux, none
277
- - shadcn: true, false
278
- - tailwind: true, false
279
-
280
- Respond ONLY with valid JSON in this format:
281
- {
282
- "template": "template-name",
283
- "features": {
284
- "database": "prisma or drizzle or supabase or none",
285
- "auth": "nextauth or clerk or lucia or supabase or none",
286
- "testing": "vitest or playwright or both or none",
287
- "state": "zustand or jotai or redux or none",
288
- "shadcn": true or false,
289
- "tailwind": true or false
290
- },
291
- "reasoning": "Brief explanation of why this template was chosen"
292
- }`;
293
-
294
- try {
295
- let response: any;
296
-
297
- if (process.env.OPENAI_API_KEY) {
298
- // Use OpenAI
299
- const res = await fetch('https://api.openai.com/v1/chat/completions', {
300
- method: 'POST',
301
- headers: {
302
- 'Content-Type': 'application/json',
303
- 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`,
304
- },
305
- body: JSON.stringify({
306
- model: 'gpt-4o-mini',
307
- messages: [
308
- { role: 'system', content: 'You are a helpful assistant that selects appropriate project templates.' },
309
- { role: 'user', content: prompt }
310
- ],
311
- temperature: 0.3,
312
- }),
313
- });
314
-
315
- if (!res.ok) {
316
- throw new Error(`OpenAI API error: ${res.statusText}`);
317
- }
318
-
319
- const data = await res.json();
320
- response = JSON.parse(data.choices[0].message.content);
321
- } else {
322
- // Use Anthropic
323
- const res = await fetch('https://api.anthropic.com/v1/messages', {
324
- method: 'POST',
325
- headers: {
326
- 'Content-Type': 'application/json',
327
- 'x-api-key': process.env.ANTHROPIC_API_KEY!,
328
- 'anthropic-version': '2023-06-01',
329
- },
330
- body: JSON.stringify({
331
- model: 'claude-3-5-sonnet-20241022',
332
- max_tokens: 1024,
333
- messages: [
334
- { role: 'user', content: prompt }
335
- ],
336
- }),
337
- });
338
-
339
- if (!res.ok) {
340
- throw new Error(`Anthropic API error: ${res.statusText}`);
341
- }
342
-
343
- const data = await res.json();
344
- response = JSON.parse(data.content[0].text);
345
- }
346
-
347
- if (verbose) {
348
- console.log(`✅ Selected template: ${response.template}`);
349
- console.log(`💡 Reasoning: ${response.reasoning}`);
350
- }
351
-
352
- // Convert features object to array of strings
353
- const featuresArray: string[] = [];
354
- if (response.features.database && response.features.database !== 'none') {
355
- featuresArray.push(`database:${response.features.database}`);
356
- }
357
- if (response.features.auth && response.features.auth !== 'none') {
358
- featuresArray.push(`auth:${response.features.auth}`);
359
- }
360
- if (response.features.testing && response.features.testing !== 'none') {
361
- featuresArray.push(`testing:${response.features.testing}`);
362
- }
363
- if (response.features.state && response.features.state !== 'none') {
364
- featuresArray.push(`state:${response.features.state}`);
365
- }
366
- if (response.features.shadcn) {
367
- featuresArray.push('shadcn');
368
- }
369
- if (response.features.tailwind) {
370
- featuresArray.push('tailwind');
371
- }
372
-
373
- return {
374
- template: response.template,
375
- features: featuresArray,
376
- };
377
- } catch (error) {
378
- console.error('❌ AI detection failed:', error);
379
- console.error('Please specify --template manually.');
380
- process.exit(1);
381
- }
382
- }
383
-
384
- // ============================================================================
385
- // Project Generation
386
- // ============================================================================
387
-
388
- function generateProjectConfig(options: ScaffoldOptions): ProjectConfig {
389
- const template = TEMPLATES[options.template!];
390
- const name = options.name || 'my-app';
391
- const outputDir = options.output || join(process.cwd(), name);
392
-
393
- const config: ProjectConfig = {
394
- name,
395
- template: options.template!,
396
- outputDir,
397
- dependencies: [...template.defaultDeps],
398
- devDependencies: [...template.defaultDevDeps],
399
- scripts: {},
400
- files: [],
401
- features: [],
402
- };
403
-
404
- // Add TypeScript
405
- if (options.typescript) {
406
- config.features.push('typescript');
407
- }
408
-
409
- // Add Tailwind CSS
410
- if (options.tailwind) {
411
- config.dependencies.push('tailwindcss', 'autoprefixer', 'postcss');
412
- config.features.push('tailwind');
413
- }
414
-
415
- // Add shadcn/ui
416
- if (options.shadcn) {
417
- config.dependencies.push('class-variance-authority', 'clsx', 'tailwind-merge');
418
- config.devDependencies.push('tailwindcss-animate');
419
- config.features.push('shadcn');
420
- }
421
-
422
- // Add database
423
- if (options.database !== 'none') {
424
- config.features.push(`database:${options.database}`);
425
-
426
- if (options.database === 'prisma') {
427
- config.dependencies.push('@prisma/client');
428
- config.devDependencies.push('prisma');
429
- } else if (options.database === 'drizzle') {
430
- config.dependencies.push('drizzle-orm', 'postgres');
431
- config.devDependencies.push('drizzle-kit');
432
- } else if (options.database === 'supabase') {
433
- config.dependencies.push('@supabase/supabase-js');
434
- }
435
- }
436
-
437
- // Add authentication
438
- if (options.auth !== 'none') {
439
- config.features.push(`auth:${options.auth}`);
440
-
441
- if (options.auth === 'nextauth') {
442
- config.dependencies.push('next-auth');
443
- } else if (options.auth === 'clerk') {
444
- config.dependencies.push('@clerk/nextjs');
445
- } else if (options.auth === 'lucia') {
446
- config.dependencies.push('lucia');
447
- }
448
- }
449
-
450
- // Add testing
451
- if (options.testing !== 'none') {
452
- config.features.push(`testing:${options.testing}`);
453
-
454
- if (options.testing === 'vitest' || options.testing === 'both') {
455
- config.devDependencies.push('vitest', '@vitest/ui');
456
- }
457
- if (options.testing === 'playwright' || options.testing === 'both') {
458
- config.devDependencies.push('@playwright/test');
459
- }
460
- }
461
-
462
- // Add state management
463
- if (options.state !== 'none') {
464
- config.features.push(`state:${options.state}`);
465
-
466
- if (options.state === 'zustand') {
467
- config.dependencies.push('zustand');
468
- } else if (options.state === 'jotai') {
469
- config.dependencies.push('jotai');
470
- } else if (options.state === 'redux') {
471
- config.dependencies.push('@reduxjs/toolkit', 'react-redux');
472
- }
473
- }
474
-
475
- // Add ESLint and Prettier
476
- config.devDependencies.push('eslint', 'prettier');
477
-
478
- return config;
479
- }
480
-
481
- function generateFiles(config: ProjectConfig, options: ScaffoldOptions): void {
482
- const { outputDir, name, template } = config;
483
-
484
- // Create output directory
485
- if (!existsSync(outputDir)) {
486
- mkdirSync(outputDir, { recursive: true });
487
- }
488
-
489
- // Generate package.json
490
- const packageJson = {
491
- name,
492
- version: '0.1.0',
493
- private: true,
494
- scripts: generateScripts(template, options),
495
- dependencies: config.dependencies.reduce((acc, dep) => {
496
- acc[dep] = 'latest';
497
- return acc;
498
- }, {} as Record<string, string>),
499
- devDependencies: config.devDependencies.reduce((acc, dep) => {
500
- acc[dep] = 'latest';
501
- return acc;
502
- }, {} as Record<string, string>),
503
- };
504
-
505
- writeFileSync(
506
- join(outputDir, 'package.json'),
507
- JSON.stringify(packageJson, null, 2)
508
- );
509
-
510
- // Generate tsconfig.json
511
- if (options.typescript) {
512
- const tsConfig = generateTsConfig(template);
513
- writeFileSync(
514
- join(outputDir, 'tsconfig.json'),
515
- JSON.stringify(tsConfig, null, 2)
516
- );
517
- }
518
-
519
- // Generate .gitignore
520
- const gitignore = generateGitignore(template);
521
- writeFileSync(join(outputDir, '.gitignore'), gitignore);
522
-
523
- // Generate .env.example
524
- const envExample = generateEnvExample(options);
525
- writeFileSync(join(outputDir, '.env.example'), envExample);
526
-
527
- // Generate README.md
528
- const readme = generateReadme(config, options);
529
- writeFileSync(join(outputDir, 'README.md'), readme);
530
-
531
- // Generate template-specific files
532
- generateTemplateFiles(config, options);
533
-
534
- console.log(`\n✅ Project scaffolded successfully!`);
535
- console.log(`📁 Location: ${outputDir}`);
536
- console.log(`\nNext steps:`);
537
- console.log(` cd ${name}`);
538
- if (!options.install) {
539
- console.log(` ${options.pm} install`);
540
- }
541
- console.log(` ${options.pm} ${options.pm === 'npm' ? 'run ' : ''}dev`);
542
- }
543
-
544
- function generateScripts(template: Template, options: ScaffoldOptions): Record<string, string> {
545
- const scripts: Record<string, string> = {
546
- dev: 'next dev',
547
- build: 'next build',
548
- start: 'next start',
549
- lint: 'eslint .',
550
- format: 'prettier --write .',
551
- };
552
-
553
- // Template-specific scripts
554
- if (template === 'next') {
555
- scripts.dev = 'next dev';
556
- scripts.build = 'next build';
557
- scripts.start = 'next start';
558
- } else if (template === 'react') {
559
- scripts.dev = 'vite';
560
- scripts.build = 'vite build';
561
- scripts.preview = 'vite preview';
562
- } else if (template === 'express' || template === 'rest-api') {
563
- scripts.dev = 'tsx watch src/index.ts';
564
- scripts.build = 'tsc';
565
- scripts.start = 'node dist/index.js';
566
- }
567
-
568
- // Database scripts
569
- if (options.database === 'prisma') {
570
- scripts['db:generate'] = 'prisma generate';
571
- scripts['db:push'] = 'prisma db push';
572
- scripts['db:migrate'] = 'prisma migrate dev';
573
- scripts['db:studio'] = 'prisma studio';
574
- } else if (options.database === 'drizzle') {
575
- scripts['db:generate'] = 'drizzle-kit generate';
576
- scripts['db:migrate'] = 'drizzle-kit migrate';
577
- scripts['db:studio'] = 'drizzle-kit studio';
578
- }
579
-
580
- // Testing scripts
581
- if (options.testing === 'vitest' || options.testing === 'both') {
582
- scripts.test = 'vitest';
583
- scripts['test:ui'] = 'vitest --ui';
584
- }
585
- if (options.testing === 'playwright' || options.testing === 'both') {
586
- scripts['test:e2e'] = 'playwright test';
587
- }
588
-
589
- return scripts;
590
- }
591
-
592
- function generateTsConfig(template: Template): any {
593
- return {
594
- compilerOptions: {
595
- target: 'ES2020',
596
- lib: ['ES2020', 'DOM', 'DOM.Iterable'],
597
- module: 'ESNext',
598
- skipLibCheck: true,
599
- moduleResolution: 'bundler',
600
- allowImportingTsExtensions: true,
601
- resolveJsonModule: true,
602
- isolatedModules: true,
603
- noEmit: true,
604
- jsx: template.includes('react') || template === 'next' ? 'preserve' : undefined,
605
- strict: true,
606
- noUnusedLocals: true,
607
- noUnusedParameters: true,
608
- noFallthroughCasesInSwitch: true,
609
- baseUrl: '.',
610
- paths: {
611
- '@/*': ['./src/*'],
612
- },
613
- },
614
- include: ['src'],
615
- exclude: ['node_modules'],
616
- };
617
- }
618
-
619
- function generateGitignore(template: Template): string {
620
- return `# Dependencies
621
- node_modules
622
- .pnp
623
- .pnp.js
624
-
625
- # Testing
626
- coverage
627
- .nyc_output
628
-
629
- # Next.js
630
- .next
631
- out
632
-
633
- # Production
634
- build
635
- dist
636
-
637
- # Misc
638
- .DS_Store
639
- *.pem
640
-
641
- # Debug
642
- npm-debug.log*
643
- yarn-debug.log*
644
- yarn-error.log*
645
-
646
- # Local env files
647
- .env
648
- .env*.local
649
-
650
- # Vercel
651
- .vercel
652
-
653
- # TypeScript
654
- *.tsbuildinfo
655
- next-env.d.ts
656
-
657
- # IDE
658
- .vscode
659
- .idea
660
- *.swp
661
- *.swo
662
- *~
663
- `;
664
- }
665
-
666
- function generateEnvExample(options: ScaffoldOptions): string {
667
- let env = '# Environment Variables\n\n';
668
-
669
- if (options.database === 'prisma' || options.database === 'drizzle') {
670
- env += '# Database\n';
671
- env += 'DATABASE_URL="postgresql://user:password@localhost:5432/dbname"\n\n';
672
- }
673
-
674
- if (options.database === 'supabase' || options.auth === 'supabase') {
675
- env += '# Supabase\n';
676
- env += 'NEXT_PUBLIC_SUPABASE_URL="your-supabase-url"\n';
677
- env += 'NEXT_PUBLIC_SUPABASE_ANON_KEY="your-supabase-anon-key"\n\n';
678
- }
679
-
680
- if (options.auth === 'nextauth') {
681
- env += '# NextAuth\n';
682
- env += 'NEXTAUTH_URL="http://localhost:3000"\n';
683
- env += 'NEXTAUTH_SECRET="your-secret-here"\n\n';
684
- }
685
-
686
- if (options.auth === 'clerk') {
687
- env += '# Clerk\n';
688
- env += 'NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="your-publishable-key"\n';
689
- env += 'CLERK_SECRET_KEY="your-secret-key"\n\n';
690
- }
691
-
692
- return env;
693
- }
694
-
695
- function generateReadme(config: ProjectConfig, options: ScaffoldOptions): string {
696
- const { name, template } = config;
697
- const templateInfo = TEMPLATES[template];
698
-
699
- return `# ${name}
700
-
701
- ${templateInfo.description}
702
-
703
- ## Tech Stack
704
-
705
- - **Framework**: ${templateInfo.name}
706
- ${options.typescript ? '- **Language**: TypeScript\n' : ''}${options.tailwind ? '- **Styling**: Tailwind CSS\n' : ''}${options.shadcn ? '- **UI**: shadcn/ui\n' : ''}${options.database !== 'none' ? `- **Database**: ${options.database}\n` : ''}${options.auth !== 'none' ? `- **Auth**: ${options.auth}\n` : ''}${options.testing !== 'none' ? `- **Testing**: ${options.testing}\n` : ''}${options.state !== 'none' ? `- **State**: ${options.state}\n` : ''}
707
- ## Prerequisites
708
-
709
- - Node.js 18+ (or Bun)
710
- - ${options.database === 'prisma' || options.database === 'drizzle' ? 'PostgreSQL database' : ''}
711
-
712
- ## Getting Started
713
-
714
- 1. Install dependencies:
715
-
716
- \`\`\`bash
717
- ${options.pm} install
718
- \`\`\`
719
-
720
- 2. Copy environment variables:
721
-
722
- \`\`\`bash
723
- cp .env.example .env
724
- \`\`\`
725
-
726
- 3. Fill in the environment variables in \`.env\`
727
-
728
- ${options.database === 'prisma' ? `4. Setup database:
729
-
730
- \`\`\`bash
731
- ${options.pm} db:generate
732
- ${options.pm} db:push
733
- \`\`\`
734
-
735
- ` : ''}${options.database === 'drizzle' ? `4. Setup database:
736
-
737
- \`\`\`bash
738
- ${options.pm} db:generate
739
- ${options.pm} db:migrate
740
- \`\`\`
741
-
742
- ` : ''}5. Run the development server:
743
-
744
- \`\`\`bash
745
- ${options.pm} ${options.pm === 'npm' ? 'run ' : ''}dev
746
- \`\`\`
747
-
748
- ## Available Scripts
749
-
750
- - \`${options.pm} ${options.pm === 'npm' ? 'run ' : ''}dev\` - Start development server
751
- - \`${options.pm} ${options.pm === 'npm' ? 'run ' : ''}build\` - Build for production
752
- - \`${options.pm} ${options.pm === 'npm' ? 'run ' : ''}start\` - Start production server
753
- - \`${options.pm} ${options.pm === 'npm' ? 'run ' : ''}lint\` - Run ESLint
754
- - \`${options.pm} ${options.pm === 'npm' ? 'run ' : ''}format\` - Format code with Prettier
755
- ${options.testing !== 'none' ? `- \`${options.pm} ${options.pm === 'npm' ? 'run ' : ''}test\` - Run tests\n` : ''}
756
- ## Project Structure
757
-
758
- \`\`\`
759
- ${name}/
760
- ├── src/
761
- │ ├── app/ # Application routes
762
- │ ├── components/ # React components
763
- │ ├── lib/ # Utility functions
764
- │ └── types/ # TypeScript types
765
- ├── public/ # Static assets
766
- ├── .env.example # Environment variables template
767
- ├── package.json
768
- └── README.md
769
- \`\`\`
770
-
771
- ## Learn More
772
-
773
- - [${templateInfo.name} Documentation](https://nextjs.org/docs)
774
- ${options.tailwind ? '- [Tailwind CSS](https://tailwindcss.com/docs)\n' : ''}${options.shadcn ? '- [shadcn/ui](https://ui.shadcn.com)\n' : ''}${options.database === 'prisma' ? '- [Prisma](https://www.prisma.io/docs)\n' : ''}${options.database === 'drizzle' ? '- [Drizzle](https://orm.drizzle.team)\n' : ''}
775
- ## Deployment
776
-
777
- Deploy your application on [Vercel](https://vercel.com) or [Railway](https://railway.app).
778
-
779
- ---
780
-
781
- Generated with [scaffold-project](https://skills.md/skills/scaffold-project)
782
- `;
783
- }
784
-
785
- function generateTemplateFiles(config: ProjectConfig, options: ScaffoldOptions): void {
786
- const { outputDir, template } = config;
787
- const srcDir = join(outputDir, 'src');
788
-
789
- // Create src directory
790
- if (!existsSync(srcDir)) {
791
- mkdirSync(srcDir, { recursive: true });
792
- }
793
-
794
- // Generate template-specific files
795
- if (template === 'next') {
796
- generateNextJsFiles(srcDir, options);
797
- } else if (template === 'react') {
798
- generateReactFiles(srcDir, options);
799
- } else if (template === 'express' || template === 'rest-api') {
800
- generateExpressFiles(srcDir, options);
801
- } else if (template === 'cli') {
802
- generateCliFiles(srcDir, options);
803
- }
804
- // Add more template generators as needed
805
- }
806
-
807
- function generateNextJsFiles(srcDir: string, options: ScaffoldOptions): void {
808
- const appDir = join(srcDir, 'app');
809
- mkdirSync(appDir, { recursive: true });
810
-
811
- // layout.tsx
812
- writeFileSync(
813
- join(appDir, 'layout.tsx'),
814
- `import type { Metadata } from 'next'
815
- import './globals.css'
816
-
817
- export const metadata: Metadata = {
818
- title: 'My App',
819
- description: 'Generated by scaffold-project',
820
- }
821
-
822
- export default function RootLayout({
823
- children,
824
- }: {
825
- children: React.ReactNode
826
- }) {
827
- return (
828
- <html lang="en">
829
- <body>{children}</body>
830
- </html>
831
- )
832
- }
833
- `
834
- );
835
-
836
- // page.tsx
837
- writeFileSync(
838
- join(appDir, 'page.tsx'),
839
- `export default function Home() {
840
- return (
841
- <main className="flex min-h-screen flex-col items-center justify-center p-24">
842
- <h1 className="text-4xl font-bold">Welcome to Your App</h1>
843
- <p className="mt-4 text-lg">Start building something amazing!</p>
844
- </main>
845
- )
846
- }
847
- `
848
- );
849
-
850
- // globals.css
851
- writeFileSync(
852
- join(appDir, 'globals.css'),
853
- `@tailwind base;
854
- @tailwind components;
855
- @tailwind utilities;
856
-
857
- :root {
858
- --foreground-rgb: 0, 0, 0;
859
- --background-start-rgb: 214, 219, 220;
860
- --background-end-rgb: 255, 255, 255;
861
- }
862
-
863
- @media (prefers-color-scheme: dark) {
864
- :root {
865
- --foreground-rgb: 255, 255, 255;
866
- --background-start-rgb: 0, 0, 0;
867
- --background-end-rgb: 0, 0, 0;
868
- }
869
- }
870
-
871
- body {
872
- color: rgb(var(--foreground-rgb));
873
- background: linear-gradient(
874
- to bottom,
875
- transparent,
876
- rgb(var(--background-end-rgb))
877
- )
878
- rgb(var(--background-start-rgb));
879
- }
880
- `
881
- );
882
-
883
- // lib/utils.ts
884
- const libDir = join(srcDir, 'lib');
885
- mkdirSync(libDir, { recursive: true });
886
- writeFileSync(
887
- join(libDir, 'utils.ts'),
888
- `import { type ClassValue, clsx } from 'clsx'
889
- import { twMerge } from 'tailwind-merge'
890
-
891
- export function cn(...inputs: ClassValue[]) {
892
- return twMerge(clsx(inputs))
893
- }
894
- `
895
- );
896
- }
897
-
898
- function generateReactFiles(srcDir: string, options: ScaffoldOptions): void {
899
- // main.tsx
900
- writeFileSync(
901
- join(srcDir, 'main.tsx'),
902
- `import React from 'react'
903
- import ReactDOM from 'react-dom/client'
904
- import App from './App'
905
- import './index.css'
906
-
907
- ReactDOM.createRoot(document.getElementById('root')!).render(
908
- <React.StrictMode>
909
- <App />
910
- </React.StrictMode>,
911
- )
912
- `
913
- );
914
-
915
- // App.tsx
916
- writeFileSync(
917
- join(srcDir, 'App.tsx'),
918
- `function App() {
919
- return (
920
- <div className="min-h-screen flex items-center justify-center">
921
- <div className="text-center">
922
- <h1 className="text-4xl font-bold mb-4">Welcome to Your App</h1>
923
- <p className="text-lg">Start building something amazing!</p>
924
- </div>
925
- </div>
926
- )
927
- }
928
-
929
- export default App
930
- `
931
- );
932
-
933
- // index.css
934
- writeFileSync(
935
- join(srcDir, 'index.css'),
936
- `@tailwind base;
937
- @tailwind components;
938
- @tailwind utilities;
939
- `
940
- );
941
- }
942
-
943
- function generateExpressFiles(srcDir: string, options: ScaffoldOptions): void {
944
- // index.ts
945
- writeFileSync(
946
- join(srcDir, 'index.ts'),
947
- `import express from 'express'
948
- import cors from 'cors'
949
- import dotenv from 'dotenv'
950
-
951
- dotenv.config()
952
-
953
- const app = express()
954
- const port = process.env.PORT || 3000
955
-
956
- app.use(cors())
957
- app.use(express.json())
958
-
959
- app.get('/', (req, res) => {
960
- res.json({ message: 'API is running' })
961
- })
962
-
963
- app.get('/health', (req, res) => {
964
- res.json({ status: 'ok' })
965
- })
966
-
967
- app.listen(port, () => {
968
- console.log(\`Server running on http://localhost:\${port}\`)
969
- })
970
- `
971
- );
972
- }
973
-
974
- function generateCliFiles(srcDir: string, options: ScaffoldOptions): void {
975
- // index.ts
976
- writeFileSync(
977
- join(srcDir, 'index.ts'),
978
- `#!/usr/bin/env node
979
- import { Command } from 'commander'
980
-
981
- const program = new Command()
982
-
983
- program
984
- .name('my-cli')
985
- .description('CLI tool generated by scaffold-project')
986
- .version('1.0.0')
987
-
988
- program
989
- .command('hello')
990
- .description('Say hello')
991
- .argument('<name>', 'Name to greet')
992
- .action((name) => {
993
- console.log(\`Hello, \${name}!\`)
994
- })
9
+ import { existsSync } from "fs";
10
+ import { parseArgs } from "util";
995
11
 
996
- program.parse()
997
- `
998
- );
999
- }
12
+ import { detectTemplate } from "./ai-detect";
13
+ import { generateFiles } from "./file-generators";
14
+ import { generateProjectConfig } from "./project-config";
15
+ import { TEMPLATES } from "./templates";
16
+ import { validatePackageManager } from "./types";
17
+ import type { Auth, Database, PackageManager, ScaffoldOptions, State, Template, Testing } from "./types";
1000
18
 
1001
- // ============================================================================
1002
19
  // Main CLI Logic
1003
20
  // ============================================================================
1004
21