@hasna/skills 0.0.2 → 0.0.3
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 +253 -715
- package/bin/mcp.js +221 -683
- package/package.json +1 -1
- package/src/cli/cli.test.ts +14 -14
- package/src/cli/index.tsx +1 -1
- package/src/lib/installer.test.ts +41 -41
- package/src/lib/registry.test.ts +10 -10
- package/src/lib/registry.ts +10 -472
- package/src/lib/skillinfo.test.ts +12 -12
- package/src/mcp/index.ts +1 -1
- package/skills/skill-architecture-docs/CLAUDE.md +0 -19
- package/skills/skill-architecture-docs/package.json +0 -32
- package/skills/skill-architecture-docs/src/index.ts +0 -543
- package/skills/skill-auto-format/CLAUDE.md +0 -19
- package/skills/skill-auto-format/package.json +0 -32
- package/skills/skill-auto-format/src/index.ts +0 -103
- package/skills/skill-auto-format/tsconfig.json +0 -14
- package/skills/skill-brainstorm/README.md +0 -17
- package/skills/skill-brainstorm/install.sh +0 -112
- package/skills/skill-brainstorm/src/auth.ts +0 -49
- package/skills/skill-brainstorm/src/installer.ts +0 -324
- package/skills/skill-brainstorm/src/skill-install.ts +0 -205
- package/skills/skill-browser-agent/CLAUDE.md +0 -19
- package/skills/skill-browser-agent/package.json +0 -32
- package/skills/skill-browser-agent/src/index.ts +0 -626
- package/skills/skill-browser-agent/tsconfig.json +0 -14
- package/skills/skill-browseruse/LICENSE +0 -21
- package/skills/skill-browseruse/README.md +0 -27
- package/skills/skill-browseruse/SKILL.md +0 -113
- package/skills/skill-browseruse/install.sh +0 -112
- package/skills/skill-browseruse/package.json +0 -31
- package/skills/skill-browseruse/src/auth.ts +0 -49
- package/skills/skill-browseruse/src/installer.ts +0 -324
- package/skills/skill-browseruse/src/skill-install.ts +0 -174
- package/skills/skill-calculate/LICENSE +0 -21
- package/skills/skill-calculate/README.md +0 -17
- package/skills/skill-calculate/install.sh +0 -112
- package/skills/skill-calculate/package.json +0 -31
- package/skills/skill-calculate/src/auth.ts +0 -49
- package/skills/skill-calculate/src/installer.ts +0 -324
- package/skills/skill-calculate/src/skill-install.ts +0 -205
- package/skills/skill-chromedevtools/LICENSE +0 -21
- package/skills/skill-chromedevtools/README.md +0 -27
- package/skills/skill-chromedevtools/SKILL.md +0 -110
- package/skills/skill-chromedevtools/install.sh +0 -112
- package/skills/skill-chromedevtools/package.json +0 -31
- package/skills/skill-chromedevtools/src/auth.ts +0 -49
- package/skills/skill-chromedevtools/src/installer.ts +0 -324
- package/skills/skill-chromedevtools/src/skill-install.ts +0 -174
- package/skills/skill-companyguide/LICENSE +0 -21
- package/skills/skill-companyguide/README.md +0 -17
- package/skills/skill-companyguide/install.sh +0 -112
- package/skills/skill-companyguide/package.json +0 -31
- package/skills/skill-companyguide/src/auth.ts +0 -49
- package/skills/skill-companyguide/src/installer.ts +0 -324
- package/skills/skill-companyguide/src/skill-install.ts +0 -205
- package/skills/skill-compose-gmail/tsconfig.json +0 -14
- package/skills/skill-context7/LICENSE +0 -21
- package/skills/skill-context7/README.md +0 -27
- package/skills/skill-context7/SKILL.md +0 -103
- package/skills/skill-context7/install.sh +0 -112
- package/skills/skill-context7/package.json +0 -31
- package/skills/skill-context7/src/auth.ts +0 -49
- package/skills/skill-context7/src/installer.ts +0 -324
- package/skills/skill-context7/src/skill-install.ts +0 -174
- package/skills/skill-crawl/LICENSE +0 -21
- package/skills/skill-crawl/README.md +0 -17
- package/skills/skill-crawl/install.sh +0 -112
- package/skills/skill-crawl/package.json +0 -31
- package/skills/skill-crawl/src/auth.ts +0 -49
- package/skills/skill-crawl/src/installer.ts +0 -324
- package/skills/skill-crawl/src/skill-install.ts +0 -205
- package/skills/skill-csv-transformer/CLAUDE.md +0 -19
- package/skills/skill-csv-transformer/package.json +0 -32
- package/skills/skill-csv-transformer/src/index.ts +0 -81
- package/skills/skill-csv-transformer/tsconfig.json +0 -14
- package/skills/skill-debug/LICENSE +0 -21
- package/skills/skill-debug/README.md +0 -17
- package/skills/skill-debug/install.sh +0 -112
- package/skills/skill-debug/package.json +0 -31
- package/skills/skill-debug/src/auth.ts +0 -49
- package/skills/skill-debug/src/installer.ts +0 -324
- package/skills/skill-debug/src/skill-install.ts +0 -205
- package/skills/skill-deep-research/CLAUDE.md +0 -19
- package/skills/skill-deep-research/package.json +0 -32
- package/skills/skill-deep-research/src/index.ts +0 -1149
- package/skills/skill-deep-research/tsconfig.json +0 -14
- package/skills/skill-dns-manager/CLAUDE.md +0 -19
- package/skills/skill-dns-manager/package.json +0 -32
- package/skills/skill-dns-manager/src/index.ts +0 -92
- package/skills/skill-dns-manager/tsconfig.json +0 -14
- package/skills/skill-download/LICENSE +0 -21
- package/skills/skill-download/README.md +0 -17
- package/skills/skill-download/install.sh +0 -112
- package/skills/skill-download/package.json +0 -31
- package/skills/skill-download/src/auth.ts +0 -49
- package/skills/skill-download/src/installer.ts +0 -324
- package/skills/skill-download/src/skill-install.ts +0 -205
- package/skills/skill-exa/LICENSE +0 -21
- package/skills/skill-exa/README.md +0 -26
- package/skills/skill-exa/SKILL.md +0 -92
- package/skills/skill-exa/install.sh +0 -112
- package/skills/skill-exa/package.json +0 -31
- package/skills/skill-exa/src/auth.ts +0 -49
- package/skills/skill-exa/src/installer.ts +0 -324
- package/skills/skill-exa/src/skill-install.ts +0 -174
- package/skills/skill-filesearch/LICENSE +0 -21
- package/skills/skill-filesearch/README.md +0 -17
- package/skills/skill-filesearch/install.sh +0 -112
- package/skills/skill-filesearch/package.json +0 -31
- package/skills/skill-filesearch/src/auth.ts +0 -49
- package/skills/skill-filesearch/src/installer.ts +0 -324
- package/skills/skill-filesearch/src/skill-install.ts +0 -205
- package/skills/skill-fill/LICENSE +0 -21
- package/skills/skill-fill/README.md +0 -17
- package/skills/skill-fill/install.sh +0 -112
- package/skills/skill-fill/package.json +0 -31
- package/skills/skill-fill/src/auth.ts +0 -49
- package/skills/skill-fill/src/installer.ts +0 -324
- package/skills/skill-fill/src/skill-install.ts +0 -205
- package/skills/skill-generate-audio/CLAUDE.md +0 -3
- package/skills/skill-generate-audio/SKILL.md +0 -53
- package/skills/skill-generate-audio/package.json +0 -30
- package/skills/skill-generate-audio/src/index.ts +0 -656
- package/skills/skill-generate-audio/tsconfig.json +0 -18
- package/skills/skill-generate-readme/CLAUDE.md +0 -19
- package/skills/skill-generate-readme/package.json +0 -32
- package/skills/skill-generate-readme/src/index.ts +0 -867
- package/skills/skill-generate-readme/tsconfig.json +0 -14
- package/skills/skill-generate-slides/CLAUDE.md +0 -19
- package/skills/skill-generate-slides/package.json +0 -32
- package/skills/skill-generate-slides/src/ai.ts +0 -140
- package/skills/skill-generate-slides/src/cli.ts +0 -161
- package/skills/skill-generate-slides/src/export.ts +0 -65
- package/skills/skill-generate-slides/src/index.ts +0 -1417
- package/skills/skill-generate-slides/src/layout.ts +0 -31
- package/skills/skill-generate-slides/src/parse.ts +0 -282
- package/skills/skill-generate-slides/src/render.ts +0 -711
- package/skills/skill-generate-slides/tsconfig.json +0 -14
- package/skills/skill-get-api-docs/CLAUDE.md +0 -19
- package/skills/skill-get-api-docs/package.json +0 -32
- package/skills/skill-get-api-docs/src/index.ts +0 -1176
- package/skills/skill-get-api-docs/tsconfig.json +0 -14
- package/skills/skill-googledrive/LICENSE +0 -21
- package/skills/skill-googledrive/README.md +0 -27
- package/skills/skill-googledrive/SKILL.md +0 -140
- package/skills/skill-googledrive/install.sh +0 -112
- package/skills/skill-googledrive/package.json +0 -31
- package/skills/skill-googledrive/src/auth.ts +0 -49
- package/skills/skill-googledrive/src/installer.ts +0 -324
- package/skills/skill-googledrive/src/skill-install.ts +0 -174
- package/skills/skill-grant-compliance-scanner/CLAUDE.md +0 -19
- package/skills/skill-grant-compliance-scanner/package.json +0 -32
- package/skills/skill-grant-compliance-scanner/src/index.ts +0 -94
- package/skills/skill-grant-compliance-scanner/tsconfig.json +0 -14
- package/skills/skill-hubsearch/LICENSE +0 -21
- package/skills/skill-hubsearch/README.md +0 -17
- package/skills/skill-hubsearch/install.sh +0 -112
- package/skills/skill-hubsearch/package.json +0 -31
- package/skills/skill-hubsearch/src/auth.ts +0 -49
- package/skills/skill-hubsearch/src/installer.ts +0 -324
- package/skills/skill-hubsearch/src/skill-install.ts +0 -205
- package/skills/skill-implementation-architecture/CLAUDE.md +0 -19
- package/skills/skill-implementation-architecture/package.json +0 -32
- package/skills/skill-implementation-architecture/src/index.ts +0 -460
- package/skills/skill-implementation-architecture/tsconfig.json +0 -14
- package/skills/skill-implementation-audit/CLAUDE.md +0 -19
- package/skills/skill-implementation-audit/package.json +0 -32
- package/skills/skill-implementation-audit/src/index.ts +0 -502
- package/skills/skill-implementation-audit/tsconfig.json +0 -14
- package/skills/skill-implementation-cost/CLAUDE.md +0 -19
- package/skills/skill-implementation-cost/package.json +0 -32
- package/skills/skill-implementation-cost/src/index.ts +0 -873
- package/skills/skill-implementation-cost/tsconfig.json +0 -14
- package/skills/skill-implementation-dispatch/CLAUDE.md +0 -19
- package/skills/skill-implementation-dispatch/package.json +0 -32
- package/skills/skill-implementation-dispatch/src/index.ts +0 -390
- package/skills/skill-implementation-dispatch/tsconfig.json +0 -14
- package/skills/skill-implementation-hook/CLAUDE.md +0 -19
- package/skills/skill-implementation-hook/package.json +0 -32
- package/skills/skill-implementation-hook/src/index.ts +0 -787
- package/skills/skill-implementation-hook/tsconfig.json +0 -14
- package/skills/skill-implementation-index/CLAUDE.md +0 -19
- package/skills/skill-implementation-index/package.json +0 -32
- package/skills/skill-implementation-index/src/index.ts +0 -767
- package/skills/skill-implementation-index/tsconfig.json +0 -14
- package/skills/skill-implementation-init/CLAUDE.md +0 -19
- package/skills/skill-implementation-init/package.json +0 -32
- package/skills/skill-implementation-init/src/index.ts +0 -378
- package/skills/skill-implementation-init/tsconfig.json +0 -14
- package/skills/skill-implementation-memento/CLAUDE.md +0 -19
- package/skills/skill-implementation-memento/package.json +0 -32
- package/skills/skill-implementation-memento/src/index.ts +0 -442
- package/skills/skill-implementation-memento/tsconfig.json +0 -14
- package/skills/skill-linear/LICENSE +0 -21
- package/skills/skill-linear/README.md +0 -28
- package/skills/skill-linear/SKILL.md +0 -94
- package/skills/skill-linear/install.sh +0 -112
- package/skills/skill-linear/package.json +0 -31
- package/skills/skill-linear/src/auth.ts +0 -49
- package/skills/skill-linear/src/installer.ts +0 -324
- package/skills/skill-linear/src/skill-install.ts +0 -174
- package/skills/skill-mail/LICENSE +0 -21
- package/skills/skill-mail/README.md +0 -17
- package/skills/skill-mail/install.sh +0 -112
- package/skills/skill-mail/package.json +0 -31
- package/skills/skill-mail/src/auth.ts +0 -49
- package/skills/skill-mail/src/installer.ts +0 -324
- package/skills/skill-mail/src/skill-install.ts +0 -205
- package/skills/skill-manage-gmail/CLAUDE.md +0 -19
- package/skills/skill-manage-gmail/package.json +0 -32
- package/skills/skill-manage-gmail/src/index.ts +0 -504
- package/skills/skill-manage-gmail/tsconfig.json +0 -14
- package/skills/skill-merch-mockup-factory/CLAUDE.md +0 -19
- package/skills/skill-merch-mockup-factory/package.json +0 -32
- package/skills/skill-merch-mockup-factory/src/index.ts +0 -296
- package/skills/skill-merch-mockup-factory/tsconfig.json +0 -14
- package/skills/skill-message/LICENSE +0 -21
- package/skills/skill-message/README.md +0 -17
- package/skills/skill-message/install.sh +0 -112
- package/skills/skill-message/package.json +0 -31
- package/skills/skill-message/src/auth.ts +0 -49
- package/skills/skill-message/src/installer.ts +0 -324
- package/skills/skill-message/src/skill-install.ts +0 -205
- package/skills/skill-newsletter-campaign-planner/CLAUDE.md +0 -19
- package/skills/skill-newsletter-campaign-planner/package.json +0 -32
- package/skills/skill-newsletter-campaign-planner/src/index.ts +0 -252
- package/skills/skill-newsletter-campaign-planner/tsconfig.json +0 -14
- package/skills/skill-notify/LICENSE +0 -21
- package/skills/skill-notify/README.md +0 -17
- package/skills/skill-notify/install.sh +0 -112
- package/skills/skill-notify/package.json +0 -31
- package/skills/skill-notify/src/auth.ts +0 -49
- package/skills/skill-notify/src/installer.ts +0 -324
- package/skills/skill-notify/src/skill-install.ts +0 -205
- package/skills/skill-notion/LICENSE +0 -21
- package/skills/skill-notion/README.md +0 -27
- package/skills/skill-notion/SKILL.md +0 -115
- package/skills/skill-notion/install.sh +0 -112
- package/skills/skill-notion/package.json +0 -31
- package/skills/skill-notion/src/auth.ts +0 -49
- package/skills/skill-notion/src/installer.ts +0 -324
- package/skills/skill-notion/src/skill-install.ts +0 -174
- package/skills/skill-parse-pdf/CLAUDE.md +0 -19
- package/skills/skill-parse-pdf/package.json +0 -32
- package/skills/skill-parse-pdf/src/index.ts +0 -581
- package/skills/skill-parse-pdf/tsconfig.json +0 -14
- package/skills/skill-playwright/LICENSE +0 -21
- package/skills/skill-playwright/README.md +0 -27
- package/skills/skill-playwright/SKILL.md +0 -116
- package/skills/skill-playwright/install.sh +0 -112
- package/skills/skill-playwright/package.json +0 -31
- package/skills/skill-playwright/src/auth.ts +0 -49
- package/skills/skill-playwright/src/installer.ts +0 -324
- package/skills/skill-playwright/src/skill-install.ts +0 -174
- package/skills/skill-projectbuild/LICENSE +0 -21
- package/skills/skill-projectbuild/README.md +0 -17
- package/skills/skill-projectbuild/install.sh +0 -112
- package/skills/skill-projectbuild/package.json +0 -31
- package/skills/skill-projectbuild/src/auth.ts +0 -49
- package/skills/skill-projectbuild/src/installer.ts +0 -324
- package/skills/skill-projectbuild/src/skill-install.ts +0 -205
- package/skills/skill-read-gmail/CLAUDE.md +0 -19
- package/skills/skill-read-gmail/package.json +0 -32
- package/skills/skill-read-gmail/src/index.ts +0 -343
- package/skills/skill-read-gmail/tsconfig.json +0 -14
- package/skills/skill-remember/LICENSE +0 -21
- package/skills/skill-remember/README.md +0 -17
- package/skills/skill-remember/install.sh +0 -112
- package/skills/skill-remember/package.json +0 -31
- package/skills/skill-remember/src/auth.ts +0 -49
- package/skills/skill-remember/src/installer.ts +0 -324
- package/skills/skill-remember/src/skill-install.ts +0 -205
- package/skills/skill-schedule/README.md +0 -17
- package/skills/skill-schedule/install.sh +0 -112
- package/skills/skill-schedule/src/auth.ts +0 -49
- package/skills/skill-schedule/src/installer.ts +0 -324
- package/skills/skill-schedule/src/skill-install.ts +0 -205
- package/skills/skill-search/LICENSE +0 -21
- package/skills/skill-search/README.md +0 -17
- package/skills/skill-search/install.sh +0 -112
- package/skills/skill-search/package.json +0 -31
- package/skills/skill-search/src/auth.ts +0 -49
- package/skills/skill-search/src/installer.ts +0 -324
- package/skills/skill-search/src/skill-install.ts +0 -205
- package/skills/skill-shadcn/LICENSE +0 -21
- package/skills/skill-shadcn/README.md +0 -27
- package/skills/skill-shadcn/SKILL.md +0 -113
- package/skills/skill-shadcn/install.sh +0 -112
- package/skills/skill-shadcn/package.json +0 -31
- package/skills/skill-shadcn/src/auth.ts +0 -49
- package/skills/skill-shadcn/src/installer.ts +0 -324
- package/skills/skill-shadcn/src/skill-install.ts +0 -174
- package/skills/skill-shadcn-theme/CLAUDE.md +0 -19
- package/skills/skill-shadcn-theme/package.json +0 -32
- package/skills/skill-shadcn-theme/src/index.ts +0 -16
- package/skills/skill-shadcn-theme/tsconfig.json +0 -14
- package/skills/skill-social-template-kit/CLAUDE.md +0 -19
- package/skills/skill-social-template-kit/package.json +0 -32
- package/skills/skill-social-template-kit/src/index.ts +0 -303
- package/skills/skill-social-template-kit/tsconfig.json +0 -14
- package/skills/skill-summarize/LICENSE +0 -21
- package/skills/skill-summarize/README.md +0 -17
- package/skills/skill-summarize/install.sh +0 -112
- package/skills/skill-summarize/package.json +0 -31
- package/skills/skill-summarize/src/auth.ts +0 -49
- package/skills/skill-summarize/src/installer.ts +0 -324
- package/skills/skill-summarize/src/skill-install.ts +0 -205
- package/skills/skill-sync/LICENSE +0 -21
- package/skills/skill-sync/README.md +0 -17
- package/skills/skill-sync/install.sh +0 -112
- package/skills/skill-sync/package.json +0 -31
- package/skills/skill-sync/src/auth.ts +0 -49
- package/skills/skill-sync/src/installer.ts +0 -324
- package/skills/skill-sync/src/skill-install.ts +0 -205
- package/skills/skill-time-blocking-orchestrator/CLAUDE.md +0 -19
- package/skills/skill-time-blocking-orchestrator/package.json +0 -32
- package/skills/skill-time-blocking-orchestrator/src/index.ts +0 -328
- package/skills/skill-time-blocking-orchestrator/tsconfig.json +0 -14
- package/skills/skill-transform/.env.example +0 -2
- package/skills/skill-transform/LICENSE +0 -21
- package/skills/skill-transform/README.md +0 -17
- package/skills/skill-transform/SKILL.md +0 -127
- package/skills/skill-transform/install.sh +0 -112
- package/skills/skill-transform/package.json +0 -37
- package/skills/skill-transform/src/auth.ts +0 -49
- package/skills/skill-transform/src/http-client.ts +0 -128
- package/skills/skill-transform/src/index-http.ts +0 -111
- package/skills/skill-transform/src/index-local.ts +0 -368
- package/skills/skill-transform/src/index.ts +0 -111
- package/skills/skill-transform/src/installer.ts +0 -324
- package/skills/skill-transform/src/skill-install.ts +0 -205
- package/skills/skill-transform/src/transformers/ai-transformer.ts +0 -202
- package/skills/skill-transform/src/transformers/format-detector.ts +0 -147
- package/skills/skill-transform/src/types.ts +0 -95
- package/skills/skill-transform/tsconfig.json +0 -18
- package/skills/skill-translate/LICENSE +0 -21
- package/skills/skill-translate/README.md +0 -17
- package/skills/skill-translate/install.sh +0 -112
- package/skills/skill-translate/package.json +0 -31
- package/skills/skill-translate/src/auth.ts +0 -49
- package/skills/skill-translate/src/installer.ts +0 -324
- package/skills/skill-translate/src/skill-install.ts +0 -205
- package/skills/skill-vendor-comparison-coach/CLAUDE.md +0 -19
- package/skills/skill-vendor-comparison-coach/package.json +0 -32
- package/skills/skill-vendor-comparison-coach/src/index.ts +0 -337
- package/skills/skill-vendor-comparison-coach/tsconfig.json +0 -14
- package/skills/skill-videodownload/.env.example +0 -5
- package/skills/skill-videodownload/CLAUDE.md +0 -64
- package/skills/skill-videodownload/LICENSE +0 -21
- package/skills/skill-videodownload/README.md +0 -166
- package/skills/skill-videodownload/package.json +0 -49
- package/skills/skill-videodownload/src/commands/config.ts +0 -89
- package/skills/skill-videodownload/src/commands/download.ts +0 -61
- package/skills/skill-videodownload/src/commands/info.ts +0 -83
- package/skills/skill-videodownload/src/commands/list.ts +0 -84
- package/skills/skill-videodownload/src/lib/downloader.ts +0 -270
- package/skills/skill-videodownload/src/lib/storage.ts +0 -167
- package/skills/skill-videodownload/src/types/index.ts +0 -64
- package/skills/skill-videodownload/src/utils/logger.ts +0 -49
- package/skills/skill-videodownload/src/utils/paths.ts +0 -94
- package/skills/skill-videodownload/tsconfig.json +0 -17
- package/skills/skill-voiceover/.env.example +0 -5
- package/skills/skill-voiceover/CLAUDE.md +0 -40
- package/skills/skill-voiceover/LICENSE +0 -21
- package/skills/skill-voiceover/README.md +0 -64
- package/skills/skill-voiceover/package.json +0 -43
- package/skills/skill-voiceover/src/commands/config.ts +0 -38
- package/skills/skill-voiceover/src/commands/generate.ts +0 -37
- package/skills/skill-voiceover/src/commands/voices.ts +0 -33
- package/skills/skill-voiceover/src/lib/generator.ts +0 -159
- package/skills/skill-voiceover/src/lib/storage.ts +0 -55
- package/skills/skill-voiceover/src/types/index.ts +0 -55
- package/skills/skill-voiceover/src/utils/logger.ts +0 -30
- package/skills/skill-voiceover/src/utils/paths.ts +0 -22
- package/skills/skill-voiceover/tsconfig.json +0 -17
- package/skills/skill-websearch/LICENSE +0 -21
- package/skills/skill-websearch/README.md +0 -17
- package/skills/skill-websearch/install.sh +0 -112
- package/skills/skill-websearch/package.json +0 -31
- package/skills/skill-websearch/src/auth.ts +0 -49
- package/skills/skill-websearch/src/installer.ts +0 -324
- package/skills/skill-websearch/src/skill-install.ts +0 -205
- /package/skills/{skill-compose-gmail → skill-gmail}/CLAUDE.md +0 -0
- /package/skills/{skill-compose-gmail → skill-gmail}/package.json +0 -0
- /package/skills/{skill-compose-gmail → skill-gmail}/src/index.ts +0 -0
- /package/skills/{skill-architecture-docs → skill-gmail}/tsconfig.json +0 -0
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local storage for configuration and downloads
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from "fs";
|
|
6
|
-
import { join } from "path";
|
|
7
|
-
import { getDataDir, getConfigPath, getDownloadsDir } from "../utils/paths.js";
|
|
8
|
-
import type { Config, DownloadResult } from "../types/index.js";
|
|
9
|
-
|
|
10
|
-
const DEFAULT_CONFIG: Config = {
|
|
11
|
-
outputDir: getDownloadsDir(),
|
|
12
|
-
defaultFormat: "best",
|
|
13
|
-
defaultQuality: "best",
|
|
14
|
-
ytDlpPath: "yt-dlp",
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Ensure data directory exists
|
|
19
|
-
*/
|
|
20
|
-
export function ensureDataDir(): void {
|
|
21
|
-
const dir = getDataDir();
|
|
22
|
-
if (!existsSync(dir)) {
|
|
23
|
-
mkdirSync(dir, { recursive: true });
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Load configuration
|
|
29
|
-
*/
|
|
30
|
-
export function loadConfig(): Config {
|
|
31
|
-
ensureDataDir();
|
|
32
|
-
const configPath = getConfigPath();
|
|
33
|
-
|
|
34
|
-
if (existsSync(configPath)) {
|
|
35
|
-
try {
|
|
36
|
-
const data = readFileSync(configPath, "utf-8");
|
|
37
|
-
return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
|
|
38
|
-
} catch {
|
|
39
|
-
return DEFAULT_CONFIG;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return DEFAULT_CONFIG;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Save configuration
|
|
48
|
-
*/
|
|
49
|
-
export function saveConfig(config: Partial<Config>): void {
|
|
50
|
-
ensureDataDir();
|
|
51
|
-
const current = loadConfig();
|
|
52
|
-
const merged = { ...current, ...config };
|
|
53
|
-
writeFileSync(getConfigPath(), JSON.stringify(merged, null, 2));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Get config path (re-export)
|
|
58
|
-
*/
|
|
59
|
-
export { getConfigPath };
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Ensure output directory exists
|
|
63
|
-
*/
|
|
64
|
-
export function ensureOutputDir(subdir?: string): string {
|
|
65
|
-
const config = loadConfig();
|
|
66
|
-
const dir = subdir ? join(config.outputDir, subdir) : config.outputDir;
|
|
67
|
-
|
|
68
|
-
if (!existsSync(dir)) {
|
|
69
|
-
mkdirSync(dir, { recursive: true });
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return dir;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Save download history entry
|
|
77
|
-
*/
|
|
78
|
-
export function saveDownloadHistory(result: DownloadResult): void {
|
|
79
|
-
ensureDataDir();
|
|
80
|
-
const historyPath = join(getDataDir(), "history.json");
|
|
81
|
-
|
|
82
|
-
let history: DownloadResult[] = [];
|
|
83
|
-
if (existsSync(historyPath)) {
|
|
84
|
-
try {
|
|
85
|
-
history = JSON.parse(readFileSync(historyPath, "utf-8"));
|
|
86
|
-
} catch {
|
|
87
|
-
history = [];
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
history.unshift({
|
|
92
|
-
...result,
|
|
93
|
-
// Add timestamp
|
|
94
|
-
...({ downloadedAt: new Date().toISOString() } as any),
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
// Keep last 100 entries
|
|
98
|
-
history = history.slice(0, 100);
|
|
99
|
-
|
|
100
|
-
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Load download history
|
|
105
|
-
*/
|
|
106
|
-
export function loadDownloadHistory(): DownloadResult[] {
|
|
107
|
-
const historyPath = join(getDataDir(), "history.json");
|
|
108
|
-
|
|
109
|
-
if (existsSync(historyPath)) {
|
|
110
|
-
try {
|
|
111
|
-
return JSON.parse(readFileSync(historyPath, "utf-8"));
|
|
112
|
-
} catch {
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return [];
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* List downloaded files
|
|
122
|
-
*/
|
|
123
|
-
export function listDownloads(): { filename: string; size: number; modified: Date }[] {
|
|
124
|
-
const config = loadConfig();
|
|
125
|
-
const outputDir = config.outputDir;
|
|
126
|
-
|
|
127
|
-
if (!existsSync(outputDir)) {
|
|
128
|
-
return [];
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const files: { filename: string; size: number; modified: Date }[] = [];
|
|
132
|
-
|
|
133
|
-
function scanDir(dir: string, prefix = ""): void {
|
|
134
|
-
const entries = readdirSync(dir, { withFileTypes: true });
|
|
135
|
-
|
|
136
|
-
for (const entry of entries) {
|
|
137
|
-
const fullPath = join(dir, entry.name);
|
|
138
|
-
const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
139
|
-
|
|
140
|
-
if (entry.isDirectory()) {
|
|
141
|
-
scanDir(fullPath, relativePath);
|
|
142
|
-
} else if (isVideoFile(entry.name)) {
|
|
143
|
-
const stats = statSync(fullPath);
|
|
144
|
-
files.push({
|
|
145
|
-
filename: relativePath,
|
|
146
|
-
size: stats.size,
|
|
147
|
-
modified: stats.mtime,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
scanDir(outputDir);
|
|
154
|
-
|
|
155
|
-
// Sort by modified date, newest first
|
|
156
|
-
files.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
157
|
-
|
|
158
|
-
return files;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Check if file is a video
|
|
163
|
-
*/
|
|
164
|
-
function isVideoFile(filename: string): boolean {
|
|
165
|
-
const videoExtensions = [".mp4", ".mkv", ".webm", ".avi", ".mov", ".m4v", ".flv", ".wmv"];
|
|
166
|
-
return videoExtensions.some((ext) => filename.toLowerCase().endsWith(ext));
|
|
167
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types for video download service
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface DownloadOptions {
|
|
6
|
-
output: string;
|
|
7
|
-
format: string;
|
|
8
|
-
quality: string;
|
|
9
|
-
audioOnly: boolean;
|
|
10
|
-
subtitles: boolean;
|
|
11
|
-
thumbnail: boolean;
|
|
12
|
-
metadata: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface VideoInfo {
|
|
16
|
-
id: string;
|
|
17
|
-
url: string;
|
|
18
|
-
title: string;
|
|
19
|
-
description?: string;
|
|
20
|
-
duration?: number;
|
|
21
|
-
thumbnail?: string;
|
|
22
|
-
formats: VideoFormat[];
|
|
23
|
-
platform: string;
|
|
24
|
-
uploader?: string;
|
|
25
|
-
uploadDate?: string;
|
|
26
|
-
viewCount?: number;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface VideoFormat {
|
|
30
|
-
formatId: string;
|
|
31
|
-
ext: string;
|
|
32
|
-
quality: string;
|
|
33
|
-
filesize?: number;
|
|
34
|
-
vcodec?: string;
|
|
35
|
-
acodec?: string;
|
|
36
|
-
resolution?: string;
|
|
37
|
-
fps?: number;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface DownloadResult {
|
|
41
|
-
success: boolean;
|
|
42
|
-
videoId: string;
|
|
43
|
-
title: string;
|
|
44
|
-
filepath?: string;
|
|
45
|
-
format?: string;
|
|
46
|
-
filesize?: number;
|
|
47
|
-
duration?: number;
|
|
48
|
-
error?: string;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface BulkDownloadResult {
|
|
52
|
-
url: string;
|
|
53
|
-
videosFound: number;
|
|
54
|
-
videosDownloaded: number;
|
|
55
|
-
results: DownloadResult[];
|
|
56
|
-
errors: string[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface Config {
|
|
60
|
-
outputDir: string;
|
|
61
|
-
defaultFormat: string;
|
|
62
|
-
defaultQuality: string;
|
|
63
|
-
ytDlpPath: string;
|
|
64
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger utility with colored output
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import chalk from "chalk";
|
|
6
|
-
|
|
7
|
-
export function info(message: string): void {
|
|
8
|
-
console.log(chalk.blue("ℹ"), message);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function success(message: string): void {
|
|
12
|
-
console.log(chalk.green("✓"), message);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function warn(message: string): void {
|
|
16
|
-
console.log(chalk.yellow("⚠"), message);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function error(message: string): void {
|
|
20
|
-
console.log(chalk.red("✗"), message);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function debug(message: string): void {
|
|
24
|
-
if (process.env.DEBUG) {
|
|
25
|
-
console.log(chalk.gray("⋯"), message);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function progress(current: number, total: number, message: string): void {
|
|
30
|
-
const percent = Math.round((current / total) * 100);
|
|
31
|
-
const bar = "█".repeat(Math.floor(percent / 5)) + "░".repeat(20 - Math.floor(percent / 5));
|
|
32
|
-
process.stdout.write(`\r${chalk.cyan(bar)} ${percent}% ${message}`);
|
|
33
|
-
if (current === total) {
|
|
34
|
-
process.stdout.write("\n");
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function heading(message: string): void {
|
|
39
|
-
console.log();
|
|
40
|
-
console.log(chalk.bold.underline(message));
|
|
41
|
-
console.log();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function table(rows: [string, string][]): void {
|
|
45
|
-
const maxKeyLen = Math.max(...rows.map(([k]) => k.length));
|
|
46
|
-
for (const [key, value] of rows) {
|
|
47
|
-
console.log(` ${chalk.dim(key.padEnd(maxKeyLen))} ${value}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Path utilities
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { homedir } from "os";
|
|
6
|
-
import { join } from "path";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Get the base data directory
|
|
10
|
-
*/
|
|
11
|
-
export function getDataDir(): string {
|
|
12
|
-
return process.env.DATA_DIR || join(homedir(), ".service", "service-videodownload");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Get the downloads directory
|
|
17
|
-
*/
|
|
18
|
-
export function getDownloadsDir(): string {
|
|
19
|
-
return join(getDataDir(), "downloads");
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Get config file path
|
|
24
|
-
*/
|
|
25
|
-
export function getConfigPath(): string {
|
|
26
|
-
return join(getDataDir(), "config.json");
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Extract video ID from URL
|
|
31
|
-
*/
|
|
32
|
-
export function extractVideoId(url: string): string | null {
|
|
33
|
-
// YouTube
|
|
34
|
-
const ytMatch = url.match(/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/);
|
|
35
|
-
if (ytMatch) return ytMatch[1];
|
|
36
|
-
|
|
37
|
-
// Vimeo
|
|
38
|
-
const vimeoMatch = url.match(/vimeo\.com\/(\d+)/);
|
|
39
|
-
if (vimeoMatch) return vimeoMatch[1];
|
|
40
|
-
|
|
41
|
-
// TikTok
|
|
42
|
-
const tiktokMatch = url.match(/tiktok\.com\/@[^/]+\/video\/(\d+)/);
|
|
43
|
-
if (tiktokMatch) return tiktokMatch[1];
|
|
44
|
-
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Detect platform from URL
|
|
50
|
-
*/
|
|
51
|
-
export function detectPlatform(url: string): string {
|
|
52
|
-
if (url.includes("youtube.com") || url.includes("youtu.be")) return "youtube";
|
|
53
|
-
if (url.includes("vimeo.com")) return "vimeo";
|
|
54
|
-
if (url.includes("tiktok.com")) return "tiktok";
|
|
55
|
-
if (url.includes("twitter.com") || url.includes("x.com")) return "twitter";
|
|
56
|
-
if (url.includes("facebook.com") || url.includes("fb.watch")) return "facebook";
|
|
57
|
-
if (url.includes("instagram.com")) return "instagram";
|
|
58
|
-
if (url.includes("twitch.tv")) return "twitch";
|
|
59
|
-
return "generic";
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Sanitize filename
|
|
64
|
-
*/
|
|
65
|
-
export function sanitizeFilename(name: string): string {
|
|
66
|
-
return name
|
|
67
|
-
.replace(/[<>:"/\\|?*]/g, "_")
|
|
68
|
-
.replace(/\s+/g, "_")
|
|
69
|
-
.substring(0, 200);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Format duration in seconds to HH:MM:SS
|
|
74
|
-
*/
|
|
75
|
-
export function formatDuration(seconds: number): string {
|
|
76
|
-
const h = Math.floor(seconds / 3600);
|
|
77
|
-
const m = Math.floor((seconds % 3600) / 60);
|
|
78
|
-
const s = Math.floor(seconds % 60);
|
|
79
|
-
|
|
80
|
-
if (h > 0) {
|
|
81
|
-
return `${h}:${m.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`;
|
|
82
|
-
}
|
|
83
|
-
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Format file size
|
|
88
|
-
*/
|
|
89
|
-
export function formatSize(bytes: number): string {
|
|
90
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
91
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
92
|
-
if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
93
|
-
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
94
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"esModuleInterop": true,
|
|
7
|
-
"strict": true,
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
"outDir": "dist",
|
|
10
|
-
"rootDir": ".",
|
|
11
|
-
"types": ["bun-types"],
|
|
12
|
-
"lib": ["ES2022"],
|
|
13
|
-
"resolveJsonModule": true
|
|
14
|
-
},
|
|
15
|
-
"include": ["src/**/*", "bin/**/*"],
|
|
16
|
-
"exclude": ["node_modules", "dist", "legacy"]
|
|
17
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# service-voiceovergenerate
|
|
2
|
-
|
|
3
|
-
Generate voiceovers using ElevenLabs and OpenAI TTS.
|
|
4
|
-
|
|
5
|
-
## Tech Stack
|
|
6
|
-
|
|
7
|
-
- Runtime: Bun
|
|
8
|
-
- Language: TypeScript
|
|
9
|
-
- CLI: Commander.js
|
|
10
|
-
- AI: OpenAI TTS, ElevenLabs API
|
|
11
|
-
|
|
12
|
-
## Project Structure
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
├── bin/cli.ts
|
|
16
|
-
├── src/
|
|
17
|
-
│ ├── commands/
|
|
18
|
-
│ │ ├── generate.ts
|
|
19
|
-
│ │ ├── voices.ts
|
|
20
|
-
│ │ └── config.ts
|
|
21
|
-
│ ├── lib/
|
|
22
|
-
│ │ ├── generator.ts
|
|
23
|
-
│ │ └── storage.ts
|
|
24
|
-
│ ├── types/index.ts
|
|
25
|
-
│ └── utils/
|
|
26
|
-
├── legacy/
|
|
27
|
-
└── package.json
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## CLI
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
service-voiceovergenerate generate "Hello" -p openai -v alloy
|
|
34
|
-
service-voiceovergenerate voices elevenlabs
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Environment
|
|
38
|
-
|
|
39
|
-
- `OPENAI_API_KEY` - For OpenAI TTS
|
|
40
|
-
- `ELEVENLABS_API_KEY` - For ElevenLabs
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 Hasna
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# service-voiceovergenerate
|
|
2
|
-
|
|
3
|
-
Generate voiceovers using ElevenLabs and OpenAI TTS.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
bun install -g @hasnaxyz/service-voiceovergenerate
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Quick Start
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# Using OpenAI
|
|
15
|
-
export OPENAI_API_KEY=sk-...
|
|
16
|
-
service-voiceovergenerate generate "Hello world" -v alloy
|
|
17
|
-
|
|
18
|
-
# Using ElevenLabs
|
|
19
|
-
export ELEVENLABS_API_KEY=...
|
|
20
|
-
service-voiceovergenerate generate "Hello world" -p elevenlabs -v 21m00Tcm4TlvDq8ikWAM
|
|
21
|
-
|
|
22
|
-
# List voices
|
|
23
|
-
service-voiceovergenerate voices openai
|
|
24
|
-
service-voiceovergenerate voices elevenlabs
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## CLI Commands
|
|
28
|
-
|
|
29
|
-
### generate
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
service-voiceovergenerate generate <text> [options]
|
|
33
|
-
|
|
34
|
-
Options:
|
|
35
|
-
-p, --provider <provider> openai or elevenlabs (default: openai)
|
|
36
|
-
-v, --voice <voice> Voice ID (default: alloy)
|
|
37
|
-
-s, --speed <speed> Speed 0.25-4.0 (OpenAI only)
|
|
38
|
-
--stability <value> Stability 0-1 (ElevenLabs)
|
|
39
|
-
--similarity <value> Similarity 0-1 (ElevenLabs)
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### voices
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
service-voiceovergenerate voices [provider]
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### config
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
service-voiceovergenerate config view
|
|
52
|
-
service-voiceovergenerate config set defaultProvider elevenlabs
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Environment Variables
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
OPENAI_API_KEY=sk-... # For OpenAI TTS
|
|
59
|
-
ELEVENLABS_API_KEY=... # For ElevenLabs
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## License
|
|
63
|
-
|
|
64
|
-
MIT
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@hasnaxyz/skill-voiceovergenerate",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "Generate voiceovers using ElevenLabs and OpenAI TTS",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"skill-voiceovergenerate": "./bin/cli.ts",
|
|
8
|
-
"voiceover": "./bin/cli.ts"
|
|
9
|
-
},
|
|
10
|
-
"scripts": {
|
|
11
|
-
"dev": "bun run bin/cli.ts",
|
|
12
|
-
"build": "bun build bin/cli.ts --outdir dist --target node",
|
|
13
|
-
"typecheck": "tsc --noEmit"
|
|
14
|
-
},
|
|
15
|
-
"repository": {
|
|
16
|
-
"type": "git",
|
|
17
|
-
"url": "https://github.com/hasnaxyz/skill-voiceovergenerate.git"
|
|
18
|
-
},
|
|
19
|
-
"author": "Hasna",
|
|
20
|
-
"license": "MIT",
|
|
21
|
-
"keywords": [
|
|
22
|
-
"voiceover",
|
|
23
|
-
"tts",
|
|
24
|
-
"text-to-speech",
|
|
25
|
-
"elevenlabs",
|
|
26
|
-
"openai",
|
|
27
|
-
"audio"
|
|
28
|
-
],
|
|
29
|
-
"files": ["bin", "src", "tsconfig.json"],
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"chalk": "^5.4.1",
|
|
32
|
-
"commander": "^13.0.0",
|
|
33
|
-
"openai": "^4.77.0"
|
|
34
|
-
},
|
|
35
|
-
"devDependencies": {
|
|
36
|
-
"@types/bun": "^1.1.0",
|
|
37
|
-
"typescript": "^5.7.0"
|
|
38
|
-
},
|
|
39
|
-
"publishConfig": {
|
|
40
|
-
"access": "restricted",
|
|
41
|
-
"registry": "https://registry.npmjs.org/"
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { Command } from "commander";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { loadConfig, saveConfig, getConfigPath } from "../lib/storage.js";
|
|
4
|
-
import * as logger from "../utils/logger.js";
|
|
5
|
-
|
|
6
|
-
export function registerConfigCommand(program: Command): void {
|
|
7
|
-
const configCmd = program.command("config").description("View and edit configuration");
|
|
8
|
-
|
|
9
|
-
configCmd
|
|
10
|
-
.command("view")
|
|
11
|
-
.option("--json", "Output as JSON")
|
|
12
|
-
.action((options) => {
|
|
13
|
-
const config = loadConfig();
|
|
14
|
-
const hasOpenAI = !!process.env.OPENAI_API_KEY;
|
|
15
|
-
const hasElevenLabs = !!(config.elevenLabsApiKey || process.env.ELEVENLABS_API_KEY);
|
|
16
|
-
|
|
17
|
-
if (options.json) {
|
|
18
|
-
console.log(JSON.stringify({ ...config, hasOpenAI, hasElevenLabs }, null, 2));
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
logger.heading("Configuration");
|
|
23
|
-
logger.table([
|
|
24
|
-
["Output directory", config.outputDir],
|
|
25
|
-
["Default provider", config.defaultProvider],
|
|
26
|
-
["Default voice", config.defaultVoice],
|
|
27
|
-
["OpenAI API key", hasOpenAI ? chalk.green("configured") : chalk.red("not set")],
|
|
28
|
-
["ElevenLabs API key", hasElevenLabs ? chalk.green("configured") : chalk.red("not set")],
|
|
29
|
-
]);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
configCmd
|
|
33
|
-
.command("set <key> <value>")
|
|
34
|
-
.action((key: string, value: string) => {
|
|
35
|
-
saveConfig({ [key]: value });
|
|
36
|
-
logger.success(`Set ${key} = ${key.includes("Key") ? "***" : value}`);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { Command } from "commander";
|
|
2
|
-
import { generateVoiceover } from "../lib/generator.js";
|
|
3
|
-
import * as logger from "../utils/logger.js";
|
|
4
|
-
|
|
5
|
-
export function registerGenerateCommand(program: Command): void {
|
|
6
|
-
program
|
|
7
|
-
.command("generate <text>")
|
|
8
|
-
.alias("g")
|
|
9
|
-
.description("Generate voiceover from text")
|
|
10
|
-
.option("-p, --provider <provider>", "Provider: openai, elevenlabs", "openai")
|
|
11
|
-
.option("-v, --voice <voice>", "Voice ID or name", "alloy")
|
|
12
|
-
.option("-s, --speed <speed>", "Speed (OpenAI only, 0.25-4.0)", "1.0")
|
|
13
|
-
.option("--stability <value>", "Stability (ElevenLabs, 0-1)", "0.5")
|
|
14
|
-
.option("--similarity <value>", "Similarity boost (ElevenLabs, 0-1)", "0.75")
|
|
15
|
-
.action(async (text: string, options) => {
|
|
16
|
-
try {
|
|
17
|
-
const result = await generateVoiceover(text, {
|
|
18
|
-
provider: options.provider,
|
|
19
|
-
voice: options.voice,
|
|
20
|
-
speed: parseFloat(options.speed),
|
|
21
|
-
stability: parseFloat(options.stability),
|
|
22
|
-
similarityBoost: parseFloat(options.similarity),
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
logger.heading("Voiceover Generated");
|
|
26
|
-
logger.table([
|
|
27
|
-
["File", result.filepath],
|
|
28
|
-
["Provider", result.provider],
|
|
29
|
-
["Voice", result.voice],
|
|
30
|
-
["Format", result.format],
|
|
31
|
-
]);
|
|
32
|
-
} catch (err) {
|
|
33
|
-
logger.error(`Generation failed: ${err}`);
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { Command } from "commander";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { listVoices } from "../lib/generator.js";
|
|
4
|
-
import * as logger from "../utils/logger.js";
|
|
5
|
-
|
|
6
|
-
export function registerVoicesCommand(program: Command): void {
|
|
7
|
-
program
|
|
8
|
-
.command("voices [provider]")
|
|
9
|
-
.description("List available voices")
|
|
10
|
-
.option("--json", "Output as JSON")
|
|
11
|
-
.action(async (provider: string = "openai", options) => {
|
|
12
|
-
try {
|
|
13
|
-
const voices = await listVoices(provider as any);
|
|
14
|
-
|
|
15
|
-
if (options.json) {
|
|
16
|
-
console.log(JSON.stringify(voices, null, 2));
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
logger.heading(`${provider} Voices`);
|
|
21
|
-
|
|
22
|
-
for (const voice of voices) {
|
|
23
|
-
console.log(` ${chalk.cyan(voice.id.padEnd(30))} ${voice.name}`);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
console.log();
|
|
27
|
-
logger.info(`${voices.length} voice(s) available`);
|
|
28
|
-
} catch (err) {
|
|
29
|
-
logger.error(`Failed to list voices: ${err}`);
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|