@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
package/skills/e2bswarm/SKILL.md
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: e2bswarm
|
|
3
|
-
description: Spawn and manage E2B sandbox instances for parallel Claude Code task execution. Use when you need to run multiple tasks in parallel across isolated environments, distribute work across sandboxes, or execute tasks in clean environments.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
allowed-tools: Bash(bun:*), Bash(e2b:*), Read, Write
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# E2B Swarm
|
|
9
|
-
|
|
10
|
-
Spawn E2B sandbox instances in parallel to execute Claude Code tasks across isolated environments.
|
|
11
|
-
|
|
12
|
-
## Installation
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
cd ~/.claude/skills/e2bswarm && bun install
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Or link from the repo:
|
|
19
|
-
```bash
|
|
20
|
-
ln -s ~/Workspace/dev/hasnaxyz/skill/skilldev/e2bswarm ~/.claude/skills/e2bswarm
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Commands
|
|
24
|
-
|
|
25
|
-
### Spawn instances with tasks
|
|
26
|
-
|
|
27
|
-
From a task list ID (loads from ~/.claude/tasks/<id>/):
|
|
28
|
-
```bash
|
|
29
|
-
e2bswarm spawn \
|
|
30
|
-
--repo <github-url> \
|
|
31
|
-
--tasks <task-list-id> \
|
|
32
|
-
--instances <count>
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
From a local folder containing task JSON files:
|
|
36
|
-
```bash
|
|
37
|
-
e2bswarm spawn \
|
|
38
|
-
--repo <github-url> \
|
|
39
|
-
--tasks-dir ./my-tasks/ \
|
|
40
|
-
--instances <count>
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
From inline JSON:
|
|
44
|
-
```bash
|
|
45
|
-
e2bswarm spawn \
|
|
46
|
-
--repo <github-url> \
|
|
47
|
-
--tasks-json '[{"id":"1","subject":"Task 1","description":"Do something"}]' \
|
|
48
|
-
--instances <count>
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
From a JSON file:
|
|
52
|
-
```bash
|
|
53
|
-
e2bswarm spawn \
|
|
54
|
-
--repo <github-url> \
|
|
55
|
-
--tasks-file ./tasks.json \
|
|
56
|
-
--instances <count>
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Check status
|
|
60
|
-
```bash
|
|
61
|
-
e2bswarm status
|
|
62
|
-
e2bswarm status --instance <id>
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Collect results
|
|
66
|
-
```bash
|
|
67
|
-
e2bswarm collect --output ./results
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Kill instances
|
|
71
|
-
```bash
|
|
72
|
-
e2bswarm kill # Kill all
|
|
73
|
-
e2bswarm kill --instance <id> # Kill specific
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Options
|
|
77
|
-
|
|
78
|
-
| Option | Description |
|
|
79
|
-
|--------|-------------|
|
|
80
|
-
| `--repo, -r` | Git repository URL (required) |
|
|
81
|
-
| `--tasks, -t` | Task list ID from ~/.claude/tasks/ |
|
|
82
|
-
| `--tasks-dir` | Local folder containing task JSON files |
|
|
83
|
-
| `--tasks-file` | Path to a JSON file with tasks array |
|
|
84
|
-
| `--tasks-json` | Inline JSON array of tasks |
|
|
85
|
-
| `--instances, -n` | Number of parallel instances (default: 1) |
|
|
86
|
-
| `--prompt, -p` | Additional context/instructions for Claude |
|
|
87
|
-
| `--branch, -b` | Git branch to clone |
|
|
88
|
-
| `--distribute, -d` | Task distribution mode: all, round-robin, by-dependency |
|
|
89
|
-
|
|
90
|
-
## Task Distribution Modes
|
|
91
|
-
|
|
92
|
-
- **all**: Each instance receives all tasks (default)
|
|
93
|
-
- **round-robin**: Tasks distributed evenly across instances
|
|
94
|
-
- **by-dependency**: Tasks grouped by dependency chains
|
|
95
|
-
|
|
96
|
-
## Environment Variables
|
|
97
|
-
|
|
98
|
-
- `E2B_API_KEY`: Your E2B API key (required, add to ~/.secrets)
|
|
99
|
-
|
|
100
|
-
## Examples
|
|
101
|
-
|
|
102
|
-
Spawn 4 instances to work on videoben tasks in parallel:
|
|
103
|
-
```bash
|
|
104
|
-
e2bswarm spawn \
|
|
105
|
-
--repo git@github.com:hasnastudio/iapp-videoben.git \
|
|
106
|
-
--tasks iapp-videoben-dev \
|
|
107
|
-
--instances 4 \
|
|
108
|
-
--distribute round-robin \
|
|
109
|
-
--prompt "Complete all assigned tasks, run tests before marking complete"
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Run tasks from a local JSON file:
|
|
113
|
-
```bash
|
|
114
|
-
e2bswarm spawn \
|
|
115
|
-
--repo git@github.com:org/repo.git \
|
|
116
|
-
--tasks-file ./sprint-tasks.json \
|
|
117
|
-
--instances 2
|
|
118
|
-
```
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "1",
|
|
4
|
-
"subject": "Setup project structure",
|
|
5
|
-
"description": "Create the basic project structure with src/, tests/, and config files.\n\n**Files to create:**\n- src/index.ts\n- tests/index.test.ts\n- tsconfig.json\n\n**Acceptance criteria:**\n- All files exist\n- TypeScript compiles without errors",
|
|
6
|
-
"activeForm": "Setting up project structure",
|
|
7
|
-
"status": "pending",
|
|
8
|
-
"blocks": ["2", "3"],
|
|
9
|
-
"blockedBy": []
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"id": "2",
|
|
13
|
-
"subject": "Implement core functionality",
|
|
14
|
-
"description": "Implement the main feature in src/index.ts.\n\n**Requirements:**\n- Export a main function\n- Handle errors gracefully\n- Add logging\n\n**Acceptance criteria:**\n- Function works as expected\n- Errors are caught and logged",
|
|
15
|
-
"activeForm": "Implementing core functionality",
|
|
16
|
-
"status": "pending",
|
|
17
|
-
"blocks": ["4"],
|
|
18
|
-
"blockedBy": ["1"]
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": "3",
|
|
22
|
-
"subject": "Write unit tests",
|
|
23
|
-
"description": "Write comprehensive unit tests for the core functionality.\n\n**Test cases:**\n- Happy path\n- Error handling\n- Edge cases\n\n**Acceptance criteria:**\n- All tests pass\n- Coverage > 80%",
|
|
24
|
-
"activeForm": "Writing unit tests",
|
|
25
|
-
"status": "pending",
|
|
26
|
-
"blocks": ["4"],
|
|
27
|
-
"blockedBy": ["1"]
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"id": "4",
|
|
31
|
-
"subject": "Add documentation",
|
|
32
|
-
"description": "Add README and inline documentation.\n\n**Documentation:**\n- README.md with usage examples\n- JSDoc comments on exported functions\n\n**Acceptance criteria:**\n- README is clear and complete\n- All exports have documentation",
|
|
33
|
-
"activeForm": "Adding documentation",
|
|
34
|
-
"status": "pending",
|
|
35
|
-
"blocks": [],
|
|
36
|
-
"blockedBy": ["2", "3"]
|
|
37
|
-
}
|
|
38
|
-
]
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "e2bswarm",
|
|
3
|
-
"version": "0.4.1",
|
|
4
|
-
"description": "Spawn E2B sandbox instances for parallel Claude Code task execution",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"module": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"bin": {
|
|
10
|
-
"e2bswarm": "./dist/index.js"
|
|
11
|
-
},
|
|
12
|
-
"files": [
|
|
13
|
-
"dist",
|
|
14
|
-
"SKILL.md",
|
|
15
|
-
"README.md",
|
|
16
|
-
"templates",
|
|
17
|
-
"examples"
|
|
18
|
-
],
|
|
19
|
-
"scripts": {
|
|
20
|
-
"start": "bun run src/index.ts",
|
|
21
|
-
"dev": "bun --watch src/index.ts",
|
|
22
|
-
"build": "bun build src/index.ts --outdir dist --target bun --minify && chmod +x dist/index.js",
|
|
23
|
-
"typecheck": "tsc --noEmit",
|
|
24
|
-
"prepublishOnly": "bun run build",
|
|
25
|
-
"link": "ln -sf $(pwd) ~/.claude/skills/e2bswarm",
|
|
26
|
-
"link:global": "bun link"
|
|
27
|
-
},
|
|
28
|
-
"dependencies": {
|
|
29
|
-
"chalk": "^5.3.0",
|
|
30
|
-
"commander": "^12.1.0",
|
|
31
|
-
"e2b": "^1.0.5",
|
|
32
|
-
"ora": "^8.0.1"
|
|
33
|
-
},
|
|
34
|
-
"devDependencies": {
|
|
35
|
-
"@types/bun": "latest",
|
|
36
|
-
"typescript": "^5.7.0"
|
|
37
|
-
},
|
|
38
|
-
"keywords": [
|
|
39
|
-
"e2b",
|
|
40
|
-
"claude-code",
|
|
41
|
-
"claude",
|
|
42
|
-
"sandbox",
|
|
43
|
-
"parallel-execution",
|
|
44
|
-
"task-runner",
|
|
45
|
-
"ai-agent",
|
|
46
|
-
"swarm"
|
|
47
|
-
],
|
|
48
|
-
"homepage": "https://github.com/hasnaxyz/e2bswarm#readme",
|
|
49
|
-
"bugs": {
|
|
50
|
-
"url": "https://github.com/hasnaxyz/e2bswarm/issues"
|
|
51
|
-
},
|
|
52
|
-
"engines": {
|
|
53
|
-
"node": ">=18.0.0"
|
|
54
|
-
},
|
|
55
|
-
"private": false,
|
|
56
|
-
"publishConfig": {
|
|
57
|
-
"access": "restricted"
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { mkdir } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { E2BSwarm } from '../lib/e2b';
|
|
5
|
-
import { loadConfig, loadState } from '../lib/config';
|
|
6
|
-
import { logger } from '../lib/logger';
|
|
7
|
-
import { paths } from '../lib/paths';
|
|
8
|
-
import type { CollectOptions } from '../types';
|
|
9
|
-
|
|
10
|
-
export async function collect(options: CollectOptions) {
|
|
11
|
-
const spinner = ora('Loading state...').start();
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
const config = await loadConfig();
|
|
15
|
-
const state = await loadState();
|
|
16
|
-
|
|
17
|
-
if (state.instances.length === 0) {
|
|
18
|
-
spinner.fail('No instances found');
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const swarm = new E2BSwarm(config);
|
|
23
|
-
|
|
24
|
-
// Filter instances
|
|
25
|
-
const instances = options.instance
|
|
26
|
-
? state.instances.filter(i => i.id.startsWith(options.instance!))
|
|
27
|
-
: state.instances.filter(i => i.status === 'completed' || i.status === 'running');
|
|
28
|
-
|
|
29
|
-
if (instances.length === 0) {
|
|
30
|
-
spinner.fail('No completed instances to collect from');
|
|
31
|
-
logger.info('Use `e2bswarm status` to check instance status');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
spinner.text = `Found ${instances.length} instances to collect from`;
|
|
36
|
-
|
|
37
|
-
// Use provided output dir or default to skill exports directory
|
|
38
|
-
const outputDir = options.output || paths.getExportDir('collect');
|
|
39
|
-
await mkdir(outputDir, { recursive: true });
|
|
40
|
-
spinner.succeed(`Output directory: ${outputDir}`);
|
|
41
|
-
|
|
42
|
-
logger.header('Collecting Results');
|
|
43
|
-
|
|
44
|
-
const results: Array<{
|
|
45
|
-
instanceId: string;
|
|
46
|
-
status: string;
|
|
47
|
-
tasks: number;
|
|
48
|
-
completed: number;
|
|
49
|
-
outputFile: string;
|
|
50
|
-
}> = [];
|
|
51
|
-
|
|
52
|
-
for (const instance of instances) {
|
|
53
|
-
const shortId = instance.id.slice(0, 8);
|
|
54
|
-
spinner.start(`[${shortId}] Collecting...`);
|
|
55
|
-
|
|
56
|
-
try {
|
|
57
|
-
if (instance.status === 'running') {
|
|
58
|
-
// Update status first
|
|
59
|
-
const updated = await swarm.checkInstance(instance);
|
|
60
|
-
Object.assign(instance, updated);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (instance.sandboxId) {
|
|
64
|
-
const collected = await swarm.collectResults(instance);
|
|
65
|
-
|
|
66
|
-
// Write results to file
|
|
67
|
-
const outputFile = join(outputDir, `${shortId}-results.json`);
|
|
68
|
-
const resultData = {
|
|
69
|
-
instanceId: instance.id,
|
|
70
|
-
sandboxId: instance.sandboxId,
|
|
71
|
-
template: instance.template,
|
|
72
|
-
source: instance.source,
|
|
73
|
-
sourceType: instance.sourceType,
|
|
74
|
-
status: instance.status,
|
|
75
|
-
startedAt: instance.startedAt,
|
|
76
|
-
completedAt: instance.completedAt,
|
|
77
|
-
duration: instance.completedAt
|
|
78
|
-
? new Date(instance.completedAt).getTime() - new Date(instance.startedAt).getTime()
|
|
79
|
-
: null,
|
|
80
|
-
tasks: collected.tasks,
|
|
81
|
-
output: collected.output,
|
|
82
|
-
logs: collected.logs,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
await Bun.write(outputFile, JSON.stringify(resultData, null, 2));
|
|
86
|
-
|
|
87
|
-
// Also copy to instance export dir if it exists
|
|
88
|
-
if (instance.exportDir) {
|
|
89
|
-
await mkdir(instance.exportDir, { recursive: true });
|
|
90
|
-
await Bun.write(join(instance.exportDir, 'results.json'), JSON.stringify(resultData, null, 2));
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const completedTasks = collected.tasks.filter(t => t.status === 'completed').length;
|
|
94
|
-
results.push({
|
|
95
|
-
instanceId: shortId,
|
|
96
|
-
status: instance.status,
|
|
97
|
-
tasks: collected.tasks.length,
|
|
98
|
-
completed: completedTasks,
|
|
99
|
-
outputFile,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
spinner.succeed(`[${shortId}] Collected ${completedTasks}/${collected.tasks.length} tasks`);
|
|
103
|
-
} else {
|
|
104
|
-
spinner.warn(`[${shortId}] No sandbox ID, skipping`);
|
|
105
|
-
}
|
|
106
|
-
} catch (error) {
|
|
107
|
-
spinner.warn(`[${shortId}] Failed: ${error instanceof Error ? error.message : error}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Write summary
|
|
112
|
-
const summaryFile = join(outputDir, 'summary.json');
|
|
113
|
-
const summary = {
|
|
114
|
-
collectedAt: new Date().toISOString(),
|
|
115
|
-
outputDir,
|
|
116
|
-
totalInstances: results.length,
|
|
117
|
-
totalTasks: results.reduce((sum, r) => sum + r.tasks, 0),
|
|
118
|
-
completedTasks: results.reduce((sum, r) => sum + r.completed, 0),
|
|
119
|
-
instances: results,
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
await Bun.write(summaryFile, JSON.stringify(summary, null, 2));
|
|
123
|
-
|
|
124
|
-
logger.header('Summary');
|
|
125
|
-
logger.info(`Instances collected: ${results.length}`);
|
|
126
|
-
logger.info(`Total tasks: ${summary.totalTasks}`);
|
|
127
|
-
logger.info(`Completed tasks: ${summary.completedTasks}`);
|
|
128
|
-
logger.info(`Results saved to: ${outputDir}`);
|
|
129
|
-
|
|
130
|
-
} catch (error) {
|
|
131
|
-
spinner.fail('Failed');
|
|
132
|
-
logger.error(error instanceof Error ? error.message : String(error));
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { mkdir, writeFile, readFile } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { logger } from '../lib/logger';
|
|
5
|
-
|
|
6
|
-
type Platform = 'claude' | 'codex';
|
|
7
|
-
|
|
8
|
-
function getSkillsDir(platform: Platform, local: boolean): string {
|
|
9
|
-
if (local) {
|
|
10
|
-
return platform === 'claude' ? '.claude/skills' : '.codex/skills';
|
|
11
|
-
}
|
|
12
|
-
const home = homedir();
|
|
13
|
-
return platform === 'claude'
|
|
14
|
-
? join(home, '.claude', 'skills')
|
|
15
|
-
: join(home, '.codex', 'skills');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async function ensureDir(dir: string): Promise<void> {
|
|
19
|
-
await mkdir(dir, { recursive: true });
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async function getSkillMdContent(): Promise<string> {
|
|
23
|
-
// Try to read from the package's SKILL.md first
|
|
24
|
-
const possiblePaths = [
|
|
25
|
-
join(__dirname, '..', '..', 'SKILL.md'),
|
|
26
|
-
join(__dirname, '..', '..', '..', 'SKILL.md'),
|
|
27
|
-
join(process.cwd(), 'SKILL.md'),
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
for (const path of possiblePaths) {
|
|
31
|
-
try {
|
|
32
|
-
return await readFile(path, 'utf-8');
|
|
33
|
-
} catch {
|
|
34
|
-
// Try next path
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Fallback to embedded content
|
|
39
|
-
return `---
|
|
40
|
-
name: e2bswarm
|
|
41
|
-
description: Spawn and manage E2B sandbox instances for parallel Claude Code task execution. Use when you need to run multiple tasks in parallel across isolated environments, distribute work across sandboxes, or execute tasks in clean environments.
|
|
42
|
-
disable-model-invocation: true
|
|
43
|
-
allowed-tools: Bash(bun:*), Bash(e2b:*), Read, Write
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
# E2B Swarm
|
|
47
|
-
|
|
48
|
-
Spawn E2B sandbox instances in parallel to execute Claude Code tasks across isolated environments.
|
|
49
|
-
|
|
50
|
-
## CLI Usage
|
|
51
|
-
|
|
52
|
-
\`\`\`bash
|
|
53
|
-
# Spawn instances with tasks from a task list
|
|
54
|
-
e2bswarm spawn --repo <github-url> --tasks <task-list-id> --instances <count>
|
|
55
|
-
|
|
56
|
-
# Spawn from a local directory
|
|
57
|
-
e2bswarm spawn --local ./my-project --tasks <task-list-id> --instances 3
|
|
58
|
-
|
|
59
|
-
# Check status
|
|
60
|
-
e2bswarm status
|
|
61
|
-
|
|
62
|
-
# Collect results
|
|
63
|
-
e2bswarm collect --output ./results
|
|
64
|
-
|
|
65
|
-
# Kill instances
|
|
66
|
-
e2bswarm kill
|
|
67
|
-
\`\`\`
|
|
68
|
-
|
|
69
|
-
## Commands
|
|
70
|
-
|
|
71
|
-
| Command | Description |
|
|
72
|
-
|---------|-------------|
|
|
73
|
-
| \`spawn\` | Spawn E2B instances with tasks |
|
|
74
|
-
| \`status\` | Check instance status |
|
|
75
|
-
| \`collect\` | Collect results from instances |
|
|
76
|
-
| \`kill\` | Kill running instances |
|
|
77
|
-
| \`sync\` | Sync changes back to GitHub |
|
|
78
|
-
| \`clean\` | Clean up state file |
|
|
79
|
-
| \`info\` | Show skill data directory paths |
|
|
80
|
-
|
|
81
|
-
## Options (spawn)
|
|
82
|
-
|
|
83
|
-
| Option | Description |
|
|
84
|
-
|--------|-------------|
|
|
85
|
-
| \`-r, --repo <url>\` | Git repository URL to clone |
|
|
86
|
-
| \`-l, --local <path>\` | Local directory to upload |
|
|
87
|
-
| \`-t, --tasks <id>\` | Task list ID from ~/.claude/tasks/ |
|
|
88
|
-
| \`-n, --instances <count>\` | Number of parallel instances |
|
|
89
|
-
| \`-d, --distribute <mode>\` | Distribution: all, round-robin, by-dependency |
|
|
90
|
-
| \`--auto-commit\` | Auto commit changes |
|
|
91
|
-
| \`--auto-push\` | Auto push changes |
|
|
92
|
-
| \`--create-pr\` | Create pull request |
|
|
93
|
-
|
|
94
|
-
## Data Directories
|
|
95
|
-
|
|
96
|
-
- **exports/** - Collected results and artifacts
|
|
97
|
-
- **logs/** - Execution logs
|
|
98
|
-
- **cache/** - Temporary data
|
|
99
|
-
- **config/** - Skill configuration
|
|
100
|
-
|
|
101
|
-
## Requirements
|
|
102
|
-
|
|
103
|
-
- \`E2B_API_KEY\` in \`~/.secrets\` - Required for E2B sandboxes
|
|
104
|
-
- Bun runtime with \`e2bswarm\` installed globally
|
|
105
|
-
|
|
106
|
-
## Install CLI
|
|
107
|
-
|
|
108
|
-
\`\`\`bash
|
|
109
|
-
bun add -g @hasnaxyz/e2bswarm
|
|
110
|
-
\`\`\`
|
|
111
|
-
`;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export async function install(options: {
|
|
115
|
-
claude?: boolean;
|
|
116
|
-
codex?: boolean;
|
|
117
|
-
local?: boolean;
|
|
118
|
-
}): Promise<void> {
|
|
119
|
-
if (!options.claude && !options.codex) {
|
|
120
|
-
logger.error('Please specify --claude or --codex');
|
|
121
|
-
process.exit(1);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const skillName = 'e2bswarm';
|
|
125
|
-
const platforms: Platform[] = [];
|
|
126
|
-
if (options.claude) platforms.push('claude');
|
|
127
|
-
if (options.codex) platforms.push('codex');
|
|
128
|
-
|
|
129
|
-
const skillMdContent = await getSkillMdContent();
|
|
130
|
-
|
|
131
|
-
for (const platform of platforms) {
|
|
132
|
-
const baseDir = getSkillsDir(platform, options.local || false);
|
|
133
|
-
const skillDir = join(baseDir, skillName);
|
|
134
|
-
|
|
135
|
-
logger.info(`Installing skill to ${platform === 'claude' ? 'Claude Code' : 'Codex'}...`);
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
// Create skill directory structure
|
|
139
|
-
await ensureDir(skillDir);
|
|
140
|
-
await ensureDir(join(skillDir, 'exports'));
|
|
141
|
-
await ensureDir(join(skillDir, 'uploads'));
|
|
142
|
-
await ensureDir(join(skillDir, 'logs'));
|
|
143
|
-
|
|
144
|
-
// Write SKILL.md
|
|
145
|
-
const skillMdPath = join(skillDir, 'SKILL.md');
|
|
146
|
-
await writeFile(skillMdPath, skillMdContent, 'utf-8');
|
|
147
|
-
|
|
148
|
-
logger.success(`Installed to ${skillDir}`);
|
|
149
|
-
|
|
150
|
-
console.log();
|
|
151
|
-
console.log('Created structure:');
|
|
152
|
-
console.log(` ${skillDir}/`);
|
|
153
|
-
console.log(' ├── SKILL.md');
|
|
154
|
-
console.log(' ├── exports/');
|
|
155
|
-
console.log(' ├── uploads/');
|
|
156
|
-
console.log(' └── logs/');
|
|
157
|
-
console.log();
|
|
158
|
-
console.log(`Invoke with: /${skillName}`);
|
|
159
|
-
} catch (error) {
|
|
160
|
-
logger.error(`Install failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
161
|
-
process.exit(1);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import ora from 'ora';
|
|
2
|
-
import { E2BSwarm } from '../lib/e2b';
|
|
3
|
-
import { loadConfig, loadState, saveState } from '../lib/config';
|
|
4
|
-
import { logger } from '../lib/logger';
|
|
5
|
-
import type { KillOptions } from '../types';
|
|
6
|
-
|
|
7
|
-
export async function kill(options: KillOptions) {
|
|
8
|
-
const spinner = ora('Loading state...').start();
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
const config = await loadConfig();
|
|
12
|
-
const state = await loadState();
|
|
13
|
-
|
|
14
|
-
if (state.instances.length === 0) {
|
|
15
|
-
spinner.info('No instances found');
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const swarm = new E2BSwarm(config);
|
|
20
|
-
|
|
21
|
-
// Filter instances to kill
|
|
22
|
-
let instances = state.instances.filter(
|
|
23
|
-
i => i.status === 'running' || i.status === 'starting' || i.status === 'setting-up' || i.status === 'cloning'
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
if (options.instance) {
|
|
27
|
-
instances = instances.filter(i => i.id.startsWith(options.instance!));
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (instances.length === 0) {
|
|
31
|
-
spinner.info('No running instances to kill');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
spinner.succeed(`Found ${instances.length} instances to kill`);
|
|
36
|
-
|
|
37
|
-
logger.header('Killing Instances');
|
|
38
|
-
|
|
39
|
-
for (const instance of instances) {
|
|
40
|
-
const shortId = instance.id.slice(0, 8);
|
|
41
|
-
spinner.start(`[${shortId}] Killing...`);
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
await swarm.kill(instance);
|
|
45
|
-
spinner.succeed(`[${shortId}] Killed`);
|
|
46
|
-
} catch (error) {
|
|
47
|
-
spinner.warn(`[${shortId}] Failed: ${error instanceof Error ? error.message : error}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Update state
|
|
52
|
-
await saveState(state);
|
|
53
|
-
|
|
54
|
-
logger.header('Summary');
|
|
55
|
-
logger.info(`Killed ${instances.length} instances`);
|
|
56
|
-
|
|
57
|
-
} catch (error) {
|
|
58
|
-
spinner.fail('Failed');
|
|
59
|
-
logger.error(error instanceof Error ? error.message : String(error));
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
}
|