@hasna/skills 0.1.26 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -10
- package/README.md +141 -39
- package/bin/index.js +30122 -27575
- package/bin/mcp.js +22112 -18593
- package/dist/cli/cli.test-utils.d.ts +15 -0
- package/dist/cli/commands/auth.d.ts +2 -0
- package/dist/cli/commands/install.d.ts +1 -1
- package/dist/cli/commands/runtime-mcp.d.ts +4 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.js +11607 -597
- package/dist/lib/auth-store.d.ts +13 -0
- package/dist/lib/installer.d.ts +58 -55
- package/dist/lib/mcp-contracts.d.ts +86 -0
- package/dist/lib/project-state.d.ts +43 -0
- package/dist/lib/registry-data/business-marketing.d.ts +2 -0
- package/dist/lib/registry-data/communication.d.ts +2 -0
- package/dist/lib/registry-data/content-generation.d.ts +2 -0
- package/dist/lib/registry-data/data-analysis.d.ts +2 -0
- package/dist/lib/registry-data/design-branding.d.ts +2 -0
- package/dist/lib/registry-data/development-tools.d.ts +2 -0
- package/dist/lib/registry-data/education-learning.d.ts +2 -0
- package/dist/lib/registry-data/event-management.d.ts +2 -0
- package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
- package/dist/lib/registry-data/health-wellness.d.ts +2 -0
- package/dist/lib/registry-data/index.d.ts +2 -0
- package/dist/lib/registry-data/media-processing.d.ts +2 -0
- package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
- package/dist/lib/registry-data/project-management.d.ts +2 -0
- package/dist/lib/registry-data/research-writing.d.ts +2 -0
- package/dist/lib/registry-data/science-academic.d.ts +2 -0
- package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
- package/dist/lib/registry-data/web-browser.d.ts +2 -0
- package/dist/lib/registry-types.d.ts +27 -0
- package/dist/lib/registry.d.ts +6 -18
- package/dist/lib/remote-registry.d.ts +3 -0
- package/dist/lib/run-state.d.ts +60 -0
- package/dist/lib/skill-aliases.d.ts +17 -0
- package/dist/lib/skillinfo.d.ts +5 -1
- package/dist/mcp/discovery-tools.d.ts +2 -0
- package/dist/mcp/helpers.d.ts +26 -0
- package/dist/mcp/http.d.ts +10 -0
- package/dist/mcp/index.d.ts +3 -2
- package/dist/mcp/operation-tools.d.ts +2 -0
- package/dist/mcp/resource-meta-tools.d.ts +2 -0
- package/dist/mcp/schedule-tools.d.ts +2 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/types/api.d.ts +7 -4
- package/package.json +23 -10
- package/skills/_common/http-client.ts +1 -1
- package/skills/_common/index.ts +2 -3
- package/skills/_common/install.sh +5 -110
- package/skills/_common/installer.ts +31 -282
- package/skills/_common/skill-install.ts +14 -181
- package/skills/ad-creative-pack/SKILL.md +45 -0
- package/skills/ad-creative-pack/package.json +14 -0
- package/skills/advanced-math/package.json +3 -1
- package/skills/advanced-math/src/calculators.ts +118 -0
- package/skills/advanced-math/src/cli.ts +130 -0
- package/skills/advanced-math/src/conversion.ts +90 -0
- package/skills/advanced-math/src/finance.ts +75 -0
- package/skills/advanced-math/src/formatting.ts +95 -0
- package/skills/advanced-math/src/index.ts +24 -702
- package/skills/advanced-math/src/runtime.ts +49 -0
- package/skills/advanced-math/src/symbolic.ts +110 -0
- package/skills/advanced-math/src/types.ts +36 -0
- package/skills/analyze-data/SKILL.md +2 -2
- package/skills/analyze-data/src/analysis.ts +401 -0
- package/skills/analyze-data/src/cli.ts +66 -0
- package/skills/analyze-data/src/formatters.ts +235 -0
- package/skills/analyze-data/src/index.ts +6 -1027
- package/skills/analyze-data/src/logger.ts +36 -0
- package/skills/analyze-data/src/parsers.ts +57 -0
- package/skills/analyze-data/src/stats.ts +151 -0
- package/skills/analyze-data/src/types.ts +85 -0
- package/skills/api-docs-portal/SKILL.md +46 -0
- package/skills/api-docs-portal/package.json +9 -0
- package/skills/api-test-suite/src/index.ts +13 -0
- package/skills/apidocs/package.json +1 -1
- package/skills/apidocs/src/index.ts +3 -0
- package/skills/audio/package.json +2 -3
- package/skills/audio-cleanup-lab/SKILL.md +2 -2
- package/skills/audio-extract/CLAUDE.md +1 -1
- package/skills/audio-transcript-pack/SKILL.md +43 -0
- package/skills/audio-transcript-pack/package.json +10 -0
- package/skills/blog-article/CLAUDE.md +12 -0
- package/skills/blog-article/SKILL.md +45 -0
- package/skills/{create-blog-article → blog-article}/package.json +3 -3
- package/skills/brand-kit/SKILL.md +45 -0
- package/skills/brand-kit/package.json +14 -0
- package/skills/brand-photo-shoot/SKILL.md +28 -0
- package/skills/brand-photo-shoot/package.json +10 -0
- package/skills/brand-style-guide/SKILL.md +2 -2
- package/skills/brand-style-guide/src/index.ts +0 -0
- package/skills/budget-variance-analyzer/SKILL.md +2 -2
- package/skills/businessactivity/package.json +1 -1
- package/skills/businessactivity/src/index.ts +3 -0
- package/skills/calendar-events/src/ai-parser.ts +103 -0
- package/skills/calendar-events/src/api.ts +157 -0
- package/skills/calendar-events/src/auth.ts +22 -0
- package/skills/calendar-events/src/config.ts +6 -0
- package/skills/calendar-events/src/format.ts +96 -0
- package/skills/calendar-events/src/help.ts +54 -0
- package/skills/calendar-events/src/index.ts +21 -524
- package/skills/calendar-events/src/logger.ts +34 -0
- package/skills/calendar-events/src/types.ts +67 -0
- package/skills/compress-video/SKILL.md +2 -2
- package/skills/consolelog/package.json +1 -1
- package/skills/consolelog/src/index.ts +3 -0
- package/skills/contract-review-report/SKILL.md +43 -0
- package/skills/contract-review-report/package.json +10 -0
- package/skills/convert/SKILL.md +2 -3
- package/skills/customer-feedback-report/SKILL.md +44 -0
- package/skills/customer-feedback-report/package.json +10 -0
- package/skills/dashboard-builder/package.json +3 -1
- package/skills/database-explorer/package.json +3 -1
- package/skills/deepresearch/README.md +4 -13
- package/skills/deploy/src/http-client.ts +1 -1
- package/skills/diff-viewer/package.json +4 -1
- package/skills/doc-generate/package.json +0 -1
- package/skills/doc-generate/src/ai.ts +50 -0
- package/skills/doc-generate/src/cli.ts +203 -0
- package/skills/doc-generate/src/dependencies.ts +44 -0
- package/skills/doc-generate/src/document-builder.ts +299 -0
- package/skills/doc-generate/src/index.ts +40 -764
- package/skills/doc-generate/src/markdown-parser.ts +125 -0
- package/skills/doc-generate/src/types.ts +68 -0
- package/skills/domainpurchase/SKILL.md +1 -1
- package/skills/domainpurchase/package.json +1 -1
- package/skills/domainpurchase/src/index.ts +3 -0
- package/skills/domainsearch/SKILL.md +1 -1
- package/skills/domainsearch/package.json +1 -1
- package/skills/domainsearch/src/index.ts +3 -0
- package/skills/email-sequence/SKILL.md +44 -0
- package/skills/email-sequence/package.json +14 -0
- package/skills/excel/CLAUDE.md +2 -2
- package/skills/experiment-power-calculator/package.json +3 -1
- package/skills/extract-invoice/src/cli.ts +97 -0
- package/skills/extract-invoice/src/extractor.ts +170 -0
- package/skills/extract-invoice/src/file-utils.ts +46 -0
- package/skills/extract-invoice/src/formatters.ts +144 -0
- package/skills/extract-invoice/src/index.ts +44 -629
- package/skills/extract-invoice/src/runtime.ts +46 -0
- package/skills/extract-invoice/src/types.ts +88 -0
- package/skills/folder-tree/package.json +3 -1
- package/skills/form-filler/package.json +3 -1
- package/skills/generate-api-client/package.json +3 -1
- package/skills/generate-api-client/src/generator.ts +47 -0
- package/skills/generate-api-client/src/index.ts +3 -777
- package/skills/generate-api-client/src/logger.ts +34 -0
- package/skills/generate-api-client/src/python-generator.ts +245 -0
- package/skills/generate-api-client/src/spec-loader.ts +48 -0
- package/skills/generate-api-client/src/type-mappers.ts +79 -0
- package/skills/generate-api-client/src/types.ts +76 -0
- package/skills/generate-api-client/src/typescript-generator.ts +247 -0
- package/skills/generate-book-cover/package.json +3 -1
- package/skills/generate-dockerfile/src/cli.ts +78 -0
- package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
- package/skills/generate-dockerfile/src/index.ts +12 -790
- package/skills/generate-dockerfile/src/logger.ts +30 -0
- package/skills/generate-dockerfile/src/project-detection.ts +68 -0
- package/skills/generate-dockerfile/src/support-files.ts +171 -0
- package/skills/generate-dockerfile/src/types.ts +29 -0
- package/skills/generate-documentation/src/ai.ts +131 -0
- package/skills/generate-documentation/src/cli.ts +71 -0
- package/skills/generate-documentation/src/code-parser.ts +300 -0
- package/skills/generate-documentation/src/file-processing.ts +182 -0
- package/skills/generate-documentation/src/index.ts +13 -753
- package/skills/generate-documentation/src/runtime.ts +35 -0
- package/skills/generate-documentation/src/types.ts +30 -0
- package/skills/generate-env/package.json +3 -1
- package/skills/generate-env/src/cli.ts +85 -0
- package/skills/generate-env/src/detection.ts +161 -0
- package/skills/generate-env/src/env-data.ts +66 -0
- package/skills/generate-env/src/generators.ts +240 -0
- package/skills/generate-env/src/index.ts +76 -676
- package/skills/generate-env/src/runtime.ts +30 -0
- package/skills/generate-env/src/types.ts +32 -0
- package/skills/generate-favicon/package.json +3 -1
- package/skills/generate-mock-data/package.json +3 -1
- package/skills/generate-mock-data/src/ai.ts +102 -0
- package/skills/generate-mock-data/src/formatters.ts +84 -0
- package/skills/generate-mock-data/src/generator.ts +377 -0
- package/skills/generate-mock-data/src/index.ts +15 -716
- package/skills/generate-mock-data/src/logger.ts +37 -0
- package/skills/generate-mock-data/src/presets.ts +110 -0
- package/skills/generate-mock-data/src/types.ts +21 -0
- package/skills/generate-pr-description/src/ai.ts +144 -0
- package/skills/generate-pr-description/src/cli.ts +80 -0
- package/skills/generate-pr-description/src/clipboard.ts +30 -0
- package/skills/generate-pr-description/src/formatters.ts +231 -0
- package/skills/generate-pr-description/src/git.ts +153 -0
- package/skills/generate-pr-description/src/index.ts +21 -714
- package/skills/generate-pr-description/src/types.ts +49 -0
- package/skills/generate-presentation/src/ai-clients.ts +61 -0
- package/skills/generate-presentation/src/cli.ts +126 -0
- package/skills/generate-presentation/src/index.ts +3 -751
- package/skills/generate-presentation/src/logger.ts +67 -0
- package/skills/generate-presentation/src/presentation-generator.ts +425 -0
- package/skills/generate-presentation/src/runtime.ts +6 -0
- package/skills/generate-presentation/src/security.ts +12 -0
- package/skills/generate-presentation/src/types.ts +28 -0
- package/skills/generate-qrcode/package.json +4 -1
- package/skills/generate-regex/package.json +3 -1
- package/skills/generate-resume/src/cli.ts +157 -0
- package/skills/generate-resume/src/index.ts +13 -917
- package/skills/generate-resume/src/parsers.ts +95 -0
- package/skills/generate-resume/src/renderers.ts +538 -0
- package/skills/generate-resume/src/security.ts +39 -0
- package/skills/generate-resume/src/types.ts +86 -0
- package/skills/generate-social-posts/src/ai.ts +88 -0
- package/skills/generate-social-posts/src/cli.ts +118 -0
- package/skills/generate-social-posts/src/exporters.ts +126 -0
- package/skills/generate-social-posts/src/generator.ts +130 -0
- package/skills/generate-social-posts/src/index.ts +19 -709
- package/skills/generate-social-posts/src/platforms.ts +39 -0
- package/skills/generate-social-posts/src/runtime.ts +34 -0
- package/skills/generate-social-posts/src/source.ts +116 -0
- package/skills/generate-social-posts/src/types.ts +58 -0
- package/skills/gif-maker/package.json +4 -1
- package/skills/github-manager/package.json +3 -1
- package/skills/gmail/CLAUDE.md +1 -1
- package/skills/highlight-reel-generator/src/index.ts +19 -0
- package/skills/hook/src/commands/create.ts +20 -845
- package/skills/hook/src/templates/root.ts +196 -0
- package/skills/hook/src/templates/source.ts +647 -0
- package/skills/http-server/package.json +3 -1
- package/skills/icon-pack/README.md +28 -0
- package/skills/icon-pack/SKILL.md +23 -0
- package/skills/icon-pack/package.json +29 -0
- package/skills/{audio → icon-pack}/tsconfig.json +10 -12
- package/skills/image/package.json +1 -2
- package/skills/implementation-agent/package.json +3 -1
- package/skills/implementation-agent/src/ai-generation.ts +225 -0
- package/skills/implementation-agent/src/index.ts +3 -960
- package/skills/implementation-agent/src/minimist.d.ts +15 -0
- package/skills/implementation-agent/src/templates.ts +686 -0
- package/skills/implementation-agent/src/types.ts +53 -0
- package/skills/implementation-plan/package.json +3 -1
- package/skills/implementation-todo/package.json +3 -1
- package/skills/invoice/package.json +1 -1
- package/skills/invoice/src/index.ts +3 -0
- package/skills/invoice-reconciliation/SKILL.md +42 -0
- package/skills/invoice-reconciliation/package.json +10 -0
- package/skills/landing-page-pack/SKILL.md +47 -0
- package/skills/landing-page-pack/package.json +14 -0
- package/skills/latex-table-generator/package.json +3 -1
- package/skills/logo-design/SKILL.md +25 -44
- package/skills/logo-design/package.json +3 -15
- package/skills/lorem-generator/package.json +3 -1
- package/skills/lorem-generator/src/index.ts +13 -0
- package/skills/managehook/package.json +1 -1
- package/skills/managehook/src/index.ts +3 -0
- package/skills/managemcp/package.json +1 -1
- package/skills/managemcp/src/index.ts +3 -0
- package/skills/manageskill/package.json +1 -1
- package/skills/manageskill/src/index.ts +3 -0
- package/skills/markdown-validator/package.json +3 -1
- package/skills/markdown-validator/src/index.ts +1 -4
- package/skills/market-research-report/SKILL.md +41 -0
- package/skills/market-research-report/package.json +10 -0
- package/skills/mcp-builder/package.json +4 -1
- package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
- package/skills/mcp-builder/src/generators.ts +513 -0
- package/skills/mcp-builder/src/index.ts +7 -908
- package/skills/mcp-builder/src/minimist.d.ts +15 -0
- package/skills/mcp-builder/src/naming.ts +12 -0
- package/skills/mcp-builder/src/options.ts +170 -0
- package/skills/mcp-builder/src/templates.ts +149 -0
- package/skills/mcp-builder/src/types.ts +42 -0
- package/skills/meeting-pack/SKILL.md +43 -0
- package/skills/meeting-pack/package.json +10 -0
- package/skills/merge-pdfs/package.json +5 -1
- package/skills/migration-plan-pack/SKILL.md +45 -0
- package/skills/migration-plan-pack/package.json +10 -0
- package/skills/music/package.json +2 -3
- package/skills/music-album/SKILL.md +37 -0
- package/skills/music-album/package.json +10 -0
- package/skills/notion-manager/package.json +3 -1
- package/skills/npmpublish/CLAUDE.md +5 -8
- package/skills/npmpublish/README.md +5 -26
- package/skills/npmpublish/src/index.ts +9 -147
- package/skills/one-page-website/SKILL.md +46 -0
- package/skills/one-page-website/package.json +10 -0
- package/skills/one-page-website/tsconfig.json +8 -0
- package/skills/pdf-generate/src/cli.ts +162 -0
- package/skills/pdf-generate/src/html.ts +84 -0
- package/skills/pdf-generate/src/index.ts +11 -800
- package/skills/pdf-generate/src/markdown.ts +27 -0
- package/skills/pdf-generate/src/pdf-writer.ts +78 -0
- package/skills/pdf-generate/src/runtime.ts +34 -0
- package/skills/pdf-generate/src/security.ts +37 -0
- package/skills/pdf-generate/src/templates.ts +311 -0
- package/skills/pdf-generate/src/types.ts +28 -0
- package/skills/pdf-read/SKILL.md +10 -10
- package/skills/pdf-to-dataset/SKILL.md +45 -0
- package/skills/pdf-to-dataset/package.json +10 -0
- package/skills/pdf-to-markdown/SKILL.md +49 -0
- package/skills/pdf-to-markdown/package.json +10 -0
- package/skills/pdf-to-markdown/tsconfig.json +10 -0
- package/skills/performance-audit-report/SKILL.md +42 -0
- package/skills/performance-audit-report/package.json +10 -0
- package/skills/persona-based-adwriter/src/index.ts +19 -0
- package/skills/photo-album/SKILL.md +29 -0
- package/skills/photo-album/package.json +9 -0
- package/skills/photo-album/tsconfig.json +4 -0
- package/skills/pitch-deck/SKILL.md +43 -0
- package/skills/pitch-deck/package.json +9 -0
- package/skills/playlist-maker/SKILL.md +33 -0
- package/skills/playlist-maker/package.json +9 -0
- package/skills/playlist-maker/tsconfig.json +4 -0
- package/skills/product-mockup/SKILL.md +45 -0
- package/skills/product-mockup/package.json +3 -20
- package/skills/product-mockup/tsconfig.json +3 -5
- package/skills/project-retro-companion/src/index.ts +19 -0
- package/skills/proposal-pack/SKILL.md +45 -0
- package/skills/proposal-pack/package.json +10 -0
- package/skills/read-pdf/SKILL.md +5 -4
- package/skills/repo-onboarding-report/SKILL.md +42 -0
- package/skills/repo-onboarding-report/package.json +10 -0
- package/skills/sales-call-recapper/src/index.ts +20 -0
- package/skills/salescopy/package.json +1 -1
- package/skills/salescopy/src/index.ts +3 -0
- package/skills/scaffold-project/src/ai-detect.ts +136 -0
- package/skills/scaffold-project/src/file-generators.ts +292 -0
- package/skills/scaffold-project/src/index.ts +8 -991
- package/skills/scaffold-project/src/project-config.ts +338 -0
- package/skills/scaffold-project/src/templates.ts +173 -0
- package/skills/scaffold-project/src/types.ts +58 -0
- package/skills/scientific-figure-check/package.json +3 -1
- package/skills/sdk-generator/SKILL.md +45 -0
- package/skills/sdk-generator/package.json +10 -0
- package/skills/sdk-generator/tsconfig.json +8 -0
- package/skills/security-audit/src/index.ts +25 -6
- package/skills/security-audit-report/SKILL.md +40 -0
- package/skills/security-audit-report/package.json +10 -0
- package/skills/seo-content-pack/SKILL.md +44 -0
- package/skills/seo-content-pack/package.json +9 -0
- package/skills/short-video-pack/SKILL.md +30 -0
- package/skills/short-video-pack/package.json +10 -0
- package/skills/slack-assistant/package.json +3 -1
- package/skills/slide-deck-generator/SKILL.md +44 -0
- package/skills/slide-deck-generator/package.json +10 -0
- package/skills/sms/package.json +1 -1
- package/skills/sms/src/index.ts +15 -0
- package/skills/social-content-calendar/SKILL.md +45 -0
- package/skills/social-content-calendar/package.json +14 -0
- package/skills/split-pdf/package.json +4 -1
- package/skills/subtitle/package.json +2 -1
- package/skills/subtitle/src/index.ts +3 -0
- package/skills/terraform-generator/package.json +3 -1
- package/skills/test-suite-generator/SKILL.md +41 -0
- package/skills/test-suite-generator/package.json +10 -0
- package/skills/timesheet/package.json +1 -1
- package/skills/timesheet/src/index.ts +3 -0
- package/skills/transcript/SKILL.md +1 -8
- package/skills/validate-config/package.json +3 -1
- package/skills/video/package.json +6 -4
- package/skills/video-downloader/package.json +3 -1
- package/skills/video-highlight-pack/SKILL.md +44 -0
- package/skills/video-highlight-pack/package.json +10 -0
- package/skills/voiceover-jingle-pack/SKILL.md +28 -0
- package/skills/voiceover-jingle-pack/package.json +10 -0
- package/skills/watermark/package.json +6 -1
- package/skills/webcrawling/package.json +2 -1
- package/skills/write/SKILL.md +6 -6
- package/dist/server/serve.d.ts +0 -11
- package/skills/apidocs/.claude/settings.json +0 -5
- package/skills/audio/.env.example +0 -14
- package/skills/audio/QUICKSTART.md +0 -158
- package/skills/audio/README.md +0 -256
- package/skills/audio/src/index-local.ts +0 -206
- package/skills/audio/src/index.ts +0 -95
- package/skills/audio/src/providers/elevenlabs.ts +0 -115
- package/skills/audio/src/providers/google.ts +0 -116
- package/skills/audio/src/providers/minimax.ts +0 -83
- package/skills/audio/src/providers/openai.ts +0 -115
- package/skills/audio/src/types.ts +0 -79
- package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
- package/skills/audiobook-chapter-proofer/package.json +0 -27
- package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
- package/skills/browse/src/client.ts +0 -373
- package/skills/browse/src/index-local.ts +0 -430
- package/skills/browse/src/index.ts +0 -110
- package/skills/browse/src/sse-server.ts +0 -919
- package/skills/browse/src/types.ts +0 -104
- package/skills/consolelog/src/server/index.ts +0 -508
- package/skills/create-blog-article/CLAUDE.md +0 -19
- package/skills/create-blog-article/src/index.ts +0 -745
- package/skills/create-blog-article/tsconfig.json +0 -10
- package/skills/deepresearch/src/agents/query-generator.ts +0 -91
- package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
- package/skills/deepresearch/src/index.ts +0 -224
- package/skills/deepresearch/src/research.ts +0 -166
- package/skills/deepresearch/src/services/anthropic.ts +0 -69
- package/skills/deepresearch/src/services/exa.ts +0 -108
- package/skills/deepresearch/src/services/firecrawl.ts +0 -88
- package/skills/deepresearch/src/services/openai.ts +0 -81
- package/skills/deepresearch/src/types.ts +0 -76
- package/skills/deepresearch/src/utils/file.ts +0 -111
- package/skills/deepresearch/src/utils/logger.ts +0 -84
- package/skills/domainpurchase/src/server/index.ts +0 -332
- package/skills/domainsearch/src/server/index.ts +0 -229
- package/skills/e2bswarm/README.md +0 -135
- package/skills/e2bswarm/SKILL.md +0 -118
- package/skills/e2bswarm/examples/tasks-example.json +0 -38
- package/skills/e2bswarm/package.json +0 -59
- package/skills/e2bswarm/src/commands/collect.ts +0 -135
- package/skills/e2bswarm/src/commands/install.ts +0 -164
- package/skills/e2bswarm/src/commands/kill.ts +0 -62
- package/skills/e2bswarm/src/commands/spawn.ts +0 -134
- package/skills/e2bswarm/src/commands/status.ts +0 -90
- package/skills/e2bswarm/src/commands/sync.ts +0 -208
- package/skills/e2bswarm/src/index.ts +0 -121
- package/skills/e2bswarm/src/lib/config.ts +0 -75
- package/skills/e2bswarm/src/lib/e2b.ts +0 -490
- package/skills/e2bswarm/src/lib/github.ts +0 -253
- package/skills/e2bswarm/src/lib/logger.ts +0 -41
- package/skills/e2bswarm/src/lib/paths.ts +0 -75
- package/skills/e2bswarm/src/lib/tasks.ts +0 -320
- package/skills/e2bswarm/src/types/index.ts +0 -107
- package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
- package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
- package/skills/e2bswarm/templates/setup.sh +0 -21
- package/skills/e2bswarm/tsconfig.json +0 -19
- package/skills/generate-book-cover/src/index.ts +0 -694
- package/skills/image/src/index-local.ts +0 -206
- package/skills/image/src/index.ts +0 -96
- package/skills/image/src/providers/google.ts +0 -79
- package/skills/image/src/providers/minimax.ts +0 -94
- package/skills/image/src/providers/openai.ts +0 -80
- package/skills/image/src/providers/xai.ts +0 -73
- package/skills/image/src/types.ts +0 -37
- package/skills/logo-design/CLAUDE.md +0 -30
- package/skills/logo-design/src/index.ts +0 -322
- package/skills/managehook/src/server/index.ts +0 -108
- package/skills/managemcp/src/server/index.ts +0 -108
- package/skills/manageskill/src/server/index.ts +0 -108
- package/skills/music/CLAUDE.md +0 -9
- package/skills/music/src/index.ts +0 -94
- package/skills/music/tsconfig.json +0 -10
- package/skills/pdf-read/src/index.ts +0 -320
- package/skills/product-mockup/CLAUDE.md +0 -19
- package/skills/product-mockup/src/index.ts +0 -290
- package/skills/read-pdf/src/index.ts +0 -388
- package/skills/remove-background/src/index.ts +0 -405
- package/skills/scaffold-project/my-app/.env.example +0 -2
- package/skills/scaffold-project/my-app/README.md +0 -72
- package/skills/scaffold-project/my-app/package.json +0 -29
- package/skills/scaffold-project/my-app/src/index.ts +0 -23
- package/skills/scaffold-project/my-app/tsconfig.json +0 -33
- package/skills/sound-effects/SKILL.md +0 -34
- package/skills/sound-effects/package.json +0 -21
- package/skills/sound-effects/src/index.ts +0 -172
- package/skills/sound-effects/tsconfig.json +0 -8
- package/skills/transcript/src/chunker.ts +0 -215
- package/skills/transcript/src/formatter.ts +0 -134
- package/skills/transcript/src/index-local.ts +0 -226
- package/skills/transcript/src/index.ts +0 -110
- package/skills/transcript/src/providers/elevenlabs.ts +0 -133
- package/skills/transcript/src/providers/gemini.ts +0 -192
- package/skills/transcript/src/providers/index.ts +0 -54
- package/skills/transcript/src/providers/openai.ts +0 -203
- package/skills/transcript/src/types.ts +0 -106
- package/skills/video/.env.example +0 -14
- package/skills/video/EXAMPLES.md +0 -266
- package/skills/video/LICENSE +0 -192
- package/skills/video/README.md +0 -174
- package/skills/video/src/cli.ts +0 -155
- package/skills/video/src/index-local.ts +0 -148
- package/skills/video/src/index.ts +0 -96
- package/skills/video/src/providers/google-veo.ts +0 -126
- package/skills/video/src/providers/index.ts +0 -22
- package/skills/video/src/providers/minimax.ts +0 -100
- package/skills/video/src/providers/openai-sora.ts +0 -164
- package/skills/video/src/providers/runway.ts +0 -159
- package/skills/video/src/types.ts +0 -35
- package/skills/video/tsconfig.json +0 -22
- package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
- package/skills/voiceover-casting-assistant/package.json +0 -27
- package/skills/voiceover-casting-assistant/src/index.ts +0 -255
- package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
- package/skills/webcrawling/src/commands/config.ts +0 -34
- package/skills/webcrawling/src/commands/crawl.ts +0 -33
- package/skills/webcrawling/src/commands/scrape.ts +0 -32
- package/skills/webcrawling/src/commands/sessions.ts +0 -42
- package/skills/webcrawling/src/lib/crawler.ts +0 -174
- package/skills/webcrawling/src/lib/storage.ts +0 -130
- package/skills/webcrawling/src/types/index.ts +0 -45
- package/skills/webcrawling/src/utils/logger.ts +0 -30
- package/skills/webcrawling/src/utils/paths.ts +0 -28
- /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brand-photo-shoot
|
|
3
|
+
description: Generate hosted brand or product photo shoot sets
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Brand Photo Shoot
|
|
7
|
+
|
|
8
|
+
Create a hosted premium product or brand photo shoot set with prompt planning, multiple scenes, selectable aspect ratios, gallery exports, captions, manifests, and receipts.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
skills run brand-photo-shoot "premium coffee subscription campaign" --scenes 8 --aspect-ratios "1:1,4:5,16:9"
|
|
14
|
+
skills run brand-photo-shoot --brief ./brand.md --style "editorial daylight studio"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Output
|
|
18
|
+
|
|
19
|
+
- `gallery/scene-*.png`
|
|
20
|
+
- `prompt-plan.md`
|
|
21
|
+
- `captions.csv`
|
|
22
|
+
- `manifest.json`
|
|
23
|
+
- `receipt.json`
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
Hosted premium execution requires `SKILLS_API_KEY` or `skills auth login`.
|
|
28
|
+
Provider keys stay server-side.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: brand-style-guide
|
|
3
3
|
version: 1.0.0
|
|
4
4
|
description: Perform brand style guide operations
|
|
5
5
|
author: skills.md
|
|
@@ -10,4 +10,4 @@ tags:
|
|
|
10
10
|
---
|
|
11
11
|
--brand "Brightwave"
|
|
12
12
|
--voice "Optimistic, transparent, empowering"
|
|
13
|
-
--audience "Gen Z investors"
|
|
13
|
+
--audience "Gen Z investors"
|
|
File without changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: budget-variance-analyzer
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
description: Explain budget versus actual variances with performance insights, key drivers, and recommended actions
|
|
5
5
|
author: skills.md
|
|
@@ -80,4 +80,4 @@ skills run budget-variance-analyzer -- --text "Engineering: Budget 500k, Actual
|
|
|
80
80
|
## Requirements
|
|
81
81
|
|
|
82
82
|
- `OPENAI_API_KEY` environment variable.
|
|
83
|
-
- Bun runtime.
|
|
83
|
+
- Bun runtime.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { REQUEST_TIMEOUT_MS } from "./config";
|
|
2
|
+
import { getOpenAIKey } from "./auth";
|
|
3
|
+
import { log } from "./logger";
|
|
4
|
+
import type { ParsedEvent } from "./types";
|
|
5
|
+
|
|
6
|
+
export async function parseEventWithAI(
|
|
7
|
+
text: string,
|
|
8
|
+
timezone: string
|
|
9
|
+
): Promise<ParsedEvent> {
|
|
10
|
+
const openaiKey = getOpenAIKey();
|
|
11
|
+
if (!openaiKey) {
|
|
12
|
+
throw new Error("OPENAI_API_KEY is required for natural language parsing. Use 'create' command with explicit options instead.");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const now = new Date();
|
|
16
|
+
const currentDate = now.toISOString().split("T")[0];
|
|
17
|
+
const currentTime = now.toTimeString().split(" ")[0];
|
|
18
|
+
const dayOfWeek = now.toLocaleDateString("en-US", { weekday: "long" });
|
|
19
|
+
|
|
20
|
+
const systemPrompt = `You are a calendar event parser. Extract event details from natural language and return a JSON object.
|
|
21
|
+
|
|
22
|
+
Current context:
|
|
23
|
+
- Today is ${dayOfWeek}, ${currentDate}
|
|
24
|
+
- Current time is ${currentTime}
|
|
25
|
+
- Timezone: ${timezone}
|
|
26
|
+
|
|
27
|
+
Rules:
|
|
28
|
+
1. Parse the input and extract: title, start date/time, end date/time, location, description, attendees
|
|
29
|
+
2. For relative dates like "tomorrow", "next week", "next Monday", calculate the actual date
|
|
30
|
+
3. "Next week" means 7 days from today
|
|
31
|
+
4. If only a time is given (e.g., "at 5am"), assume it's the next occurrence of that time
|
|
32
|
+
5. If no duration is specified, default to 1 hour for meetings/events
|
|
33
|
+
6. For all-day events (like "vacation on Dec 25"), set isAllDay to true
|
|
34
|
+
7. Return dates in ISO 8601 format with timezone offset
|
|
35
|
+
|
|
36
|
+
Return ONLY a valid JSON object with this structure:
|
|
37
|
+
{
|
|
38
|
+
"title": "Event title",
|
|
39
|
+
"startDateTime": "2025-01-15T10:00:00-08:00",
|
|
40
|
+
"endDateTime": "2025-01-15T11:00:00-08:00",
|
|
41
|
+
"isAllDay": false,
|
|
42
|
+
"location": "optional location",
|
|
43
|
+
"description": "optional description",
|
|
44
|
+
"attendees": ["email@example.com"]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
For all-day events, use date format without time:
|
|
48
|
+
{
|
|
49
|
+
"title": "Vacation",
|
|
50
|
+
"startDateTime": "2025-01-15",
|
|
51
|
+
"endDateTime": "2025-01-16",
|
|
52
|
+
"isAllDay": true
|
|
53
|
+
}`;
|
|
54
|
+
|
|
55
|
+
log(`OpenAI API request: Parsing event`, "debug");
|
|
56
|
+
|
|
57
|
+
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
58
|
+
method: "POST",
|
|
59
|
+
headers: {
|
|
60
|
+
Authorization: `Bearer ${openaiKey}`,
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify({
|
|
64
|
+
model: "gpt-4o-mini",
|
|
65
|
+
messages: [
|
|
66
|
+
{ role: "system", content: systemPrompt },
|
|
67
|
+
{ role: "user", content: text },
|
|
68
|
+
],
|
|
69
|
+
temperature: 0,
|
|
70
|
+
response_format: { type: "json_object" },
|
|
71
|
+
}),
|
|
72
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
log(`OpenAI API response: ${response.status}`, "debug");
|
|
76
|
+
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
const error = await response.json().catch(() => ({}));
|
|
79
|
+
throw new Error(error.error?.message || `OpenAI API error: ${response.status}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const data = await response.json();
|
|
83
|
+
const content = data.choices?.[0]?.message?.content;
|
|
84
|
+
|
|
85
|
+
if (!content) {
|
|
86
|
+
throw new Error("Failed to parse event from AI response");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(content) as ParsedEvent;
|
|
91
|
+
|
|
92
|
+
// Validate required fields
|
|
93
|
+
if (!parsed.title || !parsed.startDateTime || !parsed.endDateTime) {
|
|
94
|
+
throw new Error("AI response missing required fields");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return parsed;
|
|
98
|
+
} catch (e) {
|
|
99
|
+
throw new Error(`Failed to parse AI response: ${e instanceof Error ? e.message : "Invalid JSON"}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// List calendars
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { CALENDAR_API_BASE, REQUEST_TIMEOUT_MS } from "./config";
|
|
2
|
+
import { log } from "./logger";
|
|
3
|
+
import type { Calendar, CalendarEvent, CalendarListResponse, EventsListResponse } from "./types";
|
|
4
|
+
|
|
5
|
+
export async function calendarRequest<T>(
|
|
6
|
+
endpoint: string,
|
|
7
|
+
accessToken: string,
|
|
8
|
+
options: RequestInit = {}
|
|
9
|
+
): Promise<T> {
|
|
10
|
+
const url = `${CALENDAR_API_BASE}${endpoint}`;
|
|
11
|
+
|
|
12
|
+
log(`Calendar API request: ${options.method || "GET"} ${endpoint}`, "debug");
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const response = await fetch(url, {
|
|
16
|
+
...options,
|
|
17
|
+
headers: {
|
|
18
|
+
Authorization: `Bearer ${accessToken}`,
|
|
19
|
+
Accept: "application/json",
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
...options.headers,
|
|
22
|
+
},
|
|
23
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
log(`Calendar API response: ${response.status}`, "debug");
|
|
27
|
+
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
const error = await response.json().catch(() => ({}));
|
|
30
|
+
if (response.status === 401) {
|
|
31
|
+
log("Error: Google Calendar access token expired or invalid.", "error");
|
|
32
|
+
console.error("Please reconnect your Google Calendar in the Connectors dashboard.");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
throw new Error(error.error?.message || `Calendar API error: ${response.status}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Handle empty responses
|
|
39
|
+
if (response.status === 204) {
|
|
40
|
+
return {} as T;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return response.json();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (error instanceof Error && error.name === "TimeoutError") {
|
|
46
|
+
throw new Error(`Calendar API request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`);
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Parse natural language event using OpenAI
|
|
53
|
+
|
|
54
|
+
export async function listCalendars(accessToken: string): Promise<Calendar[]> {
|
|
55
|
+
const response = await calendarRequest<CalendarListResponse>(
|
|
56
|
+
"/users/me/calendarList",
|
|
57
|
+
accessToken
|
|
58
|
+
);
|
|
59
|
+
return response.items || [];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// List events
|
|
63
|
+
export async function listEvents(
|
|
64
|
+
accessToken: string,
|
|
65
|
+
options: {
|
|
66
|
+
calendarId: string;
|
|
67
|
+
timeMin?: string;
|
|
68
|
+
timeMax?: string;
|
|
69
|
+
maxResults?: number;
|
|
70
|
+
pageToken?: string;
|
|
71
|
+
}
|
|
72
|
+
): Promise<EventsListResponse> {
|
|
73
|
+
const params = new URLSearchParams();
|
|
74
|
+
|
|
75
|
+
if (options.timeMin) {
|
|
76
|
+
params.set("timeMin", options.timeMin);
|
|
77
|
+
}
|
|
78
|
+
if (options.timeMax) {
|
|
79
|
+
params.set("timeMax", options.timeMax);
|
|
80
|
+
}
|
|
81
|
+
if (options.maxResults) {
|
|
82
|
+
params.set("maxResults", options.maxResults.toString());
|
|
83
|
+
}
|
|
84
|
+
if (options.pageToken) {
|
|
85
|
+
params.set("pageToken", options.pageToken);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
params.set("singleEvents", "true");
|
|
89
|
+
params.set("orderBy", "startTime");
|
|
90
|
+
|
|
91
|
+
return calendarRequest(
|
|
92
|
+
`/calendars/${encodeURIComponent(options.calendarId)}/events?${params.toString()}`,
|
|
93
|
+
accessToken
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Get single event
|
|
98
|
+
export async function getEvent(
|
|
99
|
+
accessToken: string,
|
|
100
|
+
calendarId: string,
|
|
101
|
+
eventId: string
|
|
102
|
+
): Promise<CalendarEvent> {
|
|
103
|
+
return calendarRequest(
|
|
104
|
+
`/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
|
|
105
|
+
accessToken
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Create event
|
|
110
|
+
export async function createEvent(
|
|
111
|
+
accessToken: string,
|
|
112
|
+
calendarId: string,
|
|
113
|
+
event: Partial<CalendarEvent>
|
|
114
|
+
): Promise<CalendarEvent> {
|
|
115
|
+
return calendarRequest(
|
|
116
|
+
`/calendars/${encodeURIComponent(calendarId)}/events`,
|
|
117
|
+
accessToken,
|
|
118
|
+
{
|
|
119
|
+
method: "POST",
|
|
120
|
+
body: JSON.stringify(event),
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Update event
|
|
126
|
+
export async function updateEvent(
|
|
127
|
+
accessToken: string,
|
|
128
|
+
calendarId: string,
|
|
129
|
+
eventId: string,
|
|
130
|
+
updates: Partial<CalendarEvent>
|
|
131
|
+
): Promise<CalendarEvent> {
|
|
132
|
+
return calendarRequest(
|
|
133
|
+
`/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
|
|
134
|
+
accessToken,
|
|
135
|
+
{
|
|
136
|
+
method: "PATCH",
|
|
137
|
+
body: JSON.stringify(updates),
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Delete event
|
|
143
|
+
export async function deleteEvent(
|
|
144
|
+
accessToken: string,
|
|
145
|
+
calendarId: string,
|
|
146
|
+
eventId: string
|
|
147
|
+
): Promise<void> {
|
|
148
|
+
await calendarRequest(
|
|
149
|
+
`/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
|
|
150
|
+
accessToken,
|
|
151
|
+
{
|
|
152
|
+
method: "DELETE",
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Format date for display
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { log } from "./logger";
|
|
2
|
+
|
|
3
|
+
export function getAccessToken(): string {
|
|
4
|
+
const token = process.env.GOOGLE_CALENDAR_ACCESS_TOKEN;
|
|
5
|
+
if (!token) {
|
|
6
|
+
log("Error: Google Calendar not connected.", "error");
|
|
7
|
+
console.error("");
|
|
8
|
+
console.error("To use this skill, you need to connect your Google Calendar:");
|
|
9
|
+
console.error("1. Go to https://skills.md/dashboard/connectors");
|
|
10
|
+
console.error("2. Click 'Connect' on the Google Calendar connector");
|
|
11
|
+
console.error("3. Authorize access to your Google Calendar");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
return token;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Get OpenAI API key
|
|
18
|
+
export function getOpenAIKey(): string | null {
|
|
19
|
+
return process.env.OPENAI_API_KEY || null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Make authenticated Calendar API request
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Calendar, CalendarEvent } from "./types";
|
|
2
|
+
|
|
3
|
+
export function formatDate(dateStr: string): string {
|
|
4
|
+
const date = new Date(dateStr);
|
|
5
|
+
return date.toLocaleDateString("en-US", {
|
|
6
|
+
weekday: "short",
|
|
7
|
+
month: "short",
|
|
8
|
+
day: "numeric",
|
|
9
|
+
year: "numeric",
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Format time for display
|
|
14
|
+
export function formatTime(dateStr: string): string {
|
|
15
|
+
const date = new Date(dateStr);
|
|
16
|
+
return date.toLocaleTimeString("en-US", {
|
|
17
|
+
hour: "2-digit",
|
|
18
|
+
minute: "2-digit",
|
|
19
|
+
hour12: true,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Format events for text output
|
|
24
|
+
export function formatEventsText(events: CalendarEvent[]): string {
|
|
25
|
+
if (events.length === 0) {
|
|
26
|
+
return "No upcoming events found.";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const lines: string[] = [];
|
|
30
|
+
let currentDate = "";
|
|
31
|
+
|
|
32
|
+
for (const event of events) {
|
|
33
|
+
const startDate = event.start.dateTime || event.start.date || "";
|
|
34
|
+
const eventDate = formatDate(startDate);
|
|
35
|
+
|
|
36
|
+
if (eventDate !== currentDate) {
|
|
37
|
+
if (currentDate !== "") lines.push("");
|
|
38
|
+
lines.push(eventDate);
|
|
39
|
+
currentDate = eventDate;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const isAllDay = !event.start.dateTime;
|
|
43
|
+
if (isAllDay) {
|
|
44
|
+
lines.push(` All Day ${event.summary || "(No title)"}`);
|
|
45
|
+
} else {
|
|
46
|
+
const startTime = formatTime(event.start.dateTime!);
|
|
47
|
+
const endTime = formatTime(event.end.dateTime!);
|
|
48
|
+
lines.push(` ${startTime} - ${endTime} ${event.summary || "(No title)"}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (event.location) {
|
|
52
|
+
lines.push(` Location: ${event.location}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
lines.push(` ID: ${event.id}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return lines.join("\n");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Format calendars for text output
|
|
62
|
+
export function formatCalendarsText(calendars: Calendar[]): string {
|
|
63
|
+
const lines = ["Your Calendars", "==============", ""];
|
|
64
|
+
|
|
65
|
+
for (const cal of calendars) {
|
|
66
|
+
const primary = cal.primary ? " (primary)" : "";
|
|
67
|
+
lines.push(`${cal.summary}${primary}`);
|
|
68
|
+
lines.push(` ID: ${cal.id}`);
|
|
69
|
+
if (cal.description) {
|
|
70
|
+
lines.push(` Description: ${cal.description}`);
|
|
71
|
+
}
|
|
72
|
+
lines.push("");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return lines.join("\n");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Parse attendees from comma-separated string
|
|
79
|
+
export function parseAttendees(input: string): Array<{ email: string }> {
|
|
80
|
+
return input
|
|
81
|
+
.split(",")
|
|
82
|
+
.map((email) => email.trim())
|
|
83
|
+
.filter(Boolean)
|
|
84
|
+
.map((email) => ({ email }));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Parse reminder minutes from comma-separated string
|
|
88
|
+
export function parseReminders(input: string): Array<{ method: string; minutes: number }> {
|
|
89
|
+
return input
|
|
90
|
+
.split(",")
|
|
91
|
+
.map((m) => parseInt(m.trim(), 10))
|
|
92
|
+
.filter((m) => !isNaN(m))
|
|
93
|
+
.map((minutes) => ({ method: "popup", minutes }));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Show help
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function showHelp(): void {
|
|
2
|
+
console.log(`
|
|
3
|
+
Calendar Events - Manage Google Calendar events
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
skills run calendar-events -- <command> [options]
|
|
7
|
+
|
|
8
|
+
Commands:
|
|
9
|
+
list List upcoming events
|
|
10
|
+
create Create a new event with explicit options
|
|
11
|
+
add <text> Create event from natural language (AI-powered)
|
|
12
|
+
update Update an existing event
|
|
13
|
+
delete Delete an event
|
|
14
|
+
get Get details of a specific event
|
|
15
|
+
calendars List available calendars
|
|
16
|
+
|
|
17
|
+
Options:
|
|
18
|
+
--days <n> Days to look ahead (for list) [default: 14]
|
|
19
|
+
--max <n> Maximum events to return [default: 50]
|
|
20
|
+
--calendar <id> Calendar ID [default: primary]
|
|
21
|
+
--id <event-id> Event ID (for get/update/delete)
|
|
22
|
+
--title <text> Event title
|
|
23
|
+
--start <datetime> Start time (ISO 8601: "2025-01-15T10:00:00")
|
|
24
|
+
--end <datetime> End time (ISO 8601: "2025-01-15T11:00:00")
|
|
25
|
+
--duration <mins> Duration in minutes (alternative to --end)
|
|
26
|
+
--date <date> Date for all-day event (YYYY-MM-DD)
|
|
27
|
+
--all-day Create as all-day event
|
|
28
|
+
--location <text> Event location
|
|
29
|
+
--description <text> Event description
|
|
30
|
+
--attendees <emails> Comma-separated attendee emails (create/update)
|
|
31
|
+
--reminder <mins> Reminder minutes (comma-separated, e.g., 10,30)
|
|
32
|
+
--format <format> Output format: text or json [default: text]
|
|
33
|
+
--help, -h Show this help
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
# List events for next 7 days
|
|
37
|
+
skills run calendar-events -- list --days 7
|
|
38
|
+
|
|
39
|
+
# Create an event with explicit options
|
|
40
|
+
skills run calendar-events -- create --title "Meeting" --start "2025-01-15T10:00:00" --end "2025-01-15T11:00:00"
|
|
41
|
+
|
|
42
|
+
# Create an event using natural language (AI-powered)
|
|
43
|
+
skills run calendar-events -- add "Team standup next Monday at 9am for 30 minutes"
|
|
44
|
+
skills run calendar-events -- add "Lunch with Sarah tomorrow at noon at Cafe Milano"
|
|
45
|
+
skills run calendar-events -- add "Vacation Dec 25-27"
|
|
46
|
+
|
|
47
|
+
# Delete an event
|
|
48
|
+
skills run calendar-events -- delete --id abc123
|
|
49
|
+
|
|
50
|
+
Note: The 'add' command requires OPENAI_API_KEY for natural language parsing.
|
|
51
|
+
`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Main function
|