@hasna/skills 0.1.62 → 0.1.64
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/README.md +38 -12
- package/bin/index.js +15743 -21709
- package/bin/mcp.js +3866 -11522
- package/bin/migrate.js +281 -35
- package/bin/server.js +5805 -2682
- package/bin/worker.js +5280 -2388
- package/dist/cli/commands/publish.d.ts +2 -0
- package/dist/cli/commands/registry-reconcile.d.ts +2 -0
- package/dist/cli/components/App.d.ts +2 -1
- package/dist/cli/components/CategorySelect.d.ts +2 -1
- package/dist/cli/components/Header.d.ts +2 -1
- package/dist/cli/components/InstallProgress.d.ts +2 -1
- package/dist/cli/components/SearchView.d.ts +2 -1
- package/dist/cli/components/SkillSelect.d.ts +2 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +5386 -13739
- package/dist/lib/agent-sync.d.ts +61 -6
- package/dist/lib/auth-store.d.ts +37 -0
- package/dist/lib/config.d.ts +51 -0
- package/dist/lib/home-adoption.d.ts +91 -0
- package/dist/lib/home-census.d.ts +26 -0
- package/dist/lib/home-migration.d.ts +60 -0
- package/dist/lib/native-storage.d.ts +1 -1
- package/dist/lib/portable-skills-files.d.ts +21 -1
- package/dist/lib/portable-skills-types.d.ts +46 -0
- package/dist/lib/portable-skills.d.ts +35 -6
- package/dist/lib/pull.d.ts +97 -0
- package/dist/lib/registry-reconcile.d.ts +114 -0
- package/dist/lib/registry.d.ts +7 -4
- package/dist/lib/remote-client.d.ts +124 -1
- package/dist/lib/remote-registry.d.ts +26 -0
- package/dist/lib/revision.d.ts +29 -0
- package/dist/lib/run-state.d.ts +5 -0
- package/dist/lib/skill-bundles.d.ts +54 -0
- package/dist/lib/skill-contract.d.ts +35 -0
- package/dist/lib/skill-hash.d.ts +77 -0
- package/dist/sdk/cancel.d.ts +30 -0
- package/dist/sdk/dispatcher.d.ts +40 -0
- package/dist/sdk/event-sink.d.ts +2 -0
- package/dist/sdk/events.d.ts +79 -0
- package/dist/sdk/execution/admission.d.ts +44 -0
- package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
- package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
- package/dist/sdk/execution/image-profile.d.ts +73 -0
- package/dist/sdk/execution/index.d.ts +15 -0
- package/dist/sdk/execution/receipts.d.ts +44 -0
- package/dist/sdk/execution/state-machine.d.ts +38 -0
- package/dist/sdk/execution/storage.d.ts +158 -0
- package/dist/sdk/execution/types.d.ts +130 -0
- package/dist/sdk/executor.d.ts +17 -0
- package/dist/sdk/governance-store.d.ts +156 -0
- package/dist/sdk/governance.d.ts +92 -0
- package/dist/sdk/index.d.ts +26 -0
- package/dist/sdk/index.js +49728 -0
- package/dist/sdk/offline.d.ts +16 -0
- package/dist/sdk/outputs.d.ts +71 -0
- package/dist/sdk/registry.d.ts +28 -0
- package/dist/sdk/runs.d.ts +229 -0
- package/dist/sdk/server.d.ts +35 -0
- package/dist/sdk/spend.d.ts +36 -0
- package/dist/sdk/storage.d.ts +25 -0
- package/dist/server/app.d.ts +42 -0
- package/dist/server/artifact-storage.d.ts +102 -0
- package/dist/server/auth.d.ts +5 -0
- package/dist/server/config.d.ts +50 -0
- package/dist/server/database-url.d.ts +42 -0
- package/dist/server/handlers.d.ts +3 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/migrate.d.ts +13 -0
- package/dist/server/migrations-dir.d.ts +18 -0
- package/dist/server/redaction.d.ts +1 -0
- package/dist/server/registry.d.ts +5 -0
- package/dist/server/rows.d.ts +24 -0
- package/dist/server/skills-api.d.ts +170 -0
- package/dist/server/sqlite-store.d.ts +131 -0
- package/dist/server/store-fixtures.d.ts +25 -0
- package/dist/server/store.d.ts +170 -0
- package/dist/server/types.d.ts +337 -0
- package/dist/server/worker.d.ts +4 -0
- package/dist/storage.js +39 -2
- package/docs/skill-standard.md +211 -39
- package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
- package/migrations/postgres/0004_hosted_pins.sql +28 -0
- package/migrations/postgres/0005_revision_tombstone_registry.sql +37 -0
- package/migrations/postgres/0005_tag_projection.sql +36 -0
- package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
- package/migrations/sqlite/0004_hosted_pins.sql +21 -0
- package/migrations/sqlite/0005_revision_tombstone_registry.sql +18 -0
- package/migrations/sqlite/0005_tag_projection.sql +25 -0
- package/package.json +12 -8
- package/schemas/skill.schema.json +181 -0
- package/agent-skills/README.md +0 -41
- package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
- package/agent-skills/inbox/SKILL.md +0 -25
- package/agent-skills/inbox/scripts/inbox +0 -109
- package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
- package/agent-skills/inbox-monitor/SKILL.md +0 -41
- package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
- package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
- package/agent-skills/merge-pr/SKILL.md +0 -85
- package/agent-skills/merge-pr/references/merge-safety.md +0 -82
- package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
- package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
- package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
- package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
- package/agent-skills/skill-goal-execute/SKILL.md +0 -115
- package/agent-skills/skill-login/SKILL.md +0 -109
- package/agent-skills/skill-project-create/SKILL.md +0 -91
- package/agent-skills/skill-publish/SKILL.md +0 -254
- package/agent-skills/skill-publish/scripts/capture_registry.js +0 -47
- package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +0 -143
- package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +0 -231
- package/skills/_common/auth.ts +0 -45
- package/skills/_common/http-client.ts +0 -143
- package/skills/_common/index.ts +0 -26
- package/skills/_common/install.sh +0 -7
- package/skills/_common/installer.ts +0 -72
- package/skills/_common/skill-install.ts +0 -37
- package/skills/_common/vision.ts +0 -374
- package/skills/ad-creative-pack/SKILL.md +0 -55
- package/skills/ad-creative-pack/package.json +0 -10
- package/skills/analyze-data/CLAUDE.md +0 -16
- package/skills/analyze-data/SKILL.md +0 -112
- package/skills/analyze-data/package.json +0 -23
- package/skills/analyze-data/src/analysis.ts +0 -401
- package/skills/analyze-data/src/cli.ts +0 -66
- package/skills/analyze-data/src/formatters.ts +0 -235
- package/skills/analyze-data/src/index.ts +0 -74
- package/skills/analyze-data/src/logger.ts +0 -36
- package/skills/analyze-data/src/parsers.ts +0 -57
- package/skills/analyze-data/src/stats.ts +0 -151
- package/skills/analyze-data/src/types.ts +0 -85
- package/skills/analyze-data/tsconfig.json +0 -19
- package/skills/api-docs-portal/SKILL.md +0 -84
- package/skills/api-docs-portal/package.json +0 -35
- package/skills/api-docs-portal/src/index.ts +0 -919
- package/skills/api-docs-portal/tsconfig.json +0 -17
- package/skills/api-test-suite/CLAUDE.md +0 -19
- package/skills/api-test-suite/package.json +0 -27
- package/skills/api-test-suite/src/index.ts +0 -381
- package/skills/api-test-suite/tsconfig.json +0 -10
- package/skills/audio-extract/CLAUDE.md +0 -9
- package/skills/audio-extract/SKILL.md +0 -73
- package/skills/audio-extract/package.json +0 -23
- package/skills/audio-extract/src/index.ts +0 -323
- package/skills/audio-extract/tsconfig.json +0 -11
- package/skills/bio-sequence-tool/CLAUDE.md +0 -19
- package/skills/bio-sequence-tool/package.json +0 -27
- package/skills/bio-sequence-tool/src/index.ts +0 -85
- package/skills/bio-sequence-tool/tsconfig.json +0 -10
- package/skills/blog-article/CLAUDE.md +0 -12
- package/skills/blog-article/SKILL.md +0 -55
- package/skills/blog-article/package.json +0 -10
- package/skills/blog-article/tsconfig.json +0 -10
- package/skills/brand-assets/SKILL.md +0 -118
- package/skills/brand-assets/package.json +0 -35
- package/skills/brand-assets/src/cli.ts +0 -155
- package/skills/brand-assets/src/constants.ts +0 -8
- package/skills/brand-assets/src/extract.ts +0 -236
- package/skills/brand-assets/src/index.ts +0 -668
- package/skills/brand-assets/src/types.ts +0 -59
- package/skills/brand-assets/tsconfig.json +0 -17
- package/skills/brand-kit/SKILL.md +0 -54
- package/skills/brand-kit/package.json +0 -10
- package/skills/businessactivity/CLAUDE.md +0 -176
- package/skills/businessactivity/LICENSE +0 -192
- package/skills/businessactivity/README.md +0 -287
- package/skills/businessactivity/package.json +0 -25
- package/skills/businessactivity/scripts/publish.ts +0 -210
- package/skills/businessactivity/src/commands/activity.ts +0 -211
- package/skills/businessactivity/src/commands/function.ts +0 -227
- package/skills/businessactivity/src/commands/owner.ts +0 -193
- package/skills/businessactivity/src/commands/profile.ts +0 -121
- package/skills/businessactivity/src/commands/responsibility.ts +0 -264
- package/skills/businessactivity/src/commands/team.ts +0 -244
- package/skills/businessactivity/src/commands/workflow.ts +0 -359
- package/skills/businessactivity/src/index.ts +0 -3
- package/skills/businessactivity/src/lib/config.ts +0 -167
- package/skills/businessactivity/src/lib/output.ts +0 -76
- package/skills/businessactivity/src/lib/paths.ts +0 -79
- package/skills/businessactivity/src/lib/storage.ts +0 -95
- package/skills/businessactivity/src/types/index.ts +0 -86
- package/skills/businessactivity/tsconfig.json +0 -29
- package/skills/codefix/LICENSE +0 -192
- package/skills/codefix/README.md +0 -232
- package/skills/codefix/SKILL.md +0 -94
- package/skills/codefix/package.json +0 -21
- package/skills/codefix/src/fixers/batch.ts +0 -213
- package/skills/codefix/src/fixers/detector.ts +0 -160
- package/skills/codefix/src/fixers/index.ts +0 -7
- package/skills/codefix/src/fixers/runner.ts +0 -522
- package/skills/codefix/src/index-local.ts +0 -431
- package/skills/codefix/src/index.ts +0 -4
- package/skills/codefix/src/types.ts +0 -211
- package/skills/codefix/tsconfig.json +0 -15
- package/skills/commitpush/SKILL.md +0 -57
- package/skills/commitpush/package.json +0 -33
- package/skills/commitpush/src/index.ts +0 -34
- package/skills/commitpush/tsconfig.json +0 -17
- package/skills/commitpushpr/SKILL.md +0 -55
- package/skills/commitpushpr/package.json +0 -33
- package/skills/commitpushpr/src/index.ts +0 -34
- package/skills/commitpushpr/tsconfig.json +0 -17
- package/skills/compress-video/CLAUDE.md +0 -9
- package/skills/compress-video/SKILL.md +0 -79
- package/skills/compress-video/package.json +0 -23
- package/skills/compress-video/src/index.ts +0 -473
- package/skills/compress-video/tsconfig.json +0 -11
- package/skills/contract-review-report/SKILL.md +0 -52
- package/skills/contract-review-report/package.json +0 -10
- package/skills/customer-feedback-report/SKILL.md +0 -52
- package/skills/customer-feedback-report/package.json +0 -10
- package/skills/dashboard-builder/CLAUDE.md +0 -19
- package/skills/dashboard-builder/package.json +0 -29
- package/skills/dashboard-builder/src/index.ts +0 -150
- package/skills/dashboard-builder/tsconfig.json +0 -10
- package/skills/data-anonymizer/CLAUDE.md +0 -19
- package/skills/data-anonymizer/package.json +0 -27
- package/skills/data-anonymizer/src/index.ts +0 -183
- package/skills/data-anonymizer/tsconfig.json +0 -10
- package/skills/database-explorer/CLAUDE.md +0 -19
- package/skills/database-explorer/package.json +0 -29
- package/skills/database-explorer/src/index.ts +0 -95
- package/skills/database-explorer/tsconfig.json +0 -10
- package/skills/diff-viewer/CLAUDE.md +0 -19
- package/skills/diff-viewer/package.json +0 -30
- package/skills/diff-viewer/src/index.ts +0 -164
- package/skills/diff-viewer/tsconfig.json +0 -10
- package/skills/doc-read/SKILL.md +0 -45
- package/skills/doc-read/package.json +0 -29
- package/skills/doc-read/src/index.ts +0 -324
- package/skills/doc-read/tsconfig.json +0 -8
- package/skills/domainpurchase/LICENSE +0 -192
- package/skills/domainpurchase/SKILL.md +0 -29
- package/skills/domainpurchase/package.json +0 -30
- package/skills/domainpurchase/src/index.ts +0 -3
- package/skills/domainpurchase/tsconfig.json +0 -21
- package/skills/email-sequence/SKILL.md +0 -53
- package/skills/email-sequence/package.json +0 -10
- package/skills/experiment-power-calculator/CLAUDE.md +0 -19
- package/skills/experiment-power-calculator/package.json +0 -29
- package/skills/experiment-power-calculator/src/index.ts +0 -86
- package/skills/experiment-power-calculator/tsconfig.json +0 -10
- package/skills/extract-frames/CLAUDE.md +0 -19
- package/skills/extract-frames/package.json +0 -27
- package/skills/extract-frames/src/index.ts +0 -616
- package/skills/extract-frames/tsconfig.json +0 -10
- package/skills/file-organizer/CLAUDE.md +0 -19
- package/skills/file-organizer/package.json +0 -27
- package/skills/file-organizer/src/index.ts +0 -91
- package/skills/file-organizer/tsconfig.json +0 -10
- package/skills/folder-tree/CLAUDE.md +0 -19
- package/skills/folder-tree/package.json +0 -29
- package/skills/folder-tree/src/index.ts +0 -568
- package/skills/folder-tree/tsconfig.json +0 -10
- package/skills/form-filler/CLAUDE.md +0 -19
- package/skills/form-filler/package.json +0 -29
- package/skills/form-filler/src/index.ts +0 -81
- package/skills/form-filler/tsconfig.json +0 -10
- package/skills/generate-api-client/CLAUDE.md +0 -19
- package/skills/generate-api-client/package.json +0 -29
- package/skills/generate-api-client/src/generator.ts +0 -47
- package/skills/generate-api-client/src/index.ts +0 -92
- package/skills/generate-api-client/src/logger.ts +0 -34
- package/skills/generate-api-client/src/python-generator.ts +0 -245
- package/skills/generate-api-client/src/spec-loader.ts +0 -48
- package/skills/generate-api-client/src/type-mappers.ts +0 -79
- package/skills/generate-api-client/src/types.ts +0 -76
- package/skills/generate-api-client/src/typescript-generator.ts +0 -247
- package/skills/generate-api-client/tsconfig.json +0 -10
- package/skills/generate-chart/CLAUDE.md +0 -19
- package/skills/generate-chart/package.json +0 -27
- package/skills/generate-chart/src/index.ts +0 -510
- package/skills/generate-chart/tsconfig.json +0 -10
- package/skills/generate-dockerfile/CLAUDE.md +0 -19
- package/skills/generate-dockerfile/package.json +0 -27
- package/skills/generate-dockerfile/src/cli.ts +0 -78
- package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
- package/skills/generate-dockerfile/src/index.ts +0 -81
- package/skills/generate-dockerfile/src/logger.ts +0 -30
- package/skills/generate-dockerfile/src/project-detection.ts +0 -68
- package/skills/generate-dockerfile/src/support-files.ts +0 -171
- package/skills/generate-dockerfile/src/types.ts +0 -29
- package/skills/generate-dockerfile/tsconfig.json +0 -10
- package/skills/generate-env/CLAUDE.md +0 -19
- package/skills/generate-env/package.json +0 -29
- package/skills/generate-env/src/cli.ts +0 -85
- package/skills/generate-env/src/detection.ts +0 -161
- package/skills/generate-env/src/env-data.ts +0 -66
- package/skills/generate-env/src/generators.ts +0 -240
- package/skills/generate-env/src/index.ts +0 -120
- package/skills/generate-env/src/runtime.ts +0 -30
- package/skills/generate-env/src/types.ts +0 -32
- package/skills/generate-env/tsconfig.json +0 -10
- package/skills/generate-favicon/CLAUDE.md +0 -19
- package/skills/generate-favicon/package.json +0 -29
- package/skills/generate-favicon/src/index.ts +0 -421
- package/skills/generate-favicon/tsconfig.json +0 -10
- package/skills/generate-qrcode/CLAUDE.md +0 -19
- package/skills/generate-qrcode/package.json +0 -30
- package/skills/generate-qrcode/src/index.ts +0 -584
- package/skills/generate-qrcode/tsconfig.json +0 -10
- package/skills/generate-resume/CLAUDE.md +0 -19
- package/skills/generate-resume/package.json +0 -27
- package/skills/generate-resume/src/cli.ts +0 -157
- package/skills/generate-resume/src/index.ts +0 -178
- package/skills/generate-resume/src/parsers.ts +0 -95
- package/skills/generate-resume/src/renderers.ts +0 -538
- package/skills/generate-resume/src/security.ts +0 -39
- package/skills/generate-resume/src/types.ts +0 -86
- package/skills/generate-resume/tsconfig.json +0 -10
- package/skills/generate-sitemap/CLAUDE.md +0 -19
- package/skills/generate-sitemap/package.json +0 -27
- package/skills/generate-sitemap/src/index.ts +0 -626
- package/skills/generate-sitemap/tsconfig.json +0 -10
- package/skills/gif-maker/CLAUDE.md +0 -19
- package/skills/gif-maker/package.json +0 -30
- package/skills/gif-maker/src/index.ts +0 -600
- package/skills/gif-maker/tsconfig.json +0 -10
- package/skills/hook/LICENSE +0 -192
- package/skills/hook/README.md +0 -74
- package/skills/hook/SKILL.md +0 -85
- package/skills/hook/bunfig.toml +0 -5
- package/skills/hook/package.json +0 -28
- package/skills/hook/src/commands/create.ts +0 -112
- package/skills/hook/src/commands/events.ts +0 -37
- package/skills/hook/src/commands/validate.ts +0 -117
- package/skills/hook/src/index.ts +0 -118
- package/skills/hook/src/templates/root.ts +0 -196
- package/skills/hook/src/templates/source.ts +0 -647
- package/skills/hook/tsconfig.json +0 -18
- package/skills/http-server/CLAUDE.md +0 -19
- package/skills/http-server/package.json +0 -29
- package/skills/http-server/src/index.ts +0 -51
- package/skills/http-server/tsconfig.json +0 -10
- package/skills/implementation/LICENSE +0 -192
- package/skills/implementation/README.md +0 -53
- package/skills/implementation/SKILL.md +0 -57
- package/skills/implementation/bunfig.toml +0 -5
- package/skills/implementation/package.json +0 -28
- package/skills/implementation/src/commands/create.ts +0 -187
- package/skills/implementation/src/index.ts +0 -62
- package/skills/implementation/tsconfig.json +0 -18
- package/skills/implementation-plan/CLAUDE.md +0 -19
- package/skills/implementation-plan/package.json +0 -29
- package/skills/implementation-plan/src/index.ts +0 -520
- package/skills/implementation-plan/tsconfig.json +0 -10
- package/skills/implementation-todo/CLAUDE.md +0 -19
- package/skills/implementation-todo/package.json +0 -29
- package/skills/implementation-todo/src/index.ts +0 -429
- package/skills/implementation-todo/tsconfig.json +0 -10
- package/skills/invoice/.env.example +0 -3
- package/skills/invoice/CLAUDE.md +0 -31
- package/skills/invoice/LICENSE +0 -192
- package/skills/invoice/README.md +0 -70
- package/skills/invoice/package.json +0 -26
- package/skills/invoice/src/commands/companies.ts +0 -202
- package/skills/invoice/src/commands/config.ts +0 -132
- package/skills/invoice/src/commands/generate.ts +0 -177
- package/skills/invoice/src/commands/invoices.ts +0 -218
- package/skills/invoice/src/index.ts +0 -3
- package/skills/invoice/src/lib/api.ts +0 -124
- package/skills/invoice/src/lib/storage.ts +0 -171
- package/skills/invoice/src/types/index.ts +0 -86
- package/skills/invoice/src/utils/logger.ts +0 -33
- package/skills/invoice/src/utils/paths.ts +0 -25
- package/skills/invoice/tsconfig.json +0 -23
- package/skills/invoice-reconciliation/SKILL.md +0 -98
- package/skills/invoice-reconciliation/package.json +0 -36
- package/skills/invoice-reconciliation/src/index.ts +0 -743
- package/skills/invoice-reconciliation/tsconfig.json +0 -17
- package/skills/landing-page-pack/SKILL.md +0 -55
- package/skills/landing-page-pack/package.json +0 -10
- package/skills/latex-table-generator/CLAUDE.md +0 -19
- package/skills/latex-table-generator/package.json +0 -29
- package/skills/latex-table-generator/src/index.ts +0 -113
- package/skills/latex-table-generator/tsconfig.json +0 -10
- package/skills/logo-design/SKILL.md +0 -94
- package/skills/logo-design/package.json +0 -35
- package/skills/logo-design/src/cli.ts +0 -132
- package/skills/logo-design/src/constants.ts +0 -5
- package/skills/logo-design/src/docs.ts +0 -102
- package/skills/logo-design/src/geometry.ts +0 -324
- package/skills/logo-design/src/index.ts +0 -212
- package/skills/logo-design/src/palette.ts +0 -258
- package/skills/logo-design/src/types.ts +0 -50
- package/skills/logo-design/tsconfig.json +0 -17
- package/skills/lorem-generator/CLAUDE.md +0 -19
- package/skills/lorem-generator/package.json +0 -29
- package/skills/lorem-generator/src/index.ts +0 -59
- package/skills/lorem-generator/tsconfig.json +0 -10
- package/skills/managemcp/CLAUDE.md +0 -14
- package/skills/managemcp/README.md +0 -24
- package/skills/managemcp/package.json +0 -16
- package/skills/managemcp/src/index.ts +0 -3
- package/skills/managemcp/tsconfig.json +0 -27
- package/skills/markdown-validator/CLAUDE.md +0 -19
- package/skills/markdown-validator/package.json +0 -29
- package/skills/markdown-validator/src/index.ts +0 -92
- package/skills/markdown-validator/tsconfig.json +0 -10
- package/skills/market-research-report/SKILL.md +0 -51
- package/skills/market-research-report/package.json +0 -10
- package/skills/meeting-pack/SKILL.md +0 -52
- package/skills/meeting-pack/package.json +0 -10
- package/skills/merge-pdfs/CLAUDE.md +0 -19
- package/skills/merge-pdfs/package.json +0 -31
- package/skills/merge-pdfs/src/index.ts +0 -427
- package/skills/merge-pdfs/tsconfig.json +0 -10
- package/skills/migration-plan-pack/SKILL.md +0 -56
- package/skills/migration-plan-pack/package.json +0 -10
- package/skills/monitor/SKILL.md +0 -69
- package/skills/monitor/package.json +0 -33
- package/skills/monitor/src/index.ts +0 -34
- package/skills/monitor/tsconfig.json +0 -17
- package/skills/one-page-website/SKILL.md +0 -128
- package/skills/one-page-website/package.json +0 -34
- package/skills/one-page-website/src/design.ts +0 -336
- package/skills/one-page-website/src/docs.ts +0 -159
- package/skills/one-page-website/src/index.ts +0 -357
- package/skills/one-page-website/src/page.ts +0 -340
- package/skills/one-page-website/src/styles.ts +0 -508
- package/skills/one-page-website/src/types.ts +0 -78
- package/skills/one-page-website/tsconfig.json +0 -17
- package/skills/pdf-generate/CLAUDE.md +0 -19
- package/skills/pdf-generate/SKILL.md +0 -86
- package/skills/pdf-generate/package.json +0 -21
- package/skills/pdf-generate/src/cli.ts +0 -162
- package/skills/pdf-generate/src/html.ts +0 -84
- package/skills/pdf-generate/src/index.ts +0 -62
- package/skills/pdf-generate/src/markdown.ts +0 -27
- package/skills/pdf-generate/src/pdf-writer.ts +0 -78
- package/skills/pdf-generate/src/runtime.ts +0 -34
- package/skills/pdf-generate/src/security.ts +0 -37
- package/skills/pdf-generate/src/templates.ts +0 -311
- package/skills/pdf-generate/src/types.ts +0 -28
- package/skills/pdf-generate/tsconfig.json +0 -16
- package/skills/pdf-to-dataset/SKILL.md +0 -88
- package/skills/pdf-to-dataset/package.json +0 -37
- package/skills/pdf-to-dataset/src/index.ts +0 -790
- package/skills/pdf-to-dataset/tsconfig.json +0 -17
- package/skills/pdf-to-markdown/SKILL.md +0 -81
- package/skills/pdf-to-markdown/package.json +0 -35
- package/skills/pdf-to-markdown/src/index.ts +0 -694
- package/skills/pdf-to-markdown/tsconfig.json +0 -17
- package/skills/performance-audit-report/SKILL.md +0 -49
- package/skills/performance-audit-report/package.json +0 -10
- package/skills/pitch-deck/SKILL.md +0 -51
- package/skills/pitch-deck/package.json +0 -10
- package/skills/product-mockup/SKILL.md +0 -107
- package/skills/product-mockup/package.json +0 -32
- package/skills/product-mockup/src/cli.ts +0 -150
- package/skills/product-mockup/src/design.ts +0 -151
- package/skills/product-mockup/src/docs.ts +0 -134
- package/skills/product-mockup/src/index.ts +0 -182
- package/skills/product-mockup/src/render.ts +0 -407
- package/skills/product-mockup/src/types.ts +0 -66
- package/skills/product-mockup/tsconfig.json +0 -17
- package/skills/proposal-pack/SKILL.md +0 -53
- package/skills/proposal-pack/package.json +0 -10
- package/skills/read-csv/SKILL.md +0 -62
- package/skills/read-csv/package.json +0 -37
- package/skills/read-csv/src/index.ts +0 -356
- package/skills/read-csv/tsconfig.json +0 -17
- package/skills/read-excel/SKILL.md +0 -64
- package/skills/read-excel/package.json +0 -36
- package/skills/read-excel/src/index.ts +0 -266
- package/skills/read-excel/tsconfig.json +0 -17
- package/skills/regex-tester/CLAUDE.md +0 -19
- package/skills/regex-tester/package.json +0 -27
- package/skills/regex-tester/src/index.ts +0 -183
- package/skills/regex-tester/tsconfig.json +0 -10
- package/skills/repo-onboarding-report/SKILL.md +0 -52
- package/skills/repo-onboarding-report/package.json +0 -10
- package/skills/scancommitpr/SKILL.md +0 -178
- package/skills/scancommitpr/package.json +0 -34
- package/skills/scancommitpr/src/index.ts +0 -44
- package/skills/scancommitpr/tsconfig.json +0 -13
- package/skills/scancommitpush/SKILL.md +0 -174
- package/skills/scancommitpush/package.json +0 -32
- package/skills/scancommitpush/src/index.ts +0 -44
- package/skills/scancommitpush/tsconfig.json +0 -13
- package/skills/scientific-figure-check/CLAUDE.md +0 -19
- package/skills/scientific-figure-check/package.json +0 -29
- package/skills/scientific-figure-check/src/index.ts +0 -83
- package/skills/scientific-figure-check/tsconfig.json +0 -10
- package/skills/security-audit/CLAUDE.md +0 -19
- package/skills/security-audit/package.json +0 -27
- package/skills/security-audit/src/index.ts +0 -145
- package/skills/security-audit/tsconfig.json +0 -10
- package/skills/security-audit-report/SKILL.md +0 -52
- package/skills/security-audit-report/package.json +0 -10
- package/skills/seo-content-pack/SKILL.md +0 -54
- package/skills/seo-content-pack/package.json +0 -10
- package/skills/siteanalyze/SKILL.md +0 -25
- package/skills/siteanalyze/package.json +0 -27
- package/skills/siteanalyze/src/index.ts +0 -592
- package/skills/slide-deck-generator/SKILL.md +0 -93
- package/skills/slide-deck-generator/package.json +0 -38
- package/skills/slide-deck-generator/src/cli.ts +0 -133
- package/skills/slide-deck-generator/src/index.ts +0 -148
- package/skills/slide-deck-generator/src/model.ts +0 -307
- package/skills/slide-deck-generator/src/pptx.ts +0 -143
- package/skills/slide-deck-generator/src/render.ts +0 -248
- package/skills/slide-deck-generator/src/types.ts +0 -114
- package/skills/slide-deck-generator/src/utils.ts +0 -53
- package/skills/slide-deck-generator/tsconfig.json +0 -17
- package/skills/social-content-calendar/SKILL.md +0 -54
- package/skills/social-content-calendar/package.json +0 -10
- package/skills/split-pdf/CLAUDE.md +0 -19
- package/skills/split-pdf/package.json +0 -30
- package/skills/split-pdf/src/index.ts +0 -301
- package/skills/split-pdf/tsconfig.json +0 -10
- package/skills/statistical-test-selector/CLAUDE.md +0 -19
- package/skills/statistical-test-selector/package.json +0 -27
- package/skills/statistical-test-selector/src/index.ts +0 -75
- package/skills/statistical-test-selector/tsconfig.json +0 -10
- package/skills/test-suite-generator/SKILL.md +0 -51
- package/skills/test-suite-generator/package.json +0 -10
- package/skills/tmux-session/SKILL.md +0 -109
- package/skills/tmux-session/package.json +0 -33
- package/skills/tmux-session/src/index.ts +0 -34
- package/skills/tmux-session/tsconfig.json +0 -17
- package/skills/todos-plan/SKILL.md +0 -363
- package/skills/todos-plan/agents/openai.yaml +0 -4
- package/skills/todos-plan/package.json +0 -9
- package/skills/todos-plan/src/index.ts +0 -68
- package/skills/tsconfig.base.json +0 -12
- package/skills/validate-config/CLAUDE.md +0 -19
- package/skills/validate-config/package.json +0 -29
- package/skills/validate-config/src/index.ts +0 -56
- package/skills/validate-config/tsconfig.json +0 -10
- package/skills/video-downloader/CLAUDE.md +0 -19
- package/skills/video-downloader/package.json +0 -29
- package/skills/video-downloader/src/index.ts +0 -561
- package/skills/video-downloader/tsconfig.json +0 -10
- package/skills/video-highlight-pack/SKILL.md +0 -54
- package/skills/video-highlight-pack/package.json +0 -10
- package/skills/watermark/CLAUDE.md +0 -19
- package/skills/watermark/package.json +0 -32
- package/skills/watermark/src/index.ts +0 -587
- package/skills/watermark/tsconfig.json +0 -10
|
@@ -1,592 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* siteanalyze — Analyze any website's design system via Playwright + AI Vision
|
|
4
|
-
* Supports multiple providers: anthropic, openai, xai, gemini
|
|
5
|
-
*/
|
|
6
|
-
import { writeFileSync, existsSync, mkdirSync } from "fs";
|
|
7
|
-
import { tmpdir } from "os";
|
|
8
|
-
import { join } from "path";
|
|
9
|
-
import {
|
|
10
|
-
analyzeImage,
|
|
11
|
-
detectProvider,
|
|
12
|
-
listAvailableProviders,
|
|
13
|
-
parseJsonResponse,
|
|
14
|
-
type VisionProvider,
|
|
15
|
-
} from "../../_common/vision.js";
|
|
16
|
-
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Types
|
|
19
|
-
// ============================================================================
|
|
20
|
-
|
|
21
|
-
export interface DesignColors {
|
|
22
|
-
primary?: string;
|
|
23
|
-
secondary?: string;
|
|
24
|
-
accent?: string;
|
|
25
|
-
background?: string;
|
|
26
|
-
text?: string;
|
|
27
|
-
border?: string;
|
|
28
|
-
muted?: string;
|
|
29
|
-
[key: string]: string | undefined;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface TypographyScale {
|
|
33
|
-
fontFamilies: string[];
|
|
34
|
-
sizes: string[];
|
|
35
|
-
weights: string[];
|
|
36
|
-
lineHeights?: string[];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ComponentPattern {
|
|
40
|
-
name: string;
|
|
41
|
-
description: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface SiteAnalyzeResult {
|
|
45
|
-
url: string;
|
|
46
|
-
framework: string | null;
|
|
47
|
-
hasShadcn: boolean;
|
|
48
|
-
hasTailwind: boolean;
|
|
49
|
-
colors: DesignColors;
|
|
50
|
-
typography: TypographyScale;
|
|
51
|
-
components: ComponentPattern[];
|
|
52
|
-
provider: VisionProvider | null;
|
|
53
|
-
model: string | null;
|
|
54
|
-
openStylesProfile: {
|
|
55
|
-
name: string;
|
|
56
|
-
displayName: string;
|
|
57
|
-
category: string;
|
|
58
|
-
description: string;
|
|
59
|
-
colors: Record<string, string>;
|
|
60
|
-
typography: TypographyScale;
|
|
61
|
-
framework: string | null;
|
|
62
|
-
tags: string[];
|
|
63
|
-
};
|
|
64
|
-
screenshotPath?: string;
|
|
65
|
-
rawAnalysis?: string;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// ============================================================================
|
|
69
|
-
// HTML/CSS analysis (quick mode — no browser needed)
|
|
70
|
-
// ============================================================================
|
|
71
|
-
|
|
72
|
-
async function fetchPageSource(url: string): Promise<string> {
|
|
73
|
-
const response = await fetch(url, {
|
|
74
|
-
headers: {
|
|
75
|
-
"User-Agent":
|
|
76
|
-
"Mozilla/5.0 (compatible; siteanalyze/1.0; +https://github.com/hasna/skills)",
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
if (!response.ok) {
|
|
80
|
-
throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);
|
|
81
|
-
}
|
|
82
|
-
return response.text();
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function detectFrameworkFromHtml(html: string): {
|
|
86
|
-
hasShadcn: boolean;
|
|
87
|
-
hasTailwind: boolean;
|
|
88
|
-
framework: string | null;
|
|
89
|
-
} {
|
|
90
|
-
const lower = html.toLowerCase();
|
|
91
|
-
const hasShadcn =
|
|
92
|
-
lower.includes("shadcn") ||
|
|
93
|
-
lower.includes("@radix-ui") ||
|
|
94
|
-
lower.includes("radix-ui") ||
|
|
95
|
-
lower.includes("cmdk") ||
|
|
96
|
-
lower.includes("data-radix");
|
|
97
|
-
const hasTailwind =
|
|
98
|
-
lower.includes("tailwind") ||
|
|
99
|
-
lower.includes("tw-") ||
|
|
100
|
-
/class="[^"]*\b(flex|grid|p-\d|m-\d|text-\w+|bg-\w+|border-\w+)\b/.test(html);
|
|
101
|
-
|
|
102
|
-
let framework: string | null = null;
|
|
103
|
-
if (hasShadcn) {
|
|
104
|
-
framework = "shadcn/ui";
|
|
105
|
-
} else if (lower.includes("mui") || lower.includes("material-ui")) {
|
|
106
|
-
framework = "Material UI";
|
|
107
|
-
} else if (lower.includes("chakra")) {
|
|
108
|
-
framework = "Chakra UI";
|
|
109
|
-
} else if (lower.includes("mantine")) {
|
|
110
|
-
framework = "Mantine";
|
|
111
|
-
} else if (lower.includes("antd") || lower.includes("ant-design")) {
|
|
112
|
-
framework = "Ant Design";
|
|
113
|
-
} else if (lower.includes("bootstrap")) {
|
|
114
|
-
framework = "Bootstrap";
|
|
115
|
-
} else if (hasTailwind) {
|
|
116
|
-
framework = "Tailwind CSS";
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return { hasShadcn, hasTailwind, framework };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function extractColorsFromCss(html: string): DesignColors {
|
|
123
|
-
const colors: DesignColors = {};
|
|
124
|
-
const hexPattern = /#([0-9A-Fa-f]{3,8})\b/g;
|
|
125
|
-
const cssVarPattern = /--[\w-]+:\s*(#[0-9A-Fa-f]{3,8}|rgba?\([^)]+\)|hsla?\([^)]+\))/g;
|
|
126
|
-
|
|
127
|
-
// Try to extract CSS custom properties (most reliable)
|
|
128
|
-
const varMatches = [...html.matchAll(cssVarPattern)].slice(0, 20);
|
|
129
|
-
if (varMatches.length > 0) {
|
|
130
|
-
for (const match of varMatches) {
|
|
131
|
-
const varName = match[0].split(":")[0].trim();
|
|
132
|
-
const value = match[1].trim();
|
|
133
|
-
if (varName.includes("primary")) colors.primary = value;
|
|
134
|
-
else if (varName.includes("secondary")) colors.secondary = value;
|
|
135
|
-
else if (varName.includes("accent")) colors.accent = value;
|
|
136
|
-
else if (varName.includes("background") || varName.includes("bg")) colors.background = value;
|
|
137
|
-
else if (varName.includes("foreground") || varName.includes("text")) colors.text = value;
|
|
138
|
-
else if (varName.includes("border")) colors.border = value;
|
|
139
|
-
else if (varName.includes("muted")) colors.muted = value;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Fall back to raw hex extraction from inline styles
|
|
144
|
-
if (Object.keys(colors).length === 0) {
|
|
145
|
-
const hexMatches = [...html.matchAll(hexPattern)].map((m) => m[0]);
|
|
146
|
-
const unique = [...new Set(hexMatches)].slice(0, 5);
|
|
147
|
-
if (unique[0]) colors.primary = unique[0];
|
|
148
|
-
if (unique[1]) colors.secondary = unique[1];
|
|
149
|
-
if (unique[2]) colors.accent = unique[2];
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return colors;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// ============================================================================
|
|
156
|
-
// Vision-based analysis
|
|
157
|
-
// ============================================================================
|
|
158
|
-
|
|
159
|
-
async function captureScreenshot(url: string): Promise<string | null> {
|
|
160
|
-
// Try to use playwright if available
|
|
161
|
-
try {
|
|
162
|
-
// Dynamic import so the skill works without playwright installed
|
|
163
|
-
const { chromium } = await import("playwright" as never) as {
|
|
164
|
-
chromium: {
|
|
165
|
-
launch: (opts?: Record<string, unknown>) => Promise<{
|
|
166
|
-
newPage: () => Promise<{
|
|
167
|
-
goto: (url: string, opts?: Record<string, unknown>) => Promise<unknown>;
|
|
168
|
-
screenshot: (opts?: Record<string, unknown>) => Promise<Buffer>;
|
|
169
|
-
close: () => Promise<void>;
|
|
170
|
-
}>;
|
|
171
|
-
close: () => Promise<void>;
|
|
172
|
-
}>;
|
|
173
|
-
};
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
const tmpDir = join(tmpdir(), "siteanalyze");
|
|
177
|
-
if (!existsSync(tmpDir)) {
|
|
178
|
-
mkdirSync(tmpDir, { recursive: true });
|
|
179
|
-
}
|
|
180
|
-
const screenshotPath = join(tmpDir, `screenshot-${Date.now()}.png`);
|
|
181
|
-
|
|
182
|
-
const browser = await chromium.launch({ headless: true });
|
|
183
|
-
const page = await browser.newPage();
|
|
184
|
-
await page.goto(url, { waitUntil: "networkidle", timeout: 30000 });
|
|
185
|
-
const buffer = await page.screenshot({ path: screenshotPath, fullPage: false });
|
|
186
|
-
await page.close();
|
|
187
|
-
await browser.close();
|
|
188
|
-
|
|
189
|
-
return screenshotPath;
|
|
190
|
-
} catch {
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async function analyzeScreenshot(
|
|
196
|
-
screenshotPath: string,
|
|
197
|
-
url: string,
|
|
198
|
-
options: { provider?: VisionProvider; model?: string }
|
|
199
|
-
): Promise<{
|
|
200
|
-
colors: DesignColors;
|
|
201
|
-
typography: TypographyScale;
|
|
202
|
-
components: ComponentPattern[];
|
|
203
|
-
styleCategory: string;
|
|
204
|
-
description: string;
|
|
205
|
-
rawAnalysis: string;
|
|
206
|
-
provider: VisionProvider;
|
|
207
|
-
model: string;
|
|
208
|
-
}> {
|
|
209
|
-
const { readFileSync } = await import("fs");
|
|
210
|
-
const imageBase64 = readFileSync(screenshotPath).toString("base64");
|
|
211
|
-
|
|
212
|
-
const prompt = `Analyze this website screenshot from ${url}.
|
|
213
|
-
|
|
214
|
-
Extract:
|
|
215
|
-
1. Color palette — primary, secondary, accent, background, text, border, muted colors (hex values)
|
|
216
|
-
2. Typography — font families used, size scale, font weights
|
|
217
|
-
3. UI components — list the main component patterns you see (buttons, cards, nav, etc.)
|
|
218
|
-
4. Design style category (minimalist/corporate/startup/editorial/material/glassmorphism/brutalist/neubrutalism)
|
|
219
|
-
5. Brief description of the overall design system
|
|
220
|
-
|
|
221
|
-
Respond ONLY with valid JSON:
|
|
222
|
-
{
|
|
223
|
-
"colors": {
|
|
224
|
-
"primary": "#...",
|
|
225
|
-
"secondary": "#...",
|
|
226
|
-
"accent": "#...",
|
|
227
|
-
"background": "#...",
|
|
228
|
-
"text": "#...",
|
|
229
|
-
"border": "#...",
|
|
230
|
-
"muted": "#..."
|
|
231
|
-
},
|
|
232
|
-
"typography": {
|
|
233
|
-
"fontFamilies": ["..."],
|
|
234
|
-
"sizes": ["xs", "sm", "base", "lg", "xl", "2xl"],
|
|
235
|
-
"weights": ["400", "500", "600", "700"]
|
|
236
|
-
},
|
|
237
|
-
"components": [
|
|
238
|
-
{ "name": "Button", "description": "Rounded pill buttons with primary color fill" }
|
|
239
|
-
],
|
|
240
|
-
"styleCategory": "minimalist",
|
|
241
|
-
"description": "..."
|
|
242
|
-
}`;
|
|
243
|
-
|
|
244
|
-
const result = await analyzeImage(imageBase64, "image/png", prompt, {
|
|
245
|
-
provider: options.provider,
|
|
246
|
-
model: options.model,
|
|
247
|
-
jsonMode: true,
|
|
248
|
-
maxTokens: 2048,
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
const parsed = parseJsonResponse(result.text) as {
|
|
252
|
-
colors: DesignColors;
|
|
253
|
-
typography: TypographyScale;
|
|
254
|
-
components: ComponentPattern[];
|
|
255
|
-
styleCategory: string;
|
|
256
|
-
description: string;
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
return {
|
|
260
|
-
colors: parsed.colors ?? {},
|
|
261
|
-
typography: parsed.typography ?? { fontFamilies: [], sizes: [], weights: [] },
|
|
262
|
-
components: parsed.components ?? [],
|
|
263
|
-
styleCategory: parsed.styleCategory ?? "unknown",
|
|
264
|
-
description: parsed.description ?? "",
|
|
265
|
-
rawAnalysis: result.text,
|
|
266
|
-
provider: result.provider,
|
|
267
|
-
model: result.model,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// ============================================================================
|
|
272
|
-
// Core analysis function
|
|
273
|
-
// ============================================================================
|
|
274
|
-
|
|
275
|
-
export async function analyzeSite(
|
|
276
|
-
url: string,
|
|
277
|
-
options?: {
|
|
278
|
-
provider?: VisionProvider;
|
|
279
|
-
model?: string;
|
|
280
|
-
quickMode?: boolean; // skip screenshot/vision — HTML analysis only
|
|
281
|
-
}
|
|
282
|
-
): Promise<SiteAnalyzeResult> {
|
|
283
|
-
// Fetch HTML for framework/color detection
|
|
284
|
-
const html = await fetchPageSource(url);
|
|
285
|
-
const { hasShadcn, hasTailwind, framework } = detectFrameworkFromHtml(html);
|
|
286
|
-
const quickColors = extractColorsFromCss(html);
|
|
287
|
-
|
|
288
|
-
const availableProviders = listAvailableProviders();
|
|
289
|
-
const useVision = !options?.quickMode && availableProviders.length > 0;
|
|
290
|
-
|
|
291
|
-
if (!useVision) {
|
|
292
|
-
// Quick mode or no provider available — return HTML analysis only
|
|
293
|
-
return {
|
|
294
|
-
url,
|
|
295
|
-
framework,
|
|
296
|
-
hasShadcn,
|
|
297
|
-
hasTailwind,
|
|
298
|
-
colors: quickColors,
|
|
299
|
-
typography: { fontFamilies: [], sizes: [], weights: [] },
|
|
300
|
-
components: [],
|
|
301
|
-
provider: null,
|
|
302
|
-
model: null,
|
|
303
|
-
openStylesProfile: {
|
|
304
|
-
name: `site-${Date.now()}`,
|
|
305
|
-
displayName: url,
|
|
306
|
-
category: framework ?? "Unknown",
|
|
307
|
-
description: `Design system extracted from ${url} (HTML analysis only)`,
|
|
308
|
-
colors: quickColors as Record<string, string>,
|
|
309
|
-
typography: { fontFamilies: [], sizes: [], weights: [] },
|
|
310
|
-
framework,
|
|
311
|
-
tags: [
|
|
312
|
-
"extracted",
|
|
313
|
-
"auto-generated",
|
|
314
|
-
...(hasShadcn ? ["shadcn"] : []),
|
|
315
|
-
...(hasTailwind ? ["tailwind"] : []),
|
|
316
|
-
],
|
|
317
|
-
},
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// Vision-based analysis
|
|
322
|
-
const screenshotPath = await captureScreenshot(url);
|
|
323
|
-
let visionResult: Awaited<ReturnType<typeof analyzeScreenshot>> | null = null;
|
|
324
|
-
|
|
325
|
-
if (screenshotPath) {
|
|
326
|
-
visionResult = await analyzeScreenshot(screenshotPath, url, {
|
|
327
|
-
provider: options?.provider,
|
|
328
|
-
model: options?.model,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
const colors = visionResult?.colors ?? quickColors;
|
|
333
|
-
const typography = visionResult?.typography ?? { fontFamilies: [], sizes: [], weights: [] };
|
|
334
|
-
const components = visionResult?.components ?? [];
|
|
335
|
-
const styleCategory = visionResult?.styleCategory ?? framework ?? "Unknown";
|
|
336
|
-
const description =
|
|
337
|
-
visionResult?.description ??
|
|
338
|
-
`Design system extracted from ${url}`;
|
|
339
|
-
|
|
340
|
-
return {
|
|
341
|
-
url,
|
|
342
|
-
framework,
|
|
343
|
-
hasShadcn,
|
|
344
|
-
hasTailwind,
|
|
345
|
-
colors,
|
|
346
|
-
typography,
|
|
347
|
-
components,
|
|
348
|
-
provider: visionResult?.provider ?? null,
|
|
349
|
-
model: visionResult?.model ?? null,
|
|
350
|
-
screenshotPath: screenshotPath ?? undefined,
|
|
351
|
-
rawAnalysis: visionResult?.rawAnalysis,
|
|
352
|
-
openStylesProfile: {
|
|
353
|
-
name: `site-${Date.now()}`,
|
|
354
|
-
displayName: url,
|
|
355
|
-
category: styleCategory,
|
|
356
|
-
description,
|
|
357
|
-
colors: colors as Record<string, string>,
|
|
358
|
-
typography,
|
|
359
|
-
framework,
|
|
360
|
-
tags: [
|
|
361
|
-
"extracted",
|
|
362
|
-
"auto-generated",
|
|
363
|
-
...(hasShadcn ? ["shadcn"] : []),
|
|
364
|
-
...(hasTailwind ? ["tailwind"] : []),
|
|
365
|
-
],
|
|
366
|
-
},
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// ============================================================================
|
|
371
|
-
// CLI
|
|
372
|
-
// ============================================================================
|
|
373
|
-
|
|
374
|
-
type OutputFormat = "profile" | "colors" | "full";
|
|
375
|
-
|
|
376
|
-
interface CliOptions {
|
|
377
|
-
url: string | null;
|
|
378
|
-
format: OutputFormat;
|
|
379
|
-
output: string | null;
|
|
380
|
-
provider: VisionProvider | null;
|
|
381
|
-
model: string | null;
|
|
382
|
-
quickMode: boolean;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
function parseArgs(argv: string[]): { command: string; options: CliOptions } {
|
|
386
|
-
const args = argv.slice(2);
|
|
387
|
-
|
|
388
|
-
let command = "help";
|
|
389
|
-
const options: CliOptions = {
|
|
390
|
-
url: null,
|
|
391
|
-
format: "full",
|
|
392
|
-
output: null,
|
|
393
|
-
provider: null,
|
|
394
|
-
model: null,
|
|
395
|
-
quickMode: false,
|
|
396
|
-
};
|
|
397
|
-
|
|
398
|
-
if (args.length === 0) {
|
|
399
|
-
return { command: "help", options };
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
const firstArg = args[0];
|
|
403
|
-
if (firstArg === "analyze") {
|
|
404
|
-
command = "analyze";
|
|
405
|
-
} else if (
|
|
406
|
-
firstArg === "help" ||
|
|
407
|
-
firstArg === "--help" ||
|
|
408
|
-
firstArg === "-h"
|
|
409
|
-
) {
|
|
410
|
-
command = "help";
|
|
411
|
-
} else if (firstArg.startsWith("http://") || firstArg.startsWith("https://")) {
|
|
412
|
-
// Allow `siteanalyze <url>` shorthand
|
|
413
|
-
command = "analyze";
|
|
414
|
-
options.url = firstArg;
|
|
415
|
-
args.splice(0, 1);
|
|
416
|
-
// Re-parse remaining flags below (shift args[0] already used)
|
|
417
|
-
for (let i = 0; i < args.length; i++) {
|
|
418
|
-
const arg = args[i];
|
|
419
|
-
if ((arg === "--format" || arg === "-f") && args[i + 1]) {
|
|
420
|
-
const fmt = args[++i];
|
|
421
|
-
if (fmt === "profile" || fmt === "colors" || fmt === "full") {
|
|
422
|
-
options.format = fmt;
|
|
423
|
-
}
|
|
424
|
-
} else if ((arg === "--output" || arg === "-o") && args[i + 1]) {
|
|
425
|
-
options.output = args[++i];
|
|
426
|
-
} else if (arg === "--provider" && args[i + 1]) {
|
|
427
|
-
const p = args[++i] as VisionProvider;
|
|
428
|
-
if (["anthropic", "openai", "xai", "gemini"].includes(p)) options.provider = p;
|
|
429
|
-
} else if (arg === "--model" && args[i + 1]) {
|
|
430
|
-
options.model = args[++i];
|
|
431
|
-
} else if (arg === "--quick") {
|
|
432
|
-
options.quickMode = true;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
return { command, options };
|
|
436
|
-
} else {
|
|
437
|
-
command = "help";
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
for (let i = 1; i < args.length; i++) {
|
|
441
|
-
const arg = args[i];
|
|
442
|
-
if ((arg === "--url" || arg === "-u") && args[i + 1]) {
|
|
443
|
-
options.url = args[++i];
|
|
444
|
-
} else if ((arg === "--format" || arg === "-f") && args[i + 1]) {
|
|
445
|
-
const fmt = args[++i];
|
|
446
|
-
if (fmt === "profile" || fmt === "colors" || fmt === "full") {
|
|
447
|
-
options.format = fmt;
|
|
448
|
-
} else {
|
|
449
|
-
console.error(`Invalid format: ${fmt}. Use: profile, colors, full`);
|
|
450
|
-
process.exit(1);
|
|
451
|
-
}
|
|
452
|
-
} else if ((arg === "--output" || arg === "-o") && args[i + 1]) {
|
|
453
|
-
options.output = args[++i];
|
|
454
|
-
} else if (arg === "--provider" && args[i + 1]) {
|
|
455
|
-
const p = args[++i] as VisionProvider;
|
|
456
|
-
if (["anthropic", "openai", "xai", "gemini"].includes(p)) {
|
|
457
|
-
options.provider = p;
|
|
458
|
-
} else {
|
|
459
|
-
console.error(`Invalid provider: ${p}. Use: anthropic, openai, xai, gemini`);
|
|
460
|
-
process.exit(1);
|
|
461
|
-
}
|
|
462
|
-
} else if (arg === "--model" && args[i + 1]) {
|
|
463
|
-
options.model = args[++i];
|
|
464
|
-
} else if (arg === "--quick") {
|
|
465
|
-
options.quickMode = true;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
return { command, options };
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
function printHelp(): void {
|
|
473
|
-
const available = listAvailableProviders();
|
|
474
|
-
console.log(`
|
|
475
|
-
siteanalyze — Analyze any website's design system via Playwright + AI Vision
|
|
476
|
-
|
|
477
|
-
USAGE
|
|
478
|
-
siteanalyze <url> [options]
|
|
479
|
-
siteanalyze analyze --url <url> [options]
|
|
480
|
-
siteanalyze help
|
|
481
|
-
|
|
482
|
-
COMMANDS
|
|
483
|
-
analyze Analyze a website's design system (default when URL is given)
|
|
484
|
-
help Show this help message
|
|
485
|
-
|
|
486
|
-
OPTIONS
|
|
487
|
-
--url, -u <url> Website URL to analyze (required)
|
|
488
|
-
--format, -f <format> Output format: profile | colors | full (default: full)
|
|
489
|
-
--output, -o <file> Write JSON result to file instead of stdout
|
|
490
|
-
--provider <name> AI provider: anthropic | openai | xai | gemini (auto-detected)
|
|
491
|
-
--model <name> Model override (uses provider default if not set)
|
|
492
|
-
--quick Skip AI vision analysis — HTML/CSS analysis only
|
|
493
|
-
|
|
494
|
-
FORMATS
|
|
495
|
-
profile Print only the open-styles compatible profile object
|
|
496
|
-
colors Print only the extracted colors
|
|
497
|
-
full Print the complete analysis result (default)
|
|
498
|
-
|
|
499
|
-
EXAMPLES
|
|
500
|
-
siteanalyze https://vercel.com
|
|
501
|
-
siteanalyze https://stripe.com --format profile
|
|
502
|
-
siteanalyze https://tailwindcss.com --provider openai
|
|
503
|
-
siteanalyze https://shadcn.com --quick
|
|
504
|
-
siteanalyze analyze --url https://example.com --output ./profile.json
|
|
505
|
-
|
|
506
|
-
ENVIRONMENT
|
|
507
|
-
ANTHROPIC_API_KEY Claude API key (anthropic provider)
|
|
508
|
-
OPENAI_API_KEY OpenAI API key (openai provider)
|
|
509
|
-
XAI_API_KEY xAI API key (xai provider)
|
|
510
|
-
GEMINI_API_KEY Google Gemini API key (gemini provider)
|
|
511
|
-
|
|
512
|
-
AVAILABLE PROVIDERS
|
|
513
|
-
${available.length > 0 ? available.join(", ") : "(none — set an API key for vision analysis, or use --quick)"}
|
|
514
|
-
`);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
async function main(): Promise<void> {
|
|
518
|
-
const { command, options } = parseArgs(process.argv);
|
|
519
|
-
|
|
520
|
-
if (command === "help") {
|
|
521
|
-
printHelp();
|
|
522
|
-
process.exit(0);
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
if (command === "analyze") {
|
|
526
|
-
if (!options.url) {
|
|
527
|
-
console.error("Error: URL is required.");
|
|
528
|
-
console.error(
|
|
529
|
-
"Run `siteanalyze help` for usage."
|
|
530
|
-
);
|
|
531
|
-
process.exit(1);
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
const available = listAvailableProviders();
|
|
535
|
-
if (!options.quickMode && available.length === 0) {
|
|
536
|
-
console.warn(
|
|
537
|
-
"Warning: No AI provider API key found — running in quick mode (HTML analysis only)."
|
|
538
|
-
);
|
|
539
|
-
console.warn(
|
|
540
|
-
"Set ANTHROPIC_API_KEY, OPENAI_API_KEY, XAI_API_KEY, or GEMINI_API_KEY for visual analysis."
|
|
541
|
-
);
|
|
542
|
-
options.quickMode = true;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
try {
|
|
546
|
-
console.error(`Analyzing ${options.url}...`);
|
|
547
|
-
|
|
548
|
-
const result = await analyzeSite(options.url, {
|
|
549
|
-
provider: options.provider ?? undefined,
|
|
550
|
-
model: options.model ?? undefined,
|
|
551
|
-
quickMode: options.quickMode,
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
let output: unknown;
|
|
555
|
-
if (options.format === "colors") {
|
|
556
|
-
output = result.colors;
|
|
557
|
-
} else if (options.format === "profile") {
|
|
558
|
-
output = result.openStylesProfile;
|
|
559
|
-
} else {
|
|
560
|
-
output = {
|
|
561
|
-
url: result.url,
|
|
562
|
-
framework: result.framework,
|
|
563
|
-
hasShadcn: result.hasShadcn,
|
|
564
|
-
hasTailwind: result.hasTailwind,
|
|
565
|
-
colors: result.colors,
|
|
566
|
-
typography: result.typography,
|
|
567
|
-
components: result.components,
|
|
568
|
-
provider: result.provider,
|
|
569
|
-
model: result.model,
|
|
570
|
-
openStylesProfile: result.openStylesProfile,
|
|
571
|
-
};
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
const json = JSON.stringify(output, null, 2);
|
|
575
|
-
|
|
576
|
-
if (options.output) {
|
|
577
|
-
writeFileSync(options.output, json, "utf-8");
|
|
578
|
-
console.error(`Result written to: ${options.output}`);
|
|
579
|
-
} else {
|
|
580
|
-
console.log(json);
|
|
581
|
-
}
|
|
582
|
-
} catch (error) {
|
|
583
|
-
console.error(
|
|
584
|
-
"Error:",
|
|
585
|
-
error instanceof Error ? error.message : String(error)
|
|
586
|
-
);
|
|
587
|
-
process.exit(1);
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
main();
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: slide-deck-generator
|
|
3
|
-
description: Turn a brief or Markdown outline into a real slide deck locally - structured slides.json, deck.md, speaker notes, theme guide, a self-contained keyboard-navigable HTML deck, and a PPTX file.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Slide Deck Generator
|
|
7
|
-
|
|
8
|
-
Parse a brief, outline, report, or product narrative into a slide model, then render it to several
|
|
9
|
-
formats at once. This is the local binary renderer: it does the deterministic parsing, layout, and
|
|
10
|
-
file writing so no model call is needed to produce the artifacts.
|
|
11
|
-
|
|
12
|
-
`pitch-deck` is an instruction skill that decides the narrative and then delegates the actual
|
|
13
|
-
rendering to this skill. Anything that needs a real `.pptx` or a shareable HTML deck should call
|
|
14
|
-
`slide-deck-generator`.
|
|
15
|
-
|
|
16
|
-
Everything runs locally. No API keys, no network calls, no accounts.
|
|
17
|
-
|
|
18
|
-
## Requirements
|
|
19
|
-
|
|
20
|
-
- [Bun](https://bun.sh) 1.1+.
|
|
21
|
-
- `bun install` inside this skill directory. Runtime dependencies:
|
|
22
|
-
- `marked` — Markdown tokenizing for `--source` outlines.
|
|
23
|
-
- `pptxgenjs` — writes the real `deck.pptx` (Open XML zip package).
|
|
24
|
-
- No API keys and no network access. `deck.html` embeds all CSS and JS inline and makes zero
|
|
25
|
-
external requests.
|
|
26
|
-
|
|
27
|
-
## Usage
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
# From a Markdown outline
|
|
31
|
-
bun run src/index.ts --source ./outline.md --slides 10 --theme aurora \
|
|
32
|
-
--audience executives --format report --output ./out
|
|
33
|
-
|
|
34
|
-
# From a one-paragraph brief
|
|
35
|
-
bun run src/index.ts --brief "Q2 launch review for AI billing" --slides 8 --theme midnight
|
|
36
|
-
|
|
37
|
-
# Skip PPTX rendering, emit machine-readable manifest
|
|
38
|
-
bun run src/index.ts --source ./outline.md --no-pptx --json
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Open `out/deck.html` in any browser: `←`/`→` (or space) to navigate, `Home`/`End` to jump, `N` to
|
|
42
|
-
toggle speaker notes, `Ctrl/Cmd-P` to print one slide per page.
|
|
43
|
-
|
|
44
|
-
### Markdown parsing rules
|
|
45
|
-
|
|
46
|
-
- The first `#` heading becomes the deck title (unless `--title` is given).
|
|
47
|
-
- Each `#`/`##` heading starts a new slide; `###` headings become bullets.
|
|
48
|
-
- List items become bullets; paragraphs become speaker notes (and become bullets when a slide would
|
|
49
|
-
otherwise be empty); blockquotes become full-bleed quote slides; the first lines of a code block
|
|
50
|
-
become bullets.
|
|
51
|
-
- Plain prose with no Markdown structure is split into sentences and grouped into slides.
|
|
52
|
-
- The deck is then fitted to `--slides`: dense slides split into `(cont.)` slides, short adjacent
|
|
53
|
-
slides merge, and any remaining gap is filled with format-appropriate scaffold slides.
|
|
54
|
-
|
|
55
|
-
## Options
|
|
56
|
-
|
|
57
|
-
| Option | Description | Default |
|
|
58
|
-
|--------|-------------|---------|
|
|
59
|
-
| `-b, --brief <text>` | Brief, outline, or narrative text. Also accepted as a bare positional argument. | — |
|
|
60
|
-
| `-s, --source <path>` | Read the brief/outline from a Markdown or text file. | — |
|
|
61
|
-
| `-t, --title <text>` | Deck title. | first `#` heading, else first line of the brief |
|
|
62
|
-
| `-n, --slides <n>` | Target slide count (1–60). | `8` |
|
|
63
|
-
| `--theme <name>` | `midnight`, `aurora`, `sandstone`, `ocean`, or `mono`. | `midnight` |
|
|
64
|
-
| `--audience <type>` | `team`, `customers`, `executives`, or `students`. Shapes the speaker notes. | `team` |
|
|
65
|
-
| `--format <type>` | `general`, `training`, `sales`, `report`, or `proposal`. Shapes the closing slides. | `general` |
|
|
66
|
-
| `-o, --output <dir>` | Output directory. | `./slide-deck` |
|
|
67
|
-
| `--no-pptx` | Skip `deck.pptx`; still write every other file. | off |
|
|
68
|
-
| `--json` | Print `manifest.json` to stdout instead of the text summary. | off |
|
|
69
|
-
| `-h, --help` | Show help. | — |
|
|
70
|
-
| `-v, --version` | Show version. | — |
|
|
71
|
-
|
|
72
|
-
Either `--brief` or `--source` is required.
|
|
73
|
-
|
|
74
|
-
## Outputs
|
|
75
|
-
|
|
76
|
-
Written under `--output`:
|
|
77
|
-
|
|
78
|
-
| File | Contents |
|
|
79
|
-
|------|----------|
|
|
80
|
-
| `slides.json` | The slide model: index, layout (`title`/`agenda`/`bullets`/`section`/`quote`/`closing`), title, subtitle, bullets, and notes per slide. |
|
|
81
|
-
| `deck.md` | Readable Markdown deck, one `---` separated section per slide with inline notes. |
|
|
82
|
-
| `speaker-notes.md` | Per-slide talk track, on-screen recap, runtime estimate, and a delivery checklist. |
|
|
83
|
-
| `theme-guide.md` | Palette hex values, typography scale, layout rules, and how to swap themes. |
|
|
84
|
-
| `deck.html` | Self-contained reveal-style deck: inline CSS/JS, keyboard + click navigation, progress bar, notes toggle, and a print stylesheet that paginates one slide per page. No external requests. |
|
|
85
|
-
| `deck.pptx` | Real PowerPoint file written by `pptxgenjs` (16:9), including per-slide speaker notes. Opens in PowerPoint, Keynote, LibreOffice, and Google Slides. |
|
|
86
|
-
| `manifest.json` | Run metadata: title, source, theme, audience, format, slide count, layouts, and file list. |
|
|
87
|
-
|
|
88
|
-
## Notes
|
|
89
|
-
|
|
90
|
-
- PPTX rendering failures are non-fatal: the other files are still written, a warning goes to
|
|
91
|
-
stderr, and `manifest.json` records `pptx: "failed: …"`.
|
|
92
|
-
- Scaffold slides added to reach `--slides` are labelled in their notes so they are easy to find and
|
|
93
|
-
replace before presenting.
|