@hasna/skills 0.1.26 → 0.1.29

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