@hasna/skills 0.1.27 → 0.1.29

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