@hasna/skills 0.1.26 ā 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -10
- package/README.md +141 -39
- package/bin/index.js +30122 -27575
- package/bin/mcp.js +22112 -18593
- package/dist/cli/cli.test-utils.d.ts +15 -0
- package/dist/cli/commands/auth.d.ts +2 -0
- package/dist/cli/commands/install.d.ts +1 -1
- package/dist/cli/commands/runtime-mcp.d.ts +4 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.js +11607 -597
- package/dist/lib/auth-store.d.ts +13 -0
- package/dist/lib/installer.d.ts +58 -55
- package/dist/lib/mcp-contracts.d.ts +86 -0
- package/dist/lib/project-state.d.ts +43 -0
- package/dist/lib/registry-data/business-marketing.d.ts +2 -0
- package/dist/lib/registry-data/communication.d.ts +2 -0
- package/dist/lib/registry-data/content-generation.d.ts +2 -0
- package/dist/lib/registry-data/data-analysis.d.ts +2 -0
- package/dist/lib/registry-data/design-branding.d.ts +2 -0
- package/dist/lib/registry-data/development-tools.d.ts +2 -0
- package/dist/lib/registry-data/education-learning.d.ts +2 -0
- package/dist/lib/registry-data/event-management.d.ts +2 -0
- package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
- package/dist/lib/registry-data/health-wellness.d.ts +2 -0
- package/dist/lib/registry-data/index.d.ts +2 -0
- package/dist/lib/registry-data/media-processing.d.ts +2 -0
- package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
- package/dist/lib/registry-data/project-management.d.ts +2 -0
- package/dist/lib/registry-data/research-writing.d.ts +2 -0
- package/dist/lib/registry-data/science-academic.d.ts +2 -0
- package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
- package/dist/lib/registry-data/web-browser.d.ts +2 -0
- package/dist/lib/registry-types.d.ts +27 -0
- package/dist/lib/registry.d.ts +6 -18
- package/dist/lib/remote-registry.d.ts +3 -0
- package/dist/lib/run-state.d.ts +60 -0
- package/dist/lib/skill-aliases.d.ts +17 -0
- package/dist/lib/skillinfo.d.ts +5 -1
- package/dist/mcp/discovery-tools.d.ts +2 -0
- package/dist/mcp/helpers.d.ts +26 -0
- package/dist/mcp/http.d.ts +10 -0
- package/dist/mcp/index.d.ts +3 -2
- package/dist/mcp/operation-tools.d.ts +2 -0
- package/dist/mcp/resource-meta-tools.d.ts +2 -0
- package/dist/mcp/schedule-tools.d.ts +2 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/types/api.d.ts +7 -4
- package/package.json +23 -10
- package/skills/_common/http-client.ts +1 -1
- package/skills/_common/index.ts +2 -3
- package/skills/_common/install.sh +5 -110
- package/skills/_common/installer.ts +31 -282
- package/skills/_common/skill-install.ts +14 -181
- package/skills/ad-creative-pack/SKILL.md +45 -0
- package/skills/ad-creative-pack/package.json +14 -0
- package/skills/advanced-math/package.json +3 -1
- package/skills/advanced-math/src/calculators.ts +118 -0
- package/skills/advanced-math/src/cli.ts +130 -0
- package/skills/advanced-math/src/conversion.ts +90 -0
- package/skills/advanced-math/src/finance.ts +75 -0
- package/skills/advanced-math/src/formatting.ts +95 -0
- package/skills/advanced-math/src/index.ts +24 -702
- package/skills/advanced-math/src/runtime.ts +49 -0
- package/skills/advanced-math/src/symbolic.ts +110 -0
- package/skills/advanced-math/src/types.ts +36 -0
- package/skills/analyze-data/SKILL.md +2 -2
- package/skills/analyze-data/src/analysis.ts +401 -0
- package/skills/analyze-data/src/cli.ts +66 -0
- package/skills/analyze-data/src/formatters.ts +235 -0
- package/skills/analyze-data/src/index.ts +6 -1027
- package/skills/analyze-data/src/logger.ts +36 -0
- package/skills/analyze-data/src/parsers.ts +57 -0
- package/skills/analyze-data/src/stats.ts +151 -0
- package/skills/analyze-data/src/types.ts +85 -0
- package/skills/api-docs-portal/SKILL.md +46 -0
- package/skills/api-docs-portal/package.json +9 -0
- package/skills/api-test-suite/src/index.ts +13 -0
- package/skills/apidocs/package.json +1 -1
- package/skills/apidocs/src/index.ts +3 -0
- package/skills/audio/package.json +2 -3
- package/skills/audio-cleanup-lab/SKILL.md +2 -2
- package/skills/audio-extract/CLAUDE.md +1 -1
- package/skills/audio-transcript-pack/SKILL.md +43 -0
- package/skills/audio-transcript-pack/package.json +10 -0
- package/skills/blog-article/CLAUDE.md +12 -0
- package/skills/blog-article/SKILL.md +45 -0
- package/skills/{create-blog-article ā blog-article}/package.json +3 -3
- package/skills/brand-kit/SKILL.md +45 -0
- package/skills/brand-kit/package.json +14 -0
- package/skills/brand-photo-shoot/SKILL.md +28 -0
- package/skills/brand-photo-shoot/package.json +10 -0
- package/skills/brand-style-guide/SKILL.md +2 -2
- package/skills/brand-style-guide/src/index.ts +0 -0
- package/skills/budget-variance-analyzer/SKILL.md +2 -2
- package/skills/businessactivity/package.json +1 -1
- package/skills/businessactivity/src/index.ts +3 -0
- package/skills/calendar-events/src/ai-parser.ts +103 -0
- package/skills/calendar-events/src/api.ts +157 -0
- package/skills/calendar-events/src/auth.ts +22 -0
- package/skills/calendar-events/src/config.ts +6 -0
- package/skills/calendar-events/src/format.ts +96 -0
- package/skills/calendar-events/src/help.ts +54 -0
- package/skills/calendar-events/src/index.ts +21 -524
- package/skills/calendar-events/src/logger.ts +34 -0
- package/skills/calendar-events/src/types.ts +67 -0
- package/skills/compress-video/SKILL.md +2 -2
- package/skills/consolelog/package.json +1 -1
- package/skills/consolelog/src/index.ts +3 -0
- package/skills/contract-review-report/SKILL.md +43 -0
- package/skills/contract-review-report/package.json +10 -0
- package/skills/convert/SKILL.md +2 -3
- package/skills/customer-feedback-report/SKILL.md +44 -0
- package/skills/customer-feedback-report/package.json +10 -0
- package/skills/dashboard-builder/package.json +3 -1
- package/skills/database-explorer/package.json +3 -1
- package/skills/deepresearch/README.md +4 -13
- package/skills/deploy/src/http-client.ts +1 -1
- package/skills/diff-viewer/package.json +4 -1
- package/skills/doc-generate/package.json +0 -1
- package/skills/doc-generate/src/ai.ts +50 -0
- package/skills/doc-generate/src/cli.ts +203 -0
- package/skills/doc-generate/src/dependencies.ts +44 -0
- package/skills/doc-generate/src/document-builder.ts +299 -0
- package/skills/doc-generate/src/index.ts +40 -764
- package/skills/doc-generate/src/markdown-parser.ts +125 -0
- package/skills/doc-generate/src/types.ts +68 -0
- package/skills/domainpurchase/SKILL.md +1 -1
- package/skills/domainpurchase/package.json +1 -1
- package/skills/domainpurchase/src/index.ts +3 -0
- package/skills/domainsearch/SKILL.md +1 -1
- package/skills/domainsearch/package.json +1 -1
- package/skills/domainsearch/src/index.ts +3 -0
- package/skills/email-sequence/SKILL.md +44 -0
- package/skills/email-sequence/package.json +14 -0
- package/skills/excel/CLAUDE.md +2 -2
- package/skills/experiment-power-calculator/package.json +3 -1
- package/skills/extract-invoice/src/cli.ts +97 -0
- package/skills/extract-invoice/src/extractor.ts +170 -0
- package/skills/extract-invoice/src/file-utils.ts +46 -0
- package/skills/extract-invoice/src/formatters.ts +144 -0
- package/skills/extract-invoice/src/index.ts +44 -629
- package/skills/extract-invoice/src/runtime.ts +46 -0
- package/skills/extract-invoice/src/types.ts +88 -0
- package/skills/folder-tree/package.json +3 -1
- package/skills/form-filler/package.json +3 -1
- package/skills/generate-api-client/package.json +3 -1
- package/skills/generate-api-client/src/generator.ts +47 -0
- package/skills/generate-api-client/src/index.ts +3 -777
- package/skills/generate-api-client/src/logger.ts +34 -0
- package/skills/generate-api-client/src/python-generator.ts +245 -0
- package/skills/generate-api-client/src/spec-loader.ts +48 -0
- package/skills/generate-api-client/src/type-mappers.ts +79 -0
- package/skills/generate-api-client/src/types.ts +76 -0
- package/skills/generate-api-client/src/typescript-generator.ts +247 -0
- package/skills/generate-book-cover/package.json +3 -1
- package/skills/generate-dockerfile/src/cli.ts +78 -0
- package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
- package/skills/generate-dockerfile/src/index.ts +12 -790
- package/skills/generate-dockerfile/src/logger.ts +30 -0
- package/skills/generate-dockerfile/src/project-detection.ts +68 -0
- package/skills/generate-dockerfile/src/support-files.ts +171 -0
- package/skills/generate-dockerfile/src/types.ts +29 -0
- package/skills/generate-documentation/src/ai.ts +131 -0
- package/skills/generate-documentation/src/cli.ts +71 -0
- package/skills/generate-documentation/src/code-parser.ts +300 -0
- package/skills/generate-documentation/src/file-processing.ts +182 -0
- package/skills/generate-documentation/src/index.ts +13 -753
- package/skills/generate-documentation/src/runtime.ts +35 -0
- package/skills/generate-documentation/src/types.ts +30 -0
- package/skills/generate-env/package.json +3 -1
- package/skills/generate-env/src/cli.ts +85 -0
- package/skills/generate-env/src/detection.ts +161 -0
- package/skills/generate-env/src/env-data.ts +66 -0
- package/skills/generate-env/src/generators.ts +240 -0
- package/skills/generate-env/src/index.ts +76 -676
- package/skills/generate-env/src/runtime.ts +30 -0
- package/skills/generate-env/src/types.ts +32 -0
- package/skills/generate-favicon/package.json +3 -1
- package/skills/generate-mock-data/package.json +3 -1
- package/skills/generate-mock-data/src/ai.ts +102 -0
- package/skills/generate-mock-data/src/formatters.ts +84 -0
- package/skills/generate-mock-data/src/generator.ts +377 -0
- package/skills/generate-mock-data/src/index.ts +15 -716
- package/skills/generate-mock-data/src/logger.ts +37 -0
- package/skills/generate-mock-data/src/presets.ts +110 -0
- package/skills/generate-mock-data/src/types.ts +21 -0
- package/skills/generate-pr-description/src/ai.ts +144 -0
- package/skills/generate-pr-description/src/cli.ts +80 -0
- package/skills/generate-pr-description/src/clipboard.ts +30 -0
- package/skills/generate-pr-description/src/formatters.ts +231 -0
- package/skills/generate-pr-description/src/git.ts +153 -0
- package/skills/generate-pr-description/src/index.ts +21 -714
- package/skills/generate-pr-description/src/types.ts +49 -0
- package/skills/generate-presentation/src/ai-clients.ts +61 -0
- package/skills/generate-presentation/src/cli.ts +126 -0
- package/skills/generate-presentation/src/index.ts +3 -751
- package/skills/generate-presentation/src/logger.ts +67 -0
- package/skills/generate-presentation/src/presentation-generator.ts +425 -0
- package/skills/generate-presentation/src/runtime.ts +6 -0
- package/skills/generate-presentation/src/security.ts +12 -0
- package/skills/generate-presentation/src/types.ts +28 -0
- package/skills/generate-qrcode/package.json +4 -1
- package/skills/generate-regex/package.json +3 -1
- package/skills/generate-resume/src/cli.ts +157 -0
- package/skills/generate-resume/src/index.ts +13 -917
- package/skills/generate-resume/src/parsers.ts +95 -0
- package/skills/generate-resume/src/renderers.ts +538 -0
- package/skills/generate-resume/src/security.ts +39 -0
- package/skills/generate-resume/src/types.ts +86 -0
- package/skills/generate-social-posts/src/ai.ts +88 -0
- package/skills/generate-social-posts/src/cli.ts +118 -0
- package/skills/generate-social-posts/src/exporters.ts +126 -0
- package/skills/generate-social-posts/src/generator.ts +130 -0
- package/skills/generate-social-posts/src/index.ts +19 -709
- package/skills/generate-social-posts/src/platforms.ts +39 -0
- package/skills/generate-social-posts/src/runtime.ts +34 -0
- package/skills/generate-social-posts/src/source.ts +116 -0
- package/skills/generate-social-posts/src/types.ts +58 -0
- package/skills/gif-maker/package.json +4 -1
- package/skills/github-manager/package.json +3 -1
- package/skills/gmail/CLAUDE.md +1 -1
- package/skills/highlight-reel-generator/src/index.ts +19 -0
- package/skills/hook/src/commands/create.ts +20 -845
- package/skills/hook/src/templates/root.ts +196 -0
- package/skills/hook/src/templates/source.ts +647 -0
- package/skills/http-server/package.json +3 -1
- package/skills/icon-pack/README.md +28 -0
- package/skills/icon-pack/SKILL.md +23 -0
- package/skills/icon-pack/package.json +29 -0
- package/skills/{audio ā icon-pack}/tsconfig.json +10 -12
- package/skills/image/package.json +1 -2
- package/skills/implementation-agent/package.json +3 -1
- package/skills/implementation-agent/src/ai-generation.ts +225 -0
- package/skills/implementation-agent/src/index.ts +3 -960
- package/skills/implementation-agent/src/minimist.d.ts +15 -0
- package/skills/implementation-agent/src/templates.ts +686 -0
- package/skills/implementation-agent/src/types.ts +53 -0
- package/skills/implementation-plan/package.json +3 -1
- package/skills/implementation-todo/package.json +3 -1
- package/skills/invoice/package.json +1 -1
- package/skills/invoice/src/index.ts +3 -0
- package/skills/invoice-reconciliation/SKILL.md +42 -0
- package/skills/invoice-reconciliation/package.json +10 -0
- package/skills/landing-page-pack/SKILL.md +47 -0
- package/skills/landing-page-pack/package.json +14 -0
- package/skills/latex-table-generator/package.json +3 -1
- package/skills/logo-design/SKILL.md +25 -44
- package/skills/logo-design/package.json +3 -15
- package/skills/lorem-generator/package.json +3 -1
- package/skills/lorem-generator/src/index.ts +13 -0
- package/skills/managehook/package.json +1 -1
- package/skills/managehook/src/index.ts +3 -0
- package/skills/managemcp/package.json +1 -1
- package/skills/managemcp/src/index.ts +3 -0
- package/skills/manageskill/package.json +1 -1
- package/skills/manageskill/src/index.ts +3 -0
- package/skills/markdown-validator/package.json +3 -1
- package/skills/markdown-validator/src/index.ts +1 -4
- package/skills/market-research-report/SKILL.md +41 -0
- package/skills/market-research-report/package.json +10 -0
- package/skills/mcp-builder/package.json +4 -1
- package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
- package/skills/mcp-builder/src/generators.ts +513 -0
- package/skills/mcp-builder/src/index.ts +7 -908
- package/skills/mcp-builder/src/minimist.d.ts +15 -0
- package/skills/mcp-builder/src/naming.ts +12 -0
- package/skills/mcp-builder/src/options.ts +170 -0
- package/skills/mcp-builder/src/templates.ts +149 -0
- package/skills/mcp-builder/src/types.ts +42 -0
- package/skills/meeting-pack/SKILL.md +43 -0
- package/skills/meeting-pack/package.json +10 -0
- package/skills/merge-pdfs/package.json +5 -1
- package/skills/migration-plan-pack/SKILL.md +45 -0
- package/skills/migration-plan-pack/package.json +10 -0
- package/skills/music/package.json +2 -3
- package/skills/music-album/SKILL.md +37 -0
- package/skills/music-album/package.json +10 -0
- package/skills/notion-manager/package.json +3 -1
- package/skills/npmpublish/CLAUDE.md +5 -8
- package/skills/npmpublish/README.md +5 -26
- package/skills/npmpublish/src/index.ts +9 -147
- package/skills/one-page-website/SKILL.md +46 -0
- package/skills/one-page-website/package.json +10 -0
- package/skills/one-page-website/tsconfig.json +8 -0
- package/skills/pdf-generate/src/cli.ts +162 -0
- package/skills/pdf-generate/src/html.ts +84 -0
- package/skills/pdf-generate/src/index.ts +11 -800
- package/skills/pdf-generate/src/markdown.ts +27 -0
- package/skills/pdf-generate/src/pdf-writer.ts +78 -0
- package/skills/pdf-generate/src/runtime.ts +34 -0
- package/skills/pdf-generate/src/security.ts +37 -0
- package/skills/pdf-generate/src/templates.ts +311 -0
- package/skills/pdf-generate/src/types.ts +28 -0
- package/skills/pdf-read/SKILL.md +10 -10
- package/skills/pdf-to-dataset/SKILL.md +45 -0
- package/skills/pdf-to-dataset/package.json +10 -0
- package/skills/pdf-to-markdown/SKILL.md +49 -0
- package/skills/pdf-to-markdown/package.json +10 -0
- package/skills/pdf-to-markdown/tsconfig.json +10 -0
- package/skills/performance-audit-report/SKILL.md +42 -0
- package/skills/performance-audit-report/package.json +10 -0
- package/skills/persona-based-adwriter/src/index.ts +19 -0
- package/skills/photo-album/SKILL.md +29 -0
- package/skills/photo-album/package.json +9 -0
- package/skills/photo-album/tsconfig.json +4 -0
- package/skills/pitch-deck/SKILL.md +43 -0
- package/skills/pitch-deck/package.json +9 -0
- package/skills/playlist-maker/SKILL.md +33 -0
- package/skills/playlist-maker/package.json +9 -0
- package/skills/playlist-maker/tsconfig.json +4 -0
- package/skills/product-mockup/SKILL.md +45 -0
- package/skills/product-mockup/package.json +3 -20
- package/skills/product-mockup/tsconfig.json +3 -5
- package/skills/project-retro-companion/src/index.ts +19 -0
- package/skills/proposal-pack/SKILL.md +45 -0
- package/skills/proposal-pack/package.json +10 -0
- package/skills/read-pdf/SKILL.md +5 -4
- package/skills/repo-onboarding-report/SKILL.md +42 -0
- package/skills/repo-onboarding-report/package.json +10 -0
- package/skills/sales-call-recapper/src/index.ts +20 -0
- package/skills/salescopy/package.json +1 -1
- package/skills/salescopy/src/index.ts +3 -0
- package/skills/scaffold-project/src/ai-detect.ts +136 -0
- package/skills/scaffold-project/src/file-generators.ts +292 -0
- package/skills/scaffold-project/src/index.ts +8 -991
- package/skills/scaffold-project/src/project-config.ts +338 -0
- package/skills/scaffold-project/src/templates.ts +173 -0
- package/skills/scaffold-project/src/types.ts +58 -0
- package/skills/scientific-figure-check/package.json +3 -1
- package/skills/sdk-generator/SKILL.md +45 -0
- package/skills/sdk-generator/package.json +10 -0
- package/skills/sdk-generator/tsconfig.json +8 -0
- package/skills/security-audit/src/index.ts +25 -6
- package/skills/security-audit-report/SKILL.md +40 -0
- package/skills/security-audit-report/package.json +10 -0
- package/skills/seo-content-pack/SKILL.md +44 -0
- package/skills/seo-content-pack/package.json +9 -0
- package/skills/short-video-pack/SKILL.md +30 -0
- package/skills/short-video-pack/package.json +10 -0
- package/skills/slack-assistant/package.json +3 -1
- package/skills/slide-deck-generator/SKILL.md +44 -0
- package/skills/slide-deck-generator/package.json +10 -0
- package/skills/sms/package.json +1 -1
- package/skills/sms/src/index.ts +15 -0
- package/skills/social-content-calendar/SKILL.md +45 -0
- package/skills/social-content-calendar/package.json +14 -0
- package/skills/split-pdf/package.json +4 -1
- package/skills/subtitle/package.json +2 -1
- package/skills/subtitle/src/index.ts +3 -0
- package/skills/terraform-generator/package.json +3 -1
- package/skills/test-suite-generator/SKILL.md +41 -0
- package/skills/test-suite-generator/package.json +10 -0
- package/skills/timesheet/package.json +1 -1
- package/skills/timesheet/src/index.ts +3 -0
- package/skills/transcript/SKILL.md +1 -8
- package/skills/validate-config/package.json +3 -1
- package/skills/video/package.json +6 -4
- package/skills/video-downloader/package.json +3 -1
- package/skills/video-highlight-pack/SKILL.md +44 -0
- package/skills/video-highlight-pack/package.json +10 -0
- package/skills/voiceover-jingle-pack/SKILL.md +28 -0
- package/skills/voiceover-jingle-pack/package.json +10 -0
- package/skills/watermark/package.json +6 -1
- package/skills/webcrawling/package.json +2 -1
- package/skills/write/SKILL.md +6 -6
- package/dist/server/serve.d.ts +0 -11
- package/skills/apidocs/.claude/settings.json +0 -5
- package/skills/audio/.env.example +0 -14
- package/skills/audio/QUICKSTART.md +0 -158
- package/skills/audio/README.md +0 -256
- package/skills/audio/src/index-local.ts +0 -206
- package/skills/audio/src/index.ts +0 -95
- package/skills/audio/src/providers/elevenlabs.ts +0 -115
- package/skills/audio/src/providers/google.ts +0 -116
- package/skills/audio/src/providers/minimax.ts +0 -83
- package/skills/audio/src/providers/openai.ts +0 -115
- package/skills/audio/src/types.ts +0 -79
- package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
- package/skills/audiobook-chapter-proofer/package.json +0 -27
- package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
- package/skills/browse/src/client.ts +0 -373
- package/skills/browse/src/index-local.ts +0 -430
- package/skills/browse/src/index.ts +0 -110
- package/skills/browse/src/sse-server.ts +0 -919
- package/skills/browse/src/types.ts +0 -104
- package/skills/consolelog/src/server/index.ts +0 -508
- package/skills/create-blog-article/CLAUDE.md +0 -19
- package/skills/create-blog-article/src/index.ts +0 -745
- package/skills/create-blog-article/tsconfig.json +0 -10
- package/skills/deepresearch/src/agents/query-generator.ts +0 -91
- package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
- package/skills/deepresearch/src/index.ts +0 -224
- package/skills/deepresearch/src/research.ts +0 -166
- package/skills/deepresearch/src/services/anthropic.ts +0 -69
- package/skills/deepresearch/src/services/exa.ts +0 -108
- package/skills/deepresearch/src/services/firecrawl.ts +0 -88
- package/skills/deepresearch/src/services/openai.ts +0 -81
- package/skills/deepresearch/src/types.ts +0 -76
- package/skills/deepresearch/src/utils/file.ts +0 -111
- package/skills/deepresearch/src/utils/logger.ts +0 -84
- package/skills/domainpurchase/src/server/index.ts +0 -332
- package/skills/domainsearch/src/server/index.ts +0 -229
- package/skills/e2bswarm/README.md +0 -135
- package/skills/e2bswarm/SKILL.md +0 -118
- package/skills/e2bswarm/examples/tasks-example.json +0 -38
- package/skills/e2bswarm/package.json +0 -59
- package/skills/e2bswarm/src/commands/collect.ts +0 -135
- package/skills/e2bswarm/src/commands/install.ts +0 -164
- package/skills/e2bswarm/src/commands/kill.ts +0 -62
- package/skills/e2bswarm/src/commands/spawn.ts +0 -134
- package/skills/e2bswarm/src/commands/status.ts +0 -90
- package/skills/e2bswarm/src/commands/sync.ts +0 -208
- package/skills/e2bswarm/src/index.ts +0 -121
- package/skills/e2bswarm/src/lib/config.ts +0 -75
- package/skills/e2bswarm/src/lib/e2b.ts +0 -490
- package/skills/e2bswarm/src/lib/github.ts +0 -253
- package/skills/e2bswarm/src/lib/logger.ts +0 -41
- package/skills/e2bswarm/src/lib/paths.ts +0 -75
- package/skills/e2bswarm/src/lib/tasks.ts +0 -320
- package/skills/e2bswarm/src/types/index.ts +0 -107
- package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
- package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
- package/skills/e2bswarm/templates/setup.sh +0 -21
- package/skills/e2bswarm/tsconfig.json +0 -19
- package/skills/generate-book-cover/src/index.ts +0 -694
- package/skills/image/src/index-local.ts +0 -206
- package/skills/image/src/index.ts +0 -96
- package/skills/image/src/providers/google.ts +0 -79
- package/skills/image/src/providers/minimax.ts +0 -94
- package/skills/image/src/providers/openai.ts +0 -80
- package/skills/image/src/providers/xai.ts +0 -73
- package/skills/image/src/types.ts +0 -37
- package/skills/logo-design/CLAUDE.md +0 -30
- package/skills/logo-design/src/index.ts +0 -322
- package/skills/managehook/src/server/index.ts +0 -108
- package/skills/managemcp/src/server/index.ts +0 -108
- package/skills/manageskill/src/server/index.ts +0 -108
- package/skills/music/CLAUDE.md +0 -9
- package/skills/music/src/index.ts +0 -94
- package/skills/music/tsconfig.json +0 -10
- package/skills/pdf-read/src/index.ts +0 -320
- package/skills/product-mockup/CLAUDE.md +0 -19
- package/skills/product-mockup/src/index.ts +0 -290
- package/skills/read-pdf/src/index.ts +0 -388
- package/skills/remove-background/src/index.ts +0 -405
- package/skills/scaffold-project/my-app/.env.example +0 -2
- package/skills/scaffold-project/my-app/README.md +0 -72
- package/skills/scaffold-project/my-app/package.json +0 -29
- package/skills/scaffold-project/my-app/src/index.ts +0 -23
- package/skills/scaffold-project/my-app/tsconfig.json +0 -33
- package/skills/sound-effects/SKILL.md +0 -34
- package/skills/sound-effects/package.json +0 -21
- package/skills/sound-effects/src/index.ts +0 -172
- package/skills/sound-effects/tsconfig.json +0 -8
- package/skills/transcript/src/chunker.ts +0 -215
- package/skills/transcript/src/formatter.ts +0 -134
- package/skills/transcript/src/index-local.ts +0 -226
- package/skills/transcript/src/index.ts +0 -110
- package/skills/transcript/src/providers/elevenlabs.ts +0 -133
- package/skills/transcript/src/providers/gemini.ts +0 -192
- package/skills/transcript/src/providers/index.ts +0 -54
- package/skills/transcript/src/providers/openai.ts +0 -203
- package/skills/transcript/src/types.ts +0 -106
- package/skills/video/.env.example +0 -14
- package/skills/video/EXAMPLES.md +0 -266
- package/skills/video/LICENSE +0 -192
- package/skills/video/README.md +0 -174
- package/skills/video/src/cli.ts +0 -155
- package/skills/video/src/index-local.ts +0 -148
- package/skills/video/src/index.ts +0 -96
- package/skills/video/src/providers/google-veo.ts +0 -126
- package/skills/video/src/providers/index.ts +0 -22
- package/skills/video/src/providers/minimax.ts +0 -100
- package/skills/video/src/providers/openai-sora.ts +0 -164
- package/skills/video/src/providers/runway.ts +0 -159
- package/skills/video/src/types.ts +0 -35
- package/skills/video/tsconfig.json +0 -22
- package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
- package/skills/voiceover-casting-assistant/package.json +0 -27
- package/skills/voiceover-casting-assistant/src/index.ts +0 -255
- package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
- package/skills/webcrawling/src/commands/config.ts +0 -34
- package/skills/webcrawling/src/commands/crawl.ts +0 -33
- package/skills/webcrawling/src/commands/scrape.ts +0 -32
- package/skills/webcrawling/src/commands/sessions.ts +0 -42
- package/skills/webcrawling/src/lib/crawler.ts +0 -174
- package/skills/webcrawling/src/lib/storage.ts +0 -130
- package/skills/webcrawling/src/types/index.ts +0 -45
- package/skills/webcrawling/src/utils/logger.ts +0 -30
- package/skills/webcrawling/src/utils/paths.ts +0 -28
- /package/skills/{audiobook-chapter-proofer ā blog-article}/tsconfig.json +0 -0
|
@@ -1,694 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Generate Book Cover - AI-powered book cover generation
|
|
5
|
-
*
|
|
6
|
-
* This script generates professional book covers using DALL-E 3 with customizable
|
|
7
|
-
* genres, dimensions, styles, and text overlays.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { parseArgs } from "util";
|
|
11
|
-
import { mkdir, writeFile, appendFile } from "fs/promises";
|
|
12
|
-
import { join } from "path";
|
|
13
|
-
import { existsSync, mkdirSync } from "fs";
|
|
14
|
-
import OpenAI from "openai";
|
|
15
|
-
import { randomUUID } from "crypto";
|
|
16
|
-
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Constants & Logging
|
|
19
|
-
// ============================================================================
|
|
20
|
-
|
|
21
|
-
const SKILL_NAME = "generate-book-cover";
|
|
22
|
-
const SESSION_ID = randomUUID().slice(0, 8);
|
|
23
|
-
const SKILLS_OUTPUT_DIR = process.env.SKILLS_OUTPUT_DIR || join(process.cwd(), ".skills");
|
|
24
|
-
const LOGS_DIR = join(SKILLS_OUTPUT_DIR, "logs", SKILL_NAME);
|
|
25
|
-
const SESSION_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, "_").slice(0, 19);
|
|
26
|
-
|
|
27
|
-
function ensureDir(dir: string) {
|
|
28
|
-
if (!existsSync(dir)) {
|
|
29
|
-
mkdirSync(dir, { recursive: true });
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async function log(message: string, level: "info" | "error" | "success" | "debug" = "info") {
|
|
34
|
-
ensureDir(LOGS_DIR);
|
|
35
|
-
const timestamp = new Date().toISOString();
|
|
36
|
-
const logFile = join(LOGS_DIR, `log_${SESSION_TIMESTAMP}_${SESSION_ID}.log`);
|
|
37
|
-
const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
await appendFile(logFile, logEntry);
|
|
41
|
-
} catch (e) {
|
|
42
|
-
// Silent fail for logging
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const prefix = level === "error" ? "ā" : level === "success" ? "ā
" : level === "debug" ? "š" : "ā¹ļø";
|
|
46
|
-
if (level === "error") {
|
|
47
|
-
console.error(`${prefix} ${message}`);
|
|
48
|
-
} else if (level !== "debug") {
|
|
49
|
-
console.log(`${prefix} ${message}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// ============================================================================
|
|
54
|
-
// Types & Interfaces
|
|
55
|
-
// ============================================================================
|
|
56
|
-
|
|
57
|
-
interface BookCoverOptions {
|
|
58
|
-
title: string;
|
|
59
|
-
genre: string;
|
|
60
|
-
author?: string;
|
|
61
|
-
subtitle?: string;
|
|
62
|
-
tagline?: string;
|
|
63
|
-
series?: string;
|
|
64
|
-
style: string;
|
|
65
|
-
dimensions: string;
|
|
66
|
-
colors?: string;
|
|
67
|
-
fontStyle: string;
|
|
68
|
-
includeSpine: boolean;
|
|
69
|
-
includeBack: boolean;
|
|
70
|
-
fullWrap: boolean;
|
|
71
|
-
spineWidth?: number;
|
|
72
|
-
pageCount: number;
|
|
73
|
-
variations: number;
|
|
74
|
-
styles?: string[];
|
|
75
|
-
quality: "standard" | "hd";
|
|
76
|
-
aspectFocus: string;
|
|
77
|
-
mood?: string;
|
|
78
|
-
output: string;
|
|
79
|
-
format: "png" | "jpg" | "both";
|
|
80
|
-
prefix?: string;
|
|
81
|
-
includeMockup: boolean;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
interface DimensionSpec {
|
|
85
|
-
format: string;
|
|
86
|
-
width: number;
|
|
87
|
-
height: number;
|
|
88
|
-
dpi: number;
|
|
89
|
-
bleed?: number;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
interface GeneratedCover {
|
|
93
|
-
type: "front" | "spine" | "back" | "full-wrap" | "mockup";
|
|
94
|
-
filename: string;
|
|
95
|
-
url: string;
|
|
96
|
-
prompt: string;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
interface CoverMetadata {
|
|
100
|
-
title: string;
|
|
101
|
-
author?: string;
|
|
102
|
-
genre: string;
|
|
103
|
-
style: string;
|
|
104
|
-
dimensions: DimensionSpec;
|
|
105
|
-
colors?: string[];
|
|
106
|
-
mood?: string;
|
|
107
|
-
generatedAt: string;
|
|
108
|
-
aiPrompt: string;
|
|
109
|
-
files: {
|
|
110
|
-
front?: string;
|
|
111
|
-
spine?: string;
|
|
112
|
-
back?: string;
|
|
113
|
-
fullWrap?: string;
|
|
114
|
-
mockup?: string;
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// ============================================================================
|
|
119
|
-
// Constants
|
|
120
|
-
// ============================================================================
|
|
121
|
-
|
|
122
|
-
const DIMENSIONS: Record<string, DimensionSpec> = {
|
|
123
|
-
paperback: { format: "paperback", width: 1800, height: 2700, dpi: 300 },
|
|
124
|
-
hardcover: { format: "hardcover", width: 1875, height: 2775, dpi: 300, bleed: 0.125 },
|
|
125
|
-
ebook: { format: "ebook", width: 1600, height: 2400, dpi: 300 },
|
|
126
|
-
square: { format: "square", width: 2400, height: 2400, dpi: 300 },
|
|
127
|
-
trade: { format: "trade", width: 1650, height: 2550, dpi: 300 },
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
const GENRE_KEYWORDS: Record<string, string[]> = {
|
|
131
|
-
fiction: ["literary", "contemporary", "artistic"],
|
|
132
|
-
"non-fiction": ["professional", "educational", "informative"],
|
|
133
|
-
"sci-fi": ["futuristic", "space", "technology", "alien", "cyberpunk"],
|
|
134
|
-
fantasy: ["magical", "medieval", "mystical", "dragons", "enchanted"],
|
|
135
|
-
romance: ["romantic", "passionate", "soft lighting", "couples", "flowers"],
|
|
136
|
-
thriller: ["dark", "tense", "mysterious", "suspenseful", "urban"],
|
|
137
|
-
mystery: ["noir", "detective", "shadows", "clues", "investigation"],
|
|
138
|
-
horror: ["dark", "scary", "haunting", "supernatural", "eerie"],
|
|
139
|
-
business: ["professional", "corporate", "clean", "modern", "success"],
|
|
140
|
-
"self-help": ["uplifting", "inspiring", "peaceful", "transformation"],
|
|
141
|
-
biography: ["portrait", "historical", "personal", "legacy"],
|
|
142
|
-
history: ["historical", "documentary", "archival", "period"],
|
|
143
|
-
children: ["colorful", "playful", "fun", "illustrated", "whimsical"],
|
|
144
|
-
"young-adult": ["dynamic", "coming-of-age", "vibrant", "teen"],
|
|
145
|
-
literary: ["sophisticated", "artistic", "elegant", "thoughtful"],
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const COLOR_PALETTES: Record<string, string[]> = {
|
|
149
|
-
ocean: ["deep blue", "turquoise", "white", "sea foam"],
|
|
150
|
-
sunset: ["orange", "pink", "purple", "gold"],
|
|
151
|
-
monochrome: ["black", "white", "grey"],
|
|
152
|
-
forest: ["deep green", "brown", "gold", "moss"],
|
|
153
|
-
fire: ["red", "orange", "yellow", "black"],
|
|
154
|
-
ice: ["light blue", "white", "silver", "pale purple"],
|
|
155
|
-
royal: ["purple", "gold", "deep red", "black"],
|
|
156
|
-
earth: ["brown", "tan", "forest green", "terracotta"],
|
|
157
|
-
midnight: ["navy", "black", "silver", "deep purple"],
|
|
158
|
-
vintage: ["sepia", "cream", "muted gold", "brown"],
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
// ============================================================================
|
|
162
|
-
// Helper Functions
|
|
163
|
-
// ============================================================================
|
|
164
|
-
|
|
165
|
-
function slugify(text: string): string {
|
|
166
|
-
return text
|
|
167
|
-
.toLowerCase()
|
|
168
|
-
.replace(/[^\w\s-]/g, "")
|
|
169
|
-
.replace(/\s+/g, "-")
|
|
170
|
-
.replace(/-+/g, "-")
|
|
171
|
-
.trim();
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function parseColorInput(colorInput?: string): string[] {
|
|
175
|
-
if (!colorInput) return [];
|
|
176
|
-
|
|
177
|
-
// Check if it's a predefined palette
|
|
178
|
-
if (COLOR_PALETTES[colorInput.toLowerCase()]) {
|
|
179
|
-
return COLOR_PALETTES[colorInput.toLowerCase()];
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Parse as comma-separated colors
|
|
183
|
-
return colorInput.split(",").map(c => c.trim()).filter(Boolean);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function calculateSpineWidth(pageCount: number, paperType: "standard" | "premium" = "standard"): number {
|
|
187
|
-
// Standard calculation: pages * paper thickness
|
|
188
|
-
// 60# paper = 0.0025 inches per sheet (0.005 per page since it's double-sided)
|
|
189
|
-
// 70# paper = 0.003 inches per sheet
|
|
190
|
-
const thickness = paperType === "standard" ? 0.0025 : 0.003;
|
|
191
|
-
return (pageCount / 2) * thickness;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
function generatePrompt(options: BookCoverOptions, coverType: "front" | "spine" | "back" | "full-wrap"): string {
|
|
195
|
-
const { title, genre, style, colors, mood, author, subtitle, series, fontStyle } = options;
|
|
196
|
-
|
|
197
|
-
// Get genre-specific keywords
|
|
198
|
-
const genreKeywords = GENRE_KEYWORDS[genre] || GENRE_KEYWORDS.fiction;
|
|
199
|
-
|
|
200
|
-
// Parse colors
|
|
201
|
-
const colorList = colors ? parseColorInput(colors) : [];
|
|
202
|
-
|
|
203
|
-
let prompt = `Professional ${genre} book cover design, ${style} style. `;
|
|
204
|
-
|
|
205
|
-
// Cover type specific
|
|
206
|
-
if (coverType === "front") {
|
|
207
|
-
prompt += `Front cover only. `;
|
|
208
|
-
|
|
209
|
-
// Add title and typography
|
|
210
|
-
prompt += `Large bold title "${title}" prominently displayed. `;
|
|
211
|
-
if (fontStyle) {
|
|
212
|
-
prompt += `${fontStyle} typography. `;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (author) {
|
|
216
|
-
prompt += `Author name "${author}" elegantly placed. `;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (subtitle) {
|
|
220
|
-
prompt += `Subtitle "${subtitle}" in smaller text. `;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
if (series) {
|
|
224
|
-
prompt += `Series indicator "${series}". `;
|
|
225
|
-
}
|
|
226
|
-
} else if (coverType === "spine") {
|
|
227
|
-
prompt += `Book spine design with vertical text. `;
|
|
228
|
-
prompt += `Title "${title}" and author "${author || "Author"}" on spine. `;
|
|
229
|
-
} else if (coverType === "back") {
|
|
230
|
-
prompt += `Back cover design with space for book description. `;
|
|
231
|
-
prompt += `Clean layout with barcode area. `;
|
|
232
|
-
} else if (coverType === "full-wrap") {
|
|
233
|
-
prompt += `Complete book wraparound cover (front, spine, and back). `;
|
|
234
|
-
prompt += `Title "${title}" on front and spine. `;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Add genre elements
|
|
238
|
-
prompt += `Incorporating ${genreKeywords.slice(0, 3).join(", ")} elements. `;
|
|
239
|
-
|
|
240
|
-
// Add style specifics
|
|
241
|
-
switch (style) {
|
|
242
|
-
case "minimalist":
|
|
243
|
-
prompt += `Clean, simple design with lots of negative space. Minimal elements. `;
|
|
244
|
-
break;
|
|
245
|
-
case "illustrated":
|
|
246
|
-
prompt += `Hand-drawn or digitally illustrated artwork. Artistic and detailed. `;
|
|
247
|
-
break;
|
|
248
|
-
case "photographic":
|
|
249
|
-
prompt += `High-quality photographic imagery. Realistic and cinematic. `;
|
|
250
|
-
break;
|
|
251
|
-
case "typographic":
|
|
252
|
-
prompt += `Typography-focused design. Bold, creative text treatment as main element. `;
|
|
253
|
-
break;
|
|
254
|
-
case "abstract":
|
|
255
|
-
prompt += `Abstract shapes and patterns. Modern and artistic interpretation. `;
|
|
256
|
-
break;
|
|
257
|
-
case "vintage":
|
|
258
|
-
prompt += `Vintage or retro aesthetic. Classic design elements. `;
|
|
259
|
-
break;
|
|
260
|
-
case "modern":
|
|
261
|
-
prompt += `Contemporary and sleek design. Current trends. `;
|
|
262
|
-
break;
|
|
263
|
-
case "bold":
|
|
264
|
-
prompt += `Strong, impactful design. High contrast and dramatic. `;
|
|
265
|
-
break;
|
|
266
|
-
case "elegant":
|
|
267
|
-
prompt += `Sophisticated and refined. Graceful composition. `;
|
|
268
|
-
break;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Add colors
|
|
272
|
-
if (colorList.length > 0) {
|
|
273
|
-
prompt += `Color palette: ${colorList.join(", ")}. `;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Add mood
|
|
277
|
-
if (mood) {
|
|
278
|
-
prompt += `Overall mood: ${mood}. `;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Add professional requirements
|
|
282
|
-
prompt += `Professional quality, suitable for print. High-resolution, balanced composition. `;
|
|
283
|
-
prompt += `Cover should be visually appealing and genre-appropriate.`;
|
|
284
|
-
|
|
285
|
-
return prompt;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
async function generateImageWithDallE(
|
|
289
|
-
openai: OpenAI,
|
|
290
|
-
prompt: string,
|
|
291
|
-
quality: "standard" | "hd",
|
|
292
|
-
dimensions: DimensionSpec
|
|
293
|
-
): Promise<string> {
|
|
294
|
-
log(`Generating image with DALL-E 3...`, "debug");
|
|
295
|
-
log(`Prompt: ${prompt.substring(0, 100)}...`, "debug");
|
|
296
|
-
|
|
297
|
-
try {
|
|
298
|
-
// DALL-E 3 only supports 1024x1024, 1024x1792, or 1792x1024
|
|
299
|
-
// We'll request the appropriate size and note that post-processing would be needed
|
|
300
|
-
const aspectRatio = dimensions.width / dimensions.height;
|
|
301
|
-
let size: "1024x1024" | "1024x1792" | "1792x1024" = "1024x1792";
|
|
302
|
-
|
|
303
|
-
if (Math.abs(aspectRatio - 1) < 0.1) {
|
|
304
|
-
size = "1024x1024"; // Square
|
|
305
|
-
} else if (aspectRatio > 1) {
|
|
306
|
-
size = "1792x1024"; // Landscape
|
|
307
|
-
} else {
|
|
308
|
-
size = "1024x1792"; // Portrait
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
const response = await openai.images.generate({
|
|
312
|
-
model: "dall-e-3",
|
|
313
|
-
prompt: prompt,
|
|
314
|
-
n: 1,
|
|
315
|
-
size: size,
|
|
316
|
-
quality: quality,
|
|
317
|
-
style: "vivid",
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
const imageUrl = response.data[0]?.url;
|
|
321
|
-
if (!imageUrl) {
|
|
322
|
-
throw new Error("No image URL returned from DALL-E");
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
log(`Image generated successfully`, "success");
|
|
326
|
-
return imageUrl;
|
|
327
|
-
} catch (error) {
|
|
328
|
-
log(`Failed to generate image: ${error}`, "error");
|
|
329
|
-
throw error;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
async function downloadImage(url: string, outputPath: string): Promise<void> {
|
|
334
|
-
log(`Downloading image...`, "debug");
|
|
335
|
-
log(`URL: ${url.substring(0, 50)}...`, "debug");
|
|
336
|
-
log(`Output: ${outputPath}`, "debug");
|
|
337
|
-
|
|
338
|
-
try {
|
|
339
|
-
const response = await fetch(url);
|
|
340
|
-
if (!response.ok) {
|
|
341
|
-
throw new Error(`Failed to download image: ${response.statusText}`);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
345
|
-
const buffer = Buffer.from(arrayBuffer);
|
|
346
|
-
|
|
347
|
-
await writeFile(outputPath, buffer);
|
|
348
|
-
log(`Image saved successfully`, "success");
|
|
349
|
-
} catch (error) {
|
|
350
|
-
log(`Failed to download image: ${error}`, "error");
|
|
351
|
-
throw error;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
async function generateCover(
|
|
356
|
-
openai: OpenAI,
|
|
357
|
-
options: BookCoverOptions,
|
|
358
|
-
coverType: "front" | "spine" | "back" | "full-wrap",
|
|
359
|
-
outputDir: string,
|
|
360
|
-
filePrefix: string
|
|
361
|
-
): Promise<GeneratedCover> {
|
|
362
|
-
const prompt = generatePrompt(options, coverType);
|
|
363
|
-
const dimensions = DIMENSIONS[options.dimensions];
|
|
364
|
-
|
|
365
|
-
const imageUrl = await generateImageWithDallE(openai, prompt, options.quality, dimensions);
|
|
366
|
-
|
|
367
|
-
const ext = options.format === "jpg" ? "jpg" : "png";
|
|
368
|
-
const filename = `${filePrefix}-${coverType}.${ext}`;
|
|
369
|
-
const filepath = join(outputDir, filename);
|
|
370
|
-
|
|
371
|
-
await downloadImage(imageUrl, filepath);
|
|
372
|
-
|
|
373
|
-
return {
|
|
374
|
-
type: coverType,
|
|
375
|
-
filename,
|
|
376
|
-
url: imageUrl,
|
|
377
|
-
prompt,
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
async function generateMockup(
|
|
382
|
-
openai: OpenAI,
|
|
383
|
-
options: BookCoverOptions,
|
|
384
|
-
frontCoverPath: string,
|
|
385
|
-
outputDir: string,
|
|
386
|
-
filePrefix: string
|
|
387
|
-
): Promise<GeneratedCover> {
|
|
388
|
-
log(`Generating 3D book mockup...`, "info");
|
|
389
|
-
|
|
390
|
-
const prompt = `3D realistic book mockup, ${options.dimensions} book standing upright at a slight angle,
|
|
391
|
-
professional photography, clean white background, soft shadows, studio lighting,
|
|
392
|
-
photorealistic rendering, high quality product photography`;
|
|
393
|
-
|
|
394
|
-
const dimensions = { format: "mockup", width: 2048, height: 2048, dpi: 300 };
|
|
395
|
-
|
|
396
|
-
const imageUrl = await generateImageWithDallE(openai, prompt, "hd", dimensions);
|
|
397
|
-
|
|
398
|
-
const ext = options.format === "jpg" ? "jpg" : "png";
|
|
399
|
-
const filename = `${filePrefix}-mockup.${ext}`;
|
|
400
|
-
const filepath = join(outputDir, filename);
|
|
401
|
-
|
|
402
|
-
await downloadImage(imageUrl, filepath);
|
|
403
|
-
|
|
404
|
-
return {
|
|
405
|
-
type: "mockup",
|
|
406
|
-
filename,
|
|
407
|
-
url: imageUrl,
|
|
408
|
-
prompt,
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
async function saveMetadata(
|
|
413
|
-
options: BookCoverOptions,
|
|
414
|
-
generatedCovers: GeneratedCover[],
|
|
415
|
-
outputDir: string
|
|
416
|
-
): Promise<void> {
|
|
417
|
-
const metadata: CoverMetadata = {
|
|
418
|
-
title: options.title,
|
|
419
|
-
author: options.author,
|
|
420
|
-
genre: options.genre,
|
|
421
|
-
style: options.style,
|
|
422
|
-
dimensions: DIMENSIONS[options.dimensions],
|
|
423
|
-
colors: options.colors ? parseColorInput(options.colors) : undefined,
|
|
424
|
-
mood: options.mood,
|
|
425
|
-
generatedAt: new Date().toISOString(),
|
|
426
|
-
aiPrompt: generatedCovers[0]?.prompt || "",
|
|
427
|
-
files: {},
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
for (const cover of generatedCovers) {
|
|
431
|
-
metadata.files[cover.type === "full-wrap" ? "fullWrap" : cover.type] = cover.filename;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
const metadataPath = join(outputDir, "metadata.json");
|
|
435
|
-
await writeFile(metadataPath, JSON.stringify(metadata, null, 2));
|
|
436
|
-
|
|
437
|
-
log(`Metadata saved to ${metadataPath}`, "success");
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
async function generateReadme(outputDir: string): Promise<void> {
|
|
441
|
-
const readme = `# Generated Book Covers
|
|
442
|
-
|
|
443
|
-
This directory contains AI-generated book covers created with the generate-book-cover skill.
|
|
444
|
-
|
|
445
|
-
## Using Your Covers
|
|
446
|
-
|
|
447
|
-
### For Digital Publishing (Ebook)
|
|
448
|
-
- Use the \`*-front.png\` file
|
|
449
|
-
- Upload to Amazon KDP, Draft2Digital, or other platforms
|
|
450
|
-
- Recommended: 1600x2400px for ebooks
|
|
451
|
-
|
|
452
|
-
### For Print Publishing
|
|
453
|
-
- Use the \`*-full-wrap.png\` file if available (includes front, spine, and back)
|
|
454
|
-
- Or use individual \`*-front.png\`, \`*-spine.png\`, \`*-back.png\` files
|
|
455
|
-
- Ensure 300 DPI resolution for professional printing
|
|
456
|
-
- Convert RGB to CMYK before sending to printer
|
|
457
|
-
|
|
458
|
-
### For Marketing
|
|
459
|
-
- Use the \`*-mockup.png\` file for promotional materials
|
|
460
|
-
- Share on social media, websites, and advertising
|
|
461
|
-
|
|
462
|
-
## File Formats
|
|
463
|
-
|
|
464
|
-
- **PNG**: Lossless format, best for editing and archiving
|
|
465
|
-
- **JPG**: Smaller file size, suitable for web use
|
|
466
|
-
|
|
467
|
-
## Next Steps
|
|
468
|
-
|
|
469
|
-
1. Review the generated covers in this directory
|
|
470
|
-
2. Edit text overlays if needed (use Photoshop, GIMP, or Canva)
|
|
471
|
-
3. Convert to CMYK for print (use Adobe Photoshop or online tools)
|
|
472
|
-
4. Upload to your publishing platform
|
|
473
|
-
|
|
474
|
-
## Metadata
|
|
475
|
-
|
|
476
|
-
Each cover includes a \`metadata.json\` file with:
|
|
477
|
-
- Book title and author
|
|
478
|
-
- Genre and style used
|
|
479
|
-
- Dimensions and specifications
|
|
480
|
-
- Color palette
|
|
481
|
-
- AI prompt used for generation
|
|
482
|
-
|
|
483
|
-
## Need Help?
|
|
484
|
-
|
|
485
|
-
- Regenerate with different options: \`skills run generate-book-cover --help\`
|
|
486
|
-
- Visit: https://skills.md/docs/generate-book-cover
|
|
487
|
-
- Support: support@skills.md
|
|
488
|
-
`;
|
|
489
|
-
|
|
490
|
-
const readmePath = join(outputDir, "README.md");
|
|
491
|
-
await writeFile(readmePath, readme);
|
|
492
|
-
|
|
493
|
-
log(`README saved to ${readmePath}`, "success");
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// ============================================================================
|
|
497
|
-
// Main Function
|
|
498
|
-
// ============================================================================
|
|
499
|
-
|
|
500
|
-
async function main() {
|
|
501
|
-
log(`Starting ${SKILL_NAME} session: ${SESSION_ID}`, "debug");
|
|
502
|
-
|
|
503
|
-
// Parse command-line arguments
|
|
504
|
-
const { values, positionals } = parseArgs({
|
|
505
|
-
args: process.argv.slice(2),
|
|
506
|
-
options: {
|
|
507
|
-
genre: { type: "string", default: "fiction" },
|
|
508
|
-
author: { type: "string" },
|
|
509
|
-
subtitle: { type: "string" },
|
|
510
|
-
tagline: { type: "string" },
|
|
511
|
-
series: { type: "string" },
|
|
512
|
-
style: { type: "string", default: "modern" },
|
|
513
|
-
dimensions: { type: "string", default: "paperback" },
|
|
514
|
-
colors: { type: "string" },
|
|
515
|
-
"font-style": { type: "string", default: "serif" },
|
|
516
|
-
"include-spine": { type: "boolean", default: false },
|
|
517
|
-
"include-back": { type: "boolean", default: false },
|
|
518
|
-
"full-wrap": { type: "boolean", default: false },
|
|
519
|
-
"spine-width": { type: "string" },
|
|
520
|
-
"page-count": { type: "string", default: "200" },
|
|
521
|
-
variations: { type: "string", default: "1" },
|
|
522
|
-
styles: { type: "string" },
|
|
523
|
-
quality: { type: "string", default: "hd" },
|
|
524
|
-
"aspect-focus": { type: "string", default: "center" },
|
|
525
|
-
mood: { type: "string" },
|
|
526
|
-
output: { type: "string" },
|
|
527
|
-
format: { type: "string", default: "png" },
|
|
528
|
-
prefix: { type: "string" },
|
|
529
|
-
"include-mockup": { type: "boolean", default: false },
|
|
530
|
-
help: { type: "boolean", short: "h" },
|
|
531
|
-
},
|
|
532
|
-
allowPositionals: true,
|
|
533
|
-
});
|
|
534
|
-
|
|
535
|
-
// Show help
|
|
536
|
-
if (values.help) {
|
|
537
|
-
console.log(`
|
|
538
|
-
Generate Book Cover - AI-Powered Book Cover Design
|
|
539
|
-
|
|
540
|
-
Usage:
|
|
541
|
-
skills run generate-book-cover -- "Book Title" [options]
|
|
542
|
-
|
|
543
|
-
Options:
|
|
544
|
-
--genre <string> Genre (fiction, non-fiction, sci-fi, etc.) [default: fiction]
|
|
545
|
-
--author <string> Author name
|
|
546
|
-
--subtitle <string> Book subtitle
|
|
547
|
-
--style <string> Visual style (modern, minimalist, etc.) [default: modern]
|
|
548
|
-
--dimensions <string> Format (paperback, hardcover, ebook) [default: paperback]
|
|
549
|
-
--colors <string> Color palette
|
|
550
|
-
--output <path> Output directory
|
|
551
|
-
--help, -h Show this help
|
|
552
|
-
`);
|
|
553
|
-
process.exit(0);
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
// Get title from positional argument
|
|
557
|
-
const title = positionals[0];
|
|
558
|
-
if (!title) {
|
|
559
|
-
log("Error: Book title is required", "error");
|
|
560
|
-
console.error("Usage: skills run generate-book-cover -- \"Your Book Title\" [options]");
|
|
561
|
-
process.exit(1);
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
// Get OpenAI API key
|
|
565
|
-
const apiKey = process.env.OPENAI_API_KEY;
|
|
566
|
-
if (!apiKey) {
|
|
567
|
-
log("Error: OPENAI_API_KEY environment variable is required", "error");
|
|
568
|
-
console.error("\nSet it with: export OPENAI_API_KEY='sk-...'");
|
|
569
|
-
process.exit(1);
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
// Initialize OpenAI client
|
|
573
|
-
const openai = new OpenAI({ apiKey });
|
|
574
|
-
|
|
575
|
-
// Parse options
|
|
576
|
-
const options: BookCoverOptions = {
|
|
577
|
-
title,
|
|
578
|
-
genre: values.genre as string,
|
|
579
|
-
author: values.author as string | undefined,
|
|
580
|
-
subtitle: values.subtitle as string | undefined,
|
|
581
|
-
tagline: values.tagline as string | undefined,
|
|
582
|
-
series: values.series as string | undefined,
|
|
583
|
-
style: values.style as string,
|
|
584
|
-
dimensions: values.dimensions as string,
|
|
585
|
-
colors: values.colors as string | undefined,
|
|
586
|
-
fontStyle: values["font-style"] as string,
|
|
587
|
-
includeSpine: values["include-spine"] as boolean,
|
|
588
|
-
includeBack: values["include-back"] as boolean,
|
|
589
|
-
fullWrap: values["full-wrap"] as boolean,
|
|
590
|
-
spineWidth: values["spine-width"] ? parseFloat(values["spine-width"] as string) : undefined,
|
|
591
|
-
pageCount: parseInt(values["page-count"] as string),
|
|
592
|
-
variations: parseInt(values.variations as string),
|
|
593
|
-
styles: values.styles ? (values.styles as string).split(",").map(s => s.trim()) : undefined,
|
|
594
|
-
quality: (values.quality as "standard" | "hd") || "hd",
|
|
595
|
-
aspectFocus: values["aspect-focus"] as string,
|
|
596
|
-
mood: values.mood as string | undefined,
|
|
597
|
-
output: values.output as string || process.env.SKILLS_OUTPUT_DIR || ".skills/exports/generate-book-cover",
|
|
598
|
-
format: (values.format as "png" | "jpg" | "both") || "png",
|
|
599
|
-
prefix: values.prefix as string | undefined,
|
|
600
|
-
includeMockup: values["include-mockup"] as boolean,
|
|
601
|
-
};
|
|
602
|
-
|
|
603
|
-
// Validate dimensions
|
|
604
|
-
if (!DIMENSIONS[options.dimensions]) {
|
|
605
|
-
log(`Error: Invalid dimensions "${options.dimensions}"`, "error");
|
|
606
|
-
console.error(`Valid options: ${Object.keys(DIMENSIONS).join(", ")}`);
|
|
607
|
-
process.exit(1);
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
// Calculate spine width if needed
|
|
611
|
-
if (options.includeSpine && !options.spineWidth) {
|
|
612
|
-
options.spineWidth = calculateSpineWidth(options.pageCount);
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
// Create output directory
|
|
616
|
-
const filePrefix = options.prefix || slugify(title);
|
|
617
|
-
const outputDir = join(options.output, filePrefix);
|
|
618
|
-
await mkdir(outputDir, { recursive: true });
|
|
619
|
-
|
|
620
|
-
log("Configuration:", "info");
|
|
621
|
-
log(` Title: ${options.title}`, "info");
|
|
622
|
-
log(` Genre: ${options.genre}`, "info");
|
|
623
|
-
log(` Style: ${options.style}`, "info");
|
|
624
|
-
log(` Output: ${outputDir}`, "info");
|
|
625
|
-
|
|
626
|
-
// Generate covers
|
|
627
|
-
const generatedCovers: GeneratedCover[] = [];
|
|
628
|
-
|
|
629
|
-
try {
|
|
630
|
-
// Generate variations if requested
|
|
631
|
-
const stylesToGenerate = options.styles || [options.style];
|
|
632
|
-
const numVariations = Math.min(options.variations, stylesToGenerate.length);
|
|
633
|
-
|
|
634
|
-
for (let i = 0; i < numVariations; i++) {
|
|
635
|
-
const variantStyle = stylesToGenerate[i] || options.style;
|
|
636
|
-
const variantOptions = { ...options, style: variantStyle };
|
|
637
|
-
const variantPrefix = numVariations > 1 ? `${filePrefix}-${i + 1}` : filePrefix;
|
|
638
|
-
|
|
639
|
-
log(`Generating variation ${i + 1} of ${numVariations} (${variantStyle} style)`, "info");
|
|
640
|
-
|
|
641
|
-
// Generate front cover (always)
|
|
642
|
-
const frontCover = await generateCover(openai, variantOptions, "front", outputDir, variantPrefix);
|
|
643
|
-
generatedCovers.push(frontCover);
|
|
644
|
-
|
|
645
|
-
// Generate spine if requested
|
|
646
|
-
if (options.includeSpine) {
|
|
647
|
-
const spineCover = await generateCover(openai, variantOptions, "spine", outputDir, variantPrefix);
|
|
648
|
-
generatedCovers.push(spineCover);
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
// Generate back cover if requested
|
|
652
|
-
if (options.includeBack) {
|
|
653
|
-
const backCover = await generateCover(openai, variantOptions, "back", outputDir, variantPrefix);
|
|
654
|
-
generatedCovers.push(backCover);
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// Generate full wrap if requested
|
|
658
|
-
if (options.fullWrap) {
|
|
659
|
-
const fullWrapCover = await generateCover(openai, variantOptions, "full-wrap", outputDir, variantPrefix);
|
|
660
|
-
generatedCovers.push(fullWrapCover);
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
// Generate mockup if requested
|
|
664
|
-
if (options.includeMockup) {
|
|
665
|
-
const mockup = await generateMockup(openai, variantOptions, frontCover.filename, outputDir, variantPrefix);
|
|
666
|
-
generatedCovers.push(mockup);
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
// Save metadata for this variation
|
|
670
|
-
await saveMetadata(variantOptions, generatedCovers, outputDir);
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
// Generate README
|
|
674
|
-
await generateReadme(outputDir);
|
|
675
|
-
|
|
676
|
-
// Success summary
|
|
677
|
-
log("Book cover generation complete!", "success");
|
|
678
|
-
console.log(`\nš Output directory: ${outputDir}`);
|
|
679
|
-
console.log(`\nš Generated files:`);
|
|
680
|
-
for (const cover of generatedCovers) {
|
|
681
|
-
console.log(` - ${cover.filename} (${cover.type})`);
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
} catch (error) {
|
|
685
|
-
log(`Error generating book cover: ${error}`, "error");
|
|
686
|
-
process.exit(1);
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
// Run the script
|
|
691
|
-
main().catch(error => {
|
|
692
|
-
console.error("Fatal error:", error);
|
|
693
|
-
process.exit(1);
|
|
694
|
-
});
|