@hasna/skills 0.0.3 → 0.0.4

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 (582) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +19 -91
  3. package/bin/index.js +804 -324
  4. package/bin/mcp.js +465 -233
  5. package/dist/cli/cli.test.d.ts +1 -0
  6. package/dist/cli/components/App.d.ts +6 -0
  7. package/dist/cli/components/CategorySelect.d.ts +6 -0
  8. package/dist/cli/components/Header.d.ts +6 -0
  9. package/dist/cli/components/InstallProgress.d.ts +8 -0
  10. package/dist/cli/components/SearchView.d.ts +8 -0
  11. package/dist/cli/components/SkillSelect.d.ts +10 -0
  12. package/dist/cli/index.d.ts +2 -0
  13. package/dist/index.d.ts +12 -0
  14. package/{src/lib/registry.ts → dist/index.js} +727 -267
  15. package/dist/index.test.d.ts +1 -0
  16. package/dist/lib/installer.d.ts +67 -0
  17. package/dist/lib/installer.test.d.ts +1 -0
  18. package/dist/lib/registry.d.ts +16 -0
  19. package/dist/lib/registry.test.d.ts +1 -0
  20. package/dist/lib/skillinfo-run.test.d.ts +1 -0
  21. package/dist/lib/skillinfo.d.ts +44 -0
  22. package/dist/lib/skillinfo.test.d.ts +1 -0
  23. package/dist/lib/utils.d.ts +4 -0
  24. package/dist/lib/utils.test.d.ts +1 -0
  25. package/dist/lib/validation.test.d.ts +1 -0
  26. package/dist/mcp/index.d.ts +10 -0
  27. package/dist/mcp/mcp.test.d.ts +1 -0
  28. package/dist/server/serve.d.ts +7 -0
  29. package/package.json +16 -5
  30. package/skills/_common/index.ts +23 -0
  31. package/skills/skill-academic-journal-matcher/package.json +9 -8
  32. package/skills/skill-academic-journal-matcher/tsconfig.json +6 -10
  33. package/skills/skill-action-item-router/package.json +9 -8
  34. package/skills/skill-action-item-router/tsconfig.json +6 -10
  35. package/skills/skill-ad-creative-generator/package.json +9 -8
  36. package/skills/skill-ad-creative-generator/tsconfig.json +6 -10
  37. package/skills/skill-advanced-math/package.json +9 -8
  38. package/skills/skill-advanced-math/tsconfig.json +6 -10
  39. package/skills/skill-analyze-data/package.json +3 -5
  40. package/skills/skill-analyze-data/tsconfig.json +12 -9
  41. package/skills/skill-anomaly-investigator/package.json +9 -8
  42. package/skills/skill-anomaly-investigator/tsconfig.json +6 -10
  43. package/skills/skill-api-test-suite/package.json +9 -8
  44. package/skills/skill-api-test-suite/tsconfig.json +6 -10
  45. package/skills/skill-apidocs/CLAUDE.md +1 -1
  46. package/skills/skill-apidocs/LICENSE +192 -21
  47. package/skills/skill-apidocs/package.json +1 -2
  48. package/skills/skill-apidocs/tsconfig.json +12 -9
  49. package/skills/skill-audio/package.json +1 -1
  50. package/skills/skill-audio/src/index-local.ts +1 -1
  51. package/skills/skill-audio/src/index.ts +1 -2
  52. package/skills/skill-audio/tsconfig.json +11 -8
  53. package/skills/skill-audio-cleanup-lab/package.json +2 -5
  54. package/skills/skill-audio-cleanup-lab/tsconfig.json +6 -10
  55. package/skills/skill-audiobook-chapter-proofer/package.json +9 -8
  56. package/skills/skill-audiobook-chapter-proofer/tsconfig.json +6 -10
  57. package/skills/skill-banner-ad-suite/package.json +9 -8
  58. package/skills/skill-banner-ad-suite/tsconfig.json +6 -10
  59. package/skills/skill-benchmark-finder/package.json +9 -8
  60. package/skills/skill-benchmark-finder/tsconfig.json +6 -10
  61. package/skills/skill-bio-sequence-tool/package.json +9 -8
  62. package/skills/skill-bio-sequence-tool/tsconfig.json +6 -10
  63. package/skills/skill-blog-topic-cluster/package.json +9 -8
  64. package/skills/skill-blog-topic-cluster/tsconfig.json +6 -10
  65. package/skills/skill-brand-style-guide/package.json +3 -4
  66. package/skills/skill-brand-style-guide/tsconfig.json +12 -9
  67. package/skills/skill-brand-voice-audit/package.json +9 -8
  68. package/skills/skill-brand-voice-audit/tsconfig.json +6 -10
  69. package/skills/skill-browse/LICENSE +192 -21
  70. package/skills/skill-browse/package.json +1 -1
  71. package/skills/skill-browse/src/index-local.ts +1 -1
  72. package/skills/skill-browse/src/index.ts +1 -2
  73. package/skills/skill-browse/tsconfig.json +11 -8
  74. package/skills/skill-budget-variance-analyzer/package.json +2 -4
  75. package/skills/skill-budget-variance-analyzer/tsconfig.json +12 -7
  76. package/skills/skill-businessactivity/LICENSE +192 -21
  77. package/skills/skill-businessactivity/package.json +1 -1
  78. package/skills/skill-businessactivity/tsconfig.json +15 -7
  79. package/skills/skill-calendar-events/package.json +9 -8
  80. package/skills/skill-calendar-events/tsconfig.json +6 -10
  81. package/skills/skill-campaign-metric-brief/package.json +9 -8
  82. package/skills/skill-campaign-metric-brief/tsconfig.json +6 -10
  83. package/skills/skill-campaign-moodboard/package.json +9 -8
  84. package/skills/skill-campaign-moodboard/tsconfig.json +6 -10
  85. package/skills/skill-caption-style-stylist/package.json +9 -8
  86. package/skills/skill-caption-style-stylist/tsconfig.json +6 -10
  87. package/skills/skill-chemistry-calculator/package.json +9 -8
  88. package/skills/skill-chemistry-calculator/tsconfig.json +6 -10
  89. package/skills/skill-churn-risk-notifier/package.json +9 -8
  90. package/skills/skill-churn-risk-notifier/tsconfig.json +6 -10
  91. package/skills/skill-citation-formatter/package.json +9 -8
  92. package/skills/skill-citation-formatter/tsconfig.json +6 -10
  93. package/skills/skill-classroom-newsletter-kit/package.json +9 -8
  94. package/skills/skill-classroom-newsletter-kit/tsconfig.json +6 -10
  95. package/skills/skill-codefix/LICENSE +192 -21
  96. package/skills/skill-codefix/src/index-local.ts +1 -1
  97. package/skills/skill-codefix/src/index.ts +1 -2
  98. package/skills/skill-codefix/tsconfig.json +9 -10
  99. package/skills/skill-color-palette-harmonizer/package.json +9 -8
  100. package/skills/skill-color-palette-harmonizer/tsconfig.json +6 -10
  101. package/skills/skill-competitor-ad-analyzer/package.json +9 -8
  102. package/skills/skill-competitor-ad-analyzer/tsconfig.json +6 -10
  103. package/skills/skill-compliance-copy-check/package.json +9 -8
  104. package/skills/skill-compliance-copy-check/tsconfig.json +6 -10
  105. package/skills/skill-compliance-report-pack/package.json +9 -8
  106. package/skills/skill-compliance-report-pack/tsconfig.json +6 -10
  107. package/skills/skill-compress-video/package.json +2 -5
  108. package/skills/skill-compress-video/tsconfig.json +6 -10
  109. package/skills/skill-consolelog/LICENSE +192 -21
  110. package/skills/skill-consolelog/package.json +1 -2
  111. package/skills/skill-consolelog/tsconfig.json +14 -10
  112. package/skills/skill-contract-plainlanguage/package.json +9 -8
  113. package/skills/skill-contract-plainlanguage/tsconfig.json +6 -10
  114. package/skills/skill-convert/LICENSE +192 -21
  115. package/skills/skill-convert/src/index-local.ts +1 -1
  116. package/skills/skill-convert/src/index.ts +1 -2
  117. package/skills/skill-convert/tsconfig.json +9 -10
  118. package/skills/skill-copytone-translator/package.json +9 -8
  119. package/skills/skill-copytone-translator/tsconfig.json +6 -10
  120. package/skills/skill-create-blog-article/package.json +9 -8
  121. package/skills/skill-create-blog-article/tsconfig.json +6 -10
  122. package/skills/skill-create-ebook/package.json +9 -8
  123. package/skills/skill-create-ebook/tsconfig.json +6 -10
  124. package/skills/skill-crm-note-enhancer/package.json +9 -8
  125. package/skills/skill-crm-note-enhancer/tsconfig.json +6 -10
  126. package/skills/skill-customer-journey-mapper/package.json +9 -8
  127. package/skills/skill-customer-journey-mapper/tsconfig.json +6 -10
  128. package/skills/skill-dashboard-builder/package.json +9 -8
  129. package/skills/skill-dashboard-builder/tsconfig.json +6 -10
  130. package/skills/skill-dashboard-narrator/package.json +9 -8
  131. package/skills/skill-dashboard-narrator/tsconfig.json +6 -10
  132. package/skills/skill-data-anonymizer/package.json +9 -8
  133. package/skills/skill-data-anonymizer/tsconfig.json +6 -10
  134. package/skills/skill-database-explorer/package.json +9 -8
  135. package/skills/skill-database-explorer/tsconfig.json +6 -10
  136. package/skills/skill-dataset-health-check/package.json +9 -8
  137. package/skills/skill-dataset-health-check/tsconfig.json +6 -10
  138. package/skills/skill-decision-journal/package.json +9 -8
  139. package/skills/skill-decision-journal/tsconfig.json +6 -10
  140. package/skills/skill-deepresearch/package.json +1 -1
  141. package/skills/skill-deepresearch/tsconfig.json +11 -9
  142. package/skills/skill-delegation-brief-writer/package.json +9 -8
  143. package/skills/skill-delegation-brief-writer/tsconfig.json +6 -10
  144. package/skills/skill-deploy/LICENSE +192 -21
  145. package/skills/skill-deploy/src/hosts.ts +9 -26
  146. package/skills/skill-deploy/src/http-client.ts +1 -1
  147. package/skills/skill-deploy/src/index-local.ts +1 -1
  148. package/skills/skill-deploy/src/index.ts +1 -1
  149. package/skills/skill-deploy/tsconfig.json +10 -9
  150. package/skills/skill-destination-briefing/package.json +9 -8
  151. package/skills/skill-destination-briefing/tsconfig.json +6 -10
  152. package/skills/skill-diff-viewer/package.json +9 -8
  153. package/skills/skill-diff-viewer/tsconfig.json +6 -10
  154. package/skills/skill-domainpurchase/.env.example +1 -1
  155. package/skills/skill-domainpurchase/LICENSE +192 -21
  156. package/skills/skill-domainpurchase/package.json +3 -4
  157. package/skills/skill-domainpurchase/src/lib/config.ts +2 -2
  158. package/skills/skill-domainpurchase/tsconfig.json +4 -5
  159. package/skills/skill-domainsearch/.env.example +1 -1
  160. package/skills/skill-domainsearch/LICENSE +192 -21
  161. package/skills/skill-domainsearch/package.json +3 -5
  162. package/skills/skill-domainsearch/tsconfig.json +4 -4
  163. package/skills/skill-e2bswarm/package.json +1 -1
  164. package/skills/skill-e2bswarm/src/lib/config.ts +3 -6
  165. package/skills/skill-e2bswarm/tsconfig.json +9 -10
  166. package/skills/skill-educational-resource-finder/package.json +9 -8
  167. package/skills/skill-educational-resource-finder/tsconfig.json +6 -10
  168. package/skills/skill-email-campaign/package.json +9 -8
  169. package/skills/skill-email-campaign/tsconfig.json +6 -10
  170. package/skills/skill-emoji/package.json +1 -1
  171. package/skills/skill-emoji/tsconfig.json +9 -9
  172. package/skills/skill-exam-readiness-check/package.json +9 -8
  173. package/skills/skill-exam-readiness-check/tsconfig.json +6 -10
  174. package/skills/skill-experiment-power-calculator/package.json +9 -8
  175. package/skills/skill-experiment-power-calculator/tsconfig.json +6 -10
  176. package/skills/skill-extract/LICENSE +192 -21
  177. package/skills/skill-extract/package.json +1 -1
  178. package/skills/skill-extract/src/index-local.ts +1 -1
  179. package/skills/skill-extract/src/index.ts +1 -2
  180. package/skills/skill-extract/tsconfig.json +11 -9
  181. package/skills/skill-extract-audio/package.json +2 -5
  182. package/skills/skill-extract-audio/tsconfig.json +6 -10
  183. package/skills/skill-extract-frames/package.json +9 -8
  184. package/skills/skill-extract-frames/tsconfig.json +6 -10
  185. package/skills/skill-extract-invoice/package.json +9 -8
  186. package/skills/skill-extract-invoice/tsconfig.json +6 -10
  187. package/skills/skill-family-activity-curator/package.json +9 -8
  188. package/skills/skill-family-activity-curator/tsconfig.json +6 -10
  189. package/skills/skill-faq-packager/package.json +9 -8
  190. package/skills/skill-faq-packager/tsconfig.json +6 -10
  191. package/skills/skill-feedback-survey-designer/package.json +9 -8
  192. package/skills/skill-feedback-survey-designer/tsconfig.json +6 -10
  193. package/skills/skill-field-trip-planner/package.json +9 -8
  194. package/skills/skill-field-trip-planner/tsconfig.json +6 -10
  195. package/skills/skill-file-organizer/package.json +9 -8
  196. package/skills/skill-file-organizer/tsconfig.json +6 -10
  197. package/skills/skill-folder-tree/package.json +9 -8
  198. package/skills/skill-folder-tree/tsconfig.json +6 -10
  199. package/skills/skill-forecast-scenario-lab/package.json +9 -8
  200. package/skills/skill-forecast-scenario-lab/tsconfig.json +6 -10
  201. package/skills/skill-form-filler/package.json +9 -8
  202. package/skills/skill-form-filler/tsconfig.json +6 -10
  203. package/skills/skill-generate-api-client/package.json +9 -8
  204. package/skills/skill-generate-api-client/tsconfig.json +6 -10
  205. package/skills/skill-generate-book-cover/package.json +9 -8
  206. package/skills/skill-generate-book-cover/tsconfig.json +6 -10
  207. package/skills/skill-generate-chart/package.json +9 -8
  208. package/skills/skill-generate-chart/tsconfig.json +6 -10
  209. package/skills/skill-generate-diagram/package.json +9 -8
  210. package/skills/skill-generate-diagram/tsconfig.json +6 -10
  211. package/skills/skill-generate-dockerfile/package.json +9 -8
  212. package/skills/skill-generate-dockerfile/tsconfig.json +6 -10
  213. package/skills/skill-generate-documentation/package.json +9 -8
  214. package/skills/skill-generate-documentation/tsconfig.json +6 -10
  215. package/skills/skill-generate-docx/package.json +3 -5
  216. package/skills/skill-generate-docx/tsconfig.json +10 -10
  217. package/skills/skill-generate-env/package.json +9 -8
  218. package/skills/skill-generate-env/tsconfig.json +6 -10
  219. package/skills/skill-generate-excel/package.json +9 -8
  220. package/skills/skill-generate-excel/tsconfig.json +6 -10
  221. package/skills/skill-generate-favicon/package.json +9 -8
  222. package/skills/skill-generate-favicon/tsconfig.json +6 -10
  223. package/skills/skill-generate-mock-data/package.json +9 -8
  224. package/skills/skill-generate-mock-data/tsconfig.json +6 -10
  225. package/skills/skill-generate-pdf/package.json +3 -5
  226. package/skills/skill-generate-pdf/tsconfig.json +10 -10
  227. package/skills/skill-generate-pr-description/package.json +9 -8
  228. package/skills/skill-generate-pr-description/tsconfig.json +6 -10
  229. package/skills/skill-generate-presentation/package.json +9 -8
  230. package/skills/skill-generate-presentation/tsconfig.json +6 -10
  231. package/skills/skill-generate-qrcode/package.json +9 -8
  232. package/skills/skill-generate-qrcode/tsconfig.json +6 -10
  233. package/skills/skill-generate-regex/package.json +9 -8
  234. package/skills/skill-generate-regex/tsconfig.json +6 -10
  235. package/skills/skill-generate-resume/package.json +9 -8
  236. package/skills/skill-generate-resume/tsconfig.json +6 -10
  237. package/skills/skill-generate-sitemap/package.json +9 -8
  238. package/skills/skill-generate-sitemap/tsconfig.json +6 -10
  239. package/skills/skill-generate-social-posts/package.json +9 -8
  240. package/skills/skill-generate-social-posts/tsconfig.json +6 -10
  241. package/skills/skill-generate-sql/package.json +9 -8
  242. package/skills/skill-generate-sql/tsconfig.json +6 -10
  243. package/skills/skill-gif-maker/package.json +9 -8
  244. package/skills/skill-gif-maker/tsconfig.json +6 -10
  245. package/skills/skill-github-manager/package.json +9 -8
  246. package/skills/skill-github-manager/tsconfig.json +6 -10
  247. package/skills/skill-gmail/package.json +9 -8
  248. package/skills/skill-gmail/tsconfig.json +6 -10
  249. package/skills/skill-goal-quarterly-roadmap/package.json +9 -8
  250. package/skills/skill-goal-quarterly-roadmap/tsconfig.json +6 -10
  251. package/skills/skill-grant-application-drafter/package.json +9 -8
  252. package/skills/skill-grant-application-drafter/tsconfig.json +6 -10
  253. package/skills/skill-grocery-basket-optimizer/package.json +9 -8
  254. package/skills/skill-grocery-basket-optimizer/tsconfig.json +6 -10
  255. package/skills/skill-guest-communication-suite/package.json +9 -8
  256. package/skills/skill-guest-communication-suite/tsconfig.json +6 -10
  257. package/skills/skill-habit-reflection-digest/package.json +9 -8
  258. package/skills/skill-habit-reflection-digest/tsconfig.json +6 -10
  259. package/skills/skill-highlight-reel-generator/package.json +9 -8
  260. package/skills/skill-highlight-reel-generator/tsconfig.json +6 -10
  261. package/skills/skill-homework-feedback-coach/package.json +9 -8
  262. package/skills/skill-homework-feedback-coach/tsconfig.json +6 -10
  263. package/skills/skill-hook/LICENSE +192 -21
  264. package/skills/skill-hook/package.json +1 -1
  265. package/skills/skill-hook/src/commands/create.ts +1 -1
  266. package/skills/skill-hook/tsconfig.json +8 -8
  267. package/skills/skill-household-maintenance-mgr/package.json +9 -8
  268. package/skills/skill-household-maintenance-mgr/tsconfig.json +6 -10
  269. package/skills/skill-http-server/package.json +9 -8
  270. package/skills/skill-http-server/tsconfig.json +6 -10
  271. package/skills/skill-image/LICENSE +192 -21
  272. package/skills/skill-image/package.json +1 -1
  273. package/skills/skill-image/src/index-local.ts +1 -1
  274. package/skills/skill-image/src/index.ts +1 -2
  275. package/skills/skill-image/tsconfig.json +11 -9
  276. package/skills/skill-implementation/LICENSE +192 -21
  277. package/skills/skill-implementation/package.json +1 -1
  278. package/skills/skill-implementation/tsconfig.json +8 -8
  279. package/skills/skill-implementation-agent/package.json +9 -8
  280. package/skills/skill-implementation-agent/tsconfig.json +6 -10
  281. package/skills/skill-implementation-plan/package.json +9 -8
  282. package/skills/skill-implementation-plan/tsconfig.json +6 -10
  283. package/skills/skill-implementation-todo/package.json +9 -8
  284. package/skills/skill-implementation-todo/tsconfig.json +6 -10
  285. package/skills/skill-inbox-priority-planner/package.json +9 -8
  286. package/skills/skill-inbox-priority-planner/tsconfig.json +6 -10
  287. package/skills/skill-invoice/LICENSE +192 -21
  288. package/skills/skill-invoice/README.md +1 -1
  289. package/skills/skill-invoice/tsconfig.json +13 -9
  290. package/skills/skill-invoice-dispute-helper/package.json +9 -8
  291. package/skills/skill-invoice-dispute-helper/tsconfig.json +6 -10
  292. package/skills/skill-itinerary-architect/package.json +9 -8
  293. package/skills/skill-itinerary-architect/tsconfig.json +6 -10
  294. package/skills/skill-jingle-composer/package.json +9 -8
  295. package/skills/skill-jingle-composer/tsconfig.json +6 -10
  296. package/skills/skill-kpi-digest-generator/package.json +9 -8
  297. package/skills/skill-kpi-digest-generator/tsconfig.json +6 -10
  298. package/skills/skill-lab-notebook-formatter/package.json +9 -8
  299. package/skills/skill-lab-notebook-formatter/tsconfig.json +6 -10
  300. package/skills/skill-landing-page-copy/package.json +9 -8
  301. package/skills/skill-landing-page-copy/tsconfig.json +6 -10
  302. package/skills/skill-latex-table-generator/package.json +9 -8
  303. package/skills/skill-latex-table-generator/tsconfig.json +6 -10
  304. package/skills/skill-learning-style-profiler/package.json +9 -8
  305. package/skills/skill-learning-style-profiler/tsconfig.json +6 -10
  306. package/skills/skill-lesson-plan-customizer/package.json +9 -8
  307. package/skills/skill-lesson-plan-customizer/tsconfig.json +6 -10
  308. package/skills/skill-livestream-runofshow/package.json +9 -8
  309. package/skills/skill-livestream-runofshow/tsconfig.json +6 -10
  310. package/skills/skill-longform-structurer/package.json +9 -8
  311. package/skills/skill-longform-structurer/tsconfig.json +6 -10
  312. package/skills/skill-lorem-generator/package.json +9 -8
  313. package/skills/skill-lorem-generator/tsconfig.json +6 -10
  314. package/skills/skill-managehook/.env.example +2 -2
  315. package/skills/skill-managehook/CLAUDE.md +23 -134
  316. package/skills/skill-managehook/README.md +28 -27
  317. package/skills/skill-managehook/package.json +5 -6
  318. package/skills/skill-managehook/src/db/index.ts +2 -2
  319. package/skills/skill-managehook/src/lib/api-client.ts +2 -2
  320. package/skills/skill-managehook/src/lib/config.ts +1 -1
  321. package/skills/skill-managehook/src/lib/service-dir.ts +2 -2
  322. package/skills/skill-managehook/src/server/index.ts +2 -2
  323. package/skills/skill-managehook/tsconfig.json +15 -7
  324. package/skills/skill-managemcp/.env.example +2 -2
  325. package/skills/skill-managemcp/CLAUDE.md +23 -134
  326. package/skills/skill-managemcp/README.md +28 -27
  327. package/skills/skill-managemcp/package.json +5 -6
  328. package/skills/skill-managemcp/src/db/index.ts +2 -2
  329. package/skills/skill-managemcp/src/lib/api-client.ts +2 -2
  330. package/skills/skill-managemcp/src/lib/config.ts +1 -1
  331. package/skills/skill-managemcp/src/lib/service-dir.ts +2 -2
  332. package/skills/skill-managemcp/src/server/index.ts +2 -2
  333. package/skills/skill-managemcp/tsconfig.json +15 -7
  334. package/skills/skill-manageskill/.env.example +2 -2
  335. package/skills/skill-manageskill/CLAUDE.md +23 -134
  336. package/skills/skill-manageskill/README.md +28 -27
  337. package/skills/skill-manageskill/package.json +5 -6
  338. package/skills/skill-manageskill/src/db/index.ts +2 -2
  339. package/skills/skill-manageskill/src/lib/api-client.ts +2 -2
  340. package/skills/skill-manageskill/src/lib/config.ts +1 -1
  341. package/skills/skill-manageskill/src/lib/service-dir.ts +2 -2
  342. package/skills/skill-manageskill/src/server/index.ts +2 -2
  343. package/skills/skill-manageskill/tsconfig.json +15 -7
  344. package/skills/skill-markdown-validator/package.json +9 -8
  345. package/skills/skill-markdown-validator/tsconfig.json +6 -10
  346. package/skills/skill-mcp-builder/package.json +9 -8
  347. package/skills/skill-mcp-builder/tsconfig.json +6 -10
  348. package/skills/skill-meal-plan-designer/package.json +9 -8
  349. package/skills/skill-meal-plan-designer/tsconfig.json +6 -10
  350. package/skills/skill-meeting-insight-summarizer/package.json +9 -8
  351. package/skills/skill-meeting-insight-summarizer/tsconfig.json +6 -10
  352. package/skills/skill-merge-pdfs/package.json +9 -8
  353. package/skills/skill-merge-pdfs/tsconfig.json +6 -10
  354. package/skills/skill-microcopy-generator/package.json +9 -8
  355. package/skills/skill-microcopy-generator/tsconfig.json +6 -10
  356. package/skills/skill-mindfulness-prompt-cache/package.json +9 -8
  357. package/skills/skill-mindfulness-prompt-cache/tsconfig.json +6 -10
  358. package/skills/skill-notion-manager/package.json +9 -8
  359. package/skills/skill-notion-manager/tsconfig.json +6 -10
  360. package/skills/skill-npmpublish/package.json +1 -1
  361. package/skills/skill-npmpublish/tsconfig.json +7 -7
  362. package/skills/skill-onboarding-sequence-builder/package.json +9 -8
  363. package/skills/skill-onboarding-sequence-builder/tsconfig.json +6 -10
  364. package/skills/skill-onsite-ops-checklist/package.json +9 -8
  365. package/skills/skill-onsite-ops-checklist/tsconfig.json +6 -10
  366. package/skills/skill-outreach-cadence-designer/package.json +9 -8
  367. package/skills/skill-outreach-cadence-designer/tsconfig.json +6 -10
  368. package/skills/skill-packaging-concept-studio/package.json +9 -8
  369. package/skills/skill-packaging-concept-studio/tsconfig.json +6 -10
  370. package/skills/skill-packing-plan-pro/package.json +9 -8
  371. package/skills/skill-packing-plan-pro/tsconfig.json +6 -10
  372. package/skills/skill-parent-teacher-brief/package.json +9 -8
  373. package/skills/skill-parent-teacher-brief/tsconfig.json +6 -10
  374. package/skills/skill-partner-kit-assembler/package.json +9 -8
  375. package/skills/skill-partner-kit-assembler/tsconfig.json +6 -10
  376. package/skills/skill-payroll-change-prepper/package.json +9 -8
  377. package/skills/skill-payroll-change-prepper/tsconfig.json +6 -10
  378. package/skills/skill-persona-based-adwriter/package.json +9 -8
  379. package/skills/skill-persona-based-adwriter/tsconfig.json +6 -10
  380. package/skills/skill-persona-generator/package.json +9 -8
  381. package/skills/skill-persona-generator/tsconfig.json +6 -10
  382. package/skills/skill-personal-daily-ops/package.json +9 -8
  383. package/skills/skill-personal-daily-ops/tsconfig.json +6 -10
  384. package/skills/skill-pet-care-scheduler/package.json +9 -8
  385. package/skills/skill-pet-care-scheduler/tsconfig.json +6 -10
  386. package/skills/skill-podcast-show-notes/package.json +9 -8
  387. package/skills/skill-podcast-show-notes/tsconfig.json +6 -10
  388. package/skills/skill-presentation-theme-maker/package.json +9 -8
  389. package/skills/skill-presentation-theme-maker/tsconfig.json +6 -10
  390. package/skills/skill-press-release-drafter/package.json +9 -8
  391. package/skills/skill-press-release-drafter/tsconfig.json +6 -10
  392. package/skills/skill-print-collateral-designer/package.json +9 -8
  393. package/skills/skill-print-collateral-designer/tsconfig.json +6 -10
  394. package/skills/skill-procurement-scorecard/package.json +9 -8
  395. package/skills/skill-procurement-scorecard/tsconfig.json +6 -10
  396. package/skills/skill-product-demo-script/package.json +9 -8
  397. package/skills/skill-product-demo-script/tsconfig.json +6 -10
  398. package/skills/skill-product-mockup/package.json +9 -8
  399. package/skills/skill-product-mockup/tsconfig.json +6 -10
  400. package/skills/skill-project-retro-companion/package.json +9 -8
  401. package/skills/skill-project-retro-companion/tsconfig.json +6 -10
  402. package/skills/skill-proposal-redline-advisor/package.json +9 -8
  403. package/skills/skill-proposal-redline-advisor/tsconfig.json +6 -10
  404. package/skills/skill-regex-tester/package.json +9 -8
  405. package/skills/skill-regex-tester/tsconfig.json +6 -10
  406. package/skills/skill-remove-background/package.json +9 -8
  407. package/skills/skill-remove-background/tsconfig.json +6 -10
  408. package/skills/skill-risk-disclosure-kit/package.json +9 -8
  409. package/skills/skill-risk-disclosure-kit/tsconfig.json +6 -10
  410. package/skills/skill-roi-comparison-tool/package.json +9 -8
  411. package/skills/skill-roi-comparison-tool/tsconfig.json +6 -10
  412. package/skills/skill-sales-call-recapper/package.json +9 -8
  413. package/skills/skill-sales-call-recapper/tsconfig.json +6 -10
  414. package/skills/skill-salescopy/LICENSE +192 -21
  415. package/skills/skill-salescopy/README.md +1 -1
  416. package/skills/skill-salescopy/tsconfig.json +13 -9
  417. package/skills/skill-scaffold-project/package.json +8 -5
  418. package/skills/skill-scaffold-project/tsconfig.json +6 -10
  419. package/skills/skill-scholarship-tracker/package.json +9 -8
  420. package/skills/skill-scholarship-tracker/tsconfig.json +6 -10
  421. package/skills/skill-scientific-figure-check/package.json +9 -8
  422. package/skills/skill-scientific-figure-check/tsconfig.json +6 -10
  423. package/skills/skill-seating-chart-maker/package.json +9 -8
  424. package/skills/skill-seating-chart-maker/tsconfig.json +6 -10
  425. package/skills/skill-security-audit/package.json +9 -8
  426. package/skills/skill-security-audit/tsconfig.json +6 -10
  427. package/skills/skill-seo-brief-builder/package.json +9 -8
  428. package/skills/skill-seo-brief-builder/tsconfig.json +6 -10
  429. package/skills/skill-slack-assistant/package.json +9 -8
  430. package/skills/skill-slack-assistant/tsconfig.json +6 -10
  431. package/skills/skill-sleep-routine-analyzer/package.json +9 -8
  432. package/skills/skill-sleep-routine-analyzer/tsconfig.json +6 -10
  433. package/skills/skill-sms/package.json +1 -1
  434. package/skills/skill-sms/tsconfig.json +10 -9
  435. package/skills/skill-social-media-kit/package.json +9 -8
  436. package/skills/skill-social-media-kit/tsconfig.json +6 -10
  437. package/skills/skill-split-pdf/package.json +9 -8
  438. package/skills/skill-split-pdf/tsconfig.json +6 -10
  439. package/skills/skill-sponsorship-proposal-lab/package.json +9 -8
  440. package/skills/skill-sponsorship-proposal-lab/tsconfig.json +6 -10
  441. package/skills/skill-spreadsheet-cleanroom/package.json +9 -8
  442. package/skills/skill-spreadsheet-cleanroom/tsconfig.json +6 -10
  443. package/skills/skill-statistical-test-selector/package.json +9 -8
  444. package/skills/skill-statistical-test-selector/tsconfig.json +6 -10
  445. package/skills/skill-stress-relief-playbook/package.json +9 -8
  446. package/skills/skill-stress-relief-playbook/tsconfig.json +6 -10
  447. package/skills/skill-study-guide-builder/package.json +9 -8
  448. package/skills/skill-study-guide-builder/tsconfig.json +6 -10
  449. package/skills/skill-subscription-spend-watcher/package.json +9 -8
  450. package/skills/skill-subscription-spend-watcher/tsconfig.json +6 -10
  451. package/skills/skill-subtitle/LICENSE +192 -21
  452. package/skills/skill-subtitle/package.json +1 -1
  453. package/skills/skill-subtitle/tsconfig.json +13 -9
  454. package/skills/skill-survey-insight-extractor/package.json +9 -8
  455. package/skills/skill-survey-insight-extractor/tsconfig.json +6 -10
  456. package/skills/skill-terraform-generator/package.json +9 -8
  457. package/skills/skill-terraform-generator/tsconfig.json +6 -10
  458. package/skills/skill-testimonial-graphics/package.json +9 -8
  459. package/skills/skill-testimonial-graphics/tsconfig.json +6 -10
  460. package/skills/skill-timesheet/package.json +1 -1
  461. package/skills/skill-timesheet/tsconfig.json +15 -7
  462. package/skills/skill-transcript/LICENSE +192 -21
  463. package/skills/skill-transcript/package.json +1 -1
  464. package/skills/skill-transcript/src/index-local.ts +1 -1
  465. package/skills/skill-transcript/src/index.ts +1 -2
  466. package/skills/skill-transcript/tsconfig.json +9 -9
  467. package/skills/skill-travel-budget-balancer/package.json +9 -8
  468. package/skills/skill-travel-budget-balancer/tsconfig.json +6 -10
  469. package/skills/skill-validate-config/package.json +9 -8
  470. package/skills/skill-validate-config/tsconfig.json +6 -10
  471. package/skills/skill-video/LICENSE +192 -21
  472. package/skills/skill-video/package.json +1 -1
  473. package/skills/skill-video/src/index-local.ts +1 -1
  474. package/skills/skill-video/src/index.ts +1 -2
  475. package/skills/skill-video/tsconfig.json +5 -8
  476. package/skills/skill-video-cut-suggester/package.json +9 -8
  477. package/skills/skill-video-cut-suggester/tsconfig.json +6 -10
  478. package/skills/skill-video-downloader/package.json +9 -8
  479. package/skills/skill-video-downloader/tsconfig.json +6 -10
  480. package/skills/skill-video-thumbnail/package.json +9 -8
  481. package/skills/skill-video-thumbnail/tsconfig.json +6 -10
  482. package/skills/skill-voiceover-casting-assistant/package.json +9 -8
  483. package/skills/skill-voiceover-casting-assistant/tsconfig.json +6 -10
  484. package/skills/skill-watermark/package.json +9 -8
  485. package/skills/skill-watermark/tsconfig.json +6 -10
  486. package/skills/skill-webcrawling/LICENSE +192 -21
  487. package/skills/skill-webcrawling/package.json +1 -1
  488. package/skills/skill-webcrawling/tsconfig.json +14 -9
  489. package/skills/skill-webinar-script-coach/package.json +9 -8
  490. package/skills/skill-webinar-script-coach/tsconfig.json +6 -10
  491. package/skills/skill-wellness-progress-reporter/package.json +9 -8
  492. package/skills/skill-wellness-progress-reporter/tsconfig.json +6 -10
  493. package/skills/skill-workout-cycle-planner/package.json +9 -8
  494. package/skills/skill-workout-cycle-planner/tsconfig.json +6 -10
  495. package/skills/skill-write/LICENSE +192 -21
  496. package/skills/skill-write/package.json +1 -1
  497. package/skills/skill-write/src/index-local.ts +1 -1
  498. package/skills/skill-write/src/index.ts +1 -2
  499. package/skills/skill-write/tsconfig.json +9 -9
  500. package/skills/tsconfig.base.json +12 -0
  501. package/.env.example +0 -18
  502. package/.npmrc.example +0 -1
  503. package/CONTRIBUTING.md +0 -32
  504. package/bunfig.toml +0 -2
  505. package/skills/skill-audio/src/index-http.ts +0 -111
  506. package/skills/skill-browse/install.sh +0 -112
  507. package/skills/skill-browse/src/auth.ts +0 -49
  508. package/skills/skill-browse/src/http-client.ts +0 -128
  509. package/skills/skill-browse/src/index-http.ts +0 -111
  510. package/skills/skill-browse/src/installer.ts +0 -324
  511. package/skills/skill-browse/src/skill-install.ts +0 -205
  512. package/skills/skill-codefix/install.sh +0 -112
  513. package/skills/skill-codefix/src/auth.ts +0 -49
  514. package/skills/skill-codefix/src/http-client.ts +0 -128
  515. package/skills/skill-codefix/src/index-http.ts +0 -111
  516. package/skills/skill-codefix/src/installer.ts +0 -324
  517. package/skills/skill-codefix/src/skill-install.ts +0 -205
  518. package/skills/skill-consolelog/storage/login-error.png +0 -0
  519. package/skills/skill-consolelog/storage/products-page.png +0 -0
  520. package/skills/skill-convert/install.sh +0 -112
  521. package/skills/skill-convert/src/auth.ts +0 -49
  522. package/skills/skill-convert/src/http-client.ts +0 -128
  523. package/skills/skill-convert/src/index-http.ts +0 -111
  524. package/skills/skill-convert/src/installer.ts +0 -324
  525. package/skills/skill-convert/src/skill-install.ts +0 -205
  526. package/skills/skill-deploy/install.sh +0 -112
  527. package/skills/skill-deploy/src/auth.ts +0 -49
  528. package/skills/skill-deploy/src/index-http.ts +0 -111
  529. package/skills/skill-deploy/src/installer.ts +0 -324
  530. package/skills/skill-deploy/src/skill-install.ts +0 -205
  531. package/skills/skill-extract/install.sh +0 -112
  532. package/skills/skill-extract/src/auth.ts +0 -49
  533. package/skills/skill-extract/src/http-client.ts +0 -128
  534. package/skills/skill-extract/src/index-http.ts +0 -111
  535. package/skills/skill-extract/src/installer.ts +0 -324
  536. package/skills/skill-extract/src/skill-install.ts +0 -205
  537. package/skills/skill-image/install.sh +0 -112
  538. package/skills/skill-image/src/auth.ts +0 -49
  539. package/skills/skill-image/src/http-client.ts +0 -128
  540. package/skills/skill-image/src/index-http.ts +0 -111
  541. package/skills/skill-image/src/installer.ts +0 -324
  542. package/skills/skill-image/src/skill-install.ts +0 -205
  543. package/skills/skill-transcript/install.sh +0 -112
  544. package/skills/skill-transcript/src/auth.ts +0 -49
  545. package/skills/skill-transcript/src/http-client.ts +0 -128
  546. package/skills/skill-transcript/src/index-http.ts +0 -111
  547. package/skills/skill-transcript/src/installer.ts +0 -324
  548. package/skills/skill-transcript/src/skill-install.ts +0 -205
  549. package/skills/skill-video/install.sh +0 -112
  550. package/skills/skill-video/src/auth.ts +0 -49
  551. package/skills/skill-video/src/http-client.ts +0 -128
  552. package/skills/skill-video/src/index-http.ts +0 -111
  553. package/skills/skill-video/src/installer.ts +0 -324
  554. package/skills/skill-video/src/skill-install.ts +0 -205
  555. package/skills/skill-write/install.sh +0 -112
  556. package/skills/skill-write/src/auth.ts +0 -49
  557. package/skills/skill-write/src/http-client.ts +0 -128
  558. package/skills/skill-write/src/index-http.ts +0 -111
  559. package/skills/skill-write/src/installer.ts +0 -324
  560. package/skills/skill-write/src/skill-install.ts +0 -205
  561. package/src/cli/cli.test.ts +0 -325
  562. package/src/cli/components/App.tsx +0 -186
  563. package/src/cli/components/CategorySelect.tsx +0 -38
  564. package/src/cli/components/Header.tsx +0 -18
  565. package/src/cli/components/InstallProgress.tsx +0 -97
  566. package/src/cli/components/SearchView.tsx +0 -108
  567. package/src/cli/components/SkillSelect.tsx +0 -92
  568. package/src/cli/index.tsx +0 -559
  569. package/src/index.ts +0 -49
  570. package/src/lib/installer.test.ts +0 -328
  571. package/src/lib/installer.ts +0 -297
  572. package/src/lib/registry.test.ts +0 -147
  573. package/src/lib/skillinfo.test.ts +0 -195
  574. package/src/lib/skillinfo.ts +0 -356
  575. package/src/mcp/index.ts +0 -234
  576. package/src/mcp/mcp.test.ts +0 -212
  577. package/tsconfig.json +0 -17
  578. /package/skills/{skill-audio/src → _common}/auth.ts +0 -0
  579. /package/skills/{skill-audio/src → _common}/http-client.ts +0 -0
  580. /package/skills/{skill-audio → _common}/install.sh +0 -0
  581. /package/skills/{skill-audio/src → _common}/installer.ts +0 -0
  582. /package/skills/{skill-audio/src → _common}/skill-install.ts +0 -0
@@ -1,147 +0,0 @@
1
- import { describe, test, expect } from "bun:test";
2
- import {
3
- SKILLS,
4
- CATEGORIES,
5
- getSkill,
6
- getSkillsByCategory,
7
- searchSkills,
8
- type SkillMeta,
9
- type Category,
10
- } from "./registry";
11
-
12
- describe("registry", () => {
13
- describe("SKILLS", () => {
14
- test("has 200 skills", () => {
15
- expect(SKILLS.length).toBe(200);
16
- });
17
-
18
- test("all skills have required fields", () => {
19
- for (const skill of SKILLS) {
20
- expect(skill.name).toBeTruthy();
21
- expect(skill.displayName).toBeTruthy();
22
- expect(skill.description).toBeTruthy();
23
- expect(skill.category).toBeTruthy();
24
- expect(Array.isArray(skill.tags)).toBe(true);
25
- expect(skill.tags.length).toBeGreaterThanOrEqual(2);
26
- }
27
- });
28
-
29
- test("all skill names are unique", () => {
30
- const names = SKILLS.map((s) => s.name);
31
- const unique = new Set(names);
32
- expect(unique.size).toBe(names.length);
33
- });
34
-
35
- test("all skills belong to a valid category", () => {
36
- const categorySet = new Set(CATEGORIES as readonly string[]);
37
- for (const skill of SKILLS) {
38
- expect(categorySet.has(skill.category)).toBe(true);
39
- }
40
- });
41
- });
42
-
43
- describe("CATEGORIES", () => {
44
- test("has 17 categories", () => {
45
- expect(CATEGORIES.length).toBe(17);
46
- });
47
-
48
- test("all categories are unique", () => {
49
- const unique = new Set(CATEGORIES);
50
- expect(unique.size).toBe(CATEGORIES.length);
51
- });
52
-
53
- test("every category has at least one skill", () => {
54
- for (const category of CATEGORIES) {
55
- const skills = getSkillsByCategory(category);
56
- expect(skills.length).toBeGreaterThan(0);
57
- }
58
- });
59
- });
60
-
61
- describe("getSkill", () => {
62
- test("finds existing skill by name", () => {
63
- const skill = getSkill("deepresearch");
64
- expect(skill).toBeDefined();
65
- expect(skill!.name).toBe("deepresearch");
66
- expect(skill!.displayName).toBe("Deep Research (Agentic)");
67
- });
68
-
69
- test("returns undefined for nonexistent skill", () => {
70
- const skill = getSkill("nonexistent-skill-xyz");
71
- expect(skill).toBeUndefined();
72
- });
73
-
74
- test("finds skill with exact name match", () => {
75
- const skill = getSkill("image");
76
- expect(skill).toBeDefined();
77
- expect(skill!.name).toBe("image");
78
- });
79
- });
80
-
81
- describe("getSkillsByCategory", () => {
82
- test("returns skills for Development Tools", () => {
83
- const skills = getSkillsByCategory("Development Tools");
84
- expect(skills.length).toBe(32);
85
- for (const skill of skills) {
86
- expect(skill.category).toBe("Development Tools");
87
- }
88
- });
89
-
90
- test("returns skills for Health & Wellness", () => {
91
- const skills = getSkillsByCategory("Health & Wellness");
92
- expect(skills.length).toBe(8);
93
- });
94
-
95
- test("returns empty array for invalid category", () => {
96
- const skills = getSkillsByCategory("Not A Category" as Category);
97
- expect(skills.length).toBe(0);
98
- });
99
-
100
- test("total skills across all categories equals SKILLS length", () => {
101
- let total = 0;
102
- for (const category of CATEGORIES) {
103
- total += getSkillsByCategory(category).length;
104
- }
105
- expect(total).toBe(SKILLS.length);
106
- });
107
- });
108
-
109
- describe("searchSkills", () => {
110
- test("finds skills by name", () => {
111
- const results = searchSkills("deepresearch");
112
- expect(results.length).toBeGreaterThanOrEqual(1);
113
- expect(results.some((s) => s.name === "deepresearch")).toBe(true);
114
- });
115
-
116
- test("finds skills by displayName", () => {
117
- const results = searchSkills("Deep Research (Agentic)");
118
- expect(results.length).toBeGreaterThanOrEqual(1);
119
- });
120
-
121
- test("finds skills by description", () => {
122
- const results = searchSkills("invoice");
123
- expect(results.length).toBeGreaterThanOrEqual(1);
124
- });
125
-
126
- test("finds skills by tag", () => {
127
- const results = searchSkills("pdf");
128
- expect(results.length).toBeGreaterThanOrEqual(1);
129
- });
130
-
131
- test("search is case insensitive", () => {
132
- const lower = searchSkills("email");
133
- const upper = searchSkills("EMAIL");
134
- expect(lower.length).toBe(upper.length);
135
- });
136
-
137
- test("returns empty array for no match", () => {
138
- const results = searchSkills("zzzznonexistentzzzzz");
139
- expect(results.length).toBe(0);
140
- });
141
-
142
- test("returns multiple results for broad query", () => {
143
- const results = searchSkills("generate");
144
- expect(results.length).toBeGreaterThan(5);
145
- });
146
- });
147
- });
@@ -1,195 +0,0 @@
1
- import { describe, test, expect, beforeEach, afterEach } from "bun:test";
2
- import { mkdtempSync, mkdirSync, writeFileSync, existsSync, readFileSync } from "fs";
3
- import { join } from "path";
4
- import { tmpdir } from "os";
5
- import {
6
- getSkillDocs,
7
- getSkillBestDoc,
8
- getSkillRequirements,
9
- generateEnvExample,
10
- generateSkillMd,
11
- } from "./skillinfo";
12
- import { installSkill } from "./installer";
13
-
14
- let testDir: string;
15
-
16
- beforeEach(() => {
17
- testDir = mkdtempSync(join(tmpdir(), "skillinfo-test-"));
18
- });
19
-
20
- afterEach(() => {
21
- const { rmSync } = require("fs");
22
- rmSync(testDir, { recursive: true, force: true });
23
- });
24
-
25
- describe("skillinfo", () => {
26
- describe("getSkillDocs", () => {
27
- test("returns docs for skill with SKILL.md", () => {
28
- const docs = getSkillDocs("image");
29
- expect(docs).not.toBeNull();
30
- expect(docs!.skillMd).toBeTruthy();
31
- expect(docs!.skillMd).toContain("Image Generation");
32
- });
33
-
34
- test("returns docs for skill with CLAUDE.md only", () => {
35
- const docs = getSkillDocs("deepresearch");
36
- expect(docs).not.toBeNull();
37
- expect(docs!.claudeMd).toBeTruthy();
38
- });
39
-
40
- test("returns null for nonexistent skill", () => {
41
- const docs = getSkillDocs("nonexistent-xyz");
42
- expect(docs).toBeNull();
43
- });
44
-
45
- test("returns null fields for missing doc files", () => {
46
- const docs = getSkillDocs("scaffold-project");
47
- expect(docs).not.toBeNull();
48
- // At least one doc exists
49
- const hasAny = docs!.skillMd || docs!.readme || docs!.claudeMd;
50
- // scaffold-project has CLAUDE.md at minimum
51
- expect(docs!.claudeMd).toBeTruthy();
52
- });
53
- });
54
-
55
- describe("getSkillBestDoc", () => {
56
- test("returns SKILL.md when available", () => {
57
- const doc = getSkillBestDoc("image");
58
- expect(doc).toBeTruthy();
59
- expect(doc).toContain("Image Generation");
60
- });
61
-
62
- test("falls back to CLAUDE.md", () => {
63
- const doc = getSkillBestDoc("deepresearch");
64
- expect(doc).toBeTruthy();
65
- });
66
-
67
- test("returns null for nonexistent skill", () => {
68
- const doc = getSkillBestDoc("nonexistent-xyz");
69
- expect(doc).toBeNull();
70
- });
71
- });
72
-
73
- describe("getSkillRequirements", () => {
74
- test("extracts env vars from image skill", () => {
75
- const reqs = getSkillRequirements("image");
76
- expect(reqs).not.toBeNull();
77
- expect(reqs!.envVars).toContain("OPENAI_API_KEY");
78
- expect(reqs!.envVars).toContain("GEMINI_API_KEY");
79
- });
80
-
81
- test("extracts CLI command from package.json", () => {
82
- const reqs = getSkillRequirements("image");
83
- expect(reqs).not.toBeNull();
84
- expect(reqs!.cliCommand).toBe("skill-image");
85
- });
86
-
87
- test("extracts CLI command for deep-research", () => {
88
- const reqs = getSkillRequirements("deepresearch");
89
- expect(reqs).not.toBeNull();
90
- expect(reqs!.cliCommand).toBe("skill-deepresearch");
91
- });
92
-
93
- test("returns null for nonexistent skill", () => {
94
- const reqs = getSkillRequirements("nonexistent-xyz");
95
- expect(reqs).toBeNull();
96
- });
97
-
98
- test("returns sorted env vars", () => {
99
- const reqs = getSkillRequirements("image");
100
- expect(reqs).not.toBeNull();
101
- const vars = reqs!.envVars;
102
- const sorted = [...vars].sort();
103
- expect(vars).toEqual(sorted);
104
- });
105
-
106
- test("extracts dependencies from package.json", () => {
107
- const reqs = getSkillRequirements("deepresearch");
108
- expect(reqs).not.toBeNull();
109
- expect(reqs!.dependencies).toHaveProperty("commander");
110
- });
111
- });
112
-
113
- describe("generateEnvExample", () => {
114
- test("returns empty string when no skills installed", () => {
115
- const result = generateEnvExample(testDir);
116
- expect(result).toBe("");
117
- });
118
-
119
- test("returns empty string when .skills dir does not exist", () => {
120
- const result = generateEnvExample(join(testDir, "nonexistent"));
121
- expect(result).toBe("");
122
- });
123
-
124
- test("generates env example from installed skills", () => {
125
- installSkill("image", { targetDir: testDir });
126
- const result = generateEnvExample(testDir);
127
- expect(result).toContain("OPENAI_API_KEY");
128
- expect(result).toContain("GEMINI_API_KEY");
129
- expect(result).toContain("# Used by: image");
130
- });
131
-
132
- test("includes header comments", () => {
133
- installSkill("image", { targetDir: testDir });
134
- const result = generateEnvExample(testDir);
135
- expect(result).toContain("# Environment variables for installed skills");
136
- expect(result).toContain("# Auto-generated by: skills init");
137
- });
138
-
139
- test("groups by provider prefix", () => {
140
- installSkill("image", { targetDir: testDir });
141
- const result = generateEnvExample(testDir);
142
- expect(result).toContain("# OPENAI");
143
- expect(result).toContain("# GEMINI");
144
- });
145
- });
146
-
147
- describe("generateSkillMd", () => {
148
- test("generates SKILL.md for a skill without one", () => {
149
- const md = generateSkillMd("deepresearch");
150
- expect(md).not.toBeNull();
151
- expect(md!).toContain("---");
152
- expect(md!).toContain("name: deepresearch");
153
- expect(md!).toContain("description:");
154
- expect(md!).toContain("Deep Research (Agentic)");
155
- });
156
-
157
- test("generates SKILL.md for a skill with existing SKILL.md source", () => {
158
- // image has a SKILL.md, but generateSkillMd still works
159
- const md = generateSkillMd("image");
160
- expect(md).not.toBeNull();
161
- expect(md!).toContain("name: image");
162
- });
163
-
164
- test("includes category and tags", () => {
165
- const md = generateSkillMd("deepresearch");
166
- expect(md).not.toBeNull();
167
- expect(md!).toContain("Category: Research & Writing");
168
- expect(md!).toContain("Tags:");
169
- });
170
-
171
- test("includes CLI section for skills with bin entry", () => {
172
- const md = generateSkillMd("deepresearch");
173
- expect(md).not.toBeNull();
174
- expect(md!).toContain("## CLI");
175
- expect(md!).toContain("skills run deepresearch");
176
- });
177
-
178
- test("returns null for nonexistent skill", () => {
179
- const md = generateSkillMd("nonexistent-xyz");
180
- expect(md).toBeNull();
181
- });
182
-
183
- test("has valid YAML frontmatter", () => {
184
- const md = generateSkillMd("deepresearch");
185
- expect(md).not.toBeNull();
186
- // Check frontmatter structure
187
- const parts = md!.split("---");
188
- expect(parts.length).toBeGreaterThanOrEqual(3);
189
- // Frontmatter is between first and second ---
190
- const frontmatter = parts[1];
191
- expect(frontmatter).toContain("name:");
192
- expect(frontmatter).toContain("description:");
193
- });
194
- });
195
- });
@@ -1,356 +0,0 @@
1
- /**
2
- * Skill info - reads docs, requirements, and metadata from skill source
3
- */
4
-
5
- import { existsSync, readFileSync, readdirSync } from "fs";
6
- import { join } from "path";
7
- import { getSkillPath } from "./installer.js";
8
- import { getSkill } from "./registry.js";
9
-
10
- export interface SkillDocs {
11
- skillMd: string | null;
12
- readme: string | null;
13
- claudeMd: string | null;
14
- }
15
-
16
- export interface SkillRequirements {
17
- envVars: string[];
18
- systemDeps: string[];
19
- cliCommand: string | null;
20
- dependencies: Record<string, string>;
21
- }
22
-
23
- /**
24
- * Read documentation files from a skill
25
- */
26
- export function getSkillDocs(name: string): SkillDocs | null {
27
- const skillPath = getSkillPath(name);
28
- if (!existsSync(skillPath)) return null;
29
-
30
- return {
31
- skillMd: readIfExists(join(skillPath, "SKILL.md")),
32
- readme: readIfExists(join(skillPath, "README.md")),
33
- claudeMd: readIfExists(join(skillPath, "CLAUDE.md")),
34
- };
35
- }
36
-
37
- /**
38
- * Get the best available documentation for a skill (SKILL.md > README.md > CLAUDE.md)
39
- */
40
- export function getSkillBestDoc(name: string): string | null {
41
- const docs = getSkillDocs(name);
42
- if (!docs) return null;
43
- return docs.skillMd || docs.readme || docs.claudeMd || null;
44
- }
45
-
46
- /**
47
- * Extract requirements from a skill's source files
48
- */
49
- export function getSkillRequirements(name: string): SkillRequirements | null {
50
- const skillPath = getSkillPath(name);
51
- if (!existsSync(skillPath)) return null;
52
-
53
- // Read all text content to scan
54
- const texts: string[] = [];
55
- for (const file of ["SKILL.md", "README.md", "CLAUDE.md", ".env.example", ".env.local.example"]) {
56
- const content = readIfExists(join(skillPath, file));
57
- if (content) texts.push(content);
58
- }
59
- const allText = texts.join("\n");
60
-
61
- // Extract env vars
62
- const envVarPattern = /\b([A-Z][A-Z0-9_]{2,}(?:_API_KEY|_KEY|_TOKEN|_SECRET|_URL|_ID|_PASSWORD|_ENDPOINT|_REGION|_BUCKET))\b/g;
63
- const genericEnvPattern = /\b((?:OPENAI|ANTHROPIC|GEMINI|XAI|ELEVENLABS|DEEPGRAM|REPLICATE|FAL|STABILITY|EXA|FIRECRAWL|TWILIO|SENDGRID|RESEND|SLACK|DISCORD|NOTION|LINEAR|GITHUB|AWS|GOOGLE|CLOUDFLARE|VERCEL|SUPABASE|STRIPE)_[A-Z_]+)\b/g;
64
- const envVars = new Set<string>();
65
- for (const pattern of [envVarPattern, genericEnvPattern]) {
66
- let match;
67
- while ((match = pattern.exec(allText)) !== null) {
68
- envVars.add(match[1]);
69
- }
70
- }
71
-
72
- // Extract system deps
73
- const systemDeps = new Set<string>();
74
- const depPatterns: [RegExp, string][] = [
75
- [/\bffmpeg\b/i, "ffmpeg"],
76
- [/\bplaywright\b/i, "playwright"],
77
- [/\bchromium\b/i, "chromium"],
78
- [/\bpuppeteer\b/i, "puppeteer"],
79
- [/\bpython3?\b/i, "python"],
80
- [/\bdocker\b/i, "docker"],
81
- [/\bpandoc\b/i, "pandoc"],
82
- [/\bimageMagick\b|imagemagick|\bconvert\b.*image/i, "imagemagick"],
83
- [/\bwkhtmltopdf\b/i, "wkhtmltopdf"],
84
- [/\bgit\b(?! ?(hub|lab|ignore))/i, "git"],
85
- ];
86
- for (const [pattern, dep] of depPatterns) {
87
- if (pattern.test(allText)) {
88
- systemDeps.add(dep);
89
- }
90
- }
91
-
92
- // Read CLI command from package.json
93
- let cliCommand: string | null = null;
94
- let dependencies: Record<string, string> = {};
95
- const pkgPath = join(skillPath, "package.json");
96
- if (existsSync(pkgPath)) {
97
- try {
98
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
99
- if (pkg.bin) {
100
- const binKeys = Object.keys(pkg.bin);
101
- if (binKeys.length > 0) cliCommand = binKeys[0];
102
- }
103
- dependencies = pkg.dependencies || {};
104
- } catch {}
105
- }
106
-
107
- return {
108
- envVars: Array.from(envVars).sort(),
109
- systemDeps: Array.from(systemDeps).sort(),
110
- cliCommand,
111
- dependencies,
112
- };
113
- }
114
-
115
- /**
116
- * Run a skill by name with given arguments
117
- */
118
- export async function runSkill(
119
- name: string,
120
- args: string[],
121
- options: { installed?: boolean } = {}
122
- ): Promise<{ exitCode: number; error?: string }> {
123
- // Look in .skills/ first (installed), then fall back to package skills/
124
- const skillName = name.startsWith("skill-") ? name : `skill-${name}`;
125
- let skillPath: string;
126
-
127
- if (options.installed) {
128
- skillPath = join(process.cwd(), ".skills", skillName);
129
- } else {
130
- // Check installed first
131
- const installedPath = join(process.cwd(), ".skills", skillName);
132
- if (existsSync(installedPath)) {
133
- skillPath = installedPath;
134
- } else {
135
- skillPath = getSkillPath(name);
136
- }
137
- }
138
-
139
- if (!existsSync(skillPath)) {
140
- return { exitCode: 1, error: `Skill '${name}' not found` };
141
- }
142
-
143
- // Read package.json for bin entry
144
- const pkgPath = join(skillPath, "package.json");
145
- if (!existsSync(pkgPath)) {
146
- return { exitCode: 1, error: `No package.json in skill '${name}'` };
147
- }
148
-
149
- let entryPoint: string;
150
- try {
151
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
152
- if (pkg.bin) {
153
- const binValues = Object.values(pkg.bin) as string[];
154
- entryPoint = binValues[0];
155
- } else if (pkg.scripts?.dev) {
156
- // Parse "bun run bin/cli.ts" -> "bin/cli.ts"
157
- const devScript = pkg.scripts.dev as string;
158
- const match = devScript.match(/(?:bun\s+run\s+)(.+)/);
159
- entryPoint = match ? match[1] : "bin/cli.ts";
160
- } else {
161
- entryPoint = "bin/cli.ts";
162
- }
163
- } catch {
164
- return { exitCode: 1, error: `Failed to parse package.json for skill '${name}'` };
165
- }
166
-
167
- const entryPath = join(skillPath, entryPoint);
168
- if (!existsSync(entryPath)) {
169
- return { exitCode: 1, error: `Entry point '${entryPoint}' not found in skill '${name}'` };
170
- }
171
-
172
- // Install deps if node_modules missing
173
- const nodeModules = join(skillPath, "node_modules");
174
- if (!existsSync(nodeModules)) {
175
- const install = Bun.spawn(["bun", "install", "--no-save"], {
176
- cwd: skillPath,
177
- stdout: "pipe",
178
- stderr: "pipe",
179
- });
180
- await install.exited;
181
- }
182
-
183
- // Run the skill
184
- const proc = Bun.spawn(["bun", "run", entryPath, ...args], {
185
- cwd: skillPath,
186
- stdout: "inherit",
187
- stderr: "inherit",
188
- stdin: "inherit",
189
- });
190
-
191
- const exitCode = await proc.exited;
192
- return { exitCode };
193
- }
194
-
195
- /**
196
- * Generate a .env.example from installed skills
197
- */
198
- export function generateEnvExample(targetDir: string = process.cwd()): string {
199
- const skillsDir = join(targetDir, ".skills");
200
- if (!existsSync(skillsDir)) return "";
201
-
202
- const dirs = readdirSync(skillsDir).filter(
203
- (f) => f.startsWith("skill-") && existsSync(join(skillsDir, f, "package.json"))
204
- );
205
-
206
- const envMap = new Map<string, string[]>();
207
-
208
- for (const dir of dirs) {
209
- const skillName = dir.replace("skill-", "");
210
- const skillPath = join(skillsDir, dir);
211
-
212
- const texts: string[] = [];
213
- for (const file of ["SKILL.md", "README.md", "CLAUDE.md", ".env.example"]) {
214
- const content = readIfExists(join(skillPath, file));
215
- if (content) texts.push(content);
216
- }
217
- const allText = texts.join("\n");
218
-
219
- const envVarPattern = /\b([A-Z][A-Z0-9_]{2,}(?:_API_KEY|_KEY|_TOKEN|_SECRET|_URL|_ID|_PASSWORD|_ENDPOINT|_REGION|_BUCKET))\b/g;
220
- const genericEnvPattern = /\b((?:OPENAI|ANTHROPIC|GEMINI|XAI|ELEVENLABS|DEEPGRAM|REPLICATE|FAL|STABILITY|EXA|FIRECRAWL|TWILIO|SENDGRID|RESEND|SLACK|DISCORD|NOTION|LINEAR|GITHUB|AWS|GOOGLE|CLOUDFLARE|VERCEL|SUPABASE|STRIPE)_[A-Z_]+)\b/g;
221
-
222
- for (const pattern of [envVarPattern, genericEnvPattern]) {
223
- let match;
224
- while ((match = pattern.exec(allText)) !== null) {
225
- const envVar = match[1];
226
- if (!envMap.has(envVar)) {
227
- envMap.set(envVar, []);
228
- }
229
- if (!envMap.get(envVar)!.includes(skillName)) {
230
- envMap.get(envVar)!.push(skillName);
231
- }
232
- }
233
- }
234
- }
235
-
236
- if (envMap.size === 0) return "";
237
-
238
- const lines = [
239
- "# Environment variables for installed skills",
240
- "# Auto-generated by: skills init",
241
- "",
242
- ];
243
-
244
- // Group by provider prefix
245
- const sorted = Array.from(envMap.entries()).sort(([a], [b]) => a.localeCompare(b));
246
-
247
- let lastPrefix = "";
248
- for (const [envVar, skills] of sorted) {
249
- const prefix = envVar.split("_")[0];
250
- if (prefix !== lastPrefix) {
251
- if (lastPrefix) lines.push("");
252
- lines.push(`# ${prefix}`);
253
- lastPrefix = prefix;
254
- }
255
- lines.push(`# Used by: ${skills.join(", ")}`);
256
- lines.push(`${envVar}=`);
257
- }
258
-
259
- return lines.join("\n") + "\n";
260
- }
261
-
262
- /**
263
- * Generate a SKILL.md for a skill that doesn't have one.
264
- * Builds from registry metadata, README.md/CLAUDE.md content, and package.json info.
265
- */
266
- export function generateSkillMd(name: string): string | null {
267
- const meta = getSkill(name);
268
- if (!meta) return null;
269
-
270
- const skillPath = getSkillPath(name);
271
- if (!existsSync(skillPath)) return null;
272
-
273
- // Build frontmatter
274
- const frontmatter = [
275
- "---",
276
- `name: ${meta.name}`,
277
- `description: ${meta.description}`,
278
- "---",
279
- ].join("\n");
280
-
281
- // Try to extract useful content from existing docs
282
- const readme = readIfExists(join(skillPath, "README.md"));
283
- const claudeMd = readIfExists(join(skillPath, "CLAUDE.md"));
284
-
285
- // Get CLI command from package.json
286
- let cliCommand: string | null = null;
287
- const pkgPath = join(skillPath, "package.json");
288
- if (existsSync(pkgPath)) {
289
- try {
290
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
291
- if (pkg.bin) {
292
- const binKeys = Object.keys(pkg.bin);
293
- if (binKeys.length > 0) cliCommand = binKeys[0];
294
- }
295
- } catch {}
296
- }
297
-
298
- // Build body from available sources
299
- const sections: string[] = [];
300
- sections.push(`# ${meta.displayName}`);
301
- sections.push("");
302
- sections.push(meta.description);
303
-
304
- // Extract content from README (skip title if it duplicates)
305
- if (readme) {
306
- const lines = readme.split("\n");
307
- // Skip first heading if it matches the display name
308
- let startIdx = 0;
309
- if (lines[0]?.startsWith("# ")) {
310
- startIdx = 1;
311
- // Skip blank line after title
312
- if (lines[1]?.trim() === "") startIdx = 2;
313
- }
314
- const body = lines.slice(startIdx).join("\n").trim();
315
- if (body) {
316
- sections.push("");
317
- sections.push(body);
318
- }
319
- } else if (claudeMd) {
320
- const lines = claudeMd.split("\n");
321
- let startIdx = 0;
322
- if (lines[0]?.startsWith("# ")) {
323
- startIdx = 1;
324
- if (lines[1]?.trim() === "") startIdx = 2;
325
- }
326
- const body = lines.slice(startIdx).join("\n").trim();
327
- if (body) {
328
- sections.push("");
329
- sections.push(body);
330
- }
331
- }
332
-
333
- if (cliCommand) {
334
- sections.push("");
335
- sections.push("## CLI");
336
- sections.push("");
337
- sections.push("```bash");
338
- sections.push(`skills run ${meta.name}`);
339
- sections.push("```");
340
- }
341
-
342
- sections.push("");
343
- sections.push(`Category: ${meta.category}`);
344
- sections.push(`Tags: ${meta.tags.join(", ")}`);
345
-
346
- return frontmatter + "\n\n" + sections.join("\n") + "\n";
347
- }
348
-
349
- function readIfExists(path: string): string | null {
350
- try {
351
- if (existsSync(path)) {
352
- return readFileSync(path, "utf-8");
353
- }
354
- } catch {}
355
- return null;
356
- }