@hasna/skills 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/LICENSE +1 -10
  2. package/README.md +141 -39
  3. package/bin/index.js +30121 -27576
  4. package/bin/mcp.js +22073 -18556
  5. package/dist/cli/cli.test-utils.d.ts +15 -0
  6. package/dist/cli/commands/auth.d.ts +2 -0
  7. package/dist/cli/commands/install.d.ts +1 -1
  8. package/dist/cli/commands/runtime-mcp.d.ts +4 -0
  9. package/dist/index.d.ts +9 -4
  10. package/dist/index.js +11606 -598
  11. package/dist/lib/auth-store.d.ts +13 -0
  12. package/dist/lib/installer.d.ts +58 -55
  13. package/dist/lib/mcp-contracts.d.ts +86 -0
  14. package/dist/lib/project-state.d.ts +43 -0
  15. package/dist/lib/registry-data/business-marketing.d.ts +2 -0
  16. package/dist/lib/registry-data/communication.d.ts +2 -0
  17. package/dist/lib/registry-data/content-generation.d.ts +2 -0
  18. package/dist/lib/registry-data/data-analysis.d.ts +2 -0
  19. package/dist/lib/registry-data/design-branding.d.ts +2 -0
  20. package/dist/lib/registry-data/development-tools.d.ts +2 -0
  21. package/dist/lib/registry-data/education-learning.d.ts +2 -0
  22. package/dist/lib/registry-data/event-management.d.ts +2 -0
  23. package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
  24. package/dist/lib/registry-data/health-wellness.d.ts +2 -0
  25. package/dist/lib/registry-data/index.d.ts +2 -0
  26. package/dist/lib/registry-data/media-processing.d.ts +2 -0
  27. package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
  28. package/dist/lib/registry-data/project-management.d.ts +2 -0
  29. package/dist/lib/registry-data/research-writing.d.ts +2 -0
  30. package/dist/lib/registry-data/science-academic.d.ts +2 -0
  31. package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
  32. package/dist/lib/registry-data/web-browser.d.ts +2 -0
  33. package/dist/lib/registry-types.d.ts +27 -0
  34. package/dist/lib/registry.d.ts +6 -18
  35. package/dist/lib/remote-registry.d.ts +3 -0
  36. package/dist/lib/run-state.d.ts +60 -0
  37. package/dist/lib/skill-aliases.d.ts +17 -0
  38. package/dist/lib/skillinfo.d.ts +5 -1
  39. package/dist/mcp/discovery-tools.d.ts +2 -0
  40. package/dist/mcp/helpers.d.ts +26 -0
  41. package/dist/mcp/http.d.ts +10 -0
  42. package/dist/mcp/index.d.ts +3 -2
  43. package/dist/mcp/operation-tools.d.ts +2 -0
  44. package/dist/mcp/resource-meta-tools.d.ts +2 -0
  45. package/dist/mcp/schedule-tools.d.ts +2 -0
  46. package/dist/mcp/server.d.ts +4 -0
  47. package/dist/types/api.d.ts +7 -4
  48. package/package.json +22 -11
  49. package/skills/_common/http-client.ts +1 -1
  50. package/skills/_common/index.ts +2 -3
  51. package/skills/_common/install.sh +5 -110
  52. package/skills/_common/installer.ts +31 -282
  53. package/skills/_common/skill-install.ts +14 -181
  54. package/skills/ad-creative-pack/SKILL.md +45 -0
  55. package/skills/ad-creative-pack/package.json +14 -0
  56. package/skills/advanced-math/package.json +3 -1
  57. package/skills/advanced-math/src/calculators.ts +118 -0
  58. package/skills/advanced-math/src/cli.ts +130 -0
  59. package/skills/advanced-math/src/conversion.ts +90 -0
  60. package/skills/advanced-math/src/finance.ts +75 -0
  61. package/skills/advanced-math/src/formatting.ts +95 -0
  62. package/skills/advanced-math/src/index.ts +24 -702
  63. package/skills/advanced-math/src/runtime.ts +49 -0
  64. package/skills/advanced-math/src/symbolic.ts +110 -0
  65. package/skills/advanced-math/src/types.ts +36 -0
  66. package/skills/analyze-data/SKILL.md +2 -2
  67. package/skills/analyze-data/src/analysis.ts +401 -0
  68. package/skills/analyze-data/src/cli.ts +66 -0
  69. package/skills/analyze-data/src/formatters.ts +235 -0
  70. package/skills/analyze-data/src/index.ts +6 -1027
  71. package/skills/analyze-data/src/logger.ts +36 -0
  72. package/skills/analyze-data/src/parsers.ts +57 -0
  73. package/skills/analyze-data/src/stats.ts +151 -0
  74. package/skills/analyze-data/src/types.ts +85 -0
  75. package/skills/api-docs-portal/SKILL.md +46 -0
  76. package/skills/api-docs-portal/package.json +9 -0
  77. package/skills/api-test-suite/src/index.ts +13 -0
  78. package/skills/apidocs/package.json +1 -1
  79. package/skills/apidocs/src/index.ts +3 -0
  80. package/skills/audio/package.json +2 -3
  81. package/skills/audio-cleanup-lab/SKILL.md +2 -2
  82. package/skills/audio-extract/CLAUDE.md +1 -1
  83. package/skills/audio-transcript-pack/SKILL.md +43 -0
  84. package/skills/audio-transcript-pack/package.json +10 -0
  85. package/skills/blog-article/CLAUDE.md +12 -0
  86. package/skills/blog-article/SKILL.md +45 -0
  87. package/skills/{create-blog-article → blog-article}/package.json +3 -3
  88. package/skills/brand-kit/SKILL.md +45 -0
  89. package/skills/brand-kit/package.json +14 -0
  90. package/skills/brand-photo-shoot/SKILL.md +28 -0
  91. package/skills/brand-photo-shoot/package.json +10 -0
  92. package/skills/brand-style-guide/SKILL.md +2 -2
  93. package/skills/brand-style-guide/src/index.ts +0 -0
  94. package/skills/budget-variance-analyzer/SKILL.md +2 -2
  95. package/skills/businessactivity/package.json +1 -1
  96. package/skills/businessactivity/src/index.ts +3 -0
  97. package/skills/calendar-events/src/ai-parser.ts +103 -0
  98. package/skills/calendar-events/src/api.ts +157 -0
  99. package/skills/calendar-events/src/auth.ts +22 -0
  100. package/skills/calendar-events/src/config.ts +6 -0
  101. package/skills/calendar-events/src/format.ts +96 -0
  102. package/skills/calendar-events/src/help.ts +54 -0
  103. package/skills/calendar-events/src/index.ts +21 -524
  104. package/skills/calendar-events/src/logger.ts +34 -0
  105. package/skills/calendar-events/src/types.ts +67 -0
  106. package/skills/compress-video/SKILL.md +2 -2
  107. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.csv +16 -0
  108. package/skills/consolelog/exports/products-2025-12-14T13-50-53-041Z.json +227 -0
  109. package/skills/consolelog/package.json +1 -1
  110. package/skills/consolelog/src/index.ts +3 -0
  111. package/skills/contract-review-report/SKILL.md +43 -0
  112. package/skills/contract-review-report/package.json +10 -0
  113. package/skills/convert/SKILL.md +2 -3
  114. package/skills/customer-feedback-report/SKILL.md +44 -0
  115. package/skills/customer-feedback-report/package.json +10 -0
  116. package/skills/dashboard-builder/package.json +3 -1
  117. package/skills/database-explorer/package.json +3 -1
  118. package/skills/deepresearch/README.md +4 -13
  119. package/skills/deploy/src/http-client.ts +1 -1
  120. package/skills/diff-viewer/package.json +4 -1
  121. package/skills/doc-generate/package.json +0 -1
  122. package/skills/doc-generate/src/ai.ts +50 -0
  123. package/skills/doc-generate/src/cli.ts +203 -0
  124. package/skills/doc-generate/src/dependencies.ts +44 -0
  125. package/skills/doc-generate/src/document-builder.ts +299 -0
  126. package/skills/doc-generate/src/index.ts +40 -764
  127. package/skills/doc-generate/src/markdown-parser.ts +125 -0
  128. package/skills/doc-generate/src/types.ts +68 -0
  129. package/skills/domainpurchase/SKILL.md +1 -1
  130. package/skills/domainpurchase/package.json +1 -1
  131. package/skills/domainpurchase/src/index.ts +3 -0
  132. package/skills/domainsearch/SKILL.md +1 -1
  133. package/skills/domainsearch/package.json +1 -1
  134. package/skills/domainsearch/src/index.ts +3 -0
  135. package/skills/email-sequence/SKILL.md +44 -0
  136. package/skills/email-sequence/package.json +14 -0
  137. package/skills/excel/CLAUDE.md +2 -2
  138. package/skills/experiment-power-calculator/package.json +3 -1
  139. package/skills/extract-invoice/src/cli.ts +97 -0
  140. package/skills/extract-invoice/src/extractor.ts +170 -0
  141. package/skills/extract-invoice/src/file-utils.ts +46 -0
  142. package/skills/extract-invoice/src/formatters.ts +144 -0
  143. package/skills/extract-invoice/src/index.ts +44 -629
  144. package/skills/extract-invoice/src/runtime.ts +46 -0
  145. package/skills/extract-invoice/src/types.ts +88 -0
  146. package/skills/folder-tree/package.json +3 -1
  147. package/skills/form-filler/package.json +3 -1
  148. package/skills/generate-api-client/package.json +3 -1
  149. package/skills/generate-api-client/src/generator.ts +47 -0
  150. package/skills/generate-api-client/src/index.ts +3 -777
  151. package/skills/generate-api-client/src/logger.ts +34 -0
  152. package/skills/generate-api-client/src/python-generator.ts +245 -0
  153. package/skills/generate-api-client/src/spec-loader.ts +48 -0
  154. package/skills/generate-api-client/src/type-mappers.ts +79 -0
  155. package/skills/generate-api-client/src/types.ts +76 -0
  156. package/skills/generate-api-client/src/typescript-generator.ts +247 -0
  157. package/skills/generate-book-cover/package.json +3 -1
  158. package/skills/generate-dockerfile/src/cli.ts +78 -0
  159. package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
  160. package/skills/generate-dockerfile/src/index.ts +12 -790
  161. package/skills/generate-dockerfile/src/logger.ts +30 -0
  162. package/skills/generate-dockerfile/src/project-detection.ts +68 -0
  163. package/skills/generate-dockerfile/src/support-files.ts +171 -0
  164. package/skills/generate-dockerfile/src/types.ts +29 -0
  165. package/skills/generate-documentation/src/ai.ts +131 -0
  166. package/skills/generate-documentation/src/cli.ts +71 -0
  167. package/skills/generate-documentation/src/code-parser.ts +300 -0
  168. package/skills/generate-documentation/src/file-processing.ts +182 -0
  169. package/skills/generate-documentation/src/index.ts +13 -753
  170. package/skills/generate-documentation/src/runtime.ts +35 -0
  171. package/skills/generate-documentation/src/types.ts +30 -0
  172. package/skills/generate-env/package.json +3 -1
  173. package/skills/generate-env/src/cli.ts +85 -0
  174. package/skills/generate-env/src/detection.ts +161 -0
  175. package/skills/generate-env/src/env-data.ts +66 -0
  176. package/skills/generate-env/src/generators.ts +240 -0
  177. package/skills/generate-env/src/index.ts +76 -676
  178. package/skills/generate-env/src/runtime.ts +30 -0
  179. package/skills/generate-env/src/types.ts +32 -0
  180. package/skills/generate-favicon/package.json +3 -1
  181. package/skills/generate-mock-data/package.json +3 -1
  182. package/skills/generate-mock-data/src/ai.ts +102 -0
  183. package/skills/generate-mock-data/src/formatters.ts +84 -0
  184. package/skills/generate-mock-data/src/generator.ts +377 -0
  185. package/skills/generate-mock-data/src/index.ts +15 -716
  186. package/skills/generate-mock-data/src/logger.ts +37 -0
  187. package/skills/generate-mock-data/src/presets.ts +110 -0
  188. package/skills/generate-mock-data/src/types.ts +21 -0
  189. package/skills/generate-pr-description/src/ai.ts +144 -0
  190. package/skills/generate-pr-description/src/cli.ts +80 -0
  191. package/skills/generate-pr-description/src/clipboard.ts +30 -0
  192. package/skills/generate-pr-description/src/formatters.ts +231 -0
  193. package/skills/generate-pr-description/src/git.ts +153 -0
  194. package/skills/generate-pr-description/src/index.ts +21 -714
  195. package/skills/generate-pr-description/src/types.ts +49 -0
  196. package/skills/generate-presentation/src/ai-clients.ts +61 -0
  197. package/skills/generate-presentation/src/cli.ts +126 -0
  198. package/skills/generate-presentation/src/index.ts +3 -751
  199. package/skills/generate-presentation/src/logger.ts +67 -0
  200. package/skills/generate-presentation/src/presentation-generator.ts +425 -0
  201. package/skills/generate-presentation/src/runtime.ts +6 -0
  202. package/skills/generate-presentation/src/security.ts +12 -0
  203. package/skills/generate-presentation/src/types.ts +28 -0
  204. package/skills/generate-qrcode/package.json +4 -1
  205. package/skills/generate-regex/package.json +3 -1
  206. package/skills/generate-resume/src/cli.ts +157 -0
  207. package/skills/generate-resume/src/index.ts +13 -917
  208. package/skills/generate-resume/src/parsers.ts +95 -0
  209. package/skills/generate-resume/src/renderers.ts +538 -0
  210. package/skills/generate-resume/src/security.ts +39 -0
  211. package/skills/generate-resume/src/types.ts +86 -0
  212. package/skills/generate-social-posts/src/ai.ts +88 -0
  213. package/skills/generate-social-posts/src/cli.ts +118 -0
  214. package/skills/generate-social-posts/src/exporters.ts +126 -0
  215. package/skills/generate-social-posts/src/generator.ts +130 -0
  216. package/skills/generate-social-posts/src/index.ts +19 -709
  217. package/skills/generate-social-posts/src/platforms.ts +39 -0
  218. package/skills/generate-social-posts/src/runtime.ts +34 -0
  219. package/skills/generate-social-posts/src/source.ts +116 -0
  220. package/skills/generate-social-posts/src/types.ts +58 -0
  221. package/skills/gif-maker/package.json +4 -1
  222. package/skills/github-manager/package.json +3 -1
  223. package/skills/gmail/CLAUDE.md +1 -1
  224. package/skills/highlight-reel-generator/src/index.ts +19 -0
  225. package/skills/hook/src/commands/create.ts +20 -845
  226. package/skills/hook/src/templates/root.ts +196 -0
  227. package/skills/hook/src/templates/source.ts +647 -0
  228. package/skills/http-server/package.json +3 -1
  229. package/skills/icon-pack/README.md +28 -0
  230. package/skills/icon-pack/SKILL.md +23 -0
  231. package/skills/icon-pack/package.json +29 -0
  232. package/skills/{audio → icon-pack}/tsconfig.json +10 -12
  233. package/skills/image/package.json +1 -2
  234. package/skills/implementation-agent/package.json +3 -1
  235. package/skills/implementation-agent/src/ai-generation.ts +225 -0
  236. package/skills/implementation-agent/src/index.ts +3 -960
  237. package/skills/implementation-agent/src/minimist.d.ts +15 -0
  238. package/skills/implementation-agent/src/templates.ts +686 -0
  239. package/skills/implementation-agent/src/types.ts +53 -0
  240. package/skills/implementation-plan/package.json +3 -1
  241. package/skills/implementation-todo/package.json +3 -1
  242. package/skills/invoice/package.json +1 -1
  243. package/skills/invoice/src/index.ts +3 -0
  244. package/skills/invoice-reconciliation/SKILL.md +42 -0
  245. package/skills/invoice-reconciliation/package.json +10 -0
  246. package/skills/landing-page-pack/SKILL.md +47 -0
  247. package/skills/landing-page-pack/package.json +14 -0
  248. package/skills/latex-table-generator/package.json +3 -1
  249. package/skills/logo-design/SKILL.md +25 -44
  250. package/skills/logo-design/package.json +3 -15
  251. package/skills/lorem-generator/package.json +3 -1
  252. package/skills/lorem-generator/src/index.ts +13 -0
  253. package/skills/managehook/package.json +1 -1
  254. package/skills/managehook/src/index.ts +3 -0
  255. package/skills/managemcp/package.json +1 -1
  256. package/skills/managemcp/src/index.ts +3 -0
  257. package/skills/manageskill/package.json +1 -1
  258. package/skills/manageskill/src/index.ts +3 -0
  259. package/skills/markdown-validator/package.json +3 -1
  260. package/skills/markdown-validator/src/index.ts +1 -4
  261. package/skills/market-research-report/SKILL.md +41 -0
  262. package/skills/market-research-report/package.json +10 -0
  263. package/skills/mcp-builder/package.json +4 -1
  264. package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
  265. package/skills/mcp-builder/src/generators.ts +513 -0
  266. package/skills/mcp-builder/src/index.ts +7 -908
  267. package/skills/mcp-builder/src/minimist.d.ts +15 -0
  268. package/skills/mcp-builder/src/naming.ts +12 -0
  269. package/skills/mcp-builder/src/options.ts +170 -0
  270. package/skills/mcp-builder/src/templates.ts +149 -0
  271. package/skills/mcp-builder/src/types.ts +42 -0
  272. package/skills/meeting-pack/SKILL.md +43 -0
  273. package/skills/meeting-pack/package.json +10 -0
  274. package/skills/merge-pdfs/package.json +5 -1
  275. package/skills/migration-plan-pack/SKILL.md +45 -0
  276. package/skills/migration-plan-pack/package.json +10 -0
  277. package/skills/music/package.json +2 -3
  278. package/skills/music-album/SKILL.md +37 -0
  279. package/skills/music-album/package.json +10 -0
  280. package/skills/notion-manager/package.json +3 -1
  281. package/skills/npmpublish/CLAUDE.md +5 -8
  282. package/skills/npmpublish/README.md +5 -26
  283. package/skills/npmpublish/src/index.ts +9 -147
  284. package/skills/one-page-website/SKILL.md +46 -0
  285. package/skills/one-page-website/package.json +10 -0
  286. package/skills/one-page-website/tsconfig.json +8 -0
  287. package/skills/pdf-generate/src/cli.ts +162 -0
  288. package/skills/pdf-generate/src/html.ts +84 -0
  289. package/skills/pdf-generate/src/index.ts +11 -800
  290. package/skills/pdf-generate/src/markdown.ts +27 -0
  291. package/skills/pdf-generate/src/pdf-writer.ts +78 -0
  292. package/skills/pdf-generate/src/runtime.ts +34 -0
  293. package/skills/pdf-generate/src/security.ts +37 -0
  294. package/skills/pdf-generate/src/templates.ts +311 -0
  295. package/skills/pdf-generate/src/types.ts +28 -0
  296. package/skills/pdf-read/SKILL.md +10 -10
  297. package/skills/pdf-to-dataset/SKILL.md +45 -0
  298. package/skills/pdf-to-dataset/package.json +10 -0
  299. package/skills/pdf-to-markdown/SKILL.md +49 -0
  300. package/skills/pdf-to-markdown/package.json +10 -0
  301. package/skills/pdf-to-markdown/tsconfig.json +10 -0
  302. package/skills/performance-audit-report/SKILL.md +42 -0
  303. package/skills/performance-audit-report/package.json +10 -0
  304. package/skills/persona-based-adwriter/src/index.ts +19 -0
  305. package/skills/photo-album/SKILL.md +29 -0
  306. package/skills/photo-album/package.json +9 -0
  307. package/skills/photo-album/tsconfig.json +4 -0
  308. package/skills/pitch-deck/SKILL.md +43 -0
  309. package/skills/pitch-deck/package.json +9 -0
  310. package/skills/playlist-maker/SKILL.md +33 -0
  311. package/skills/playlist-maker/package.json +9 -0
  312. package/skills/playlist-maker/tsconfig.json +4 -0
  313. package/skills/product-mockup/SKILL.md +45 -0
  314. package/skills/product-mockup/package.json +3 -20
  315. package/skills/product-mockup/tsconfig.json +3 -5
  316. package/skills/project-retro-companion/src/index.ts +19 -0
  317. package/skills/proposal-pack/SKILL.md +45 -0
  318. package/skills/proposal-pack/package.json +10 -0
  319. package/skills/read-pdf/SKILL.md +5 -4
  320. package/skills/repo-onboarding-report/SKILL.md +42 -0
  321. package/skills/repo-onboarding-report/package.json +10 -0
  322. package/skills/sales-call-recapper/src/index.ts +20 -0
  323. package/skills/salescopy/package.json +1 -1
  324. package/skills/salescopy/src/index.ts +3 -0
  325. package/skills/scaffold-project/src/ai-detect.ts +136 -0
  326. package/skills/scaffold-project/src/file-generators.ts +292 -0
  327. package/skills/scaffold-project/src/index.ts +8 -991
  328. package/skills/scaffold-project/src/project-config.ts +338 -0
  329. package/skills/scaffold-project/src/templates.ts +173 -0
  330. package/skills/scaffold-project/src/types.ts +58 -0
  331. package/skills/scientific-figure-check/package.json +3 -1
  332. package/skills/sdk-generator/SKILL.md +45 -0
  333. package/skills/sdk-generator/package.json +10 -0
  334. package/skills/sdk-generator/tsconfig.json +8 -0
  335. package/skills/security-audit/src/index.ts +25 -6
  336. package/skills/security-audit-report/SKILL.md +40 -0
  337. package/skills/security-audit-report/package.json +10 -0
  338. package/skills/seo-content-pack/SKILL.md +44 -0
  339. package/skills/seo-content-pack/package.json +9 -0
  340. package/skills/short-video-pack/SKILL.md +30 -0
  341. package/skills/short-video-pack/package.json +10 -0
  342. package/skills/slack-assistant/package.json +3 -1
  343. package/skills/slide-deck-generator/SKILL.md +44 -0
  344. package/skills/slide-deck-generator/package.json +10 -0
  345. package/skills/sms/package.json +1 -1
  346. package/skills/sms/src/index.ts +15 -0
  347. package/skills/social-content-calendar/SKILL.md +45 -0
  348. package/skills/social-content-calendar/package.json +14 -0
  349. package/skills/split-pdf/package.json +4 -1
  350. package/skills/subtitle/package.json +2 -1
  351. package/skills/subtitle/src/index.ts +3 -0
  352. package/skills/terraform-generator/package.json +3 -1
  353. package/skills/test-suite-generator/SKILL.md +41 -0
  354. package/skills/test-suite-generator/package.json +10 -0
  355. package/skills/timesheet/package.json +1 -1
  356. package/skills/timesheet/src/index.ts +3 -0
  357. package/skills/transcript/SKILL.md +1 -8
  358. package/skills/validate-config/package.json +3 -1
  359. package/skills/video/package.json +6 -4
  360. package/skills/video-downloader/package.json +3 -1
  361. package/skills/video-highlight-pack/SKILL.md +44 -0
  362. package/skills/video-highlight-pack/package.json +10 -0
  363. package/skills/voiceover-jingle-pack/SKILL.md +28 -0
  364. package/skills/voiceover-jingle-pack/package.json +10 -0
  365. package/skills/watermark/package.json +6 -1
  366. package/skills/webcrawling/package.json +2 -1
  367. package/skills/write/SKILL.md +6 -6
  368. package/dist/server/serve.d.ts +0 -11
  369. package/skills/apidocs/.claude/settings.json +0 -5
  370. package/skills/audio/.env.example +0 -14
  371. package/skills/audio/QUICKSTART.md +0 -158
  372. package/skills/audio/README.md +0 -256
  373. package/skills/audio/src/index-local.ts +0 -206
  374. package/skills/audio/src/index.ts +0 -95
  375. package/skills/audio/src/providers/elevenlabs.ts +0 -115
  376. package/skills/audio/src/providers/google.ts +0 -116
  377. package/skills/audio/src/providers/minimax.ts +0 -83
  378. package/skills/audio/src/providers/openai.ts +0 -115
  379. package/skills/audio/src/types.ts +0 -79
  380. package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
  381. package/skills/audiobook-chapter-proofer/package.json +0 -27
  382. package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
  383. package/skills/browse/src/client.ts +0 -373
  384. package/skills/browse/src/index-local.ts +0 -430
  385. package/skills/browse/src/index.ts +0 -110
  386. package/skills/browse/src/sse-server.ts +0 -919
  387. package/skills/browse/src/types.ts +0 -104
  388. package/skills/consolelog/src/server/index.ts +0 -508
  389. package/skills/create-blog-article/CLAUDE.md +0 -19
  390. package/skills/create-blog-article/src/index.ts +0 -745
  391. package/skills/create-blog-article/tsconfig.json +0 -10
  392. package/skills/deepresearch/src/agents/query-generator.ts +0 -91
  393. package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
  394. package/skills/deepresearch/src/index.ts +0 -224
  395. package/skills/deepresearch/src/research.ts +0 -166
  396. package/skills/deepresearch/src/services/anthropic.ts +0 -69
  397. package/skills/deepresearch/src/services/exa.ts +0 -108
  398. package/skills/deepresearch/src/services/firecrawl.ts +0 -88
  399. package/skills/deepresearch/src/services/openai.ts +0 -81
  400. package/skills/deepresearch/src/types.ts +0 -76
  401. package/skills/deepresearch/src/utils/file.ts +0 -111
  402. package/skills/deepresearch/src/utils/logger.ts +0 -84
  403. package/skills/domainpurchase/src/server/index.ts +0 -332
  404. package/skills/domainsearch/src/server/index.ts +0 -229
  405. package/skills/e2bswarm/README.md +0 -135
  406. package/skills/e2bswarm/SKILL.md +0 -118
  407. package/skills/e2bswarm/examples/tasks-example.json +0 -38
  408. package/skills/e2bswarm/package.json +0 -59
  409. package/skills/e2bswarm/src/commands/collect.ts +0 -135
  410. package/skills/e2bswarm/src/commands/install.ts +0 -164
  411. package/skills/e2bswarm/src/commands/kill.ts +0 -62
  412. package/skills/e2bswarm/src/commands/spawn.ts +0 -134
  413. package/skills/e2bswarm/src/commands/status.ts +0 -90
  414. package/skills/e2bswarm/src/commands/sync.ts +0 -208
  415. package/skills/e2bswarm/src/index.ts +0 -121
  416. package/skills/e2bswarm/src/lib/config.ts +0 -75
  417. package/skills/e2bswarm/src/lib/e2b.ts +0 -490
  418. package/skills/e2bswarm/src/lib/github.ts +0 -253
  419. package/skills/e2bswarm/src/lib/logger.ts +0 -41
  420. package/skills/e2bswarm/src/lib/paths.ts +0 -75
  421. package/skills/e2bswarm/src/lib/tasks.ts +0 -320
  422. package/skills/e2bswarm/src/types/index.ts +0 -107
  423. package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
  424. package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
  425. package/skills/e2bswarm/templates/setup.sh +0 -21
  426. package/skills/e2bswarm/tsconfig.json +0 -19
  427. package/skills/generate-book-cover/src/index.ts +0 -694
  428. package/skills/image/src/index-local.ts +0 -206
  429. package/skills/image/src/index.ts +0 -96
  430. package/skills/image/src/providers/google.ts +0 -79
  431. package/skills/image/src/providers/minimax.ts +0 -94
  432. package/skills/image/src/providers/openai.ts +0 -80
  433. package/skills/image/src/providers/xai.ts +0 -73
  434. package/skills/image/src/types.ts +0 -37
  435. package/skills/logo-design/CLAUDE.md +0 -30
  436. package/skills/logo-design/src/index.ts +0 -322
  437. package/skills/managehook/src/server/index.ts +0 -108
  438. package/skills/managemcp/src/server/index.ts +0 -108
  439. package/skills/manageskill/src/server/index.ts +0 -108
  440. package/skills/music/CLAUDE.md +0 -9
  441. package/skills/music/src/index.ts +0 -94
  442. package/skills/music/tsconfig.json +0 -10
  443. package/skills/pdf-read/src/index.ts +0 -320
  444. package/skills/product-mockup/CLAUDE.md +0 -19
  445. package/skills/product-mockup/src/index.ts +0 -290
  446. package/skills/read-pdf/src/index.ts +0 -388
  447. package/skills/remove-background/src/index.ts +0 -405
  448. package/skills/sound-effects/SKILL.md +0 -34
  449. package/skills/sound-effects/package.json +0 -21
  450. package/skills/sound-effects/src/index.ts +0 -172
  451. package/skills/sound-effects/tsconfig.json +0 -8
  452. package/skills/transcript/src/chunker.ts +0 -215
  453. package/skills/transcript/src/formatter.ts +0 -134
  454. package/skills/transcript/src/index-local.ts +0 -226
  455. package/skills/transcript/src/index.ts +0 -110
  456. package/skills/transcript/src/providers/elevenlabs.ts +0 -133
  457. package/skills/transcript/src/providers/gemini.ts +0 -192
  458. package/skills/transcript/src/providers/index.ts +0 -54
  459. package/skills/transcript/src/providers/openai.ts +0 -203
  460. package/skills/transcript/src/types.ts +0 -106
  461. package/skills/video/.env.example +0 -14
  462. package/skills/video/EXAMPLES.md +0 -266
  463. package/skills/video/LICENSE +0 -192
  464. package/skills/video/README.md +0 -174
  465. package/skills/video/src/cli.ts +0 -155
  466. package/skills/video/src/index-local.ts +0 -148
  467. package/skills/video/src/index.ts +0 -96
  468. package/skills/video/src/providers/google-veo.ts +0 -126
  469. package/skills/video/src/providers/index.ts +0 -22
  470. package/skills/video/src/providers/minimax.ts +0 -100
  471. package/skills/video/src/providers/openai-sora.ts +0 -164
  472. package/skills/video/src/providers/runway.ts +0 -159
  473. package/skills/video/src/types.ts +0 -35
  474. package/skills/video/tsconfig.json +0 -22
  475. package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
  476. package/skills/voiceover-casting-assistant/package.json +0 -27
  477. package/skills/voiceover-casting-assistant/src/index.ts +0 -255
  478. package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
  479. package/skills/webcrawling/src/commands/config.ts +0 -34
  480. package/skills/webcrawling/src/commands/crawl.ts +0 -33
  481. package/skills/webcrawling/src/commands/scrape.ts +0 -32
  482. package/skills/webcrawling/src/commands/sessions.ts +0 -42
  483. package/skills/webcrawling/src/lib/crawler.ts +0 -174
  484. package/skills/webcrawling/src/lib/storage.ts +0 -130
  485. package/skills/webcrawling/src/types/index.ts +0 -45
  486. package/skills/webcrawling/src/utils/logger.ts +0 -30
  487. package/skills/webcrawling/src/utils/paths.ts +0 -28
  488. /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
@@ -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