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,215 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { generateSecrets } from "./secrets.js";
|
|
4
|
+
import { exec } from "./utils/exec.js";
|
|
5
|
+
/**
|
|
6
|
+
* Resolve secret values from the configured store, then push them to the
|
|
7
|
+
* requested target (GitHub Actions secrets, .env.ci, or stdout export lines).
|
|
8
|
+
*/
|
|
9
|
+
export async function syncSecrets(secrets, options) {
|
|
10
|
+
const { target, dryRun = false, projectPath = process.cwd() } = options;
|
|
11
|
+
// Resolve all secrets using the existing generate logic (reads from stores)
|
|
12
|
+
const { results } = await generateSecrets(secrets, "/dev/null");
|
|
13
|
+
const resolved = {};
|
|
14
|
+
for (const r of results) {
|
|
15
|
+
if (r.resolved && r.value !== null && !r.value.startsWith("(")) {
|
|
16
|
+
resolved[r.name] = r.value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const synced = [];
|
|
20
|
+
const skipped = [];
|
|
21
|
+
const failed = [];
|
|
22
|
+
switch (target) {
|
|
23
|
+
case "github":
|
|
24
|
+
return syncToGitHub(resolved, dryRun, synced, skipped, failed);
|
|
25
|
+
case "dotenv-ci": {
|
|
26
|
+
const outPath = resolve(projectPath, ".env.ci");
|
|
27
|
+
const lines = Object.entries(resolved).map(([k, v]) => `${k}=${v}`);
|
|
28
|
+
if (!dryRun) {
|
|
29
|
+
await writeFile(outPath, lines.join("\n") + "\n", "utf8");
|
|
30
|
+
synced.push(...Object.keys(resolved));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
skipped.push(...Object.keys(resolved));
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
target,
|
|
37
|
+
synced,
|
|
38
|
+
skipped,
|
|
39
|
+
failed,
|
|
40
|
+
dryRun,
|
|
41
|
+
message: dryRun
|
|
42
|
+
? `Would write ${lines.length} secrets to .env.ci`
|
|
43
|
+
: `Wrote ${synced.length} secrets to ${outPath}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
case "stdout": {
|
|
47
|
+
const lines = Object.entries(resolved).map(([k, v]) => `export ${k}='${v.replace(/'/g, "'\\''")}'`);
|
|
48
|
+
if (!dryRun) {
|
|
49
|
+
process.stdout.write(lines.join("\n") + "\n");
|
|
50
|
+
synced.push(...Object.keys(resolved));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
skipped.push(...Object.keys(resolved));
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
target,
|
|
57
|
+
synced,
|
|
58
|
+
skipped,
|
|
59
|
+
failed,
|
|
60
|
+
dryRun,
|
|
61
|
+
message: dryRun
|
|
62
|
+
? `Would export ${lines.length} secrets`
|
|
63
|
+
: `Exported ${synced.length} secrets`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
default:
|
|
67
|
+
return {
|
|
68
|
+
target,
|
|
69
|
+
synced: [],
|
|
70
|
+
skipped: [],
|
|
71
|
+
failed: [`Unknown target: ${target}`],
|
|
72
|
+
dryRun,
|
|
73
|
+
message: `Unknown sync target: ${target}. Use: github, dotenv-ci, stdout`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function syncToGitHub(secrets, dryRun, synced, skipped, failed) {
|
|
78
|
+
const token = process.env.GITHUB_TOKEN;
|
|
79
|
+
if (!token) {
|
|
80
|
+
return {
|
|
81
|
+
target: "github",
|
|
82
|
+
synced: [],
|
|
83
|
+
skipped: [],
|
|
84
|
+
failed: ["GITHUB_TOKEN not set"],
|
|
85
|
+
dryRun,
|
|
86
|
+
message: "Set GITHUB_TOKEN with repo scope to sync secrets to GitHub Actions",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Detect repo from git remote
|
|
90
|
+
let owner, repo;
|
|
91
|
+
try {
|
|
92
|
+
const { stdout } = await exec("git", ["remote", "get-url", "origin"], {
|
|
93
|
+
timeout: 5_000,
|
|
94
|
+
});
|
|
95
|
+
const remote = stdout.trim();
|
|
96
|
+
const match = remote.match(/github\.com[:/]([^/]+)\/(.+?)(?:\.git)?$/) ??
|
|
97
|
+
remote.match(/github\.com\/([^/]+)\/(.+?)(?:\.git)?$/);
|
|
98
|
+
if (!match)
|
|
99
|
+
throw new Error(`Cannot parse GitHub remote: ${remote}`);
|
|
100
|
+
[, owner, repo] = match;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return {
|
|
104
|
+
target: "github",
|
|
105
|
+
synced: [],
|
|
106
|
+
skipped: [],
|
|
107
|
+
failed: [`Could not determine GitHub repo: ${err.message}`],
|
|
108
|
+
dryRun,
|
|
109
|
+
message: "Run kit secrets sync --target=github from inside a GitHub repo",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Fetch repo public key for encryption
|
|
113
|
+
const keyResp = await fetch(`https://api.github.com/repos/${owner}/${repo}/actions/secrets/public-key`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/vnd.github+json" } });
|
|
114
|
+
if (!keyResp.ok) {
|
|
115
|
+
return {
|
|
116
|
+
target: "github",
|
|
117
|
+
synced: [],
|
|
118
|
+
skipped: [],
|
|
119
|
+
failed: [`GitHub API error ${keyResp.status}: ${await keyResp.text()}`],
|
|
120
|
+
dryRun,
|
|
121
|
+
message: "Failed to fetch GitHub repo public key",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const { key, key_id } = (await keyResp.json());
|
|
125
|
+
if (dryRun) {
|
|
126
|
+
skipped.push(...Object.keys(secrets));
|
|
127
|
+
return {
|
|
128
|
+
target: "github",
|
|
129
|
+
synced,
|
|
130
|
+
skipped,
|
|
131
|
+
failed,
|
|
132
|
+
dryRun: true,
|
|
133
|
+
message: `Would sync ${skipped.length} secrets to ${owner}/${repo} GitHub Actions`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// Encrypt and push each secret using sodium (libsodium-wrappers)
|
|
137
|
+
// Attempt to use libsodium-wrappers for native encryption.
|
|
138
|
+
// It's an optional peer dependency — fall back to gh CLI if absent.
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
140
|
+
let sodium = null;
|
|
141
|
+
try {
|
|
142
|
+
sodium = await import("libsodium-wrappers");
|
|
143
|
+
await sodium.ready;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return syncToGitHubViaCli(secrets, owner, repo, synced, skipped, failed, dryRun);
|
|
147
|
+
}
|
|
148
|
+
const repoKey = sodium.from_base64(key, sodium.base64_variants.ORIGINAL);
|
|
149
|
+
for (const [name, value] of Object.entries(secrets)) {
|
|
150
|
+
try {
|
|
151
|
+
const encrypted = sodium.crypto_box_seal(new TextEncoder().encode(value), repoKey);
|
|
152
|
+
const encryptedB64 = sodium.to_base64(encrypted, sodium.base64_variants.ORIGINAL);
|
|
153
|
+
const putResp = await fetch(`https://api.github.com/repos/${owner}/${repo}/actions/secrets/${name}`, {
|
|
154
|
+
method: "PUT",
|
|
155
|
+
headers: {
|
|
156
|
+
Authorization: `Bearer ${token}`,
|
|
157
|
+
Accept: "application/vnd.github+json",
|
|
158
|
+
"Content-Type": "application/json",
|
|
159
|
+
},
|
|
160
|
+
body: JSON.stringify({ encrypted_value: encryptedB64, key_id }),
|
|
161
|
+
});
|
|
162
|
+
if (putResp.ok || putResp.status === 201 || putResp.status === 204) {
|
|
163
|
+
synced.push(name);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
failed.push(`${name}: ${putResp.status}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
failed.push(`${name}: ${err.message}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
target: "github",
|
|
175
|
+
synced,
|
|
176
|
+
skipped,
|
|
177
|
+
failed,
|
|
178
|
+
dryRun: false,
|
|
179
|
+
message: `Synced ${synced.length}/${Object.keys(secrets).length} secrets to ${owner}/${repo} GitHub Actions${failed.length ? ` (${failed.length} failed)` : ""}`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async function syncToGitHubViaCli(secrets, owner, repo, synced, skipped, failed, dryRun) {
|
|
183
|
+
// Fall back to `gh secret set` CLI if libsodium is unavailable
|
|
184
|
+
try {
|
|
185
|
+
await exec("gh", ["--version"], { timeout: 5_000 });
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return {
|
|
189
|
+
target: "github",
|
|
190
|
+
synced: [],
|
|
191
|
+
skipped: [],
|
|
192
|
+
failed: ["Neither libsodium-wrappers nor gh CLI available"],
|
|
193
|
+
dryRun,
|
|
194
|
+
message: "Install gh CLI (brew install gh) or add libsodium-wrappers to package.json",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
for (const [name, value] of Object.entries(secrets)) {
|
|
198
|
+
try {
|
|
199
|
+
await exec("gh", ["secret", "set", name, "--repo", `${owner}/${repo}`, "--body", value], { timeout: 15_000 });
|
|
200
|
+
synced.push(name);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
failed.push(`${name}: ${err.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
target: "github",
|
|
208
|
+
synced,
|
|
209
|
+
skipped,
|
|
210
|
+
failed,
|
|
211
|
+
dryRun: false,
|
|
212
|
+
message: `Synced ${synced.length}/${Object.keys(secrets).length} secrets to ${owner}/${repo} via gh CLI${failed.length ? ` (${failed.length} failed)` : ""}`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=secrets-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-sync.js","sourceRoot":"","sources":["../src/secrets-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kit secrets validate [--fix] [--auto]` — verify every key declared
|
|
3
|
+
* in `.kit.toml [secrets.keys]` resolves to a non-empty value in the
|
|
4
|
+
* configured vault. Surfaces drift between declaration and reality.
|
|
5
|
+
*
|
|
6
|
+
* no flag — read-only check; exits non-zero on missing values
|
|
7
|
+
* --fix — interactive: prompt for value per missing key, write to vault
|
|
8
|
+
* --auto — non-interactive: read from .env.template (key=value) when
|
|
9
|
+
* present, fail otherwise
|
|
10
|
+
*
|
|
11
|
+
* Read-only mode refuses --fix / --auto via the writeSecretToBackend gate.
|
|
12
|
+
*/
|
|
13
|
+
import type { kitConfig, SecretKeyConfig } from "./config.js";
|
|
14
|
+
export interface ValidateResult {
|
|
15
|
+
key: string;
|
|
16
|
+
source: SecretKeyConfig["source"];
|
|
17
|
+
status: "present" | "missing" | "fixed" | "unfixable";
|
|
18
|
+
detail: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ValidateOptions {
|
|
21
|
+
fix?: boolean;
|
|
22
|
+
auto?: boolean;
|
|
23
|
+
/** Prompt callback for --fix interactive flow. Test injectable. */
|
|
24
|
+
prompt?: (key: string) => Promise<string | null>;
|
|
25
|
+
/** Test override of cwd. */
|
|
26
|
+
cwd?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate logic — checks for VALUE PRESENCE only. Uses an injectable
|
|
30
|
+
* `checkAvailability` so tests can mock backend resolution without touching
|
|
31
|
+
* real vaults.
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateSecrets(config: kitConfig, opts?: ValidateOptions, checkAvailability?: (key: string, source: SecretKeyConfig["source"], cfg: SecretKeyConfig) => Promise<boolean>): Promise<ValidateResult[]>;
|
|
34
|
+
export declare function summarizeValidation(results: ValidateResult[]): {
|
|
35
|
+
total: number;
|
|
36
|
+
present: number;
|
|
37
|
+
missing: number;
|
|
38
|
+
fixed: number;
|
|
39
|
+
unfixable: number;
|
|
40
|
+
ok: boolean;
|
|
41
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kit secrets validate [--fix] [--auto]` — verify every key declared
|
|
3
|
+
* in `.kit.toml [secrets.keys]` resolves to a non-empty value in the
|
|
4
|
+
* configured vault. Surfaces drift between declaration and reality.
|
|
5
|
+
*
|
|
6
|
+
* no flag — read-only check; exits non-zero on missing values
|
|
7
|
+
* --fix — interactive: prompt for value per missing key, write to vault
|
|
8
|
+
* --auto — non-interactive: read from .env.template (key=value) when
|
|
9
|
+
* present, fail otherwise
|
|
10
|
+
*
|
|
11
|
+
* Read-only mode refuses --fix / --auto via the writeSecretToBackend gate.
|
|
12
|
+
*/
|
|
13
|
+
import { readFile } from "node:fs/promises";
|
|
14
|
+
import { resolve } from "node:path";
|
|
15
|
+
import { writeSecretToBackend, isValidKeyName } from "./secrets-migrate.js";
|
|
16
|
+
async function loadEnvTemplate(cwd, templatePath) {
|
|
17
|
+
const out = new Map();
|
|
18
|
+
try {
|
|
19
|
+
const text = await readFile(resolve(cwd, templatePath), "utf-8");
|
|
20
|
+
for (const rawLine of text.split("\n")) {
|
|
21
|
+
const line = rawLine.trim();
|
|
22
|
+
if (!line || line.startsWith("#"))
|
|
23
|
+
continue;
|
|
24
|
+
const eq = line.indexOf("=");
|
|
25
|
+
if (eq <= 0)
|
|
26
|
+
continue;
|
|
27
|
+
const key = line.slice(0, eq).trim();
|
|
28
|
+
let value = line.slice(eq + 1).trim();
|
|
29
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
30
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
31
|
+
value = value.slice(1, -1);
|
|
32
|
+
}
|
|
33
|
+
if (isValidKeyName(key))
|
|
34
|
+
out.set(key, value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* template missing — ok */
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validate logic — checks for VALUE PRESENCE only. Uses an injectable
|
|
44
|
+
* `checkAvailability` so tests can mock backend resolution without touching
|
|
45
|
+
* real vaults.
|
|
46
|
+
*/
|
|
47
|
+
export async function validateSecrets(config, opts = {}, checkAvailability = async (key, source, _cfg) => {
|
|
48
|
+
if (source === "env")
|
|
49
|
+
return Boolean(process.env[key]);
|
|
50
|
+
// For all other sources we can't easily check without invoking the
|
|
51
|
+
// backend CLI here — callers in CLI surface should pass the real
|
|
52
|
+
// check function (see check-secrets.ts) so this default doesn't
|
|
53
|
+
// false-positive in unit tests.
|
|
54
|
+
return false;
|
|
55
|
+
}) {
|
|
56
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
57
|
+
const keys = config.secrets?.keys ?? {};
|
|
58
|
+
const results = [];
|
|
59
|
+
const templateValues = config.secrets?.template
|
|
60
|
+
? await loadEnvTemplate(cwd, config.secrets.template)
|
|
61
|
+
: new Map();
|
|
62
|
+
for (const [key, keyConfig] of Object.entries(keys)) {
|
|
63
|
+
const present = await checkAvailability(key, keyConfig.source, keyConfig);
|
|
64
|
+
if (present) {
|
|
65
|
+
results.push({ key, source: keyConfig.source, status: "present", detail: "" });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (!opts.fix && !opts.auto) {
|
|
69
|
+
results.push({
|
|
70
|
+
key,
|
|
71
|
+
source: keyConfig.source,
|
|
72
|
+
status: "missing",
|
|
73
|
+
detail: `not resolvable via ${keyConfig.source}`,
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
let value = null;
|
|
78
|
+
if (opts.auto) {
|
|
79
|
+
const candidate = templateValues.get(key);
|
|
80
|
+
if (candidate && candidate.length > 0) {
|
|
81
|
+
value = candidate;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (opts.fix && opts.prompt) {
|
|
85
|
+
value = await opts.prompt(key);
|
|
86
|
+
}
|
|
87
|
+
if (!value) {
|
|
88
|
+
results.push({
|
|
89
|
+
key,
|
|
90
|
+
source: keyConfig.source,
|
|
91
|
+
status: "unfixable",
|
|
92
|
+
detail: opts.auto
|
|
93
|
+
? "no value in .env.template — re-run with --fix to enter interactively"
|
|
94
|
+
: "no value provided",
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const store = config.secrets?.store;
|
|
99
|
+
if (!store || store === "env") {
|
|
100
|
+
results.push({
|
|
101
|
+
key,
|
|
102
|
+
source: keyConfig.source,
|
|
103
|
+
status: "unfixable",
|
|
104
|
+
detail: "no vault backend configured ([secrets].store)",
|
|
105
|
+
});
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const write = await writeSecretToBackend(store, key, value);
|
|
109
|
+
results.push({
|
|
110
|
+
key,
|
|
111
|
+
source: keyConfig.source,
|
|
112
|
+
status: write.ok ? "fixed" : "unfixable",
|
|
113
|
+
detail: write.detail,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return results;
|
|
117
|
+
}
|
|
118
|
+
export function summarizeValidation(results) {
|
|
119
|
+
const counts = { total: results.length, present: 0, missing: 0, fixed: 0, unfixable: 0, ok: true };
|
|
120
|
+
for (const r of results) {
|
|
121
|
+
counts[r.status]++;
|
|
122
|
+
}
|
|
123
|
+
counts.ok = counts.missing === 0 && counts.unfixable === 0;
|
|
124
|
+
return counts;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=secrets-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-validate.js","sourceRoot":"","sources":["../src/secrets-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-vault secret migration.
|
|
3
|
+
*
|
|
4
|
+
* `kit secrets migrate` covers plaintext-→-vault. This module covers the
|
|
5
|
+
* harder case: moving every key defined in `.kit.toml` from one configured
|
|
6
|
+
* backend to another (e.g. 1password → infisical) without ever printing the
|
|
7
|
+
* value to a console and without leaving a half-migrated state on failure.
|
|
8
|
+
*
|
|
9
|
+
* Flow per key:
|
|
10
|
+
* 1. Read value from source backend (no log echo).
|
|
11
|
+
* 2. Write value to target backend.
|
|
12
|
+
* 3. Rewrite the `.kit.toml` entry in place — `source = "target"`,
|
|
13
|
+
* `ref`/`name` updated to the new backend's convention.
|
|
14
|
+
* 4. Audit-log the move (operation: "vault-migrate", success: bool).
|
|
15
|
+
*
|
|
16
|
+
* Errors at step 2 leave step 3 untouched — the source vault remains the
|
|
17
|
+
* authoritative store. The user is told which keys succeeded so they can
|
|
18
|
+
* re-run for the rest.
|
|
19
|
+
*
|
|
20
|
+
* NOT included by design:
|
|
21
|
+
* - Deleting the value from the source vault. That's a separate
|
|
22
|
+
* `kit secrets revoke-old` call (already exists). Keeping the old
|
|
23
|
+
* copy until rotation lets the operator roll back if the target is
|
|
24
|
+
* misconfigured.
|
|
25
|
+
* - Rotation. Migration moves the SAME value. Use `secrets rotate` after
|
|
26
|
+
* migration if you also want to mint fresh credentials.
|
|
27
|
+
*/
|
|
28
|
+
import type { SecretsConfig, SecretKeyConfig } from "./config.js";
|
|
29
|
+
type BackendSource = SecretKeyConfig["source"];
|
|
30
|
+
export interface VaultMigrateOptions {
|
|
31
|
+
/** Source backend currently referenced in `.kit.toml`. */
|
|
32
|
+
from: BackendSource;
|
|
33
|
+
/** Target backend to migrate to. */
|
|
34
|
+
to: BackendSource;
|
|
35
|
+
/** Show what would happen without writing anywhere. */
|
|
36
|
+
dryRun?: boolean;
|
|
37
|
+
/** cwd override (for tests). */
|
|
38
|
+
cwd?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface MigrationItem {
|
|
41
|
+
name: string;
|
|
42
|
+
ok: boolean;
|
|
43
|
+
detail: string;
|
|
44
|
+
/** New ref written to .kit.toml on success. */
|
|
45
|
+
newRef?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface VaultMigrateResult {
|
|
48
|
+
items: MigrationItem[];
|
|
49
|
+
/** Source keys discovered. */
|
|
50
|
+
discovered: number;
|
|
51
|
+
/** Number of items that completed all three steps. */
|
|
52
|
+
succeeded: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reads a single secret value from the configured source backend. Returns
|
|
56
|
+
* `{ ok: false }` and never the value when reading fails, so the caller
|
|
57
|
+
* cannot accidentally write an empty string to the target.
|
|
58
|
+
*/
|
|
59
|
+
export declare function readSecretFromBackend(source: BackendSource, config: SecretKeyConfig, topLevel: SecretsConfig): Promise<{
|
|
60
|
+
ok: boolean;
|
|
61
|
+
value?: string;
|
|
62
|
+
detail: string;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Orchestrates the migration. Caller is responsible for elevation (call
|
|
66
|
+
* `consumeElevation("vault-migrate")` first) so we don't double-prompt.
|
|
67
|
+
*/
|
|
68
|
+
export declare function vaultMigrate(config: {
|
|
69
|
+
secrets?: SecretsConfig;
|
|
70
|
+
}, opts: VaultMigrateOptions): Promise<VaultMigrateResult>;
|
|
71
|
+
export {};
|