sandstream-kit 1.0.0
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 +21 -0
- package/README.md +617 -0
- package/dist/adapters/api-key-adapter.d.ts +35 -0
- package/dist/adapters/api-key-adapter.js +46 -0
- package/dist/adapters/api-key-adapter.js.map +1 -0
- package/dist/adapters/clerk-auth.d.ts +6 -0
- package/dist/adapters/clerk-auth.js +20 -0
- package/dist/adapters/clerk-auth.js.map +1 -0
- package/dist/adapters/cloudflare-r2.d.ts +6 -0
- package/dist/adapters/cloudflare-r2.js +136 -0
- package/dist/adapters/cloudflare-r2.js.map +1 -0
- package/dist/adapters/expo-eas.d.ts +6 -0
- package/dist/adapters/expo-eas.js +129 -0
- package/dist/adapters/expo-eas.js.map +1 -0
- package/dist/adapters/flagsmith-flags.d.ts +5 -0
- package/dist/adapters/flagsmith-flags.js +20 -0
- package/dist/adapters/flagsmith-flags.js.map +1 -0
- package/dist/adapters/flyio-hosting.d.ts +2 -0
- package/dist/adapters/flyio-hosting.js +143 -0
- package/dist/adapters/flyio-hosting.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.js +48 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/inngest-background.d.ts +5 -0
- package/dist/adapters/inngest-background.js +19 -0
- package/dist/adapters/inngest-background.js.map +1 -0
- package/dist/adapters/liveblocks-realtime.d.ts +11 -0
- package/dist/adapters/liveblocks-realtime.js +62 -0
- package/dist/adapters/liveblocks-realtime.js.map +1 -0
- package/dist/adapters/loops-email.d.ts +6 -0
- package/dist/adapters/loops-email.js +18 -0
- package/dist/adapters/loops-email.js.map +1 -0
- package/dist/adapters/neon-db.d.ts +10 -0
- package/dist/adapters/neon-db.js +94 -0
- package/dist/adapters/neon-db.js.map +1 -0
- package/dist/adapters/planetscale-db.d.ts +11 -0
- package/dist/adapters/planetscale-db.js +134 -0
- package/dist/adapters/planetscale-db.js.map +1 -0
- package/dist/adapters/posthog-analytics.d.ts +6 -0
- package/dist/adapters/posthog-analytics.js +22 -0
- package/dist/adapters/posthog-analytics.js.map +1 -0
- package/dist/adapters/railway-hosting.d.ts +2 -0
- package/dist/adapters/railway-hosting.js +136 -0
- package/dist/adapters/railway-hosting.js.map +1 -0
- package/dist/adapters/resend-email.d.ts +35 -0
- package/dist/adapters/resend-email.js +109 -0
- package/dist/adapters/resend-email.js.map +1 -0
- package/dist/adapters/searxng-instance.d.ts +6 -0
- package/dist/adapters/searxng-instance.js +240 -0
- package/dist/adapters/searxng-instance.js.map +1 -0
- package/dist/adapters/sentry-monitoring.d.ts +7 -0
- package/dist/adapters/sentry-monitoring.js +27 -0
- package/dist/adapters/sentry-monitoring.js.map +1 -0
- package/dist/adapters/stripe-payments.d.ts +6 -0
- package/dist/adapters/stripe-payments.js +134 -0
- package/dist/adapters/stripe-payments.js.map +1 -0
- package/dist/adapters/supabase-db.d.ts +6 -0
- package/dist/adapters/supabase-db.js +130 -0
- package/dist/adapters/supabase-db.js.map +1 -0
- package/dist/adapters/tinybird-analytics.d.ts +5 -0
- package/dist/adapters/tinybird-analytics.js +20 -0
- package/dist/adapters/tinybird-analytics.js.map +1 -0
- package/dist/adapters/trigger-background.d.ts +6 -0
- package/dist/adapters/trigger-background.js +20 -0
- package/dist/adapters/trigger-background.js.map +1 -0
- package/dist/adapters/types.d.ts +7 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/upstash-redis.d.ts +6 -0
- package/dist/adapters/upstash-redis.js +88 -0
- package/dist/adapters/upstash-redis.js.map +1 -0
- package/dist/adapters/vercel-hosting.d.ts +6 -0
- package/dist/adapters/vercel-hosting.js +112 -0
- package/dist/adapters/vercel-hosting.js.map +1 -0
- package/dist/agent-adapter-model.d.ts +108 -0
- package/dist/agent-adapter-model.js +6 -0
- package/dist/agent-adapter-model.js.map +1 -0
- package/dist/agent-adapter-service.d.ts +67 -0
- package/dist/agent-adapter-service.js +299 -0
- package/dist/agent-adapter-service.js.map +1 -0
- package/dist/agent-config.d.ts +56 -0
- package/dist/agent-config.js +129 -0
- package/dist/agent-config.js.map +1 -0
- package/dist/agent-governance-model.d.ts +128 -0
- package/dist/agent-governance-model.js +6 -0
- package/dist/agent-governance-model.js.map +1 -0
- package/dist/agent-governance-service.d.ts +101 -0
- package/dist/agent-governance-service.js +319 -0
- package/dist/agent-governance-service.js.map +1 -0
- package/dist/alert-rules-engine.d.ts +102 -0
- package/dist/alert-rules-engine.js +210 -0
- package/dist/alert-rules-engine.js.map +1 -0
- package/dist/analytics-service.d.ts +126 -0
- package/dist/analytics-service.js +318 -0
- package/dist/analytics-service.js.map +1 -0
- package/dist/analyze.d.ts +19 -0
- package/dist/analyze.js +311 -0
- package/dist/analyze.js.map +1 -0
- package/dist/apm-instrumentor.d.ts +119 -0
- package/dist/apm-instrumentor.js +225 -0
- package/dist/apm-instrumentor.js.map +1 -0
- package/dist/approval-model.d.ts +82 -0
- package/dist/approval-model.js +6 -0
- package/dist/approval-model.js.map +1 -0
- package/dist/approval-service.d.ts +39 -0
- package/dist/approval-service.js +236 -0
- package/dist/approval-service.js.map +1 -0
- package/dist/approval.d.ts +22 -0
- package/dist/approval.js +148 -0
- package/dist/approval.js.map +1 -0
- package/dist/audit-logging-model.d.ts +157 -0
- package/dist/audit-logging-model.js +6 -0
- package/dist/audit-logging-model.js.map +1 -0
- package/dist/audit-logging-service.d.ts +89 -0
- package/dist/audit-logging-service.js +367 -0
- package/dist/audit-logging-service.js.map +1 -0
- package/dist/audit-secrets.d.ts +42 -0
- package/dist/audit-secrets.js +126 -0
- package/dist/audit-secrets.js.map +1 -0
- package/dist/audit.d.ts +43 -0
- package/dist/audit.js +286 -0
- package/dist/audit.js.map +1 -0
- package/dist/author-dashboard.d.ts +84 -0
- package/dist/author-dashboard.js +204 -0
- package/dist/author-dashboard.js.map +1 -0
- package/dist/author-notifications.d.ts +130 -0
- package/dist/author-notifications.js +261 -0
- package/dist/author-notifications.js.map +1 -0
- package/dist/author-verification.d.ts +79 -0
- package/dist/author-verification.js +257 -0
- package/dist/author-verification.js.map +1 -0
- package/dist/autonomous-setup-model.d.ts +117 -0
- package/dist/autonomous-setup-model.js +6 -0
- package/dist/autonomous-setup-model.js.map +1 -0
- package/dist/autonomous-setup-service.d.ts +74 -0
- package/dist/autonomous-setup-service.js +325 -0
- package/dist/autonomous-setup-service.js.map +1 -0
- package/dist/badge-system.d.ts +70 -0
- package/dist/badge-system.js +210 -0
- package/dist/badge-system.js.map +1 -0
- package/dist/baseline.d.ts +34 -0
- package/dist/baseline.js +78 -0
- package/dist/baseline.js.map +1 -0
- package/dist/beta-program-service.d.ts +112 -0
- package/dist/beta-program-service.js +240 -0
- package/dist/beta-program-service.js.map +1 -0
- package/dist/budget.d.ts +34 -0
- package/dist/budget.js +159 -0
- package/dist/budget.js.map +1 -0
- package/dist/bumblebee.d.ts +143 -0
- package/dist/bumblebee.js +384 -0
- package/dist/bumblebee.js.map +1 -0
- package/dist/cache-manager.d.ts +97 -0
- package/dist/cache-manager.js +244 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/cdn-adapter.d.ts +64 -0
- package/dist/cdn-adapter.js +263 -0
- package/dist/cdn-adapter.js.map +1 -0
- package/dist/certification-workflow-model.d.ts +95 -0
- package/dist/certification-workflow-model.js +6 -0
- package/dist/certification-workflow-model.js.map +1 -0
- package/dist/certification-workflow-service.d.ts +72 -0
- package/dist/certification-workflow-service.js +305 -0
- package/dist/certification-workflow-service.js.map +1 -0
- package/dist/check-design.d.ts +38 -0
- package/dist/check-design.js +256 -0
- package/dist/check-design.js.map +1 -0
- package/dist/check-gitignore.d.ts +39 -0
- package/dist/check-gitignore.js +156 -0
- package/dist/check-gitignore.js.map +1 -0
- package/dist/check-hooks.d.ts +15 -0
- package/dist/check-hooks.js +72 -0
- package/dist/check-hooks.js.map +1 -0
- package/dist/check-lock.d.ts +16 -0
- package/dist/check-lock.js +94 -0
- package/dist/check-lock.js.map +1 -0
- package/dist/check-secrets.d.ts +11 -0
- package/dist/check-secrets.js +320 -0
- package/dist/check-secrets.js.map +1 -0
- package/dist/check-security.d.ts +13 -0
- package/dist/check-security.js +887 -0
- package/dist/check-security.js.map +1 -0
- package/dist/check-services.d.ts +10 -0
- package/dist/check-services.js +44 -0
- package/dist/check-services.js.map +1 -0
- package/dist/check-skills.d.ts +8 -0
- package/dist/check-skills.js +26 -0
- package/dist/check-skills.js.map +1 -0
- package/dist/check-tests.d.ts +43 -0
- package/dist/check-tests.js +175 -0
- package/dist/check-tests.js.map +1 -0
- package/dist/check-tools.d.ts +8 -0
- package/dist/check-tools.js +42 -0
- package/dist/check-tools.js.map +1 -0
- package/dist/check-web-search.d.ts +12 -0
- package/dist/check-web-search.js +168 -0
- package/dist/check-web-search.js.map +1 -0
- package/dist/ci-cd-publisher.d.ts +162 -0
- package/dist/ci-cd-publisher.js +319 -0
- package/dist/ci-cd-publisher.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +4074 -0
- package/dist/cli.js.map +1 -0
- package/dist/clone.d.ts +25 -0
- package/dist/clone.js +73 -0
- package/dist/clone.js.map +1 -0
- package/dist/completions.d.ts +8 -0
- package/dist/completions.js +250 -0
- package/dist/completions.js.map +1 -0
- package/dist/compression-manager.d.ts +107 -0
- package/dist/compression-manager.js +250 -0
- package/dist/compression-manager.js.map +1 -0
- package/dist/config.d.ts +233 -0
- package/dist/config.js +255 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +38 -0
- package/dist/context.js +86 -0
- package/dist/context.js.map +1 -0
- package/dist/cost-monitor.d.ts +72 -0
- package/dist/cost-monitor.js +218 -0
- package/dist/cost-monitor.js.map +1 -0
- package/dist/create-plugin.d.ts +22 -0
- package/dist/create-plugin.js +266 -0
- package/dist/create-plugin.js.map +1 -0
- package/dist/database.d.ts +123 -0
- package/dist/database.js +354 -0
- package/dist/database.js.map +1 -0
- package/dist/datadog-adapter.d.ts +60 -0
- package/dist/datadog-adapter.js +245 -0
- package/dist/datadog-adapter.js.map +1 -0
- package/dist/doctor.d.ts +15 -0
- package/dist/doctor.js +131 -0
- package/dist/doctor.js.map +1 -0
- package/dist/documentation-generator.d.ts +226 -0
- package/dist/documentation-generator.js +348 -0
- package/dist/documentation-generator.js.map +1 -0
- package/dist/elevation-scopes.d.ts +40 -0
- package/dist/elevation-scopes.js +110 -0
- package/dist/elevation-scopes.js.map +1 -0
- package/dist/elevation.d.ts +102 -0
- package/dist/elevation.js +449 -0
- package/dist/elevation.js.map +1 -0
- package/dist/env-diff.d.ts +27 -0
- package/dist/env-diff.js +104 -0
- package/dist/env-diff.js.map +1 -0
- package/dist/env-inspect.d.ts +28 -0
- package/dist/env-inspect.js +81 -0
- package/dist/env-inspect.js.map +1 -0
- package/dist/env-switch.d.ts +37 -0
- package/dist/env-switch.js +102 -0
- package/dist/env-switch.js.map +1 -0
- package/dist/environment.d.ts +27 -0
- package/dist/environment.js +148 -0
- package/dist/environment.js.map +1 -0
- package/dist/error-tracker.d.ts +92 -0
- package/dist/error-tracker.js +206 -0
- package/dist/error-tracker.js.map +1 -0
- package/dist/escalate.d.ts +11 -0
- package/dist/escalate.js +73 -0
- package/dist/escalate.js.map +1 -0
- package/dist/event-stream.d.ts +81 -0
- package/dist/event-stream.js +161 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/fix.d.ts +42 -0
- package/dist/fix.js +419 -0
- package/dist/fix.js.map +1 -0
- package/dist/governance-middleware.d.ts +22 -0
- package/dist/governance-middleware.js +173 -0
- package/dist/governance-middleware.js.map +1 -0
- package/dist/governance.d.ts +44 -0
- package/dist/governance.js +236 -0
- package/dist/governance.js.map +1 -0
- package/dist/hooks.d.ts +25 -0
- package/dist/hooks.js +281 -0
- package/dist/hooks.js.map +1 -0
- package/dist/id-generator.d.ts +43 -0
- package/dist/id-generator.js +47 -0
- package/dist/id-generator.js.map +1 -0
- package/dist/image-optimizer.d.ts +92 -0
- package/dist/image-optimizer.js +202 -0
- package/dist/image-optimizer.js.map +1 -0
- package/dist/install.d.ts +15 -0
- package/dist/install.js +59 -0
- package/dist/install.js.map +1 -0
- package/dist/lock.d.ts +82 -0
- package/dist/lock.js +264 -0
- package/dist/lock.js.map +1 -0
- package/dist/login.d.ts +23 -0
- package/dist/login.js +132 -0
- package/dist/login.js.map +1 -0
- package/dist/mcp-kit-tools-model.d.ts +195 -0
- package/dist/mcp-kit-tools-model.js +6 -0
- package/dist/mcp-kit-tools-model.js.map +1 -0
- package/dist/mcp-kit-tools-service.d.ts +127 -0
- package/dist/mcp-kit-tools-service.js +943 -0
- package/dist/mcp-kit-tools-service.js.map +1 -0
- package/dist/mcp-orchestrator.d.ts +70 -0
- package/dist/mcp-orchestrator.js +175 -0
- package/dist/mcp-orchestrator.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.js +722 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +74 -0
- package/dist/middleware/rate-limiter.js +342 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/migration-runner.d.ts +66 -0
- package/dist/migration-runner.js +192 -0
- package/dist/migration-runner.js.map +1 -0
- package/dist/migrations.d.ts +25 -0
- package/dist/migrations.js +530 -0
- package/dist/migrations.js.map +1 -0
- package/dist/moderation-system.d.ts +153 -0
- package/dist/moderation-system.js +338 -0
- package/dist/moderation-system.js.map +1 -0
- package/dist/multi-agent-workflow-model.d.ts +125 -0
- package/dist/multi-agent-workflow-model.js +6 -0
- package/dist/multi-agent-workflow-model.js.map +1 -0
- package/dist/multi-agent-workflow-service.d.ts +102 -0
- package/dist/multi-agent-workflow-service.js +452 -0
- package/dist/multi-agent-workflow-service.js.map +1 -0
- package/dist/onepassword.d.ts +75 -0
- package/dist/onepassword.js +140 -0
- package/dist/onepassword.js.map +1 -0
- package/dist/open.d.ts +30 -0
- package/dist/open.js +166 -0
- package/dist/open.js.map +1 -0
- package/dist/output.d.ts +32 -0
- package/dist/output.js +295 -0
- package/dist/output.js.map +1 -0
- package/dist/partner-service.d.ts +101 -0
- package/dist/partner-service.js +191 -0
- package/dist/partner-service.js.map +1 -0
- package/dist/payout-service.d.ts +136 -0
- package/dist/payout-service.js +293 -0
- package/dist/payout-service.js.map +1 -0
- package/dist/pkg.d.ts +30 -0
- package/dist/pkg.js +162 -0
- package/dist/pkg.js.map +1 -0
- package/dist/plugin-loader.d.ts +16 -0
- package/dist/plugin-loader.js +124 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/plugin-registry-model.d.ts +133 -0
- package/dist/plugin-registry-model.js +6 -0
- package/dist/plugin-registry-model.js.map +1 -0
- package/dist/plugin-registry-service.d.ts +109 -0
- package/dist/plugin-registry-service.js +361 -0
- package/dist/plugin-registry-service.js.map +1 -0
- package/dist/plugin-registry.d.ts +58 -0
- package/dist/plugin-registry.js +108 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/plugin-updates.d.ts +135 -0
- package/dist/plugin-updates.js +326 -0
- package/dist/plugin-updates.js.map +1 -0
- package/dist/plugins-cli.d.ts +7 -0
- package/dist/plugins-cli.js +157 -0
- package/dist/plugins-cli.js.map +1 -0
- package/dist/plugins.d.ts +88 -0
- package/dist/plugins.js +251 -0
- package/dist/plugins.js.map +1 -0
- package/dist/policy.d.ts +66 -0
- package/dist/policy.js +160 -0
- package/dist/policy.js.map +1 -0
- package/dist/post-pull-audit.d.ts +39 -0
- package/dist/post-pull-audit.js +151 -0
- package/dist/post-pull-audit.js.map +1 -0
- package/dist/provision.d.ts +17 -0
- package/dist/provision.js +147 -0
- package/dist/provision.js.map +1 -0
- package/dist/query-optimizer.d.ts +102 -0
- package/dist/query-optimizer.js +199 -0
- package/dist/query-optimizer.js.map +1 -0
- package/dist/read-only-mode.d.ts +46 -0
- package/dist/read-only-mode.js +71 -0
- package/dist/read-only-mode.js.map +1 -0
- package/dist/redis-adapter.d.ts +71 -0
- package/dist/redis-adapter.js +278 -0
- package/dist/redis-adapter.js.map +1 -0
- package/dist/resilience-tests.d.ts +120 -0
- package/dist/resilience-tests.js +293 -0
- package/dist/resilience-tests.js.map +1 -0
- package/dist/revocation.d.ts +22 -0
- package/dist/revocation.js +100 -0
- package/dist/revocation.js.map +1 -0
- package/dist/run.d.ts +21 -0
- package/dist/run.js +80 -0
- package/dist/run.js.map +1 -0
- package/dist/scan-build.d.ts +18 -0
- package/dist/scan-build.js +100 -0
- package/dist/scan-build.js.map +1 -0
- package/dist/scan-plaintext.d.ts +24 -0
- package/dist/scan-plaintext.js +147 -0
- package/dist/scan-plaintext.js.map +1 -0
- package/dist/scan-staged.d.ts +15 -0
- package/dist/scan-staged.js +70 -0
- package/dist/scan-staged.js.map +1 -0
- package/dist/scan-transcripts.d.ts +23 -0
- package/dist/scan-transcripts.js +93 -0
- package/dist/scan-transcripts.js.map +1 -0
- package/dist/secret-backends.d.ts +50 -0
- package/dist/secret-backends.js +510 -0
- package/dist/secret-backends.js.map +1 -0
- package/dist/secret-expiration.d.ts +46 -0
- package/dist/secret-expiration.js +172 -0
- package/dist/secret-expiration.js.map +1 -0
- package/dist/secrets-migrate.d.ts +75 -0
- package/dist/secrets-migrate.js +185 -0
- package/dist/secrets-migrate.js.map +1 -0
- package/dist/secrets-model.d.ts +77 -0
- package/dist/secrets-model.js +6 -0
- package/dist/secrets-model.js.map +1 -0
- package/dist/secrets-onecli.d.ts +65 -0
- package/dist/secrets-onecli.js +113 -0
- package/dist/secrets-onecli.js.map +1 -0
- package/dist/secrets-propagate.d.ts +48 -0
- package/dist/secrets-propagate.js +201 -0
- package/dist/secrets-propagate.js.map +1 -0
- package/dist/secrets-pull.d.ts +34 -0
- package/dist/secrets-pull.js +118 -0
- package/dist/secrets-pull.js.map +1 -0
- package/dist/secrets-purge-history.d.ts +53 -0
- package/dist/secrets-purge-history.js +144 -0
- package/dist/secrets-purge-history.js.map +1 -0
- package/dist/secrets-rotate-cli.d.ts +54 -0
- package/dist/secrets-rotate-cli.js +438 -0
- package/dist/secrets-rotate-cli.js.map +1 -0
- package/dist/secrets-rotate.d.ts +38 -0
- package/dist/secrets-rotate.js +65 -0
- package/dist/secrets-rotate.js.map +1 -0
- package/dist/secrets-service.d.ts +73 -0
- package/dist/secrets-service.js +283 -0
- package/dist/secrets-service.js.map +1 -0
- package/dist/secrets-set.d.ts +25 -0
- package/dist/secrets-set.js +33 -0
- package/dist/secrets-set.js.map +1 -0
- package/dist/secrets-sync.d.ts +21 -0
- package/dist/secrets-sync.js +215 -0
- package/dist/secrets-sync.js.map +1 -0
- package/dist/secrets-validate.d.ts +41 -0
- package/dist/secrets-validate.js +126 -0
- package/dist/secrets-validate.js.map +1 -0
- package/dist/secrets-vault-migrate.d.ts +71 -0
- package/dist/secrets-vault-migrate.js +258 -0
- package/dist/secrets-vault-migrate.js.map +1 -0
- package/dist/secrets.d.ts +16 -0
- package/dist/secrets.js +72 -0
- package/dist/secrets.js.map +1 -0
- package/dist/security-hardening.d.ts +150 -0
- package/dist/security-hardening.js +275 -0
- package/dist/security-hardening.js.map +1 -0
- package/dist/security-policy.d.ts +89 -0
- package/dist/security-policy.js +174 -0
- package/dist/security-policy.js.map +1 -0
- package/dist/security-prescan.d.ts +117 -0
- package/dist/security-prescan.js +566 -0
- package/dist/security-prescan.js.map +1 -0
- package/dist/sentry-adapter.d.ts +49 -0
- package/dist/sentry-adapter.js +227 -0
- package/dist/sentry-adapter.js.map +1 -0
- package/dist/service-adapter.d.ts +94 -0
- package/dist/service-adapter.js +162 -0
- package/dist/service-adapter.js.map +1 -0
- package/dist/skills.d.ts +13 -0
- package/dist/skills.js +17 -0
- package/dist/skills.js.map +1 -0
- package/dist/sla-monitor.d.ts +107 -0
- package/dist/sla-monitor.js +233 -0
- package/dist/sla-monitor.js.map +1 -0
- package/dist/stack-detector.d.ts +12 -0
- package/dist/stack-detector.js +251 -0
- package/dist/stack-detector.js.map +1 -0
- package/dist/team-model.d.ts +58 -0
- package/dist/team-model.js +83 -0
- package/dist/team-model.js.map +1 -0
- package/dist/team-service.d.ts +54 -0
- package/dist/team-service.js +206 -0
- package/dist/team-service.js.map +1 -0
- package/dist/toml-generator.d.ts +8 -0
- package/dist/toml-generator.js +223 -0
- package/dist/toml-generator.js.map +1 -0
- package/dist/triage-sandbox.d.ts +34 -0
- package/dist/triage-sandbox.js +167 -0
- package/dist/triage-sandbox.js.map +1 -0
- package/dist/triage.d.ts +30 -0
- package/dist/triage.js +79 -0
- package/dist/triage.js.map +1 -0
- package/dist/update-check.d.ts +13 -0
- package/dist/update-check.js +91 -0
- package/dist/update-check.js.map +1 -0
- package/dist/utils/colors.d.ts +14 -0
- package/dist/utils/colors.js +15 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/didYouMean.d.ts +15 -0
- package/dist/utils/didYouMean.js +47 -0
- package/dist/utils/didYouMean.js.map +1 -0
- package/dist/utils/exec.d.ts +21 -0
- package/dist/utils/exec.js +23 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/execFileNoThrow.d.ts +14 -0
- package/dist/utils/execFileNoThrow.js +29 -0
- package/dist/utils/execFileNoThrow.js.map +1 -0
- package/dist/utils/flags.d.ts +19 -0
- package/dist/utils/flags.js +36 -0
- package/dist/utils/flags.js.map +1 -0
- package/dist/utils/parseCommand.d.ts +16 -0
- package/dist/utils/parseCommand.js +13 -0
- package/dist/utils/parseCommand.js.map +1 -0
- package/dist/utils/prompt.d.ts +13 -0
- package/dist/utils/prompt.js +35 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/promptSelect.d.ts +19 -0
- package/dist/utils/promptSelect.js +89 -0
- package/dist/utils/promptSelect.js.map +1 -0
- package/dist/utils/redactSecrets.d.ts +24 -0
- package/dist/utils/redactSecrets.js +134 -0
- package/dist/utils/redactSecrets.js.map +1 -0
- package/dist/validation/dynamic-schema.d.ts +29 -0
- package/dist/validation/dynamic-schema.js +76 -0
- package/dist/validation/dynamic-schema.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit Payout Service
|
|
3
|
+
*
|
|
4
|
+
* Handles author payouts, revenue tracking, grant applications,
|
|
5
|
+
* and Stripe Connect integration for marketplace monetization.
|
|
6
|
+
*/
|
|
7
|
+
import { IdGenerators } from "./id-generator.js";
|
|
8
|
+
/**
|
|
9
|
+
* Payout service for managing author earnings and payments
|
|
10
|
+
*/
|
|
11
|
+
export class PayoutService {
|
|
12
|
+
db; // Database connection
|
|
13
|
+
constructor(db) {
|
|
14
|
+
this.db = db;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Record a plugin download and update revenue
|
|
18
|
+
*/
|
|
19
|
+
async recordPluginDownload(pluginId, downloadRate = 10) {
|
|
20
|
+
const revenue = await this.db.query(`SELECT * FROM plugin_revenue WHERE plugin_id = $1`, [pluginId]);
|
|
21
|
+
const existing = revenue.rows[0];
|
|
22
|
+
const newGross = (existing?.gross_revenue || 0) + downloadRate;
|
|
23
|
+
const commission = Math.round(newGross * 0.2); // 20% to kit
|
|
24
|
+
const earnings = Math.round(newGross * 0.8); // 80% to author
|
|
25
|
+
const result = await this.db.query(`
|
|
26
|
+
INSERT INTO plugin_revenue (id, plugin_id, author_id, gross_revenue, kit_commission, author_earnings, updated_at)
|
|
27
|
+
SELECT $1, $2, author, $3, $4, $5, now()
|
|
28
|
+
FROM plugins WHERE id = $2
|
|
29
|
+
ON CONFLICT (plugin_id) DO UPDATE SET
|
|
30
|
+
gross_revenue = gross_revenue + $3,
|
|
31
|
+
kit_commission = EXCLUDED.gross_revenue * 0.2,
|
|
32
|
+
author_earnings = EXCLUDED.gross_revenue * 0.8,
|
|
33
|
+
updated_at = now()
|
|
34
|
+
RETURNING *
|
|
35
|
+
`, [IdGenerators.payout(), pluginId, downloadRate, commission, earnings]);
|
|
36
|
+
return this.mapRevenue(result.rows[0]);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Calculate monthly earnings for author
|
|
40
|
+
*/
|
|
41
|
+
async calculateMonthlyEarnings(authorId, year, month) {
|
|
42
|
+
const result = await this.db.query(`
|
|
43
|
+
SELECT COALESCE(SUM(author_earnings), 0) as total
|
|
44
|
+
FROM plugin_revenue
|
|
45
|
+
WHERE author_id = $1
|
|
46
|
+
AND EXTRACT(YEAR FROM updated_at) = $2
|
|
47
|
+
AND EXTRACT(MONTH FROM updated_at) = $3
|
|
48
|
+
`, [authorId, year, month]);
|
|
49
|
+
return result.rows[0]?.total || 0;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create monthly payout transaction
|
|
53
|
+
*/
|
|
54
|
+
async createPayoutTransaction(authorId, amount, periodStart, periodEnd) {
|
|
55
|
+
const id = IdGenerators.payout();
|
|
56
|
+
const result = await this.db.query(`
|
|
57
|
+
INSERT INTO payment_transactions
|
|
58
|
+
(id, author_id, amount, status, period_start, period_end, created_at, updated_at)
|
|
59
|
+
VALUES ($1, $2, $3, $4, $5, $6, now(), now())
|
|
60
|
+
RETURNING *
|
|
61
|
+
`, [id, authorId, amount, "pending", periodStart, periodEnd]);
|
|
62
|
+
return this.mapTransaction(result.rows[0]);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Trigger monthly payouts (cron job, runs 1st of month)
|
|
66
|
+
*/
|
|
67
|
+
async triggerMonthlyPayouts() {
|
|
68
|
+
const lastMonth = new Date();
|
|
69
|
+
lastMonth.setMonth(lastMonth.getMonth() - 1);
|
|
70
|
+
const year = lastMonth.getFullYear();
|
|
71
|
+
const month = lastMonth.getMonth() + 1;
|
|
72
|
+
const authors = await this.db.query(`
|
|
73
|
+
SELECT DISTINCT author_id FROM plugin_revenue
|
|
74
|
+
WHERE author_earnings > 0
|
|
75
|
+
`);
|
|
76
|
+
const payouts = [];
|
|
77
|
+
for (const { author_id } of authors.rows) {
|
|
78
|
+
const earnings = await this.calculateMonthlyEarnings(author_id, year, month);
|
|
79
|
+
if (earnings > 100) { // Minimum $1.00 payout threshold
|
|
80
|
+
const periodStart = `${year}-${String(month).padStart(2, "0")}-01`;
|
|
81
|
+
const periodEnd = new Date(year, month, 0)
|
|
82
|
+
.toISOString()
|
|
83
|
+
.split("T")[0];
|
|
84
|
+
const tx = await this.createPayoutTransaction(author_id, earnings, periodStart, periodEnd);
|
|
85
|
+
payouts.push(tx);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return payouts;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Process pending payouts (transfers to author Stripe accounts)
|
|
92
|
+
*/
|
|
93
|
+
async processPayouts(batchSize = 10) {
|
|
94
|
+
const pending = await this.db.query(`
|
|
95
|
+
SELECT pt.* FROM payment_transactions pt
|
|
96
|
+
WHERE pt.status = 'pending'
|
|
97
|
+
AND pt.created_at < now() - interval '2 days'
|
|
98
|
+
LIMIT $1
|
|
99
|
+
`, [batchSize]);
|
|
100
|
+
const processed = [];
|
|
101
|
+
for (const tx of pending.rows) {
|
|
102
|
+
// Get author's Stripe account
|
|
103
|
+
const account = await this.db.query(`SELECT stripe_account_id FROM author_payout_accounts WHERE author_id = $1`, [tx.author_id]);
|
|
104
|
+
if (!account.rows[0]?.stripe_account_id) {
|
|
105
|
+
// Skip if no Stripe account connected
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
// In real implementation, call Stripe API here
|
|
110
|
+
// const transfer = await stripe.transfers.create({
|
|
111
|
+
// destination: account.rows[0].stripe_account_id,
|
|
112
|
+
// amount: tx.amount,
|
|
113
|
+
// currency: 'usd',
|
|
114
|
+
// });
|
|
115
|
+
// For now, simulate successful transfer
|
|
116
|
+
const result = await this.db.query(`
|
|
117
|
+
UPDATE payment_transactions
|
|
118
|
+
SET status = $1, attempted_at = now(), updated_at = now()
|
|
119
|
+
WHERE id = $2
|
|
120
|
+
RETURNING *
|
|
121
|
+
`, ["processing", tx.id]);
|
|
122
|
+
processed.push(this.mapTransaction(result.rows[0]));
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// Log error and mark as failed
|
|
126
|
+
console.error(`Failed to process payout ${tx.id}:`, error);
|
|
127
|
+
await this.db.query(`
|
|
128
|
+
UPDATE payment_transactions
|
|
129
|
+
SET status = $1, updated_at = now()
|
|
130
|
+
WHERE id = $2
|
|
131
|
+
`, ["failed", tx.id]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return processed;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Submit grant application
|
|
138
|
+
*/
|
|
139
|
+
async submitGrant(authorId, pluginId, amountRequested, useCase) {
|
|
140
|
+
const id = IdGenerators.grant();
|
|
141
|
+
const result = await this.db.query(`
|
|
142
|
+
INSERT INTO grant_applications
|
|
143
|
+
(id, author_id, plugin_id, amount_requested, status, use_case, created_at, updated_at)
|
|
144
|
+
VALUES ($1, $2, $3, $4, $5, $6, now(), now())
|
|
145
|
+
RETURNING *
|
|
146
|
+
`, [id, authorId, pluginId, amountRequested, "pending", useCase]);
|
|
147
|
+
return this.mapGrant(result.rows[0]);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Approve grant (admin only)
|
|
151
|
+
*/
|
|
152
|
+
async approveGrant(grantId, approvedBy) {
|
|
153
|
+
const result = await this.db.query(`
|
|
154
|
+
UPDATE grant_applications
|
|
155
|
+
SET status = $1, approved_by = $2, approval_date = now(), updated_at = now()
|
|
156
|
+
WHERE id = $3
|
|
157
|
+
RETURNING *
|
|
158
|
+
`, ["approved", approvedBy, grantId]);
|
|
159
|
+
const grant = this.mapGrant(result.rows[0]);
|
|
160
|
+
// Immediately create payout transaction for grant amount
|
|
161
|
+
await this.createPayoutTransaction(grant.authorId, grant.amountRequested, new Date().toISOString().split("T")[0], new Date().toISOString().split("T")[0]);
|
|
162
|
+
return grant;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reject grant (admin only)
|
|
166
|
+
*/
|
|
167
|
+
async rejectGrant(grantId) {
|
|
168
|
+
const result = await this.db.query(`
|
|
169
|
+
UPDATE grant_applications
|
|
170
|
+
SET status = $1, updated_at = now()
|
|
171
|
+
WHERE id = $2
|
|
172
|
+
RETURNING *
|
|
173
|
+
`, ["rejected", grantId]);
|
|
174
|
+
return this.mapGrant(result.rows[0]);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get pending grants (admin dashboard)
|
|
178
|
+
*/
|
|
179
|
+
async getPendingGrants(limit = 20) {
|
|
180
|
+
const result = await this.db.query(`
|
|
181
|
+
SELECT * FROM grant_applications
|
|
182
|
+
WHERE status = 'pending'
|
|
183
|
+
ORDER BY created_at DESC
|
|
184
|
+
LIMIT $1
|
|
185
|
+
`, [limit]);
|
|
186
|
+
return result.rows.map((row) => this.mapGrant(row));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get author payout status
|
|
190
|
+
*/
|
|
191
|
+
async getPayoutStatus(authorId) {
|
|
192
|
+
const result = await this.db.query(`SELECT * FROM author_payout_accounts WHERE author_id = $1`, [authorId]);
|
|
193
|
+
return result.rows[0] ? this.mapPayoutAccount(result.rows[0]) : null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Setup payout account (initiate Stripe Connect)
|
|
197
|
+
*/
|
|
198
|
+
async setupPayoutAccount(authorId, email) {
|
|
199
|
+
// Check if account exists
|
|
200
|
+
const existing = await this.getPayoutStatus(authorId);
|
|
201
|
+
if (existing) {
|
|
202
|
+
return existing;
|
|
203
|
+
}
|
|
204
|
+
const id = IdGenerators.payout();
|
|
205
|
+
const result = await this.db.query(`
|
|
206
|
+
INSERT INTO author_payout_accounts
|
|
207
|
+
(id, author_id, status, kyc_status, created_at, updated_at)
|
|
208
|
+
VALUES ($1, $2, $3, $4, now(), now())
|
|
209
|
+
RETURNING *
|
|
210
|
+
`, [id, authorId, "pending", "pending"]);
|
|
211
|
+
return this.mapPayoutAccount(result.rows[0]);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Mark payout transaction as completed (webhook handler)
|
|
215
|
+
*/
|
|
216
|
+
async completePayoutTransaction(stripeTransferId) {
|
|
217
|
+
const result = await this.db.query(`
|
|
218
|
+
UPDATE payment_transactions
|
|
219
|
+
SET status = $1, completed_at = now(), updated_at = now()
|
|
220
|
+
WHERE stripe_transfer_id = $2
|
|
221
|
+
RETURNING *
|
|
222
|
+
`, ["completed", stripeTransferId]);
|
|
223
|
+
return this.mapTransaction(result.rows[0]);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Map database row to PayoutAccount
|
|
227
|
+
*/
|
|
228
|
+
mapPayoutAccount(row) {
|
|
229
|
+
return {
|
|
230
|
+
id: row.id,
|
|
231
|
+
authorId: row.author_id,
|
|
232
|
+
stripeAccountId: row.stripe_account_id,
|
|
233
|
+
status: row.status,
|
|
234
|
+
kycStatus: row.kyc_status,
|
|
235
|
+
taxId: row.tax_id,
|
|
236
|
+
bankAccountId: row.bank_account_id,
|
|
237
|
+
createdAt: row.created_at,
|
|
238
|
+
updatedAt: row.updated_at,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Map database row to PluginRevenue
|
|
243
|
+
*/
|
|
244
|
+
mapRevenue(row) {
|
|
245
|
+
return {
|
|
246
|
+
id: row.id,
|
|
247
|
+
pluginId: row.plugin_id,
|
|
248
|
+
authorId: row.author_id,
|
|
249
|
+
grossRevenue: row.gross_revenue,
|
|
250
|
+
kitCommission: row.kit_commission,
|
|
251
|
+
authorEarnings: row.author_earnings,
|
|
252
|
+
currency: row.currency || "USD",
|
|
253
|
+
updatedAt: row.updated_at,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Map database row to PaymentTransaction
|
|
258
|
+
*/
|
|
259
|
+
mapTransaction(row) {
|
|
260
|
+
return {
|
|
261
|
+
id: row.id,
|
|
262
|
+
authorId: row.author_id,
|
|
263
|
+
stripeTransferId: row.stripe_transfer_id,
|
|
264
|
+
amount: row.amount,
|
|
265
|
+
status: row.status,
|
|
266
|
+
periodStart: row.period_start,
|
|
267
|
+
periodEnd: row.period_end,
|
|
268
|
+
attemptedAt: row.attempted_at,
|
|
269
|
+
completedAt: row.completed_at,
|
|
270
|
+
createdAt: row.created_at,
|
|
271
|
+
updatedAt: row.updated_at,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Map database row to GrantApplication
|
|
276
|
+
*/
|
|
277
|
+
mapGrant(row) {
|
|
278
|
+
return {
|
|
279
|
+
id: row.id,
|
|
280
|
+
authorId: row.author_id,
|
|
281
|
+
pluginId: row.plugin_id,
|
|
282
|
+
amountRequested: row.amount_requested,
|
|
283
|
+
status: row.status,
|
|
284
|
+
useCase: row.use_case,
|
|
285
|
+
approvedBy: row.approved_by,
|
|
286
|
+
approvalDate: row.approval_date,
|
|
287
|
+
paidAt: row.paid_at,
|
|
288
|
+
createdAt: row.created_at,
|
|
289
|
+
updatedAt: row.updated_at,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=payout-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payout-service.js","sourceRoot":"","sources":["../src/payout-service.ts"],"names":[],"mappings":"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"}
|
package/dist/pkg.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit pkg — Install packages from any ecosystem with mandatory triage.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* kit pkg npm:express
|
|
6
|
+
* kit pkg pip:requests
|
|
7
|
+
* kit pkg brew:trivy
|
|
8
|
+
* kit pkg docker:stalwartlabs/stalwart
|
|
9
|
+
* kit pkg go:github.com/sigstore/cosign/v2/cmd/cosign@latest
|
|
10
|
+
* kit pkg cargo:ripgrep
|
|
11
|
+
*/
|
|
12
|
+
export interface PkgSpec {
|
|
13
|
+
ecosystem: string;
|
|
14
|
+
name: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PkgResult {
|
|
18
|
+
spec: PkgSpec;
|
|
19
|
+
triagePassed: boolean;
|
|
20
|
+
installed: boolean;
|
|
21
|
+
output: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse "npm:express@4.18.0" → { ecosystem: "npm", name: "express", version: "4.18.0" }
|
|
25
|
+
*/
|
|
26
|
+
export declare function parsePkgSpec(input: string): PkgSpec | null;
|
|
27
|
+
/**
|
|
28
|
+
* Install a package with mandatory triage
|
|
29
|
+
*/
|
|
30
|
+
export declare function installPkg(spec: PkgSpec): Promise<PkgResult>;
|
package/dist/pkg.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit pkg — Install packages from any ecosystem with mandatory triage.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* kit pkg npm:express
|
|
6
|
+
* kit pkg pip:requests
|
|
7
|
+
* kit pkg brew:trivy
|
|
8
|
+
* kit pkg docker:stalwartlabs/stalwart
|
|
9
|
+
* kit pkg go:github.com/sigstore/cosign/v2/cmd/cosign@latest
|
|
10
|
+
* kit pkg cargo:ripgrep
|
|
11
|
+
*/
|
|
12
|
+
import { exec as execCb } from "node:child_process";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
import { runTriage } from "./triage.js";
|
|
15
|
+
const execAsync = promisify(execCb);
|
|
16
|
+
const ECOSYSTEM_MAP = {
|
|
17
|
+
npm: {
|
|
18
|
+
triageType: "npm",
|
|
19
|
+
installCmd: (name, ver) => ver ? `npm install ${name}@${ver}` : `npm install ${name}`,
|
|
20
|
+
},
|
|
21
|
+
"npm-g": {
|
|
22
|
+
triageType: "npm",
|
|
23
|
+
installCmd: (name, ver) => ver ? `npm install -g ${name}@${ver}` : `npm install -g ${name}`,
|
|
24
|
+
},
|
|
25
|
+
pnpm: {
|
|
26
|
+
triageType: "npm",
|
|
27
|
+
installCmd: (name, ver) => ver ? `pnpm add ${name}@${ver}` : `pnpm add ${name}`,
|
|
28
|
+
},
|
|
29
|
+
pip: {
|
|
30
|
+
triageType: "pip",
|
|
31
|
+
installCmd: (name, ver) => ver ? `pip install ${name}==${ver}` : `pip install ${name}`,
|
|
32
|
+
},
|
|
33
|
+
brew: {
|
|
34
|
+
triageType: "repo",
|
|
35
|
+
installCmd: (name) => `brew install ${name}`,
|
|
36
|
+
},
|
|
37
|
+
docker: {
|
|
38
|
+
triageType: "docker",
|
|
39
|
+
installCmd: (name, ver) => ver ? `docker pull ${name}:${ver}` : `docker pull ${name}:latest`,
|
|
40
|
+
},
|
|
41
|
+
go: {
|
|
42
|
+
triageType: "repo",
|
|
43
|
+
installCmd: (name) => `go install ${name}`,
|
|
44
|
+
},
|
|
45
|
+
cargo: {
|
|
46
|
+
triageType: "repo",
|
|
47
|
+
installCmd: (name) => `cargo install ${name}`,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Parse "npm:express@4.18.0" → { ecosystem: "npm", name: "express", version: "4.18.0" }
|
|
52
|
+
*/
|
|
53
|
+
export function parsePkgSpec(input) {
|
|
54
|
+
const colonIdx = input.indexOf(":");
|
|
55
|
+
if (colonIdx === -1)
|
|
56
|
+
return null;
|
|
57
|
+
const ecosystem = input.slice(0, colonIdx);
|
|
58
|
+
const rest = input.slice(colonIdx + 1);
|
|
59
|
+
// Handle @scoped packages like @socketsecurity/cli@1.0.0
|
|
60
|
+
let name;
|
|
61
|
+
let version;
|
|
62
|
+
if (rest.startsWith("@")) {
|
|
63
|
+
// Scoped: @scope/pkg@version
|
|
64
|
+
const lastAt = rest.lastIndexOf("@");
|
|
65
|
+
if (lastAt > 0 && lastAt !== rest.indexOf("@")) {
|
|
66
|
+
name = rest.slice(0, lastAt);
|
|
67
|
+
version = rest.slice(lastAt + 1);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
name = rest;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const atIdx = rest.indexOf("@");
|
|
75
|
+
if (atIdx > 0) {
|
|
76
|
+
name = rest.slice(0, atIdx);
|
|
77
|
+
version = rest.slice(atIdx + 1);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
name = rest;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { ecosystem, name, version };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get GitHub repo URL for brew formulas
|
|
87
|
+
*/
|
|
88
|
+
async function getBrewRepoUrl(name) {
|
|
89
|
+
try {
|
|
90
|
+
const { stdout } = await execAsync(`brew info --json=v2 ${name} 2>/dev/null`);
|
|
91
|
+
const data = JSON.parse(stdout);
|
|
92
|
+
const formula = data.formulae?.[0] || data.casks?.[0];
|
|
93
|
+
const homepage = formula?.homepage || "";
|
|
94
|
+
if (homepage.includes("github.com"))
|
|
95
|
+
return homepage;
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// brew not available or formula not found — try GitHub search
|
|
100
|
+
return `https://github.com/search?q=${name}`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Install a package with mandatory triage
|
|
105
|
+
*/
|
|
106
|
+
export async function installPkg(spec) {
|
|
107
|
+
const eco = ECOSYSTEM_MAP[spec.ecosystem];
|
|
108
|
+
if (!eco) {
|
|
109
|
+
return {
|
|
110
|
+
spec,
|
|
111
|
+
triagePassed: false,
|
|
112
|
+
installed: false,
|
|
113
|
+
output: `Unknown ecosystem: ${spec.ecosystem}\nSupported: ${Object.keys(ECOSYSTEM_MAP).join(", ")}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Step 1: Triage
|
|
117
|
+
let triageTarget = spec.name;
|
|
118
|
+
if (spec.ecosystem === "brew") {
|
|
119
|
+
const repoUrl = await getBrewRepoUrl(spec.name);
|
|
120
|
+
if (repoUrl && repoUrl.includes("github.com")) {
|
|
121
|
+
triageTarget = repoUrl;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (spec.ecosystem === "docker" && !spec.name.includes("/")) {
|
|
125
|
+
// Official Docker images — skip repo triage, do image triage
|
|
126
|
+
triageTarget = spec.name;
|
|
127
|
+
}
|
|
128
|
+
else if (spec.ecosystem === "go") {
|
|
129
|
+
const ghParts = spec.name.replace("@latest", "").split("/").slice(0, 3);
|
|
130
|
+
triageTarget = `https://${ghParts.join("/")}`;
|
|
131
|
+
}
|
|
132
|
+
const triageResult = await runTriage(eco.triageType, triageTarget);
|
|
133
|
+
if (!triageResult.passed) {
|
|
134
|
+
return {
|
|
135
|
+
spec,
|
|
136
|
+
triagePassed: false,
|
|
137
|
+
installed: false,
|
|
138
|
+
output: `${triageResult.output}\n\n❌ Triage failed. Package not installed.\nReview warnings above. Use --force to override (not recommended).`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Step 2: Install
|
|
142
|
+
const cmd = eco.installCmd(spec.name, spec.version);
|
|
143
|
+
try {
|
|
144
|
+
const { stdout, stderr } = await execAsync(cmd, { timeout: 300_000 });
|
|
145
|
+
return {
|
|
146
|
+
spec,
|
|
147
|
+
triagePassed: true,
|
|
148
|
+
installed: true,
|
|
149
|
+
output: `✅ Triage passed\n✅ Installed: ${cmd}\n${stdout}${stderr ? "\n" + stderr : ""}`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const err = error;
|
|
154
|
+
return {
|
|
155
|
+
spec,
|
|
156
|
+
triagePassed: true,
|
|
157
|
+
installed: false,
|
|
158
|
+
output: `✅ Triage passed\n❌ Install failed: ${cmd}\n${err.stderr || err.message || ""}`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=pkg.js.map
|
package/dist/pkg.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkg.js","sourceRoot":"","sources":["../src/pkg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AdapterRegistry } from "./adapters/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Load plugin adapters from kitPlugins listed in the project's package.json.
|
|
4
|
+
*
|
|
5
|
+
* Plugin registration protocol:
|
|
6
|
+
* 1. Read `kitPlugins` array from `<projectPath>/package.json`
|
|
7
|
+
* 2. For each entry, attempt to import `<plugin>/kit-adapter` then `<plugin>`
|
|
8
|
+
* 3. Expect the module to export `{ adapter: ServiceAdapter }` or `{ adapters: ServiceAdapter[] }`
|
|
9
|
+
* 4. Invalid/missing plugins are skipped with a warning (never throw)
|
|
10
|
+
*
|
|
11
|
+
* @example package.json
|
|
12
|
+
* ```json
|
|
13
|
+
* { "kitPlugins": ["@acme/kit-railway", "sandstream-kit-plugin-aws-s3"] }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadPluginAdapters(projectPath: string): Promise<AdapterRegistry>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve, join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Load plugin adapters from kitPlugins listed in the project's package.json.
|
|
5
|
+
*
|
|
6
|
+
* Plugin registration protocol:
|
|
7
|
+
* 1. Read `kitPlugins` array from `<projectPath>/package.json`
|
|
8
|
+
* 2. For each entry, attempt to import `<plugin>/kit-adapter` then `<plugin>`
|
|
9
|
+
* 3. Expect the module to export `{ adapter: ServiceAdapter }` or `{ adapters: ServiceAdapter[] }`
|
|
10
|
+
* 4. Invalid/missing plugins are skipped with a warning (never throw)
|
|
11
|
+
*
|
|
12
|
+
* @example package.json
|
|
13
|
+
* ```json
|
|
14
|
+
* { "kitPlugins": ["@acme/kit-railway", "sandstream-kit-plugin-aws-s3"] }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export async function loadPluginAdapters(projectPath) {
|
|
18
|
+
const registry = {};
|
|
19
|
+
const pluginNames = await readkitPlugins(projectPath);
|
|
20
|
+
if (pluginNames.length === 0)
|
|
21
|
+
return registry;
|
|
22
|
+
for (const pluginName of pluginNames) {
|
|
23
|
+
try {
|
|
24
|
+
const adapters = await loadSinglePlugin(pluginName, projectPath);
|
|
25
|
+
for (const adapter of adapters) {
|
|
26
|
+
registry[adapter.name] = adapter;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
+
console.warn(`[kit] plugin "${pluginName}" failed to load: ${msg}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return registry;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read the kitPlugins array from package.json, returning [] if absent or unreadable.
|
|
38
|
+
*/
|
|
39
|
+
async function readkitPlugins(projectPath) {
|
|
40
|
+
try {
|
|
41
|
+
const pkgPath = resolve(projectPath, "package.json");
|
|
42
|
+
const raw = await readFile(pkgPath, "utf-8");
|
|
43
|
+
const pkg = JSON.parse(raw);
|
|
44
|
+
const plugins = pkg["kitPlugins"];
|
|
45
|
+
if (!Array.isArray(plugins))
|
|
46
|
+
return [];
|
|
47
|
+
return plugins.filter((p) => typeof p === "string");
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Attempt to load a plugin by name, trying `<plugin>/kit-adapter` first, then `<plugin>`.
|
|
55
|
+
* Returns an array of ServiceAdapters or throws if both entry points fail.
|
|
56
|
+
*/
|
|
57
|
+
async function loadSinglePlugin(pluginName, projectPath) {
|
|
58
|
+
// Resolve the plugin from the project's node_modules (not kit's own node_modules)
|
|
59
|
+
const candidates = [
|
|
60
|
+
join(projectPath, "node_modules", pluginName, "kit-adapter.js"),
|
|
61
|
+
join(projectPath, "node_modules", pluginName, "kit-adapter.cjs"),
|
|
62
|
+
join(projectPath, "node_modules", pluginName, "index.js"),
|
|
63
|
+
join(projectPath, "node_modules", pluginName),
|
|
64
|
+
];
|
|
65
|
+
let mod;
|
|
66
|
+
let lastError;
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
try {
|
|
69
|
+
mod = await import(candidate);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
lastError = err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (mod === undefined) {
|
|
77
|
+
const msg = lastError instanceof Error ? lastError.message : String(lastError);
|
|
78
|
+
throw new Error(`Could not import "${pluginName}": ${msg}`);
|
|
79
|
+
}
|
|
80
|
+
return extractAdapters(mod, pluginName);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract ServiceAdapter(s) from a loaded module, handling both single and array forms.
|
|
84
|
+
*/
|
|
85
|
+
function extractAdapters(mod, pluginName) {
|
|
86
|
+
if (!mod || typeof mod !== "object") {
|
|
87
|
+
throw new Error(`Plugin "${pluginName}" does not export an object`);
|
|
88
|
+
}
|
|
89
|
+
const exports = mod;
|
|
90
|
+
// { adapters: ServiceAdapter[] }
|
|
91
|
+
if (Array.isArray(exports["adapters"])) {
|
|
92
|
+
const adapters = exports["adapters"].filter(isServiceAdapter);
|
|
93
|
+
if (adapters.length > 0)
|
|
94
|
+
return adapters;
|
|
95
|
+
}
|
|
96
|
+
// { adapter: ServiceAdapter }
|
|
97
|
+
if (isServiceAdapter(exports["adapter"])) {
|
|
98
|
+
return [exports["adapter"]];
|
|
99
|
+
}
|
|
100
|
+
// { default: { adapters } } or { default: ServiceAdapter }
|
|
101
|
+
const def = exports["default"];
|
|
102
|
+
if (def && typeof def === "object") {
|
|
103
|
+
const d = def;
|
|
104
|
+
if (Array.isArray(d["adapters"])) {
|
|
105
|
+
const adapters = d["adapters"].filter(isServiceAdapter);
|
|
106
|
+
if (adapters.length > 0)
|
|
107
|
+
return adapters;
|
|
108
|
+
}
|
|
109
|
+
if (isServiceAdapter(def))
|
|
110
|
+
return [def];
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`Plugin "${pluginName}" must export { adapter } or { adapters } — got keys: ${Object.keys(exports).join(", ")}`);
|
|
113
|
+
}
|
|
114
|
+
function isServiceAdapter(value) {
|
|
115
|
+
if (!value || typeof value !== "object")
|
|
116
|
+
return false;
|
|
117
|
+
const v = value;
|
|
118
|
+
return (typeof v["name"] === "string" &&
|
|
119
|
+
typeof v["description"] === "string" &&
|
|
120
|
+
typeof v["check"] === "function" &&
|
|
121
|
+
typeof v["provision"] === "function" &&
|
|
122
|
+
typeof v["getRequiredTools"] === "function");
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=plugin-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
|