@hasna/skills 0.1.21 → 0.1.23

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 (270) hide show
  1. package/bin/index.js +341 -287
  2. package/bin/mcp.js +297 -245
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +79 -24
  5. package/dist/lib/basic-skills.test.d.ts +1 -0
  6. package/dist/lib/registry.d.ts +5 -0
  7. package/dist/lib/search.d.ts +2 -2
  8. package/package.json +1 -1
  9. package/skills/skill-academic-journal-matcher/package.json +1 -7
  10. package/skills/skill-action-item-router/package.json +1 -7
  11. package/skills/skill-ad-creative-generator/package.json +1 -7
  12. package/skills/skill-advanced-math/package.json +1 -7
  13. package/skills/skill-anomaly-investigator/package.json +1 -7
  14. package/skills/skill-api-test-suite/package.json +1 -7
  15. package/skills/skill-apidocs/package.json +0 -6
  16. package/skills/skill-audio/SKILL.md +3 -1
  17. package/skills/skill-audio/package.json +0 -5
  18. package/skills/skill-audio/src/index-local.ts +4 -1
  19. package/skills/skill-audio/src/providers/minimax.ts +83 -0
  20. package/skills/skill-audio/src/types.ts +1 -1
  21. package/skills/skill-audio-cleanup-lab/package.json +1 -5
  22. package/skills/{skill-extract-audio → skill-audio-extract}/SKILL.md +3 -3
  23. package/skills/{skill-extract-audio → skill-audio-extract}/package.json +3 -7
  24. package/skills/skill-audiobook-chapter-proofer/package.json +1 -7
  25. package/skills/skill-banner-ad-suite/package.json +1 -7
  26. package/skills/skill-benchmark-finder/package.json +1 -7
  27. package/skills/skill-bio-sequence-tool/package.json +1 -7
  28. package/skills/skill-blog-topic-cluster/package.json +1 -7
  29. package/skills/skill-brand-voice-audit/package.json +1 -7
  30. package/skills/skill-browse/package.json +0 -5
  31. package/skills/skill-businessactivity/package.json +1 -3
  32. package/skills/skill-calendar-events/package.json +1 -7
  33. package/skills/skill-campaign-metric-brief/package.json +1 -7
  34. package/skills/skill-campaign-moodboard/package.json +1 -7
  35. package/skills/skill-caption-style-stylist/package.json +1 -7
  36. package/skills/skill-chemistry-calculator/package.json +1 -7
  37. package/skills/skill-churn-risk-notifier/package.json +1 -7
  38. package/skills/skill-citation-formatter/package.json +1 -7
  39. package/skills/skill-classroom-newsletter-kit/package.json +1 -7
  40. package/skills/skill-codefix/package.json +0 -4
  41. package/skills/skill-color-palette-harmonizer/package.json +1 -7
  42. package/skills/skill-colorextract/package.json +17 -5
  43. package/skills/skill-commitpush/package.json +0 -1
  44. package/skills/skill-commitpushpr/package.json +0 -1
  45. package/skills/skill-competitor-ad-analyzer/package.json +1 -7
  46. package/skills/skill-compliance-copy-check/package.json +1 -7
  47. package/skills/skill-compliance-report-pack/package.json +1 -7
  48. package/skills/skill-compress-video/package.json +1 -5
  49. package/skills/skill-consolelog/package.json +1 -7
  50. package/skills/skill-contract-plainlanguage/package.json +1 -7
  51. package/skills/skill-convert/SKILL.md +7 -0
  52. package/skills/skill-convert/package.json +0 -4
  53. package/skills/skill-copytone-translator/package.json +1 -7
  54. package/skills/skill-create-blog-article/package.json +1 -7
  55. package/skills/skill-create-ebook/package.json +1 -7
  56. package/skills/skill-crm-note-enhancer/package.json +1 -7
  57. package/skills/skill-customer-journey-mapper/package.json +1 -7
  58. package/skills/skill-dashboard-builder/package.json +1 -7
  59. package/skills/skill-dashboard-narrator/package.json +1 -7
  60. package/skills/skill-data-anonymizer/package.json +1 -7
  61. package/skills/skill-database-explorer/package.json +1 -7
  62. package/skills/skill-dataset-health-check/package.json +1 -7
  63. package/skills/skill-decision-journal/package.json +1 -7
  64. package/skills/skill-deepresearch/package.json +0 -5
  65. package/skills/skill-delegation-brief-writer/package.json +1 -7
  66. package/skills/skill-deploy/package.json +0 -4
  67. package/skills/skill-destination-briefing/package.json +1 -7
  68. package/skills/skill-diff-viewer/package.json +1 -7
  69. package/skills/{skill-generate-docx → skill-doc-generate}/SKILL.md +2 -2
  70. package/skills/{skill-generate-pdf → skill-doc-generate}/package.json +9 -4
  71. package/skills/{skill-generate-docx → skill-doc-generate}/src/index.ts +91 -28
  72. package/skills/skill-doc-read/SKILL.md +45 -0
  73. package/skills/skill-doc-read/package.json +29 -0
  74. package/skills/skill-doc-read/src/index.ts +324 -0
  75. package/skills/skill-doc-read/tsconfig.json +8 -0
  76. package/skills/skill-domainpurchase/package.json +1 -7
  77. package/skills/skill-domainsearch/package.json +1 -7
  78. package/skills/skill-e2bswarm/package.json +0 -6
  79. package/skills/skill-educational-resource-finder/package.json +1 -7
  80. package/skills/skill-email-campaign/package.json +1 -7
  81. package/skills/skill-emoji/package.json +0 -1
  82. package/skills/skill-exam-readiness-check/package.json +1 -7
  83. package/skills/skill-excel/SKILL.md +38 -0
  84. package/skills/skill-excel/package.json +30 -0
  85. package/skills/{skill-generate-excel → skill-excel}/src/index.ts +41 -14
  86. package/skills/skill-experiment-power-calculator/package.json +1 -7
  87. package/skills/skill-extract/package.json +0 -5
  88. package/skills/skill-extract-frames/package.json +1 -7
  89. package/skills/skill-extract-invoice/package.json +1 -7
  90. package/skills/skill-family-activity-curator/package.json +1 -7
  91. package/skills/skill-faq-packager/package.json +1 -7
  92. package/skills/skill-feedback-survey-designer/package.json +1 -7
  93. package/skills/skill-field-trip-planner/package.json +1 -7
  94. package/skills/skill-file-organizer/package.json +1 -7
  95. package/skills/skill-folder-tree/package.json +1 -7
  96. package/skills/skill-forecast-scenario-lab/package.json +1 -7
  97. package/skills/skill-form-filler/package.json +1 -7
  98. package/skills/skill-generate-api-client/package.json +1 -7
  99. package/skills/skill-generate-book-cover/package.json +1 -7
  100. package/skills/skill-generate-chart/package.json +1 -7
  101. package/skills/skill-generate-diagram/package.json +1 -7
  102. package/skills/skill-generate-dockerfile/package.json +1 -7
  103. package/skills/skill-generate-documentation/package.json +1 -7
  104. package/skills/skill-generate-env/package.json +1 -7
  105. package/skills/skill-generate-favicon/package.json +1 -7
  106. package/skills/skill-generate-mock-data/package.json +1 -7
  107. package/skills/skill-generate-pr-description/package.json +1 -7
  108. package/skills/skill-generate-presentation/package.json +1 -7
  109. package/skills/skill-generate-qrcode/package.json +1 -7
  110. package/skills/skill-generate-regex/package.json +1 -7
  111. package/skills/skill-generate-resume/package.json +1 -7
  112. package/skills/skill-generate-sitemap/package.json +1 -7
  113. package/skills/skill-generate-social-posts/package.json +1 -7
  114. package/skills/skill-generate-sql/package.json +1 -7
  115. package/skills/skill-gif-maker/package.json +1 -7
  116. package/skills/skill-github-manager/package.json +1 -7
  117. package/skills/skill-gmail/package.json +1 -7
  118. package/skills/skill-goal-quarterly-roadmap/package.json +1 -7
  119. package/skills/skill-grant-application-drafter/package.json +1 -7
  120. package/skills/skill-grocery-basket-optimizer/package.json +1 -7
  121. package/skills/skill-guest-communication-suite/package.json +1 -7
  122. package/skills/skill-habit-reflection-digest/package.json +1 -7
  123. package/skills/skill-highlight-reel-generator/package.json +1 -7
  124. package/skills/skill-homework-feedback-coach/package.json +1 -7
  125. package/skills/skill-hook/package.json +0 -6
  126. package/skills/skill-household-maintenance-mgr/package.json +1 -7
  127. package/skills/skill-http-server/package.json +1 -7
  128. package/skills/skill-image/SKILL.md +2 -0
  129. package/skills/skill-image/package.json +0 -5
  130. package/skills/skill-image/src/index-local.ts +5 -3
  131. package/skills/skill-image/src/providers/minimax.ts +94 -0
  132. package/skills/skill-image/src/types.ts +1 -1
  133. package/skills/skill-implementation/package.json +0 -6
  134. package/skills/skill-implementation-agent/package.json +1 -7
  135. package/skills/skill-implementation-plan/package.json +1 -7
  136. package/skills/skill-implementation-todo/package.json +1 -7
  137. package/skills/skill-inbox-priority-planner/package.json +1 -7
  138. package/skills/skill-invoice-dispute-helper/package.json +1 -7
  139. package/skills/skill-itinerary-architect/package.json +1 -7
  140. package/skills/skill-kpi-digest-generator/package.json +1 -7
  141. package/skills/skill-lab-notebook-formatter/package.json +1 -7
  142. package/skills/skill-landing-page-copy/package.json +1 -7
  143. package/skills/skill-latex-table-generator/package.json +1 -7
  144. package/skills/skill-learning-style-profiler/package.json +1 -7
  145. package/skills/skill-lesson-plan-customizer/package.json +1 -7
  146. package/skills/skill-livestream-runofshow/package.json +1 -7
  147. package/skills/skill-longform-structurer/package.json +1 -7
  148. package/skills/skill-lorem-generator/package.json +1 -7
  149. package/skills/skill-managehook/package.json +1 -3
  150. package/skills/skill-managemcp/package.json +1 -3
  151. package/skills/skill-manageskill/package.json +1 -3
  152. package/skills/skill-markdown-validator/package.json +1 -7
  153. package/skills/skill-mcp-builder/package.json +1 -7
  154. package/skills/skill-meal-plan-designer/package.json +1 -7
  155. package/skills/skill-meeting-insight-summarizer/package.json +1 -7
  156. package/skills/skill-merge-pdfs/package.json +1 -7
  157. package/skills/skill-microcopy-generator/package.json +1 -7
  158. package/skills/skill-mindfulness-prompt-cache/package.json +1 -7
  159. package/skills/skill-monitor/package.json +0 -1
  160. package/skills/skill-music/CLAUDE.md +9 -0
  161. package/skills/skill-music/SKILL.md +35 -0
  162. package/skills/{skill-generate-excel → skill-music}/package.json +4 -10
  163. package/skills/skill-music/src/index.ts +192 -0
  164. package/skills/skill-notion-manager/package.json +1 -7
  165. package/skills/skill-npmpublish/package.json +0 -5
  166. package/skills/skill-onboarding-sequence-builder/package.json +1 -7
  167. package/skills/skill-onsite-ops-checklist/package.json +1 -7
  168. package/skills/skill-outreach-cadence-designer/package.json +1 -7
  169. package/skills/skill-packaging-concept-studio/package.json +1 -7
  170. package/skills/skill-packing-plan-pro/package.json +1 -7
  171. package/skills/skill-parent-teacher-brief/package.json +1 -7
  172. package/skills/skill-partner-kit-assembler/package.json +1 -7
  173. package/skills/skill-payroll-change-prepper/package.json +1 -7
  174. package/skills/{skill-generate-pdf → skill-pdf-generate}/SKILL.md +2 -2
  175. package/skills/{skill-generate-docx → skill-pdf-generate}/package.json +6 -4
  176. package/skills/{skill-generate-pdf → skill-pdf-generate}/src/index.ts +109 -8
  177. package/skills/skill-pdf-read/SKILL.md +56 -0
  178. package/skills/skill-pdf-read/package.json +29 -0
  179. package/skills/skill-pdf-read/src/index.ts +320 -0
  180. package/skills/skill-pdf-read/tsconfig.json +8 -0
  181. package/skills/skill-persona-based-adwriter/package.json +1 -7
  182. package/skills/skill-persona-generator/package.json +1 -7
  183. package/skills/skill-personal-daily-ops/package.json +1 -7
  184. package/skills/skill-pet-care-scheduler/package.json +1 -7
  185. package/skills/skill-podcast-show-notes/package.json +1 -7
  186. package/skills/skill-presentation-theme-maker/package.json +1 -7
  187. package/skills/skill-press-release-drafter/package.json +1 -7
  188. package/skills/skill-print-collateral-designer/package.json +1 -7
  189. package/skills/skill-procurement-scorecard/package.json +1 -7
  190. package/skills/skill-product-demo-script/package.json +1 -7
  191. package/skills/skill-product-mockup/package.json +1 -7
  192. package/skills/skill-project-retro-companion/package.json +1 -7
  193. package/skills/skill-proposal-redline-advisor/package.json +1 -7
  194. package/skills/skill-read-csv/SKILL.md +1 -1
  195. package/skills/skill-read-csv/package.json +0 -1
  196. package/skills/skill-read-csv/src/index.ts +30 -5
  197. package/skills/skill-read-excel/SKILL.md +1 -1
  198. package/skills/skill-read-excel/package.json +0 -1
  199. package/skills/skill-read-excel/src/index.ts +21 -8
  200. package/skills/skill-read-image/SKILL.md +1 -1
  201. package/skills/skill-read-image/package.json +0 -1
  202. package/skills/skill-read-pdf/SKILL.md +1 -1
  203. package/skills/skill-read-pdf/package.json +0 -1
  204. package/skills/skill-read-pdf/src/index.ts +15 -3
  205. package/skills/skill-regex-tester/package.json +1 -7
  206. package/skills/skill-remove-background/package.json +1 -7
  207. package/skills/skill-risk-disclosure-kit/package.json +1 -7
  208. package/skills/skill-roi-comparison-tool/package.json +1 -7
  209. package/skills/skill-sales-call-recapper/package.json +1 -7
  210. package/skills/skill-scaffold-project/package.json +1 -7
  211. package/skills/skill-scancommitpr/package.json +0 -2
  212. package/skills/skill-scancommitpush/package.json +0 -2
  213. package/skills/skill-scholarship-tracker/package.json +1 -7
  214. package/skills/skill-scientific-figure-check/package.json +1 -7
  215. package/skills/skill-seating-chart-maker/package.json +1 -7
  216. package/skills/skill-security-audit/package.json +1 -7
  217. package/skills/skill-seo-brief-builder/package.json +1 -7
  218. package/skills/skill-siteanalyze/package.json +19 -5
  219. package/skills/skill-slack-assistant/package.json +1 -7
  220. package/skills/skill-sleep-routine-analyzer/package.json +1 -7
  221. package/skills/skill-sms/package.json +0 -1
  222. package/skills/skill-social-media-kit/package.json +1 -7
  223. package/skills/skill-sound-effects/SKILL.md +34 -0
  224. package/skills/{skill-jingle-composer → skill-sound-effects}/package.json +4 -10
  225. package/skills/skill-sound-effects/src/index.ts +172 -0
  226. package/skills/skill-sound-effects/tsconfig.json +8 -0
  227. package/skills/skill-split-pdf/package.json +1 -7
  228. package/skills/skill-sponsorship-proposal-lab/package.json +1 -7
  229. package/skills/skill-spreadsheet-cleanroom/package.json +1 -7
  230. package/skills/skill-statistical-test-selector/package.json +1 -7
  231. package/skills/skill-stress-relief-playbook/package.json +1 -7
  232. package/skills/skill-study-guide-builder/package.json +1 -7
  233. package/skills/skill-subscription-spend-watcher/package.json +1 -7
  234. package/skills/skill-subtitle/package.json +0 -6
  235. package/skills/skill-survey-insight-extractor/package.json +1 -7
  236. package/skills/skill-terraform-generator/package.json +1 -7
  237. package/skills/skill-testimonial-graphics/package.json +1 -7
  238. package/skills/skill-timesheet/package.json +0 -6
  239. package/skills/skill-tmux-session/package.json +0 -1
  240. package/skills/skill-transcript/SKILL.md +3 -1
  241. package/skills/skill-transcript/package.json +0 -5
  242. package/skills/skill-travel-budget-balancer/package.json +1 -7
  243. package/skills/skill-validate-config/package.json +1 -7
  244. package/skills/skill-video/SKILL.md +3 -1
  245. package/skills/skill-video/package.json +0 -5
  246. package/skills/skill-video/src/providers/index.ts +4 -1
  247. package/skills/skill-video/src/providers/minimax.ts +100 -0
  248. package/skills/skill-video/src/types.ts +1 -1
  249. package/skills/skill-video-cut-suggester/package.json +1 -7
  250. package/skills/skill-video-downloader/package.json +1 -7
  251. package/skills/skill-video-thumbnail/package.json +1 -7
  252. package/skills/skill-voiceover-casting-assistant/package.json +1 -7
  253. package/skills/skill-watermark/package.json +1 -7
  254. package/skills/skill-webcrawling/package.json +11 -8
  255. package/skills/skill-webinar-script-coach/package.json +1 -7
  256. package/skills/skill-wellness-progress-reporter/package.json +1 -7
  257. package/skills/skill-workout-cycle-planner/package.json +1 -7
  258. package/skills/skill-write/package.json +0 -5
  259. package/skills/skill-jingle-composer/CLAUDE.md +0 -19
  260. package/skills/skill-jingle-composer/src/index.ts +0 -250
  261. /package/skills/{skill-extract-audio → skill-audio-extract}/CLAUDE.md +0 -0
  262. /package/skills/{skill-extract-audio → skill-audio-extract}/src/index.ts +0 -0
  263. /package/skills/{skill-extract-audio → skill-audio-extract}/tsconfig.json +0 -0
  264. /package/skills/{skill-generate-docx → skill-doc-generate}/CLAUDE.md +0 -0
  265. /package/skills/{skill-generate-docx → skill-doc-generate}/tsconfig.json +0 -0
  266. /package/skills/{skill-generate-excel → skill-excel}/CLAUDE.md +0 -0
  267. /package/skills/{skill-generate-excel → skill-excel}/tsconfig.json +0 -0
  268. /package/skills/{skill-jingle-composer → skill-music}/tsconfig.json +0 -0
  269. /package/skills/{skill-generate-pdf → skill-pdf-generate}/CLAUDE.md +0 -0
  270. /package/skills/{skill-generate-pdf → skill-pdf-generate}/tsconfig.json +0 -0
@@ -2,7 +2,11 @@
2
2
 
3
3
  import { mkdir, writeFile } from "fs/promises";
4
4
  import { dirname, resolve } from "path";
5
- import * as XLSX from "xlsx";
5
+
6
+ type XlsxModule = typeof import("xlsx");
7
+ type WorkBook = import("xlsx").WorkBook;
8
+ type WorkSheet = import("xlsx").WorkSheet;
9
+ type CellObject = import("xlsx").CellObject;
6
10
 
7
11
  const VERSION = "0.1.0";
8
12
 
@@ -39,6 +43,14 @@ interface WorkbookResult {
39
43
  sheets: SheetResult[];
40
44
  }
41
45
 
46
+ async function loadXlsx(): Promise<XlsxModule> {
47
+ try {
48
+ return await import("xlsx");
49
+ } catch {
50
+ throw new Error("Missing dependency 'xlsx'. Run bun install in this skill directory.");
51
+ }
52
+ }
53
+
42
54
  function printHelp(): void {
43
55
  console.log(`skill-read-excel v${VERSION}
44
56
 
@@ -141,7 +153,7 @@ function inferHeader(rows: unknown[][]): boolean {
141
153
  return unique.size === first.length && mostlyText && secondHasNumeric;
142
154
  }
143
155
 
144
- function collectFormattedCells(sheet: XLSX.WorkSheet, maxCells = 50): Array<{ cell: string; raw?: unknown; formatted?: string; format?: string }> {
156
+ function collectFormattedCells(sheet: WorkSheet, maxCells = 50): Array<{ cell: string; raw?: unknown; formatted?: string; format?: string }> {
145
157
  const result: Array<{ cell: string; raw?: unknown; formatted?: string; format?: string }> = [];
146
158
  const entries = Object.entries(sheet).filter(([key]) => !key.startsWith("!"));
147
159
 
@@ -149,7 +161,7 @@ function collectFormattedCells(sheet: XLSX.WorkSheet, maxCells = 50): Array<{ ce
149
161
  if (result.length >= maxCells) {
150
162
  break;
151
163
  }
152
- const cellValue = value as XLSX.CellObject;
164
+ const cellValue = value as CellObject;
153
165
  if (cellValue.z || cellValue.w) {
154
166
  result.push({
155
167
  cell,
@@ -163,8 +175,8 @@ function collectFormattedCells(sheet: XLSX.WorkSheet, maxCells = 50): Array<{ ce
163
175
  return result;
164
176
  }
165
177
 
166
- function parseSheet(name: string, index: number, sheet: XLSX.WorkSheet, limit?: number): SheetResult {
167
- const rows = XLSX.utils.sheet_to_json(sheet, {
178
+ function parseSheet(xlsx: XlsxModule, name: string, index: number, sheet: WorkSheet, limit?: number): SheetResult {
179
+ const rows = xlsx.utils.sheet_to_json(sheet, {
168
180
  header: 1,
169
181
  defval: null,
170
182
  raw: false,
@@ -198,7 +210,7 @@ function parseSheet(name: string, index: number, sheet: XLSX.WorkSheet, limit?:
198
210
  };
199
211
  }
200
212
 
201
- function collectNamedRanges(workbook: XLSX.WorkBook): NamedRange[] {
213
+ function collectNamedRanges(workbook: WorkBook): NamedRange[] {
202
214
  const names = workbook.Workbook?.Names ?? [];
203
215
  return names.map((entry) => ({
204
216
  name: entry.Name ?? "",
@@ -214,8 +226,9 @@ async function writeJson(path: string, payload: WorkbookResult): Promise<void> {
214
226
 
215
227
  async function main(): Promise<void> {
216
228
  const options = parseArgs(process.argv.slice(2));
229
+ const xlsx = await loadXlsx();
217
230
  const inputPath = resolve(options.input!);
218
- const workbook = XLSX.readFile(inputPath, {
231
+ const workbook = xlsx.readFile(inputPath, {
219
232
  cellDates: true,
220
233
  cellNF: true,
221
234
  cellStyles: true,
@@ -236,7 +249,7 @@ async function main(): Promise<void> {
236
249
  sheetNames: workbook.SheetNames,
237
250
  namedRanges: collectNamedRanges(workbook),
238
251
  },
239
- sheets: selectedSheetNames.map((name) => parseSheet(name, workbook.SheetNames.indexOf(name), workbook.Sheets[name], options.limit)),
252
+ sheets: selectedSheetNames.map((name) => parseSheet(xlsx, name, workbook.SheetNames.indexOf(name), workbook.Sheets[name], options.limit)),
240
253
  };
241
254
 
242
255
  if (options.output) {
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: skill-read-image
2
+ name: read-image
3
3
  description: Analyze an image from a local path or URL with Claude vision. Supports prompt-controlled description, OCR, object counting, and brand/visual extraction.
4
4
  ---
5
5
 
@@ -22,7 +22,6 @@
22
22
  "claude",
23
23
  "skill"
24
24
  ],
25
- "license": "Apache-2.0",
26
25
  "scripts": {
27
26
  "start": "bun run src/index.ts",
28
27
  "typecheck": "tsc --noEmit"
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: skill-read-pdf
2
+ name: read-pdf
3
3
  description: Analyze PDF files with Claude document blocks. Supports page-range selection, 20-page chunking, and merged structured output.
4
4
  ---
5
5
 
@@ -22,7 +22,6 @@
22
22
  "ocr",
23
23
  "skill"
24
24
  ],
25
- "license": "Apache-2.0",
26
25
  "scripts": {
27
26
  "start": "bun run src/index.ts",
28
27
  "typecheck": "tsc --noEmit"
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { mkdir, readFile, writeFile } from "fs/promises";
4
4
  import { dirname, resolve } from "path";
5
- import { PDFDocument } from "pdf-lib";
6
5
 
7
6
  const VERSION = "0.1.0";
8
7
  const DEFAULT_MODEL = process.env.ANTHROPIC_MODEL || "claude-sonnet-4-20250514";
@@ -11,6 +10,8 @@ const DEFAULT_PROMPT =
11
10
  const API_URL = process.env.ANTHROPIC_API_URL || "https://api.anthropic.com/v1/messages";
12
11
  const MAX_CHUNK_SIZE = 20;
13
12
  const MAX_REQUEST_BYTES = 32 * 1024 * 1024;
13
+ type PdfLib = typeof import("pdf-lib");
14
+ type LoadedPdfDocument = Awaited<ReturnType<PdfLib["PDFDocument"]["load"]>>;
14
15
 
15
16
  type OutputFormat = "json" | "markdown" | "text";
16
17
 
@@ -180,6 +181,14 @@ async function loadPdfBytes(input: string): Promise<{ input: string; bytes: Uint
180
181
  };
181
182
  }
182
183
 
184
+ async function loadPdfLib(): Promise<PdfLib> {
185
+ try {
186
+ return await import("pdf-lib");
187
+ } catch {
188
+ throw new Error("Missing dependency 'pdf-lib'. Run bun install in this skill directory.");
189
+ }
190
+ }
191
+
183
192
  function parsePageRanges(spec: string | undefined, totalPages: number): number[] {
184
193
  if (!spec) {
185
194
  return Array.from({ length: totalPages }, (_, index) => index + 1);
@@ -223,7 +232,8 @@ function chunkPages(pages: number[], size: number): number[][] {
223
232
  return chunks;
224
233
  }
225
234
 
226
- async function buildChunkPdf(sourcePdf: PDFDocument, pages: number[]): Promise<Uint8Array> {
235
+ async function buildChunkPdf(pdfLib: PdfLib, sourcePdf: LoadedPdfDocument, pages: number[]): Promise<Uint8Array> {
236
+ const { PDFDocument } = pdfLib;
227
237
  const output = await PDFDocument.create();
228
238
  const copiedPages = await output.copyPages(sourcePdf, pages.map((page) => page - 1));
229
239
  for (const page of copiedPages) {
@@ -315,6 +325,8 @@ async function writeOutput(path: string, value: string): Promise<void> {
315
325
 
316
326
  async function main(): Promise<void> {
317
327
  const options = parseArgs(process.argv.slice(2));
328
+ const pdfLib = await loadPdfLib();
329
+ const { PDFDocument } = pdfLib;
318
330
  const { input, bytes } = await loadPdfBytes(options.input!);
319
331
  const sourcePdf = await PDFDocument.load(bytes);
320
332
  const totalPages = sourcePdf.getPageCount();
@@ -325,7 +337,7 @@ async function main(): Promise<void> {
325
337
 
326
338
  for (let index = 0; index < pageChunks.length; index += 1) {
327
339
  const pages = pageChunks[index];
328
- const chunkPdf = await buildChunkPdf(sourcePdf, pages);
340
+ const chunkPdf = await buildChunkPdf(pdfLib, sourcePdf, pages);
329
341
  const prompt = [
330
342
  options.prompt,
331
343
  formatInstruction(options.format),
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-regex-tester.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-remove-background.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-risk-disclosure-kit.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-roi-comparison-tool.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-sales-call-recapper.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -25,11 +25,5 @@
25
25
  "files": [
26
26
  "src",
27
27
  "tsconfig.json"
28
- ],
29
- "repository": {
30
- "type": "git",
31
- "url": "https://github.com/hasnaxyz/skill-scaffold-project.git"
32
- },
33
- "author": "Hasna",
34
- "license": "Apache-2.0"
28
+ ]
35
29
  }
@@ -21,8 +21,6 @@
21
21
  "claude-code",
22
22
  "skill"
23
23
  ],
24
- "author": "Hasna",
25
- "license": "Apache-2.0",
26
24
  "devDependencies": {
27
25
  "@types/bun": "latest"
28
26
  },
@@ -19,8 +19,6 @@
19
19
  "claude-code",
20
20
  "skill"
21
21
  ],
22
- "author": "Hasna",
23
- "license": "Apache-2.0",
24
22
  "devDependencies": {
25
23
  "@types/bun": "latest"
26
24
  },
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-scholarship-tracker.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-scientific-figure-check.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-seating-chart-maker.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-security-audit.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-seo-brief-builder.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -4,10 +4,24 @@
4
4
  "description": "Analyze any website's design system — detects shadcn/ui, Tailwind, extracts colors, typography, and components",
5
5
  "main": "src/index.ts",
6
6
  "type": "module",
7
- "bin": { "skill-siteanalyze": "src/index.ts" },
8
- "scripts": { "start": "bun run src/index.ts" },
9
- "keywords": ["design", "shadcn", "tailwind", "colors", "typography", "playwright", "analysis", "open-styles"],
10
- "license": "Apache-2.0",
7
+ "bin": {
8
+ "skill-siteanalyze": "src/index.ts"
9
+ },
10
+ "scripts": {
11
+ "start": "bun run src/index.ts"
12
+ },
13
+ "keywords": [
14
+ "design",
15
+ "shadcn",
16
+ "tailwind",
17
+ "colors",
18
+ "typography",
19
+ "playwright",
20
+ "analysis",
21
+ "open-styles"
22
+ ],
11
23
  "dependencies": {},
12
- "devDependencies": { "@types/bun": "latest" }
24
+ "devDependencies": {
25
+ "@types/bun": "latest"
26
+ }
13
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-slack-assistant.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-sleep-routine-analyzer.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -23,7 +23,6 @@
23
23
  "agent"
24
24
  ],
25
25
  "author": "",
26
- "license": "Apache-2.0",
27
26
  "devDependencies": {
28
27
  "@types/bun": "latest"
29
28
  },
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-social-media-kit.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: sound-effects
3
+ version: 0.1.0
4
+ description: Generate sound effects using AI models (Minimax)
5
+ category: Media Processing
6
+ tags:
7
+ - audio
8
+ - sound-effects
9
+ - sfx
10
+ - ai
11
+ - generation
12
+ ---
13
+
14
+ # Sound Effects
15
+
16
+ Generate realistic sound effects from text descriptions using AI. Describe any sound — thunder, footsteps, explosions, ambient noise — and get a high-quality audio file.
17
+
18
+ ## Features
19
+
20
+ - **Text-to-SFX**: Describe any sound and get an audio file
21
+ - **Duration Control**: Set the desired length of the sound effect
22
+ - **Multiple Formats**: Output to MP3, WAV, or other audio formats
23
+
24
+ ## Usage
25
+
26
+ ```bash
27
+ skill-sound-effects generate --prompt "thunder rolling in the distance" --output ./thunder.mp3
28
+ skill-sound-effects generate --prompt "footsteps on gravel" --duration 5 --output ./steps.mp3
29
+ skill-sound-effects generate --prompt "spaceship engine humming" --output ./engine.mp3
30
+ ```
31
+
32
+ ## Environment Variables
33
+
34
+ - `MINIMAX_API_KEY` — API key for Minimax (required)
@@ -1,10 +1,10 @@
1
1
  {
2
- "name": "@hasnaxyz/skill-jingle-composer",
2
+ "name": "@hasnaxyz/skill-sound-effects",
3
3
  "version": "0.1.0",
4
- "description": "Jingle Composer skill",
4
+ "description": "Generate sound effects using AI (Minimax)",
5
5
  "type": "module",
6
6
  "bin": {
7
- "skill-jingle-composer": "./src/index.ts"
7
+ "skill-sound-effects": "./src/index.ts"
8
8
  },
9
9
  "scripts": {
10
10
  "dev": "bun run src/index.ts",
@@ -23,11 +23,5 @@
23
23
  "files": [
24
24
  "src",
25
25
  "tsconfig.json"
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/hasnaxyz/skill-jingle-composer.git"
30
- },
31
- "author": "Hasna",
32
- "license": "Apache-2.0"
26
+ ]
33
27
  }
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { writeFile, mkdir } from 'fs/promises';
4
+ import { resolve, dirname } from 'path';
5
+ import { handleInstallCommand } from '../../_common';
6
+
7
+ const SKILL_META = {
8
+ name: 'skill-sound-effects',
9
+ description: 'Generate sound effects using AI (Minimax)',
10
+ version: '1.0.0',
11
+ commands: `Use: skill-sound-effects --help`,
12
+ requiredEnvVars: ['MINIMAX_API_KEY'],
13
+ };
14
+
15
+ if (await handleInstallCommand(SKILL_META, process.argv.slice(2))) {
16
+ process.exit(0);
17
+ }
18
+
19
+ type Provider = 'minimax';
20
+
21
+ interface GenerateOptions {
22
+ provider: Provider;
23
+ prompt: string;
24
+ output: string;
25
+ duration?: number;
26
+ }
27
+
28
+ function parseArgs(): GenerateOptions | null {
29
+ const args = process.argv.slice(2);
30
+
31
+ if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
32
+ printHelp();
33
+ return null;
34
+ }
35
+
36
+ if (args[0] !== 'generate') {
37
+ console.error(`Unknown command: ${args[0]}`);
38
+ process.exit(1);
39
+ }
40
+
41
+ const options: Partial<GenerateOptions> = { provider: 'minimax' };
42
+
43
+ for (let i = 1; i < args.length; i++) {
44
+ switch (args[i]) {
45
+ case '--provider': case '-p': options.provider = args[++i] as Provider; break;
46
+ case '--prompt': options.prompt = args[++i]; break;
47
+ case '--output': case '-o': options.output = args[++i]; break;
48
+ case '--duration': options.duration = parseInt(args[++i]); break;
49
+ default: console.error(`Unknown option: ${args[i]}`); process.exit(1);
50
+ }
51
+ }
52
+
53
+ if (!options.prompt) { console.error('Error: --prompt is required'); process.exit(1); }
54
+ if (!options.output) { console.error('Error: --output is required'); process.exit(1); }
55
+
56
+ return options as GenerateOptions;
57
+ }
58
+
59
+ function printHelp() {
60
+ console.log(`
61
+ Sound Effects Generation Skill
62
+
63
+ Generate sound effects using AI models (Minimax)
64
+
65
+ USAGE:
66
+ skill-sound-effects generate [OPTIONS]
67
+
68
+ OPTIONS:
69
+ --provider, -p <provider> Provider (minimax) [default: minimax]
70
+ --prompt <text> Description of the sound effect [required]
71
+ --output, -o <path> Output file path [required]
72
+ --duration <seconds> Duration in seconds
73
+
74
+ EXAMPLES:
75
+ skill-sound-effects generate --prompt "thunder rolling" --output ./thunder.mp3
76
+ skill-sound-effects generate --prompt "footsteps on gravel" --duration 5 --output ./steps.mp3
77
+ skill-sound-effects generate --prompt "rain on a tin roof" --output ./rain.mp3
78
+
79
+ ENVIRONMENT VARIABLES:
80
+ MINIMAX_API_KEY API key for Minimax
81
+ `);
82
+ }
83
+
84
+ async function generateMinimax(options: GenerateOptions): Promise<Buffer> {
85
+ const apiKey = process.env.MINIMAX_API_KEY;
86
+ if (!apiKey) throw new Error('MINIMAX_API_KEY environment variable is required');
87
+
88
+ const baseUrl = 'https://api.minimax.chat/v1';
89
+
90
+ console.log(`Generating sound effect with Minimax...`);
91
+ console.log(`Prompt: ${options.prompt}`);
92
+
93
+ const body: Record<string, unknown> = {
94
+ model: 'sound-effects-01',
95
+ prompt: options.prompt,
96
+ };
97
+ if (options.duration) body.duration = options.duration;
98
+
99
+ const headers: Record<string, string> = {
100
+ 'Content-Type': 'application/json',
101
+ 'Authorization': `Bearer ${apiKey}`,
102
+ };
103
+
104
+ const response = await fetch(`${baseUrl}/sound_generation`, {
105
+ method: 'POST',
106
+ headers,
107
+ body: JSON.stringify(body),
108
+ });
109
+
110
+ if (!response.ok) {
111
+ const err = await response.text();
112
+ throw new Error(`Minimax API error: ${response.status} - ${err}`);
113
+ }
114
+
115
+ const data = await response.json() as { task_id: string };
116
+ console.log(`Task started: ${data.task_id}`);
117
+ console.log('Polling for completion...');
118
+
119
+ for (let i = 0; i < 60; i++) {
120
+ await new Promise(r => setTimeout(r, 3000));
121
+
122
+ const statusRes = await fetch(`${baseUrl}/query/sound_generation?task_id=${data.task_id}`, {
123
+ headers: { 'Authorization': `Bearer ${apiKey}` },
124
+ });
125
+ const status = await statusRes.json() as {
126
+ status: string;
127
+ extra_info?: { audio_url?: string };
128
+ audio_file?: string;
129
+ base_resp?: { status_msg: string };
130
+ };
131
+
132
+ if (status.status === 'Success') {
133
+ const audioUrl = status.extra_info?.audio_url || status.audio_file;
134
+ if (!audioUrl) throw new Error('No audio URL in response');
135
+
136
+ console.log('Sound effect generated. Downloading...');
137
+ const audioRes = await fetch(audioUrl);
138
+ if (!audioRes.ok) throw new Error(`Download failed: ${audioRes.status}`);
139
+ return Buffer.from(await audioRes.arrayBuffer());
140
+ }
141
+
142
+ if (status.status === 'Fail') {
143
+ throw new Error(`Sound effect generation failed: ${status.base_resp?.status_msg || 'Unknown error'}`);
144
+ }
145
+ }
146
+
147
+ throw new Error('Sound effect generation timed out');
148
+ }
149
+
150
+ async function main() {
151
+ const options = parseArgs();
152
+ if (!options) return;
153
+
154
+ try {
155
+ console.log('\n=== Sound Effect Generation ===\n');
156
+
157
+ const buffer = await generateMinimax(options);
158
+
159
+ const outputPath = resolve(options.output);
160
+ await mkdir(dirname(outputPath), { recursive: true });
161
+ await writeFile(outputPath, buffer);
162
+
163
+ console.log(`\nSound effect saved to: ${outputPath}`);
164
+ console.log(`Size: ${(buffer.length / 1024).toFixed(1)} KB`);
165
+ console.log('\nDone!\n');
166
+ } catch (error) {
167
+ console.error('\nError:', error instanceof Error ? error.message : error);
168
+ process.exit(1);
169
+ }
170
+ }
171
+
172
+ main();