@hasna/skills 0.1.26 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/LICENSE +1 -10
  2. package/README.md +141 -39
  3. package/bin/index.js +30122 -27575
  4. package/bin/mcp.js +22112 -18593
  5. package/dist/cli/cli.test-utils.d.ts +15 -0
  6. package/dist/cli/commands/auth.d.ts +2 -0
  7. package/dist/cli/commands/install.d.ts +1 -1
  8. package/dist/cli/commands/runtime-mcp.d.ts +4 -0
  9. package/dist/index.d.ts +9 -4
  10. package/dist/index.js +11607 -597
  11. package/dist/lib/auth-store.d.ts +13 -0
  12. package/dist/lib/installer.d.ts +58 -55
  13. package/dist/lib/mcp-contracts.d.ts +86 -0
  14. package/dist/lib/project-state.d.ts +43 -0
  15. package/dist/lib/registry-data/business-marketing.d.ts +2 -0
  16. package/dist/lib/registry-data/communication.d.ts +2 -0
  17. package/dist/lib/registry-data/content-generation.d.ts +2 -0
  18. package/dist/lib/registry-data/data-analysis.d.ts +2 -0
  19. package/dist/lib/registry-data/design-branding.d.ts +2 -0
  20. package/dist/lib/registry-data/development-tools.d.ts +2 -0
  21. package/dist/lib/registry-data/education-learning.d.ts +2 -0
  22. package/dist/lib/registry-data/event-management.d.ts +2 -0
  23. package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
  24. package/dist/lib/registry-data/health-wellness.d.ts +2 -0
  25. package/dist/lib/registry-data/index.d.ts +2 -0
  26. package/dist/lib/registry-data/media-processing.d.ts +2 -0
  27. package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
  28. package/dist/lib/registry-data/project-management.d.ts +2 -0
  29. package/dist/lib/registry-data/research-writing.d.ts +2 -0
  30. package/dist/lib/registry-data/science-academic.d.ts +2 -0
  31. package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
  32. package/dist/lib/registry-data/web-browser.d.ts +2 -0
  33. package/dist/lib/registry-types.d.ts +27 -0
  34. package/dist/lib/registry.d.ts +6 -18
  35. package/dist/lib/remote-registry.d.ts +3 -0
  36. package/dist/lib/run-state.d.ts +60 -0
  37. package/dist/lib/skill-aliases.d.ts +17 -0
  38. package/dist/lib/skillinfo.d.ts +5 -1
  39. package/dist/mcp/discovery-tools.d.ts +2 -0
  40. package/dist/mcp/helpers.d.ts +26 -0
  41. package/dist/mcp/http.d.ts +10 -0
  42. package/dist/mcp/index.d.ts +3 -2
  43. package/dist/mcp/operation-tools.d.ts +2 -0
  44. package/dist/mcp/resource-meta-tools.d.ts +2 -0
  45. package/dist/mcp/schedule-tools.d.ts +2 -0
  46. package/dist/mcp/server.d.ts +4 -0
  47. package/dist/types/api.d.ts +7 -4
  48. package/package.json +23 -10
  49. package/skills/_common/http-client.ts +1 -1
  50. package/skills/_common/index.ts +2 -3
  51. package/skills/_common/install.sh +5 -110
  52. package/skills/_common/installer.ts +31 -282
  53. package/skills/_common/skill-install.ts +14 -181
  54. package/skills/ad-creative-pack/SKILL.md +45 -0
  55. package/skills/ad-creative-pack/package.json +14 -0
  56. package/skills/advanced-math/package.json +3 -1
  57. package/skills/advanced-math/src/calculators.ts +118 -0
  58. package/skills/advanced-math/src/cli.ts +130 -0
  59. package/skills/advanced-math/src/conversion.ts +90 -0
  60. package/skills/advanced-math/src/finance.ts +75 -0
  61. package/skills/advanced-math/src/formatting.ts +95 -0
  62. package/skills/advanced-math/src/index.ts +24 -702
  63. package/skills/advanced-math/src/runtime.ts +49 -0
  64. package/skills/advanced-math/src/symbolic.ts +110 -0
  65. package/skills/advanced-math/src/types.ts +36 -0
  66. package/skills/analyze-data/SKILL.md +2 -2
  67. package/skills/analyze-data/src/analysis.ts +401 -0
  68. package/skills/analyze-data/src/cli.ts +66 -0
  69. package/skills/analyze-data/src/formatters.ts +235 -0
  70. package/skills/analyze-data/src/index.ts +6 -1027
  71. package/skills/analyze-data/src/logger.ts +36 -0
  72. package/skills/analyze-data/src/parsers.ts +57 -0
  73. package/skills/analyze-data/src/stats.ts +151 -0
  74. package/skills/analyze-data/src/types.ts +85 -0
  75. package/skills/api-docs-portal/SKILL.md +46 -0
  76. package/skills/api-docs-portal/package.json +9 -0
  77. package/skills/api-test-suite/src/index.ts +13 -0
  78. package/skills/apidocs/package.json +1 -1
  79. package/skills/apidocs/src/index.ts +3 -0
  80. package/skills/audio/package.json +2 -3
  81. package/skills/audio-cleanup-lab/SKILL.md +2 -2
  82. package/skills/audio-extract/CLAUDE.md +1 -1
  83. package/skills/audio-transcript-pack/SKILL.md +43 -0
  84. package/skills/audio-transcript-pack/package.json +10 -0
  85. package/skills/blog-article/CLAUDE.md +12 -0
  86. package/skills/blog-article/SKILL.md +45 -0
  87. package/skills/{create-blog-article → blog-article}/package.json +3 -3
  88. package/skills/brand-kit/SKILL.md +45 -0
  89. package/skills/brand-kit/package.json +14 -0
  90. package/skills/brand-photo-shoot/SKILL.md +28 -0
  91. package/skills/brand-photo-shoot/package.json +10 -0
  92. package/skills/brand-style-guide/SKILL.md +2 -2
  93. package/skills/brand-style-guide/src/index.ts +0 -0
  94. package/skills/budget-variance-analyzer/SKILL.md +2 -2
  95. package/skills/businessactivity/package.json +1 -1
  96. package/skills/businessactivity/src/index.ts +3 -0
  97. package/skills/calendar-events/src/ai-parser.ts +103 -0
  98. package/skills/calendar-events/src/api.ts +157 -0
  99. package/skills/calendar-events/src/auth.ts +22 -0
  100. package/skills/calendar-events/src/config.ts +6 -0
  101. package/skills/calendar-events/src/format.ts +96 -0
  102. package/skills/calendar-events/src/help.ts +54 -0
  103. package/skills/calendar-events/src/index.ts +21 -524
  104. package/skills/calendar-events/src/logger.ts +34 -0
  105. package/skills/calendar-events/src/types.ts +67 -0
  106. package/skills/compress-video/SKILL.md +2 -2
  107. package/skills/consolelog/package.json +1 -1
  108. package/skills/consolelog/src/index.ts +3 -0
  109. package/skills/contract-review-report/SKILL.md +43 -0
  110. package/skills/contract-review-report/package.json +10 -0
  111. package/skills/convert/SKILL.md +2 -3
  112. package/skills/customer-feedback-report/SKILL.md +44 -0
  113. package/skills/customer-feedback-report/package.json +10 -0
  114. package/skills/dashboard-builder/package.json +3 -1
  115. package/skills/database-explorer/package.json +3 -1
  116. package/skills/deepresearch/README.md +4 -13
  117. package/skills/deploy/src/http-client.ts +1 -1
  118. package/skills/diff-viewer/package.json +4 -1
  119. package/skills/doc-generate/package.json +0 -1
  120. package/skills/doc-generate/src/ai.ts +50 -0
  121. package/skills/doc-generate/src/cli.ts +203 -0
  122. package/skills/doc-generate/src/dependencies.ts +44 -0
  123. package/skills/doc-generate/src/document-builder.ts +299 -0
  124. package/skills/doc-generate/src/index.ts +40 -764
  125. package/skills/doc-generate/src/markdown-parser.ts +125 -0
  126. package/skills/doc-generate/src/types.ts +68 -0
  127. package/skills/domainpurchase/SKILL.md +1 -1
  128. package/skills/domainpurchase/package.json +1 -1
  129. package/skills/domainpurchase/src/index.ts +3 -0
  130. package/skills/domainsearch/SKILL.md +1 -1
  131. package/skills/domainsearch/package.json +1 -1
  132. package/skills/domainsearch/src/index.ts +3 -0
  133. package/skills/email-sequence/SKILL.md +44 -0
  134. package/skills/email-sequence/package.json +14 -0
  135. package/skills/excel/CLAUDE.md +2 -2
  136. package/skills/experiment-power-calculator/package.json +3 -1
  137. package/skills/extract-invoice/src/cli.ts +97 -0
  138. package/skills/extract-invoice/src/extractor.ts +170 -0
  139. package/skills/extract-invoice/src/file-utils.ts +46 -0
  140. package/skills/extract-invoice/src/formatters.ts +144 -0
  141. package/skills/extract-invoice/src/index.ts +44 -629
  142. package/skills/extract-invoice/src/runtime.ts +46 -0
  143. package/skills/extract-invoice/src/types.ts +88 -0
  144. package/skills/folder-tree/package.json +3 -1
  145. package/skills/form-filler/package.json +3 -1
  146. package/skills/generate-api-client/package.json +3 -1
  147. package/skills/generate-api-client/src/generator.ts +47 -0
  148. package/skills/generate-api-client/src/index.ts +3 -777
  149. package/skills/generate-api-client/src/logger.ts +34 -0
  150. package/skills/generate-api-client/src/python-generator.ts +245 -0
  151. package/skills/generate-api-client/src/spec-loader.ts +48 -0
  152. package/skills/generate-api-client/src/type-mappers.ts +79 -0
  153. package/skills/generate-api-client/src/types.ts +76 -0
  154. package/skills/generate-api-client/src/typescript-generator.ts +247 -0
  155. package/skills/generate-book-cover/package.json +3 -1
  156. package/skills/generate-dockerfile/src/cli.ts +78 -0
  157. package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
  158. package/skills/generate-dockerfile/src/index.ts +12 -790
  159. package/skills/generate-dockerfile/src/logger.ts +30 -0
  160. package/skills/generate-dockerfile/src/project-detection.ts +68 -0
  161. package/skills/generate-dockerfile/src/support-files.ts +171 -0
  162. package/skills/generate-dockerfile/src/types.ts +29 -0
  163. package/skills/generate-documentation/src/ai.ts +131 -0
  164. package/skills/generate-documentation/src/cli.ts +71 -0
  165. package/skills/generate-documentation/src/code-parser.ts +300 -0
  166. package/skills/generate-documentation/src/file-processing.ts +182 -0
  167. package/skills/generate-documentation/src/index.ts +13 -753
  168. package/skills/generate-documentation/src/runtime.ts +35 -0
  169. package/skills/generate-documentation/src/types.ts +30 -0
  170. package/skills/generate-env/package.json +3 -1
  171. package/skills/generate-env/src/cli.ts +85 -0
  172. package/skills/generate-env/src/detection.ts +161 -0
  173. package/skills/generate-env/src/env-data.ts +66 -0
  174. package/skills/generate-env/src/generators.ts +240 -0
  175. package/skills/generate-env/src/index.ts +76 -676
  176. package/skills/generate-env/src/runtime.ts +30 -0
  177. package/skills/generate-env/src/types.ts +32 -0
  178. package/skills/generate-favicon/package.json +3 -1
  179. package/skills/generate-mock-data/package.json +3 -1
  180. package/skills/generate-mock-data/src/ai.ts +102 -0
  181. package/skills/generate-mock-data/src/formatters.ts +84 -0
  182. package/skills/generate-mock-data/src/generator.ts +377 -0
  183. package/skills/generate-mock-data/src/index.ts +15 -716
  184. package/skills/generate-mock-data/src/logger.ts +37 -0
  185. package/skills/generate-mock-data/src/presets.ts +110 -0
  186. package/skills/generate-mock-data/src/types.ts +21 -0
  187. package/skills/generate-pr-description/src/ai.ts +144 -0
  188. package/skills/generate-pr-description/src/cli.ts +80 -0
  189. package/skills/generate-pr-description/src/clipboard.ts +30 -0
  190. package/skills/generate-pr-description/src/formatters.ts +231 -0
  191. package/skills/generate-pr-description/src/git.ts +153 -0
  192. package/skills/generate-pr-description/src/index.ts +21 -714
  193. package/skills/generate-pr-description/src/types.ts +49 -0
  194. package/skills/generate-presentation/src/ai-clients.ts +61 -0
  195. package/skills/generate-presentation/src/cli.ts +126 -0
  196. package/skills/generate-presentation/src/index.ts +3 -751
  197. package/skills/generate-presentation/src/logger.ts +67 -0
  198. package/skills/generate-presentation/src/presentation-generator.ts +425 -0
  199. package/skills/generate-presentation/src/runtime.ts +6 -0
  200. package/skills/generate-presentation/src/security.ts +12 -0
  201. package/skills/generate-presentation/src/types.ts +28 -0
  202. package/skills/generate-qrcode/package.json +4 -1
  203. package/skills/generate-regex/package.json +3 -1
  204. package/skills/generate-resume/src/cli.ts +157 -0
  205. package/skills/generate-resume/src/index.ts +13 -917
  206. package/skills/generate-resume/src/parsers.ts +95 -0
  207. package/skills/generate-resume/src/renderers.ts +538 -0
  208. package/skills/generate-resume/src/security.ts +39 -0
  209. package/skills/generate-resume/src/types.ts +86 -0
  210. package/skills/generate-social-posts/src/ai.ts +88 -0
  211. package/skills/generate-social-posts/src/cli.ts +118 -0
  212. package/skills/generate-social-posts/src/exporters.ts +126 -0
  213. package/skills/generate-social-posts/src/generator.ts +130 -0
  214. package/skills/generate-social-posts/src/index.ts +19 -709
  215. package/skills/generate-social-posts/src/platforms.ts +39 -0
  216. package/skills/generate-social-posts/src/runtime.ts +34 -0
  217. package/skills/generate-social-posts/src/source.ts +116 -0
  218. package/skills/generate-social-posts/src/types.ts +58 -0
  219. package/skills/gif-maker/package.json +4 -1
  220. package/skills/github-manager/package.json +3 -1
  221. package/skills/gmail/CLAUDE.md +1 -1
  222. package/skills/highlight-reel-generator/src/index.ts +19 -0
  223. package/skills/hook/src/commands/create.ts +20 -845
  224. package/skills/hook/src/templates/root.ts +196 -0
  225. package/skills/hook/src/templates/source.ts +647 -0
  226. package/skills/http-server/package.json +3 -1
  227. package/skills/icon-pack/README.md +28 -0
  228. package/skills/icon-pack/SKILL.md +23 -0
  229. package/skills/icon-pack/package.json +29 -0
  230. package/skills/{audio → icon-pack}/tsconfig.json +10 -12
  231. package/skills/image/package.json +1 -2
  232. package/skills/implementation-agent/package.json +3 -1
  233. package/skills/implementation-agent/src/ai-generation.ts +225 -0
  234. package/skills/implementation-agent/src/index.ts +3 -960
  235. package/skills/implementation-agent/src/minimist.d.ts +15 -0
  236. package/skills/implementation-agent/src/templates.ts +686 -0
  237. package/skills/implementation-agent/src/types.ts +53 -0
  238. package/skills/implementation-plan/package.json +3 -1
  239. package/skills/implementation-todo/package.json +3 -1
  240. package/skills/invoice/package.json +1 -1
  241. package/skills/invoice/src/index.ts +3 -0
  242. package/skills/invoice-reconciliation/SKILL.md +42 -0
  243. package/skills/invoice-reconciliation/package.json +10 -0
  244. package/skills/landing-page-pack/SKILL.md +47 -0
  245. package/skills/landing-page-pack/package.json +14 -0
  246. package/skills/latex-table-generator/package.json +3 -1
  247. package/skills/logo-design/SKILL.md +25 -44
  248. package/skills/logo-design/package.json +3 -15
  249. package/skills/lorem-generator/package.json +3 -1
  250. package/skills/lorem-generator/src/index.ts +13 -0
  251. package/skills/managehook/package.json +1 -1
  252. package/skills/managehook/src/index.ts +3 -0
  253. package/skills/managemcp/package.json +1 -1
  254. package/skills/managemcp/src/index.ts +3 -0
  255. package/skills/manageskill/package.json +1 -1
  256. package/skills/manageskill/src/index.ts +3 -0
  257. package/skills/markdown-validator/package.json +3 -1
  258. package/skills/markdown-validator/src/index.ts +1 -4
  259. package/skills/market-research-report/SKILL.md +41 -0
  260. package/skills/market-research-report/package.json +10 -0
  261. package/skills/mcp-builder/package.json +4 -1
  262. package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
  263. package/skills/mcp-builder/src/generators.ts +513 -0
  264. package/skills/mcp-builder/src/index.ts +7 -908
  265. package/skills/mcp-builder/src/minimist.d.ts +15 -0
  266. package/skills/mcp-builder/src/naming.ts +12 -0
  267. package/skills/mcp-builder/src/options.ts +170 -0
  268. package/skills/mcp-builder/src/templates.ts +149 -0
  269. package/skills/mcp-builder/src/types.ts +42 -0
  270. package/skills/meeting-pack/SKILL.md +43 -0
  271. package/skills/meeting-pack/package.json +10 -0
  272. package/skills/merge-pdfs/package.json +5 -1
  273. package/skills/migration-plan-pack/SKILL.md +45 -0
  274. package/skills/migration-plan-pack/package.json +10 -0
  275. package/skills/music/package.json +2 -3
  276. package/skills/music-album/SKILL.md +37 -0
  277. package/skills/music-album/package.json +10 -0
  278. package/skills/notion-manager/package.json +3 -1
  279. package/skills/npmpublish/CLAUDE.md +5 -8
  280. package/skills/npmpublish/README.md +5 -26
  281. package/skills/npmpublish/src/index.ts +9 -147
  282. package/skills/one-page-website/SKILL.md +46 -0
  283. package/skills/one-page-website/package.json +10 -0
  284. package/skills/one-page-website/tsconfig.json +8 -0
  285. package/skills/pdf-generate/src/cli.ts +162 -0
  286. package/skills/pdf-generate/src/html.ts +84 -0
  287. package/skills/pdf-generate/src/index.ts +11 -800
  288. package/skills/pdf-generate/src/markdown.ts +27 -0
  289. package/skills/pdf-generate/src/pdf-writer.ts +78 -0
  290. package/skills/pdf-generate/src/runtime.ts +34 -0
  291. package/skills/pdf-generate/src/security.ts +37 -0
  292. package/skills/pdf-generate/src/templates.ts +311 -0
  293. package/skills/pdf-generate/src/types.ts +28 -0
  294. package/skills/pdf-read/SKILL.md +10 -10
  295. package/skills/pdf-to-dataset/SKILL.md +45 -0
  296. package/skills/pdf-to-dataset/package.json +10 -0
  297. package/skills/pdf-to-markdown/SKILL.md +49 -0
  298. package/skills/pdf-to-markdown/package.json +10 -0
  299. package/skills/pdf-to-markdown/tsconfig.json +10 -0
  300. package/skills/performance-audit-report/SKILL.md +42 -0
  301. package/skills/performance-audit-report/package.json +10 -0
  302. package/skills/persona-based-adwriter/src/index.ts +19 -0
  303. package/skills/photo-album/SKILL.md +29 -0
  304. package/skills/photo-album/package.json +9 -0
  305. package/skills/photo-album/tsconfig.json +4 -0
  306. package/skills/pitch-deck/SKILL.md +43 -0
  307. package/skills/pitch-deck/package.json +9 -0
  308. package/skills/playlist-maker/SKILL.md +33 -0
  309. package/skills/playlist-maker/package.json +9 -0
  310. package/skills/playlist-maker/tsconfig.json +4 -0
  311. package/skills/product-mockup/SKILL.md +45 -0
  312. package/skills/product-mockup/package.json +3 -20
  313. package/skills/product-mockup/tsconfig.json +3 -5
  314. package/skills/project-retro-companion/src/index.ts +19 -0
  315. package/skills/proposal-pack/SKILL.md +45 -0
  316. package/skills/proposal-pack/package.json +10 -0
  317. package/skills/read-pdf/SKILL.md +5 -4
  318. package/skills/repo-onboarding-report/SKILL.md +42 -0
  319. package/skills/repo-onboarding-report/package.json +10 -0
  320. package/skills/sales-call-recapper/src/index.ts +20 -0
  321. package/skills/salescopy/package.json +1 -1
  322. package/skills/salescopy/src/index.ts +3 -0
  323. package/skills/scaffold-project/src/ai-detect.ts +136 -0
  324. package/skills/scaffold-project/src/file-generators.ts +292 -0
  325. package/skills/scaffold-project/src/index.ts +8 -991
  326. package/skills/scaffold-project/src/project-config.ts +338 -0
  327. package/skills/scaffold-project/src/templates.ts +173 -0
  328. package/skills/scaffold-project/src/types.ts +58 -0
  329. package/skills/scientific-figure-check/package.json +3 -1
  330. package/skills/sdk-generator/SKILL.md +45 -0
  331. package/skills/sdk-generator/package.json +10 -0
  332. package/skills/sdk-generator/tsconfig.json +8 -0
  333. package/skills/security-audit/src/index.ts +25 -6
  334. package/skills/security-audit-report/SKILL.md +40 -0
  335. package/skills/security-audit-report/package.json +10 -0
  336. package/skills/seo-content-pack/SKILL.md +44 -0
  337. package/skills/seo-content-pack/package.json +9 -0
  338. package/skills/short-video-pack/SKILL.md +30 -0
  339. package/skills/short-video-pack/package.json +10 -0
  340. package/skills/slack-assistant/package.json +3 -1
  341. package/skills/slide-deck-generator/SKILL.md +44 -0
  342. package/skills/slide-deck-generator/package.json +10 -0
  343. package/skills/sms/package.json +1 -1
  344. package/skills/sms/src/index.ts +15 -0
  345. package/skills/social-content-calendar/SKILL.md +45 -0
  346. package/skills/social-content-calendar/package.json +14 -0
  347. package/skills/split-pdf/package.json +4 -1
  348. package/skills/subtitle/package.json +2 -1
  349. package/skills/subtitle/src/index.ts +3 -0
  350. package/skills/terraform-generator/package.json +3 -1
  351. package/skills/test-suite-generator/SKILL.md +41 -0
  352. package/skills/test-suite-generator/package.json +10 -0
  353. package/skills/timesheet/package.json +1 -1
  354. package/skills/timesheet/src/index.ts +3 -0
  355. package/skills/transcript/SKILL.md +1 -8
  356. package/skills/validate-config/package.json +3 -1
  357. package/skills/video/package.json +6 -4
  358. package/skills/video-downloader/package.json +3 -1
  359. package/skills/video-highlight-pack/SKILL.md +44 -0
  360. package/skills/video-highlight-pack/package.json +10 -0
  361. package/skills/voiceover-jingle-pack/SKILL.md +28 -0
  362. package/skills/voiceover-jingle-pack/package.json +10 -0
  363. package/skills/watermark/package.json +6 -1
  364. package/skills/webcrawling/package.json +2 -1
  365. package/skills/write/SKILL.md +6 -6
  366. package/dist/server/serve.d.ts +0 -11
  367. package/skills/apidocs/.claude/settings.json +0 -5
  368. package/skills/audio/.env.example +0 -14
  369. package/skills/audio/QUICKSTART.md +0 -158
  370. package/skills/audio/README.md +0 -256
  371. package/skills/audio/src/index-local.ts +0 -206
  372. package/skills/audio/src/index.ts +0 -95
  373. package/skills/audio/src/providers/elevenlabs.ts +0 -115
  374. package/skills/audio/src/providers/google.ts +0 -116
  375. package/skills/audio/src/providers/minimax.ts +0 -83
  376. package/skills/audio/src/providers/openai.ts +0 -115
  377. package/skills/audio/src/types.ts +0 -79
  378. package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
  379. package/skills/audiobook-chapter-proofer/package.json +0 -27
  380. package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
  381. package/skills/browse/src/client.ts +0 -373
  382. package/skills/browse/src/index-local.ts +0 -430
  383. package/skills/browse/src/index.ts +0 -110
  384. package/skills/browse/src/sse-server.ts +0 -919
  385. package/skills/browse/src/types.ts +0 -104
  386. package/skills/consolelog/src/server/index.ts +0 -508
  387. package/skills/create-blog-article/CLAUDE.md +0 -19
  388. package/skills/create-blog-article/src/index.ts +0 -745
  389. package/skills/create-blog-article/tsconfig.json +0 -10
  390. package/skills/deepresearch/src/agents/query-generator.ts +0 -91
  391. package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
  392. package/skills/deepresearch/src/index.ts +0 -224
  393. package/skills/deepresearch/src/research.ts +0 -166
  394. package/skills/deepresearch/src/services/anthropic.ts +0 -69
  395. package/skills/deepresearch/src/services/exa.ts +0 -108
  396. package/skills/deepresearch/src/services/firecrawl.ts +0 -88
  397. package/skills/deepresearch/src/services/openai.ts +0 -81
  398. package/skills/deepresearch/src/types.ts +0 -76
  399. package/skills/deepresearch/src/utils/file.ts +0 -111
  400. package/skills/deepresearch/src/utils/logger.ts +0 -84
  401. package/skills/domainpurchase/src/server/index.ts +0 -332
  402. package/skills/domainsearch/src/server/index.ts +0 -229
  403. package/skills/e2bswarm/README.md +0 -135
  404. package/skills/e2bswarm/SKILL.md +0 -118
  405. package/skills/e2bswarm/examples/tasks-example.json +0 -38
  406. package/skills/e2bswarm/package.json +0 -59
  407. package/skills/e2bswarm/src/commands/collect.ts +0 -135
  408. package/skills/e2bswarm/src/commands/install.ts +0 -164
  409. package/skills/e2bswarm/src/commands/kill.ts +0 -62
  410. package/skills/e2bswarm/src/commands/spawn.ts +0 -134
  411. package/skills/e2bswarm/src/commands/status.ts +0 -90
  412. package/skills/e2bswarm/src/commands/sync.ts +0 -208
  413. package/skills/e2bswarm/src/index.ts +0 -121
  414. package/skills/e2bswarm/src/lib/config.ts +0 -75
  415. package/skills/e2bswarm/src/lib/e2b.ts +0 -490
  416. package/skills/e2bswarm/src/lib/github.ts +0 -253
  417. package/skills/e2bswarm/src/lib/logger.ts +0 -41
  418. package/skills/e2bswarm/src/lib/paths.ts +0 -75
  419. package/skills/e2bswarm/src/lib/tasks.ts +0 -320
  420. package/skills/e2bswarm/src/types/index.ts +0 -107
  421. package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
  422. package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
  423. package/skills/e2bswarm/templates/setup.sh +0 -21
  424. package/skills/e2bswarm/tsconfig.json +0 -19
  425. package/skills/generate-book-cover/src/index.ts +0 -694
  426. package/skills/image/src/index-local.ts +0 -206
  427. package/skills/image/src/index.ts +0 -96
  428. package/skills/image/src/providers/google.ts +0 -79
  429. package/skills/image/src/providers/minimax.ts +0 -94
  430. package/skills/image/src/providers/openai.ts +0 -80
  431. package/skills/image/src/providers/xai.ts +0 -73
  432. package/skills/image/src/types.ts +0 -37
  433. package/skills/logo-design/CLAUDE.md +0 -30
  434. package/skills/logo-design/src/index.ts +0 -322
  435. package/skills/managehook/src/server/index.ts +0 -108
  436. package/skills/managemcp/src/server/index.ts +0 -108
  437. package/skills/manageskill/src/server/index.ts +0 -108
  438. package/skills/music/CLAUDE.md +0 -9
  439. package/skills/music/src/index.ts +0 -94
  440. package/skills/music/tsconfig.json +0 -10
  441. package/skills/pdf-read/src/index.ts +0 -320
  442. package/skills/product-mockup/CLAUDE.md +0 -19
  443. package/skills/product-mockup/src/index.ts +0 -290
  444. package/skills/read-pdf/src/index.ts +0 -388
  445. package/skills/remove-background/src/index.ts +0 -405
  446. package/skills/scaffold-project/my-app/.env.example +0 -2
  447. package/skills/scaffold-project/my-app/README.md +0 -72
  448. package/skills/scaffold-project/my-app/package.json +0 -29
  449. package/skills/scaffold-project/my-app/src/index.ts +0 -23
  450. package/skills/scaffold-project/my-app/tsconfig.json +0 -33
  451. package/skills/sound-effects/SKILL.md +0 -34
  452. package/skills/sound-effects/package.json +0 -21
  453. package/skills/sound-effects/src/index.ts +0 -172
  454. package/skills/sound-effects/tsconfig.json +0 -8
  455. package/skills/transcript/src/chunker.ts +0 -215
  456. package/skills/transcript/src/formatter.ts +0 -134
  457. package/skills/transcript/src/index-local.ts +0 -226
  458. package/skills/transcript/src/index.ts +0 -110
  459. package/skills/transcript/src/providers/elevenlabs.ts +0 -133
  460. package/skills/transcript/src/providers/gemini.ts +0 -192
  461. package/skills/transcript/src/providers/index.ts +0 -54
  462. package/skills/transcript/src/providers/openai.ts +0 -203
  463. package/skills/transcript/src/types.ts +0 -106
  464. package/skills/video/.env.example +0 -14
  465. package/skills/video/EXAMPLES.md +0 -266
  466. package/skills/video/LICENSE +0 -192
  467. package/skills/video/README.md +0 -174
  468. package/skills/video/src/cli.ts +0 -155
  469. package/skills/video/src/index-local.ts +0 -148
  470. package/skills/video/src/index.ts +0 -96
  471. package/skills/video/src/providers/google-veo.ts +0 -126
  472. package/skills/video/src/providers/index.ts +0 -22
  473. package/skills/video/src/providers/minimax.ts +0 -100
  474. package/skills/video/src/providers/openai-sora.ts +0 -164
  475. package/skills/video/src/providers/runway.ts +0 -159
  476. package/skills/video/src/types.ts +0 -35
  477. package/skills/video/tsconfig.json +0 -22
  478. package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
  479. package/skills/voiceover-casting-assistant/package.json +0 -27
  480. package/skills/voiceover-casting-assistant/src/index.ts +0 -255
  481. package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
  482. package/skills/webcrawling/src/commands/config.ts +0 -34
  483. package/skills/webcrawling/src/commands/crawl.ts +0 -33
  484. package/skills/webcrawling/src/commands/scrape.ts +0 -32
  485. package/skills/webcrawling/src/commands/sessions.ts +0 -42
  486. package/skills/webcrawling/src/lib/crawler.ts +0 -174
  487. package/skills/webcrawling/src/lib/storage.ts +0 -130
  488. package/skills/webcrawling/src/types/index.ts +0 -45
  489. package/skills/webcrawling/src/utils/logger.ts +0 -30
  490. package/skills/webcrawling/src/utils/paths.ts +0 -28
  491. /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
@@ -7,926 +7,22 @@
7
7
  * multiple formats, and ATS-friendly designs.
8
8
  */
9
9
 
10
- import { parseArgs } from "node:util";
11
-
12
- // =============================================================================
13
- // Security: HTML Escaping to prevent XSS
14
- // =============================================================================
15
-
16
- /**
17
- * Escape HTML special characters to prevent XSS attacks
18
- * This MUST be called on all user-provided data before HTML interpolation
19
- */
20
- function escapeHtml(str: string | undefined | null): string {
21
- if (str === undefined || str === null) return "";
22
- return String(str)
23
- .replace(/&/g, "&")
24
- .replace(/</g, "&lt;")
25
- .replace(/>/g, "&gt;")
26
- .replace(/"/g, "&quot;")
27
- .replace(/'/g, "&#x27;");
28
- }
29
-
30
- /**
31
- * Sanitize a URL to prevent javascript: and data: URL injection
32
- * Only allows http:, https:, relative paths, and protocol-relative URLs
33
- */
34
- function sanitizeUrl(url: string | undefined | null): string {
35
- if (!url) return "";
36
- const trimmed = url.trim();
37
- const lowerUrl = trimmed.toLowerCase();
38
- // Block dangerous protocols
39
- if (
40
- lowerUrl.startsWith("javascript:") ||
41
- lowerUrl.startsWith("data:") ||
42
- lowerUrl.startsWith("vbscript:")
43
- ) {
44
- return "";
45
- }
46
- // Allow safe protocols and relative URLs
47
- if (
48
- lowerUrl.startsWith("http://") ||
49
- lowerUrl.startsWith("https://") ||
50
- lowerUrl.startsWith("mailto:") ||
51
- lowerUrl.startsWith("tel:") ||
52
- lowerUrl.startsWith("/") ||
53
- !lowerUrl.includes(":")
54
- ) {
55
- return escapeHtml(trimmed);
56
- }
57
- return "";
58
- }
59
- import { writeFile, mkdir, readFile } from "node:fs/promises";
10
+ import { writeFile, mkdir } from "node:fs/promises";
60
11
  import { join } from "node:path";
61
- import { existsSync } from "node:fs";
62
-
63
- // Types
64
- interface Experience {
65
- title: string;
66
- company: string;
67
- dates: string;
68
- description: string;
69
- }
70
-
71
- interface Education {
72
- degree: string;
73
- school: string;
74
- dates: string;
75
- details?: string;
76
- }
77
-
78
- interface Skill {
79
- name: string;
80
- level: number;
81
- }
82
-
83
- interface Project {
84
- name: string;
85
- description: string;
86
- url?: string;
87
- }
88
-
89
- interface Certification {
90
- name: string;
91
- year: string;
92
- issuer?: string;
93
- }
94
-
95
- interface Language {
96
- name: string;
97
- proficiency: string;
98
- }
99
-
100
- interface ResumeData {
101
- // Contact
102
- name: string;
103
- email?: string;
104
- phone?: string;
105
- location?: string;
106
- website?: string;
107
- linkedin?: string;
108
- github?: string;
109
- portfolio?: string;
110
- twitter?: string;
111
- photo?: string;
112
-
113
- // Professional
114
- title?: string;
115
- summary?: string;
116
-
117
- // Sections
118
- experience: Experience[];
119
- education: Education[];
120
- skills: Skill[];
121
- projects: Project[];
122
- certifications: Certification[];
123
- languages: Language[];
124
-
125
- // Design
126
- template: string;
127
- layout: string;
128
- color: string;
129
- font: string;
130
- fontSize: string;
131
- spacing: string;
132
- atsFriendly: boolean;
133
- includePhoto: boolean;
134
- pageNumbers: boolean;
135
- }
136
-
137
- interface CoverLetterData {
138
- name: string;
139
- email?: string;
140
- phone?: string;
141
- location?: string;
142
- company: string;
143
- position: string;
144
- content: string;
145
- template: string;
146
- date: string;
147
- }
148
-
149
- // Parse command line arguments
150
- function parseArguments() {
151
- const { values } = parseArgs({
152
- args: process.argv.slice(2),
153
- options: {
154
- // Contact
155
- name: { type: "string" },
156
- email: { type: "string" },
157
- phone: { type: "string" },
158
- location: { type: "string" },
159
- website: { type: "string" },
160
- linkedin: { type: "string" },
161
- github: { type: "string" },
162
- portfolio: { type: "string" },
163
- twitter: { type: "string" },
164
- photo: { type: "string" },
165
-
166
- // Professional
167
- title: { type: "string" },
168
- summary: { type: "string" },
169
-
170
- // Sections (repeatable)
171
- experience: { type: "string", multiple: true },
172
- education: { type: "string", multiple: true },
173
- skill: { type: "string", multiple: true },
174
- project: { type: "string", multiple: true },
175
- certification: { type: "string", multiple: true },
176
- language: { type: "string", multiple: true },
177
-
178
- // Design
179
- template: { type: "string", default: "modern" },
180
- layout: { type: "string", default: "single-column" },
181
- color: { type: "string", default: "#2563eb" },
182
- font: { type: "string", default: "inter" },
183
- "font-size": { type: "string", default: "medium" },
184
- spacing: { type: "string", default: "normal" },
185
- "ats-friendly": { type: "boolean", default: false },
186
- "include-photo": { type: "boolean", default: false },
187
- "page-numbers": { type: "boolean", default: false },
188
-
189
- // Output
190
- output: { type: "string" },
191
- format: { type: "string", default: "pdf" },
192
- open: { type: "boolean", default: false },
193
-
194
- // Cover letter
195
- "cover-letter": { type: "boolean", default: false },
196
- company: { type: "string" },
197
- position: { type: "string" },
198
- "letter-content": { type: "string" },
199
- "letter-template": { type: "string", default: "standard" },
200
-
201
- // LinkedIn import
202
- "from-linkedin": { type: "string" },
203
-
204
- // Help
205
- help: { type: "boolean" },
206
- },
207
- allowPositionals: true,
208
- });
209
-
210
- return values;
211
- }
212
12
 
213
- // Show help
214
- function showHelp() {
215
- console.log(`
216
- Generate Resume - Create professional resumes and CVs
217
-
218
- USAGE:
219
- skills run generate-resume -- [OPTIONS]
220
-
221
- REQUIRED:
222
- --name <name> Your full name
223
-
224
- CONTACT:
225
- --email <email> Email address
226
- --phone <phone> Phone number
227
- --location <location> City, State/Country
228
- --website <url> Personal website
229
- --linkedin <url> LinkedIn profile
230
- --github <url> GitHub profile
231
- --portfolio <url> Portfolio website
232
- --twitter <handle> Twitter/X handle
233
- --photo <path> Profile photo path
234
-
235
- PROFESSIONAL:
236
- --title <title> Professional title
237
- --summary <text> Professional summary
238
-
239
- EXPERIENCE (repeatable):
240
- --experience "Title|Company|Dates|Description"
241
-
242
- EDUCATION (repeatable):
243
- --education "Degree|School|Dates|Details"
244
-
245
- SKILLS (repeatable):
246
- --skill "SkillName|Level" Level: 1-5
247
-
248
- PROJECTS (repeatable):
249
- --project "Name|Description|URL"
250
-
251
- CERTIFICATIONS (repeatable):
252
- --certification "Name|Year|Issuer"
253
-
254
- LANGUAGES (repeatable):
255
- --language "Language|Proficiency"
256
-
257
- DESIGN:
258
- --template <type> modern|classic|minimal|creative|executive|technical
259
- --layout <type> single-column|two-column|sidebar
260
- --color <hex> Primary color (default: #2563eb)
261
- --font <name> inter|roboto|lato|open-sans|poppins
262
- --font-size <size> small|medium|large
263
- --spacing <size> compact|normal|spacious
264
- --ats-friendly Enable ATS optimization
265
- --include-photo Include profile photo
266
- --page-numbers Add page numbers
267
-
268
- OUTPUT:
269
- --output <path> Output file path
270
- --format <type> pdf|html|markdown
271
- --open Open after generation
272
-
273
- COVER LETTER:
274
- --cover-letter Generate cover letter
275
- --company <name> Company name
276
- --position <title> Position title
277
- --letter-content <text> Letter content
278
- --letter-template <type> standard|modern|executive
279
-
280
- LINKEDIN:
281
- --from-linkedin <path> Import from LinkedIn JSON
282
-
283
- EXAMPLES:
284
- # Basic resume
285
- skills run generate-resume -- \\
286
- --name "John Doe" \\
287
- --email "john@email.com" \\
288
- --title "Software Engineer"
289
-
290
- # Full resume
291
- skills run generate-resume -- \\
292
- --name "Jane Smith" \\
293
- --email "jane@email.com" \\
294
- --title "Senior Developer" \\
295
- --experience "Developer|Acme|2020-Present|Built features..." \\
296
- --education "BS CS|MIT|2016-2020|GPA: 3.8" \\
297
- --skill "JavaScript|5" \\
298
- --ats-friendly \\
299
- --output resume.pdf
300
- `);
301
- }
302
-
303
- // Parse repeatable fields
304
- function parseExperience(data: string[]): Experience[] {
305
- return data.map((item) => {
306
- const [title, company, dates, description] = item.split("|");
307
- return { title, company, dates, description };
308
- });
309
- }
310
-
311
- function parseEducation(data: string[]): Education[] {
312
- return data.map((item) => {
313
- const [degree, school, dates, details] = item.split("|");
314
- return { degree, school, dates, details };
315
- });
316
- }
317
-
318
- function parseSkills(data: string[]): Skill[] {
319
- return data.map((item) => {
320
- const [name, levelStr] = item.split("|");
321
- const level = parseInt(levelStr) || 3;
322
- return { name, level };
323
- });
324
- }
325
-
326
- function parseProjects(data: string[]): Project[] {
327
- return data.map((item) => {
328
- const [name, description, url] = item.split("|");
329
- return { name, description, url };
330
- });
331
- }
332
-
333
- function parseCertifications(data: string[]): Certification[] {
334
- return data.map((item) => {
335
- const [name, year, issuer] = item.split("|");
336
- return { name, year, issuer };
337
- });
338
- }
339
-
340
- function parseLanguages(data: string[]): Language[] {
341
- return data.map((item) => {
342
- const [name, proficiency] = item.split("|");
343
- return { name, proficiency };
344
- });
345
- }
346
-
347
- // Import from LinkedIn JSON
348
- async function importFromLinkedIn(filePath: string): Promise<Partial<ResumeData>> {
349
- try {
350
- const content = await readFile(filePath, "utf-8");
351
- const data = JSON.parse(content);
352
-
353
- // Parse LinkedIn profile data
354
- // Note: LinkedIn export format may vary, this is a simplified parser
355
- return {
356
- name: data.firstName && data.lastName ? `${data.firstName} ${data.lastName}` : undefined,
357
- title: data.headline,
358
- location: data.location?.name,
359
- summary: data.summary,
360
- experience: data.positions?.values?.map((pos: any) => ({
361
- title: pos.title,
362
- company: pos.company?.name,
363
- dates: `${pos.startDate?.month || ""}/${pos.startDate?.year || ""}-${
364
- pos.isCurrent ? "Present" : `${pos.endDate?.month || ""}/${pos.endDate?.year || ""}`
365
- }`,
366
- description: pos.summary || "",
367
- })) || [],
368
- education: data.educations?.values?.map((edu: any) => ({
369
- degree: edu.degree || edu.fieldOfStudy,
370
- school: edu.schoolName,
371
- dates: `${edu.startDate?.year || ""}-${edu.endDate?.year || ""}`,
372
- details: edu.notes,
373
- })) || [],
374
- skills: data.skills?.values?.map((skill: any, index: number) => ({
375
- name: skill.name,
376
- level: Math.min(5, Math.max(1, Math.floor(skill.endorsementCount / 10) + 3)),
377
- })) || [],
378
- certifications: data.certifications?.values?.map((cert: any) => ({
379
- name: cert.name,
380
- year: cert.startDate?.year?.toString() || "",
381
- issuer: cert.authority,
382
- })) || [],
383
- languages: data.languages?.values?.map((lang: any) => ({
384
- name: lang.name,
385
- proficiency: lang.proficiency?.name || "Professional",
386
- })) || [],
387
- };
388
- } catch (error) {
389
- console.error("Error parsing LinkedIn data:", error);
390
- return {};
391
- }
392
- }
393
-
394
- // Generate HTML resume
395
- function generateResumeHTML(data: ResumeData): string {
396
- const templateStyles = getTemplateStyles(data.template);
397
- const layoutStyles = getLayoutStyles(data.layout);
398
- const fontFamily = getFontFamily(data.font);
399
- const fontSizes = getFontSizes(data.fontSize);
400
- const spacingValue = getSpacingValue(data.spacing);
401
-
402
- return `<!DOCTYPE html>
403
- <html lang="en">
404
- <head>
405
- <meta charset="UTF-8">
406
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
407
- <title>${escapeHtml(data.name)} - Resume</title>
408
- <style>
409
- * {
410
- margin: 0;
411
- padding: 0;
412
- box-sizing: border-box;
413
- }
414
- body {
415
- font-family: ${fontFamily};
416
- line-height: 1.6;
417
- color: #333;
418
- background: #f5f5f5;
419
- padding: 20px;
420
- }
421
- .resume-container {
422
- max-width: 850px;
423
- margin: 0 auto;
424
- background: white;
425
- ${layoutStyles.container}
426
- ${data.atsFriendly ? "box-shadow: none;" : "box-shadow: 0 0 20px rgba(0,0,0,0.1);"}
427
- }
428
- .resume-header {
429
- ${templateStyles.header}
430
- padding: ${spacingValue * 1.5}px;
431
- ${!data.atsFriendly ? `border-bottom: 3px solid ${data.color};` : ""}
432
- text-align: ${layoutStyles.headerAlign};
433
- }
434
- ${data.includePhoto && data.photo ? `
435
- .profile-photo {
436
- width: 120px;
437
- height: 120px;
438
- border-radius: ${data.template === "classic" ? "0" : "50%"};
439
- object-fit: cover;
440
- margin: 0 auto 20px;
441
- ${!data.atsFriendly ? `border: 3px solid ${data.color};` : ""}
442
- }
443
- ` : ""}
444
- .name {
445
- font-size: ${fontSizes.name};
446
- font-weight: 700;
447
- color: ${data.atsFriendly ? "#333" : data.color};
448
- margin-bottom: 10px;
449
- }
450
- .title {
451
- font-size: ${fontSizes.title};
452
- color: #666;
453
- margin-bottom: 15px;
454
- font-weight: 400;
455
- }
456
- .contact-info {
457
- display: flex;
458
- ${layoutStyles.contactLayout}
459
- gap: 15px;
460
- font-size: ${fontSizes.contact};
461
- color: #666;
462
- margin-top: 10px;
463
- }
464
- .contact-item {
465
- display: inline-flex;
466
- align-items: center;
467
- gap: 5px;
468
- }
469
- .contact-item a {
470
- color: ${data.color};
471
- text-decoration: none;
472
- }
473
- .resume-body {
474
- ${layoutStyles.body}
475
- padding: ${spacingValue}px;
476
- }
477
- .section {
478
- margin-bottom: ${spacingValue * 1.5}px;
479
- }
480
- .section-title {
481
- font-size: ${fontSizes.sectionTitle};
482
- font-weight: 700;
483
- color: ${data.atsFriendly ? "#333" : data.color};
484
- margin-bottom: ${spacingValue * 0.5}px;
485
- ${!data.atsFriendly ? `border-bottom: 2px solid ${data.color}; padding-bottom: 5px;` : ""}
486
- text-transform: uppercase;
487
- letter-spacing: 1px;
488
- }
489
- .summary-text {
490
- font-size: ${fontSizes.body};
491
- line-height: 1.8;
492
- color: #555;
493
- }
494
- .entry {
495
- margin-bottom: ${spacingValue}px;
496
- }
497
- .entry-header {
498
- display: flex;
499
- justify-content: space-between;
500
- align-items: baseline;
501
- margin-bottom: 5px;
502
- flex-wrap: wrap;
503
- }
504
- .entry-title {
505
- font-size: ${fontSizes.entryTitle};
506
- font-weight: 600;
507
- color: #333;
508
- }
509
- .entry-subtitle {
510
- font-size: ${fontSizes.body};
511
- color: ${data.color};
512
- font-weight: 500;
513
- }
514
- .entry-dates {
515
- font-size: ${fontSizes.small};
516
- color: #888;
517
- font-style: italic;
518
- }
519
- .entry-description {
520
- font-size: ${fontSizes.body};
521
- color: #555;
522
- line-height: 1.7;
523
- margin-top: 5px;
524
- }
525
- .skills-grid {
526
- display: grid;
527
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
528
- gap: 15px;
529
- }
530
- .skill-item {
531
- display: flex;
532
- flex-direction: column;
533
- gap: 5px;
534
- }
535
- .skill-name {
536
- font-size: ${fontSizes.body};
537
- font-weight: 500;
538
- color: #333;
539
- }
540
- .skill-level {
541
- display: flex;
542
- gap: 3px;
543
- }
544
- .skill-dot {
545
- width: 12px;
546
- height: 12px;
547
- border-radius: 50%;
548
- background: #e5e5e5;
549
- }
550
- .skill-dot.filled {
551
- background: ${data.color};
552
- }
553
- .projects-list, .certs-list, .languages-list {
554
- display: grid;
555
- gap: ${spacingValue * 0.8}px;
556
- }
557
- .project-item, .cert-item, .language-item {
558
- display: flex;
559
- flex-direction: column;
560
- gap: 3px;
561
- }
562
- .item-name {
563
- font-size: ${fontSizes.body};
564
- font-weight: 600;
565
- color: #333;
566
- }
567
- .item-link {
568
- color: ${data.color};
569
- text-decoration: none;
570
- font-size: ${fontSizes.small};
571
- }
572
- .item-description {
573
- font-size: ${fontSizes.body};
574
- color: #555;
575
- }
576
- ${layoutStyles.sidebar ? `
577
- .sidebar {
578
- ${layoutStyles.sidebar}
579
- padding: ${spacingValue}px;
580
- background: #f8f9fa;
581
- }
582
- .main-content {
583
- flex: 1;
584
- padding: ${spacingValue}px;
585
- }
586
- ` : ""}
587
- @media print {
588
- body {
589
- background: white;
590
- padding: 0;
591
- }
592
- .resume-container {
593
- box-shadow: none;
594
- max-width: 100%;
595
- }
596
- }
597
- </style>
598
- </head>
599
- <body>
600
- <div class="resume-container">
601
- <div class="resume-header">
602
- ${data.includePhoto && data.photo ? `<img src="${sanitizeUrl(data.photo)}" alt="${escapeHtml(data.name)}" class="profile-photo">` : ""}
603
- <h1 class="name">${escapeHtml(data.name)}</h1>
604
- ${data.title ? `<div class="title">${escapeHtml(data.title)}</div>` : ""}
605
- <div class="contact-info">
606
- ${data.email ? `<span class="contact-item">✉ <a href="mailto:${escapeHtml(data.email)}">${escapeHtml(data.email)}</a></span>` : ""}
607
- ${data.phone ? `<span class="contact-item">📞 ${escapeHtml(data.phone)}</span>` : ""}
608
- ${data.location ? `<span class="contact-item">📍 ${escapeHtml(data.location)}</span>` : ""}
609
- ${data.website ? `<span class="contact-item">🌐 <a href="${sanitizeUrl(data.website)}">${escapeHtml(data.website)}</a></span>` : ""}
610
- ${data.linkedin ? `<span class="contact-item">💼 <a href="${sanitizeUrl(data.linkedin)}">LinkedIn</a></span>` : ""}
611
- ${data.github ? `<span class="contact-item">💻 <a href="${sanitizeUrl(data.github)}">GitHub</a></span>` : ""}
612
- </div>
613
- </div>
614
-
615
- <div class="resume-body">
616
- ${data.summary ? `
617
- <div class="section">
618
- <h2 class="section-title">Professional Summary</h2>
619
- <p class="summary-text">${escapeHtml(data.summary)}</p>
620
- </div>
621
- ` : ""}
622
-
623
- ${data.experience.length > 0 ? `
624
- <div class="section">
625
- <h2 class="section-title">Experience</h2>
626
- ${data.experience.map(exp => `
627
- <div class="entry">
628
- <div class="entry-header">
629
- <div>
630
- <div class="entry-title">${escapeHtml(exp.title)}</div>
631
- <div class="entry-subtitle">${escapeHtml(exp.company)}</div>
632
- </div>
633
- <div class="entry-dates">${escapeHtml(exp.dates)}</div>
634
- </div>
635
- <div class="entry-description">${escapeHtml(exp.description)}</div>
636
- </div>
637
- `).join("")}
638
- </div>
639
- ` : ""}
640
-
641
- ${data.education.length > 0 ? `
642
- <div class="section">
643
- <h2 class="section-title">Education</h2>
644
- ${data.education.map(edu => `
645
- <div class="entry">
646
- <div class="entry-header">
647
- <div>
648
- <div class="entry-title">${escapeHtml(edu.degree)}</div>
649
- <div class="entry-subtitle">${escapeHtml(edu.school)}</div>
650
- </div>
651
- <div class="entry-dates">${escapeHtml(edu.dates)}</div>
652
- </div>
653
- ${edu.details ? `<div class="entry-description">${escapeHtml(edu.details)}</div>` : ""}
654
- </div>
655
- `).join("")}
656
- </div>
657
- ` : ""}
658
-
659
- ${data.skills.length > 0 ? `
660
- <div class="section">
661
- <h2 class="section-title">Skills</h2>
662
- <div class="skills-grid">
663
- ${data.skills.map(skill => `
664
- <div class="skill-item">
665
- <div class="skill-name">${escapeHtml(skill.name)}</div>
666
- <div class="skill-level">
667
- ${Array.from({ length: 5 }, (_, i) => `
668
- <div class="skill-dot ${i < skill.level ? "filled" : ""}"></div>
669
- `).join("")}
670
- </div>
671
- </div>
672
- `).join("")}
673
- </div>
674
- </div>
675
- ` : ""}
676
-
677
- ${data.projects.length > 0 ? `
678
- <div class="section">
679
- <h2 class="section-title">Projects</h2>
680
- <div class="projects-list">
681
- ${data.projects.map(project => `
682
- <div class="project-item">
683
- <div class="item-name">${escapeHtml(project.name)}</div>
684
- ${project.url ? `<a href="${sanitizeUrl(project.url)}" class="item-link">${escapeHtml(project.url)}</a>` : ""}
685
- <div class="item-description">${escapeHtml(project.description)}</div>
686
- </div>
687
- `).join("")}
688
- </div>
689
- </div>
690
- ` : ""}
691
-
692
- ${data.certifications.length > 0 ? `
693
- <div class="section">
694
- <h2 class="section-title">Certifications</h2>
695
- <div class="certs-list">
696
- ${data.certifications.map(cert => `
697
- <div class="cert-item">
698
- <div class="item-name">${escapeHtml(cert.name)}</div>
699
- <div class="item-description">${escapeHtml(cert.year)}${cert.issuer ? ` • ${escapeHtml(cert.issuer)}` : ""}</div>
700
- </div>
701
- `).join("")}
702
- </div>
703
- </div>
704
- ` : ""}
705
-
706
- ${data.languages.length > 0 ? `
707
- <div class="section">
708
- <h2 class="section-title">Languages</h2>
709
- <div class="languages-list">
710
- ${data.languages.map(lang => `
711
- <div class="language-item">
712
- <div class="item-name">${escapeHtml(lang.name)}</div>
713
- <div class="item-description">${escapeHtml(lang.proficiency)}</div>
714
- </div>
715
- `).join("")}
716
- </div>
717
- </div>
718
- ` : ""}
719
- </div>
720
- </div>
721
- </body>
722
- </html>`;
723
- }
724
-
725
- // Generate cover letter HTML
726
- function generateCoverLetterHTML(data: CoverLetterData): string {
727
- const today = new Date().toLocaleDateString("en-US", {
728
- year: "numeric",
729
- month: "long",
730
- day: "numeric",
731
- });
732
-
733
- return `<!DOCTYPE html>
734
- <html lang="en">
735
- <head>
736
- <meta charset="UTF-8">
737
- <title>Cover Letter - ${escapeHtml(data.name)}</title>
738
- <style>
739
- * { margin: 0; padding: 0; box-sizing: border-box; }
740
- body {
741
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
742
- line-height: 1.8;
743
- color: #333;
744
- background: #f5f5f5;
745
- padding: 40px 20px;
746
- }
747
- .letter-container {
748
- max-width: 650px;
749
- margin: 0 auto;
750
- background: white;
751
- padding: 60px;
752
- box-shadow: 0 0 20px rgba(0,0,0,0.1);
753
- }
754
- .sender-info { margin-bottom: 40px; }
755
- .sender-name { font-size: 18px; font-weight: 600; margin-bottom: 5px; }
756
- .sender-details { font-size: 14px; color: #666; }
757
- .date { margin-bottom: 30px; font-size: 14px; color: #666; }
758
- .recipient-info { margin-bottom: 30px; }
759
- .recipient-name { font-size: 16px; font-weight: 600; margin-bottom: 5px; }
760
- .letter-body { font-size: 15px; line-height: 1.8; white-space: pre-wrap; margin-bottom: 30px; }
761
- .closing { font-size: 15px; }
762
- @media print {
763
- body { background: white; padding: 0; }
764
- .letter-container { box-shadow: none; padding: 40px; }
765
- }
766
- </style>
767
- </head>
768
- <body>
769
- <div class="letter-container">
770
- <div class="sender-info">
771
- <div class="sender-name">${escapeHtml(data.name)}</div>
772
- <div class="sender-details">
773
- ${escapeHtml(data.email) || ""} ${data.phone ? `• ${escapeHtml(data.phone)}` : ""} ${data.location ? `• ${escapeHtml(data.location)}` : ""}
774
- </div>
775
- </div>
776
- <div class="date">${today}</div>
777
- <div class="recipient-info">
778
- <div class="recipient-name">Hiring Manager</div>
779
- <div>${escapeHtml(data.position)}</div>
780
- <div>${escapeHtml(data.company)}</div>
781
- </div>
782
- <div class="letter-body">${escapeHtml(data.content)}</div>
783
- <div class="closing">
784
- <p>Sincerely,</p>
785
- <p style="margin-top: 20px;">${escapeHtml(data.name)}</p>
786
- </div>
787
- </div>
788
- </body>
789
- </html>`;
790
- }
791
-
792
- // Generate markdown resume
793
- function generateMarkdown(data: ResumeData): string {
794
- let md = `# ${data.name}\n\n`;
795
-
796
- if (data.title) md += `**${data.title}**\n\n`;
797
-
798
- const contact = [
799
- data.email && `📧 ${data.email}`,
800
- data.phone && `📞 ${data.phone}`,
801
- data.location && `📍 ${data.location}`,
802
- data.website && `🌐 ${data.website}`,
803
- data.linkedin && `💼 ${data.linkedin}`,
804
- data.github && `💻 ${data.github}`,
805
- ].filter(Boolean);
806
-
807
- if (contact.length > 0) md += `${contact.join(" • ")}\n\n`;
808
-
809
- if (data.summary) md += `## Professional Summary\n\n${data.summary}\n\n`;
810
-
811
- if (data.experience.length > 0) {
812
- md += `## Experience\n\n`;
813
- data.experience.forEach((exp) => {
814
- md += `### ${exp.title}\n**${exp.company}** • ${exp.dates}\n\n${exp.description}\n\n`;
815
- });
816
- }
817
-
818
- if (data.education.length > 0) {
819
- md += `## Education\n\n`;
820
- data.education.forEach((edu) => {
821
- md += `### ${edu.degree}\n**${edu.school}** • ${edu.dates}\n`;
822
- if (edu.details) md += `\n${edu.details}\n`;
823
- md += `\n`;
824
- });
825
- }
826
-
827
- if (data.skills.length > 0) {
828
- md += `## Skills\n\n`;
829
- data.skills.forEach((skill) => {
830
- const level = "●".repeat(skill.level) + "○".repeat(5 - skill.level);
831
- md += `- **${skill.name}**: ${level}\n`;
832
- });
833
- md += `\n`;
834
- }
835
-
836
- if (data.projects.length > 0) {
837
- md += `## Projects\n\n`;
838
- data.projects.forEach((project) => {
839
- md += `### ${project.name}\n${project.description}`;
840
- if (project.url) md += `\n\n${project.url}`;
841
- md += `\n\n`;
842
- });
843
- }
844
-
845
- if (data.certifications.length > 0) {
846
- md += `## Certifications\n\n`;
847
- data.certifications.forEach((cert) => {
848
- md += `- **${cert.name}** (${cert.year})`;
849
- if (cert.issuer) md += ` - ${cert.issuer}`;
850
- md += `\n`;
851
- });
852
- md += `\n`;
853
- }
854
-
855
- if (data.languages.length > 0) {
856
- md += `## Languages\n\n`;
857
- data.languages.forEach((lang) => {
858
- md += `- **${lang.name}**: ${lang.proficiency}\n`;
859
- });
860
- }
861
-
862
- return md;
863
- }
864
-
865
- // Helper functions for styles
866
- function getTemplateStyles(template: string) {
867
- const templates: Record<string, any> = {
868
- modern: { header: "background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;" },
869
- classic: { header: "background: #2c3e50; color: white;" },
870
- minimal: { header: "background: white; color: #333; border-bottom: 1px solid #e5e5e5;" },
871
- creative: { header: "background: linear-gradient(45deg, #ff6b6b, #feca57); color: white;" },
872
- executive: { header: "background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white;" },
873
- technical: { header: "background: #1a1a1a; color: #00ff00; font-family: 'Courier New', monospace;" },
874
- };
875
- return templates[template] || templates.modern;
876
- }
877
-
878
- function getLayoutStyles(layout: string) {
879
- const layouts: Record<string, any> = {
880
- "single-column": {
881
- container: "padding: 40px 60px;",
882
- headerAlign: "center",
883
- contactLayout: "flex-wrap: wrap; justify-content: center;",
884
- body: "",
885
- },
886
- "two-column": {
887
- container: "display: grid; grid-template-columns: 250px 1fr;",
888
- headerAlign: "left",
889
- contactLayout: "flex-direction: column; align-items: flex-start;",
890
- body: "grid-column: 2;",
891
- sidebar: "grid-column: 1; grid-row: 1 / span 2;",
892
- },
893
- sidebar: {
894
- container: "display: flex;",
895
- headerAlign: "left",
896
- contactLayout: "flex-direction: column;",
897
- body: "flex: 1;",
898
- sidebar: "width: 200px; background: #f8f9fa;",
899
- },
900
- };
901
- return layouts[layout] || layouts["single-column"];
902
- }
903
-
904
- function getFontFamily(font: string): string {
905
- const fonts: Record<string, string> = {
906
- inter: "'Inter', -apple-system, BlinkMacSystemFont, sans-serif",
907
- roboto: "'Roboto', sans-serif",
908
- lato: "'Lato', sans-serif",
909
- "open-sans": "'Open Sans', sans-serif",
910
- poppins: "'Poppins', sans-serif",
911
- };
912
- return fonts[font] || fonts.inter;
913
- }
914
-
915
- function getFontSizes(size: string) {
916
- const sizes: Record<string, any> = {
917
- small: { name: "28px", title: "16px", contact: "12px", sectionTitle: "16px", entryTitle: "15px", body: "13px", small: "11px" },
918
- medium: { name: "32px", title: "18px", contact: "14px", sectionTitle: "18px", entryTitle: "16px", body: "14px", small: "12px" },
919
- large: { name: "36px", title: "20px", contact: "15px", sectionTitle: "20px", entryTitle: "17px", body: "15px", small: "13px" },
920
- };
921
- return sizes[size] || sizes.medium;
922
- }
923
-
924
- function getSpacingValue(spacing: string): number {
925
- const values: Record<string, number> = { compact: 15, normal: 25, spacious: 35 };
926
- return values[spacing] || values.normal;
927
- }
13
+ import { parseArguments, showHelp } from "./cli";
14
+ import {
15
+ importFromLinkedIn,
16
+ parseCertifications,
17
+ parseEducation,
18
+ parseExperience,
19
+ parseLanguages,
20
+ parseProjects,
21
+ parseSkills,
22
+ } from "./parsers";
23
+ import { generateCoverLetterHTML, generateMarkdown, generateResumeHTML } from "./renderers";
24
+ import type { CoverLetterData, ResumeData } from "./types";
928
25
 
929
- // Main function
930
26
  async function main() {
931
27
  const args = parseArguments();
932
28