@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,91 +0,0 @@
|
|
|
1
|
-
import type { ModelProvider, QueryGenerationResult } from "../types";
|
|
2
|
-
import * as anthropic from "../services/anthropic";
|
|
3
|
-
import * as openai from "../services/openai";
|
|
4
|
-
|
|
5
|
-
const SYSTEM_PROMPT = `You are a research query generation expert. Your task is to generate diverse, effective search queries that will help gather comprehensive information on a given topic.
|
|
6
|
-
|
|
7
|
-
Generate queries that cover different aspects:
|
|
8
|
-
- Definitions and fundamentals
|
|
9
|
-
- How it works / technical implementation
|
|
10
|
-
- Best practices and recommendations
|
|
11
|
-
- Common problems, challenges, and solutions
|
|
12
|
-
- Comparisons with alternatives
|
|
13
|
-
- Recent developments and trends
|
|
14
|
-
- Expert opinions and case studies
|
|
15
|
-
- Real-world applications and examples
|
|
16
|
-
|
|
17
|
-
Make each query specific and searchable. Avoid overly generic queries.`;
|
|
18
|
-
|
|
19
|
-
function buildUserPrompt(topic: string, queryCount: number): string {
|
|
20
|
-
return `Research Topic: "${topic}"
|
|
21
|
-
|
|
22
|
-
Generate exactly ${queryCount} diverse search queries that will help gather comprehensive information on this topic. The queries should cover different angles and aspects to ensure thorough research.
|
|
23
|
-
|
|
24
|
-
Respond with a JSON object in this exact format:
|
|
25
|
-
{
|
|
26
|
-
"queries": ["query1", "query2", ...],
|
|
27
|
-
"reasoning": "Brief explanation of the query strategy"
|
|
28
|
-
}`;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function generateQueries(
|
|
32
|
-
topic: string,
|
|
33
|
-
queryCount: number,
|
|
34
|
-
model: ModelProvider
|
|
35
|
-
): Promise<QueryGenerationResult> {
|
|
36
|
-
const userPrompt = buildUserPrompt(topic, queryCount);
|
|
37
|
-
|
|
38
|
-
if (model === "claude") {
|
|
39
|
-
return anthropic.generateJson<QueryGenerationResult>(
|
|
40
|
-
SYSTEM_PROMPT,
|
|
41
|
-
userPrompt,
|
|
42
|
-
{ temperature: 0.5 }
|
|
43
|
-
);
|
|
44
|
-
} else {
|
|
45
|
-
return openai.generateJson<QueryGenerationResult>(
|
|
46
|
-
SYSTEM_PROMPT,
|
|
47
|
-
userPrompt,
|
|
48
|
-
{ temperature: 0.5 }
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export async function generateFollowUpQueries(
|
|
54
|
-
topic: string,
|
|
55
|
-
existingFindings: string,
|
|
56
|
-
queryCount: number,
|
|
57
|
-
model: ModelProvider
|
|
58
|
-
): Promise<QueryGenerationResult> {
|
|
59
|
-
const followUpPrompt = `Research Topic: "${topic}"
|
|
60
|
-
|
|
61
|
-
Based on initial research findings, generate ${queryCount} follow-up queries to fill gaps and explore deeper.
|
|
62
|
-
|
|
63
|
-
Initial Findings Summary:
|
|
64
|
-
${existingFindings}
|
|
65
|
-
|
|
66
|
-
Generate queries that:
|
|
67
|
-
1. Explore areas not covered in initial findings
|
|
68
|
-
2. Go deeper into important subtopics
|
|
69
|
-
3. Find contradicting viewpoints or alternative perspectives
|
|
70
|
-
4. Discover more recent information
|
|
71
|
-
|
|
72
|
-
Respond with a JSON object in this exact format:
|
|
73
|
-
{
|
|
74
|
-
"queries": ["query1", "query2", ...],
|
|
75
|
-
"reasoning": "Brief explanation of what gaps these queries address"
|
|
76
|
-
}`;
|
|
77
|
-
|
|
78
|
-
if (model === "claude") {
|
|
79
|
-
return anthropic.generateJson<QueryGenerationResult>(
|
|
80
|
-
SYSTEM_PROMPT,
|
|
81
|
-
followUpPrompt,
|
|
82
|
-
{ temperature: 0.6 }
|
|
83
|
-
);
|
|
84
|
-
} else {
|
|
85
|
-
return openai.generateJson<QueryGenerationResult>(
|
|
86
|
-
SYSTEM_PROMPT,
|
|
87
|
-
followUpPrompt,
|
|
88
|
-
{ temperature: 0.6 }
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type { ModelProvider, Source, SynthesisResult } from "../types";
|
|
2
|
-
import * as anthropic from "../services/anthropic";
|
|
3
|
-
import * as openai from "../services/openai";
|
|
4
|
-
|
|
5
|
-
const SYSTEM_PROMPT = `You are an expert research analyst who synthesizes information from multiple sources into comprehensive, well-structured reports.
|
|
6
|
-
|
|
7
|
-
Your reports should:
|
|
8
|
-
- Be factual and objective
|
|
9
|
-
- Cite sources using [1], [2], etc. notation
|
|
10
|
-
- Present multiple perspectives when they exist
|
|
11
|
-
- Highlight areas of consensus and disagreement
|
|
12
|
-
- Use clear markdown formatting
|
|
13
|
-
- Be thorough but concise`;
|
|
14
|
-
|
|
15
|
-
function formatSources(sources: Source[]): string {
|
|
16
|
-
return sources
|
|
17
|
-
.map(
|
|
18
|
-
(s) => `
|
|
19
|
-
[Source ${s.id}] ${s.title}
|
|
20
|
-
URL: ${s.url}
|
|
21
|
-
${s.publishedDate ? `Published: ${s.publishedDate}` : ""}
|
|
22
|
-
${s.author ? `Author: ${s.author}` : ""}
|
|
23
|
-
|
|
24
|
-
Content:
|
|
25
|
-
${s.content.slice(0, 2500)}${s.content.length > 2500 ? "..." : ""}
|
|
26
|
-
`
|
|
27
|
-
)
|
|
28
|
-
.join("\n---\n");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function buildSynthesisPrompt(topic: string, sources: Source[]): string {
|
|
32
|
-
return `Create a comprehensive research report on: "${topic}"
|
|
33
|
-
|
|
34
|
-
Based on the following ${sources.length} sources:
|
|
35
|
-
|
|
36
|
-
${formatSources(sources)}
|
|
37
|
-
|
|
38
|
-
Write a research report with these sections:
|
|
39
|
-
|
|
40
|
-
## Executive Summary
|
|
41
|
-
A 2-3 paragraph overview of the key findings.
|
|
42
|
-
|
|
43
|
-
## Key Findings
|
|
44
|
-
Bullet points of the most important discoveries.
|
|
45
|
-
|
|
46
|
-
## Detailed Analysis
|
|
47
|
-
Organized by subtopic, with in-depth coverage. Use headers for each major subtopic.
|
|
48
|
-
|
|
49
|
-
## Conclusions
|
|
50
|
-
Summary of insights and any recommendations.
|
|
51
|
-
|
|
52
|
-
Requirements:
|
|
53
|
-
- Cite sources inline using [1], [2], etc.
|
|
54
|
-
- Be objective and factual
|
|
55
|
-
- Present conflicting viewpoints if they exist
|
|
56
|
-
- Use markdown formatting
|
|
57
|
-
- Aim for thoroughness while staying focused`;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export async function synthesizeReport(
|
|
61
|
-
topic: string,
|
|
62
|
-
sources: Source[],
|
|
63
|
-
model: ModelProvider
|
|
64
|
-
): Promise<SynthesisResult> {
|
|
65
|
-
if (sources.length === 0) {
|
|
66
|
-
return {
|
|
67
|
-
report:
|
|
68
|
-
"## No Sources Found\n\nNo relevant sources were found for this research topic. Please try refining your query or using different search terms.",
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const userPrompt = buildSynthesisPrompt(topic, sources);
|
|
73
|
-
|
|
74
|
-
const report =
|
|
75
|
-
model === "claude"
|
|
76
|
-
? await anthropic.generateText(SYSTEM_PROMPT, userPrompt, {
|
|
77
|
-
maxTokens: 16384,
|
|
78
|
-
temperature: 0.4,
|
|
79
|
-
})
|
|
80
|
-
: await openai.generateText(SYSTEM_PROMPT, userPrompt, {
|
|
81
|
-
maxTokens: 16384,
|
|
82
|
-
temperature: 0.4,
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
return { report };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export async function generateFindingsSummary(
|
|
89
|
-
sources: Source[],
|
|
90
|
-
model: ModelProvider
|
|
91
|
-
): Promise<string> {
|
|
92
|
-
if (sources.length === 0) {
|
|
93
|
-
return "No findings yet.";
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const prompt = `Summarize the key themes and findings from these sources in 2-3 paragraphs:
|
|
97
|
-
|
|
98
|
-
${sources.slice(0, 15).map((s) => `- ${s.title}: ${s.content.slice(0, 500)}`).join("\n")}
|
|
99
|
-
|
|
100
|
-
Focus on:
|
|
101
|
-
1. Main themes covered
|
|
102
|
-
2. Key facts and findings
|
|
103
|
-
3. Any gaps or areas needing more research`;
|
|
104
|
-
|
|
105
|
-
const systemPrompt =
|
|
106
|
-
"You are a research assistant. Provide concise summaries of research findings.";
|
|
107
|
-
|
|
108
|
-
return model === "claude"
|
|
109
|
-
? anthropic.generateText(systemPrompt, prompt, { maxTokens: 1000 })
|
|
110
|
-
: openai.generateText(systemPrompt, prompt, { maxTokens: 1000 });
|
|
111
|
-
}
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
import { program } from "commander";
|
|
4
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
5
|
-
import { join } from "path";
|
|
6
|
-
import { homedir } from "os";
|
|
7
|
-
import { runResearch } from "./research";
|
|
8
|
-
import type { DepthLevel, ModelProvider, ResearchConfig } from "./types";
|
|
9
|
-
import logger from "./utils/logger";
|
|
10
|
-
|
|
11
|
-
type Platform = "claude" | "codex";
|
|
12
|
-
|
|
13
|
-
// ============================================================================
|
|
14
|
-
// Install Command
|
|
15
|
-
// ============================================================================
|
|
16
|
-
|
|
17
|
-
const SKILL_MD_CONTENT = `---
|
|
18
|
-
name: deepresearch
|
|
19
|
-
description: Perform deep research on any topic using Exa.ai for parallel semantic search and Claude/OpenAI for synthesis. Use when you need comprehensive research reports with citations, analysis of topics from multiple angles, or thorough investigation of technical subjects.
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
# Deep Research
|
|
23
|
-
|
|
24
|
-
Agentic deep research skill using Exa.ai for search and Claude/OpenAI for synthesis.
|
|
25
|
-
|
|
26
|
-
## CLI Usage
|
|
27
|
-
|
|
28
|
-
Run the CLI directly:
|
|
29
|
-
|
|
30
|
-
\`\`\`bash
|
|
31
|
-
# Basic usage
|
|
32
|
-
deepresearch "What are the best practices for building RAG systems?"
|
|
33
|
-
|
|
34
|
-
# Quick research (6 queries)
|
|
35
|
-
deepresearch "What is vector search?" --depth quick
|
|
36
|
-
|
|
37
|
-
# Normal research (15 queries, default)
|
|
38
|
-
deepresearch "Best practices for ML systems" --depth normal
|
|
39
|
-
|
|
40
|
-
# Deep research (30 queries, 2 iterations)
|
|
41
|
-
deepresearch "Compare React vs Vue" --depth deep
|
|
42
|
-
|
|
43
|
-
# Use OpenAI instead of Claude
|
|
44
|
-
deepresearch "State of AI in 2024" --model openai
|
|
45
|
-
|
|
46
|
-
# Custom output location
|
|
47
|
-
deepresearch "Kubernetes best practices" --output ./k8s-research.md
|
|
48
|
-
|
|
49
|
-
# Include raw sources JSON
|
|
50
|
-
deepresearch "GraphQL vs REST APIs" --json
|
|
51
|
-
\`\`\`
|
|
52
|
-
|
|
53
|
-
## Options
|
|
54
|
-
|
|
55
|
-
| Option | Description | Default |
|
|
56
|
-
|--------|-------------|---------|
|
|
57
|
-
| \`-d, --depth <level>\` | Research depth: quick, normal, deep | normal |
|
|
58
|
-
| \`-m, --model <provider>\` | LLM: claude or openai | claude |
|
|
59
|
-
| \`-o, --output <path>\` | Custom output path | exports/ |
|
|
60
|
-
| \`-j, --json\` | Also save sources as JSON | false |
|
|
61
|
-
| \`--no-firecrawl\` | Skip deep scraping | false |
|
|
62
|
-
|
|
63
|
-
## Depth Levels
|
|
64
|
-
|
|
65
|
-
| Level | Queries | Iterations | Use Case |
|
|
66
|
-
|-------|---------|------------|----------|
|
|
67
|
-
| quick | 6 | 1 | Fast overview |
|
|
68
|
-
| normal | 15 | 1 | Standard research |
|
|
69
|
-
| deep | 30 | 2 | Thorough analysis |
|
|
70
|
-
|
|
71
|
-
## Data Directories
|
|
72
|
-
|
|
73
|
-
- **exports/** - Generated research reports
|
|
74
|
-
- **uploads/** - User-provided files for context
|
|
75
|
-
- **logs/** - Execution logs
|
|
76
|
-
|
|
77
|
-
## Requirements
|
|
78
|
-
|
|
79
|
-
- \`EXA_API_KEY\` in \`~/.secrets\` - Required for search
|
|
80
|
-
- \`ANTHROPIC_API_KEY\` in \`~/.secrets\` - Required for Claude synthesis
|
|
81
|
-
- \`OPENAI_API_KEY\` in \`~/.secrets\` - Required for OpenAI synthesis
|
|
82
|
-
- \`FIRECRAWL_API_KEY\` in \`~/.secrets\` - Optional for deep scraping
|
|
83
|
-
- Bun runtime with \`deepresearch\` installed globally
|
|
84
|
-
|
|
85
|
-
## Install CLI
|
|
86
|
-
|
|
87
|
-
\`\`\`bash
|
|
88
|
-
bun add -g @hasnaxyz/deepresearch
|
|
89
|
-
\`\`\`
|
|
90
|
-
`;
|
|
91
|
-
|
|
92
|
-
async function ensureDir(dir: string): Promise<void> {
|
|
93
|
-
await mkdir(dir, { recursive: true });
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function getSkillsDir(platform: Platform, local: boolean): string {
|
|
97
|
-
if (local) {
|
|
98
|
-
return platform === "claude" ? ".claude/skills" : ".codex/skills";
|
|
99
|
-
}
|
|
100
|
-
const home = homedir();
|
|
101
|
-
return platform === "claude"
|
|
102
|
-
? join(home, ".claude", "skills")
|
|
103
|
-
: join(home, ".codex", "skills");
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function installSkill(options: {
|
|
107
|
-
platform: Platform;
|
|
108
|
-
local: boolean;
|
|
109
|
-
}): Promise<void> {
|
|
110
|
-
const skillName = "deepresearch";
|
|
111
|
-
const baseDir = getSkillsDir(options.platform, options.local);
|
|
112
|
-
const skillDir = join(baseDir, skillName);
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
logger.startSpinner(`Installing skill to ${options.platform === "claude" ? "Claude Code" : "Codex"}...`);
|
|
116
|
-
|
|
117
|
-
// Create skill directory structure
|
|
118
|
-
await ensureDir(skillDir);
|
|
119
|
-
await ensureDir(join(skillDir, "exports"));
|
|
120
|
-
await ensureDir(join(skillDir, "uploads"));
|
|
121
|
-
await ensureDir(join(skillDir, "logs"));
|
|
122
|
-
|
|
123
|
-
// Write SKILL.md
|
|
124
|
-
const skillMdPath = join(skillDir, "SKILL.md");
|
|
125
|
-
await writeFile(skillMdPath, SKILL_MD_CONTENT, "utf-8");
|
|
126
|
-
|
|
127
|
-
logger.succeedSpinner(`Installed to ${skillDir}`);
|
|
128
|
-
|
|
129
|
-
console.log();
|
|
130
|
-
logger.success(`Skill ${skillName} installed successfully`);
|
|
131
|
-
console.log();
|
|
132
|
-
console.log("Created structure:");
|
|
133
|
-
console.log(` ${skillDir}/`);
|
|
134
|
-
console.log(` ├── SKILL.md`);
|
|
135
|
-
console.log(` ├── exports/`);
|
|
136
|
-
console.log(` ├── uploads/`);
|
|
137
|
-
console.log(` └── logs/`);
|
|
138
|
-
console.log();
|
|
139
|
-
console.log(`Invoke with: /${skillName}`);
|
|
140
|
-
|
|
141
|
-
} catch (error) {
|
|
142
|
-
logger.failSpinner("Install failed");
|
|
143
|
-
if (error instanceof Error) {
|
|
144
|
-
logger.error(error.message);
|
|
145
|
-
}
|
|
146
|
-
process.exit(1);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// ============================================================================
|
|
151
|
-
// CLI Setup
|
|
152
|
-
// ============================================================================
|
|
153
|
-
|
|
154
|
-
program
|
|
155
|
-
.name("deepresearch")
|
|
156
|
-
.description("Agentic deep research using Exa.ai search and LLM synthesis")
|
|
157
|
-
.version("0.1.1");
|
|
158
|
-
|
|
159
|
-
// Install subcommand
|
|
160
|
-
program
|
|
161
|
-
.command("install")
|
|
162
|
-
.description("Install this skill to Claude Code or Codex")
|
|
163
|
-
.option("--claude", "Install to Claude Code (~/.claude/skills/)")
|
|
164
|
-
.option("--codex", "Install to OpenAI Codex (~/.codex/skills/)")
|
|
165
|
-
.option("--local", "Install to local repo (.claude/skills/ or .codex/skills/)")
|
|
166
|
-
.action(async (options) => {
|
|
167
|
-
if (!options.claude && !options.codex) {
|
|
168
|
-
logger.error("Please specify --claude or --codex");
|
|
169
|
-
process.exit(1);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const platforms: Platform[] = [];
|
|
173
|
-
if (options.claude) platforms.push("claude");
|
|
174
|
-
if (options.codex) platforms.push("codex");
|
|
175
|
-
|
|
176
|
-
for (const platform of platforms) {
|
|
177
|
-
await installSkill({
|
|
178
|
-
platform,
|
|
179
|
-
local: options.local || false,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
// Research command (default)
|
|
185
|
-
program
|
|
186
|
-
.argument("<topic>", "Research topic or question")
|
|
187
|
-
.option("-d, --depth <level>", "Research depth: quick, normal, deep", "normal")
|
|
188
|
-
.option("-m, --model <provider>", "LLM for synthesis: claude, openai", "claude")
|
|
189
|
-
.option("-o, --output <path>", "Custom output path for report")
|
|
190
|
-
.option("-j, --json", "Also output sources as JSON")
|
|
191
|
-
.option("--no-firecrawl", "Skip Firecrawl deep scraping")
|
|
192
|
-
.action(async (topic: string, options) => {
|
|
193
|
-
const validDepths: DepthLevel[] = ["quick", "normal", "deep"];
|
|
194
|
-
const validModels: ModelProvider[] = ["claude", "openai"];
|
|
195
|
-
|
|
196
|
-
if (!validDepths.includes(options.depth as DepthLevel)) {
|
|
197
|
-
logger.error(`Invalid depth: ${options.depth}. Use: ${validDepths.join(", ")}`);
|
|
198
|
-
process.exit(1);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (!validModels.includes(options.model as ModelProvider)) {
|
|
202
|
-
logger.error(`Invalid model: ${options.model}. Use: ${validModels.join(", ")}`);
|
|
203
|
-
process.exit(1);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const config: ResearchConfig = {
|
|
207
|
-
topic,
|
|
208
|
-
depth: options.depth as DepthLevel,
|
|
209
|
-
model: options.model as ModelProvider,
|
|
210
|
-
output: options.output,
|
|
211
|
-
json: options.json,
|
|
212
|
-
firecrawl: options.firecrawl,
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
try {
|
|
216
|
-
await runResearch(config);
|
|
217
|
-
} catch (error) {
|
|
218
|
-
logger.stopSpinner();
|
|
219
|
-
logger.error(error instanceof Error ? error.message : "Unknown error");
|
|
220
|
-
process.exit(1);
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
program.parse();
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import type { ResearchConfig, ResearchReport, Source, DepthLevel } from "./types";
|
|
2
|
-
import { DEPTH_CONFIG } from "./types";
|
|
3
|
-
import { generateQueries, generateFollowUpQueries } from "./agents/query-generator";
|
|
4
|
-
import { synthesizeReport, generateFindingsSummary } from "./agents/synthesizer";
|
|
5
|
-
import { searchInBatches, isExaConfigured } from "./services/exa";
|
|
6
|
-
import { scrapeUrls, isFirecrawlConfigured } from "./services/firecrawl";
|
|
7
|
-
import { isAnthropicConfigured } from "./services/anthropic";
|
|
8
|
-
import { isOpenAIConfigured } from "./services/openai";
|
|
9
|
-
import { saveReport, saveSourcesJson } from "./utils/file";
|
|
10
|
-
import logger from "./utils/logger";
|
|
11
|
-
|
|
12
|
-
export function validateConfig(config: ResearchConfig): void {
|
|
13
|
-
if (!isExaConfigured()) {
|
|
14
|
-
throw new Error("EXA_API_KEY is required for search. Set it in ~/.secrets");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (config.model === "claude" && !isAnthropicConfigured()) {
|
|
18
|
-
throw new Error("ANTHROPIC_API_KEY is required for Claude synthesis. Set it in ~/.secrets");
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (config.model === "openai" && !isOpenAIConfigured()) {
|
|
22
|
-
throw new Error("OPENAI_API_KEY is required for OpenAI synthesis. Set it in ~/.secrets");
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (config.firecrawl && !isFirecrawlConfigured()) {
|
|
26
|
-
logger.warn("FIRECRAWL_API_KEY not set. Skipping deep scraping.");
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async function runSearchIteration(
|
|
31
|
-
topic: string,
|
|
32
|
-
depth: DepthLevel,
|
|
33
|
-
model: ResearchConfig["model"],
|
|
34
|
-
existingSources: Source[],
|
|
35
|
-
iterationNum: number
|
|
36
|
-
): Promise<Source[]> {
|
|
37
|
-
const settings = DEPTH_CONFIG[depth];
|
|
38
|
-
const queryCount = iterationNum === 1
|
|
39
|
-
? settings.queryCount
|
|
40
|
-
: Math.floor(settings.queryCount / 2);
|
|
41
|
-
|
|
42
|
-
logger.startSpinner(`Generating ${queryCount} search queries (iteration ${iterationNum})...`);
|
|
43
|
-
|
|
44
|
-
let queries: string[];
|
|
45
|
-
if (iterationNum === 1) {
|
|
46
|
-
const result = await generateQueries(topic, queryCount, model);
|
|
47
|
-
queries = result.queries;
|
|
48
|
-
} else {
|
|
49
|
-
const summary = await generateFindingsSummary(existingSources, model);
|
|
50
|
-
const result = await generateFollowUpQueries(topic, summary, queryCount, model);
|
|
51
|
-
queries = result.queries;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
logger.succeedSpinner(`Generated ${queries.length} queries`);
|
|
55
|
-
|
|
56
|
-
logger.startSpinner("Searching...");
|
|
57
|
-
const newSources = await searchInBatches(queries, settings.resultsPerQuery);
|
|
58
|
-
logger.succeedSpinner(`Found ${newSources.length} unique sources`);
|
|
59
|
-
|
|
60
|
-
return newSources;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async function deepScrapeTopSources(
|
|
64
|
-
sources: Source[],
|
|
65
|
-
maxScrape: number = 5
|
|
66
|
-
): Promise<Source[]> {
|
|
67
|
-
if (!isFirecrawlConfigured()) {
|
|
68
|
-
return sources;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const topSources = sources
|
|
72
|
-
.sort((a, b) => (b.relevanceScore || 0) - (a.relevanceScore || 0))
|
|
73
|
-
.slice(0, maxScrape);
|
|
74
|
-
|
|
75
|
-
logger.startSpinner(`Deep scraping top ${topSources.length} sources with Firecrawl...`);
|
|
76
|
-
|
|
77
|
-
const scrapeResults = await scrapeUrls(topSources.map((s) => s.url));
|
|
78
|
-
|
|
79
|
-
let enhancedCount = 0;
|
|
80
|
-
for (const result of scrapeResults) {
|
|
81
|
-
if (result.success && result.markdown) {
|
|
82
|
-
const source = sources.find((s) => s.url === result.url);
|
|
83
|
-
if (source && result.markdown.length > source.content.length) {
|
|
84
|
-
source.content = result.markdown.slice(0, 8000);
|
|
85
|
-
enhancedCount++;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
logger.succeedSpinner(`Enhanced ${enhancedCount} sources with deeper content`);
|
|
91
|
-
|
|
92
|
-
return sources;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export async function runResearch(config: ResearchConfig): Promise<ResearchReport> {
|
|
96
|
-
const { topic, depth, model, firecrawl, output, json } = config;
|
|
97
|
-
const settings = DEPTH_CONFIG[depth];
|
|
98
|
-
|
|
99
|
-
logger.header("Deep Research");
|
|
100
|
-
logger.stats("Topic", topic);
|
|
101
|
-
logger.stats("Depth", `${depth} (${settings.queryCount} queries, ${settings.iterations} iteration${settings.iterations > 1 ? "s" : ""})`);
|
|
102
|
-
logger.stats("Model", model);
|
|
103
|
-
logger.divider();
|
|
104
|
-
|
|
105
|
-
validateConfig(config);
|
|
106
|
-
|
|
107
|
-
let allSources: Source[] = [];
|
|
108
|
-
|
|
109
|
-
for (let iteration = 1; iteration <= settings.iterations; iteration++) {
|
|
110
|
-
if (settings.iterations > 1) {
|
|
111
|
-
logger.info(`Starting iteration ${iteration} of ${settings.iterations}`);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const newSources = await runSearchIteration(
|
|
115
|
-
topic,
|
|
116
|
-
depth,
|
|
117
|
-
model,
|
|
118
|
-
allSources,
|
|
119
|
-
iteration
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
const existingUrls = new Set(allSources.map((s) => s.url));
|
|
123
|
-
const uniqueNewSources = newSources.filter((s) => !existingUrls.has(s.url));
|
|
124
|
-
|
|
125
|
-
let nextId = allSources.length + 1;
|
|
126
|
-
for (const source of uniqueNewSources) {
|
|
127
|
-
source.id = nextId++;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
allSources = [...allSources, ...uniqueNewSources];
|
|
131
|
-
logger.info(`Total unique sources: ${allSources.length}`);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (firecrawl !== false && isFirecrawlConfigured()) {
|
|
135
|
-
allSources = await deepScrapeTopSources(allSources);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
logger.startSpinner("Synthesizing report...");
|
|
139
|
-
const synthesis = await synthesizeReport(topic, allSources, model);
|
|
140
|
-
logger.succeedSpinner("Report synthesized");
|
|
141
|
-
|
|
142
|
-
const report: ResearchReport = {
|
|
143
|
-
topic,
|
|
144
|
-
depth,
|
|
145
|
-
generatedAt: new Date().toISOString(),
|
|
146
|
-
queryCount: settings.queryCount * settings.iterations,
|
|
147
|
-
sourceCount: allSources.length,
|
|
148
|
-
report: synthesis.report,
|
|
149
|
-
sources: allSources,
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
const reportPath = await saveReport(report, output);
|
|
153
|
-
logger.success(`Report saved: ${reportPath}`);
|
|
154
|
-
|
|
155
|
-
if (json) {
|
|
156
|
-
const sourcesPath = await saveSourcesJson(allSources, topic, output);
|
|
157
|
-
logger.success(`Sources JSON saved: ${sourcesPath}`);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
logger.divider();
|
|
161
|
-
logger.header("Research Complete");
|
|
162
|
-
logger.stats("Sources analyzed", allSources.length);
|
|
163
|
-
logger.stats("Output", reportPath);
|
|
164
|
-
|
|
165
|
-
return report;
|
|
166
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
-
|
|
3
|
-
let client: Anthropic | null = null;
|
|
4
|
-
|
|
5
|
-
function getClient(): Anthropic {
|
|
6
|
-
if (!client) {
|
|
7
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
8
|
-
if (!apiKey) {
|
|
9
|
-
throw new Error(
|
|
10
|
-
"ANTHROPIC_API_KEY not found. Please set it in ~/.secrets or environment."
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
client = new Anthropic({ apiKey });
|
|
14
|
-
}
|
|
15
|
-
return client;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export async function generateText(
|
|
19
|
-
systemPrompt: string,
|
|
20
|
-
userPrompt: string,
|
|
21
|
-
options?: {
|
|
22
|
-
maxTokens?: number;
|
|
23
|
-
temperature?: number;
|
|
24
|
-
}
|
|
25
|
-
): Promise<string> {
|
|
26
|
-
const anthropic = getClient();
|
|
27
|
-
|
|
28
|
-
const response = await anthropic.messages.create({
|
|
29
|
-
model: "claude-sonnet-4-20250514",
|
|
30
|
-
max_tokens: options?.maxTokens || 8192,
|
|
31
|
-
temperature: options?.temperature ?? 0.7,
|
|
32
|
-
system: systemPrompt,
|
|
33
|
-
messages: [{ role: "user", content: userPrompt }],
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const textBlock = response.content.find((block) => block.type === "text");
|
|
37
|
-
if (!textBlock || textBlock.type !== "text") {
|
|
38
|
-
throw new Error("No text response from Claude");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return textBlock.text;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function generateJson<T>(
|
|
45
|
-
systemPrompt: string,
|
|
46
|
-
userPrompt: string,
|
|
47
|
-
options?: {
|
|
48
|
-
maxTokens?: number;
|
|
49
|
-
temperature?: number;
|
|
50
|
-
}
|
|
51
|
-
): Promise<T> {
|
|
52
|
-
const text = await generateText(systemPrompt, userPrompt, {
|
|
53
|
-
...options,
|
|
54
|
-
temperature: options?.temperature ?? 0.3,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
58
|
-
const jsonStr = jsonMatch ? jsonMatch[1].trim() : text.trim();
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
return JSON.parse(jsonStr) as T;
|
|
62
|
-
} catch {
|
|
63
|
-
throw new Error(`Failed to parse JSON from Claude response: ${text.slice(0, 200)}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function isAnthropicConfigured(): boolean {
|
|
68
|
-
return !!process.env.ANTHROPIC_API_KEY;
|
|
69
|
-
}
|