@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
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'node:path';
|
|
2
|
-
import ora from 'ora';
|
|
3
|
-
import { E2BSwarm } from '../lib/e2b';
|
|
4
|
-
import { loadTasks, distributeTasks, determineTaskSource, summarizeDistribution } from '../lib/tasks';
|
|
5
|
-
import { loadConfig, loadState, saveState } from '../lib/config';
|
|
6
|
-
import { logger } from '../lib/logger';
|
|
7
|
-
import { paths } from '../lib/paths';
|
|
8
|
-
import type { SpawnOptions, SwarmInstance } from '../types';
|
|
9
|
-
|
|
10
|
-
export async function spawn(options: SpawnOptions) {
|
|
11
|
-
const spinner = ora('Loading configuration...').start();
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
// Validate source options
|
|
15
|
-
if (!options.repo && !options.local) {
|
|
16
|
-
throw new Error(
|
|
17
|
-
'Must specify either --repo <url> or --local <path>\n' +
|
|
18
|
-
' --repo <url> Clone from git repository\n' +
|
|
19
|
-
' --local <path> Upload from local directory'
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (options.repo && options.local) {
|
|
24
|
-
throw new Error('Cannot specify both --repo and --local');
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Determine source type
|
|
28
|
-
const sourceType = options.local ? 'local' : 'repo';
|
|
29
|
-
const source = options.local ? resolve(options.local) : options.repo!;
|
|
30
|
-
|
|
31
|
-
// Load config with template
|
|
32
|
-
const config = await loadConfig(options.template);
|
|
33
|
-
spinner.succeed(`Configuration loaded (template: ${config.template})`);
|
|
34
|
-
|
|
35
|
-
// Determine task source and load tasks
|
|
36
|
-
spinner.start('Loading tasks...');
|
|
37
|
-
const taskSource = determineTaskSource(options);
|
|
38
|
-
const allTasks = await loadTasks(taskSource);
|
|
39
|
-
spinner.succeed(`Loaded ${allTasks.length} tasks from ${taskSource.type}`);
|
|
40
|
-
|
|
41
|
-
// Parse instance count
|
|
42
|
-
const instanceCount = parseInt(options.instances, 10);
|
|
43
|
-
if (isNaN(instanceCount) || instanceCount < 1) {
|
|
44
|
-
throw new Error('Instance count must be a positive number');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (instanceCount > config.maxInstances) {
|
|
48
|
-
throw new Error(`Maximum ${config.maxInstances} instances allowed`);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Distribute tasks
|
|
52
|
-
const distributeMode = options.distribute || 'all';
|
|
53
|
-
const distribution = distributeTasks(allTasks, instanceCount, distributeMode);
|
|
54
|
-
|
|
55
|
-
logger.header('Task Distribution');
|
|
56
|
-
console.log(summarizeDistribution(distribution));
|
|
57
|
-
console.log();
|
|
58
|
-
|
|
59
|
-
// Create swarm manager
|
|
60
|
-
const swarm = new E2BSwarm(config);
|
|
61
|
-
|
|
62
|
-
// Load existing state
|
|
63
|
-
const state = await loadState();
|
|
64
|
-
|
|
65
|
-
logger.header(`Spawning ${instanceCount} Instances`);
|
|
66
|
-
logger.info(`Source: ${source} (${sourceType})`);
|
|
67
|
-
logger.info(`Template: ${config.template}`);
|
|
68
|
-
logger.info(`Data directory: ${paths.skillData}`);
|
|
69
|
-
console.log();
|
|
70
|
-
|
|
71
|
-
// Parse include/exclude patterns
|
|
72
|
-
const include = options.include;
|
|
73
|
-
const exclude = options.exclude;
|
|
74
|
-
|
|
75
|
-
// Spawn instances in parallel
|
|
76
|
-
const spawnPromises = distribution.map(async (tasks, i) => {
|
|
77
|
-
if (tasks.length === 0) {
|
|
78
|
-
logger.warn(`Instance ${i + 1} has no tasks assigned, skipping`);
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const instance = await swarm.spawn({
|
|
83
|
-
source,
|
|
84
|
-
sourceType,
|
|
85
|
-
tasks,
|
|
86
|
-
prompt: options.prompt || `Execute the assigned tasks from the swarm task list.`,
|
|
87
|
-
branch: options.branch,
|
|
88
|
-
newBranch: options.newBranch,
|
|
89
|
-
include,
|
|
90
|
-
exclude,
|
|
91
|
-
// GitHub integration options
|
|
92
|
-
autoCommit: options.autoCommit,
|
|
93
|
-
autoPush: options.autoPush,
|
|
94
|
-
createPr: options.createPr,
|
|
95
|
-
prTitle: options.prTitle,
|
|
96
|
-
prBase: options.prBase,
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
return instance;
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
const instances = (await Promise.all(spawnPromises)).filter(
|
|
103
|
-
(i): i is SwarmInstance => i !== null
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
// Save state
|
|
107
|
-
state.instances.push(...instances);
|
|
108
|
-
await saveState(state);
|
|
109
|
-
|
|
110
|
-
// Summary
|
|
111
|
-
logger.header('Summary');
|
|
112
|
-
|
|
113
|
-
const running = instances.filter(i => i.status === 'running').length;
|
|
114
|
-
const failed = instances.filter(i => i.status === 'failed').length;
|
|
115
|
-
|
|
116
|
-
logger.info(`Total instances: ${instances.length}`);
|
|
117
|
-
logger.info(`Running: ${running}`);
|
|
118
|
-
if (failed > 0) {
|
|
119
|
-
logger.error(`Failed: ${failed}`);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
console.log();
|
|
123
|
-
logger.info(`Exports: ${paths.exports}`);
|
|
124
|
-
logger.info(`Logs: ${paths.logs}`);
|
|
125
|
-
console.log();
|
|
126
|
-
logger.info('Use `e2bswarm status` to check progress');
|
|
127
|
-
logger.info('Use `e2bswarm collect` to gather results');
|
|
128
|
-
|
|
129
|
-
} catch (error) {
|
|
130
|
-
spinner.fail('Failed');
|
|
131
|
-
logger.error(error instanceof Error ? error.message : String(error));
|
|
132
|
-
process.exit(1);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { E2BSwarm } from '../lib/e2b';
|
|
2
|
-
import { loadConfig, loadState, saveState } from '../lib/config';
|
|
3
|
-
import { logger } from '../lib/logger';
|
|
4
|
-
import type { StatusOptions } from '../types';
|
|
5
|
-
|
|
6
|
-
export async function status(options: StatusOptions) {
|
|
7
|
-
try {
|
|
8
|
-
const config = await loadConfig();
|
|
9
|
-
const state = await loadState();
|
|
10
|
-
|
|
11
|
-
if (state.instances.length === 0) {
|
|
12
|
-
logger.info('No instances found. Use `e2b-swarm spawn` to create instances.');
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const swarm = new E2BSwarm(config);
|
|
17
|
-
|
|
18
|
-
logger.header('Instance Status');
|
|
19
|
-
|
|
20
|
-
// Filter to specific instance if requested
|
|
21
|
-
const instances = options.instance
|
|
22
|
-
? state.instances.filter(i => i.id.startsWith(options.instance!))
|
|
23
|
-
: state.instances;
|
|
24
|
-
|
|
25
|
-
if (instances.length === 0) {
|
|
26
|
-
logger.warn(`No instance found matching: ${options.instance}`);
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Check and update status for running instances
|
|
31
|
-
for (const instance of instances) {
|
|
32
|
-
if (instance.status === 'running') {
|
|
33
|
-
const updated = await swarm.checkInstance(instance);
|
|
34
|
-
Object.assign(instance, updated);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Save updated state
|
|
39
|
-
await saveState(state);
|
|
40
|
-
|
|
41
|
-
// Display status
|
|
42
|
-
for (const instance of instances) {
|
|
43
|
-
const shortId = instance.id.slice(0, 8);
|
|
44
|
-
const duration = instance.completedAt
|
|
45
|
-
? formatDuration(new Date(instance.completedAt).getTime() - new Date(instance.startedAt).getTime())
|
|
46
|
-
: formatDuration(Date.now() - new Date(instance.startedAt).getTime());
|
|
47
|
-
|
|
48
|
-
logger.instance(instance.id, instance.status, `${instance.tasks.length} tasks`);
|
|
49
|
-
console.log(` Repo: ${instance.source}`);
|
|
50
|
-
console.log(` Duration: ${duration}`);
|
|
51
|
-
console.log(` Sandbox: ${instance.sandboxId || 'N/A'}`);
|
|
52
|
-
|
|
53
|
-
if (instance.error) {
|
|
54
|
-
console.log(` Error: ${instance.error}`);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
console.log();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Summary
|
|
61
|
-
const summary = {
|
|
62
|
-
total: instances.length,
|
|
63
|
-
starting: instances.filter(i => ['starting', 'cloning', 'setting-up'].includes(i.status)).length,
|
|
64
|
-
running: instances.filter(i => i.status === 'running').length,
|
|
65
|
-
completed: instances.filter(i => i.status === 'completed').length,
|
|
66
|
-
failed: instances.filter(i => i.status === 'failed').length,
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
logger.divider();
|
|
70
|
-
console.log(`Total: ${summary.total} | Running: ${summary.running} | Completed: ${summary.completed} | Failed: ${summary.failed}`);
|
|
71
|
-
|
|
72
|
-
} catch (error) {
|
|
73
|
-
logger.error(error instanceof Error ? error.message : String(error));
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function formatDuration(ms: number): string {
|
|
79
|
-
const seconds = Math.floor(ms / 1000);
|
|
80
|
-
const minutes = Math.floor(seconds / 60);
|
|
81
|
-
const hours = Math.floor(minutes / 60);
|
|
82
|
-
|
|
83
|
-
if (hours > 0) {
|
|
84
|
-
return `${hours}h ${minutes % 60}m`;
|
|
85
|
-
}
|
|
86
|
-
if (minutes > 0) {
|
|
87
|
-
return `${minutes}m ${seconds % 60}s`;
|
|
88
|
-
}
|
|
89
|
-
return `${seconds}s`;
|
|
90
|
-
}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { Sandbox } from 'e2b';
|
|
2
|
-
import ora from 'ora';
|
|
3
|
-
import { loadConfig, loadState, saveState } from '../lib/config';
|
|
4
|
-
import { logger } from '../lib/logger';
|
|
5
|
-
import {
|
|
6
|
-
setupGitHubAuth,
|
|
7
|
-
commitChanges,
|
|
8
|
-
pushChanges,
|
|
9
|
-
createBranch,
|
|
10
|
-
createPullRequest,
|
|
11
|
-
downloadChangedFiles,
|
|
12
|
-
getGitStatus,
|
|
13
|
-
} from '../lib/github';
|
|
14
|
-
import type { SyncOptions, SwarmInstance } from '../types';
|
|
15
|
-
|
|
16
|
-
export async function sync(options: SyncOptions) {
|
|
17
|
-
const spinner = ora('Loading state...').start();
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
const config = await loadConfig();
|
|
21
|
-
const state = await loadState();
|
|
22
|
-
|
|
23
|
-
if (state.instances.length === 0) {
|
|
24
|
-
spinner.fail('No instances found');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Filter instances
|
|
29
|
-
const instances = options.instance
|
|
30
|
-
? state.instances.filter(i => i.id.startsWith(options.instance!))
|
|
31
|
-
: state.instances.filter(i =>
|
|
32
|
-
i.status === 'completed' ||
|
|
33
|
-
i.status === 'running' ||
|
|
34
|
-
i.status === 'committing' ||
|
|
35
|
-
i.status === 'pushing'
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
if (instances.length === 0) {
|
|
39
|
-
spinner.fail('No instances to sync');
|
|
40
|
-
logger.info('Use `e2bswarm status` to check instance status');
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
spinner.succeed(`Found ${instances.length} instances to sync`);
|
|
45
|
-
|
|
46
|
-
for (const instance of instances) {
|
|
47
|
-
await syncInstance(instance, config, options);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Save updated state
|
|
51
|
-
await saveState(state);
|
|
52
|
-
|
|
53
|
-
logger.header('Sync Complete');
|
|
54
|
-
|
|
55
|
-
// Summary
|
|
56
|
-
const committed = instances.filter(i => i.committed).length;
|
|
57
|
-
const pushed = instances.filter(i => i.pushed).length;
|
|
58
|
-
const prs = instances.filter(i => i.prUrl).length;
|
|
59
|
-
|
|
60
|
-
if (committed > 0) logger.info(`Committed: ${committed} instances`);
|
|
61
|
-
if (pushed > 0) logger.info(`Pushed: ${pushed} instances`);
|
|
62
|
-
if (prs > 0) {
|
|
63
|
-
logger.info(`PRs created: ${prs}`);
|
|
64
|
-
for (const instance of instances) {
|
|
65
|
-
if (instance.prUrl) {
|
|
66
|
-
logger.success(` ${instance.prUrl}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
} catch (error) {
|
|
72
|
-
spinner.fail('Failed');
|
|
73
|
-
logger.error(error instanceof Error ? error.message : String(error));
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function syncInstance(
|
|
79
|
-
instance: SwarmInstance,
|
|
80
|
-
config: { apiKey: string; template: string; timeout: number; maxInstances: number },
|
|
81
|
-
options: SyncOptions
|
|
82
|
-
): Promise<void> {
|
|
83
|
-
const shortId = instance.id.slice(0, 8);
|
|
84
|
-
|
|
85
|
-
if (!instance.sandboxId) {
|
|
86
|
-
logger.warn(`[${shortId}] No sandbox ID, skipping`);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (instance.sourceType !== 'repo') {
|
|
91
|
-
logger.warn(`[${shortId}] Not a repo source, skipping GitHub sync`);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
const sandbox = await Sandbox.connect(instance.sandboxId, {
|
|
97
|
-
apiKey: config.apiKey,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// Setup GitHub auth
|
|
101
|
-
await setupGitHubAuth(sandbox);
|
|
102
|
-
|
|
103
|
-
// Get git status
|
|
104
|
-
const gitStatus = await getGitStatus(sandbox);
|
|
105
|
-
logger.instance(instance.id, 'syncing', `Branch: ${gitStatus.branch}`);
|
|
106
|
-
|
|
107
|
-
const hasChanges =
|
|
108
|
-
gitStatus.modified.length > 0 ||
|
|
109
|
-
gitStatus.added.length > 0 ||
|
|
110
|
-
gitStatus.deleted.length > 0;
|
|
111
|
-
|
|
112
|
-
if (!hasChanges) {
|
|
113
|
-
logger.instance(instance.id, 'syncing', 'No changes to sync');
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
logger.instance(instance.id, 'syncing',
|
|
118
|
-
`Changes: ${gitStatus.modified.length} modified, ${gitStatus.added.length} added, ${gitStatus.deleted.length} deleted`
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
// Download changed files to local export dir
|
|
122
|
-
const downloadedFiles = await downloadChangedFiles(sandbox, instance);
|
|
123
|
-
if (downloadedFiles.length > 0) {
|
|
124
|
-
logger.instance(instance.id, 'syncing', `Downloaded ${downloadedFiles.length} files to ${instance.exportDir}/changes`);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Create new branch if specified
|
|
128
|
-
if (instance.newBranch && gitStatus.branch !== instance.newBranch) {
|
|
129
|
-
const branchResult = await createBranch(sandbox, instance.newBranch);
|
|
130
|
-
if (!branchResult.success) {
|
|
131
|
-
logger.error(`[${shortId}] ${branchResult.error}`);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
logger.instance(instance.id, 'syncing', `Created branch: ${instance.newBranch}`);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Commit if requested
|
|
138
|
-
if (options.commit !== false && (options.commit || instance.autoCommit)) {
|
|
139
|
-
instance.status = 'committing';
|
|
140
|
-
const commitMessage = options.message ||
|
|
141
|
-
`chore: automated changes from e2b-swarm\n\nInstance: ${instance.id}\nTasks completed: ${instance.tasks.filter(t => t.status === 'completed').length}/${instance.tasks.length}`;
|
|
142
|
-
|
|
143
|
-
const commitResult = await commitChanges(sandbox, commitMessage);
|
|
144
|
-
if (!commitResult.success) {
|
|
145
|
-
logger.error(`[${shortId}] ${commitResult.error}`);
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
instance.committed = true;
|
|
149
|
-
logger.instance(instance.id, 'committing', 'Changes committed');
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Push if requested
|
|
153
|
-
if (options.push !== false && (options.push || instance.autoPush)) {
|
|
154
|
-
instance.status = 'pushing';
|
|
155
|
-
const pushResult = await pushChanges(sandbox, instance.newBranch);
|
|
156
|
-
if (!pushResult.success) {
|
|
157
|
-
logger.error(`[${shortId}] ${pushResult.error}`);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
instance.pushed = true;
|
|
161
|
-
logger.instance(instance.id, 'pushing', 'Changes pushed');
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Create PR if requested
|
|
165
|
-
if (options.createPr || instance.createPr) {
|
|
166
|
-
instance.status = 'creating-pr';
|
|
167
|
-
const prTitle = options.prTitle || instance.prTitle ||
|
|
168
|
-
`[E2B Swarm] Automated changes - ${shortId}`;
|
|
169
|
-
|
|
170
|
-
const prBody = `## Automated Changes
|
|
171
|
-
|
|
172
|
-
This PR was created by E2B Swarm.
|
|
173
|
-
|
|
174
|
-
**Instance ID:** ${instance.id}
|
|
175
|
-
**Tasks completed:** ${instance.tasks.filter(t => t.status === 'completed').length}/${instance.tasks.length}
|
|
176
|
-
|
|
177
|
-
### Tasks
|
|
178
|
-
|
|
179
|
-
${instance.tasks.map(t => `- [${t.status === 'completed' ? 'x' : ' '}] ${t.subject}`).join('\n')}
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
🤖 Generated by e2bswarm
|
|
183
|
-
`;
|
|
184
|
-
|
|
185
|
-
const prResult = await createPullRequest(sandbox, {
|
|
186
|
-
title: prTitle,
|
|
187
|
-
body: prBody,
|
|
188
|
-
base: options.prBase || instance.prBase,
|
|
189
|
-
draft: false,
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
if (!prResult.success) {
|
|
193
|
-
logger.error(`[${shortId}] ${prResult.error}`);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
instance.prUrl = prResult.prUrl;
|
|
198
|
-
logger.instance(instance.id, 'creating-pr', `PR created: ${prResult.prUrl}`);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
instance.status = 'completed';
|
|
202
|
-
|
|
203
|
-
} catch (error) {
|
|
204
|
-
logger.error(`[${shortId}] Failed: ${error instanceof Error ? error.message : error}`);
|
|
205
|
-
instance.status = 'failed';
|
|
206
|
-
instance.error = error instanceof Error ? error.message : String(error);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
import { Command } from 'commander';
|
|
3
|
-
import { spawn } from './commands/spawn';
|
|
4
|
-
import { status } from './commands/status';
|
|
5
|
-
import { kill } from './commands/kill';
|
|
6
|
-
import { collect } from './commands/collect';
|
|
7
|
-
import { sync } from './commands/sync';
|
|
8
|
-
import { install } from './commands/install';
|
|
9
|
-
import { paths } from './lib/paths';
|
|
10
|
-
|
|
11
|
-
const program = new Command();
|
|
12
|
-
|
|
13
|
-
program
|
|
14
|
-
.name('e2bswarm')
|
|
15
|
-
.description('Spawn E2B sandbox instances for parallel Claude Code task execution')
|
|
16
|
-
.version('0.4.0');
|
|
17
|
-
|
|
18
|
-
program
|
|
19
|
-
.command('spawn')
|
|
20
|
-
.description('Spawn E2B instances with tasks')
|
|
21
|
-
.option('-r, --repo <url>', 'Git repository URL to clone')
|
|
22
|
-
.option('-l, --local <path>', 'Local directory to upload (alternative to --repo)')
|
|
23
|
-
.option('-t, --tasks <id>', 'Task list ID from ~/.claude/tasks/')
|
|
24
|
-
.option('--tasks-dir <dir>', 'Load tasks from a local directory')
|
|
25
|
-
.option('--tasks-file <file>', 'Load tasks from a JSON file')
|
|
26
|
-
.option('--tasks-json <json>', 'Inline JSON array of tasks')
|
|
27
|
-
.option('-n, --instances <count>', 'Number of parallel instances', '1')
|
|
28
|
-
.option('-p, --prompt <text>', 'Additional prompt/instructions for Claude')
|
|
29
|
-
.option('-b, --branch <name>', 'Git branch to clone (only with --repo)')
|
|
30
|
-
.option('--new-branch <name>', 'Create and switch to new branch before making changes')
|
|
31
|
-
.option('--template <name>', 'E2B template to use', 'hasnaxyz-codebox')
|
|
32
|
-
.option('-d, --distribute <mode>', 'Task distribution: all, round-robin, by-dependency', 'all')
|
|
33
|
-
.option('--include <patterns...>', 'Include only these patterns (for --local)')
|
|
34
|
-
.option('--exclude <patterns...>', 'Exclude these patterns (for --local)')
|
|
35
|
-
// GitHub integration options
|
|
36
|
-
.option('--auto-commit', 'Automatically commit changes when tasks complete')
|
|
37
|
-
.option('--auto-push', 'Automatically push changes (requires --auto-commit)')
|
|
38
|
-
.option('--create-pr', 'Create a pull request after pushing')
|
|
39
|
-
.option('--pr-title <title>', 'Pull request title')
|
|
40
|
-
.option('--pr-base <branch>', 'Base branch for pull request (default: main)')
|
|
41
|
-
.action(spawn);
|
|
42
|
-
|
|
43
|
-
program
|
|
44
|
-
.command('status')
|
|
45
|
-
.description('Check instance status')
|
|
46
|
-
.option('-i, --instance <id>', 'Specific instance ID (prefix match)')
|
|
47
|
-
.option('-w, --watch', 'Watch for status changes')
|
|
48
|
-
.action(status);
|
|
49
|
-
|
|
50
|
-
program
|
|
51
|
-
.command('collect')
|
|
52
|
-
.description('Collect results from instances')
|
|
53
|
-
.option('-o, --output <dir>', 'Output directory (default: ~/.skills/e2bswarm/exports/<timestamp>)')
|
|
54
|
-
.option('-i, --instance <id>', 'Specific instance ID (prefix match)')
|
|
55
|
-
.action(collect);
|
|
56
|
-
|
|
57
|
-
program
|
|
58
|
-
.command('kill')
|
|
59
|
-
.description('Kill running instances')
|
|
60
|
-
.option('-i, --instance <id>', 'Specific instance ID (kills all if not specified)')
|
|
61
|
-
.action(kill);
|
|
62
|
-
|
|
63
|
-
program
|
|
64
|
-
.command('sync')
|
|
65
|
-
.description('Sync changes back to GitHub (commit, push, create PR)')
|
|
66
|
-
.option('-i, --instance <id>', 'Specific instance ID (prefix match)')
|
|
67
|
-
.option('--commit', 'Commit changes')
|
|
68
|
-
.option('--no-commit', 'Skip committing')
|
|
69
|
-
.option('--push', 'Push changes to remote')
|
|
70
|
-
.option('--no-push', 'Skip pushing')
|
|
71
|
-
.option('--create-pr', 'Create a pull request')
|
|
72
|
-
.option('--pr-title <title>', 'Pull request title')
|
|
73
|
-
.option('--pr-base <branch>', 'Base branch for pull request')
|
|
74
|
-
.option('-m, --message <msg>', 'Commit message')
|
|
75
|
-
.action(sync);
|
|
76
|
-
|
|
77
|
-
program
|
|
78
|
-
.command('clean')
|
|
79
|
-
.description('Clean up state file (remove old/completed instances)')
|
|
80
|
-
.action(async () => {
|
|
81
|
-
const { loadState, saveState } = await import('./lib/config');
|
|
82
|
-
const { logger } = await import('./lib/logger');
|
|
83
|
-
|
|
84
|
-
const state = await loadState();
|
|
85
|
-
const before = state.instances.length;
|
|
86
|
-
|
|
87
|
-
// Remove completed and failed instances older than 24 hours
|
|
88
|
-
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
89
|
-
state.instances = state.instances.filter(i => {
|
|
90
|
-
if (i.status === 'running' || i.status === 'starting') return true;
|
|
91
|
-
const completedAt = i.completedAt ? new Date(i.completedAt).getTime() : 0;
|
|
92
|
-
return completedAt > cutoff;
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
await saveState(state);
|
|
96
|
-
logger.success(`Cleaned up ${before - state.instances.length} old instances`);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
program
|
|
100
|
-
.command('info')
|
|
101
|
-
.description('Show skill data directory paths')
|
|
102
|
-
.action(() => {
|
|
103
|
-
console.log('Skill Data Directory Structure:');
|
|
104
|
-
console.log();
|
|
105
|
-
console.log(` Root: ${paths.skillData}`);
|
|
106
|
-
console.log(` Exports: ${paths.exports}`);
|
|
107
|
-
console.log(` Logs: ${paths.logs}`);
|
|
108
|
-
console.log(` Cache: ${paths.cache}`);
|
|
109
|
-
console.log(` Config: ${paths.config}`);
|
|
110
|
-
console.log(` State: ${paths.state}`);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
program
|
|
114
|
-
.command('install')
|
|
115
|
-
.description('Install this skill to Claude Code or Codex')
|
|
116
|
-
.option('--claude', 'Install to Claude Code (~/.claude/skills/)')
|
|
117
|
-
.option('--codex', 'Install to OpenAI Codex (~/.codex/skills/)')
|
|
118
|
-
.option('--local', 'Install to local repo (.claude/skills/ or .codex/skills/)')
|
|
119
|
-
.action(install);
|
|
120
|
-
|
|
121
|
-
program.parse();
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import type { SwarmConfig, SwarmState } from '../types';
|
|
2
|
-
import { paths, ensureSkillDirs } from './paths';
|
|
3
|
-
|
|
4
|
-
const SECRETS_FILE = `${process.env.HOME}/.secrets`;
|
|
5
|
-
|
|
6
|
-
// Default E2B template - set to your custom template or use 'base' for default
|
|
7
|
-
const DEFAULT_TEMPLATE = process.env.E2B_TEMPLATE || 'base';
|
|
8
|
-
|
|
9
|
-
export async function loadConfig(template?: string): Promise<SwarmConfig> {
|
|
10
|
-
// Ensure skill directories exist
|
|
11
|
-
await ensureSkillDirs();
|
|
12
|
-
|
|
13
|
-
// Try to load E2B_API_KEY from environment or ~/.secrets
|
|
14
|
-
let apiKey = process.env.E2B_API_KEY;
|
|
15
|
-
|
|
16
|
-
if (!apiKey) {
|
|
17
|
-
try {
|
|
18
|
-
const secrets = await Bun.file(SECRETS_FILE).text();
|
|
19
|
-
const match = secrets.match(/E2B_API_KEY=["']?([^"'\n]+)["']?/);
|
|
20
|
-
if (match) {
|
|
21
|
-
apiKey = match[1];
|
|
22
|
-
}
|
|
23
|
-
} catch {
|
|
24
|
-
// ~/.secrets doesn't exist
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (!apiKey) {
|
|
29
|
-
throw new Error(
|
|
30
|
-
'E2B_API_KEY not found. Add it to ~/.secrets:\n' +
|
|
31
|
-
' export E2B_API_KEY="your-api-key"\n\n' +
|
|
32
|
-
'Get your API key at: https://e2b.dev/dashboard'
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return {
|
|
37
|
-
apiKey,
|
|
38
|
-
template: template || DEFAULT_TEMPLATE,
|
|
39
|
-
timeout: 30 * 60 * 1000, // 30 minutes
|
|
40
|
-
maxInstances: 10,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function loadState(): Promise<SwarmState> {
|
|
45
|
-
try {
|
|
46
|
-
const content = await Bun.file(paths.state).text();
|
|
47
|
-
return JSON.parse(content);
|
|
48
|
-
} catch {
|
|
49
|
-
return {
|
|
50
|
-
instances: [],
|
|
51
|
-
createdAt: new Date().toISOString(),
|
|
52
|
-
updatedAt: new Date().toISOString(),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export async function saveState(state: SwarmState): Promise<void> {
|
|
58
|
-
state.updatedAt = new Date().toISOString();
|
|
59
|
-
await Bun.write(paths.state, JSON.stringify(state, null, 2));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function getStateFilePath(): string {
|
|
63
|
-
return paths.state;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* List available E2B templates
|
|
68
|
-
* See: https://e2b.dev/docs/sandbox/templates
|
|
69
|
-
*/
|
|
70
|
-
export const E2B_TEMPLATES = {
|
|
71
|
-
// Base templates
|
|
72
|
-
base: 'Default E2B Ubuntu sandbox',
|
|
73
|
-
} as const;
|
|
74
|
-
|
|
75
|
-
export type E2BTemplate = keyof typeof E2B_TEMPLATES | string;
|