@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,490 +0,0 @@
|
|
|
1
|
-
import { Sandbox } from 'e2b';
|
|
2
|
-
import { mkdir, readdir, stat } from 'node:fs/promises';
|
|
3
|
-
import { join, relative } from 'node:path';
|
|
4
|
-
import type { SwarmInstance, SwarmConfig, Task } from '../types';
|
|
5
|
-
import { logger } from './logger';
|
|
6
|
-
import { paths } from './paths';
|
|
7
|
-
|
|
8
|
-
// Default patterns to exclude when uploading local files
|
|
9
|
-
const DEFAULT_EXCLUDE = [
|
|
10
|
-
'node_modules',
|
|
11
|
-
'.git',
|
|
12
|
-
'.next',
|
|
13
|
-
'.turbo',
|
|
14
|
-
'dist',
|
|
15
|
-
'build',
|
|
16
|
-
'.cache',
|
|
17
|
-
'*.log',
|
|
18
|
-
'.DS_Store',
|
|
19
|
-
'.env',
|
|
20
|
-
'.env.local',
|
|
21
|
-
'.env*.local',
|
|
22
|
-
];
|
|
23
|
-
|
|
24
|
-
export class E2BSwarm {
|
|
25
|
-
private config: SwarmConfig;
|
|
26
|
-
|
|
27
|
-
constructor(config: SwarmConfig) {
|
|
28
|
-
this.config = config;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Spawn a new E2B sandbox instance
|
|
33
|
-
*/
|
|
34
|
-
async spawn(options: {
|
|
35
|
-
source: string;
|
|
36
|
-
sourceType: 'repo' | 'local';
|
|
37
|
-
tasks: Task[];
|
|
38
|
-
prompt: string;
|
|
39
|
-
branch?: string;
|
|
40
|
-
newBranch?: string;
|
|
41
|
-
include?: string[];
|
|
42
|
-
exclude?: string[];
|
|
43
|
-
// GitHub options
|
|
44
|
-
autoCommit?: boolean;
|
|
45
|
-
autoPush?: boolean;
|
|
46
|
-
createPr?: boolean;
|
|
47
|
-
prTitle?: string;
|
|
48
|
-
prBase?: string;
|
|
49
|
-
}): Promise<SwarmInstance> {
|
|
50
|
-
const instanceId = crypto.randomUUID();
|
|
51
|
-
const shortId = instanceId.slice(0, 8);
|
|
52
|
-
|
|
53
|
-
// Create instance-specific directories
|
|
54
|
-
const instancePaths = paths.getInstance(shortId);
|
|
55
|
-
await mkdir(instancePaths.exports, { recursive: true });
|
|
56
|
-
await mkdir(instancePaths.logs, { recursive: true });
|
|
57
|
-
|
|
58
|
-
const instance: SwarmInstance = {
|
|
59
|
-
id: instanceId,
|
|
60
|
-
sandboxId: '',
|
|
61
|
-
template: this.config.template,
|
|
62
|
-
status: 'starting',
|
|
63
|
-
source: options.source,
|
|
64
|
-
sourceType: options.sourceType,
|
|
65
|
-
branch: options.branch,
|
|
66
|
-
newBranch: options.newBranch,
|
|
67
|
-
tasks: options.tasks,
|
|
68
|
-
prompt: options.prompt,
|
|
69
|
-
startedAt: new Date().toISOString(),
|
|
70
|
-
exportDir: instancePaths.exports,
|
|
71
|
-
logFile: `${instancePaths.logs}/execution.log`,
|
|
72
|
-
// GitHub integration options
|
|
73
|
-
autoCommit: options.autoCommit,
|
|
74
|
-
autoPush: options.autoPush,
|
|
75
|
-
createPr: options.createPr,
|
|
76
|
-
prTitle: options.prTitle,
|
|
77
|
-
prBase: options.prBase,
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
logger.instance(instanceId, 'starting', `Using template: ${this.config.template}`);
|
|
82
|
-
|
|
83
|
-
// Create the sandbox with specified template
|
|
84
|
-
const sandbox = await Sandbox.create(this.config.template, {
|
|
85
|
-
apiKey: this.config.apiKey,
|
|
86
|
-
timeoutMs: this.config.timeout,
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
instance.sandboxId = sandbox.sandboxId;
|
|
90
|
-
logger.instance(instanceId, 'starting', `Sandbox ID: ${sandbox.sandboxId}`);
|
|
91
|
-
|
|
92
|
-
// Setup the instance based on source type
|
|
93
|
-
if (options.sourceType === 'local') {
|
|
94
|
-
await this.setupInstanceFromLocal(sandbox, instance, options.include, options.exclude);
|
|
95
|
-
} else {
|
|
96
|
-
await this.setupInstanceFromRepo(sandbox, instance);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return instance;
|
|
100
|
-
} catch (error) {
|
|
101
|
-
instance.status = 'failed';
|
|
102
|
-
instance.error = error instanceof Error ? error.message : String(error);
|
|
103
|
-
logger.instance(instanceId, 'failed', instance.error);
|
|
104
|
-
|
|
105
|
-
// Log error to file
|
|
106
|
-
await this.appendLog(instance, `ERROR: ${instance.error}`);
|
|
107
|
-
|
|
108
|
-
return instance;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Load Anthropic API key from ~/.secrets
|
|
114
|
-
*/
|
|
115
|
-
private async loadAnthropicKey(): Promise<string | undefined> {
|
|
116
|
-
try {
|
|
117
|
-
const secrets = await Bun.file(`${process.env.HOME}/.secrets`).text();
|
|
118
|
-
const match = secrets.match(/ANTHROPIC_API_KEY=["']?([^"'\n]+)["']?/);
|
|
119
|
-
return match?.[1];
|
|
120
|
-
} catch {
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Append to instance log file
|
|
127
|
-
*/
|
|
128
|
-
private async appendLog(instance: SwarmInstance, message: string): Promise<void> {
|
|
129
|
-
if (!instance.logFile) return;
|
|
130
|
-
const timestamp = new Date().toISOString();
|
|
131
|
-
const logLine = `[${timestamp}] ${message}\n`;
|
|
132
|
-
try {
|
|
133
|
-
const existing = await Bun.file(instance.logFile).text().catch(() => '');
|
|
134
|
-
await Bun.write(instance.logFile, existing + logLine);
|
|
135
|
-
} catch {
|
|
136
|
-
// Ignore log write errors
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Setup instance by uploading local files
|
|
142
|
-
*/
|
|
143
|
-
private async setupInstanceFromLocal(
|
|
144
|
-
sandbox: Sandbox,
|
|
145
|
-
instance: SwarmInstance,
|
|
146
|
-
include?: string[],
|
|
147
|
-
exclude?: string[]
|
|
148
|
-
): Promise<void> {
|
|
149
|
-
const localPath = instance.source;
|
|
150
|
-
const excludePatterns = [...DEFAULT_EXCLUDE, ...(exclude || [])];
|
|
151
|
-
|
|
152
|
-
instance.status = 'uploading';
|
|
153
|
-
logger.instance(instance.id, 'uploading', localPath);
|
|
154
|
-
await this.appendLog(instance, `Uploading local files from: ${localPath}`);
|
|
155
|
-
|
|
156
|
-
// Create workspace directory
|
|
157
|
-
await sandbox.commands.run('mkdir -p /home/user/workspace');
|
|
158
|
-
|
|
159
|
-
// Get all files to upload
|
|
160
|
-
const files = await this.getFilesToUpload(localPath, excludePatterns, include);
|
|
161
|
-
await this.appendLog(instance, `Found ${files.length} files to upload`);
|
|
162
|
-
|
|
163
|
-
// Upload files in batches
|
|
164
|
-
let uploaded = 0;
|
|
165
|
-
for (const file of files) {
|
|
166
|
-
const relativePath = relative(localPath, file);
|
|
167
|
-
const remotePath = `/home/user/workspace/${relativePath}`;
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
const content = await Bun.file(file).text();
|
|
171
|
-
await sandbox.files.write(remotePath, content);
|
|
172
|
-
uploaded++;
|
|
173
|
-
|
|
174
|
-
if (uploaded % 50 === 0) {
|
|
175
|
-
logger.instance(instance.id, 'uploading', `${uploaded}/${files.length} files`);
|
|
176
|
-
}
|
|
177
|
-
} catch (error) {
|
|
178
|
-
// Skip binary files or files that fail to read
|
|
179
|
-
await this.appendLog(instance, `Skipped: ${relativePath} (${error})`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
await this.appendLog(instance, `Uploaded ${uploaded} files`);
|
|
184
|
-
logger.instance(instance.id, 'uploading', `${uploaded} files uploaded`);
|
|
185
|
-
|
|
186
|
-
// Continue with common setup
|
|
187
|
-
await this.finishSetup(sandbox, instance);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Setup instance by cloning from git repo
|
|
192
|
-
*/
|
|
193
|
-
private async setupInstanceFromRepo(sandbox: Sandbox, instance: SwarmInstance): Promise<void> {
|
|
194
|
-
const { source: repo, branch } = instance;
|
|
195
|
-
|
|
196
|
-
await this.appendLog(instance, `Starting setup for repo: ${repo}`);
|
|
197
|
-
|
|
198
|
-
// Clone the repository
|
|
199
|
-
instance.status = 'cloning';
|
|
200
|
-
logger.instance(instance.id, 'cloning', repo);
|
|
201
|
-
await this.appendLog(instance, `Cloning repository...`);
|
|
202
|
-
|
|
203
|
-
const cloneCmd = branch
|
|
204
|
-
? `git clone --branch ${branch} --depth 1 ${repo} /home/user/workspace`
|
|
205
|
-
: `git clone --depth 1 ${repo} /home/user/workspace`;
|
|
206
|
-
|
|
207
|
-
const cloneResult = await sandbox.commands.run(cloneCmd, { timeoutMs: 120000 });
|
|
208
|
-
if (cloneResult.exitCode !== 0) {
|
|
209
|
-
throw new Error(`Failed to clone repo: ${cloneResult.stderr}`);
|
|
210
|
-
}
|
|
211
|
-
await this.appendLog(instance, `Clone successful`);
|
|
212
|
-
|
|
213
|
-
// Continue with common setup
|
|
214
|
-
await this.finishSetup(sandbox, instance);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Common setup after files are in place
|
|
219
|
-
*/
|
|
220
|
-
private async finishSetup(sandbox: Sandbox, instance: SwarmInstance): Promise<void> {
|
|
221
|
-
const { tasks, prompt } = instance;
|
|
222
|
-
|
|
223
|
-
// Setup directories
|
|
224
|
-
instance.status = 'setting-up';
|
|
225
|
-
logger.instance(instance.id, 'setting-up', 'Creating task files...');
|
|
226
|
-
await this.appendLog(instance, `Setting up task files...`);
|
|
227
|
-
|
|
228
|
-
await sandbox.commands.run('mkdir -p /home/user/workspace/.claude/tasks/swarm');
|
|
229
|
-
|
|
230
|
-
// Write individual task files (matching Claude Code format)
|
|
231
|
-
for (const task of tasks) {
|
|
232
|
-
const taskJson = JSON.stringify(task, null, 2);
|
|
233
|
-
await sandbox.files.write(
|
|
234
|
-
`/home/user/workspace/.claude/tasks/swarm/${task.id}.json`,
|
|
235
|
-
taskJson
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
await this.appendLog(instance, `Created ${tasks.length} task files`);
|
|
239
|
-
|
|
240
|
-
// Write the prompt file
|
|
241
|
-
const promptContent = `# Swarm Task Execution
|
|
242
|
-
|
|
243
|
-
${prompt}
|
|
244
|
-
|
|
245
|
-
## Assigned Tasks
|
|
246
|
-
|
|
247
|
-
${tasks.map(t => `- [${t.id}] ${t.subject}`).join('\n')}
|
|
248
|
-
|
|
249
|
-
## Instructions
|
|
250
|
-
|
|
251
|
-
1. Read each task using TaskGet
|
|
252
|
-
2. Set task status to in_progress when starting
|
|
253
|
-
3. Complete the task following its description
|
|
254
|
-
4. Set task status to completed when done
|
|
255
|
-
5. Move to the next task
|
|
256
|
-
|
|
257
|
-
Work through all assigned tasks systematically.
|
|
258
|
-
`;
|
|
259
|
-
|
|
260
|
-
await sandbox.files.write('/home/user/workspace/.claude/swarm-prompt.md', promptContent);
|
|
261
|
-
|
|
262
|
-
// Install dependencies
|
|
263
|
-
logger.instance(instance.id, 'setting-up', 'Installing dependencies...');
|
|
264
|
-
await this.appendLog(instance, `Installing dependencies...`);
|
|
265
|
-
await sandbox.commands.run('cd /home/user/workspace && bun install 2>/dev/null || npm install 2>/dev/null || true', {
|
|
266
|
-
timeoutMs: 180000,
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
// Start Claude Code (non-blocking, runs in background)
|
|
270
|
-
instance.status = 'running';
|
|
271
|
-
logger.instance(instance.id, 'running', 'Starting Claude Code...');
|
|
272
|
-
await this.appendLog(instance, `Starting Claude Code...`);
|
|
273
|
-
|
|
274
|
-
// Get Anthropic API key for Claude Code
|
|
275
|
-
const anthropicKey = process.env.ANTHROPIC_API_KEY || await this.loadAnthropicKey();
|
|
276
|
-
if (!anthropicKey) {
|
|
277
|
-
throw new Error(
|
|
278
|
-
'ANTHROPIC_API_KEY not found. Add it to ~/.secrets:\n' +
|
|
279
|
-
' export ANTHROPIC_API_KEY="your-api-key"\n\n' +
|
|
280
|
-
'Get your API key at: https://console.anthropic.com'
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Run Claude Code with the task list
|
|
285
|
-
const claudeCmd = `
|
|
286
|
-
cd /home/user/workspace && \
|
|
287
|
-
export ANTHROPIC_API_KEY="${anthropicKey}" && \
|
|
288
|
-
export CLAUDE_CODE_TASK_LIST_ID=swarm && \
|
|
289
|
-
claude --print "$(cat .claude/swarm-prompt.md)" \
|
|
290
|
-
--dangerously-skip-permissions \
|
|
291
|
-
--output-format json \
|
|
292
|
-
> /home/user/workspace/.claude/swarm-output.json 2>&1 &
|
|
293
|
-
echo $! > /home/user/workspace/.claude/swarm-pid
|
|
294
|
-
`;
|
|
295
|
-
|
|
296
|
-
await sandbox.commands.run(claudeCmd);
|
|
297
|
-
logger.instance(instance.id, 'running', 'Claude Code started');
|
|
298
|
-
await this.appendLog(instance, `Claude Code process started`);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Get list of files to upload, respecting exclude patterns
|
|
303
|
-
*/
|
|
304
|
-
private async getFilesToUpload(
|
|
305
|
-
dir: string,
|
|
306
|
-
exclude: string[],
|
|
307
|
-
include?: string[]
|
|
308
|
-
): Promise<string[]> {
|
|
309
|
-
const files: string[] = [];
|
|
310
|
-
|
|
311
|
-
const walk = async (currentDir: string) => {
|
|
312
|
-
const entries = await readdir(currentDir, { withFileTypes: true });
|
|
313
|
-
|
|
314
|
-
for (const entry of entries) {
|
|
315
|
-
const fullPath = join(currentDir, entry.name);
|
|
316
|
-
const relativePath = relative(dir, fullPath);
|
|
317
|
-
|
|
318
|
-
// Check if excluded
|
|
319
|
-
if (this.shouldExclude(relativePath, entry.name, exclude)) {
|
|
320
|
-
continue;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Check if included (if include patterns specified)
|
|
324
|
-
if (include && include.length > 0 && !this.matchesAny(relativePath, include)) {
|
|
325
|
-
if (!entry.isDirectory()) continue;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
if (entry.isDirectory()) {
|
|
329
|
-
await walk(fullPath);
|
|
330
|
-
} else if (entry.isFile()) {
|
|
331
|
-
// Skip large files (> 1MB)
|
|
332
|
-
const stats = await stat(fullPath);
|
|
333
|
-
if (stats.size < 1024 * 1024) {
|
|
334
|
-
files.push(fullPath);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
await walk(dir);
|
|
341
|
-
return files;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Check if path should be excluded
|
|
346
|
-
*/
|
|
347
|
-
private shouldExclude(relativePath: string, name: string, patterns: string[]): boolean {
|
|
348
|
-
for (const pattern of patterns) {
|
|
349
|
-
// Exact match
|
|
350
|
-
if (name === pattern || relativePath === pattern) return true;
|
|
351
|
-
|
|
352
|
-
// Glob pattern (simple)
|
|
353
|
-
if (pattern.includes('*')) {
|
|
354
|
-
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
355
|
-
if (regex.test(name) || regex.test(relativePath)) return true;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Directory match
|
|
359
|
-
if (relativePath.startsWith(pattern + '/')) return true;
|
|
360
|
-
}
|
|
361
|
-
return false;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Check if path matches any pattern
|
|
366
|
-
*/
|
|
367
|
-
private matchesAny(path: string, patterns: string[]): boolean {
|
|
368
|
-
for (const pattern of patterns) {
|
|
369
|
-
if (pattern.includes('*')) {
|
|
370
|
-
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
371
|
-
if (regex.test(path)) return true;
|
|
372
|
-
} else if (path.startsWith(pattern)) {
|
|
373
|
-
return true;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
return false;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Check the status of a running instance
|
|
381
|
-
*/
|
|
382
|
-
async checkInstance(instance: SwarmInstance): Promise<SwarmInstance> {
|
|
383
|
-
if (!instance.sandboxId || instance.status === 'failed') {
|
|
384
|
-
return instance;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
try {
|
|
388
|
-
const sandbox = await Sandbox.connect(instance.sandboxId, {
|
|
389
|
-
apiKey: this.config.apiKey,
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
// Check if Claude Code is still running
|
|
393
|
-
const pidResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-pid 2>/dev/null || echo ""');
|
|
394
|
-
const pid = pidResult.stdout.trim();
|
|
395
|
-
|
|
396
|
-
if (pid) {
|
|
397
|
-
const psResult = await sandbox.commands.run(`ps -p ${pid} -o pid= 2>/dev/null || echo ""`);
|
|
398
|
-
if (!psResult.stdout.trim()) {
|
|
399
|
-
// Process completed
|
|
400
|
-
instance.status = 'completed';
|
|
401
|
-
instance.completedAt = new Date().toISOString();
|
|
402
|
-
|
|
403
|
-
// Read output
|
|
404
|
-
const outputResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-output.json 2>/dev/null || echo "{}"');
|
|
405
|
-
instance.output = outputResult.stdout;
|
|
406
|
-
|
|
407
|
-
await this.appendLog(instance, `Execution completed`);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
return instance;
|
|
412
|
-
} catch (error) {
|
|
413
|
-
// Sandbox might have been closed
|
|
414
|
-
if (instance.status === 'running') {
|
|
415
|
-
instance.status = 'failed';
|
|
416
|
-
instance.error = error instanceof Error ? error.message : 'Sandbox connection lost';
|
|
417
|
-
await this.appendLog(instance, `ERROR: ${instance.error}`);
|
|
418
|
-
}
|
|
419
|
-
return instance;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
/**
|
|
424
|
-
* Collect results from a completed instance
|
|
425
|
-
*/
|
|
426
|
-
async collectResults(instance: SwarmInstance): Promise<{
|
|
427
|
-
output: string;
|
|
428
|
-
tasks: Task[];
|
|
429
|
-
logs: string;
|
|
430
|
-
}> {
|
|
431
|
-
if (!instance.sandboxId) {
|
|
432
|
-
throw new Error('Instance has no sandbox ID');
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
const sandbox = await Sandbox.connect(instance.sandboxId, {
|
|
436
|
-
apiKey: this.config.apiKey,
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
// Read output
|
|
440
|
-
const outputResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-output.json 2>/dev/null || echo "{}"');
|
|
441
|
-
|
|
442
|
-
// Read updated task files
|
|
443
|
-
const tasksResult = await sandbox.commands.run('cat /home/user/workspace/.claude/tasks/swarm/*.json 2>/dev/null');
|
|
444
|
-
const taskLines = tasksResult.stdout.split('\n').filter(Boolean);
|
|
445
|
-
const tasks: Task[] = [];
|
|
446
|
-
|
|
447
|
-
for (const line of taskLines) {
|
|
448
|
-
try {
|
|
449
|
-
tasks.push(JSON.parse(line));
|
|
450
|
-
} catch {
|
|
451
|
-
// Skip invalid JSON
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// Read any logs
|
|
456
|
-
const logsResult = await sandbox.commands.run('cat /home/user/workspace/.claude/swarm-output.json 2>/dev/null || echo ""');
|
|
457
|
-
|
|
458
|
-
await this.appendLog(instance, `Results collected: ${tasks.length} tasks`);
|
|
459
|
-
|
|
460
|
-
return {
|
|
461
|
-
output: outputResult.stdout,
|
|
462
|
-
tasks,
|
|
463
|
-
logs: logsResult.stdout,
|
|
464
|
-
};
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
/**
|
|
468
|
-
* Kill a sandbox instance
|
|
469
|
-
*/
|
|
470
|
-
async kill(instance: SwarmInstance): Promise<void> {
|
|
471
|
-
if (!instance.sandboxId) {
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
try {
|
|
476
|
-
const sandbox = await Sandbox.connect(instance.sandboxId, {
|
|
477
|
-
apiKey: this.config.apiKey,
|
|
478
|
-
});
|
|
479
|
-
await sandbox.kill();
|
|
480
|
-
instance.status = 'failed';
|
|
481
|
-
instance.error = 'Killed by user';
|
|
482
|
-
instance.completedAt = new Date().toISOString();
|
|
483
|
-
logger.instance(instance.id, 'failed', 'Killed');
|
|
484
|
-
await this.appendLog(instance, `Instance killed by user`);
|
|
485
|
-
} catch (error) {
|
|
486
|
-
// Sandbox might already be dead
|
|
487
|
-
logger.debug(`Failed to kill sandbox ${instance.sandboxId}: ${error}`);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|