@hasna/skills 0.1.26 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -10
- package/README.md +141 -39
- package/bin/index.js +30122 -27575
- package/bin/mcp.js +22112 -18593
- package/dist/cli/cli.test-utils.d.ts +15 -0
- package/dist/cli/commands/auth.d.ts +2 -0
- package/dist/cli/commands/install.d.ts +1 -1
- package/dist/cli/commands/runtime-mcp.d.ts +4 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.js +11607 -597
- package/dist/lib/auth-store.d.ts +13 -0
- package/dist/lib/installer.d.ts +58 -55
- package/dist/lib/mcp-contracts.d.ts +86 -0
- package/dist/lib/project-state.d.ts +43 -0
- package/dist/lib/registry-data/business-marketing.d.ts +2 -0
- package/dist/lib/registry-data/communication.d.ts +2 -0
- package/dist/lib/registry-data/content-generation.d.ts +2 -0
- package/dist/lib/registry-data/data-analysis.d.ts +2 -0
- package/dist/lib/registry-data/design-branding.d.ts +2 -0
- package/dist/lib/registry-data/development-tools.d.ts +2 -0
- package/dist/lib/registry-data/education-learning.d.ts +2 -0
- package/dist/lib/registry-data/event-management.d.ts +2 -0
- package/dist/lib/registry-data/finance-compliance.d.ts +2 -0
- package/dist/lib/registry-data/health-wellness.d.ts +2 -0
- package/dist/lib/registry-data/index.d.ts +2 -0
- package/dist/lib/registry-data/media-processing.d.ts +2 -0
- package/dist/lib/registry-data/productivity-organization.d.ts +2 -0
- package/dist/lib/registry-data/project-management.d.ts +2 -0
- package/dist/lib/registry-data/research-writing.d.ts +2 -0
- package/dist/lib/registry-data/science-academic.d.ts +2 -0
- package/dist/lib/registry-data/travel-lifestyle.d.ts +2 -0
- package/dist/lib/registry-data/web-browser.d.ts +2 -0
- package/dist/lib/registry-types.d.ts +27 -0
- package/dist/lib/registry.d.ts +6 -18
- package/dist/lib/remote-registry.d.ts +3 -0
- package/dist/lib/run-state.d.ts +60 -0
- package/dist/lib/skill-aliases.d.ts +17 -0
- package/dist/lib/skillinfo.d.ts +5 -1
- package/dist/mcp/discovery-tools.d.ts +2 -0
- package/dist/mcp/helpers.d.ts +26 -0
- package/dist/mcp/http.d.ts +10 -0
- package/dist/mcp/index.d.ts +3 -2
- package/dist/mcp/operation-tools.d.ts +2 -0
- package/dist/mcp/resource-meta-tools.d.ts +2 -0
- package/dist/mcp/schedule-tools.d.ts +2 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/types/api.d.ts +7 -4
- package/package.json +23 -10
- package/skills/_common/http-client.ts +1 -1
- package/skills/_common/index.ts +2 -3
- package/skills/_common/install.sh +5 -110
- package/skills/_common/installer.ts +31 -282
- package/skills/_common/skill-install.ts +14 -181
- package/skills/ad-creative-pack/SKILL.md +45 -0
- package/skills/ad-creative-pack/package.json +14 -0
- package/skills/advanced-math/package.json +3 -1
- package/skills/advanced-math/src/calculators.ts +118 -0
- package/skills/advanced-math/src/cli.ts +130 -0
- package/skills/advanced-math/src/conversion.ts +90 -0
- package/skills/advanced-math/src/finance.ts +75 -0
- package/skills/advanced-math/src/formatting.ts +95 -0
- package/skills/advanced-math/src/index.ts +24 -702
- package/skills/advanced-math/src/runtime.ts +49 -0
- package/skills/advanced-math/src/symbolic.ts +110 -0
- package/skills/advanced-math/src/types.ts +36 -0
- package/skills/analyze-data/SKILL.md +2 -2
- package/skills/analyze-data/src/analysis.ts +401 -0
- package/skills/analyze-data/src/cli.ts +66 -0
- package/skills/analyze-data/src/formatters.ts +235 -0
- package/skills/analyze-data/src/index.ts +6 -1027
- package/skills/analyze-data/src/logger.ts +36 -0
- package/skills/analyze-data/src/parsers.ts +57 -0
- package/skills/analyze-data/src/stats.ts +151 -0
- package/skills/analyze-data/src/types.ts +85 -0
- package/skills/api-docs-portal/SKILL.md +46 -0
- package/skills/api-docs-portal/package.json +9 -0
- package/skills/api-test-suite/src/index.ts +13 -0
- package/skills/apidocs/package.json +1 -1
- package/skills/apidocs/src/index.ts +3 -0
- package/skills/audio/package.json +2 -3
- package/skills/audio-cleanup-lab/SKILL.md +2 -2
- package/skills/audio-extract/CLAUDE.md +1 -1
- package/skills/audio-transcript-pack/SKILL.md +43 -0
- package/skills/audio-transcript-pack/package.json +10 -0
- package/skills/blog-article/CLAUDE.md +12 -0
- package/skills/blog-article/SKILL.md +45 -0
- package/skills/{create-blog-article → blog-article}/package.json +3 -3
- package/skills/brand-kit/SKILL.md +45 -0
- package/skills/brand-kit/package.json +14 -0
- package/skills/brand-photo-shoot/SKILL.md +28 -0
- package/skills/brand-photo-shoot/package.json +10 -0
- package/skills/brand-style-guide/SKILL.md +2 -2
- package/skills/brand-style-guide/src/index.ts +0 -0
- package/skills/budget-variance-analyzer/SKILL.md +2 -2
- package/skills/businessactivity/package.json +1 -1
- package/skills/businessactivity/src/index.ts +3 -0
- package/skills/calendar-events/src/ai-parser.ts +103 -0
- package/skills/calendar-events/src/api.ts +157 -0
- package/skills/calendar-events/src/auth.ts +22 -0
- package/skills/calendar-events/src/config.ts +6 -0
- package/skills/calendar-events/src/format.ts +96 -0
- package/skills/calendar-events/src/help.ts +54 -0
- package/skills/calendar-events/src/index.ts +21 -524
- package/skills/calendar-events/src/logger.ts +34 -0
- package/skills/calendar-events/src/types.ts +67 -0
- package/skills/compress-video/SKILL.md +2 -2
- package/skills/consolelog/package.json +1 -1
- package/skills/consolelog/src/index.ts +3 -0
- package/skills/contract-review-report/SKILL.md +43 -0
- package/skills/contract-review-report/package.json +10 -0
- package/skills/convert/SKILL.md +2 -3
- package/skills/customer-feedback-report/SKILL.md +44 -0
- package/skills/customer-feedback-report/package.json +10 -0
- package/skills/dashboard-builder/package.json +3 -1
- package/skills/database-explorer/package.json +3 -1
- package/skills/deepresearch/README.md +4 -13
- package/skills/deploy/src/http-client.ts +1 -1
- package/skills/diff-viewer/package.json +4 -1
- package/skills/doc-generate/package.json +0 -1
- package/skills/doc-generate/src/ai.ts +50 -0
- package/skills/doc-generate/src/cli.ts +203 -0
- package/skills/doc-generate/src/dependencies.ts +44 -0
- package/skills/doc-generate/src/document-builder.ts +299 -0
- package/skills/doc-generate/src/index.ts +40 -764
- package/skills/doc-generate/src/markdown-parser.ts +125 -0
- package/skills/doc-generate/src/types.ts +68 -0
- package/skills/domainpurchase/SKILL.md +1 -1
- package/skills/domainpurchase/package.json +1 -1
- package/skills/domainpurchase/src/index.ts +3 -0
- package/skills/domainsearch/SKILL.md +1 -1
- package/skills/domainsearch/package.json +1 -1
- package/skills/domainsearch/src/index.ts +3 -0
- package/skills/email-sequence/SKILL.md +44 -0
- package/skills/email-sequence/package.json +14 -0
- package/skills/excel/CLAUDE.md +2 -2
- package/skills/experiment-power-calculator/package.json +3 -1
- package/skills/extract-invoice/src/cli.ts +97 -0
- package/skills/extract-invoice/src/extractor.ts +170 -0
- package/skills/extract-invoice/src/file-utils.ts +46 -0
- package/skills/extract-invoice/src/formatters.ts +144 -0
- package/skills/extract-invoice/src/index.ts +44 -629
- package/skills/extract-invoice/src/runtime.ts +46 -0
- package/skills/extract-invoice/src/types.ts +88 -0
- package/skills/folder-tree/package.json +3 -1
- package/skills/form-filler/package.json +3 -1
- package/skills/generate-api-client/package.json +3 -1
- package/skills/generate-api-client/src/generator.ts +47 -0
- package/skills/generate-api-client/src/index.ts +3 -777
- package/skills/generate-api-client/src/logger.ts +34 -0
- package/skills/generate-api-client/src/python-generator.ts +245 -0
- package/skills/generate-api-client/src/spec-loader.ts +48 -0
- package/skills/generate-api-client/src/type-mappers.ts +79 -0
- package/skills/generate-api-client/src/types.ts +76 -0
- package/skills/generate-api-client/src/typescript-generator.ts +247 -0
- package/skills/generate-book-cover/package.json +3 -1
- package/skills/generate-dockerfile/src/cli.ts +78 -0
- package/skills/generate-dockerfile/src/dockerfile-templates.ts +392 -0
- package/skills/generate-dockerfile/src/index.ts +12 -790
- package/skills/generate-dockerfile/src/logger.ts +30 -0
- package/skills/generate-dockerfile/src/project-detection.ts +68 -0
- package/skills/generate-dockerfile/src/support-files.ts +171 -0
- package/skills/generate-dockerfile/src/types.ts +29 -0
- package/skills/generate-documentation/src/ai.ts +131 -0
- package/skills/generate-documentation/src/cli.ts +71 -0
- package/skills/generate-documentation/src/code-parser.ts +300 -0
- package/skills/generate-documentation/src/file-processing.ts +182 -0
- package/skills/generate-documentation/src/index.ts +13 -753
- package/skills/generate-documentation/src/runtime.ts +35 -0
- package/skills/generate-documentation/src/types.ts +30 -0
- package/skills/generate-env/package.json +3 -1
- package/skills/generate-env/src/cli.ts +85 -0
- package/skills/generate-env/src/detection.ts +161 -0
- package/skills/generate-env/src/env-data.ts +66 -0
- package/skills/generate-env/src/generators.ts +240 -0
- package/skills/generate-env/src/index.ts +76 -676
- package/skills/generate-env/src/runtime.ts +30 -0
- package/skills/generate-env/src/types.ts +32 -0
- package/skills/generate-favicon/package.json +3 -1
- package/skills/generate-mock-data/package.json +3 -1
- package/skills/generate-mock-data/src/ai.ts +102 -0
- package/skills/generate-mock-data/src/formatters.ts +84 -0
- package/skills/generate-mock-data/src/generator.ts +377 -0
- package/skills/generate-mock-data/src/index.ts +15 -716
- package/skills/generate-mock-data/src/logger.ts +37 -0
- package/skills/generate-mock-data/src/presets.ts +110 -0
- package/skills/generate-mock-data/src/types.ts +21 -0
- package/skills/generate-pr-description/src/ai.ts +144 -0
- package/skills/generate-pr-description/src/cli.ts +80 -0
- package/skills/generate-pr-description/src/clipboard.ts +30 -0
- package/skills/generate-pr-description/src/formatters.ts +231 -0
- package/skills/generate-pr-description/src/git.ts +153 -0
- package/skills/generate-pr-description/src/index.ts +21 -714
- package/skills/generate-pr-description/src/types.ts +49 -0
- package/skills/generate-presentation/src/ai-clients.ts +61 -0
- package/skills/generate-presentation/src/cli.ts +126 -0
- package/skills/generate-presentation/src/index.ts +3 -751
- package/skills/generate-presentation/src/logger.ts +67 -0
- package/skills/generate-presentation/src/presentation-generator.ts +425 -0
- package/skills/generate-presentation/src/runtime.ts +6 -0
- package/skills/generate-presentation/src/security.ts +12 -0
- package/skills/generate-presentation/src/types.ts +28 -0
- package/skills/generate-qrcode/package.json +4 -1
- package/skills/generate-regex/package.json +3 -1
- package/skills/generate-resume/src/cli.ts +157 -0
- package/skills/generate-resume/src/index.ts +13 -917
- package/skills/generate-resume/src/parsers.ts +95 -0
- package/skills/generate-resume/src/renderers.ts +538 -0
- package/skills/generate-resume/src/security.ts +39 -0
- package/skills/generate-resume/src/types.ts +86 -0
- package/skills/generate-social-posts/src/ai.ts +88 -0
- package/skills/generate-social-posts/src/cli.ts +118 -0
- package/skills/generate-social-posts/src/exporters.ts +126 -0
- package/skills/generate-social-posts/src/generator.ts +130 -0
- package/skills/generate-social-posts/src/index.ts +19 -709
- package/skills/generate-social-posts/src/platforms.ts +39 -0
- package/skills/generate-social-posts/src/runtime.ts +34 -0
- package/skills/generate-social-posts/src/source.ts +116 -0
- package/skills/generate-social-posts/src/types.ts +58 -0
- package/skills/gif-maker/package.json +4 -1
- package/skills/github-manager/package.json +3 -1
- package/skills/gmail/CLAUDE.md +1 -1
- package/skills/highlight-reel-generator/src/index.ts +19 -0
- package/skills/hook/src/commands/create.ts +20 -845
- package/skills/hook/src/templates/root.ts +196 -0
- package/skills/hook/src/templates/source.ts +647 -0
- package/skills/http-server/package.json +3 -1
- package/skills/icon-pack/README.md +28 -0
- package/skills/icon-pack/SKILL.md +23 -0
- package/skills/icon-pack/package.json +29 -0
- package/skills/{audio → icon-pack}/tsconfig.json +10 -12
- package/skills/image/package.json +1 -2
- package/skills/implementation-agent/package.json +3 -1
- package/skills/implementation-agent/src/ai-generation.ts +225 -0
- package/skills/implementation-agent/src/index.ts +3 -960
- package/skills/implementation-agent/src/minimist.d.ts +15 -0
- package/skills/implementation-agent/src/templates.ts +686 -0
- package/skills/implementation-agent/src/types.ts +53 -0
- package/skills/implementation-plan/package.json +3 -1
- package/skills/implementation-todo/package.json +3 -1
- package/skills/invoice/package.json +1 -1
- package/skills/invoice/src/index.ts +3 -0
- package/skills/invoice-reconciliation/SKILL.md +42 -0
- package/skills/invoice-reconciliation/package.json +10 -0
- package/skills/landing-page-pack/SKILL.md +47 -0
- package/skills/landing-page-pack/package.json +14 -0
- package/skills/latex-table-generator/package.json +3 -1
- package/skills/logo-design/SKILL.md +25 -44
- package/skills/logo-design/package.json +3 -15
- package/skills/lorem-generator/package.json +3 -1
- package/skills/lorem-generator/src/index.ts +13 -0
- package/skills/managehook/package.json +1 -1
- package/skills/managehook/src/index.ts +3 -0
- package/skills/managemcp/package.json +1 -1
- package/skills/managemcp/src/index.ts +3 -0
- package/skills/manageskill/package.json +1 -1
- package/skills/manageskill/src/index.ts +3 -0
- package/skills/markdown-validator/package.json +3 -1
- package/skills/markdown-validator/src/index.ts +1 -4
- package/skills/market-research-report/SKILL.md +41 -0
- package/skills/market-research-report/package.json +10 -0
- package/skills/mcp-builder/package.json +4 -1
- package/skills/mcp-builder/src/ai-descriptions.ts +37 -0
- package/skills/mcp-builder/src/generators.ts +513 -0
- package/skills/mcp-builder/src/index.ts +7 -908
- package/skills/mcp-builder/src/minimist.d.ts +15 -0
- package/skills/mcp-builder/src/naming.ts +12 -0
- package/skills/mcp-builder/src/options.ts +170 -0
- package/skills/mcp-builder/src/templates.ts +149 -0
- package/skills/mcp-builder/src/types.ts +42 -0
- package/skills/meeting-pack/SKILL.md +43 -0
- package/skills/meeting-pack/package.json +10 -0
- package/skills/merge-pdfs/package.json +5 -1
- package/skills/migration-plan-pack/SKILL.md +45 -0
- package/skills/migration-plan-pack/package.json +10 -0
- package/skills/music/package.json +2 -3
- package/skills/music-album/SKILL.md +37 -0
- package/skills/music-album/package.json +10 -0
- package/skills/notion-manager/package.json +3 -1
- package/skills/npmpublish/CLAUDE.md +5 -8
- package/skills/npmpublish/README.md +5 -26
- package/skills/npmpublish/src/index.ts +9 -147
- package/skills/one-page-website/SKILL.md +46 -0
- package/skills/one-page-website/package.json +10 -0
- package/skills/one-page-website/tsconfig.json +8 -0
- package/skills/pdf-generate/src/cli.ts +162 -0
- package/skills/pdf-generate/src/html.ts +84 -0
- package/skills/pdf-generate/src/index.ts +11 -800
- package/skills/pdf-generate/src/markdown.ts +27 -0
- package/skills/pdf-generate/src/pdf-writer.ts +78 -0
- package/skills/pdf-generate/src/runtime.ts +34 -0
- package/skills/pdf-generate/src/security.ts +37 -0
- package/skills/pdf-generate/src/templates.ts +311 -0
- package/skills/pdf-generate/src/types.ts +28 -0
- package/skills/pdf-read/SKILL.md +10 -10
- package/skills/pdf-to-dataset/SKILL.md +45 -0
- package/skills/pdf-to-dataset/package.json +10 -0
- package/skills/pdf-to-markdown/SKILL.md +49 -0
- package/skills/pdf-to-markdown/package.json +10 -0
- package/skills/pdf-to-markdown/tsconfig.json +10 -0
- package/skills/performance-audit-report/SKILL.md +42 -0
- package/skills/performance-audit-report/package.json +10 -0
- package/skills/persona-based-adwriter/src/index.ts +19 -0
- package/skills/photo-album/SKILL.md +29 -0
- package/skills/photo-album/package.json +9 -0
- package/skills/photo-album/tsconfig.json +4 -0
- package/skills/pitch-deck/SKILL.md +43 -0
- package/skills/pitch-deck/package.json +9 -0
- package/skills/playlist-maker/SKILL.md +33 -0
- package/skills/playlist-maker/package.json +9 -0
- package/skills/playlist-maker/tsconfig.json +4 -0
- package/skills/product-mockup/SKILL.md +45 -0
- package/skills/product-mockup/package.json +3 -20
- package/skills/product-mockup/tsconfig.json +3 -5
- package/skills/project-retro-companion/src/index.ts +19 -0
- package/skills/proposal-pack/SKILL.md +45 -0
- package/skills/proposal-pack/package.json +10 -0
- package/skills/read-pdf/SKILL.md +5 -4
- package/skills/repo-onboarding-report/SKILL.md +42 -0
- package/skills/repo-onboarding-report/package.json +10 -0
- package/skills/sales-call-recapper/src/index.ts +20 -0
- package/skills/salescopy/package.json +1 -1
- package/skills/salescopy/src/index.ts +3 -0
- package/skills/scaffold-project/src/ai-detect.ts +136 -0
- package/skills/scaffold-project/src/file-generators.ts +292 -0
- package/skills/scaffold-project/src/index.ts +8 -991
- package/skills/scaffold-project/src/project-config.ts +338 -0
- package/skills/scaffold-project/src/templates.ts +173 -0
- package/skills/scaffold-project/src/types.ts +58 -0
- package/skills/scientific-figure-check/package.json +3 -1
- package/skills/sdk-generator/SKILL.md +45 -0
- package/skills/sdk-generator/package.json +10 -0
- package/skills/sdk-generator/tsconfig.json +8 -0
- package/skills/security-audit/src/index.ts +25 -6
- package/skills/security-audit-report/SKILL.md +40 -0
- package/skills/security-audit-report/package.json +10 -0
- package/skills/seo-content-pack/SKILL.md +44 -0
- package/skills/seo-content-pack/package.json +9 -0
- package/skills/short-video-pack/SKILL.md +30 -0
- package/skills/short-video-pack/package.json +10 -0
- package/skills/slack-assistant/package.json +3 -1
- package/skills/slide-deck-generator/SKILL.md +44 -0
- package/skills/slide-deck-generator/package.json +10 -0
- package/skills/sms/package.json +1 -1
- package/skills/sms/src/index.ts +15 -0
- package/skills/social-content-calendar/SKILL.md +45 -0
- package/skills/social-content-calendar/package.json +14 -0
- package/skills/split-pdf/package.json +4 -1
- package/skills/subtitle/package.json +2 -1
- package/skills/subtitle/src/index.ts +3 -0
- package/skills/terraform-generator/package.json +3 -1
- package/skills/test-suite-generator/SKILL.md +41 -0
- package/skills/test-suite-generator/package.json +10 -0
- package/skills/timesheet/package.json +1 -1
- package/skills/timesheet/src/index.ts +3 -0
- package/skills/transcript/SKILL.md +1 -8
- package/skills/validate-config/package.json +3 -1
- package/skills/video/package.json +6 -4
- package/skills/video-downloader/package.json +3 -1
- package/skills/video-highlight-pack/SKILL.md +44 -0
- package/skills/video-highlight-pack/package.json +10 -0
- package/skills/voiceover-jingle-pack/SKILL.md +28 -0
- package/skills/voiceover-jingle-pack/package.json +10 -0
- package/skills/watermark/package.json +6 -1
- package/skills/webcrawling/package.json +2 -1
- package/skills/write/SKILL.md +6 -6
- package/dist/server/serve.d.ts +0 -11
- package/skills/apidocs/.claude/settings.json +0 -5
- package/skills/audio/.env.example +0 -14
- package/skills/audio/QUICKSTART.md +0 -158
- package/skills/audio/README.md +0 -256
- package/skills/audio/src/index-local.ts +0 -206
- package/skills/audio/src/index.ts +0 -95
- package/skills/audio/src/providers/elevenlabs.ts +0 -115
- package/skills/audio/src/providers/google.ts +0 -116
- package/skills/audio/src/providers/minimax.ts +0 -83
- package/skills/audio/src/providers/openai.ts +0 -115
- package/skills/audio/src/types.ts +0 -79
- package/skills/audiobook-chapter-proofer/CLAUDE.md +0 -19
- package/skills/audiobook-chapter-proofer/package.json +0 -27
- package/skills/audiobook-chapter-proofer/src/index.ts +0 -285
- package/skills/browse/src/client.ts +0 -373
- package/skills/browse/src/index-local.ts +0 -430
- package/skills/browse/src/index.ts +0 -110
- package/skills/browse/src/sse-server.ts +0 -919
- package/skills/browse/src/types.ts +0 -104
- package/skills/consolelog/src/server/index.ts +0 -508
- package/skills/create-blog-article/CLAUDE.md +0 -19
- package/skills/create-blog-article/src/index.ts +0 -745
- package/skills/create-blog-article/tsconfig.json +0 -10
- package/skills/deepresearch/src/agents/query-generator.ts +0 -91
- package/skills/deepresearch/src/agents/synthesizer.ts +0 -111
- package/skills/deepresearch/src/index.ts +0 -224
- package/skills/deepresearch/src/research.ts +0 -166
- package/skills/deepresearch/src/services/anthropic.ts +0 -69
- package/skills/deepresearch/src/services/exa.ts +0 -108
- package/skills/deepresearch/src/services/firecrawl.ts +0 -88
- package/skills/deepresearch/src/services/openai.ts +0 -81
- package/skills/deepresearch/src/types.ts +0 -76
- package/skills/deepresearch/src/utils/file.ts +0 -111
- package/skills/deepresearch/src/utils/logger.ts +0 -84
- package/skills/domainpurchase/src/server/index.ts +0 -332
- package/skills/domainsearch/src/server/index.ts +0 -229
- package/skills/e2bswarm/README.md +0 -135
- package/skills/e2bswarm/SKILL.md +0 -118
- package/skills/e2bswarm/examples/tasks-example.json +0 -38
- package/skills/e2bswarm/package.json +0 -59
- package/skills/e2bswarm/src/commands/collect.ts +0 -135
- package/skills/e2bswarm/src/commands/install.ts +0 -164
- package/skills/e2bswarm/src/commands/kill.ts +0 -62
- package/skills/e2bswarm/src/commands/spawn.ts +0 -134
- package/skills/e2bswarm/src/commands/status.ts +0 -90
- package/skills/e2bswarm/src/commands/sync.ts +0 -208
- package/skills/e2bswarm/src/index.ts +0 -121
- package/skills/e2bswarm/src/lib/config.ts +0 -75
- package/skills/e2bswarm/src/lib/e2b.ts +0 -490
- package/skills/e2bswarm/src/lib/github.ts +0 -253
- package/skills/e2bswarm/src/lib/logger.ts +0 -41
- package/skills/e2bswarm/src/lib/paths.ts +0 -75
- package/skills/e2bswarm/src/lib/tasks.ts +0 -320
- package/skills/e2bswarm/src/types/index.ts +0 -107
- package/skills/e2bswarm/templates/codebox/e2b.Dockerfile +0 -38
- package/skills/e2bswarm/templates/codebox/e2b.toml +0 -3
- package/skills/e2bswarm/templates/setup.sh +0 -21
- package/skills/e2bswarm/tsconfig.json +0 -19
- package/skills/generate-book-cover/src/index.ts +0 -694
- package/skills/image/src/index-local.ts +0 -206
- package/skills/image/src/index.ts +0 -96
- package/skills/image/src/providers/google.ts +0 -79
- package/skills/image/src/providers/minimax.ts +0 -94
- package/skills/image/src/providers/openai.ts +0 -80
- package/skills/image/src/providers/xai.ts +0 -73
- package/skills/image/src/types.ts +0 -37
- package/skills/logo-design/CLAUDE.md +0 -30
- package/skills/logo-design/src/index.ts +0 -322
- package/skills/managehook/src/server/index.ts +0 -108
- package/skills/managemcp/src/server/index.ts +0 -108
- package/skills/manageskill/src/server/index.ts +0 -108
- package/skills/music/CLAUDE.md +0 -9
- package/skills/music/src/index.ts +0 -94
- package/skills/music/tsconfig.json +0 -10
- package/skills/pdf-read/src/index.ts +0 -320
- package/skills/product-mockup/CLAUDE.md +0 -19
- package/skills/product-mockup/src/index.ts +0 -290
- package/skills/read-pdf/src/index.ts +0 -388
- package/skills/remove-background/src/index.ts +0 -405
- package/skills/scaffold-project/my-app/.env.example +0 -2
- package/skills/scaffold-project/my-app/README.md +0 -72
- package/skills/scaffold-project/my-app/package.json +0 -29
- package/skills/scaffold-project/my-app/src/index.ts +0 -23
- package/skills/scaffold-project/my-app/tsconfig.json +0 -33
- package/skills/sound-effects/SKILL.md +0 -34
- package/skills/sound-effects/package.json +0 -21
- package/skills/sound-effects/src/index.ts +0 -172
- package/skills/sound-effects/tsconfig.json +0 -8
- package/skills/transcript/src/chunker.ts +0 -215
- package/skills/transcript/src/formatter.ts +0 -134
- package/skills/transcript/src/index-local.ts +0 -226
- package/skills/transcript/src/index.ts +0 -110
- package/skills/transcript/src/providers/elevenlabs.ts +0 -133
- package/skills/transcript/src/providers/gemini.ts +0 -192
- package/skills/transcript/src/providers/index.ts +0 -54
- package/skills/transcript/src/providers/openai.ts +0 -203
- package/skills/transcript/src/types.ts +0 -106
- package/skills/video/.env.example +0 -14
- package/skills/video/EXAMPLES.md +0 -266
- package/skills/video/LICENSE +0 -192
- package/skills/video/README.md +0 -174
- package/skills/video/src/cli.ts +0 -155
- package/skills/video/src/index-local.ts +0 -148
- package/skills/video/src/index.ts +0 -96
- package/skills/video/src/providers/google-veo.ts +0 -126
- package/skills/video/src/providers/index.ts +0 -22
- package/skills/video/src/providers/minimax.ts +0 -100
- package/skills/video/src/providers/openai-sora.ts +0 -164
- package/skills/video/src/providers/runway.ts +0 -159
- package/skills/video/src/types.ts +0 -35
- package/skills/video/tsconfig.json +0 -22
- package/skills/voiceover-casting-assistant/CLAUDE.md +0 -19
- package/skills/voiceover-casting-assistant/package.json +0 -27
- package/skills/voiceover-casting-assistant/src/index.ts +0 -255
- package/skills/voiceover-casting-assistant/tsconfig.json +0 -10
- package/skills/webcrawling/src/commands/config.ts +0 -34
- package/skills/webcrawling/src/commands/crawl.ts +0 -33
- package/skills/webcrawling/src/commands/scrape.ts +0 -32
- package/skills/webcrawling/src/commands/sessions.ts +0 -42
- package/skills/webcrawling/src/lib/crawler.ts +0 -174
- package/skills/webcrawling/src/lib/storage.ts +0 -130
- package/skills/webcrawling/src/types/index.ts +0 -45
- package/skills/webcrawling/src/utils/logger.ts +0 -30
- package/skills/webcrawling/src/utils/paths.ts +0 -28
- /package/skills/{audiobook-chapter-proofer → blog-article}/tsconfig.json +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { escapeHtml, sanitizeUrl } from "./security";
|
|
2
|
+
|
|
3
|
+
export function markdownToHtml(markdown: string): string {
|
|
4
|
+
let html = markdown
|
|
5
|
+
.replace(/^### (.*$)/gim, "<h3>$1</h3>")
|
|
6
|
+
.replace(/^## (.*$)/gim, "<h2>$1</h2>")
|
|
7
|
+
.replace(/^# (.*$)/gim, "<h1>$1</h1>")
|
|
8
|
+
.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>")
|
|
9
|
+
.replace(/__(.+?)__/g, "<strong>$1</strong>")
|
|
10
|
+
.replace(/\*(.+?)\*/g, "<em>$1</em>")
|
|
11
|
+
.replace(/_(.+?)_/g, "<em>$1</em>")
|
|
12
|
+
.replace(/```(\w*)\n([\s\S]*?)```/g, '<pre><code class="language-$1">$2</code></pre>')
|
|
13
|
+
.replace(/`(.+?)`/g, "<code>$1</code>")
|
|
14
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, text, url) => {
|
|
15
|
+
const safeUrl = sanitizeUrl(url);
|
|
16
|
+
const safeText = escapeHtml(text);
|
|
17
|
+
return safeUrl ? `<a href="${safeUrl}">${safeText}</a>` : safeText;
|
|
18
|
+
})
|
|
19
|
+
.replace(/^\s*[-*]\s+(.*)$/gim, "<li>$1</li>")
|
|
20
|
+
.replace(/^\s*\d+\.\s+(.*)$/gim, "<li>$1</li>")
|
|
21
|
+
.replace(/^---$/gim, "<hr>")
|
|
22
|
+
.replace(/\n\n/g, "</p><p>")
|
|
23
|
+
.replace(/\n/g, "<br>");
|
|
24
|
+
|
|
25
|
+
html = html.replace(/(<li>.*?<\/li>)+/gs, "<ul>$&</ul>");
|
|
26
|
+
return `<p>${html}</p>`;
|
|
27
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { htmlToPlainText } from "./html";
|
|
3
|
+
import { loadPdfLib } from "./runtime";
|
|
4
|
+
import { PAGE_FORMATS, type GenerateOptions } from "./types";
|
|
5
|
+
|
|
6
|
+
function pageSizeToPoints(format: string, orientation: "portrait" | "landscape"): [number, number] {
|
|
7
|
+
const size = PAGE_FORMATS[format] ?? PAGE_FORMATS.A4;
|
|
8
|
+
const width = (size.width / 25.4) * 72;
|
|
9
|
+
const height = (size.height / 25.4) * 72;
|
|
10
|
+
return orientation === "landscape" ? [height, width] : [width, height];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function wrapText(text: string, maxCharacters: number): string[] {
|
|
14
|
+
const lines: string[] = [];
|
|
15
|
+
for (const paragraph of text.split("\n")) {
|
|
16
|
+
let current = "";
|
|
17
|
+
for (const word of paragraph.split(/\s+/).filter(Boolean)) {
|
|
18
|
+
const candidate = current ? `${current} ${word}` : word;
|
|
19
|
+
if (candidate.length > maxCharacters && current) {
|
|
20
|
+
lines.push(current);
|
|
21
|
+
current = word;
|
|
22
|
+
} else {
|
|
23
|
+
current = candidate;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (current) lines.push(current);
|
|
27
|
+
lines.push("");
|
|
28
|
+
}
|
|
29
|
+
return lines;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function writePdfDocument(html: string, options: GenerateOptions, outputPath: string): Promise<void> {
|
|
33
|
+
const { PDFDocument, StandardFonts, rgb } = await loadPdfLib();
|
|
34
|
+
const pdfDoc = await PDFDocument.create();
|
|
35
|
+
const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
|
|
36
|
+
const boldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
|
|
37
|
+
const [width, height] = pageSizeToPoints(options.format, options.orientation);
|
|
38
|
+
const margin = 54;
|
|
39
|
+
const fontSize = 11;
|
|
40
|
+
const lineHeight = 16;
|
|
41
|
+
const maxCharacters = Math.max(40, Math.floor((width - margin * 2) / (fontSize * 0.52)));
|
|
42
|
+
const lines = wrapText(htmlToPlainText(html), maxCharacters);
|
|
43
|
+
|
|
44
|
+
let page = pdfDoc.addPage([width, height]);
|
|
45
|
+
let y = height - margin;
|
|
46
|
+
|
|
47
|
+
if (options.title) {
|
|
48
|
+
page.drawText(options.title, {
|
|
49
|
+
x: margin,
|
|
50
|
+
y,
|
|
51
|
+
size: 18,
|
|
52
|
+
font: boldFont,
|
|
53
|
+
color: rgb(0.12, 0.18, 0.26),
|
|
54
|
+
});
|
|
55
|
+
y -= lineHeight * 2;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
if (y < margin) {
|
|
60
|
+
page = pdfDoc.addPage([width, height]);
|
|
61
|
+
y = height - margin;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (line) {
|
|
65
|
+
page.drawText(line, {
|
|
66
|
+
x: margin,
|
|
67
|
+
y,
|
|
68
|
+
size: fontSize,
|
|
69
|
+
font,
|
|
70
|
+
color: rgb(0.1, 0.1, 0.1),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
y -= lineHeight;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const bytes = await pdfDoc.save();
|
|
77
|
+
writeFileSync(outputPath, bytes);
|
|
78
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
export type PdfLibModule = typeof import("pdf-lib");
|
|
5
|
+
|
|
6
|
+
export const SKILL_NAME = "generate-pdf";
|
|
7
|
+
export const SESSION_ID = `${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
8
|
+
export const EXPORTS_DIR = process.env.SKILLS_EXPORTS_DIR || join(process.cwd(), "exports");
|
|
9
|
+
export const LOGS_DIR = process.env.SKILLS_LOGS_DIR || join(process.cwd(), "logs");
|
|
10
|
+
export const SKILLS_INPUT = process.env.SKILLS_INPUT || "";
|
|
11
|
+
export const LOG_FILE = join(LOGS_DIR, `${SESSION_ID}.log`);
|
|
12
|
+
|
|
13
|
+
[EXPORTS_DIR, LOGS_DIR].forEach((dir) => {
|
|
14
|
+
if (!existsSync(dir)) {
|
|
15
|
+
mkdirSync(dir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export function log(message: string, level: "info" | "error" | "warn" = "info") {
|
|
20
|
+
const timestamp = new Date().toISOString();
|
|
21
|
+
const logMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
|
|
22
|
+
appendFileSync(LOG_FILE, logMessage);
|
|
23
|
+
if (level === "error") {
|
|
24
|
+
console.error(message);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function loadPdfLib(): Promise<PdfLibModule> {
|
|
29
|
+
try {
|
|
30
|
+
return await import("pdf-lib");
|
|
31
|
+
} catch {
|
|
32
|
+
throw new Error("Missing dependency 'pdf-lib'. Run bun install in this skill directory.");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function escapeHtml(str: string | undefined | null): string {
|
|
2
|
+
if (str === undefined || str === null) return "";
|
|
3
|
+
return String(str)
|
|
4
|
+
.replace(/&/g, "&")
|
|
5
|
+
.replace(/</g, "<")
|
|
6
|
+
.replace(/>/g, ">")
|
|
7
|
+
.replace(/"/g, """)
|
|
8
|
+
.replace(/'/g, "'");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function sanitizeUrl(url: string | undefined | null): string {
|
|
12
|
+
if (!url) return "";
|
|
13
|
+
const trimmed = url.trim();
|
|
14
|
+
const lowerUrl = trimmed.toLowerCase();
|
|
15
|
+
if (lowerUrl.startsWith("javascript:") || lowerUrl.startsWith("data:") || lowerUrl.startsWith("vbscript:")) {
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
return escapeHtml(trimmed);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function sanitizeTemplateData(data: Record<string, string>): Record<string, string> {
|
|
22
|
+
const sanitized: Record<string, string> = {};
|
|
23
|
+
for (const [key, value] of Object.entries(data)) {
|
|
24
|
+
const lowerKey = key.toLowerCase();
|
|
25
|
+
if (
|
|
26
|
+
lowerKey.includes("linkedin") ||
|
|
27
|
+
lowerKey.includes("website") ||
|
|
28
|
+
lowerKey.includes("url") ||
|
|
29
|
+
lowerKey.includes("href")
|
|
30
|
+
) {
|
|
31
|
+
sanitized[key] = sanitizeUrl(value);
|
|
32
|
+
} else {
|
|
33
|
+
sanitized[key] = escapeHtml(value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return sanitized;
|
|
37
|
+
}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
// Invoice template
|
|
2
|
+
export const templates: Record<string, (data: Record<string, string>) => string> = {
|
|
3
|
+
invoice: (data) => `
|
|
4
|
+
<!DOCTYPE html>
|
|
5
|
+
<html>
|
|
6
|
+
<head>
|
|
7
|
+
<meta charset="UTF-8">
|
|
8
|
+
<style>
|
|
9
|
+
body { font-family: Arial, sans-serif; margin: 40px; color: #333; }
|
|
10
|
+
.header { display: flex; justify-content: space-between; margin-bottom: 40px; }
|
|
11
|
+
.company-info { font-size: 14px; }
|
|
12
|
+
.invoice-info { text-align: right; }
|
|
13
|
+
.invoice-title { font-size: 28px; color: #2c3e50; margin-bottom: 10px; }
|
|
14
|
+
.invoice-number { font-size: 14px; color: #7f8c8d; }
|
|
15
|
+
.addresses { display: flex; justify-content: space-between; margin-bottom: 40px; }
|
|
16
|
+
.address-block { width: 45%; }
|
|
17
|
+
.address-label { font-weight: bold; color: #2c3e50; margin-bottom: 10px; }
|
|
18
|
+
table { width: 100%; border-collapse: collapse; margin-bottom: 30px; }
|
|
19
|
+
th { background: #2c3e50; color: white; padding: 12px; text-align: left; }
|
|
20
|
+
td { padding: 12px; border-bottom: 1px solid #ddd; }
|
|
21
|
+
.totals { text-align: right; }
|
|
22
|
+
.totals table { width: 300px; margin-left: auto; }
|
|
23
|
+
.totals td { border: none; padding: 8px; }
|
|
24
|
+
.total-row { font-weight: bold; font-size: 18px; background: #f8f9fa; }
|
|
25
|
+
.notes { margin-top: 40px; padding: 20px; background: #f8f9fa; border-radius: 4px; }
|
|
26
|
+
.footer { margin-top: 40px; text-align: center; font-size: 12px; color: #7f8c8d; }
|
|
27
|
+
</style>
|
|
28
|
+
</head>
|
|
29
|
+
<body>
|
|
30
|
+
<div class="header">
|
|
31
|
+
<div class="company-info">
|
|
32
|
+
<h2>${data.companyName || 'Company Name'}</h2>
|
|
33
|
+
<p>${data.companyAddress || ''}<br>
|
|
34
|
+
${data.companyCity || ''}, ${data.companyState || ''} ${data.companyZip || ''}<br>
|
|
35
|
+
${data.companyPhone || ''}</p>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="invoice-info">
|
|
38
|
+
<div class="invoice-title">INVOICE</div>
|
|
39
|
+
<div class="invoice-number">#${data.invoiceNumber || 'INV-001'}</div>
|
|
40
|
+
<p>Date: ${data.invoiceDate || new Date().toLocaleDateString()}<br>
|
|
41
|
+
Due: ${data.dueDate || ''}</p>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div class="addresses">
|
|
46
|
+
<div class="address-block">
|
|
47
|
+
<div class="address-label">Bill To:</div>
|
|
48
|
+
<p>${data.clientName || 'Client Name'}<br>
|
|
49
|
+
${data.clientAddress || ''}<br>
|
|
50
|
+
${data.clientCity || ''}, ${data.clientState || ''} ${data.clientZip || ''}</p>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="address-block">
|
|
53
|
+
<div class="address-label">Payment Details:</div>
|
|
54
|
+
<p>Terms: ${data.paymentTerms || 'Net 30'}<br>
|
|
55
|
+
Method: ${data.paymentMethod || 'Bank Transfer'}</p>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<table>
|
|
60
|
+
<thead>
|
|
61
|
+
<tr>
|
|
62
|
+
<th>Description</th>
|
|
63
|
+
<th>Qty</th>
|
|
64
|
+
<th>Rate</th>
|
|
65
|
+
<th>Amount</th>
|
|
66
|
+
</tr>
|
|
67
|
+
</thead>
|
|
68
|
+
<tbody>
|
|
69
|
+
${data.items || '<tr><td>Service</td><td>1</td><td>$0</td><td>$0</td></tr>'}
|
|
70
|
+
</tbody>
|
|
71
|
+
</table>
|
|
72
|
+
|
|
73
|
+
<div class="totals">
|
|
74
|
+
<table>
|
|
75
|
+
<tr><td>Subtotal:</td><td>${data.subtotal || '$0'}</td></tr>
|
|
76
|
+
<tr><td>Tax (${data.taxRate || '0'}%):</td><td>${data.tax || '$0'}</td></tr>
|
|
77
|
+
<tr class="total-row"><td>Total:</td><td>${data.total || '$0'}</td></tr>
|
|
78
|
+
</table>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
${data.notes ? `<div class="notes"><strong>Notes:</strong><br>${data.notes}</div>` : ''}
|
|
82
|
+
|
|
83
|
+
<div class="footer">Thank you for your business!</div>
|
|
84
|
+
</body>
|
|
85
|
+
</html>`,
|
|
86
|
+
|
|
87
|
+
report: (data) => `
|
|
88
|
+
<!DOCTYPE html>
|
|
89
|
+
<html>
|
|
90
|
+
<head>
|
|
91
|
+
<meta charset="UTF-8">
|
|
92
|
+
<style>
|
|
93
|
+
body { font-family: Georgia, serif; margin: 40px; color: #333; line-height: 1.6; }
|
|
94
|
+
.title-page { text-align: center; margin-bottom: 60px; padding-top: 100px; }
|
|
95
|
+
.title { font-size: 36px; color: #2c3e50; margin-bottom: 10px; }
|
|
96
|
+
.subtitle { font-size: 20px; color: #7f8c8d; margin-bottom: 40px; }
|
|
97
|
+
.meta { font-size: 14px; color: #95a5a6; }
|
|
98
|
+
h2 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; margin-top: 40px; }
|
|
99
|
+
.executive-summary { background: #f8f9fa; padding: 20px; border-left: 4px solid #3498db; margin: 30px 0; }
|
|
100
|
+
.section { margin-bottom: 30px; }
|
|
101
|
+
.conclusion { background: #e8f4f8; padding: 20px; border-radius: 4px; margin-top: 40px; }
|
|
102
|
+
.footer { margin-top: 60px; text-align: center; font-size: 12px; color: #7f8c8d; border-top: 1px solid #ddd; padding-top: 20px; }
|
|
103
|
+
</style>
|
|
104
|
+
</head>
|
|
105
|
+
<body>
|
|
106
|
+
<div class="title-page">
|
|
107
|
+
<div class="title">${data.title || 'Report Title'}</div>
|
|
108
|
+
<div class="subtitle">${data.subtitle || ''}</div>
|
|
109
|
+
<div class="meta">
|
|
110
|
+
<p>Date: ${data.reportDate || new Date().toLocaleDateString()}</p>
|
|
111
|
+
<p>Author: ${data.author || ''}</p>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div class="executive-summary">
|
|
116
|
+
<h2>Executive Summary</h2>
|
|
117
|
+
<p>${data.executiveSummary || ''}</p>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div class="section">
|
|
121
|
+
<h2>${data.section1Title || 'Introduction'}</h2>
|
|
122
|
+
<p>${data.section1Content || ''}</p>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<div class="section">
|
|
126
|
+
<h2>${data.section2Title || 'Analysis'}</h2>
|
|
127
|
+
<p>${data.section2Content || ''}</p>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<div class="conclusion">
|
|
131
|
+
<h2>Conclusion</h2>
|
|
132
|
+
<p>${data.conclusion || ''}</p>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<div class="footer">
|
|
136
|
+
<p>${data.companyName || ''} | ${data.companyContact || ''}</p>
|
|
137
|
+
</div>
|
|
138
|
+
</body>
|
|
139
|
+
</html>`,
|
|
140
|
+
|
|
141
|
+
resume: (data) => `
|
|
142
|
+
<!DOCTYPE html>
|
|
143
|
+
<html>
|
|
144
|
+
<head>
|
|
145
|
+
<meta charset="UTF-8">
|
|
146
|
+
<style>
|
|
147
|
+
body { font-family: 'Helvetica Neue', Arial, sans-serif; margin: 40px; color: #333; line-height: 1.5; }
|
|
148
|
+
.header { text-align: center; margin-bottom: 30px; border-bottom: 2px solid #2c3e50; padding-bottom: 20px; }
|
|
149
|
+
.name { font-size: 32px; color: #2c3e50; margin-bottom: 10px; }
|
|
150
|
+
.contact { font-size: 14px; color: #7f8c8d; }
|
|
151
|
+
.contact a { color: #3498db; text-decoration: none; }
|
|
152
|
+
h2 { color: #2c3e50; font-size: 16px; text-transform: uppercase; letter-spacing: 1px; margin-top: 25px; border-bottom: 1px solid #ddd; padding-bottom: 5px; }
|
|
153
|
+
.summary { font-style: italic; color: #555; margin-bottom: 20px; }
|
|
154
|
+
.experience-item, .education-item { margin-bottom: 20px; }
|
|
155
|
+
.job-title { font-weight: bold; }
|
|
156
|
+
.company { color: #3498db; }
|
|
157
|
+
.date { font-size: 12px; color: #7f8c8d; float: right; }
|
|
158
|
+
.skills { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
159
|
+
.skill-tag { background: #e8f4f8; color: #2c3e50; padding: 4px 12px; border-radius: 15px; font-size: 12px; }
|
|
160
|
+
</style>
|
|
161
|
+
</head>
|
|
162
|
+
<body>
|
|
163
|
+
<div class="header">
|
|
164
|
+
<div class="name">${data.name || 'Your Name'}</div>
|
|
165
|
+
<div class="contact">
|
|
166
|
+
${data.email || ''} | ${data.phone || ''} | ${data.location || ''}<br>
|
|
167
|
+
${data.linkedin ? `<a href="${data.linkedin}">${data.linkedin}</a>` : ''}
|
|
168
|
+
${data.website ? `| <a href="${data.website}">${data.website}</a>` : ''}
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<h2>Professional Summary</h2>
|
|
173
|
+
<p class="summary">${data.summary || ''}</p>
|
|
174
|
+
|
|
175
|
+
<h2>Experience</h2>
|
|
176
|
+
${data.experience || '<div class="experience-item"><span class="job-title">Position</span> at <span class="company">Company</span></div>'}
|
|
177
|
+
|
|
178
|
+
<h2>Education</h2>
|
|
179
|
+
${data.education || '<div class="education-item">Degree - Institution</div>'}
|
|
180
|
+
|
|
181
|
+
<h2>Skills</h2>
|
|
182
|
+
<div class="skills">
|
|
183
|
+
${data.skills || '<span class="skill-tag">Skill</span>'}
|
|
184
|
+
</div>
|
|
185
|
+
</body>
|
|
186
|
+
</html>`,
|
|
187
|
+
|
|
188
|
+
letter: (data) => `
|
|
189
|
+
<!DOCTYPE html>
|
|
190
|
+
<html>
|
|
191
|
+
<head>
|
|
192
|
+
<meta charset="UTF-8">
|
|
193
|
+
<style>
|
|
194
|
+
body { font-family: 'Times New Roman', serif; margin: 60px; color: #333; line-height: 1.8; font-size: 14px; }
|
|
195
|
+
.sender-info { margin-bottom: 40px; }
|
|
196
|
+
.date { margin-bottom: 40px; }
|
|
197
|
+
.recipient-info { margin-bottom: 40px; }
|
|
198
|
+
.body { margin-bottom: 40px; text-align: justify; }
|
|
199
|
+
.closing { margin-top: 40px; }
|
|
200
|
+
.signature { margin-top: 60px; }
|
|
201
|
+
</style>
|
|
202
|
+
</head>
|
|
203
|
+
<body>
|
|
204
|
+
<div class="sender-info">
|
|
205
|
+
<strong>${data.senderName || ''}</strong><br>
|
|
206
|
+
${data.senderAddress || ''}<br>
|
|
207
|
+
${data.senderCity || ''}, ${data.senderState || ''} ${data.senderZip || ''}
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<div class="date">${data.date || new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}</div>
|
|
211
|
+
|
|
212
|
+
<div class="recipient-info">
|
|
213
|
+
${data.recipientName || ''}<br>
|
|
214
|
+
${data.recipientTitle ? data.recipientTitle + '<br>' : ''}
|
|
215
|
+
${data.recipientCompany ? data.recipientCompany + '<br>' : ''}
|
|
216
|
+
${data.recipientAddress || ''}<br>
|
|
217
|
+
${data.recipientCity || ''}, ${data.recipientState || ''} ${data.recipientZip || ''}
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
<div class="body">
|
|
221
|
+
<p>Dear ${data.recipientName || 'Sir/Madam'},</p>
|
|
222
|
+
<p>${data.body || ''}</p>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<div class="closing">
|
|
226
|
+
${data.closing || 'Sincerely'},
|
|
227
|
+
</div>
|
|
228
|
+
|
|
229
|
+
<div class="signature">
|
|
230
|
+
${data.senderName || ''}
|
|
231
|
+
</div>
|
|
232
|
+
</body>
|
|
233
|
+
</html>`,
|
|
234
|
+
|
|
235
|
+
contract: (data) => `
|
|
236
|
+
<!DOCTYPE html>
|
|
237
|
+
<html>
|
|
238
|
+
<head>
|
|
239
|
+
<meta charset="UTF-8">
|
|
240
|
+
<style>
|
|
241
|
+
body { font-family: 'Times New Roman', serif; margin: 50px; color: #333; line-height: 1.6; font-size: 12px; }
|
|
242
|
+
.title { text-align: center; font-size: 24px; font-weight: bold; margin-bottom: 30px; text-transform: uppercase; }
|
|
243
|
+
.date { text-align: center; margin-bottom: 30px; }
|
|
244
|
+
h2 { font-size: 14px; margin-top: 25px; }
|
|
245
|
+
.parties { margin-bottom: 30px; }
|
|
246
|
+
.section { margin-bottom: 20px; text-align: justify; }
|
|
247
|
+
.signatures { margin-top: 60px; display: flex; justify-content: space-between; }
|
|
248
|
+
.signature-block { width: 45%; }
|
|
249
|
+
.signature-line { border-top: 1px solid #333; margin-top: 60px; padding-top: 10px; }
|
|
250
|
+
</style>
|
|
251
|
+
</head>
|
|
252
|
+
<body>
|
|
253
|
+
<div class="title">${data.contractTitle || 'SERVICE AGREEMENT'}</div>
|
|
254
|
+
<div class="date">Effective Date: ${data.effectiveDate || new Date().toLocaleDateString()}</div>
|
|
255
|
+
|
|
256
|
+
<div class="parties">
|
|
257
|
+
<p>This Agreement is entered into by and between:</p>
|
|
258
|
+
<p><strong>${data.party1Name || 'Party 1'}</strong> ("${data.party1Label || 'Provider'}")<br>
|
|
259
|
+
Address: ${data.party1Address || ''}</p>
|
|
260
|
+
<p>AND</p>
|
|
261
|
+
<p><strong>${data.party2Name || 'Party 2'}</strong> ("${data.party2Label || 'Client'}")<br>
|
|
262
|
+
Address: ${data.party2Address || ''}</p>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<div class="section">
|
|
266
|
+
<h2>1. PURPOSE</h2>
|
|
267
|
+
<p>${data.purpose || ''}</p>
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<div class="section">
|
|
271
|
+
<h2>2. TERM</h2>
|
|
272
|
+
<p>This Agreement shall be effective for a period of ${data.term || '12 months'} from the Effective Date.</p>
|
|
273
|
+
</div>
|
|
274
|
+
|
|
275
|
+
<div class="section">
|
|
276
|
+
<h2>3. OBLIGATIONS</h2>
|
|
277
|
+
<p>${data.obligations || ''}</p>
|
|
278
|
+
</div>
|
|
279
|
+
|
|
280
|
+
<div class="section">
|
|
281
|
+
<h2>4. COMPENSATION</h2>
|
|
282
|
+
<p>${data.compensation || ''}</p>
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
<div class="section">
|
|
286
|
+
<h2>5. TERMINATION</h2>
|
|
287
|
+
<p>${data.termination || ''}</p>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<div class="section">
|
|
291
|
+
<h2>6. GOVERNING LAW</h2>
|
|
292
|
+
<p>This Agreement shall be governed by the laws of ${data.governingLaw || 'the applicable jurisdiction'}.</p>
|
|
293
|
+
</div>
|
|
294
|
+
|
|
295
|
+
<div class="signatures">
|
|
296
|
+
<div class="signature-block">
|
|
297
|
+
<div class="signature-line">
|
|
298
|
+
${data.party1Name || 'Party 1'}<br>
|
|
299
|
+
${data.party1Label || 'Provider'}
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
302
|
+
<div class="signature-block">
|
|
303
|
+
<div class="signature-line">
|
|
304
|
+
${data.party2Name || 'Party 2'}<br>
|
|
305
|
+
${data.party2Label || 'Client'}
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
</body>
|
|
310
|
+
</html>`
|
|
311
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const PAGE_FORMATS: Record<string, { width: number; height: number }> = {
|
|
2
|
+
A4: { width: 210, height: 297 },
|
|
3
|
+
Letter: { width: 216, height: 279 },
|
|
4
|
+
Legal: { width: 216, height: 356 },
|
|
5
|
+
A3: { width: 297, height: 420 },
|
|
6
|
+
A5: { width: 148, height: 210 },
|
|
7
|
+
Tabloid: { width: 279, height: 432 },
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export interface GenerateOptions {
|
|
11
|
+
content?: string;
|
|
12
|
+
contentType: "markdown" | "html" | "text";
|
|
13
|
+
format: string;
|
|
14
|
+
orientation: "portrait" | "landscape";
|
|
15
|
+
margin: { top: string; right: string; bottom: string; left: string };
|
|
16
|
+
header?: string;
|
|
17
|
+
footer?: string;
|
|
18
|
+
displayHeaderFooter: boolean;
|
|
19
|
+
printBackground: boolean;
|
|
20
|
+
css?: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
author?: string;
|
|
23
|
+
subject?: string;
|
|
24
|
+
filename?: string;
|
|
25
|
+
template?: string;
|
|
26
|
+
data?: Record<string, string>;
|
|
27
|
+
url?: string;
|
|
28
|
+
}
|
package/skills/pdf-read/SKILL.md
CHANGED
|
@@ -28,29 +28,29 @@ Read and extract text from PDF files. Supports multiple PDFs at once, page-range
|
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
# Read entire PDF
|
|
31
|
-
pdf-read read document.pdf
|
|
31
|
+
skills run pdf-read -- read document.pdf
|
|
32
32
|
|
|
33
33
|
# Read specific pages
|
|
34
|
-
pdf-read read report.pdf --pages 1-5
|
|
34
|
+
skills run pdf-read -- read report.pdf --pages 1-5
|
|
35
35
|
|
|
36
36
|
# Read multiple PDFs
|
|
37
|
-
pdf-read read file1.pdf file2.pdf file3.pdf
|
|
37
|
+
skills run pdf-read -- read file1.pdf file2.pdf file3.pdf
|
|
38
38
|
|
|
39
39
|
# Read in chunks of 10 pages
|
|
40
|
-
pdf-read read large-book.pdf --chunk-size 10
|
|
40
|
+
skills run pdf-read -- read large-book.pdf --chunk-size 10
|
|
41
41
|
|
|
42
42
|
# Get metadata only
|
|
43
|
-
pdf-read info document.pdf
|
|
43
|
+
skills run pdf-read -- info document.pdf
|
|
44
44
|
|
|
45
45
|
# Output as JSON with page structure
|
|
46
|
-
pdf-read read document.pdf --format json --output result.json
|
|
46
|
+
skills run pdf-read -- read document.pdf --format json --output result.json
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
##
|
|
49
|
+
## Runtime
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
This is a premium remote skill. Authenticate with `skills auth login` and run it through Skills MCP or `skills run`.
|
|
52
52
|
|
|
53
53
|
## Requirements
|
|
54
54
|
|
|
55
|
-
-
|
|
56
|
-
-
|
|
55
|
+
- Skills CLI/MCP registration
|
|
56
|
+
- Hosted Skills runtime access
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pdf-to-dataset
|
|
3
|
+
description: Extract tables, forms, invoices, and semi-structured PDF content into CSV and JSON datasets through the hosted Skills runtime.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PDF to Dataset
|
|
7
|
+
|
|
8
|
+
Convert PDF content into structured datasets and extraction reports. The implementation runs through the hosted Skills runtime, so agents get the instruction file and generated artifacts without receiving parser source, scripts, or model code.
|
|
9
|
+
|
|
10
|
+
## What It Does
|
|
11
|
+
|
|
12
|
+
- Extracts table-like rows, key-value fields, invoice fields, and semi-structured records from PDFs.
|
|
13
|
+
- Produces `dataset.json`, `dataset.csv`, `schema.json`, `extraction-report.md`, and `manifest.json`.
|
|
14
|
+
- Includes confidence notes and source metadata for review.
|
|
15
|
+
- Supports schema hints for naming columns and expected fields.
|
|
16
|
+
- Stores generated outputs as run artifacts for later download.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
skills run pdf-to-dataset -- --input ./invoice.pdf --schema "invoice_number,date,total,vendor"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
skills run pdf-to-dataset -- --input ./reports --mode tables --output ./exports/pdf-data
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Options
|
|
29
|
+
|
|
30
|
+
| Option | Description | Default |
|
|
31
|
+
|--------|-------------|---------|
|
|
32
|
+
| `--input <path-or-url>` | PDF file, folder, or URL | required |
|
|
33
|
+
| `--schema <fields>` | Comma-separated field hints | inferred |
|
|
34
|
+
| `--mode <mode>` | `tables`, `forms`, `invoice`, or `auto` | auto |
|
|
35
|
+
| `--output <dir>` | Output directory | current run export directory |
|
|
36
|
+
| `--pages <ranges>` | Page ranges like `1-3,8` | all pages |
|
|
37
|
+
|
|
38
|
+
## Requirements
|
|
39
|
+
|
|
40
|
+
- Authenticate with `skills auth login`.
|
|
41
|
+
- Keep the Skills MCP server registered with your agent:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
skills mcp --register all
|
|
45
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pdf-to-markdown
|
|
3
|
+
description: Convert PDFs into clean markdown through the hosted Skills runtime.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PDF to Markdown
|
|
7
|
+
|
|
8
|
+
Convert a PDF into clean, structured markdown using the hosted Skills runtime. The implementation runs remotely so local agent installs only need this usage contract; no parser source, scripts, or hosted runtime code is copied to the user's machine.
|
|
9
|
+
|
|
10
|
+
## What It Does
|
|
11
|
+
|
|
12
|
+
- Extracts text, headings, lists, and tables from PDFs.
|
|
13
|
+
- Preserves useful page boundaries and source references.
|
|
14
|
+
- Cleans noisy extraction output into readable markdown.
|
|
15
|
+
- Supports selected page ranges for large documents.
|
|
16
|
+
- Uses the platform runtime for paid execution and billing.
|
|
17
|
+
|
|
18
|
+
## Runtime
|
|
19
|
+
|
|
20
|
+
This is a premium remote skill. The hosted runtime handles extraction and cleanup after deterministic PDF processing. Agents should run it through Skills MCP or the CLI, not through copied local source.
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
skills run pdf-to-markdown --input ./report.pdf --output ./report.md
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
skills run pdf-to-markdown --input ./contract.pdf --pages 1-5,12 --preserve-pages
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Options
|
|
33
|
+
|
|
34
|
+
| Option | Description | Default |
|
|
35
|
+
|--------|-------------|---------|
|
|
36
|
+
| `--input <path-or-url>` | PDF file path or URL | required |
|
|
37
|
+
| `--pages <ranges>` | Page ranges like `1-5,8,10-12` | all pages |
|
|
38
|
+
| `--output <path>` | Save markdown to a file | stdout |
|
|
39
|
+
| `--preserve-pages` | Include page boundary comments | false |
|
|
40
|
+
| `--table-mode <mode>` | `markdown` or `html` table output | markdown |
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
- Authenticate with `skills auth login`.
|
|
45
|
+
- Keep the Skills MCP server registered with your agent:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
skills setup agents
|
|
49
|
+
```
|