@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
@@ -0,0 +1,35 @@
1
+ import { appendFileSync, existsSync, mkdirSync } from "fs";
2
+ import { randomUUID } from "crypto";
3
+ import { join } from "path";
4
+
5
+ export const SKILL_NAME = "generate-documentation";
6
+ export const SESSION_ID = randomUUID().slice(0, 8);
7
+ export const SKILLS_OUTPUT_DIR = process.env.SKILLS_OUTPUT_DIR || join(process.cwd(), ".skills");
8
+ export const EXPORTS_DIR = join(SKILLS_OUTPUT_DIR, "exports", SKILL_NAME);
9
+ export const LOGS_DIR = join(SKILLS_OUTPUT_DIR, "logs", SKILL_NAME);
10
+ export const BACKUPS_DIR = join(SKILLS_OUTPUT_DIR, "backups", SKILL_NAME);
11
+ export const SESSION_TIMESTAMP = new Date()
12
+ .toISOString()
13
+ .replace(/[:.]/g, "_")
14
+ .replace(/-/g, "_")
15
+ .slice(0, 19)
16
+ .toLowerCase();
17
+
18
+ export function ensureDir(dir: string) {
19
+ if (!existsSync(dir)) {
20
+ mkdirSync(dir, { recursive: true });
21
+ }
22
+ }
23
+
24
+ export function log(message: string, level: "info" | "error" | "success" | "warn" = "info") {
25
+ const timestamp = new Date().toISOString();
26
+ const logFile = join(LOGS_DIR, `log_${SESSION_TIMESTAMP}_${SESSION_ID}.log`);
27
+
28
+ ensureDir(LOGS_DIR);
29
+
30
+ const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
31
+ appendFileSync(logFile, logEntry);
32
+
33
+ const prefix = level === "error" ? "Error" : level === "success" ? "Success" : level === "warn" ? "Warning" : "Info";
34
+ console.log(`[${prefix}] ${message}`);
35
+ }
@@ -0,0 +1,30 @@
1
+ export type DocFormat = "jsdoc" | "tsdoc" | "python" | "auto";
2
+ export type OutputMode = "inline" | string; // inline or file path
3
+ export type ApiProvider = "anthropic" | "openai";
4
+
5
+ export interface GenerateOptions {
6
+ path: string;
7
+ format: DocFormat;
8
+ output: OutputMode;
9
+ includeExamples: boolean;
10
+ update: boolean;
11
+ verbose: boolean;
12
+ apiProvider: ApiProvider;
13
+ model?: string;
14
+ }
15
+
16
+ export interface CodeElement {
17
+ type: "function" | "class" | "method" | "interface" | "type";
18
+ name: string;
19
+ code: string;
20
+ startLine: number;
21
+ endLine: number;
22
+ hasExistingDoc: boolean;
23
+ language: "typescript" | "javascript" | "python";
24
+ }
25
+
26
+ export interface DocumentationResult {
27
+ element: CodeElement;
28
+ documentation: string;
29
+ updated: boolean;
30
+ }
@@ -11,7 +11,9 @@
11
11
  "build": "bun build src/index.ts --outdir dist --target node",
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
- "dependencies": {},
14
+ "dependencies": {
15
+ "glob": "^11.1.0"
16
+ },
15
17
  "devDependencies": {
16
18
  "@types/bun": "latest",
17
19
  "typescript": "^5.7.0"
@@ -0,0 +1,85 @@
1
+ import { parseArgs } from "util";
2
+ import { resolve } from "path";
3
+ import { DEFAULT_CATEGORIES } from "./env-data";
4
+ import type { GenerateOptions } from "./types";
5
+
6
+ export function parseGenerateOptions(): GenerateOptions {
7
+ const { values } = parseArgs({
8
+ args: process.argv.slice(2),
9
+ options: {
10
+ dir: { type: "string", default: process.cwd() },
11
+ include: { type: "string", default: "**/*.{ts,js,tsx,jsx}" },
12
+ exclude: { type: "string", default: "node_modules/**,dist/**,.next/**,build/**" },
13
+ output: { type: "string", default: process.cwd() },
14
+ envs: { type: "string", default: "example,local,development,production" },
15
+ prefix: { type: "string", default: ".env" },
16
+ "generate-secrets": { type: "boolean", default: false },
17
+ "secret-length": { type: "string", default: "32" },
18
+ "with-types": { type: "boolean", default: false },
19
+ "with-validation": { type: "boolean", default: false },
20
+ "template-only": { type: "boolean", default: false },
21
+ categories: { type: "string", default: DEFAULT_CATEGORIES.join(",") },
22
+ "auto-categorize": { type: "boolean", default: true },
23
+ format: { type: "string", default: "inline" },
24
+ "include-examples": { type: "boolean", default: true },
25
+ "security-warnings": { type: "boolean", default: true },
26
+ help: { type: "boolean", short: "h" },
27
+ },
28
+ allowPositionals: true,
29
+ });
30
+
31
+ if (values.help) {
32
+ console.log(`
33
+ Generate Env - Generate comprehensive .env templates
34
+
35
+ Usage:
36
+ skills run generate-env -- [options]
37
+
38
+ Options:
39
+ --dir <path> Project directory
40
+ --include <pattern> Glob pattern to include
41
+ --exclude <pattern> Glob pattern to exclude
42
+ --output <path> Output directory
43
+ --envs <list> Environments to generate (comma-separated)
44
+ --prefix <string> File prefix (default: .env)
45
+ --generate-secrets Generate random secrets
46
+ --secret-length <n> Length of generated secrets
47
+ --with-types Generate TypeScript types
48
+ --with-validation Generate Zod validation
49
+ --template-only Use template variables only
50
+ --categories <list> Custom categories
51
+ --auto-categorize Auto-categorize variables
52
+ --format <type> Output format: inline, block, minimal
53
+ --include-examples Include examples in comments
54
+ --security-warnings Include security warnings
55
+ --help, -h Show this help
56
+ `);
57
+ process.exit(0);
58
+ }
59
+
60
+ return {
61
+ dir: resolve(values.dir as string),
62
+ include: splitGlobList(values.include as string),
63
+ exclude: splitGlobList(values.exclude as string),
64
+ output: resolve(values.output as string),
65
+ envs: (values.envs as string).split(","),
66
+ prefix: values.prefix as string,
67
+ generateSecrets: values["generate-secrets"] as boolean,
68
+ secretLength: parseInt(values["secret-length"] as string, 10),
69
+ withTypes: values["with-types"] as boolean,
70
+ withValidation: values["with-validation"] as boolean,
71
+ templateOnly: values["template-only"] as boolean,
72
+ categories: (values.categories as string).split(","),
73
+ autoCategorize: values["auto-categorize"] as boolean,
74
+ format: values.format as "inline" | "block" | "minimal",
75
+ includeExamples: values["include-examples"] as boolean,
76
+ securityWarnings: values["security-warnings"] as boolean,
77
+ };
78
+ }
79
+
80
+ function splitGlobList(value: string): string[] {
81
+ if (value.includes("{") && value.includes("}")) {
82
+ return [value];
83
+ }
84
+ return value.split(",").map((item) => item.trim()).filter(Boolean);
85
+ }
@@ -0,0 +1,161 @@
1
+ import { readFileSync } from "fs";
2
+ import { glob } from "glob";
3
+ import { CATEGORY_PATTERNS, COMMON_VARIABLES, SENSITIVE_PATTERNS } from "./env-data";
4
+ import { log } from "./runtime";
5
+ import type { EnvVariable, GenerateOptions } from "./types";
6
+
7
+ // Variable Detection
8
+ // ============================================================================
9
+
10
+ /**
11
+ * Detect environment variables from codebase
12
+ */
13
+ export async function detectEnvVariables(options: GenerateOptions): Promise<EnvVariable[]> {
14
+ const { dir, include, exclude } = options;
15
+
16
+ log('Analyzing codebase for environment variables...');
17
+ log(`Scanning: ${include.join(', ')}`);
18
+
19
+ const files = await glob(include, {
20
+ cwd: dir,
21
+ ignore: exclude,
22
+ absolute: true,
23
+ });
24
+
25
+ log(`Found ${files.length} files to analyze`);
26
+
27
+ const envVars = new Map<string, EnvVariable>();
28
+
29
+ // Add common variables
30
+ COMMON_VARIABLES.forEach(v => envVars.set(v.name, v));
31
+
32
+ for (const file of files) {
33
+ try {
34
+ const content = readFileSync(file, 'utf-8');
35
+ const detected = extractEnvVarsFromCode(content);
36
+
37
+ detected.forEach(varName => {
38
+ if (!envVars.has(varName)) {
39
+ envVars.set(varName, {
40
+ name: varName,
41
+ category: options.autoCategorize ? categorizeVariable(varName) : 'misc',
42
+ description: generateDescription(varName),
43
+ required: true,
44
+ sensitive: isSensitive(varName),
45
+ example: generateExample(varName),
46
+ });
47
+ }
48
+ });
49
+ } catch (error) {
50
+ log(`Could not read file: ${file}`, "warn");
51
+ }
52
+ }
53
+
54
+ log(`Found ${envVars.size} environment variables`, "success");
55
+
56
+ return Array.from(envVars.values()).sort((a, b) => {
57
+ // Sort by category, then by name
58
+ if (a.category !== b.category) {
59
+ return a.category.localeCompare(b.category);
60
+ }
61
+ return a.name.localeCompare(b.name);
62
+ });
63
+ }
64
+
65
+ /**
66
+ * Extract environment variable names from code
67
+ */
68
+ export function extractEnvVarsFromCode(content: string): string[] {
69
+ const vars = new Set<string>();
70
+
71
+ // Pattern 1: process.env.VAR_NAME
72
+ const pattern1 = /process\.env\.([A-Z_][A-Z0-9_]*)/g;
73
+ let match;
74
+ while ((match = pattern1.exec(content)) !== null) {
75
+ vars.add(match[1]);
76
+ }
77
+
78
+ // Pattern 2: process.env['VAR_NAME'] or process.env["VAR_NAME"]
79
+ const pattern2 = /process\.env\[['"]([A-Z_][A-Z0-9_]*)['"]\]/g;
80
+ while ((match = pattern2.exec(content)) !== null) {
81
+ vars.add(match[1]);
82
+ }
83
+
84
+ // Pattern 3: Destructuring { VAR1, VAR2 } = process.env
85
+ const pattern3 = /\{\s*([A-Z_][A-Z0-9_,\s]*)\s*\}\s*=\s*process\.env/g;
86
+ while ((match = pattern3.exec(content)) !== null) {
87
+ const varNames = match[1].split(',').map(v => v.trim());
88
+ varNames.forEach(v => {
89
+ if (v && /^[A-Z_][A-Z0-9_]*$/.test(v)) {
90
+ vars.add(v);
91
+ }
92
+ });
93
+ }
94
+
95
+ // Pattern 4: import.meta.env.VAR_NAME (Vite)
96
+ const pattern4 = /import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g;
97
+ while ((match = pattern4.exec(content)) !== null) {
98
+ vars.add(match[1]);
99
+ }
100
+
101
+ return Array.from(vars);
102
+ }
103
+
104
+ /**
105
+ * Categorize a variable based on its name
106
+ */
107
+ export function categorizeVariable(varName: string): string {
108
+ for (const [category, patterns] of Object.entries(CATEGORY_PATTERNS)) {
109
+ if (patterns.some(pattern => pattern.test(varName))) {
110
+ return category;
111
+ }
112
+ }
113
+ return 'misc';
114
+ }
115
+
116
+ /**
117
+ * Check if variable is sensitive
118
+ */
119
+ export function isSensitive(varName: string): boolean {
120
+ return SENSITIVE_PATTERNS.some(pattern => pattern.test(varName));
121
+ }
122
+
123
+ /**
124
+ * Generate description for variable
125
+ */
126
+ export function generateDescription(varName: string): string {
127
+ // Convert SCREAMING_SNAKE_CASE to readable text
128
+ const words = varName.toLowerCase().split('_');
129
+ const readable = words
130
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
131
+ .join(' ');
132
+
133
+ // Add context based on patterns
134
+ if (/url$/i.test(varName)) return `${readable} connection URL`;
135
+ if (/key$/i.test(varName)) return `${readable} for authentication`;
136
+ if (/secret/i.test(varName)) return `${readable} for encryption`;
137
+ if (/token/i.test(varName)) return `${readable} for authorization`;
138
+ if (/host/i.test(varName)) return `${readable} hostname`;
139
+ if (/port/i.test(varName)) return `${readable} port number`;
140
+
141
+ return readable;
142
+ }
143
+
144
+ /**
145
+ * Generate example value for variable
146
+ */
147
+ export function generateExample(varName: string): string {
148
+ if (/database.*url/i.test(varName)) return 'postgresql://user:password@localhost:5432/dbname';
149
+ if (/mongodb/i.test(varName)) return 'mongodb://localhost:27017/dbname';
150
+ if (/redis/i.test(varName)) return 'redis://localhost:6379';
151
+ if (/^port$/i.test(varName)) return '3000';
152
+ if (/^host$/i.test(varName)) return 'localhost';
153
+ if (/url$/i.test(varName)) return 'https://example.com';
154
+ if (/email/i.test(varName)) return 'admin@example.com';
155
+ if (/openai.*key/i.test(varName)) return 'sk-...';
156
+ if (/stripe.*publishable/i.test(varName)) return 'pk_test_...';
157
+ if (/stripe.*secret/i.test(varName)) return 'sk_test_...';
158
+ if (/next_public/i.test(varName)) return 'public-value';
159
+
160
+ return 'your-value-here';
161
+ }
@@ -0,0 +1,66 @@
1
+ import type { EnvVariable } from "./types";
2
+
3
+ export const DEFAULT_CATEGORIES = [
4
+ "database",
5
+ "auth",
6
+ "api",
7
+ "services",
8
+ "email",
9
+ "storage",
10
+ "monitoring",
11
+ "security",
12
+ "misc",
13
+ ];
14
+
15
+ export const SENSITIVE_PATTERNS = [
16
+ /secret/i,
17
+ /password/i,
18
+ /private.*key/i,
19
+ /api.*key/i,
20
+ /token/i,
21
+ /credential/i,
22
+ /auth/i,
23
+ ];
24
+
25
+ export const CATEGORY_PATTERNS: Record<string, RegExp[]> = {
26
+ database: [/database/i, /_db_/i, /postgres/i, /mongodb/i, /mysql/i, /redis/i, /_url$/i],
27
+ auth: [/auth/i, /jwt/i, /session/i, /token/i, /oauth/i, /saml/i],
28
+ api: [/api.*key/i, /^api_/i, /_api$/i],
29
+ services: [/stripe/i, /sendgrid/i, /twilio/i, /aws/i, /openai/i, /anthropic/i],
30
+ email: [/mail/i, /smtp/i, /sendgrid/i, /resend/i, /postmark/i],
31
+ storage: [/bucket/i, /storage/i, /s3/i, /cdn/i, /cloudinary/i],
32
+ monitoring: [/sentry/i, /analytics/i, /log/i, /datadog/i, /newrelic/i],
33
+ security: [/cors/i, /csp/i, /encryption/i, /cipher/i],
34
+ };
35
+
36
+ export const COMMON_VARIABLES: EnvVariable[] = [
37
+ {
38
+ name: "NODE_ENV",
39
+ category: "general",
40
+ description: "Node.js environment mode",
41
+ example: "development",
42
+ defaultValue: "development",
43
+ required: true,
44
+ sensitive: false,
45
+ validation: "z.enum(['development', 'production', 'test'])",
46
+ },
47
+ {
48
+ name: "PORT",
49
+ category: "general",
50
+ description: "Server port number",
51
+ example: "3000",
52
+ defaultValue: "3000",
53
+ required: false,
54
+ sensitive: false,
55
+ validation: "z.string().regex(/^\\d+$/).transform(Number)",
56
+ },
57
+ {
58
+ name: "HOST",
59
+ category: "general",
60
+ description: "Server host address",
61
+ example: "localhost",
62
+ defaultValue: "localhost",
63
+ required: false,
64
+ sensitive: false,
65
+ },
66
+ ];
@@ -0,0 +1,240 @@
1
+ import { randomBytes } from "crypto";
2
+ import type { EnvVariable, GenerateOptions } from "./types";
3
+
4
+ // Secret Generation
5
+ // ============================================================================
6
+
7
+ /**
8
+ * Generate a secure random secret
9
+ */
10
+ export function generateSecret(length: number = 32): string {
11
+ return randomBytes(Math.ceil(length / 2))
12
+ .toString('hex')
13
+ .slice(0, length);
14
+ }
15
+
16
+ // ============================================================================
17
+ // File Generation
18
+ // ============================================================================
19
+
20
+ /**
21
+ * Generate .env file content
22
+ */
23
+ export function generateEnvFile(
24
+ variables: EnvVariable[],
25
+ environment: string,
26
+ options: GenerateOptions
27
+ ): string {
28
+ const lines: string[] = [];
29
+
30
+ // Header
31
+ if (environment === 'example') {
32
+ lines.push('# Environment Configuration Template');
33
+ lines.push('# Copy this file to .env.local and fill in the values');
34
+ } else {
35
+ lines.push(`# ${environment.charAt(0).toUpperCase() + environment.slice(1)} Environment Configuration`);
36
+ }
37
+ lines.push(`# Generated: ${new Date().toISOString()}`);
38
+ lines.push('');
39
+
40
+ // Group by category
41
+ const categories = new Map<string, EnvVariable[]>();
42
+ variables.forEach(v => {
43
+ const cat = v.category;
44
+ if (!categories.has(cat)) categories.set(cat, []);
45
+ categories.get(cat)!.push(v);
46
+ });
47
+
48
+ // Generate sections
49
+ for (const [category, vars] of categories) {
50
+ lines.push('# ' + '='.repeat(77));
51
+ lines.push(`# ${category.toUpperCase()}`);
52
+ lines.push('# ' + '='.repeat(77));
53
+ lines.push('');
54
+
55
+ for (const envVar of vars) {
56
+ // Add description
57
+ if (options.format !== 'minimal') {
58
+ lines.push(`# ${envVar.description}`);
59
+
60
+ if (options.includeExamples && envVar.example) {
61
+ lines.push(`# Example: ${envVar.example}`);
62
+ }
63
+
64
+ if (options.securityWarnings && envVar.sensitive) {
65
+ lines.push('# ⚠️ SECURITY WARNING: This is a sensitive credential');
66
+ lines.push('# - Never commit this to version control');
67
+ lines.push('# - Use a strong, randomly generated value');
68
+ lines.push('# - Store securely (e.g., password manager, secrets vault)');
69
+ }
70
+ }
71
+
72
+ // Generate value
73
+ let value = '';
74
+ if (environment === 'example') {
75
+ value = envVar.example || 'your-value-here';
76
+ } else if (options.generateSecrets && envVar.sensitive && !envVar.example?.includes('sk-')) {
77
+ value = generateSecret(options.secretLength);
78
+ } else {
79
+ value = envVar.defaultValue || envVar.example || '';
80
+ }
81
+
82
+ // Add variable
83
+ if (environment === 'example' || !value) {
84
+ lines.push(`${envVar.name}="${value}"`);
85
+ } else {
86
+ lines.push(`${envVar.name}="${value}"`);
87
+ }
88
+
89
+ lines.push('');
90
+ }
91
+
92
+ lines.push('');
93
+ }
94
+
95
+ return lines.join('\n');
96
+ }
97
+
98
+ /**
99
+ * Generate TypeScript type definitions
100
+ */
101
+ export function generateTypeDefs(variables: EnvVariable[]): string {
102
+ const lines: string[] = [];
103
+
104
+ lines.push('/**');
105
+ lines.push(' * Environment Variables Type Definitions');
106
+ lines.push(' * Generated by generate-env skill');
107
+ lines.push(' */');
108
+ lines.push('');
109
+ lines.push('declare global {');
110
+ lines.push(' namespace NodeJS {');
111
+ lines.push(' interface ProcessEnv {');
112
+
113
+ // Group by category
114
+ const categories = new Map<string, EnvVariable[]>();
115
+ variables.forEach(v => {
116
+ const cat = v.category;
117
+ if (!categories.has(cat)) categories.set(cat, []);
118
+ categories.get(cat)!.push(v);
119
+ });
120
+
121
+ for (const [category, vars] of categories) {
122
+ lines.push(` // ${category.charAt(0).toUpperCase() + category.slice(1)}`);
123
+
124
+ for (const envVar of vars) {
125
+ let type = 'string';
126
+ if (envVar.name === 'NODE_ENV') {
127
+ type = "'development' | 'production' | 'test'";
128
+ } else if (envVar.name === 'PORT') {
129
+ type = 'string';
130
+ }
131
+
132
+ const optional = envVar.required ? '' : '?';
133
+ lines.push(` ${envVar.name}${optional}: ${type};`);
134
+ }
135
+
136
+ lines.push('');
137
+ }
138
+
139
+ lines.push(' }');
140
+ lines.push(' }');
141
+ lines.push('}');
142
+ lines.push('');
143
+ lines.push('export {};');
144
+
145
+ return lines.join('\n');
146
+ }
147
+
148
+ /**
149
+ * Generate Zod validation schema
150
+ */
151
+ export function generateValidation(variables: EnvVariable[]): string {
152
+ const lines: string[] = [];
153
+
154
+ lines.push("import { z } from 'zod';");
155
+ lines.push('');
156
+ lines.push('/**');
157
+ lines.push(' * Environment Variables Validation Schema');
158
+ lines.push(' * Generated by generate-env skill');
159
+ lines.push(' */');
160
+ lines.push('');
161
+ lines.push('export const envSchema = z.object({');
162
+
163
+ // Group by category
164
+ const categories = new Map<string, EnvVariable[]>();
165
+ variables.forEach(v => {
166
+ const cat = v.category;
167
+ if (!categories.has(cat)) categories.set(cat, []);
168
+ categories.get(cat)!.push(v);
169
+ });
170
+
171
+ for (const [category, vars] of categories) {
172
+ lines.push(` // ${category.charAt(0).toUpperCase() + category.slice(1)}`);
173
+
174
+ for (const envVar of vars) {
175
+ let validation = envVar.validation || 'z.string()';
176
+
177
+ // Add specific validations
178
+ if (envVar.name.endsWith('_URL')) {
179
+ validation = 'z.string().url()';
180
+ } else if (envVar.name.endsWith('_EMAIL')) {
181
+ validation = 'z.string().email()';
182
+ } else if (envVar.sensitive && !envVar.validation) {
183
+ validation = 'z.string().min(1)';
184
+ }
185
+
186
+ if (!envVar.required) {
187
+ validation += '.optional()';
188
+ }
189
+
190
+ lines.push(` ${envVar.name}: ${validation},`);
191
+ }
192
+
193
+ lines.push('');
194
+ }
195
+
196
+ lines.push('});');
197
+ lines.push('');
198
+ lines.push('export type Env = z.infer<typeof envSchema>;');
199
+ lines.push('');
200
+ lines.push('/**');
201
+ lines.push(' * Validate environment variables at runtime');
202
+ lines.push(' */');
203
+ lines.push('export function validateEnv(): Env {');
204
+ lines.push(' const parsed = envSchema.safeParse(process.env);');
205
+ lines.push('');
206
+ lines.push(' if (!parsed.success) {');
207
+ lines.push(" console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);");
208
+ lines.push(" throw new Error('Invalid environment variables');");
209
+ lines.push(' }');
210
+ lines.push('');
211
+ lines.push(' return parsed.data;');
212
+ lines.push('}');
213
+
214
+ return lines.join('\n');
215
+ }
216
+
217
+ /**
218
+ * Generate metadata file
219
+ */
220
+ export function generateMetadata(variables: EnvVariable[], options: GenerateOptions): string {
221
+ return JSON.stringify({
222
+ generatedAt: new Date().toISOString(),
223
+ totalVariables: variables.length,
224
+ categories: Array.from(new Set(variables.map(v => v.category))).sort(),
225
+ sensitiveCount: variables.filter(v => v.sensitive).length,
226
+ requiredCount: variables.filter(v => v.required).length,
227
+ options: {
228
+ templateOnly: options.templateOnly,
229
+ generateSecrets: options.generateSecrets,
230
+ withTypes: options.withTypes,
231
+ withValidation: options.withValidation,
232
+ },
233
+ variables: variables.map(v => ({
234
+ name: v.name,
235
+ category: v.category,
236
+ required: v.required,
237
+ sensitive: v.sensitive,
238
+ })),
239
+ }, null, 2);
240
+ }