@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
@@ -7,714 +7,114 @@
7
7
  * comprehensive .env templates with documentation, types, and validation.
8
8
  */
9
9
 
10
- import { parseArgs } from "util";
11
- import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from "fs";
12
- import { join, resolve } from "path";
13
- import { glob } from "glob";
14
- import { randomBytes, randomUUID } from "crypto";
10
+ import { existsSync, mkdirSync, writeFileSync } from "fs";
11
+ import { join } from "path";
12
+ import { parseGenerateOptions } from "./cli";
13
+ import { detectEnvVariables } from "./detection";
14
+ import { COMMON_VARIABLES } from "./env-data";
15
+ import {
16
+ generateEnvFile,
17
+ generateMetadata,
18
+ generateTypeDefs,
19
+ generateValidation,
20
+ } from "./generators";
21
+ import { SESSION_ID, SKILL_NAME, log } from "./runtime";
22
+ import type { EnvVariable } from "./types";
15
23
 
16
- // Constants
17
- const SKILL_NAME = "generate-env";
18
- const SESSION_ID = randomUUID().slice(0, 8);
19
- const SKILLS_OUTPUT_DIR = process.env.SKILLS_OUTPUT_DIR || join(process.cwd(), ".skills");
20
- const LOGS_DIR = join(SKILLS_OUTPUT_DIR, "logs", SKILL_NAME);
21
- const SESSION_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, "_").slice(0, 19);
22
-
23
- // Ensure directories exist
24
- function ensureDir(dir: string) {
25
- if (!existsSync(dir)) {
26
- mkdirSync(dir, { recursive: true });
27
- }
28
- }
29
-
30
- // Logger
31
- function log(message: string, level: "info" | "error" | "success" | "warn" = "info") {
32
- ensureDir(LOGS_DIR);
33
- const timestamp = new Date().toISOString();
34
- const logFile = join(LOGS_DIR, `log_${SESSION_TIMESTAMP}_${SESSION_ID}.log`);
35
- const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
36
- appendFileSync(logFile, logEntry);
37
-
38
- const prefix = level === "error" ? "❌" : level === "success" ? "✅" : level === "warn" ? "⚠️" : "ℹ️";
39
- if (level === "error") {
40
- console.error(`${prefix} ${message}`);
41
- } else {
42
- console.log(`${prefix} ${message}`);
43
- }
44
- }
45
-
46
- // ============================================================================
47
- // Types
48
- // ============================================================================
49
-
50
- interface EnvVariable {
51
- name: string;
52
- category: string;
53
- description: string;
54
- example?: string;
55
- defaultValue?: string;
56
- required: boolean;
57
- sensitive: boolean;
58
- format?: string;
59
- validation?: string;
60
- }
61
-
62
- interface GenerateOptions {
63
- dir: string;
64
- include: string[];
65
- exclude: string[];
66
- output: string;
67
- envs: string[];
68
- prefix: string;
69
- generateSecrets: boolean;
70
- secretLength: number;
71
- withTypes: boolean;
72
- withValidation: boolean;
73
- templateOnly: boolean;
74
- categories: string[];
75
- autoCategorize: boolean;
76
- format: 'inline' | 'block' | 'minimal';
77
- includeExamples: boolean;
78
- securityWarnings: boolean;
79
- }
80
-
81
- // ============================================================================
82
- // Constants
83
- // ============================================================================
84
-
85
- const DEFAULT_CATEGORIES = [
86
- 'database',
87
- 'auth',
88
- 'api',
89
- 'services',
90
- 'email',
91
- 'storage',
92
- 'monitoring',
93
- 'security',
94
- 'misc'
95
- ];
96
-
97
- const SENSITIVE_PATTERNS = [
98
- /secret/i,
99
- /password/i,
100
- /private.*key/i,
101
- /api.*key/i,
102
- /token/i,
103
- /credential/i,
104
- /auth/i,
105
- ];
106
-
107
- const CATEGORY_PATTERNS: Record<string, RegExp[]> = {
108
- database: [/database/i, /_db_/i, /postgres/i, /mongodb/i, /mysql/i, /redis/i, /_url$/i],
109
- auth: [/auth/i, /jwt/i, /session/i, /token/i, /oauth/i, /saml/i],
110
- api: [/api.*key/i, /^api_/i, /_api$/i],
111
- services: [/stripe/i, /sendgrid/i, /twilio/i, /aws/i, /openai/i, /anthropic/i],
112
- email: [/mail/i, /smtp/i, /sendgrid/i, /resend/i, /postmark/i],
113
- storage: [/bucket/i, /storage/i, /s3/i, /cdn/i, /cloudinary/i],
114
- monitoring: [/sentry/i, /analytics/i, /log/i, /datadog/i, /newrelic/i],
115
- security: [/cors/i, /csp/i, /encryption/i, /cipher/i],
116
- };
117
-
118
- const COMMON_VARIABLES: EnvVariable[] = [
119
- {
120
- name: 'NODE_ENV',
121
- category: 'general',
122
- description: 'Node.js environment mode',
123
- example: 'development',
124
- defaultValue: 'development',
125
- required: true,
126
- sensitive: false,
127
- validation: "z.enum(['development', 'production', 'test'])",
128
- },
129
- {
130
- name: 'PORT',
131
- category: 'general',
132
- description: 'Server port number',
133
- example: '3000',
134
- defaultValue: '3000',
135
- required: false,
136
- sensitive: false,
137
- validation: 'z.string().regex(/^\\d+$/).transform(Number)',
138
- },
139
- {
140
- name: 'HOST',
141
- category: 'general',
142
- description: 'Server host address',
143
- example: 'localhost',
144
- defaultValue: 'localhost',
145
- required: false,
146
- sensitive: false,
147
- },
148
- ];
149
-
150
- // ============================================================================
151
- // Variable Detection
152
- // ============================================================================
153
-
154
- /**
155
- * Detect environment variables from codebase
156
- */
157
- async function detectEnvVariables(options: GenerateOptions): Promise<EnvVariable[]> {
158
- const { dir, include, exclude } = options;
159
-
160
- log('Analyzing codebase for environment variables...');
161
- log(`Scanning: ${include.join(', ')}`);
162
-
163
- const files = await glob(include, {
164
- cwd: dir,
165
- ignore: exclude,
166
- absolute: true,
167
- });
168
-
169
- log(`Found ${files.length} files to analyze`);
170
-
171
- const envVars = new Map<string, EnvVariable>();
172
-
173
- // Add common variables
174
- COMMON_VARIABLES.forEach(v => envVars.set(v.name, v));
175
-
176
- for (const file of files) {
177
- try {
178
- const content = readFileSync(file, 'utf-8');
179
- const detected = extractEnvVarsFromCode(content);
180
-
181
- detected.forEach(varName => {
182
- if (!envVars.has(varName)) {
183
- envVars.set(varName, {
184
- name: varName,
185
- category: options.autoCategorize ? categorizeVariable(varName) : 'misc',
186
- description: generateDescription(varName),
187
- required: true,
188
- sensitive: isSensitive(varName),
189
- example: generateExample(varName),
190
- });
191
- }
192
- });
193
- } catch (error) {
194
- log(`Could not read file: ${file}`, "warn");
195
- }
196
- }
24
+ async function main() {
25
+ log(`Starting ${SKILL_NAME} session: ${SESSION_ID}`);
197
26
 
198
- log(`Found ${envVars.size} environment variables`, "success");
27
+ const options = parseGenerateOptions();
28
+ const variables = options.templateOnly
29
+ ? useTemplateVariables()
30
+ : await detectEnvVariables(options);
199
31
 
200
- return Array.from(envVars.values()).sort((a, b) => {
201
- // Sort by category, then by name
202
- if (a.category !== b.category) {
203
- return a.category.localeCompare(b.category);
204
- }
205
- return a.name.localeCompare(b.name);
206
- });
207
- }
208
-
209
- /**
210
- * Extract environment variable names from code
211
- */
212
- function extractEnvVarsFromCode(content: string): string[] {
213
- const vars = new Set<string>();
32
+ logCategoryCounts(variables);
33
+ logGeneratedSecrets(variables, options.generateSecrets, options.secretLength);
214
34
 
215
- // Pattern 1: process.env.VAR_NAME
216
- const pattern1 = /process\.env\.([A-Z_][A-Z0-9_]*)/g;
217
- let match;
218
- while ((match = pattern1.exec(content)) !== null) {
219
- vars.add(match[1]);
35
+ if (!existsSync(options.output)) {
36
+ mkdirSync(options.output, { recursive: true });
220
37
  }
221
38
 
222
- // Pattern 2: process.env['VAR_NAME'] or process.env["VAR_NAME"]
223
- const pattern2 = /process\.env\[['"]([A-Z_][A-Z0-9_]*)['"]\]/g;
224
- while ((match = pattern2.exec(content)) !== null) {
225
- vars.add(match[1]);
226
- }
39
+ log("Writing configuration files...");
227
40
 
228
- // Pattern 3: Destructuring { VAR1, VAR2 } = process.env
229
- const pattern3 = /\{\s*([A-Z_][A-Z0-9_,\s]*)\s*\}\s*=\s*process\.env/g;
230
- while ((match = pattern3.exec(content)) !== null) {
231
- const varNames = match[1].split(',').map(v => v.trim());
232
- varNames.forEach(v => {
233
- if (v && /^[A-Z_][A-Z0-9_]*$/.test(v)) {
234
- vars.add(v);
235
- }
236
- });
41
+ for (const env of options.envs) {
42
+ const filename = `${options.prefix}.${env}`;
43
+ const filepath = join(options.output, filename);
44
+ const content = generateEnvFile(variables, env, options);
45
+ writeFileSync(filepath, content, "utf-8");
46
+ log(` ✓ ${filename}`);
237
47
  }
238
48
 
239
- // Pattern 4: import.meta.env.VAR_NAME (Vite)
240
- const pattern4 = /import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g;
241
- while ((match = pattern4.exec(content)) !== null) {
242
- vars.add(match[1]);
49
+ if (options.withTypes) {
50
+ const filepath = join(options.output, "env.d.ts");
51
+ writeFileSync(filepath, generateTypeDefs(variables), "utf-8");
52
+ log(" ✓ env.d.ts (TypeScript types)");
243
53
  }
244
54
 
245
- return Array.from(vars);
246
- }
247
-
248
- /**
249
- * Categorize a variable based on its name
250
- */
251
- function categorizeVariable(varName: string): string {
252
- for (const [category, patterns] of Object.entries(CATEGORY_PATTERNS)) {
253
- if (patterns.some(pattern => pattern.test(varName))) {
254
- return category;
255
- }
55
+ if (options.withValidation) {
56
+ const filepath = join(options.output, "env.validation.ts");
57
+ writeFileSync(filepath, generateValidation(variables), "utf-8");
58
+ log(" ✓ env.validation.ts (Zod schema)");
256
59
  }
257
- return 'misc';
258
- }
259
60
 
260
- /**
261
- * Check if variable is sensitive
262
- */
263
- function isSensitive(varName: string): boolean {
264
- return SENSITIVE_PATTERNS.some(pattern => pattern.test(varName));
265
- }
61
+ const metadataPath = join(options.output, ".env.generated.json");
62
+ writeFileSync(metadataPath, generateMetadata(variables, options), "utf-8");
63
+ log(" ✓ .env.generated.json (metadata)");
266
64
 
267
- /**
268
- * Generate description for variable
269
- */
270
- function generateDescription(varName: string): string {
271
- // Convert SCREAMING_SNAKE_CASE to readable text
272
- const words = varName.toLowerCase().split('_');
273
- const readable = words
274
- .map(w => w.charAt(0).toUpperCase() + w.slice(1))
275
- .join(' ');
276
-
277
- // Add context based on patterns
278
- if (/url$/i.test(varName)) return `${readable} connection URL`;
279
- if (/key$/i.test(varName)) return `${readable} for authentication`;
280
- if (/secret/i.test(varName)) return `${readable} for encryption`;
281
- if (/token/i.test(varName)) return `${readable} for authorization`;
282
- if (/host/i.test(varName)) return `${readable} hostname`;
283
- if (/port/i.test(varName)) return `${readable} port number`;
284
-
285
- return readable;
65
+ log("Environment configuration generated successfully!", "success");
66
+ printNextSteps(options.withValidation);
286
67
  }
287
68
 
288
- /**
289
- * Generate example value for variable
290
- */
291
- function generateExample(varName: string): string {
292
- if (/database.*url/i.test(varName)) return 'postgresql://user:password@localhost:5432/dbname';
293
- if (/mongodb/i.test(varName)) return 'mongodb://localhost:27017/dbname';
294
- if (/redis/i.test(varName)) return 'redis://localhost:6379';
295
- if (/^port$/i.test(varName)) return '3000';
296
- if (/^host$/i.test(varName)) return 'localhost';
297
- if (/url$/i.test(varName)) return 'https://example.com';
298
- if (/email/i.test(varName)) return 'admin@example.com';
299
- if (/openai.*key/i.test(varName)) return 'sk-...';
300
- if (/stripe.*publishable/i.test(varName)) return 'pk_test_...';
301
- if (/stripe.*secret/i.test(varName)) return 'sk_test_...';
302
- if (/next_public/i.test(varName)) return 'public-value';
303
-
304
- return 'your-value-here';
305
- }
306
-
307
- // ============================================================================
308
- // Secret Generation
309
- // ============================================================================
310
-
311
- /**
312
- * Generate a secure random secret
313
- */
314
- function generateSecret(length: number = 32): string {
315
- return randomBytes(Math.ceil(length / 2))
316
- .toString('hex')
317
- .slice(0, length);
69
+ function useTemplateVariables() {
70
+ log("Using template variables...");
71
+ return COMMON_VARIABLES;
318
72
  }
319
73
 
320
- // ============================================================================
321
- // File Generation
322
- // ============================================================================
74
+ function logCategoryCounts(variables: EnvVariable[]) {
75
+ if (variables.length === 0) return;
323
76
 
324
- /**
325
- * Generate .env file content
326
- */
327
- function generateEnvFile(
328
- variables: EnvVariable[],
329
- environment: string,
330
- options: GenerateOptions
331
- ): string {
332
- const lines: string[] = [];
333
-
334
- // Header
335
- if (environment === 'example') {
336
- lines.push('# Environment Configuration Template');
337
- lines.push('# Copy this file to .env.local and fill in the values');
338
- } else {
339
- lines.push(`# ${environment.charAt(0).toUpperCase() + environment.slice(1)} Environment Configuration`);
340
- }
341
- lines.push(`# Generated: ${new Date().toISOString()}`);
342
- lines.push('');
343
-
344
- // Group by category
345
- const categories = new Map<string, EnvVariable[]>();
346
- variables.forEach(v => {
347
- const cat = v.category;
348
- if (!categories.has(cat)) categories.set(cat, []);
349
- categories.get(cat)!.push(v);
77
+ log("Categorizing variables...");
78
+ const categoryCounts = new Map<string, number>();
79
+ variables.forEach((variable) => {
80
+ categoryCounts.set(variable.category, (categoryCounts.get(variable.category) || 0) + 1);
350
81
  });
351
-
352
- // Generate sections
353
- for (const [category, vars] of categories) {
354
- lines.push('# ' + '='.repeat(77));
355
- lines.push(`# ${category.toUpperCase()}`);
356
- lines.push('# ' + '='.repeat(77));
357
- lines.push('');
358
-
359
- for (const envVar of vars) {
360
- // Add description
361
- if (options.format !== 'minimal') {
362
- lines.push(`# ${envVar.description}`);
363
-
364
- if (options.includeExamples && envVar.example) {
365
- lines.push(`# Example: ${envVar.example}`);
366
- }
367
-
368
- if (options.securityWarnings && envVar.sensitive) {
369
- lines.push('# ⚠️ SECURITY WARNING: This is a sensitive credential');
370
- lines.push('# - Never commit this to version control');
371
- lines.push('# - Use a strong, randomly generated value');
372
- lines.push('# - Store securely (e.g., password manager, secrets vault)');
373
- }
374
- }
375
-
376
- // Generate value
377
- let value = '';
378
- if (environment === 'example') {
379
- value = envVar.example || 'your-value-here';
380
- } else if (options.generateSecrets && envVar.sensitive && !envVar.example?.includes('sk-')) {
381
- value = generateSecret(options.secretLength);
382
- } else {
383
- value = envVar.defaultValue || envVar.example || '';
384
- }
385
-
386
- // Add variable
387
- if (environment === 'example' || !value) {
388
- lines.push(`${envVar.name}="${value}"`);
389
- } else {
390
- lines.push(`${envVar.name}="${value}"`);
391
- }
392
-
393
- lines.push('');
394
- }
395
-
396
- lines.push('');
397
- }
398
-
399
- return lines.join('\n');
400
- }
401
-
402
- /**
403
- * Generate TypeScript type definitions
404
- */
405
- function generateTypeDefs(variables: EnvVariable[]): string {
406
- const lines: string[] = [];
407
-
408
- lines.push('/**');
409
- lines.push(' * Environment Variables Type Definitions');
410
- lines.push(' * Generated by generate-env skill');
411
- lines.push(' */');
412
- lines.push('');
413
- lines.push('declare global {');
414
- lines.push(' namespace NodeJS {');
415
- lines.push(' interface ProcessEnv {');
416
-
417
- // Group by category
418
- const categories = new Map<string, EnvVariable[]>();
419
- variables.forEach(v => {
420
- const cat = v.category;
421
- if (!categories.has(cat)) categories.set(cat, []);
422
- categories.get(cat)!.push(v);
82
+ categoryCounts.forEach((count, category) => {
83
+ log(` ${category}: ${count} variables`);
423
84
  });
424
-
425
- for (const [category, vars] of categories) {
426
- lines.push(` // ${category.charAt(0).toUpperCase() + category.slice(1)}`);
427
-
428
- for (const envVar of vars) {
429
- let type = 'string';
430
- if (envVar.name === 'NODE_ENV') {
431
- type = "'development' | 'production' | 'test'";
432
- } else if (envVar.name === 'PORT') {
433
- type = 'string';
434
- }
435
-
436
- const optional = envVar.required ? '' : '?';
437
- lines.push(` ${envVar.name}${optional}: ${type};`);
438
- }
439
-
440
- lines.push('');
441
- }
442
-
443
- lines.push(' }');
444
- lines.push(' }');
445
- lines.push('}');
446
- lines.push('');
447
- lines.push('export {};');
448
-
449
- return lines.join('\n');
450
85
  }
451
86
 
452
- /**
453
- * Generate Zod validation schema
454
- */
455
- function generateValidation(variables: EnvVariable[]): string {
456
- const lines: string[] = [];
87
+ function logGeneratedSecrets(variables: EnvVariable[], generateSecrets: boolean, secretLength: number) {
88
+ if (!generateSecrets) return;
457
89
 
458
- lines.push("import { z } from 'zod';");
459
- lines.push('');
460
- lines.push('/**');
461
- lines.push(' * Environment Variables Validation Schema');
462
- lines.push(' * Generated by generate-env skill');
463
- lines.push(' */');
464
- lines.push('');
465
- lines.push('export const envSchema = z.object({');
466
-
467
- // Group by category
468
- const categories = new Map<string, EnvVariable[]>();
469
- variables.forEach(v => {
470
- const cat = v.category;
471
- if (!categories.has(cat)) categories.set(cat, []);
472
- categories.get(cat)!.push(v);
90
+ log("Generating secrets...");
91
+ const secretVars = variables.filter((variable) => variable.sensitive);
92
+ secretVars.forEach((variable) => {
93
+ log(` ✓ ${variable.name} (${secretLength} chars)`);
473
94
  });
474
-
475
- for (const [category, vars] of categories) {
476
- lines.push(` // ${category.charAt(0).toUpperCase() + category.slice(1)}`);
477
-
478
- for (const envVar of vars) {
479
- let validation = envVar.validation || 'z.string()';
480
-
481
- // Add specific validations
482
- if (envVar.name.endsWith('_URL')) {
483
- validation = 'z.string().url()';
484
- } else if (envVar.name.endsWith('_EMAIL')) {
485
- validation = 'z.string().email()';
486
- } else if (envVar.sensitive && !envVar.validation) {
487
- validation = 'z.string().min(1)';
488
- }
489
-
490
- if (!envVar.required) {
491
- validation += '.optional()';
492
- }
493
-
494
- lines.push(` ${envVar.name}: ${validation},`);
495
- }
496
-
497
- lines.push('');
498
- }
499
-
500
- lines.push('});');
501
- lines.push('');
502
- lines.push('export type Env = z.infer<typeof envSchema>;');
503
- lines.push('');
504
- lines.push('/**');
505
- lines.push(' * Validate environment variables at runtime');
506
- lines.push(' */');
507
- lines.push('export function validateEnv(): Env {');
508
- lines.push(' const parsed = envSchema.safeParse(process.env);');
509
- lines.push('');
510
- lines.push(' if (!parsed.success) {');
511
- lines.push(" console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);");
512
- lines.push(" throw new Error('Invalid environment variables');");
513
- lines.push(' }');
514
- lines.push('');
515
- lines.push(' return parsed.data;');
516
- lines.push('}');
517
-
518
- return lines.join('\n');
519
95
  }
520
96
 
521
- /**
522
- * Generate metadata file
523
- */
524
- function generateMetadata(variables: EnvVariable[], options: GenerateOptions): string {
525
- return JSON.stringify({
526
- generatedAt: new Date().toISOString(),
527
- totalVariables: variables.length,
528
- categories: Array.from(new Set(variables.map(v => v.category))).sort(),
529
- sensitiveCount: variables.filter(v => v.sensitive).length,
530
- requiredCount: variables.filter(v => v.required).length,
531
- options: {
532
- templateOnly: options.templateOnly,
533
- generateSecrets: options.generateSecrets,
534
- withTypes: options.withTypes,
535
- withValidation: options.withValidation,
536
- },
537
- variables: variables.map(v => ({
538
- name: v.name,
539
- category: v.category,
540
- required: v.required,
541
- sensitive: v.sensitive,
542
- })),
543
- }, null, 2);
544
- }
545
-
546
- // ============================================================================
547
- // Main
548
- // ============================================================================
549
-
550
- async function main() {
551
- log(`Starting ${SKILL_NAME} session: ${SESSION_ID}`);
552
-
553
- const { values } = parseArgs({
554
- args: process.argv.slice(2),
555
- options: {
556
- dir: { type: 'string', default: process.cwd() },
557
- include: { type: 'string', default: '**/*.{ts,js,tsx,jsx}' },
558
- exclude: { type: 'string', default: 'node_modules/**,dist/**,.next/**,build/**' },
559
- output: { type: 'string', default: process.cwd() },
560
- envs: { type: 'string', default: 'example,local,development,production' },
561
- prefix: { type: 'string', default: '.env' },
562
- 'generate-secrets': { type: 'boolean', default: false },
563
- 'secret-length': { type: 'string', default: '32' },
564
- 'with-types': { type: 'boolean', default: false },
565
- 'with-validation': { type: 'boolean', default: false },
566
- 'template-only': { type: 'boolean', default: false },
567
- categories: { type: 'string', default: DEFAULT_CATEGORIES.join(',') },
568
- 'auto-categorize': { type: 'boolean', default: true },
569
- format: { type: 'string', default: 'inline' },
570
- 'include-examples': { type: 'boolean', default: true },
571
- 'security-warnings': { type: 'boolean', default: true },
572
- help: { type: 'boolean', short: 'h' },
573
- },
574
- allowPositionals: true,
575
- });
576
-
577
- if (values.help) {
578
- console.log(`
579
- Generate Env - Generate comprehensive .env templates
580
-
581
- Usage:
582
- skills run generate-env -- [options]
583
-
584
- Options:
585
- --dir <path> Project directory
586
- --include <pattern> Glob pattern to include
587
- --exclude <pattern> Glob pattern to exclude
588
- --output <path> Output directory
589
- --envs <list> Environments to generate (comma-separated)
590
- --prefix <string> File prefix (default: .env)
591
- --generate-secrets Generate random secrets
592
- --secret-length <n> Length of generated secrets
593
- --with-types Generate TypeScript types
594
- --with-validation Generate Zod validation
595
- --template-only Use template variables only
596
- --categories <list> Custom categories
597
- --auto-categorize Auto-categorize variables
598
- --format <type> Output format: inline, block, minimal
599
- --include-examples Include examples in comments
600
- --security-warnings Include security warnings
601
- --help, -h Show this help
602
- `);
603
- process.exit(0);
604
- }
605
-
606
- const options: GenerateOptions = {
607
- dir: resolve(values.dir as string),
608
- include: (values.include as string).split(','),
609
- exclude: (values.exclude as string).split(','),
610
- output: resolve(values.output as string),
611
- envs: (values.envs as string).split(','),
612
- prefix: values.prefix as string,
613
- generateSecrets: values['generate-secrets'] as boolean,
614
- secretLength: parseInt(values['secret-length'] as string, 10),
615
- withTypes: values['with-types'] as boolean,
616
- withValidation: values['with-validation'] as boolean,
617
- templateOnly: values['template-only'] as boolean,
618
- categories: (values.categories as string).split(','),
619
- autoCategorize: values['auto-categorize'] as boolean,
620
- format: values.format as 'inline' | 'block' | 'minimal',
621
- includeExamples: values['include-examples'] as boolean,
622
- securityWarnings: values['security-warnings'] as boolean,
623
- };
624
-
625
- // Detect or use template variables
626
- let variables: EnvVariable[];
627
- if (options.templateOnly) {
628
- log('Using template variables...');
629
- variables = COMMON_VARIABLES;
630
- } else {
631
- variables = await detectEnvVariables(options);
97
+ function printNextSteps(withValidation: boolean) {
98
+ console.log("⚠️ Important:");
99
+ console.log(" - Review generated values before committing");
100
+ console.log(" - Add .env.local and .env.production to .gitignore");
101
+ console.log(" - Update placeholder values in .env.example");
102
+ if (withValidation) {
103
+ console.log(" - Run validation: bun run env.validation.ts");
632
104
  }
105
+ console.log("");
633
106
 
634
- // Categorize
635
- if (variables.length > 0) {
636
- log('Categorizing variables...');
637
- const categoryCounts = new Map<string, number>();
638
- variables.forEach(v => {
639
- categoryCounts.set(v.category, (categoryCounts.get(v.category) || 0) + 1);
640
- });
641
- categoryCounts.forEach((count, category) => {
642
- log(` ${category}: ${count} variables`);
643
- });
644
- }
645
-
646
- // Generate secrets if needed
647
- if (options.generateSecrets) {
648
- log('Generating secrets...');
649
- const secretVars = variables.filter(v => v.sensitive);
650
- secretVars.forEach(v => {
651
- log(` ✓ ${v.name} (${options.secretLength} chars)`);
652
- });
653
- }
654
-
655
- // Create output directory
656
- if (!existsSync(options.output)) {
657
- mkdirSync(options.output, { recursive: true });
658
- }
659
-
660
- // Generate files
661
- log('Writing configuration files...');
662
-
663
- for (const env of options.envs) {
664
- const filename = env === 'example'
665
- ? `${options.prefix}.${env}`
666
- : `${options.prefix}.${env}`;
667
- const filepath = join(options.output, filename);
668
- const content = generateEnvFile(variables, env, options);
669
- writeFileSync(filepath, content, 'utf-8');
670
- log(` ✓ ${filename}`);
671
- }
672
-
673
- // Generate types
674
- if (options.withTypes) {
675
- const filepath = join(options.output, 'env.d.ts');
676
- const content = generateTypeDefs(variables);
677
- writeFileSync(filepath, content, 'utf-8');
678
- log(' ✓ env.d.ts (TypeScript types)');
679
- }
680
-
681
- // Generate validation
682
- if (options.withValidation) {
683
- const filepath = join(options.output, 'env.validation.ts');
684
- const content = generateValidation(variables);
685
- writeFileSync(filepath, content, 'utf-8');
686
- log(' ✓ env.validation.ts (Zod schema)');
687
- }
688
-
689
- // Generate metadata
690
- const metadataPath = join(options.output, '.env.generated.json');
691
- const metadata = generateMetadata(variables, options);
692
- writeFileSync(metadataPath, metadata, 'utf-8');
693
- log(' ✓ .env.generated.json (metadata)');
694
-
695
- log('Environment configuration generated successfully!', "success");
696
-
697
- // Warnings and next steps
698
- console.log('⚠️ Important:');
699
- console.log(' - Review generated values before committing');
700
- console.log(' - Add .env.local and .env.production to .gitignore');
701
- console.log(' - Update placeholder values in .env.example');
702
- if (options.withValidation) {
703
- console.log(' - Run validation: bun run env.validation.ts');
704
- }
705
- console.log('');
706
-
707
- console.log('📚 Next steps:');
708
- console.log(' 1. Copy .env.example to .env.local');
709
- console.log(' 2. Fill in actual values for your environment');
710
- if (options.withValidation) {
711
- console.log(' 3. Import and use validateEnv() in your app');
107
+ console.log("📚 Next steps:");
108
+ console.log(" 1. Copy .env.example to .env.local");
109
+ console.log(" 2. Fill in actual values for your environment");
110
+ if (withValidation) {
111
+ console.log(" 3. Import and use validateEnv() in your app");
712
112
  }
713
- console.log(' 4. Update values in CI/CD for production');
714
- console.log('');
113
+ console.log(" 4. Update values in CI/CD for production");
114
+ console.log("");
715
115
  }
716
116
 
717
- main().catch(error => {
117
+ main().catch((error) => {
718
118
  log(`Error: ${error.message}`, "error");
719
119
  process.exit(1);
720
120
  });