@hasna/skills 0.1.27 → 0.1.30

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 (671) 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 +11 -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/skill-academic-journal-matcher/bin/cli.ts +34 -0
  343. package/skills/skill-action-item-router/bin/cli.ts +34 -0
  344. package/skills/skill-ad-creative-generator/bin/cli.ts +34 -0
  345. package/skills/skill-advanced-math/bin/cli.ts +34 -0
  346. package/skills/skill-analyze-data/bin/cli.ts +19 -0
  347. package/skills/skill-anomaly-investigator/bin/cli.ts +34 -0
  348. package/skills/skill-api-test-suite/bin/cli.ts +34 -0
  349. package/skills/skill-apidocs/bin/cli.ts +87 -0
  350. package/skills/skill-audio-cleanup-lab/bin/cli.ts +6 -0
  351. package/skills/skill-audiobook-chapter-proofer/bin/cli.ts +34 -0
  352. package/skills/skill-banner-ad-suite/bin/cli.ts +34 -0
  353. package/skills/skill-benchmark-finder/bin/cli.ts +34 -0
  354. package/skills/skill-bio-sequence-tool/bin/cli.ts +34 -0
  355. package/skills/skill-blog-topic-cluster/bin/cli.ts +34 -0
  356. package/skills/skill-brand-style-guide/bin/cli.ts +19 -0
  357. package/skills/skill-brand-voice-audit/bin/cli.ts +34 -0
  358. package/skills/skill-budget-variance-analyzer/bin/cli.ts +6 -0
  359. package/skills/skill-businessactivity/bin/cli.ts +28 -0
  360. package/skills/skill-calendar-events/bin/cli.ts +34 -0
  361. package/skills/skill-campaign-metric-brief/bin/cli.ts +34 -0
  362. package/skills/skill-campaign-moodboard/bin/cli.ts +34 -0
  363. package/skills/skill-caption-style-stylist/bin/cli.ts +34 -0
  364. package/skills/skill-chemistry-calculator/bin/cli.ts +34 -0
  365. package/skills/skill-churn-risk-notifier/bin/cli.ts +34 -0
  366. package/skills/skill-citation-formatter/bin/cli.ts +34 -0
  367. package/skills/skill-classroom-newsletter-kit/bin/cli.ts +34 -0
  368. package/skills/skill-color-palette-harmonizer/bin/cli.ts +34 -0
  369. package/skills/skill-competitor-ad-analyzer/bin/cli.ts +34 -0
  370. package/skills/skill-compliance-copy-check/bin/cli.ts +34 -0
  371. package/skills/skill-compliance-report-pack/bin/cli.ts +34 -0
  372. package/skills/skill-compress-video/bin/cli.ts +19 -0
  373. package/skills/skill-consolelog/bin/cli.ts +884 -0
  374. package/skills/skill-contract-plainlanguage/bin/cli.ts +34 -0
  375. package/skills/skill-copytone-translator/bin/cli.ts +34 -0
  376. package/skills/skill-create-blog-article/bin/cli.ts +34 -0
  377. package/skills/skill-create-ebook/bin/cli.ts +34 -0
  378. package/skills/skill-crm-note-enhancer/bin/cli.ts +34 -0
  379. package/skills/skill-customer-journey-mapper/bin/cli.ts +34 -0
  380. package/skills/skill-dashboard-builder/bin/cli.ts +34 -0
  381. package/skills/skill-dashboard-narrator/bin/cli.ts +34 -0
  382. package/skills/skill-data-anonymizer/bin/cli.ts +34 -0
  383. package/skills/skill-database-explorer/bin/cli.ts +34 -0
  384. package/skills/skill-dataset-health-check/bin/cli.ts +34 -0
  385. package/skills/skill-decision-journal/bin/cli.ts +34 -0
  386. package/skills/skill-delegation-brief-writer/bin/cli.ts +34 -0
  387. package/skills/skill-destination-briefing/bin/cli.ts +34 -0
  388. package/skills/skill-diff-viewer/bin/cli.ts +34 -0
  389. package/skills/skill-domainpurchase/bin/cli.ts +683 -0
  390. package/skills/skill-domainsearch/bin/cli.ts +410 -0
  391. package/skills/skill-educational-resource-finder/bin/cli.ts +34 -0
  392. package/skills/skill-email-campaign/bin/cli.ts +34 -0
  393. package/skills/skill-exam-readiness-check/bin/cli.ts +34 -0
  394. package/skills/skill-experiment-power-calculator/bin/cli.ts +34 -0
  395. package/skills/skill-extract-audio/bin/cli.ts +19 -0
  396. package/skills/skill-extract-frames/bin/cli.ts +34 -0
  397. package/skills/skill-extract-invoice/bin/cli.ts +34 -0
  398. package/skills/skill-family-activity-curator/bin/cli.ts +34 -0
  399. package/skills/skill-faq-packager/bin/cli.ts +34 -0
  400. package/skills/skill-feedback-survey-designer/bin/cli.ts +34 -0
  401. package/skills/skill-field-trip-planner/bin/cli.ts +34 -0
  402. package/skills/skill-file-organizer/bin/cli.ts +34 -0
  403. package/skills/skill-folder-tree/bin/cli.ts +34 -0
  404. package/skills/skill-forecast-scenario-lab/bin/cli.ts +34 -0
  405. package/skills/skill-form-filler/bin/cli.ts +34 -0
  406. package/skills/skill-generate-api-client/bin/cli.ts +34 -0
  407. package/skills/skill-generate-book-cover/bin/cli.ts +34 -0
  408. package/skills/skill-generate-chart/bin/cli.ts +34 -0
  409. package/skills/skill-generate-diagram/bin/cli.ts +34 -0
  410. package/skills/skill-generate-dockerfile/bin/cli.ts +34 -0
  411. package/skills/skill-generate-documentation/bin/cli.ts +34 -0
  412. package/skills/skill-generate-docx/bin/cli.ts +6 -0
  413. package/skills/skill-generate-env/bin/cli.ts +34 -0
  414. package/skills/skill-generate-excel/bin/cli.ts +34 -0
  415. package/skills/skill-generate-favicon/bin/cli.ts +34 -0
  416. package/skills/skill-generate-mock-data/bin/cli.ts +34 -0
  417. package/skills/skill-generate-pdf/bin/cli.ts +6 -0
  418. package/skills/skill-generate-pr-description/bin/cli.ts +34 -0
  419. package/skills/skill-generate-presentation/bin/cli.ts +34 -0
  420. package/skills/skill-generate-qrcode/bin/cli.ts +34 -0
  421. package/skills/skill-generate-regex/bin/cli.ts +34 -0
  422. package/skills/skill-generate-resume/bin/cli.ts +34 -0
  423. package/skills/skill-generate-sitemap/bin/cli.ts +34 -0
  424. package/skills/skill-generate-social-posts/bin/cli.ts +34 -0
  425. package/skills/skill-generate-sql/bin/cli.ts +34 -0
  426. package/skills/skill-gif-maker/bin/cli.ts +34 -0
  427. package/skills/skill-github-manager/bin/cli.ts +34 -0
  428. package/skills/skill-gmail/bin/cli.ts +34 -0
  429. package/skills/skill-goal-quarterly-roadmap/bin/cli.ts +34 -0
  430. package/skills/skill-grant-application-drafter/bin/cli.ts +34 -0
  431. package/skills/skill-grocery-basket-optimizer/bin/cli.ts +34 -0
  432. package/skills/skill-guest-communication-suite/bin/cli.ts +34 -0
  433. package/skills/skill-habit-reflection-digest/bin/cli.ts +34 -0
  434. package/skills/skill-highlight-reel-generator/bin/cli.ts +34 -0
  435. package/skills/skill-homework-feedback-coach/bin/cli.ts +34 -0
  436. package/skills/skill-household-maintenance-mgr/bin/cli.ts +34 -0
  437. package/skills/skill-http-server/bin/cli.ts +34 -0
  438. package/skills/skill-implementation-agent/bin/cli.ts +34 -0
  439. package/skills/skill-implementation-plan/bin/cli.ts +34 -0
  440. package/skills/skill-implementation-todo/bin/cli.ts +34 -0
  441. package/skills/skill-inbox-priority-planner/bin/cli.ts +34 -0
  442. package/skills/skill-invoice/bin/cli.ts +20 -0
  443. package/skills/skill-invoice-dispute-helper/bin/cli.ts +34 -0
  444. package/skills/skill-itinerary-architect/bin/cli.ts +34 -0
  445. package/skills/skill-jingle-composer/bin/cli.ts +34 -0
  446. package/skills/skill-kpi-digest-generator/bin/cli.ts +34 -0
  447. package/skills/skill-lab-notebook-formatter/bin/cli.ts +34 -0
  448. package/skills/skill-landing-page-copy/bin/cli.ts +34 -0
  449. package/skills/skill-latex-table-generator/bin/cli.ts +34 -0
  450. package/skills/skill-learning-style-profiler/bin/cli.ts +34 -0
  451. package/skills/skill-lesson-plan-customizer/bin/cli.ts +34 -0
  452. package/skills/skill-livestream-runofshow/bin/cli.ts +34 -0
  453. package/skills/skill-longform-structurer/bin/cli.ts +34 -0
  454. package/skills/skill-lorem-generator/bin/cli.ts +34 -0
  455. package/skills/skill-managehook/bin/cli.ts +241 -0
  456. package/skills/skill-managemcp/bin/cli.ts +241 -0
  457. package/skills/skill-manageskill/bin/cli.ts +241 -0
  458. package/skills/skill-markdown-validator/bin/cli.ts +34 -0
  459. package/skills/skill-mcp-builder/bin/cli.ts +34 -0
  460. package/skills/skill-meal-plan-designer/bin/cli.ts +34 -0
  461. package/skills/skill-meeting-insight-summarizer/bin/cli.ts +34 -0
  462. package/skills/skill-merge-pdfs/bin/cli.ts +34 -0
  463. package/skills/skill-microcopy-generator/bin/cli.ts +34 -0
  464. package/skills/skill-mindfulness-prompt-cache/bin/cli.ts +34 -0
  465. package/skills/skill-notion-manager/bin/cli.ts +34 -0
  466. package/skills/skill-onboarding-sequence-builder/bin/cli.ts +34 -0
  467. package/skills/skill-onsite-ops-checklist/bin/cli.ts +34 -0
  468. package/skills/skill-outreach-cadence-designer/bin/cli.ts +34 -0
  469. package/skills/skill-packaging-concept-studio/bin/cli.ts +34 -0
  470. package/skills/skill-packing-plan-pro/bin/cli.ts +34 -0
  471. package/skills/skill-parent-teacher-brief/bin/cli.ts +34 -0
  472. package/skills/skill-partner-kit-assembler/bin/cli.ts +34 -0
  473. package/skills/skill-payroll-change-prepper/bin/cli.ts +34 -0
  474. package/skills/skill-persona-based-adwriter/bin/cli.ts +34 -0
  475. package/skills/skill-persona-generator/bin/cli.ts +34 -0
  476. package/skills/skill-personal-daily-ops/bin/cli.ts +34 -0
  477. package/skills/skill-pet-care-scheduler/bin/cli.ts +34 -0
  478. package/skills/skill-podcast-show-notes/bin/cli.ts +34 -0
  479. package/skills/skill-presentation-theme-maker/bin/cli.ts +34 -0
  480. package/skills/skill-press-release-drafter/bin/cli.ts +34 -0
  481. package/skills/skill-print-collateral-designer/bin/cli.ts +34 -0
  482. package/skills/skill-procurement-scorecard/bin/cli.ts +34 -0
  483. package/skills/skill-product-demo-script/bin/cli.ts +34 -0
  484. package/skills/skill-product-mockup/bin/cli.ts +34 -0
  485. package/skills/skill-project-retro-companion/bin/cli.ts +34 -0
  486. package/skills/skill-proposal-redline-advisor/bin/cli.ts +34 -0
  487. package/skills/skill-regex-tester/bin/cli.ts +34 -0
  488. package/skills/skill-remove-background/bin/cli.ts +34 -0
  489. package/skills/skill-risk-disclosure-kit/bin/cli.ts +34 -0
  490. package/skills/skill-roi-comparison-tool/bin/cli.ts +34 -0
  491. package/skills/skill-sales-call-recapper/bin/cli.ts +34 -0
  492. package/skills/skill-salescopy/bin/cli.ts +20 -0
  493. package/skills/skill-scaffold-project/bin/cli.ts +34 -0
  494. package/skills/skill-scholarship-tracker/bin/cli.ts +34 -0
  495. package/skills/skill-scientific-figure-check/bin/cli.ts +34 -0
  496. package/skills/skill-seating-chart-maker/bin/cli.ts +34 -0
  497. package/skills/skill-security-audit/bin/cli.ts +34 -0
  498. package/skills/skill-seo-brief-builder/bin/cli.ts +34 -0
  499. package/skills/skill-slack-assistant/bin/cli.ts +34 -0
  500. package/skills/skill-sleep-routine-analyzer/bin/cli.ts +34 -0
  501. package/skills/skill-social-media-kit/bin/cli.ts +34 -0
  502. package/skills/skill-split-pdf/bin/cli.ts +34 -0
  503. package/skills/skill-sponsorship-proposal-lab/bin/cli.ts +34 -0
  504. package/skills/skill-spreadsheet-cleanroom/bin/cli.ts +34 -0
  505. package/skills/skill-statistical-test-selector/bin/cli.ts +34 -0
  506. package/skills/skill-stress-relief-playbook/bin/cli.ts +34 -0
  507. package/skills/skill-study-guide-builder/bin/cli.ts +34 -0
  508. package/skills/skill-subscription-spend-watcher/bin/cli.ts +34 -0
  509. package/skills/skill-subtitle/bin/cli.ts +20 -0
  510. package/skills/skill-survey-insight-extractor/bin/cli.ts +34 -0
  511. package/skills/skill-terraform-generator/bin/cli.ts +34 -0
  512. package/skills/skill-testimonial-graphics/bin/cli.ts +34 -0
  513. package/skills/skill-timesheet/bin/cli.ts +47 -0
  514. package/skills/skill-travel-budget-balancer/bin/cli.ts +34 -0
  515. package/skills/skill-validate-config/bin/cli.ts +34 -0
  516. package/skills/skill-video-cut-suggester/bin/cli.ts +34 -0
  517. package/skills/skill-video-downloader/bin/cli.ts +34 -0
  518. package/skills/skill-video-thumbnail/bin/cli.ts +34 -0
  519. package/skills/skill-voiceover-casting-assistant/bin/cli.ts +34 -0
  520. package/skills/skill-watermark/bin/cli.ts +34 -0
  521. package/skills/skill-webcrawling/bin/cli.ts +21 -0
  522. package/skills/skill-webinar-script-coach/bin/cli.ts +34 -0
  523. package/skills/skill-wellness-progress-reporter/bin/cli.ts +34 -0
  524. package/skills/skill-workout-cycle-planner/bin/cli.ts +34 -0
  525. package/skills/slack-assistant/package.json +3 -1
  526. package/skills/slide-deck-generator/SKILL.md +44 -0
  527. package/skills/slide-deck-generator/package.json +10 -0
  528. package/skills/sms/package.json +1 -1
  529. package/skills/sms/src/index.ts +15 -0
  530. package/skills/social-content-calendar/SKILL.md +45 -0
  531. package/skills/social-content-calendar/package.json +14 -0
  532. package/skills/split-pdf/package.json +4 -1
  533. package/skills/subtitle/package.json +2 -1
  534. package/skills/subtitle/src/index.ts +3 -0
  535. package/skills/terraform-generator/package.json +3 -1
  536. package/skills/test-suite-generator/SKILL.md +41 -0
  537. package/skills/test-suite-generator/package.json +10 -0
  538. package/skills/timesheet/package.json +1 -1
  539. package/skills/timesheet/src/index.ts +3 -0
  540. package/skills/transcript/SKILL.md +1 -8
  541. package/skills/validate-config/package.json +3 -1
  542. package/skills/video/package.json +6 -4
  543. package/skills/video-downloader/package.json +3 -1
  544. package/skills/video-highlight-pack/SKILL.md +44 -0
  545. package/skills/video-highlight-pack/package.json +10 -0
  546. package/skills/voiceover-jingle-pack/SKILL.md +28 -0
  547. package/skills/voiceover-jingle-pack/package.json +10 -0
  548. package/skills/watermark/package.json +6 -1
  549. package/skills/webcrawling/package.json +2 -1
  550. package/skills/write/SKILL.md +6 -6
  551. package/dist/server/serve.d.ts +0 -11
  552. package/skills/apidocs/.claude/settings.json +0 -5
  553. package/skills/audio/.env.example +0 -14
  554. package/skills/audio/QUICKSTART.md +0 -158
  555. package/skills/audio/README.md +0 -256
  556. package/skills/audio/src/index-local.ts +0 -206
  557. package/skills/audio/src/index.ts +0 -95
  558. package/skills/audio/src/providers/elevenlabs.ts +0 -115
  559. package/skills/audio/src/providers/google.ts +0 -116
  560. package/skills/audio/src/providers/minimax.ts +0 -83
  561. package/skills/audio/src/providers/openai.ts +0 -115
  562. package/skills/audio/src/types.ts +0 -79
  563. package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
  564. package/skills/audiobook-chapter-proofer/package.json +0 -27
  565. package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
  566. package/skills/browse/src/client.ts +0 -373
  567. package/skills/browse/src/index-local.ts +0 -430
  568. package/skills/browse/src/index.ts +0 -110
  569. package/skills/browse/src/sse-server.ts +0 -919
  570. package/skills/browse/src/types.ts +0 -104
  571. package/skills/consolelog/src/server/index.ts +0 -508
  572. package/skills/create-blog-article/CLAUDE.md +0 -19
  573. package/skills/create-blog-article/src/index.ts +0 -745
  574. package/skills/create-blog-article/tsconfig.json +0 -10
  575. package/skills/deepresearch/src/agents/query-generator.ts +0 -91
  576. package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
  577. package/skills/deepresearch/src/index.ts +0 -224
  578. package/skills/deepresearch/src/research.ts +0 -166
  579. package/skills/deepresearch/src/services/anthropic.ts +0 -69
  580. package/skills/deepresearch/src/services/exa.ts +0 -108
  581. package/skills/deepresearch/src/services/firecrawl.ts +0 -88
  582. package/skills/deepresearch/src/services/openai.ts +0 -81
  583. package/skills/deepresearch/src/types.ts +0 -76
  584. package/skills/deepresearch/src/utils/file.ts +0 -111
  585. package/skills/deepresearch/src/utils/logger.ts +0 -84
  586. package/skills/domainpurchase/src/server/index.ts +0 -332
  587. package/skills/domainsearch/src/server/index.ts +0 -229
  588. package/skills/e2bswarm/README.md +0 -135
  589. package/skills/e2bswarm/SKILL.md +0 -118
  590. package/skills/e2bswarm/examples/tasks-example.json +0 -38
  591. package/skills/e2bswarm/package.json +0 -59
  592. package/skills/e2bswarm/src/commands/collect.ts +0 -135
  593. package/skills/e2bswarm/src/commands/install.ts +0 -164
  594. package/skills/e2bswarm/src/commands/kill.ts +0 -62
  595. package/skills/e2bswarm/src/commands/spawn.ts +0 -134
  596. package/skills/e2bswarm/src/commands/status.ts +0 -90
  597. package/skills/e2bswarm/src/commands/sync.ts +0 -208
  598. package/skills/e2bswarm/src/index.ts +0 -121
  599. package/skills/e2bswarm/src/lib/config.ts +0 -75
  600. package/skills/e2bswarm/src/lib/e2b.ts +0 -490
  601. package/skills/e2bswarm/src/lib/github.ts +0 -253
  602. package/skills/e2bswarm/src/lib/logger.ts +0 -41
  603. package/skills/e2bswarm/src/lib/paths.ts +0 -75
  604. package/skills/e2bswarm/src/lib/tasks.ts +0 -320
  605. package/skills/e2bswarm/src/types/index.ts +0 -107
  606. package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
  607. package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
  608. package/skills/e2bswarm/templates/setup.sh +0 -21
  609. package/skills/e2bswarm/tsconfig.json +0 -19
  610. package/skills/generate-book-cover/src/index.ts +0 -694
  611. package/skills/image/src/index-local.ts +0 -206
  612. package/skills/image/src/index.ts +0 -96
  613. package/skills/image/src/providers/google.ts +0 -79
  614. package/skills/image/src/providers/minimax.ts +0 -94
  615. package/skills/image/src/providers/openai.ts +0 -80
  616. package/skills/image/src/providers/xai.ts +0 -73
  617. package/skills/image/src/types.ts +0 -37
  618. package/skills/logo-design/CLAUDE.md +0 -30
  619. package/skills/logo-design/src/index.ts +0 -322
  620. package/skills/managehook/src/server/index.ts +0 -108
  621. package/skills/managemcp/src/server/index.ts +0 -108
  622. package/skills/manageskill/src/server/index.ts +0 -108
  623. package/skills/music/CLAUDE.md +0 -9
  624. package/skills/music/src/index.ts +0 -94
  625. package/skills/music/tsconfig.json +0 -10
  626. package/skills/pdf-read/src/index.ts +0 -320
  627. package/skills/product-mockup/CLAUDE.md +0 -19
  628. package/skills/product-mockup/src/index.ts +0 -290
  629. package/skills/read-pdf/src/index.ts +0 -388
  630. package/skills/remove-background/src/index.ts +0 -405
  631. package/skills/sound-effects/SKILL.md +0 -34
  632. package/skills/sound-effects/package.json +0 -21
  633. package/skills/sound-effects/src/index.ts +0 -172
  634. package/skills/sound-effects/tsconfig.json +0 -8
  635. package/skills/transcript/src/chunker.ts +0 -215
  636. package/skills/transcript/src/formatter.ts +0 -134
  637. package/skills/transcript/src/index-local.ts +0 -226
  638. package/skills/transcript/src/index.ts +0 -110
  639. package/skills/transcript/src/providers/elevenlabs.ts +0 -133
  640. package/skills/transcript/src/providers/gemini.ts +0 -192
  641. package/skills/transcript/src/providers/index.ts +0 -54
  642. package/skills/transcript/src/providers/openai.ts +0 -203
  643. package/skills/transcript/src/types.ts +0 -106
  644. package/skills/video/.env.example +0 -14
  645. package/skills/video/EXAMPLES.md +0 -266
  646. package/skills/video/LICENSE +0 -192
  647. package/skills/video/README.md +0 -174
  648. package/skills/video/src/cli.ts +0 -155
  649. package/skills/video/src/index-local.ts +0 -148
  650. package/skills/video/src/index.ts +0 -96
  651. package/skills/video/src/providers/google-veo.ts +0 -126
  652. package/skills/video/src/providers/index.ts +0 -22
  653. package/skills/video/src/providers/minimax.ts +0 -100
  654. package/skills/video/src/providers/openai-sora.ts +0 -164
  655. package/skills/video/src/providers/runway.ts +0 -159
  656. package/skills/video/src/types.ts +0 -35
  657. package/skills/video/tsconfig.json +0 -22
  658. package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
  659. package/skills/voiceover-casting-assistant/package.json +0 -27
  660. package/skills/voiceover-casting-assistant/src/index.ts +0 -255
  661. package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
  662. package/skills/webcrawling/src/commands/config.ts +0 -34
  663. package/skills/webcrawling/src/commands/crawl.ts +0 -33
  664. package/skills/webcrawling/src/commands/scrape.ts +0 -32
  665. package/skills/webcrawling/src/commands/sessions.ts +0 -42
  666. package/skills/webcrawling/src/lib/crawler.ts +0 -174
  667. package/skills/webcrawling/src/lib/storage.ts +0 -130
  668. package/skills/webcrawling/src/types/index.ts +0 -45
  669. package/skills/webcrawling/src/utils/logger.ts +0 -30
  670. package/skills/webcrawling/src/utils/paths.ts +0 -28
  671. /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
  });