@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,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
|
-
}
|
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Skill Installer Module
|
|
5
|
-
*
|
|
6
|
-
* Universal installer for skills to integrate with AI code assistants
|
|
7
|
-
* Usage: skill-[name] install [claude|codex|windsurf|cursor]
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { writeFileSync, mkdirSync, existsSync, readFileSync } from 'fs';
|
|
11
|
-
import { resolve, join } from 'path';
|
|
12
|
-
import { homedir } from 'os';
|
|
13
|
-
|
|
14
|
-
export interface SkillConfig {
|
|
15
|
-
name: string;
|
|
16
|
-
description: string;
|
|
17
|
-
version: string;
|
|
18
|
-
commands: Array<{
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
usage: string;
|
|
22
|
-
examples: string[];
|
|
23
|
-
}>;
|
|
24
|
-
requiredEnvVars?: string[];
|
|
25
|
-
optionalEnvVars?: string[];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type AssistantType = 'claude' | 'codex' | 'windsurf' | 'cursor';
|
|
29
|
-
|
|
30
|
-
const ASSISTANT_PATHS: Record<AssistantType, string> = {
|
|
31
|
-
claude: '.claude/skills',
|
|
32
|
-
codex: '.codex/skills',
|
|
33
|
-
windsurf: '.windsurf/skills',
|
|
34
|
-
cursor: '.cursor/skills',
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export class SkillInstaller {
|
|
38
|
-
private config: SkillConfig;
|
|
39
|
-
private skillPath: string;
|
|
40
|
-
|
|
41
|
-
constructor(config: SkillConfig, currentFilePath: string) {
|
|
42
|
-
this.config = config;
|
|
43
|
-
// Get the root directory of the skill (where package.json is)
|
|
44
|
-
this.skillPath = resolve(currentFilePath, '..');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Install the skill to specified AI assistant
|
|
49
|
-
*/
|
|
50
|
-
async install(assistant: AssistantType): Promise<void> {
|
|
51
|
-
console.log(`📦 Installing ${this.config.name} for ${assistant}...`);
|
|
52
|
-
console.log('');
|
|
53
|
-
|
|
54
|
-
const assistantPath = ASSISTANT_PATHS[assistant];
|
|
55
|
-
if (!assistantPath) {
|
|
56
|
-
throw new Error(`Unknown assistant: ${assistant}`);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Create skill directory
|
|
60
|
-
const skillDir = join(homedir(), assistantPath, this.config.name);
|
|
61
|
-
mkdirSync(skillDir, { recursive: true });
|
|
62
|
-
console.log(`✓ Created: ${skillDir}`);
|
|
63
|
-
|
|
64
|
-
// Generate and write SKILL.md
|
|
65
|
-
const skillMd = this.generateSkillMd();
|
|
66
|
-
writeFileSync(join(skillDir, 'SKILL.md'), skillMd);
|
|
67
|
-
console.log(`✓ Created: SKILL.md`);
|
|
68
|
-
|
|
69
|
-
// Generate and write README.md
|
|
70
|
-
const readme = this.generateReadme();
|
|
71
|
-
writeFileSync(join(skillDir, 'README.md'), readme);
|
|
72
|
-
console.log(`✓ Created: README.md`);
|
|
73
|
-
|
|
74
|
-
// Create log file
|
|
75
|
-
const logFile = join(skillDir, `${this.config.name}.log`);
|
|
76
|
-
if (!existsSync(logFile)) {
|
|
77
|
-
writeFileSync(logFile, `# ${this.config.name} execution log\n# Created: ${new Date().toISOString()}\n\n`);
|
|
78
|
-
console.log(`✓ Created: ${this.config.name}.log`);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Update MCP config
|
|
82
|
-
this.updateMcpConfig(assistant, skillDir);
|
|
83
|
-
|
|
84
|
-
console.log('');
|
|
85
|
-
console.log(`✅ ${this.config.name} installed successfully!`);
|
|
86
|
-
console.log('');
|
|
87
|
-
console.log('Location:', skillDir);
|
|
88
|
-
console.log('');
|
|
89
|
-
console.log('Usage:');
|
|
90
|
-
this.config.commands.slice(0, 3).forEach(cmd => {
|
|
91
|
-
console.log(` ${this.config.name} ${cmd.usage}`);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Generate SKILL.md documentation
|
|
97
|
-
*/
|
|
98
|
-
private generateSkillMd(): string {
|
|
99
|
-
const envVarsSection = this.config.requiredEnvVars?.length || this.config.optionalEnvVars?.length ? `
|
|
100
|
-
|
|
101
|
-
## Environment Variables
|
|
102
|
-
|
|
103
|
-
${this.config.requiredEnvVars?.length ? `### Required
|
|
104
|
-
${this.config.requiredEnvVars.map(v => `- \`${v}\``).join('\n')}
|
|
105
|
-
` : ''}
|
|
106
|
-
${this.config.optionalEnvVars?.length ? `### Optional
|
|
107
|
-
${this.config.optionalEnvVars.map(v => `- \`${v}\``).join('\n')}
|
|
108
|
-
` : ''}` : '';
|
|
109
|
-
|
|
110
|
-
return `# ${this.config.name}
|
|
111
|
-
|
|
112
|
-
${this.config.description}
|
|
113
|
-
|
|
114
|
-
## Version
|
|
115
|
-
${this.config.version}
|
|
116
|
-
|
|
117
|
-
## Commands
|
|
118
|
-
|
|
119
|
-
${this.config.commands.map(cmd => `### ${cmd.name}
|
|
120
|
-
|
|
121
|
-
${cmd.description}
|
|
122
|
-
|
|
123
|
-
**Usage:**
|
|
124
|
-
\`\`\`bash
|
|
125
|
-
${this.config.name} ${cmd.usage}
|
|
126
|
-
\`\`\`
|
|
127
|
-
|
|
128
|
-
**Examples:**
|
|
129
|
-
${cmd.examples.map(ex => `\`\`\`bash
|
|
130
|
-
${ex}
|
|
131
|
-
\`\`\``).join('\n')}
|
|
132
|
-
`).join('\n')}
|
|
133
|
-
${envVarsSection}
|
|
134
|
-
|
|
135
|
-
## Installation
|
|
136
|
-
|
|
137
|
-
This skill is installed at:
|
|
138
|
-
\`~/.claude/skills/${this.config.name}/\`
|
|
139
|
-
|
|
140
|
-
## Logs
|
|
141
|
-
|
|
142
|
-
Execution logs are written to:
|
|
143
|
-
\`~/.claude/skills/${this.config.name}/${this.config.name}.log\`
|
|
144
|
-
|
|
145
|
-
## Support
|
|
146
|
-
|
|
147
|
-
For issues, visit: https://github.com/hasnaxyz/${this.config.name}/issues
|
|
148
|
-
`;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Generate README.md
|
|
153
|
-
*/
|
|
154
|
-
private generateReadme(): string {
|
|
155
|
-
return `# ${this.config.name}
|
|
156
|
-
|
|
157
|
-
${this.config.description}
|
|
158
|
-
|
|
159
|
-
## Quick Start
|
|
160
|
-
|
|
161
|
-
\`\`\`bash
|
|
162
|
-
${this.config.commands[0] ? `${this.config.name} ${this.config.commands[0].usage}` : `${this.config.name} --help`}
|
|
163
|
-
\`\`\`
|
|
164
|
-
|
|
165
|
-
## Documentation
|
|
166
|
-
|
|
167
|
-
See [SKILL.md](./SKILL.md) for complete documentation.
|
|
168
|
-
|
|
169
|
-
## Version
|
|
170
|
-
|
|
171
|
-
${this.config.version}
|
|
172
|
-
`;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Update MCP config to register the skill
|
|
177
|
-
*/
|
|
178
|
-
private updateMcpConfig(assistant: AssistantType, skillDir: string): void {
|
|
179
|
-
const configPaths: Record<AssistantType, string> = {
|
|
180
|
-
claude: join(homedir(), '.config/claude-code/claude_mcp_config.json'),
|
|
181
|
-
codex: join(homedir(), '.config/codex/mcp_config.json'),
|
|
182
|
-
windsurf: join(homedir(), '.config/windsurf/mcp_config.json'),
|
|
183
|
-
cursor: join(homedir(), '.config/cursor/mcp_config.json'),
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
const configPath = configPaths[assistant];
|
|
187
|
-
|
|
188
|
-
// Read existing config or create new
|
|
189
|
-
let config: any = { mcpServers: {} };
|
|
190
|
-
if (existsSync(configPath)) {
|
|
191
|
-
const content = readFileSync(configPath, 'utf8');
|
|
192
|
-
config = JSON.parse(content);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (!config.mcpServers) {
|
|
196
|
-
config.mcpServers = {};
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Add or update this skill
|
|
200
|
-
config.mcpServers[this.config.name] = {
|
|
201
|
-
command: 'bun',
|
|
202
|
-
args: ['run', join(this.skillPath, 'src/index.ts')],
|
|
203
|
-
env: this.getEnvConfig(),
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// Write config
|
|
207
|
-
mkdirSync(resolve(configPath, '..'), { recursive: true });
|
|
208
|
-
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
209
|
-
console.log(`✓ Updated: ${assistant} MCP config`);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Get environment variables config
|
|
214
|
-
*/
|
|
215
|
-
private getEnvConfig(): Record<string, string> {
|
|
216
|
-
const env: Record<string, string> = {
|
|
217
|
-
SKILL_API_KEY: process.env.SKILL_API_KEY || '',
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
// Add required env vars
|
|
221
|
-
this.config.requiredEnvVars?.forEach(key => {
|
|
222
|
-
env[key] = process.env[key] || '';
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
// Add optional env vars
|
|
226
|
-
this.config.optionalEnvVars?.forEach(key => {
|
|
227
|
-
env[key] = process.env[key] || '';
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
return env;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Uninstall the skill from specified AI assistant
|
|
235
|
-
*/
|
|
236
|
-
async uninstall(assistant: AssistantType): Promise<void> {
|
|
237
|
-
console.log(`🗑️ Uninstalling ${this.config.name} from ${assistant}...`);
|
|
238
|
-
console.log('');
|
|
239
|
-
|
|
240
|
-
const assistantPath = ASSISTANT_PATHS[assistant];
|
|
241
|
-
const skillDir = join(homedir(), assistantPath, this.config.name);
|
|
242
|
-
|
|
243
|
-
if (existsSync(skillDir)) {
|
|
244
|
-
// Remove from MCP config first
|
|
245
|
-
this.removeFromMcpConfig(assistant);
|
|
246
|
-
|
|
247
|
-
// Note: We don't delete the directory to preserve logs and user data
|
|
248
|
-
console.log(`✓ Removed from ${assistant} MCP config`);
|
|
249
|
-
console.log('');
|
|
250
|
-
console.log(`⚠️ Directory preserved: ${skillDir}`);
|
|
251
|
-
console.log(' (contains logs and configuration)');
|
|
252
|
-
console.log(' Delete manually if needed.');
|
|
253
|
-
} else {
|
|
254
|
-
console.log(`⚠️ ${this.config.name} is not installed for ${assistant}`);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Remove skill from MCP config
|
|
260
|
-
*/
|
|
261
|
-
private removeFromMcpConfig(assistant: AssistantType): void {
|
|
262
|
-
const configPaths: Record<AssistantType, string> = {
|
|
263
|
-
claude: join(homedir(), '.config/claude-code/claude_mcp_config.json'),
|
|
264
|
-
codex: join(homedir(), '.config/codex/mcp_config.json'),
|
|
265
|
-
windsurf: join(homedir(), '.config/windsurf/mcp_config.json'),
|
|
266
|
-
cursor: join(homedir(), '.config/cursor/mcp_config.json'),
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
const configPath = configPaths[assistant];
|
|
270
|
-
|
|
271
|
-
if (existsSync(configPath)) {
|
|
272
|
-
const content = readFileSync(configPath, 'utf8');
|
|
273
|
-
const config = JSON.parse(content);
|
|
274
|
-
|
|
275
|
-
if (config.mcpServers && config.mcpServers[this.config.name]) {
|
|
276
|
-
delete config.mcpServers[this.config.name];
|
|
277
|
-
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Helper to run installer from skill CLI
|
|
285
|
-
*/
|
|
286
|
-
export async function runInstaller(
|
|
287
|
-
config: SkillConfig,
|
|
288
|
-
currentFilePath: string,
|
|
289
|
-
args: string[]
|
|
290
|
-
): Promise<void> {
|
|
291
|
-
const installer = new SkillInstaller(config, currentFilePath);
|
|
292
|
-
|
|
293
|
-
const command = args[0];
|
|
294
|
-
const assistant = args[1] as AssistantType;
|
|
295
|
-
|
|
296
|
-
if (command === 'install') {
|
|
297
|
-
if (!assistant || !['claude', 'codex', 'windsurf', 'cursor'].includes(assistant)) {
|
|
298
|
-
console.error('❌ Error: Please specify an assistant');
|
|
299
|
-
console.error('');
|
|
300
|
-
console.error('Usage:');
|
|
301
|
-
console.error(` ${config.name} install [claude|codex|windsurf|cursor]`);
|
|
302
|
-
console.error('');
|
|
303
|
-
console.error('Examples:');
|
|
304
|
-
console.error(` ${config.name} install claude`);
|
|
305
|
-
console.error(` ${config.name} install codex`);
|
|
306
|
-
process.exit(1);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
await installer.install(assistant);
|
|
310
|
-
} else if (command === 'uninstall') {
|
|
311
|
-
if (!assistant || !['claude', 'codex', 'windsurf', 'cursor'].includes(assistant)) {
|
|
312
|
-
console.error('❌ Error: Please specify an assistant');
|
|
313
|
-
console.error('');
|
|
314
|
-
console.error('Usage:');
|
|
315
|
-
console.error(` ${config.name} uninstall [claude|codex|windsurf|cursor]`);
|
|
316
|
-
process.exit(1);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
await installer.uninstall(assistant);
|
|
320
|
-
} else {
|
|
321
|
-
console.error(`❌ Unknown installer command: ${command}`);
|
|
322
|
-
process.exit(1);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill Installation Handler
|
|
3
|
-
*
|
|
4
|
-
* Add this code to your skill's index.ts to enable:
|
|
5
|
-
* skill-[name] install claude
|
|
6
|
-
* skill-[name] install codex
|
|
7
|
-
* skill-[name] uninstall claude
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
import { homedir } from 'os';
|
|
13
|
-
|
|
14
|
-
interface SkillMeta {
|
|
15
|
-
name: string;
|
|
16
|
-
description: string;
|
|
17
|
-
version: string;
|
|
18
|
-
commands: string; // Help text or command list
|
|
19
|
-
requiredEnvVars?: string[];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function handleInstallCommand(meta: SkillMeta, args: string[]): Promise<boolean> {
|
|
23
|
-
const command = args[0];
|
|
24
|
-
const assistant = args[1];
|
|
25
|
-
|
|
26
|
-
if (command !== 'install' && command !== 'uninstall') {
|
|
27
|
-
return false; // Not an install command
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (!assistant || !['claude', 'codex', 'windsurf', 'cursor'].includes(assistant)) {
|
|
31
|
-
console.error('❌ Error: Please specify an assistant');
|
|
32
|
-
console.error('');
|
|
33
|
-
console.error('Usage:');
|
|
34
|
-
console.error(` ${meta.name} install [claude|codex|windsurf|cursor]`);
|
|
35
|
-
console.error(` ${meta.name} uninstall [claude|codex|windsurf|cursor]`);
|
|
36
|
-
console.error('');
|
|
37
|
-
console.error('Examples:');
|
|
38
|
-
console.error(` ${meta.name} install claude`);
|
|
39
|
-
console.error(` ${meta.name} install codex`);
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (command === 'install') {
|
|
44
|
-
await installSkill(meta, assistant);
|
|
45
|
-
} else {
|
|
46
|
-
await uninstallSkill(meta, assistant);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async function installSkill(meta: SkillMeta, assistant: string): Promise<void> {
|
|
53
|
-
console.log(`📦 Installing ${meta.name} for ${assistant}...`);
|
|
54
|
-
console.log('');
|
|
55
|
-
|
|
56
|
-
const assistantPaths: Record<string, string> = {
|
|
57
|
-
claude: '.claude/skills',
|
|
58
|
-
codex: '.codex/skills',
|
|
59
|
-
windsurf: '.windsurf/skills',
|
|
60
|
-
cursor: '.cursor/skills',
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const skillDir = join(homedir(), assistantPaths[assistant], meta.name);
|
|
64
|
-
mkdirSync(skillDir, { recursive: true });
|
|
65
|
-
console.log(`✓ Created: ${skillDir}`);
|
|
66
|
-
|
|
67
|
-
// Generate SKILL.md
|
|
68
|
-
const skillMd = generateSkillMd(meta);
|
|
69
|
-
writeFileSync(join(skillDir, 'SKILL.md'), skillMd);
|
|
70
|
-
console.log(`✓ Created: SKILL.md`);
|
|
71
|
-
|
|
72
|
-
// Generate README.md
|
|
73
|
-
const readme = generateReadme(meta);
|
|
74
|
-
writeFileSync(join(skillDir, 'README.md'), readme);
|
|
75
|
-
console.log(`✓ Created: README.md`);
|
|
76
|
-
|
|
77
|
-
// Create log file
|
|
78
|
-
const logFile = join(skillDir, `${meta.name}.log`);
|
|
79
|
-
if (!existsSync(logFile)) {
|
|
80
|
-
writeFileSync(logFile, `# ${meta.name} execution log\n# Created: ${new Date().toISOString()}\n\n`);
|
|
81
|
-
console.log(`✓ Created: ${meta.name}.log`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
console.log('');
|
|
85
|
-
console.log(`✅ ${meta.name} installed successfully!`);
|
|
86
|
-
console.log('');
|
|
87
|
-
console.log('Location:', skillDir);
|
|
88
|
-
console.log('');
|
|
89
|
-
console.log('Files created:');
|
|
90
|
-
console.log(' - SKILL.md (documentation)');
|
|
91
|
-
console.log(' - README.md (quick reference)');
|
|
92
|
-
console.log(` - ${meta.name}.log (execution logs)`);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
async function uninstallSkill(meta: SkillMeta, assistant: string): Promise<void> {
|
|
96
|
-
console.log(`🗑️ Uninstalling ${meta.name} from ${assistant}...`);
|
|
97
|
-
console.log('');
|
|
98
|
-
|
|
99
|
-
const assistantPaths: Record<string, string> = {
|
|
100
|
-
claude: '.claude/skills',
|
|
101
|
-
codex: '.codex/skills',
|
|
102
|
-
windsurf: '.windsurf/skills',
|
|
103
|
-
cursor: '.cursor/skills',
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
const skillDir = join(homedir(), assistantPaths[assistant], meta.name);
|
|
107
|
-
|
|
108
|
-
if (existsSync(skillDir)) {
|
|
109
|
-
console.log(`⚠️ Directory preserved: ${skillDir}`);
|
|
110
|
-
console.log(' (contains logs and configuration)');
|
|
111
|
-
console.log(' Delete manually if needed:');
|
|
112
|
-
console.log(` rm -rf ${skillDir}`);
|
|
113
|
-
} else {
|
|
114
|
-
console.log(`✓ ${meta.name} is not installed for ${assistant}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function generateSkillMd(meta: SkillMeta): string {
|
|
119
|
-
// Extract skill type from name (e.g., "skill-audio" -> "audio")
|
|
120
|
-
const skillType = meta.name.replace('skill-', '');
|
|
121
|
-
|
|
122
|
-
// Create gerund form for description trigger (e.g., "audio" -> "generating audio")
|
|
123
|
-
const gerundForms: Record<string, string> = {
|
|
124
|
-
audio: 'generating audio',
|
|
125
|
-
image: 'generating images',
|
|
126
|
-
video: 'generating videos',
|
|
127
|
-
browse: 'browsing websites',
|
|
128
|
-
codefix: 'fixing code',
|
|
129
|
-
convert: 'converting files',
|
|
130
|
-
deploy: 'deploying applications',
|
|
131
|
-
emoji: 'generating emojis',
|
|
132
|
-
extract: 'extracting data',
|
|
133
|
-
transcript: 'transcribing audio',
|
|
134
|
-
transform: 'transforming data',
|
|
135
|
-
write: 'writing content',
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
const gerund = gerundForms[skillType] || `using ${skillType}`;
|
|
139
|
-
|
|
140
|
-
// Enhanced description with usage triggers
|
|
141
|
-
const enhancedDesc = `${meta.description}. Use when ${gerund} or when the user mentions ${skillType}.`;
|
|
142
|
-
|
|
143
|
-
const envSection = meta.requiredEnvVars?.length ? `
|
|
144
|
-
|
|
145
|
-
## Environment Variables
|
|
146
|
-
|
|
147
|
-
${meta.requiredEnvVars.map(v => `- \`${v}\``).join('\n')}
|
|
148
|
-
|
|
149
|
-
Add to your \`~/.zshrc\` or \`~/.bashrc\`:
|
|
150
|
-
\`\`\`bash
|
|
151
|
-
${meta.requiredEnvVars.map(v => `export ${v}=your_key_here`).join('\n')}
|
|
152
|
-
\`\`\`
|
|
153
|
-
` : '';
|
|
154
|
-
|
|
155
|
-
return `---
|
|
156
|
-
name: ${meta.name}
|
|
157
|
-
description: ${enhancedDesc}
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
# ${meta.name.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}
|
|
161
|
-
|
|
162
|
-
${meta.description}
|
|
163
|
-
|
|
164
|
-
## Quick Start
|
|
165
|
-
|
|
166
|
-
\`\`\`bash
|
|
167
|
-
${meta.commands}
|
|
168
|
-
\`\`\`
|
|
169
|
-
|
|
170
|
-
## Version
|
|
171
|
-
|
|
172
|
-
${meta.version}${envSection}
|
|
173
|
-
|
|
174
|
-
## Installation
|
|
175
|
-
|
|
176
|
-
Installed at: \`~/.claude/skills/${meta.name}/\`
|
|
177
|
-
|
|
178
|
-
## Logs
|
|
179
|
-
|
|
180
|
-
Execution logs: \`~/.claude/skills/${meta.name}/${meta.name}.log\`
|
|
181
|
-
|
|
182
|
-
## Support
|
|
183
|
-
|
|
184
|
-
For issues, visit: https://github.com/hasnaxyz/${meta.name}/issues
|
|
185
|
-
`;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function generateReadme(meta: SkillMeta): string {
|
|
189
|
-
return `# ${meta.name}
|
|
190
|
-
|
|
191
|
-
${meta.description}
|
|
192
|
-
|
|
193
|
-
**Version:** ${meta.version}
|
|
194
|
-
|
|
195
|
-
## Documentation
|
|
196
|
-
|
|
197
|
-
See [SKILL.md](./SKILL.md) for complete documentation.
|
|
198
|
-
|
|
199
|
-
## Quick Reference
|
|
200
|
-
|
|
201
|
-
\`\`\`bash
|
|
202
|
-
${meta.name} --help
|
|
203
|
-
\`\`\`
|
|
204
|
-
`;
|
|
205
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# skill-csv-transformer
|
|
2
|
-
|
|
3
|
-
Csv Transformer skill.
|
|
4
|
-
|
|
5
|
-
## Tech Stack
|
|
6
|
-
|
|
7
|
-
- Runtime: Bun
|
|
8
|
-
- Language: TypeScript
|
|
9
|
-
- CLI: Commander.js
|
|
10
|
-
|
|
11
|
-
## CLI
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
skill-csv-transformer run
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Data Directory
|
|
18
|
-
|
|
19
|
-
~/.skill/skill-csv-transformer/
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@hasnaxyz/skill-csv-transformer",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "Csv Transformer skill",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"skill-csv-transformer": "./bin/cli.ts"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"dev": "bun run bin/cli.ts",
|
|
11
|
-
"build": "bun build bin/cli.ts --outdir dist --target node",
|
|
12
|
-
"typecheck": "tsc --noEmit"
|
|
13
|
-
},
|
|
14
|
-
"dependencies": {
|
|
15
|
-
"commander": "^13.0.0"
|
|
16
|
-
},
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@types/bun": "latest",
|
|
19
|
-
"typescript": "^5.7.0"
|
|
20
|
-
},
|
|
21
|
-
"publishConfig": {
|
|
22
|
-
"access": "restricted",
|
|
23
|
-
"registry": "https://registry.npmjs.org/"
|
|
24
|
-
},
|
|
25
|
-
"files": ["bin", "src", "tsconfig.json"],
|
|
26
|
-
"repository": {
|
|
27
|
-
"type": "git",
|
|
28
|
-
"url": "https://github.com/hasnaxyz/skill-csv-transformer.git"
|
|
29
|
-
},
|
|
30
|
-
"author": "Hasna",
|
|
31
|
-
"license": "MIT"
|
|
32
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
import { readFile, writeFile } from "fs/promises";
|
|
3
|
-
import { parse } from "csv-parse/sync";
|
|
4
|
-
import { stringify } from "csv-stringify/sync";
|
|
5
|
-
|
|
6
|
-
const args = process.argv.slice(2);
|
|
7
|
-
|
|
8
|
-
if (args.includes("-h") || args.includes("--help")) {
|
|
9
|
-
console.log(`
|
|
10
|
-
skill-csv-transformer - Transform and filter CSV data
|
|
11
|
-
|
|
12
|
-
Usage:
|
|
13
|
-
skills run csv-transformer -- input=<file> output=<file> [options]
|
|
14
|
-
|
|
15
|
-
Options:
|
|
16
|
-
-h, --help Show this help message
|
|
17
|
-
input=<file> Input CSV file path (required)
|
|
18
|
-
output=<file> Output file path (required)
|
|
19
|
-
format=<fmt> Output format: csv | json (default: csv)
|
|
20
|
-
columns=<cols> Comma-separated columns to include
|
|
21
|
-
filter=<col=val> Filter rows where column equals value
|
|
22
|
-
|
|
23
|
-
Examples:
|
|
24
|
-
skills run csv-transformer -- input=data.csv output=out.csv
|
|
25
|
-
skills run csv-transformer -- input=data.csv output=out.json format=json
|
|
26
|
-
skills run csv-transformer -- input=data.csv output=out.csv columns=name,email
|
|
27
|
-
skills run csv-transformer -- input=data.csv output=out.csv filter=status=active
|
|
28
|
-
`);
|
|
29
|
-
process.exit(0);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const inputArg = args.find(a => a.startsWith("input="))?.split("=")[1];
|
|
33
|
-
const outputArg = args.find(a => a.startsWith("output="))?.split("=")[1];
|
|
34
|
-
const formatArg = args.find(a => a.startsWith("format="))?.split("=")[1] || "csv";
|
|
35
|
-
const columnsArg = args.find(a => a.startsWith("columns="))?.split("=")[1];
|
|
36
|
-
const filterArg = args.find(a => a.startsWith("filter="))?.split("=")[1];
|
|
37
|
-
|
|
38
|
-
async function main() {
|
|
39
|
-
if (!inputArg || !outputArg) {
|
|
40
|
-
console.log("Usage: skills run csv-transformer -- input=... output=... [format=json|csv] [columns=col1,col2] [filter=col=val]");
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
const content = await readFile(inputArg, "utf-8");
|
|
46
|
-
let records = parse(content, { columns: true, skip_empty_lines: true });
|
|
47
|
-
|
|
48
|
-
// Filter
|
|
49
|
-
if (filterArg) {
|
|
50
|
-
const [key, value] = filterArg.split("=");
|
|
51
|
-
records = records.filter((r: any) => r[key] === value);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Select Columns
|
|
55
|
-
if (columnsArg) {
|
|
56
|
-
const cols = columnsArg.split(",");
|
|
57
|
-
records = records.map((r: any) => {
|
|
58
|
-
const newR: any = {};
|
|
59
|
-
cols.forEach(c => newR[c] = r[c]);
|
|
60
|
-
return newR;
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Output
|
|
65
|
-
let outputContent = "";
|
|
66
|
-
if (formatArg === "json") {
|
|
67
|
-
outputContent = JSON.stringify(records, null, 2);
|
|
68
|
-
} else {
|
|
69
|
-
outputContent = stringify(records, { header: true });
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
await writeFile(outputArg, outputContent);
|
|
73
|
-
console.log(`Transformed data saved to ${outputArg}`);
|
|
74
|
-
|
|
75
|
-
} catch (error: any) {
|
|
76
|
-
console.error("Error:", error.message);
|
|
77
|
-
process.exit(1);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
main();
|