@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.
- package/bin/index.js +341 -287
- package/bin/mcp.js +297 -245
- package/dist/index.d.ts +1 -1
- package/dist/index.js +79 -24
- package/dist/lib/basic-skills.test.d.ts +1 -0
- package/dist/lib/registry.d.ts +5 -0
- package/dist/lib/search.d.ts +2 -2
- package/package.json +1 -1
- package/skills/skill-academic-journal-matcher/package.json +1 -7
- package/skills/skill-action-item-router/package.json +1 -7
- package/skills/skill-ad-creative-generator/package.json +1 -7
- package/skills/skill-advanced-math/package.json +1 -7
- package/skills/skill-anomaly-investigator/package.json +1 -7
- package/skills/skill-api-test-suite/package.json +1 -7
- package/skills/skill-apidocs/package.json +0 -6
- package/skills/skill-audio/SKILL.md +3 -1
- package/skills/skill-audio/package.json +0 -5
- package/skills/skill-audio/src/index-local.ts +4 -1
- package/skills/skill-audio/src/providers/minimax.ts +83 -0
- package/skills/skill-audio/src/types.ts +1 -1
- package/skills/skill-audio-cleanup-lab/package.json +1 -5
- package/skills/{skill-extract-audio → skill-audio-extract}/SKILL.md +3 -3
- package/skills/{skill-extract-audio → skill-audio-extract}/package.json +3 -7
- package/skills/skill-audiobook-chapter-proofer/package.json +1 -7
- package/skills/skill-banner-ad-suite/package.json +1 -7
- package/skills/skill-benchmark-finder/package.json +1 -7
- package/skills/skill-bio-sequence-tool/package.json +1 -7
- package/skills/skill-blog-topic-cluster/package.json +1 -7
- package/skills/skill-brand-voice-audit/package.json +1 -7
- package/skills/skill-browse/package.json +0 -5
- package/skills/skill-businessactivity/package.json +1 -3
- package/skills/skill-calendar-events/package.json +1 -7
- package/skills/skill-campaign-metric-brief/package.json +1 -7
- package/skills/skill-campaign-moodboard/package.json +1 -7
- package/skills/skill-caption-style-stylist/package.json +1 -7
- package/skills/skill-chemistry-calculator/package.json +1 -7
- package/skills/skill-churn-risk-notifier/package.json +1 -7
- package/skills/skill-citation-formatter/package.json +1 -7
- package/skills/skill-classroom-newsletter-kit/package.json +1 -7
- package/skills/skill-codefix/package.json +0 -4
- package/skills/skill-color-palette-harmonizer/package.json +1 -7
- package/skills/skill-colorextract/package.json +17 -5
- package/skills/skill-commitpush/package.json +0 -1
- package/skills/skill-commitpushpr/package.json +0 -1
- package/skills/skill-competitor-ad-analyzer/package.json +1 -7
- package/skills/skill-compliance-copy-check/package.json +1 -7
- package/skills/skill-compliance-report-pack/package.json +1 -7
- package/skills/skill-compress-video/package.json +1 -5
- package/skills/skill-consolelog/package.json +1 -7
- package/skills/skill-contract-plainlanguage/package.json +1 -7
- package/skills/skill-convert/SKILL.md +7 -0
- package/skills/skill-convert/package.json +0 -4
- package/skills/skill-copytone-translator/package.json +1 -7
- package/skills/skill-create-blog-article/package.json +1 -7
- package/skills/skill-create-ebook/package.json +1 -7
- package/skills/skill-crm-note-enhancer/package.json +1 -7
- package/skills/skill-customer-journey-mapper/package.json +1 -7
- package/skills/skill-dashboard-builder/package.json +1 -7
- package/skills/skill-dashboard-narrator/package.json +1 -7
- package/skills/skill-data-anonymizer/package.json +1 -7
- package/skills/skill-database-explorer/package.json +1 -7
- package/skills/skill-dataset-health-check/package.json +1 -7
- package/skills/skill-decision-journal/package.json +1 -7
- package/skills/skill-deepresearch/package.json +0 -5
- package/skills/skill-delegation-brief-writer/package.json +1 -7
- package/skills/skill-deploy/package.json +0 -4
- package/skills/skill-destination-briefing/package.json +1 -7
- package/skills/skill-diff-viewer/package.json +1 -7
- package/skills/{skill-generate-docx → skill-doc-generate}/SKILL.md +2 -2
- package/skills/{skill-generate-pdf → skill-doc-generate}/package.json +9 -4
- package/skills/{skill-generate-docx → skill-doc-generate}/src/index.ts +91 -28
- package/skills/skill-doc-read/SKILL.md +45 -0
- package/skills/skill-doc-read/package.json +29 -0
- package/skills/skill-doc-read/src/index.ts +324 -0
- package/skills/skill-doc-read/tsconfig.json +8 -0
- package/skills/skill-domainpurchase/package.json +1 -7
- package/skills/skill-domainsearch/package.json +1 -7
- package/skills/skill-e2bswarm/package.json +0 -6
- package/skills/skill-educational-resource-finder/package.json +1 -7
- package/skills/skill-email-campaign/package.json +1 -7
- package/skills/skill-emoji/package.json +0 -1
- package/skills/skill-exam-readiness-check/package.json +1 -7
- package/skills/skill-excel/SKILL.md +38 -0
- package/skills/skill-excel/package.json +30 -0
- package/skills/{skill-generate-excel → skill-excel}/src/index.ts +41 -14
- package/skills/skill-experiment-power-calculator/package.json +1 -7
- package/skills/skill-extract/package.json +0 -5
- package/skills/skill-extract-frames/package.json +1 -7
- package/skills/skill-extract-invoice/package.json +1 -7
- package/skills/skill-family-activity-curator/package.json +1 -7
- package/skills/skill-faq-packager/package.json +1 -7
- package/skills/skill-feedback-survey-designer/package.json +1 -7
- package/skills/skill-field-trip-planner/package.json +1 -7
- package/skills/skill-file-organizer/package.json +1 -7
- package/skills/skill-folder-tree/package.json +1 -7
- package/skills/skill-forecast-scenario-lab/package.json +1 -7
- package/skills/skill-form-filler/package.json +1 -7
- package/skills/skill-generate-api-client/package.json +1 -7
- package/skills/skill-generate-book-cover/package.json +1 -7
- package/skills/skill-generate-chart/package.json +1 -7
- package/skills/skill-generate-diagram/package.json +1 -7
- package/skills/skill-generate-dockerfile/package.json +1 -7
- package/skills/skill-generate-documentation/package.json +1 -7
- package/skills/skill-generate-env/package.json +1 -7
- package/skills/skill-generate-favicon/package.json +1 -7
- package/skills/skill-generate-mock-data/package.json +1 -7
- package/skills/skill-generate-pr-description/package.json +1 -7
- package/skills/skill-generate-presentation/package.json +1 -7
- package/skills/skill-generate-qrcode/package.json +1 -7
- package/skills/skill-generate-regex/package.json +1 -7
- package/skills/skill-generate-resume/package.json +1 -7
- package/skills/skill-generate-sitemap/package.json +1 -7
- package/skills/skill-generate-social-posts/package.json +1 -7
- package/skills/skill-generate-sql/package.json +1 -7
- package/skills/skill-gif-maker/package.json +1 -7
- package/skills/skill-github-manager/package.json +1 -7
- package/skills/skill-gmail/package.json +1 -7
- package/skills/skill-goal-quarterly-roadmap/package.json +1 -7
- package/skills/skill-grant-application-drafter/package.json +1 -7
- package/skills/skill-grocery-basket-optimizer/package.json +1 -7
- package/skills/skill-guest-communication-suite/package.json +1 -7
- package/skills/skill-habit-reflection-digest/package.json +1 -7
- package/skills/skill-highlight-reel-generator/package.json +1 -7
- package/skills/skill-homework-feedback-coach/package.json +1 -7
- package/skills/skill-hook/package.json +0 -6
- package/skills/skill-household-maintenance-mgr/package.json +1 -7
- package/skills/skill-http-server/package.json +1 -7
- package/skills/skill-image/SKILL.md +2 -0
- package/skills/skill-image/package.json +0 -5
- package/skills/skill-image/src/index-local.ts +5 -3
- package/skills/skill-image/src/providers/minimax.ts +94 -0
- package/skills/skill-image/src/types.ts +1 -1
- package/skills/skill-implementation/package.json +0 -6
- package/skills/skill-implementation-agent/package.json +1 -7
- package/skills/skill-implementation-plan/package.json +1 -7
- package/skills/skill-implementation-todo/package.json +1 -7
- package/skills/skill-inbox-priority-planner/package.json +1 -7
- package/skills/skill-invoice-dispute-helper/package.json +1 -7
- package/skills/skill-itinerary-architect/package.json +1 -7
- package/skills/skill-kpi-digest-generator/package.json +1 -7
- package/skills/skill-lab-notebook-formatter/package.json +1 -7
- package/skills/skill-landing-page-copy/package.json +1 -7
- package/skills/skill-latex-table-generator/package.json +1 -7
- package/skills/skill-learning-style-profiler/package.json +1 -7
- package/skills/skill-lesson-plan-customizer/package.json +1 -7
- package/skills/skill-livestream-runofshow/package.json +1 -7
- package/skills/skill-longform-structurer/package.json +1 -7
- package/skills/skill-lorem-generator/package.json +1 -7
- package/skills/skill-managehook/package.json +1 -3
- package/skills/skill-managemcp/package.json +1 -3
- package/skills/skill-manageskill/package.json +1 -3
- package/skills/skill-markdown-validator/package.json +1 -7
- package/skills/skill-mcp-builder/package.json +1 -7
- package/skills/skill-meal-plan-designer/package.json +1 -7
- package/skills/skill-meeting-insight-summarizer/package.json +1 -7
- package/skills/skill-merge-pdfs/package.json +1 -7
- package/skills/skill-microcopy-generator/package.json +1 -7
- package/skills/skill-mindfulness-prompt-cache/package.json +1 -7
- package/skills/skill-monitor/package.json +0 -1
- package/skills/skill-music/CLAUDE.md +9 -0
- package/skills/skill-music/SKILL.md +35 -0
- package/skills/{skill-generate-excel → skill-music}/package.json +4 -10
- package/skills/skill-music/src/index.ts +192 -0
- package/skills/skill-notion-manager/package.json +1 -7
- package/skills/skill-npmpublish/package.json +0 -5
- package/skills/skill-onboarding-sequence-builder/package.json +1 -7
- package/skills/skill-onsite-ops-checklist/package.json +1 -7
- package/skills/skill-outreach-cadence-designer/package.json +1 -7
- package/skills/skill-packaging-concept-studio/package.json +1 -7
- package/skills/skill-packing-plan-pro/package.json +1 -7
- package/skills/skill-parent-teacher-brief/package.json +1 -7
- package/skills/skill-partner-kit-assembler/package.json +1 -7
- package/skills/skill-payroll-change-prepper/package.json +1 -7
- package/skills/{skill-generate-pdf → skill-pdf-generate}/SKILL.md +2 -2
- package/skills/{skill-generate-docx → skill-pdf-generate}/package.json +6 -4
- package/skills/{skill-generate-pdf → skill-pdf-generate}/src/index.ts +109 -8
- package/skills/skill-pdf-read/SKILL.md +56 -0
- package/skills/skill-pdf-read/package.json +29 -0
- package/skills/skill-pdf-read/src/index.ts +320 -0
- package/skills/skill-pdf-read/tsconfig.json +8 -0
- package/skills/skill-persona-based-adwriter/package.json +1 -7
- package/skills/skill-persona-generator/package.json +1 -7
- package/skills/skill-personal-daily-ops/package.json +1 -7
- package/skills/skill-pet-care-scheduler/package.json +1 -7
- package/skills/skill-podcast-show-notes/package.json +1 -7
- package/skills/skill-presentation-theme-maker/package.json +1 -7
- package/skills/skill-press-release-drafter/package.json +1 -7
- package/skills/skill-print-collateral-designer/package.json +1 -7
- package/skills/skill-procurement-scorecard/package.json +1 -7
- package/skills/skill-product-demo-script/package.json +1 -7
- package/skills/skill-product-mockup/package.json +1 -7
- package/skills/skill-project-retro-companion/package.json +1 -7
- package/skills/skill-proposal-redline-advisor/package.json +1 -7
- package/skills/skill-read-csv/SKILL.md +1 -1
- package/skills/skill-read-csv/package.json +0 -1
- package/skills/skill-read-csv/src/index.ts +30 -5
- package/skills/skill-read-excel/SKILL.md +1 -1
- package/skills/skill-read-excel/package.json +0 -1
- package/skills/skill-read-excel/src/index.ts +21 -8
- package/skills/skill-read-image/SKILL.md +1 -1
- package/skills/skill-read-image/package.json +0 -1
- package/skills/skill-read-pdf/SKILL.md +1 -1
- package/skills/skill-read-pdf/package.json +0 -1
- package/skills/skill-read-pdf/src/index.ts +15 -3
- package/skills/skill-regex-tester/package.json +1 -7
- package/skills/skill-remove-background/package.json +1 -7
- package/skills/skill-risk-disclosure-kit/package.json +1 -7
- package/skills/skill-roi-comparison-tool/package.json +1 -7
- package/skills/skill-sales-call-recapper/package.json +1 -7
- package/skills/skill-scaffold-project/package.json +1 -7
- package/skills/skill-scancommitpr/package.json +0 -2
- package/skills/skill-scancommitpush/package.json +0 -2
- package/skills/skill-scholarship-tracker/package.json +1 -7
- package/skills/skill-scientific-figure-check/package.json +1 -7
- package/skills/skill-seating-chart-maker/package.json +1 -7
- package/skills/skill-security-audit/package.json +1 -7
- package/skills/skill-seo-brief-builder/package.json +1 -7
- package/skills/skill-siteanalyze/package.json +19 -5
- package/skills/skill-slack-assistant/package.json +1 -7
- package/skills/skill-sleep-routine-analyzer/package.json +1 -7
- package/skills/skill-sms/package.json +0 -1
- package/skills/skill-social-media-kit/package.json +1 -7
- package/skills/skill-sound-effects/SKILL.md +34 -0
- package/skills/{skill-jingle-composer → skill-sound-effects}/package.json +4 -10
- package/skills/skill-sound-effects/src/index.ts +172 -0
- package/skills/skill-sound-effects/tsconfig.json +8 -0
- package/skills/skill-split-pdf/package.json +1 -7
- package/skills/skill-sponsorship-proposal-lab/package.json +1 -7
- package/skills/skill-spreadsheet-cleanroom/package.json +1 -7
- package/skills/skill-statistical-test-selector/package.json +1 -7
- package/skills/skill-stress-relief-playbook/package.json +1 -7
- package/skills/skill-study-guide-builder/package.json +1 -7
- package/skills/skill-subscription-spend-watcher/package.json +1 -7
- package/skills/skill-subtitle/package.json +0 -6
- package/skills/skill-survey-insight-extractor/package.json +1 -7
- package/skills/skill-terraform-generator/package.json +1 -7
- package/skills/skill-testimonial-graphics/package.json +1 -7
- package/skills/skill-timesheet/package.json +0 -6
- package/skills/skill-tmux-session/package.json +0 -1
- package/skills/skill-transcript/SKILL.md +3 -1
- package/skills/skill-transcript/package.json +0 -5
- package/skills/skill-travel-budget-balancer/package.json +1 -7
- package/skills/skill-validate-config/package.json +1 -7
- package/skills/skill-video/SKILL.md +3 -1
- package/skills/skill-video/package.json +0 -5
- package/skills/skill-video/src/providers/index.ts +4 -1
- package/skills/skill-video/src/providers/minimax.ts +100 -0
- package/skills/skill-video/src/types.ts +1 -1
- package/skills/skill-video-cut-suggester/package.json +1 -7
- package/skills/skill-video-downloader/package.json +1 -7
- package/skills/skill-video-thumbnail/package.json +1 -7
- package/skills/skill-voiceover-casting-assistant/package.json +1 -7
- package/skills/skill-watermark/package.json +1 -7
- package/skills/skill-webcrawling/package.json +11 -8
- package/skills/skill-webinar-script-coach/package.json +1 -7
- package/skills/skill-wellness-progress-reporter/package.json +1 -7
- package/skills/skill-workout-cycle-planner/package.json +1 -7
- package/skills/skill-write/package.json +0 -5
- package/skills/skill-jingle-composer/CLAUDE.md +0 -19
- package/skills/skill-jingle-composer/src/index.ts +0 -250
- /package/skills/{skill-extract-audio → skill-audio-extract}/CLAUDE.md +0 -0
- /package/skills/{skill-extract-audio → skill-audio-extract}/src/index.ts +0 -0
- /package/skills/{skill-extract-audio → skill-audio-extract}/tsconfig.json +0 -0
- /package/skills/{skill-generate-docx → skill-doc-generate}/CLAUDE.md +0 -0
- /package/skills/{skill-generate-docx → skill-doc-generate}/tsconfig.json +0 -0
- /package/skills/{skill-generate-excel → skill-excel}/CLAUDE.md +0 -0
- /package/skills/{skill-generate-excel → skill-excel}/tsconfig.json +0 -0
- /package/skills/{skill-jingle-composer → skill-music}/tsconfig.json +0 -0
- /package/skills/{skill-generate-pdf → skill-pdf-generate}/CLAUDE.md +0 -0
- /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
|
-
|
|
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:
|
|
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
|
|
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:
|
|
167
|
-
const rows =
|
|
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:
|
|
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 =
|
|
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) {
|
|
@@ -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:
|
|
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),
|
|
@@ -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": {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
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": {
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/bun": "latest"
|
|
26
|
+
}
|
|
13
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-
|
|
2
|
+
"name": "@hasnaxyz/skill-sound-effects",
|
|
3
3
|
"version": "0.1.0",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Generate sound effects using AI (Minimax)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"skill-
|
|
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();
|