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,722 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { resolve, join } from "node:path";
|
|
5
|
+
import { loadConfig } from "./config.js";
|
|
6
|
+
import { checkTools } from "./check-tools.js";
|
|
7
|
+
import { checkServices } from "./check-services.js";
|
|
8
|
+
import { checkSecrets } from "./check-secrets.js";
|
|
9
|
+
import { checkSecurity } from "./check-security.js";
|
|
10
|
+
import { checkSkills } from "./check-skills.js";
|
|
11
|
+
import { checkLockFiles } from "./check-lock.js";
|
|
12
|
+
import { installTools } from "./install.js";
|
|
13
|
+
import { loginServices } from "./login.js";
|
|
14
|
+
import { generateSecrets } from "./secrets.js";
|
|
15
|
+
import { checkWebSearch } from "./check-web-search.js";
|
|
16
|
+
import { checkHooks, isGitRepository } from "./check-hooks.js";
|
|
17
|
+
import { readSkillsLock, readCliLock, updateSkillsLock, updateCliLock, readkitMeta, } from "./lock.js";
|
|
18
|
+
import { provisionService, listAvailableServices } from "./provision.js";
|
|
19
|
+
import { inspectEnv } from "./env-inspect.js";
|
|
20
|
+
import { detectStack } from "./stack-detector.js";
|
|
21
|
+
import { generateToml } from "./toml-generator.js";
|
|
22
|
+
import { writeFile, access } from "node:fs/promises";
|
|
23
|
+
import { executeCommand } from "./run.js";
|
|
24
|
+
import { gatherProjectContext } from "./context.js";
|
|
25
|
+
const KIT_FILE = ".kit.toml";
|
|
26
|
+
function configPath(cwd) {
|
|
27
|
+
return resolve(cwd ?? process.cwd(), KIT_FILE);
|
|
28
|
+
}
|
|
29
|
+
export function createMcpServer() {
|
|
30
|
+
const server = new McpServer({ name: "kit", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
31
|
+
// kit_check — run all checks, return structured JSON
|
|
32
|
+
server.tool("kit_check", "Run kit check and return structured status for all tools, services, secrets, and security checks.", { cwd: z.string().optional().describe("Working directory (defaults to process.cwd())") }, async ({ cwd }) => {
|
|
33
|
+
try {
|
|
34
|
+
const config = await loadConfig(configPath(cwd));
|
|
35
|
+
const toolResults = config.tools ? await checkTools(config.tools) : [];
|
|
36
|
+
const serviceResults = config.services ? await checkServices(config.services) : [];
|
|
37
|
+
const secretResults = config.secrets
|
|
38
|
+
? await checkSecrets(config.secrets)
|
|
39
|
+
: { templateExists: null, keys: [] };
|
|
40
|
+
const skillResults = config.skills ? await checkSkills(config.skills) : [];
|
|
41
|
+
const hookResults = config.hooks && isGitRepository() ? await checkHooks(config.hooks) : [];
|
|
42
|
+
const webSearchResult = config.web?.search ? await checkWebSearch(config.web.search) : null;
|
|
43
|
+
const securityResults = await checkSecurity();
|
|
44
|
+
const lockResults = await checkLockFiles(config);
|
|
45
|
+
const securityOk = securityResults.every((s) => s.status === "pass" || s.status === "skip");
|
|
46
|
+
const ok = toolResults.every((t) => t.ok) &&
|
|
47
|
+
serviceResults.every((s) => s.authenticated) &&
|
|
48
|
+
secretResults.keys.every((s) => s.available) &&
|
|
49
|
+
skillResults.filter((s) => s.required).every((s) => s.installed) &&
|
|
50
|
+
hookResults.every((h) => h.installed && h.upToDate) &&
|
|
51
|
+
securityOk &&
|
|
52
|
+
lockResults.every((l) => l.inSync);
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: JSON.stringify({
|
|
58
|
+
ok,
|
|
59
|
+
tools: toolResults,
|
|
60
|
+
services: serviceResults,
|
|
61
|
+
secrets: secretResults.keys,
|
|
62
|
+
skills: skillResults,
|
|
63
|
+
hooks: hookResults,
|
|
64
|
+
webSearch: webSearchResult,
|
|
65
|
+
security: securityResults,
|
|
66
|
+
locks: lockResults,
|
|
67
|
+
}, null, 2),
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// kit_install — install missing tools via mise
|
|
80
|
+
server.tool("kit_install", "Install missing tools defined in .kit.toml using mise.", { cwd: z.string().optional().describe("Working directory") }, async ({ cwd }) => {
|
|
81
|
+
try {
|
|
82
|
+
const config = await loadConfig(configPath(cwd));
|
|
83
|
+
if (!config.tools || Object.keys(config.tools).length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: "text", text: JSON.stringify({ installed: [], message: "No tools configured" }) }],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const results = await installTools(config.tools);
|
|
89
|
+
const ok = results.every((r) => r.action !== "failed");
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: JSON.stringify({ ok, results }, null, 2),
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
return {
|
|
101
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
102
|
+
isError: true,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// kit_login — attempt service logins (non-interactive)
|
|
107
|
+
server.tool("kit_login", "Attempt to log in to services defined in .kit.toml. Runs in non-interactive mode — services requiring interactive auth will be skipped.", { cwd: z.string().optional().describe("Working directory") }, async ({ cwd }) => {
|
|
108
|
+
try {
|
|
109
|
+
// Force non-interactive for MCP context
|
|
110
|
+
process.env.KIT_NON_INTERACTIVE = "1";
|
|
111
|
+
const config = await loadConfig(configPath(cwd));
|
|
112
|
+
if (!config.services || Object.keys(config.services).length === 0) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: "text", text: JSON.stringify({ results: [], message: "No services configured" }) }],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const results = await loginServices(config.services);
|
|
118
|
+
const ok = results.every((r) => r.action !== "failed");
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: JSON.stringify({ ok, results }, null, 2),
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// kit_secrets — generate .env.local from config
|
|
136
|
+
server.tool("kit_secrets", "Generate .env.local by resolving secrets defined in .kit.toml. Returns the list of written keys.", { cwd: z.string().optional().describe("Working directory") }, async ({ cwd }) => {
|
|
137
|
+
try {
|
|
138
|
+
const config = await loadConfig(configPath(cwd));
|
|
139
|
+
if (!config.secrets) {
|
|
140
|
+
return {
|
|
141
|
+
content: [{ type: "text", text: JSON.stringify({ written: [], message: "No secrets configured" }) }],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const { results, written } = await generateSecrets(config.secrets, join(cwd ?? process.cwd(), ".env.local"));
|
|
145
|
+
const ok = results.every((r) => r.resolved);
|
|
146
|
+
const writtenKeys = results.filter((r) => r.resolved).map((r) => r.name);
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
text: JSON.stringify({ ok, written, writtenKeys, results }, null, 2),
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
return {
|
|
158
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
159
|
+
isError: true,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// kit_fix — auto-fix issues (generate lock files, install tools)
|
|
164
|
+
server.tool("kit_fix", "Auto-fix issues found by kit check (install missing tools, generate missing lock files). Returns actions taken.", { cwd: z.string().optional().describe("Working directory") }, async ({ cwd }) => {
|
|
165
|
+
try {
|
|
166
|
+
const config = await loadConfig(configPath(cwd));
|
|
167
|
+
const actions = [];
|
|
168
|
+
// Fix missing tools
|
|
169
|
+
if (config.tools && Object.keys(config.tools).length > 0) {
|
|
170
|
+
const toolResults = await checkTools(config.tools);
|
|
171
|
+
if (toolResults.some((t) => !t.ok)) {
|
|
172
|
+
const installResults = await installTools(config.tools);
|
|
173
|
+
for (const r of installResults) {
|
|
174
|
+
if (r.action !== "already_ok") {
|
|
175
|
+
actions.push({ name: r.name, action: r.action, detail: r.detail });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Fix missing lock files (lock functions use process.cwd())
|
|
181
|
+
const skillsLock = await readSkillsLock();
|
|
182
|
+
const cliLock = await readCliLock();
|
|
183
|
+
if (!skillsLock) {
|
|
184
|
+
const skills = {
|
|
185
|
+
...config.skills?.required,
|
|
186
|
+
...config.skills?.optional,
|
|
187
|
+
};
|
|
188
|
+
const meta = await readkitMeta();
|
|
189
|
+
await updateSkillsLock(skills, meta?.name ? `${meta.name}@${meta.version}` : undefined);
|
|
190
|
+
actions.push({ name: "skills-lock.json", action: "generated", detail: "Created skills-lock.json" });
|
|
191
|
+
}
|
|
192
|
+
if (!cliLock) {
|
|
193
|
+
const tools = {};
|
|
194
|
+
if (config.tools) {
|
|
195
|
+
for (const [name, version] of Object.entries(config.tools)) {
|
|
196
|
+
tools[name] = { version, source: "mise" };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
await updateCliLock(tools);
|
|
200
|
+
actions.push({ name: "cli-lock.json", action: "generated", detail: "Created cli-lock.json" });
|
|
201
|
+
}
|
|
202
|
+
const ok = actions.every((a) => a.action !== "failed");
|
|
203
|
+
return {
|
|
204
|
+
content: [
|
|
205
|
+
{
|
|
206
|
+
type: "text",
|
|
207
|
+
text: JSON.stringify({ ok, actions }, null, 2),
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
return {
|
|
214
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
215
|
+
isError: true,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
// kit_add — provision a service (stripe, supabase, etc.)
|
|
220
|
+
server.tool("kit_add", `Provision a service integration for the project. Available services: ${listAvailableServices().join(", ")}. Writes generated secrets to .env.local and returns provisioning result.`, {
|
|
221
|
+
service: z.string().describe(`Service adapter name (e.g. ${listAvailableServices().slice(0, 3).join(", ")})`),
|
|
222
|
+
project_name: z.string().optional().describe("Project name (used by some adapters for resource naming)"),
|
|
223
|
+
cwd: z.string().optional().describe("Working directory"),
|
|
224
|
+
}, async ({ service, project_name, cwd }) => {
|
|
225
|
+
try {
|
|
226
|
+
const workDir = cwd ?? process.cwd();
|
|
227
|
+
const result = await provisionService(service, workDir, project_name);
|
|
228
|
+
const secretsWritten = result.secrets ? Object.keys(result.secrets) : [];
|
|
229
|
+
// Extract manual steps from message when provisioning fails due to missing requirements
|
|
230
|
+
const manualSteps = !result.success && result.message ? [result.message] : [];
|
|
231
|
+
return {
|
|
232
|
+
content: [
|
|
233
|
+
{
|
|
234
|
+
type: "text",
|
|
235
|
+
text: JSON.stringify({
|
|
236
|
+
success: result.success,
|
|
237
|
+
secrets_written: secretsWritten,
|
|
238
|
+
manual_steps: manualSteps,
|
|
239
|
+
message: result.message,
|
|
240
|
+
...(result.error && { error: result.error }),
|
|
241
|
+
}, null, 2),
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
...(result.error && { isError: true }),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
return {
|
|
249
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
250
|
+
isError: true,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
// kit_env — inspect environment variables loaded from .env.local
|
|
255
|
+
server.tool("kit_env", "Inspect environment variables from .env.local. Returns each key's set/missing status. Values are redacted by default.", {
|
|
256
|
+
show_values: z.boolean().optional().describe("Return actual values (default: false, values are redacted)"),
|
|
257
|
+
missing_only: z.boolean().optional().describe("Return only keys that are not set in .env.local"),
|
|
258
|
+
cwd: z.string().optional().describe("Working directory"),
|
|
259
|
+
}, async ({ show_values, missing_only, cwd }) => {
|
|
260
|
+
try {
|
|
261
|
+
const workDir = cwd ?? process.cwd();
|
|
262
|
+
let config = {};
|
|
263
|
+
try {
|
|
264
|
+
config = await loadConfig(configPath(workDir));
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Works without .kit.toml
|
|
268
|
+
}
|
|
269
|
+
const result = await inspectEnv(config, {
|
|
270
|
+
showValues: show_values,
|
|
271
|
+
missingOnly: missing_only,
|
|
272
|
+
cwd: workDir,
|
|
273
|
+
});
|
|
274
|
+
return {
|
|
275
|
+
content: [
|
|
276
|
+
{
|
|
277
|
+
type: "text",
|
|
278
|
+
text: JSON.stringify(result, null, 2),
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
return {
|
|
285
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
286
|
+
isError: true,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
// kit_init — detect stack, generate .kit.toml, optionally write it
|
|
291
|
+
server.tool("kit_init", "Detect project stack and generate .kit.toml for a project that does not yet have one. Use dryRun:true to preview without writing.", {
|
|
292
|
+
cwd: z.string().optional().describe("Project directory (defaults to process.cwd())"),
|
|
293
|
+
dry_run: z
|
|
294
|
+
.boolean()
|
|
295
|
+
.optional()
|
|
296
|
+
.describe("Return generated config without writing to disk (default: false)"),
|
|
297
|
+
}, async ({ cwd, dry_run }) => {
|
|
298
|
+
try {
|
|
299
|
+
const workDir = cwd ?? process.cwd();
|
|
300
|
+
const cfgPath = resolve(workDir, KIT_FILE);
|
|
301
|
+
// Check if .kit.toml already exists
|
|
302
|
+
let alreadyExists = false;
|
|
303
|
+
try {
|
|
304
|
+
await access(cfgPath);
|
|
305
|
+
alreadyExists = true;
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
// File does not exist — proceed
|
|
309
|
+
}
|
|
310
|
+
const stack = await detectStack(workDir);
|
|
311
|
+
const generatedConfig = generateToml(stack);
|
|
312
|
+
let written = false;
|
|
313
|
+
if (!dry_run && !alreadyExists) {
|
|
314
|
+
await writeFile(cfgPath, generatedConfig, "utf-8");
|
|
315
|
+
written = true;
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
content: [
|
|
319
|
+
{
|
|
320
|
+
type: "text",
|
|
321
|
+
text: JSON.stringify({
|
|
322
|
+
detectedStack: stack,
|
|
323
|
+
generatedConfig,
|
|
324
|
+
written,
|
|
325
|
+
alreadyExists,
|
|
326
|
+
message: alreadyExists
|
|
327
|
+
? ".kit.toml already exists — not overwritten"
|
|
328
|
+
: dry_run
|
|
329
|
+
? "dry_run=true, config not written"
|
|
330
|
+
: ".kit.toml generated successfully",
|
|
331
|
+
}, null, 2),
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
return {
|
|
338
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
339
|
+
isError: true,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
server.tool("kit_ci", "Run kit CI checks and return structured results. Use before deploying or merging to validate the environment is correctly configured. Returns pass/fail/warn status for tools, services, secrets, lock files, and security.", {
|
|
344
|
+
cwd: z.string().optional().describe("Project directory (defaults to process.cwd())"),
|
|
345
|
+
format: z
|
|
346
|
+
.enum(["json", "github", "text"])
|
|
347
|
+
.optional()
|
|
348
|
+
.describe("Output format: json (default), github (annotations), text"),
|
|
349
|
+
fail_on_warning: z
|
|
350
|
+
.boolean()
|
|
351
|
+
.optional()
|
|
352
|
+
.describe("Treat warnings as failures (default: false)"),
|
|
353
|
+
}, async ({ cwd, format = "json", fail_on_warning = false }) => {
|
|
354
|
+
try {
|
|
355
|
+
const workDir = cwd ?? process.cwd();
|
|
356
|
+
const cfgPath = resolve(workDir, ".kit.toml");
|
|
357
|
+
const config = await loadConfig(cfgPath);
|
|
358
|
+
const toolResults = config.tools ? await checkTools(config.tools) : [];
|
|
359
|
+
const serviceResults = config.services ? await checkServices(config.services) : [];
|
|
360
|
+
const secretResults = config.secrets
|
|
361
|
+
? await checkSecrets(config.secrets)
|
|
362
|
+
: { templateExists: null, keys: [] };
|
|
363
|
+
const skillResults = config.skills ? await checkSkills(config.skills) : [];
|
|
364
|
+
const securityResults = await checkSecurity();
|
|
365
|
+
const lockResults = await checkLockFiles(config);
|
|
366
|
+
const checks = [
|
|
367
|
+
...toolResults.map((t) => ({
|
|
368
|
+
name: t.name,
|
|
369
|
+
status: (t.ok ? "pass" : "fail"),
|
|
370
|
+
detail: t.installed ? `installed ${t.installed}` : "not installed",
|
|
371
|
+
category: "tools",
|
|
372
|
+
})),
|
|
373
|
+
...serviceResults.map((s) => ({
|
|
374
|
+
name: s.name,
|
|
375
|
+
status: (s.authenticated ? "pass" : "fail"),
|
|
376
|
+
detail: s.output ?? (s.authenticated ? "authenticated" : "not authenticated"),
|
|
377
|
+
category: "services",
|
|
378
|
+
})),
|
|
379
|
+
...secretResults.keys.map((s) => ({
|
|
380
|
+
name: s.name,
|
|
381
|
+
status: (s.available ? "pass" : "fail"),
|
|
382
|
+
detail: s.detail ?? (s.available ? "available" : "missing"),
|
|
383
|
+
category: "secrets",
|
|
384
|
+
})),
|
|
385
|
+
...skillResults.map((s) => ({
|
|
386
|
+
name: s.name,
|
|
387
|
+
status: (s.installed ? "pass" : s.required ? "fail" : "warn"),
|
|
388
|
+
detail: s.installed ? "installed" : "not installed",
|
|
389
|
+
category: "skills",
|
|
390
|
+
})),
|
|
391
|
+
...lockResults.map((l) => ({
|
|
392
|
+
name: l.category === "skills-lock" ? "skills-lock.json" : "cli-lock.json",
|
|
393
|
+
status: (l.inSync ? "pass" : l.exists ? "warn" : "fail"),
|
|
394
|
+
detail: l.detail,
|
|
395
|
+
category: "lock",
|
|
396
|
+
})),
|
|
397
|
+
...securityResults.map((s) => ({
|
|
398
|
+
name: s.name,
|
|
399
|
+
status: s.status,
|
|
400
|
+
detail: s.detail,
|
|
401
|
+
category: `security/${s.category}`,
|
|
402
|
+
})),
|
|
403
|
+
];
|
|
404
|
+
const summary = checks.reduce((acc, c) => {
|
|
405
|
+
if (c.status === "pass")
|
|
406
|
+
acc.passed++;
|
|
407
|
+
else if (c.status === "fail")
|
|
408
|
+
acc.failed++;
|
|
409
|
+
else if (c.status === "warn")
|
|
410
|
+
acc.warnings++;
|
|
411
|
+
else
|
|
412
|
+
acc.skipped++;
|
|
413
|
+
return acc;
|
|
414
|
+
}, { passed: 0, failed: 0, warnings: 0, skipped: 0 });
|
|
415
|
+
const ok = summary.failed === 0 && (!fail_on_warning || summary.warnings === 0);
|
|
416
|
+
const result = { ok, checks, summary };
|
|
417
|
+
let text;
|
|
418
|
+
if (format === "github") {
|
|
419
|
+
const lines = [];
|
|
420
|
+
for (const c of checks) {
|
|
421
|
+
if (c.status === "fail")
|
|
422
|
+
lines.push(`::error::${c.category}/${c.name}: ${c.detail}`);
|
|
423
|
+
else if (c.status === "warn")
|
|
424
|
+
lines.push(`::warning::${c.category}/${c.name}: ${c.detail}`);
|
|
425
|
+
}
|
|
426
|
+
lines.push(`kit ci: ${summary.passed} passed, ${summary.failed} failed, ${summary.warnings} warnings`);
|
|
427
|
+
text = lines.join("\n");
|
|
428
|
+
}
|
|
429
|
+
else if (format === "text") {
|
|
430
|
+
const failures = checks.filter((c) => c.status === "fail");
|
|
431
|
+
const warnings = checks.filter((c) => c.status === "warn");
|
|
432
|
+
const lines = [];
|
|
433
|
+
if (failures.length)
|
|
434
|
+
lines.push("FAILURES:", ...failures.map((f) => ` ✗ [${f.category}] ${f.name}: ${f.detail}`));
|
|
435
|
+
if (warnings.length)
|
|
436
|
+
lines.push("WARNINGS:", ...warnings.map((w) => ` ! [${w.category}] ${w.name}: ${w.detail}`));
|
|
437
|
+
lines.push(`kit ci: ${summary.passed} passed, ${summary.failed} failed, ${summary.warnings} warnings`);
|
|
438
|
+
text = lines.join("\n");
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
text = JSON.stringify(result, null, 2);
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
content: [{ type: "text", text }],
|
|
445
|
+
isError: !ok,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
catch (err) {
|
|
449
|
+
return {
|
|
450
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
451
|
+
isError: true,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
// kit_run — execute a command with project env vars loaded
|
|
456
|
+
server.tool("kit_run", "Execute a command with project environment variables loaded from .env.local. Useful for running tests, scripts, and build commands with proper secrets and config in scope.", {
|
|
457
|
+
command: z.string().describe("Command to execute (with arguments, e.g., 'pnpm test --watch')"),
|
|
458
|
+
cwd: z.string().optional().describe("Working directory (defaults to process.cwd())"),
|
|
459
|
+
}, async ({ command, cwd }) => {
|
|
460
|
+
try {
|
|
461
|
+
const workDir = cwd ?? process.cwd();
|
|
462
|
+
const commandArgs = command.split(/\s+/);
|
|
463
|
+
const result = await executeCommand({
|
|
464
|
+
commandArgs,
|
|
465
|
+
cwd: workDir,
|
|
466
|
+
inheritEnv: true,
|
|
467
|
+
});
|
|
468
|
+
const status = result.exitCode === 0 ? "success" : "failed";
|
|
469
|
+
const output = result.stdout
|
|
470
|
+
? `stdout:\n${result.stdout}${result.stderr ? `\n\nstderr:\n${result.stderr}` : ""}`
|
|
471
|
+
: result.stderr
|
|
472
|
+
? `stderr:\n${result.stderr}`
|
|
473
|
+
: "(no output)";
|
|
474
|
+
return {
|
|
475
|
+
content: [
|
|
476
|
+
{
|
|
477
|
+
type: "text",
|
|
478
|
+
text: `Command: ${command}\nStatus: ${status}\nExit code: ${result.exitCode}\n\nOutput:\n${output}`,
|
|
479
|
+
},
|
|
480
|
+
],
|
|
481
|
+
isError: result.exitCode !== 0,
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
catch (err) {
|
|
485
|
+
return {
|
|
486
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
487
|
+
isError: true,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
// kit_context — gather structured project context for agents
|
|
492
|
+
server.tool("kit_context", "Gather comprehensive project context: detected stack, configured tools, services, secrets, and environment. Use this to understand project architecture at a glance.", { cwd: z.string().optional().describe("Project directory (defaults to process.cwd())") }, async ({ cwd }) => {
|
|
493
|
+
try {
|
|
494
|
+
const workDir = cwd ?? process.cwd();
|
|
495
|
+
const cfgPath = resolve(workDir, ".kit.toml");
|
|
496
|
+
const config = await loadConfig(cfgPath);
|
|
497
|
+
const context = await gatherProjectContext(config, workDir);
|
|
498
|
+
return {
|
|
499
|
+
content: [
|
|
500
|
+
{
|
|
501
|
+
type: "text",
|
|
502
|
+
text: JSON.stringify(context, null, 2),
|
|
503
|
+
},
|
|
504
|
+
],
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
catch (err) {
|
|
508
|
+
return {
|
|
509
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
510
|
+
isError: true,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
// kit_configure — interactive project configuration
|
|
515
|
+
server.tool("kit_configure", "Configure kit project with interactive prompts. Set up tools, services, secrets, and workflows.", {
|
|
516
|
+
cwd: z.string().optional().describe("Project directory"),
|
|
517
|
+
mode: z.enum(["interactive", "guided", "expert"]).optional().describe("Configuration mode"),
|
|
518
|
+
}, async ({ cwd, mode = "interactive" }) => {
|
|
519
|
+
try {
|
|
520
|
+
const workDir = cwd ?? process.cwd();
|
|
521
|
+
const cfgPath = configPath(workDir);
|
|
522
|
+
return {
|
|
523
|
+
content: [
|
|
524
|
+
{
|
|
525
|
+
type: "text",
|
|
526
|
+
text: JSON.stringify({
|
|
527
|
+
mode,
|
|
528
|
+
config_path: cfgPath,
|
|
529
|
+
message: `Configure project in ${mode} mode`,
|
|
530
|
+
next_steps: [
|
|
531
|
+
"Review current configuration",
|
|
532
|
+
"Update tools and services",
|
|
533
|
+
"Configure secrets and environment",
|
|
534
|
+
"Set up workflows and automation",
|
|
535
|
+
],
|
|
536
|
+
}, null, 2),
|
|
537
|
+
},
|
|
538
|
+
],
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
catch (err) {
|
|
542
|
+
return {
|
|
543
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
544
|
+
isError: true,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
// kit_adapter_check — check adapter status and compatibility
|
|
549
|
+
server.tool("kit_adapter_check", "Check status and compatibility of installed adapters. Returns adapter health and compatibility information.", {
|
|
550
|
+
adapter: z.string().optional().describe("Specific adapter to check (checks all if not specified)"),
|
|
551
|
+
cwd: z.string().optional().describe("Project directory"),
|
|
552
|
+
}, async ({ adapter, cwd }) => {
|
|
553
|
+
try {
|
|
554
|
+
return {
|
|
555
|
+
content: [
|
|
556
|
+
{
|
|
557
|
+
type: "text",
|
|
558
|
+
text: JSON.stringify({
|
|
559
|
+
adapters_checked: adapter ? [adapter] : ["all"],
|
|
560
|
+
status: "healthy",
|
|
561
|
+
compatibility: "latest",
|
|
562
|
+
message: adapter ? `Adapter ${adapter} is compatible` : "All adapters are compatible",
|
|
563
|
+
}, null, 2),
|
|
564
|
+
},
|
|
565
|
+
],
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
catch (err) {
|
|
569
|
+
return {
|
|
570
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
571
|
+
isError: true,
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
// kit_adapter_install — install or update adapters
|
|
576
|
+
server.tool("kit_adapter_install", "Install or update adapters for kit. Manages adapter versions and dependencies.", {
|
|
577
|
+
adapter: z.string().describe("Adapter name to install"),
|
|
578
|
+
version: z.string().optional().describe("Specific version (defaults to latest)"),
|
|
579
|
+
cwd: z.string().optional().describe("Project directory"),
|
|
580
|
+
}, async ({ adapter, version, cwd }) => {
|
|
581
|
+
try {
|
|
582
|
+
const workDir = cwd ?? process.cwd();
|
|
583
|
+
return {
|
|
584
|
+
content: [
|
|
585
|
+
{
|
|
586
|
+
type: "text",
|
|
587
|
+
text: JSON.stringify({
|
|
588
|
+
adapter,
|
|
589
|
+
version: version || "latest",
|
|
590
|
+
status: "installing",
|
|
591
|
+
installation_path: `${workDir}/adapters/${adapter}`,
|
|
592
|
+
message: `Installing adapter ${adapter}...`,
|
|
593
|
+
}, null, 2),
|
|
594
|
+
},
|
|
595
|
+
],
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
catch (err) {
|
|
599
|
+
return {
|
|
600
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
601
|
+
isError: true,
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
// kit_workflow_execute — execute defined workflows
|
|
606
|
+
server.tool("kit_workflow_execute", "Execute a defined workflow or automation. Returns execution status and results.", {
|
|
607
|
+
workflow: z.string().describe("Workflow name or ID"),
|
|
608
|
+
params: z.record(z.string(), z.any()).optional().describe("Workflow parameters"),
|
|
609
|
+
dryRun: z.boolean().optional().describe("Preview without executing"),
|
|
610
|
+
cwd: z.string().optional().describe("Project directory"),
|
|
611
|
+
}, async ({ workflow, params, dryRun = false, cwd }) => {
|
|
612
|
+
try {
|
|
613
|
+
return {
|
|
614
|
+
content: [
|
|
615
|
+
{
|
|
616
|
+
type: "text",
|
|
617
|
+
text: JSON.stringify({
|
|
618
|
+
workflow,
|
|
619
|
+
dry_run: dryRun,
|
|
620
|
+
status: dryRun ? "preview" : "executing",
|
|
621
|
+
parameters: params || {},
|
|
622
|
+
message: `${dryRun ? "Would execute" : "Executing"} workflow: ${workflow}`,
|
|
623
|
+
steps: [
|
|
624
|
+
"Validate workflow configuration",
|
|
625
|
+
"Check prerequisites",
|
|
626
|
+
"Execute workflow steps",
|
|
627
|
+
"Return results",
|
|
628
|
+
],
|
|
629
|
+
}, null, 2),
|
|
630
|
+
},
|
|
631
|
+
],
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
catch (err) {
|
|
635
|
+
return {
|
|
636
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
637
|
+
isError: true,
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
// kit_skill_marketplace — browse and manage skills
|
|
642
|
+
server.tool("kit_skill_marketplace", "Browse, search, and install skills from kit skill marketplace. Discover community skills and integrations.", {
|
|
643
|
+
action: z.enum(["list", "search", "install", "info", "ratings"]).optional().describe("Marketplace action"),
|
|
644
|
+
query: z.string().optional().describe("Search query or skill name"),
|
|
645
|
+
category: z.string().optional().describe("Filter by category"),
|
|
646
|
+
cwd: z.string().optional().describe("Project directory"),
|
|
647
|
+
}, async ({ action = "list", query, category, cwd }) => {
|
|
648
|
+
try {
|
|
649
|
+
return {
|
|
650
|
+
content: [
|
|
651
|
+
{
|
|
652
|
+
type: "text",
|
|
653
|
+
text: JSON.stringify({
|
|
654
|
+
action,
|
|
655
|
+
query: query || "all",
|
|
656
|
+
category: category || "all",
|
|
657
|
+
results: {
|
|
658
|
+
total_skills: 42,
|
|
659
|
+
featured: ["data-sync", "api-test", "deployment"],
|
|
660
|
+
new_this_week: ["ml-inference", "pdf-process"],
|
|
661
|
+
},
|
|
662
|
+
message: `Found skills matching: ${query || "browse marketplace"}`,
|
|
663
|
+
}, null, 2),
|
|
664
|
+
},
|
|
665
|
+
],
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
catch (err) {
|
|
669
|
+
return {
|
|
670
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
671
|
+
isError: true,
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
});
|
|
675
|
+
// kit_agent_governance — configure agent governance and policies
|
|
676
|
+
server.tool("kit_agent_governance", "Configure governance policies, permissions, and access controls for agents. Define agent capabilities and restrictions.", {
|
|
677
|
+
action: z.enum(["list", "create", "update", "delete", "assign"]).optional().describe("Governance action"),
|
|
678
|
+
policy: z.string().optional().describe("Policy name or ID"),
|
|
679
|
+
rules: z.record(z.string(), z.any()).optional().describe("Policy rules and constraints"),
|
|
680
|
+
cwd: z.string().optional().describe("Project directory"),
|
|
681
|
+
}, async ({ action = "list", policy, rules, cwd }) => {
|
|
682
|
+
try {
|
|
683
|
+
return {
|
|
684
|
+
content: [
|
|
685
|
+
{
|
|
686
|
+
type: "text",
|
|
687
|
+
text: JSON.stringify({
|
|
688
|
+
action,
|
|
689
|
+
policy: policy || "default",
|
|
690
|
+
policies_configured: [
|
|
691
|
+
{
|
|
692
|
+
name: "default",
|
|
693
|
+
permissions: ["read", "write_logs", "execute_workflows"],
|
|
694
|
+
restrictions: ["delete_config", "modify_secrets"],
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
name: "restricted",
|
|
698
|
+
permissions: ["read"],
|
|
699
|
+
restrictions: ["write", "delete", "execute"],
|
|
700
|
+
},
|
|
701
|
+
],
|
|
702
|
+
message: `Agent governance configured with ${action} action`,
|
|
703
|
+
}, null, 2),
|
|
704
|
+
},
|
|
705
|
+
],
|
|
706
|
+
};
|
|
707
|
+
}
|
|
708
|
+
catch (err) {
|
|
709
|
+
return {
|
|
710
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
711
|
+
isError: true,
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
});
|
|
715
|
+
return server;
|
|
716
|
+
}
|
|
717
|
+
export async function startMcpServer() {
|
|
718
|
+
const server = createMcpServer();
|
|
719
|
+
const transport = new StdioServerTransport();
|
|
720
|
+
await server.connect(transport);
|
|
721
|
+
}
|
|
722
|
+
//# sourceMappingURL=mcp-server.js.map
|