@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
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: music
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: Generate music tracks using AI models (Minimax Music-01)
|
|
5
|
+
category: Content Generation
|
|
6
|
+
tags:
|
|
7
|
+
- music
|
|
8
|
+
- generation
|
|
9
|
+
- ai
|
|
10
|
+
- minimax
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Music
|
|
14
|
+
|
|
15
|
+
Generate full music tracks from text descriptions using AI. Describe the genre, mood, tempo, and style — get a complete audio track. Supports lyrics, instrumental references, and fine-grained control over the output.
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
- **Text-to-Music**: Describe any style and get a full track
|
|
20
|
+
- **Lyrics Support**: Provide lyrics for vocal tracks
|
|
21
|
+
- **Genre & Mood Control**: Specify genre, mood, and tempo
|
|
22
|
+
- **Duration Control**: Set desired track length
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
skill-music generate --prompt "upbeat jazz piano" --output ./jazz.mp3
|
|
28
|
+
skill-music generate --prompt "rock anthem" --lyrics "We are the champions" --output ./rock.mp3
|
|
29
|
+
skill-music generate --prompt "lo-fi beats" --mood calm --tempo 80 --output ./lofi.mp3
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Environment Variables
|
|
33
|
+
|
|
34
|
+
- `MINIMAX_API_KEY` — API key for Minimax (required)
|
|
35
|
+
- `MINIMAX_GROUP_ID` — Group ID for Minimax (optional)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@hasnaxyz/skill-
|
|
2
|
+
"name": "@hasnaxyz/skill-music",
|
|
3
3
|
"version": "0.1.0",
|
|
4
|
-
"description": "Generate
|
|
4
|
+
"description": "Generate music tracks using AI models (Minimax Music-01)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"skill-
|
|
7
|
+
"skill-music": "./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-generate-excel.git"
|
|
30
|
-
},
|
|
31
|
-
"author": "Hasna",
|
|
32
|
-
"license": "Apache-2.0"
|
|
26
|
+
]
|
|
33
27
|
}
|
|
@@ -0,0 +1,192 @@
|
|
|
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-music',
|
|
9
|
+
description: 'Generate music tracks using AI (Minimax Music-01)',
|
|
10
|
+
version: '1.0.0',
|
|
11
|
+
commands: `Use: skill-music --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
|
+
lyrics?: string;
|
|
26
|
+
genre?: string;
|
|
27
|
+
mood?: string;
|
|
28
|
+
tempo?: number;
|
|
29
|
+
duration?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function parseArgs(): GenerateOptions | null {
|
|
33
|
+
const args = process.argv.slice(2);
|
|
34
|
+
|
|
35
|
+
if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
|
|
36
|
+
printHelp();
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (args[0] !== 'generate') {
|
|
41
|
+
console.error(`Unknown command: ${args[0]}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const options: Partial<GenerateOptions> = { provider: 'minimax' };
|
|
46
|
+
|
|
47
|
+
for (let i = 1; i < args.length; i++) {
|
|
48
|
+
switch (args[i]) {
|
|
49
|
+
case '--provider': case '-p': options.provider = args[++i] as Provider; break;
|
|
50
|
+
case '--prompt': options.prompt = args[++i]; break;
|
|
51
|
+
case '--output': case '-o': options.output = args[++i]; break;
|
|
52
|
+
case '--lyrics': options.lyrics = args[++i]; break;
|
|
53
|
+
case '--genre': options.genre = args[++i]; break;
|
|
54
|
+
case '--mood': options.mood = args[++i]; break;
|
|
55
|
+
case '--tempo': options.tempo = parseInt(args[++i]); break;
|
|
56
|
+
case '--duration': options.duration = parseInt(args[++i]); break;
|
|
57
|
+
default: console.error(`Unknown option: ${args[i]}`); process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (!options.prompt) { console.error('Error: --prompt is required'); process.exit(1); }
|
|
62
|
+
if (!options.output) { console.error('Error: --output is required'); process.exit(1); }
|
|
63
|
+
|
|
64
|
+
return options as GenerateOptions;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function printHelp() {
|
|
68
|
+
console.log(`
|
|
69
|
+
Music Generation Skill
|
|
70
|
+
|
|
71
|
+
Generate music using AI models (Minimax Music-01)
|
|
72
|
+
|
|
73
|
+
USAGE:
|
|
74
|
+
skill-music generate [OPTIONS]
|
|
75
|
+
|
|
76
|
+
OPTIONS:
|
|
77
|
+
--provider, -p <provider> Provider (minimax) [default: minimax]
|
|
78
|
+
--prompt <text> Description of the music to generate [required]
|
|
79
|
+
--output, -o <path> Output file path [required]
|
|
80
|
+
--lyrics <text> Song lyrics
|
|
81
|
+
--genre <genre> Music genre (pop, rock, jazz, classical, electronic, etc.)
|
|
82
|
+
--mood <mood> Desired mood (happy, sad, energetic, calm, etc.)
|
|
83
|
+
--tempo <bpm> Tempo in BPM
|
|
84
|
+
--duration <seconds> Duration in seconds
|
|
85
|
+
|
|
86
|
+
EXAMPLES:
|
|
87
|
+
skill-music generate --prompt "upbeat jazz piano" --output ./jazz.mp3
|
|
88
|
+
skill-music generate --prompt "rock anthem" --lyrics "We are the champions" --output ./rock.mp3
|
|
89
|
+
skill-music generate --prompt "lo-fi beats" --mood calm --tempo 80 --output ./lofi.mp3
|
|
90
|
+
|
|
91
|
+
ENVIRONMENT VARIABLES:
|
|
92
|
+
MINIMAX_API_KEY API key for Minimax
|
|
93
|
+
MINIMAX_GROUP_ID Group ID for Minimax (optional)
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function generateMinimax(options: GenerateOptions): Promise<Buffer> {
|
|
98
|
+
const apiKey = process.env.MINIMAX_API_KEY;
|
|
99
|
+
if (!apiKey) throw new Error('MINIMAX_API_KEY environment variable is required');
|
|
100
|
+
|
|
101
|
+
const groupId = process.env.MINIMAX_GROUP_ID;
|
|
102
|
+
const baseUrl = 'https://api.minimax.chat/v1';
|
|
103
|
+
|
|
104
|
+
console.log(`Generating music with Minimax Music-01...`);
|
|
105
|
+
console.log(`Prompt: ${options.prompt}`);
|
|
106
|
+
|
|
107
|
+
const body: Record<string, unknown> = {
|
|
108
|
+
model: 'music-01',
|
|
109
|
+
prompt: options.prompt,
|
|
110
|
+
};
|
|
111
|
+
if (options.lyrics) body.lyrics = options.lyrics;
|
|
112
|
+
if (options.genre) body.genre = options.genre;
|
|
113
|
+
if (options.mood) body.mood = options.mood;
|
|
114
|
+
if (options.tempo) body.tempo = options.tempo;
|
|
115
|
+
if (options.duration) body.duration = options.duration;
|
|
116
|
+
|
|
117
|
+
const headers: Record<string, string> = {
|
|
118
|
+
'Content-Type': 'application/json',
|
|
119
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
120
|
+
};
|
|
121
|
+
if (groupId) headers['X-Group-Id'] = groupId;
|
|
122
|
+
|
|
123
|
+
const response = await fetch(`${baseUrl}/music_generation`, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers,
|
|
126
|
+
body: JSON.stringify(body),
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
const err = await response.text();
|
|
131
|
+
throw new Error(`Minimax API error: ${response.status} - ${err}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const data = await response.json() as { task_id: string };
|
|
135
|
+
console.log(`Task started: ${data.task_id}`);
|
|
136
|
+
console.log('Polling for completion...');
|
|
137
|
+
|
|
138
|
+
for (let i = 0; i < 120; i++) {
|
|
139
|
+
await new Promise(r => setTimeout(r, 5000));
|
|
140
|
+
|
|
141
|
+
const statusUrl = `${baseUrl}/query/music_generation?task_id=${data.task_id}`;
|
|
142
|
+
const statusRes = await fetch(statusUrl, { headers: { 'Authorization': `Bearer ${apiKey}` } });
|
|
143
|
+
const status = await statusRes.json() as {
|
|
144
|
+
status: string;
|
|
145
|
+
extra_info?: { audio_url?: string };
|
|
146
|
+
audio_file?: string;
|
|
147
|
+
base_resp?: { status_msg: string };
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
if (status.status === 'Success') {
|
|
151
|
+
const audioUrl = status.extra_info?.audio_url || status.audio_file;
|
|
152
|
+
if (!audioUrl) throw new Error('No audio URL in response');
|
|
153
|
+
|
|
154
|
+
console.log('Music generated. Downloading...');
|
|
155
|
+
const audioRes = await fetch(audioUrl);
|
|
156
|
+
if (!audioRes.ok) throw new Error(`Download failed: ${audioRes.status}`);
|
|
157
|
+
return Buffer.from(await audioRes.arrayBuffer());
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (status.status === 'Fail') {
|
|
161
|
+
throw new Error(`Music generation failed: ${status.base_resp?.status_msg || 'Unknown error'}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (i % 6 === 0) console.log(` Still processing... (${Math.round((i * 5) / 60)}m elapsed)`);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
throw new Error('Music generation timed out');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function main() {
|
|
171
|
+
const options = parseArgs();
|
|
172
|
+
if (!options) return;
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
console.log('\n=== Music Generation ===\n');
|
|
176
|
+
|
|
177
|
+
const buffer = await generateMinimax(options);
|
|
178
|
+
|
|
179
|
+
const outputPath = resolve(options.output);
|
|
180
|
+
await mkdir(dirname(outputPath), { recursive: true });
|
|
181
|
+
await writeFile(outputPath, buffer);
|
|
182
|
+
|
|
183
|
+
console.log(`\nMusic saved to: ${outputPath}`);
|
|
184
|
+
console.log(`Size: ${(buffer.length / 1024).toFixed(1)} KB`);
|
|
185
|
+
console.log('\nDone!\n');
|
|
186
|
+
} catch (error) {
|
|
187
|
+
console.error('\nError:', error instanceof Error ? error.message : error);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
main();
|
|
@@ -15,10 +15,6 @@
|
|
|
15
15
|
"publishConfig": {
|
|
16
16
|
"access": "restricted"
|
|
17
17
|
},
|
|
18
|
-
"repository": {
|
|
19
|
-
"type": "git",
|
|
20
|
-
"url": "https://github.com/hasnaxyz/skill-npmpublish.git"
|
|
21
|
-
},
|
|
22
18
|
"keywords": [
|
|
23
19
|
"npm",
|
|
24
20
|
"publish",
|
|
@@ -27,7 +23,6 @@
|
|
|
27
23
|
"claude",
|
|
28
24
|
"codex"
|
|
29
25
|
],
|
|
30
|
-
"license": "Apache-2.0",
|
|
31
26
|
"scripts": {
|
|
32
27
|
"start": "bun run src/index.ts",
|
|
33
28
|
"typecheck": "tsc --noEmit"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: pdf-generate
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
description: Generate high-quality PDF documents from markdown, HTML, or templates
|
|
5
5
|
category: Productivity
|
|
@@ -83,4 +83,4 @@ skills run generate-pdf -- --file README.md \
|
|
|
83
83
|
|
|
84
84
|
## Requirements
|
|
85
85
|
|
|
86
|
-
- Bun runtime.
|
|
86
|
+
- Bun runtime.
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@hasnaxyz/skill-generate
|
|
2
|
+
"name": "@hasnaxyz/skill-pdf-generate",
|
|
3
3
|
"version": "0.1.0",
|
|
4
|
-
"description": "Generate
|
|
4
|
+
"description": "Generate PDF documents with rich formatting and layouts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"skill-generate
|
|
7
|
+
"skill-pdf-generate": "./src/index.ts"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"start": "bun run src/index.ts",
|
|
11
11
|
"dev": "bun run --watch src/index.ts",
|
|
12
12
|
"cli": "bun run src/index.ts"
|
|
13
13
|
},
|
|
14
|
-
"dependencies": {
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"pdf-lib": "^1.17.1"
|
|
16
|
+
},
|
|
15
17
|
"publishConfig": {
|
|
16
18
|
"registry": "https://registry.npmjs.org",
|
|
17
19
|
"access": "restricted"
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import { existsSync, mkdirSync, appendFileSync, writeFileSync, readFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
|
|
6
|
+
type PdfLibModule = typeof import("pdf-lib");
|
|
7
|
+
|
|
6
8
|
// Skill configuration
|
|
7
9
|
const SKILL_NAME = "generate-pdf";
|
|
8
10
|
const SESSION_ID = `${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
@@ -30,6 +32,14 @@ function log(message: string, level: "info" | "error" | "warn" = "info") {
|
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
|
|
35
|
+
async function loadPdfLib(): Promise<PdfLibModule> {
|
|
36
|
+
try {
|
|
37
|
+
return await import("pdf-lib");
|
|
38
|
+
} catch {
|
|
39
|
+
throw new Error("Missing dependency 'pdf-lib'. Run bun install in this skill directory.");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
33
43
|
// =============================================================================
|
|
34
44
|
// Security: HTML Escaping to prevent XSS
|
|
35
45
|
// =============================================================================
|
|
@@ -685,6 +695,99 @@ function generateHtml(options: GenerateOptions): string {
|
|
|
685
695
|
</html>`;
|
|
686
696
|
}
|
|
687
697
|
|
|
698
|
+
function htmlToPlainText(html: string): string {
|
|
699
|
+
return html
|
|
700
|
+
.replace(/<style[\s\S]*?<\/style>/gi, "")
|
|
701
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
702
|
+
.replace(/<\/(h1|h2|h3|p|div|li|tr)>/gi, "\n")
|
|
703
|
+
.replace(/<br\s*\/?>/gi, "\n")
|
|
704
|
+
.replace(/<[^>]+>/g, "")
|
|
705
|
+
.replace(/ /g, " ")
|
|
706
|
+
.replace(/&/g, "&")
|
|
707
|
+
.replace(/</g, "<")
|
|
708
|
+
.replace(/>/g, ">")
|
|
709
|
+
.replace(/"/g, '"')
|
|
710
|
+
.replace(/'/g, "'")
|
|
711
|
+
.split("\n")
|
|
712
|
+
.map((line) => line.trim())
|
|
713
|
+
.filter(Boolean)
|
|
714
|
+
.join("\n");
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
function pageSizeToPoints(format: string, orientation: "portrait" | "landscape"): [number, number] {
|
|
718
|
+
const size = PAGE_FORMATS[format] ?? PAGE_FORMATS.A4;
|
|
719
|
+
const width = (size.width / 25.4) * 72;
|
|
720
|
+
const height = (size.height / 25.4) * 72;
|
|
721
|
+
return orientation === "landscape" ? [height, width] : [width, height];
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
function wrapText(text: string, maxCharacters: number): string[] {
|
|
725
|
+
const lines: string[] = [];
|
|
726
|
+
for (const paragraph of text.split("\n")) {
|
|
727
|
+
let current = "";
|
|
728
|
+
for (const word of paragraph.split(/\s+/).filter(Boolean)) {
|
|
729
|
+
const candidate = current ? `${current} ${word}` : word;
|
|
730
|
+
if (candidate.length > maxCharacters && current) {
|
|
731
|
+
lines.push(current);
|
|
732
|
+
current = word;
|
|
733
|
+
} else {
|
|
734
|
+
current = candidate;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
if (current) lines.push(current);
|
|
738
|
+
lines.push("");
|
|
739
|
+
}
|
|
740
|
+
return lines;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
async function writePdfDocument(html: string, options: GenerateOptions, outputPath: string): Promise<void> {
|
|
744
|
+
const { PDFDocument, StandardFonts, rgb } = await loadPdfLib();
|
|
745
|
+
const pdfDoc = await PDFDocument.create();
|
|
746
|
+
const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
|
|
747
|
+
const boldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
|
|
748
|
+
const [width, height] = pageSizeToPoints(options.format, options.orientation);
|
|
749
|
+
const margin = 54;
|
|
750
|
+
const fontSize = 11;
|
|
751
|
+
const lineHeight = 16;
|
|
752
|
+
const maxCharacters = Math.max(40, Math.floor((width - margin * 2) / (fontSize * 0.52)));
|
|
753
|
+
const lines = wrapText(htmlToPlainText(html), maxCharacters);
|
|
754
|
+
|
|
755
|
+
let page = pdfDoc.addPage([width, height]);
|
|
756
|
+
let y = height - margin;
|
|
757
|
+
|
|
758
|
+
if (options.title) {
|
|
759
|
+
page.drawText(options.title, {
|
|
760
|
+
x: margin,
|
|
761
|
+
y,
|
|
762
|
+
size: 18,
|
|
763
|
+
font: boldFont,
|
|
764
|
+
color: rgb(0.12, 0.18, 0.26),
|
|
765
|
+
});
|
|
766
|
+
y -= lineHeight * 2;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
for (const line of lines) {
|
|
770
|
+
if (y < margin) {
|
|
771
|
+
page = pdfDoc.addPage([width, height]);
|
|
772
|
+
y = height - margin;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
if (line) {
|
|
776
|
+
page.drawText(line, {
|
|
777
|
+
x: margin,
|
|
778
|
+
y,
|
|
779
|
+
size: fontSize,
|
|
780
|
+
font,
|
|
781
|
+
color: rgb(0.1, 0.1, 0.1),
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
y -= lineHeight;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
const bytes = await pdfDoc.save();
|
|
788
|
+
writeFileSync(outputPath, bytes);
|
|
789
|
+
}
|
|
790
|
+
|
|
688
791
|
// Main execution
|
|
689
792
|
async function main() {
|
|
690
793
|
try {
|
|
@@ -709,28 +812,26 @@ async function main() {
|
|
|
709
812
|
? `${options.filename}.pdf`
|
|
710
813
|
: `document_${SESSION_ID}.pdf`;
|
|
711
814
|
|
|
712
|
-
// Since we can't use Puppeteer in Bun easily, we'll output the HTML
|
|
713
|
-
// and create a simple text-based PDF representation
|
|
714
|
-
// In production, this would use a proper PDF library
|
|
715
|
-
|
|
716
|
-
// For now, save HTML that can be converted to PDF
|
|
717
815
|
const htmlFile = join(EXPORTS_DIR, filename.replace('.pdf', '.html'));
|
|
718
816
|
writeFileSync(htmlFile, html);
|
|
719
817
|
log(`Saved HTML to: ${htmlFile}`);
|
|
818
|
+
const pdfFile = join(EXPORTS_DIR, filename);
|
|
819
|
+
await writePdfDocument(html, options, pdfFile);
|
|
820
|
+
log(`Saved PDF to: ${pdfFile}`);
|
|
720
821
|
|
|
721
822
|
// Output result
|
|
722
823
|
const result = {
|
|
723
824
|
success: true,
|
|
724
|
-
message: "
|
|
825
|
+
message: "PDF document generated successfully",
|
|
725
826
|
data: {
|
|
827
|
+
pdfFile,
|
|
726
828
|
htmlFile,
|
|
727
|
-
filename
|
|
829
|
+
filename,
|
|
728
830
|
format: options.format,
|
|
729
831
|
orientation: options.orientation,
|
|
730
832
|
contentLength: html.length,
|
|
731
833
|
template: options.template || null,
|
|
732
834
|
},
|
|
733
|
-
note: "PDF conversion requires Puppeteer/Playwright. HTML file exported instead.",
|
|
734
835
|
};
|
|
735
836
|
|
|
736
837
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pdf-read
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: Read and extract text from multiple PDF files with page-range selection and parallel processing
|
|
5
|
+
category: Data & Analysis
|
|
6
|
+
tags:
|
|
7
|
+
- pdf
|
|
8
|
+
- documents
|
|
9
|
+
- extraction
|
|
10
|
+
- analysis
|
|
11
|
+
- reader
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# PDF Read
|
|
15
|
+
|
|
16
|
+
Read and extract text from PDF files. Supports multiple PDFs at once, page-range selection, chunked reading for large files, and parallel processing. Outputs text, JSON, or structured markdown.
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
- **Multiple PDFs**: Process many PDFs in a single command
|
|
21
|
+
- **Page Ranges**: Read specific pages (e.g., `1-5`, `3,7,10-15`)
|
|
22
|
+
- **Chunked Reading**: Break large PDFs into manageable chunks
|
|
23
|
+
- **Parallel Processing**: Process multiple files concurrently
|
|
24
|
+
- **Metadata Extraction**: Get page count, author, title, dates
|
|
25
|
+
- **Output Formats**: Plain text, JSON with page structure, or markdown
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Read entire PDF
|
|
31
|
+
skill-pdf-read read document.pdf
|
|
32
|
+
|
|
33
|
+
# Read specific pages
|
|
34
|
+
skill-pdf-read read report.pdf --pages 1-5
|
|
35
|
+
|
|
36
|
+
# Read multiple PDFs
|
|
37
|
+
skill-pdf-read read file1.pdf file2.pdf file3.pdf
|
|
38
|
+
|
|
39
|
+
# Read in chunks of 10 pages
|
|
40
|
+
skill-pdf-read read large-book.pdf --chunk-size 10
|
|
41
|
+
|
|
42
|
+
# Get metadata only
|
|
43
|
+
skill-pdf-read info document.pdf
|
|
44
|
+
|
|
45
|
+
# Output as JSON with page structure
|
|
46
|
+
skill-pdf-read read document.pdf --format json --output result.json
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Environment Variables
|
|
50
|
+
|
|
51
|
+
- None required (pure local processing)
|
|
52
|
+
|
|
53
|
+
## Requirements
|
|
54
|
+
|
|
55
|
+
- Bun runtime
|
|
56
|
+
- pdf-parse (auto-installed)
|