@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,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voiceover generation using OpenAI and ElevenLabs
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import OpenAI from "openai";
|
|
6
|
-
import * as logger from "../utils/logger.js";
|
|
7
|
-
import { loadConfig, saveAudio } from "./storage.js";
|
|
8
|
-
import { sanitizeFilename } from "../utils/paths.js";
|
|
9
|
-
import type { VoiceoverOptions, VoiceoverResult, Provider } from "../types/index.js";
|
|
10
|
-
import { OPENAI_VOICES } from "../types/index.js";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Generate voiceover using OpenAI TTS
|
|
14
|
-
*/
|
|
15
|
-
async function generateWithOpenAI(
|
|
16
|
-
text: string,
|
|
17
|
-
voice: string,
|
|
18
|
-
speed: number = 1.0
|
|
19
|
-
): Promise<Buffer> {
|
|
20
|
-
const openai = new OpenAI();
|
|
21
|
-
|
|
22
|
-
const validVoice = OPENAI_VOICES.includes(voice) ? voice : "alloy";
|
|
23
|
-
|
|
24
|
-
const response = await openai.audio.speech.create({
|
|
25
|
-
model: "tts-1-hd",
|
|
26
|
-
voice: validVoice as any,
|
|
27
|
-
input: text,
|
|
28
|
-
speed,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
const buffer = Buffer.from(await response.arrayBuffer());
|
|
32
|
-
return buffer;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Generate voiceover using ElevenLabs
|
|
37
|
-
*/
|
|
38
|
-
async function generateWithElevenLabs(
|
|
39
|
-
text: string,
|
|
40
|
-
voiceId: string,
|
|
41
|
-
options: { stability?: number; similarityBoost?: number } = {}
|
|
42
|
-
): Promise<Buffer> {
|
|
43
|
-
const config = loadConfig();
|
|
44
|
-
const apiKey = config.elevenLabsApiKey || process.env.ELEVENLABS_API_KEY;
|
|
45
|
-
|
|
46
|
-
if (!apiKey) {
|
|
47
|
-
throw new Error("ELEVENLABS_API_KEY not set");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const stability = options.stability ?? 0.5;
|
|
51
|
-
const similarityBoost = options.similarityBoost ?? 0.75;
|
|
52
|
-
|
|
53
|
-
const response = await fetch(
|
|
54
|
-
`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`,
|
|
55
|
-
{
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
"Accept": "audio/mpeg",
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
"xi-api-key": apiKey,
|
|
61
|
-
},
|
|
62
|
-
body: JSON.stringify({
|
|
63
|
-
text,
|
|
64
|
-
model_id: "eleven_multilingual_v2",
|
|
65
|
-
voice_settings: {
|
|
66
|
-
stability,
|
|
67
|
-
similarity_boost: similarityBoost,
|
|
68
|
-
},
|
|
69
|
-
}),
|
|
70
|
-
}
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
if (!response.ok) {
|
|
74
|
-
const error = await response.text();
|
|
75
|
-
throw new Error(`ElevenLabs API error: ${error}`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const buffer = Buffer.from(await response.arrayBuffer());
|
|
79
|
-
return buffer;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Generate voiceover
|
|
84
|
-
*/
|
|
85
|
-
export async function generateVoiceover(
|
|
86
|
-
text: string,
|
|
87
|
-
options: Partial<VoiceoverOptions> = {}
|
|
88
|
-
): Promise<VoiceoverResult> {
|
|
89
|
-
const config = loadConfig();
|
|
90
|
-
const provider = options.provider || config.defaultProvider;
|
|
91
|
-
const voice = options.voice || config.defaultVoice;
|
|
92
|
-
|
|
93
|
-
logger.info(`Generating voiceover with ${provider}...`);
|
|
94
|
-
logger.info(`Voice: ${voice}`);
|
|
95
|
-
logger.info(`Text: ${text.substring(0, 100)}${text.length > 100 ? "..." : ""}`);
|
|
96
|
-
|
|
97
|
-
let audioBuffer: Buffer;
|
|
98
|
-
|
|
99
|
-
if (provider === "openai") {
|
|
100
|
-
if (!process.env.OPENAI_API_KEY) {
|
|
101
|
-
throw new Error("OPENAI_API_KEY not set");
|
|
102
|
-
}
|
|
103
|
-
audioBuffer = await generateWithOpenAI(text, voice, options.speed);
|
|
104
|
-
} else if (provider === "elevenlabs") {
|
|
105
|
-
audioBuffer = await generateWithElevenLabs(text, voice, {
|
|
106
|
-
stability: options.stability,
|
|
107
|
-
similarityBoost: options.similarityBoost,
|
|
108
|
-
});
|
|
109
|
-
} else {
|
|
110
|
-
throw new Error(`Unknown provider: ${provider}`);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Save the audio file
|
|
114
|
-
const filename = `${sanitizeFilename(text)}_${Date.now()}.mp3`;
|
|
115
|
-
const filepath = saveAudio(filename, audioBuffer);
|
|
116
|
-
|
|
117
|
-
logger.success(`Generated: ${filepath}`);
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
text,
|
|
121
|
-
provider,
|
|
122
|
-
voice,
|
|
123
|
-
filepath,
|
|
124
|
-
format: "mp3",
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* List available voices for a provider
|
|
130
|
-
*/
|
|
131
|
-
export async function listVoices(provider: Provider): Promise<{ id: string; name: string }[]> {
|
|
132
|
-
if (provider === "openai") {
|
|
133
|
-
return OPENAI_VOICES.map((v) => ({ id: v, name: v }));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (provider === "elevenlabs") {
|
|
137
|
-
const config = loadConfig();
|
|
138
|
-
const apiKey = config.elevenLabsApiKey || process.env.ELEVENLABS_API_KEY;
|
|
139
|
-
|
|
140
|
-
if (!apiKey) {
|
|
141
|
-
throw new Error("ELEVENLABS_API_KEY not set");
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const response = await fetch("https://api.elevenlabs.io/v1/voices", {
|
|
145
|
-
headers: {
|
|
146
|
-
"xi-api-key": apiKey,
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
if (!response.ok) {
|
|
151
|
-
throw new Error("Failed to fetch ElevenLabs voices");
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const data = await response.json() as { voices: { voice_id: string; name: string }[] };
|
|
155
|
-
return data.voices.map((v) => ({ id: v.voice_id, name: v.name }));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return [];
|
|
159
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { getDataDir, getConfigPath, getOutputDir } from "../utils/paths.js";
|
|
4
|
-
import type { Config } from "../types/index.js";
|
|
5
|
-
|
|
6
|
-
const DEFAULT_CONFIG: Config = {
|
|
7
|
-
outputDir: getOutputDir(),
|
|
8
|
-
defaultProvider: "openai",
|
|
9
|
-
defaultVoice: "alloy",
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export function ensureDataDir(): void {
|
|
13
|
-
const dir = getDataDir();
|
|
14
|
-
if (!existsSync(dir)) {
|
|
15
|
-
mkdirSync(dir, { recursive: true });
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function loadConfig(): Config {
|
|
20
|
-
ensureDataDir();
|
|
21
|
-
const configPath = getConfigPath();
|
|
22
|
-
|
|
23
|
-
if (existsSync(configPath)) {
|
|
24
|
-
try {
|
|
25
|
-
return { ...DEFAULT_CONFIG, ...JSON.parse(readFileSync(configPath, "utf-8")) };
|
|
26
|
-
} catch {
|
|
27
|
-
return DEFAULT_CONFIG;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return DEFAULT_CONFIG;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function saveConfig(config: Partial<Config>): void {
|
|
35
|
-
ensureDataDir();
|
|
36
|
-
const current = loadConfig();
|
|
37
|
-
writeFileSync(getConfigPath(), JSON.stringify({ ...current, ...config }, null, 2));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export { getConfigPath };
|
|
41
|
-
|
|
42
|
-
export function ensureOutputDir(): string {
|
|
43
|
-
const config = loadConfig();
|
|
44
|
-
if (!existsSync(config.outputDir)) {
|
|
45
|
-
mkdirSync(config.outputDir, { recursive: true });
|
|
46
|
-
}
|
|
47
|
-
return config.outputDir;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function saveAudio(filename: string, data: Buffer | Uint8Array): string {
|
|
51
|
-
const outputDir = ensureOutputDir();
|
|
52
|
-
const outputPath = join(outputDir, filename);
|
|
53
|
-
writeFileSync(outputPath, data);
|
|
54
|
-
return outputPath;
|
|
55
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types for voiceover generation service
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export type Provider = "elevenlabs" | "openai";
|
|
6
|
-
|
|
7
|
-
export interface VoiceoverOptions {
|
|
8
|
-
provider: Provider;
|
|
9
|
-
voice: string;
|
|
10
|
-
model?: string;
|
|
11
|
-
speed?: number;
|
|
12
|
-
stability?: number;
|
|
13
|
-
similarityBoost?: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface VoiceoverResult {
|
|
17
|
-
text: string;
|
|
18
|
-
provider: Provider;
|
|
19
|
-
voice: string;
|
|
20
|
-
filepath: string;
|
|
21
|
-
duration?: number;
|
|
22
|
-
format: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface Voice {
|
|
26
|
-
id: string;
|
|
27
|
-
name: string;
|
|
28
|
-
provider: Provider;
|
|
29
|
-
description?: string;
|
|
30
|
-
previewUrl?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface Config {
|
|
34
|
-
outputDir: string;
|
|
35
|
-
defaultProvider: Provider;
|
|
36
|
-
defaultVoice: string;
|
|
37
|
-
elevenLabsApiKey?: string;
|
|
38
|
-
openaiApiKey?: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// OpenAI voices
|
|
42
|
-
export const OPENAI_VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"];
|
|
43
|
-
|
|
44
|
-
// ElevenLabs default voices
|
|
45
|
-
export const ELEVENLABS_VOICES = [
|
|
46
|
-
{ id: "21m00Tcm4TlvDq8ikWAM", name: "Rachel" },
|
|
47
|
-
{ id: "AZnzlk1XvdvUeBnXmlld", name: "Domi" },
|
|
48
|
-
{ id: "EXAVITQu4vr4xnSDxMaL", name: "Bella" },
|
|
49
|
-
{ id: "ErXwobaYiN019PkySvjV", name: "Antoni" },
|
|
50
|
-
{ id: "MF3mGyEYCl7XYWbV9V6O", name: "Elli" },
|
|
51
|
-
{ id: "TxGEqnHWrfWFTfGW9XjX", name: "Josh" },
|
|
52
|
-
{ id: "VR6AewLTigWG4xSOukaG", name: "Arnold" },
|
|
53
|
-
{ id: "pNInz6obpgDQGcFmaJgB", name: "Adam" },
|
|
54
|
-
{ id: "yoZ06aMxZJJ28mfd3POQ", name: "Sam" },
|
|
55
|
-
];
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
|
|
3
|
-
export function info(message: string): void {
|
|
4
|
-
console.log(chalk.blue("ℹ"), message);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function success(message: string): void {
|
|
8
|
-
console.log(chalk.green("✓"), message);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function warn(message: string): void {
|
|
12
|
-
console.log(chalk.yellow("⚠"), message);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function error(message: string): void {
|
|
16
|
-
console.log(chalk.red("✗"), message);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function heading(message: string): void {
|
|
20
|
-
console.log();
|
|
21
|
-
console.log(chalk.bold.underline(message));
|
|
22
|
-
console.log();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function table(rows: [string, string][]): void {
|
|
26
|
-
const maxKeyLen = Math.max(...rows.map(([k]) => k.length));
|
|
27
|
-
for (const [key, value] of rows) {
|
|
28
|
-
console.log(` ${chalk.dim(key.padEnd(maxKeyLen))} ${value}`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { homedir } from "os";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
|
|
4
|
-
export function getDataDir(): string {
|
|
5
|
-
return process.env.DATA_DIR || join(homedir(), ".service", "service-voiceovergenerate");
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function getOutputDir(): string {
|
|
9
|
-
return join(getDataDir(), "output");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function getConfigPath(): string {
|
|
13
|
-
return join(getDataDir(), "config.json");
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function sanitizeFilename(text: string): string {
|
|
17
|
-
return text
|
|
18
|
-
.substring(0, 50)
|
|
19
|
-
.replace(/[^a-zA-Z0-9]/g, "_")
|
|
20
|
-
.replace(/_+/g, "_")
|
|
21
|
-
.replace(/^_|_$/g, "");
|
|
22
|
-
}
|
|
@@ -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,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 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,17 +0,0 @@
|
|
|
1
|
-
# skill-websearch
|
|
2
|
-
|
|
3
|
-
Multi-tool web search combining multiple search engines and APIs
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
This skill provides capabilities for comprehensive web search using multiple search engines (Google, Bing, DuckDuckGo), specialized APIs (Exa, Tavily, Perplexity), and aggregating results.
|
|
8
|
-
|
|
9
|
-
## Usage
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
# Coming soon
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Development
|
|
16
|
-
|
|
17
|
-
See `.implementation/` for development notes and todos.
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
# Install script for skills
|
|
4
|
-
# Installs the skill either globally for Claude Code or locally in a project
|
|
5
|
-
|
|
6
|
-
set -e
|
|
7
|
-
|
|
8
|
-
SKILL_NAME="$(basename "$(pwd)")"
|
|
9
|
-
SKILL_PATH="$(pwd)"
|
|
10
|
-
|
|
11
|
-
echo "📦 Installing $SKILL_NAME..."
|
|
12
|
-
echo ""
|
|
13
|
-
|
|
14
|
-
# Check if Claude Code is installed
|
|
15
|
-
if ! command -v claude &> /dev/null; then
|
|
16
|
-
echo "⚠️ Claude Code not found in PATH"
|
|
17
|
-
echo " Please install Claude Code first: https://claude.com/claude-code"
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
# Check if we're in a git repository
|
|
22
|
-
if git rev-parse --git-dir > /dev/null 2>&1; then
|
|
23
|
-
IN_REPO=true
|
|
24
|
-
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
25
|
-
echo "📁 Detected git repository: $REPO_ROOT"
|
|
26
|
-
else
|
|
27
|
-
IN_REPO=false
|
|
28
|
-
echo "📁 Not in a git repository"
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
# Ask installation type
|
|
32
|
-
echo ""
|
|
33
|
-
echo "Where would you like to install this skill?"
|
|
34
|
-
if [ "$IN_REPO" = true ]; then
|
|
35
|
-
echo " 1) Locally (this repository only)"
|
|
36
|
-
echo " 2) Globally (all Claude Code sessions)"
|
|
37
|
-
read -p "Choose [1/2]: " choice
|
|
38
|
-
else
|
|
39
|
-
echo " Installing globally (not in a git repository)"
|
|
40
|
-
choice=2
|
|
41
|
-
fi
|
|
42
|
-
|
|
43
|
-
# Install function
|
|
44
|
-
install_skill() {
|
|
45
|
-
local config_dir=$1
|
|
46
|
-
local config_file="$config_dir/claude_mcp_config.json"
|
|
47
|
-
|
|
48
|
-
# Create config directory if it doesn't exist
|
|
49
|
-
mkdir -p "$config_dir"
|
|
50
|
-
|
|
51
|
-
# Create or update config file
|
|
52
|
-
if [ ! -f "$config_file" ]; then
|
|
53
|
-
echo "{" > "$config_file"
|
|
54
|
-
echo ' "mcpServers": {}' >> "$config_file"
|
|
55
|
-
echo "}" >> "$config_file"
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
# Add skill to config using bun
|
|
59
|
-
bun -e "
|
|
60
|
-
const fs = require('fs');
|
|
61
|
-
const config = JSON.parse(fs.readFileSync('$config_file', 'utf8'));
|
|
62
|
-
|
|
63
|
-
if (!config.mcpServers) config.mcpServers = {};
|
|
64
|
-
|
|
65
|
-
config.mcpServers['$SKILL_NAME'] = {
|
|
66
|
-
command: 'bun',
|
|
67
|
-
args: ['run', '$SKILL_PATH/src/index.ts'],
|
|
68
|
-
env: {
|
|
69
|
-
SKILL_API_KEY: process.env.SKILL_API_KEY || '',
|
|
70
|
-
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY || '',
|
|
71
|
-
OPENAI_API_KEY: process.env.OPENAI_API_KEY || '',
|
|
72
|
-
ELEVENLABS_API_KEY: process.env.ELEVENLABS_API_KEY || '',
|
|
73
|
-
GEMINI_API_KEY: process.env.GEMINI_API_KEY || '',
|
|
74
|
-
XAI_API_KEY: process.env.XAI_API_KEY || '',
|
|
75
|
-
GOOGLE_API_KEY: process.env.GOOGLE_API_KEY || '',
|
|
76
|
-
GOOGLE_PROJECT_ID: process.env.GOOGLE_PROJECT_ID || '',
|
|
77
|
-
BROWSER_USE_API_KEY: process.env.BROWSER_USE_API_KEY || '',
|
|
78
|
-
RUNWAY_API_KEY: process.env.RUNWAY_API_KEY || ''
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
fs.writeFileSync('$config_file', JSON.stringify(config, null, 2));
|
|
83
|
-
"
|
|
84
|
-
|
|
85
|
-
echo "✅ Installed $SKILL_NAME to $config_file"
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
# Install based on choice
|
|
89
|
-
if [ "$choice" = "1" ]; then
|
|
90
|
-
# Local installation
|
|
91
|
-
install_skill "$REPO_ROOT/.claude"
|
|
92
|
-
echo ""
|
|
93
|
-
echo "🎉 $SKILL_NAME installed locally!"
|
|
94
|
-
echo " Config: $REPO_ROOT/.claude/claude_mcp_config.json"
|
|
95
|
-
elif [ "$choice" = "2" ]; then
|
|
96
|
-
# Global installation
|
|
97
|
-
install_skill "$HOME/.config/claude-code"
|
|
98
|
-
echo ""
|
|
99
|
-
echo "🎉 $SKILL_NAME installed globally!"
|
|
100
|
-
echo " Config: $HOME/.config/claude-code/claude_mcp_config.json"
|
|
101
|
-
else
|
|
102
|
-
echo "❌ Invalid choice"
|
|
103
|
-
exit 1
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
echo ""
|
|
107
|
-
echo "📝 Next steps:"
|
|
108
|
-
echo " 1. Restart Claude Code"
|
|
109
|
-
echo " 2. The skill will be available as: $SKILL_NAME"
|
|
110
|
-
echo ""
|
|
111
|
-
echo " Usage: Claude Code will automatically detect and use this skill"
|
|
112
|
-
echo " based on your prompts and task context."
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "skill-websearch",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Multi-tool web search combining multiple search engines and APIs",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "src/index.ts",
|
|
7
|
-
"bin": {
|
|
8
|
-
"skill-websearch": "src/index.ts"
|
|
9
|
-
},
|
|
10
|
-
"scripts": {
|
|
11
|
-
"start": "bun run src/index.ts",
|
|
12
|
-
"dev": "bun run --watch src/index.ts"
|
|
13
|
-
},
|
|
14
|
-
"keywords": [
|
|
15
|
-
"claude",
|
|
16
|
-
"ai",
|
|
17
|
-
"skill"
|
|
18
|
-
],
|
|
19
|
-
"author": "",
|
|
20
|
-
"license": "MIT",
|
|
21
|
-
"devDependencies": {
|
|
22
|
-
"@types/bun": "latest"
|
|
23
|
-
},
|
|
24
|
-
"peerDependencies": {
|
|
25
|
-
"typescript": "^5.0.0"
|
|
26
|
-
},
|
|
27
|
-
"repository": {
|
|
28
|
-
"type": "git",
|
|
29
|
-
"url": "git+https://github.com/hasnaxyz/skill-websearch.git"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill Authentication Check
|
|
3
|
-
* Add this to the top of any skill's main function
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export function checkSkillAuth(): void {
|
|
7
|
-
const SKILL_API_KEY = process.env.SKILL_API_KEY;
|
|
8
|
-
|
|
9
|
-
// Check if SKILL_API_KEY is set
|
|
10
|
-
if (!SKILL_API_KEY) {
|
|
11
|
-
console.error('❌ Error: SKILL_API_KEY environment variable not set');
|
|
12
|
-
console.error('');
|
|
13
|
-
console.error('To use this skill, you must set your SKILL_API_KEY:');
|
|
14
|
-
console.error('');
|
|
15
|
-
console.error(' export SKILL_API_KEY=your-api-key-here');
|
|
16
|
-
console.error('');
|
|
17
|
-
console.error('Contact your administrator to get your API key.');
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Validate key format
|
|
22
|
-
if (!SKILL_API_KEY.startsWith('sk-skill-')) {
|
|
23
|
-
console.error('❌ Error: Invalid SKILL_API_KEY format');
|
|
24
|
-
console.error('Expected format: sk-skill-xxxxxxxxxxxx');
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Key is valid - skill can proceed
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Check if running remotely (via SSH or network)
|
|
33
|
-
*/
|
|
34
|
-
export function isRemoteExecution(): boolean {
|
|
35
|
-
return !!(
|
|
36
|
-
process.env.SSH_CONNECTION ||
|
|
37
|
-
process.env.SSH_CLIENT ||
|
|
38
|
-
process.env.SSH_TTY
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Require auth only if remote execution
|
|
44
|
-
*/
|
|
45
|
-
export function requireAuthIfRemote(): void {
|
|
46
|
-
if (isRemoteExecution()) {
|
|
47
|
-
checkSkillAuth();
|
|
48
|
-
}
|
|
49
|
-
}
|