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,172 @@
|
|
|
1
|
+
import { mergeGovernanceConfig } from "./governance.js";
|
|
2
|
+
import { exec } from "./utils/exec.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if secrets are expiring or expired.
|
|
5
|
+
* Queries expiration metadata from secret stores and config-based hints.
|
|
6
|
+
*/
|
|
7
|
+
export async function checkSecretExpiration(config, secretKeys, secretsConfig) {
|
|
8
|
+
const fullConfig = mergeGovernanceConfig(config);
|
|
9
|
+
if (!fullConfig.secrets?.check_expiration) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const expirations = [];
|
|
13
|
+
const warnDays = fullConfig.secrets.warn_days_before_expiry || 30;
|
|
14
|
+
for (const key of secretKeys) {
|
|
15
|
+
const keyConfig = secretsConfig?.keys?.[key];
|
|
16
|
+
const expiration = await getSecretExpiration(key, keyConfig, secretsConfig);
|
|
17
|
+
if (expiration) {
|
|
18
|
+
const daysUntilExpiry = calculateDaysUntilExpiry(expiration);
|
|
19
|
+
const expired = daysUntilExpiry !== null && daysUntilExpiry < 0;
|
|
20
|
+
const warning = daysUntilExpiry !== null &&
|
|
21
|
+
daysUntilExpiry >= 0 &&
|
|
22
|
+
daysUntilExpiry <= warnDays;
|
|
23
|
+
expirations.push({
|
|
24
|
+
key,
|
|
25
|
+
expiry_date: expiration,
|
|
26
|
+
days_until_expiry: daysUntilExpiry ?? undefined,
|
|
27
|
+
expired,
|
|
28
|
+
warning,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return expirations;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Dispatch to the appropriate store adapter to fetch expiration metadata.
|
|
36
|
+
* Falls back to config-based env var hints for stores that don't support
|
|
37
|
+
* native expiration (Infisical, Doppler, Bitwarden, env).
|
|
38
|
+
*/
|
|
39
|
+
async function getSecretExpiration(key, keyConfig, secretsConfig) {
|
|
40
|
+
const source = keyConfig?.source ?? secretsConfig?.store ?? "env";
|
|
41
|
+
switch (source) {
|
|
42
|
+
case "1password": {
|
|
43
|
+
const ref = keyConfig?.ref;
|
|
44
|
+
if (ref) {
|
|
45
|
+
const expires = await get1PasswordExpiration(ref);
|
|
46
|
+
if (expires !== null)
|
|
47
|
+
return expires;
|
|
48
|
+
}
|
|
49
|
+
// Fall back to env hint if op returns no expiry data
|
|
50
|
+
return getEnvExpirationHint(key);
|
|
51
|
+
}
|
|
52
|
+
case "infisical":
|
|
53
|
+
// Infisical does not expose native per-secret expiration via CLI.
|
|
54
|
+
// Rely on the operator setting the env var hint.
|
|
55
|
+
return getEnvExpirationHint(key);
|
|
56
|
+
case "doppler":
|
|
57
|
+
// Doppler secrets do not have per-secret expiration dates.
|
|
58
|
+
// Rely on the operator setting the env var hint.
|
|
59
|
+
return getEnvExpirationHint(key);
|
|
60
|
+
case "bitwarden":
|
|
61
|
+
// Bitwarden item expiration is not exposed via CLI secret reads.
|
|
62
|
+
// Rely on the operator setting the env var hint.
|
|
63
|
+
return getEnvExpirationHint(key);
|
|
64
|
+
default:
|
|
65
|
+
// For env, config, eas, and any unknown source use env hint only.
|
|
66
|
+
return getEnvExpirationHint(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read a config-based expiration hint from environment variable.
|
|
71
|
+
*
|
|
72
|
+
* Convention: set `<KEY>_EXPIRES_AT=<ISO-date>` to declare expiration
|
|
73
|
+
* for any secret, regardless of which store it lives in. This is the
|
|
74
|
+
* universal fallback for stores that do not expose expiration metadata.
|
|
75
|
+
*
|
|
76
|
+
* Example: API_KEY_EXPIRES_AT=2026-12-31T00:00:00Z
|
|
77
|
+
*/
|
|
78
|
+
export function getEnvExpirationHint(key) {
|
|
79
|
+
const envVarName = `${key.toUpperCase()}_EXPIRES_AT`;
|
|
80
|
+
const value = process.env[envVarName];
|
|
81
|
+
if (!value)
|
|
82
|
+
return null;
|
|
83
|
+
const date = new Date(value);
|
|
84
|
+
if (isNaN(date.getTime())) {
|
|
85
|
+
console.warn(`[kit] Invalid expiration date for ${key}: ${value}`);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return date.toISOString();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Fetch expiration date from a 1Password item.
|
|
92
|
+
*
|
|
93
|
+
* Parses refs in the format `op://vault/item/field` or `vault/item`.
|
|
94
|
+
* Calls `op item get <item> --vault <vault> --format json` and returns
|
|
95
|
+
* the `expires` field if present.
|
|
96
|
+
*
|
|
97
|
+
* Returns null if the item has no expiry, if op is unavailable, or if
|
|
98
|
+
* the ref cannot be parsed.
|
|
99
|
+
*/
|
|
100
|
+
export async function get1PasswordExpiration(ref) {
|
|
101
|
+
try {
|
|
102
|
+
// Parse "op://vault/item/field" or "vault/item" or "op://vault/item"
|
|
103
|
+
const cleaned = ref.startsWith("op://") ? ref.slice(5) : ref;
|
|
104
|
+
const parts = cleaned.split("/");
|
|
105
|
+
if (parts.length < 2)
|
|
106
|
+
return null;
|
|
107
|
+
const [vault, item] = parts;
|
|
108
|
+
if (!vault || !item)
|
|
109
|
+
return null;
|
|
110
|
+
const { stdout } = await exec("op", ["item", "get", item, "--vault", vault, "--format", "json"], { timeout: 10_000 });
|
|
111
|
+
const data = JSON.parse(stdout);
|
|
112
|
+
return data.expires ?? null;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// op CLI not available, not signed in, or item has no expiry field
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Calculate days until expiration (negative = already expired)
|
|
121
|
+
*/
|
|
122
|
+
function calculateDaysUntilExpiry(expiryDate) {
|
|
123
|
+
try {
|
|
124
|
+
const expiry = new Date(expiryDate);
|
|
125
|
+
const now = new Date();
|
|
126
|
+
const diffMs = expiry.getTime() - now.getTime();
|
|
127
|
+
const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));
|
|
128
|
+
return diffDays;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Format secret expiration warnings for display
|
|
136
|
+
*/
|
|
137
|
+
export function formatSecretExpirationWarnings(expirations) {
|
|
138
|
+
const expired = expirations.filter((e) => e.expired);
|
|
139
|
+
const warning = expirations.filter((e) => e.warning);
|
|
140
|
+
if (expired.length === 0 && warning.length === 0) {
|
|
141
|
+
return "All secrets are current (no expiration warnings).";
|
|
142
|
+
}
|
|
143
|
+
const lines = [];
|
|
144
|
+
if (expired.length > 0) {
|
|
145
|
+
lines.push("⚠️ EXPIRED SECRETS:");
|
|
146
|
+
for (const e of expired) {
|
|
147
|
+
lines.push(` ✗ ${e.key} expired ${Math.abs(e.days_until_expiry || 0)} days ago`);
|
|
148
|
+
}
|
|
149
|
+
lines.push("");
|
|
150
|
+
}
|
|
151
|
+
if (warning.length > 0) {
|
|
152
|
+
lines.push("⚠️ EXPIRING SOON:");
|
|
153
|
+
for (const w of warning) {
|
|
154
|
+
lines.push(` ! ${w.key} expires in ${w.days_until_expiry} days`);
|
|
155
|
+
}
|
|
156
|
+
lines.push("");
|
|
157
|
+
}
|
|
158
|
+
return lines.join("\n");
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if any secrets are expired (blocking check)
|
|
162
|
+
*/
|
|
163
|
+
export function hasExpiredSecrets(expirations) {
|
|
164
|
+
return expirations.some((e) => e.expired);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if any secrets have warnings
|
|
168
|
+
*/
|
|
169
|
+
export function hasSecretWarnings(expirations) {
|
|
170
|
+
return expirations.some((e) => e.warning);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=secret-expiration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-expiration.js","sourceRoot":"","sources":["../src/secret-expiration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { SecretsConfig } from "./config.js";
|
|
2
|
+
import { type PlaintextHit } from "./scan-plaintext.js";
|
|
3
|
+
import { type WriteResult } from "./secret-backends.js";
|
|
4
|
+
/**
|
|
5
|
+
* Conservative env-var-style identifier check.
|
|
6
|
+
*
|
|
7
|
+
* Keys from `.env*` flow straight into CLI argv (e.g. `aws secretsmanager
|
|
8
|
+
* create-secret --name <KEY>`). Without this guard a malicious or just
|
|
9
|
+
* malformed file could smuggle in `--ignore-checks` or `-i` and have the
|
|
10
|
+
* sink CLI reinterpret it as a flag. The shape we accept is exactly what
|
|
11
|
+
* env-var parsers require: leading [A-Za-z_], rest [A-Za-z0-9_].
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidKeyName(key: string): boolean;
|
|
14
|
+
/** Escapes a string for safe embedding in a `new RegExp(...)` pattern. */
|
|
15
|
+
export declare function escapeRegex(literal: string): string;
|
|
16
|
+
export interface MigrationRecord {
|
|
17
|
+
key: string;
|
|
18
|
+
source: string;
|
|
19
|
+
vault: string;
|
|
20
|
+
written: boolean;
|
|
21
|
+
cleaned: boolean;
|
|
22
|
+
detail: string;
|
|
23
|
+
}
|
|
24
|
+
export interface MigrationPlan {
|
|
25
|
+
hits: PlaintextHit[];
|
|
26
|
+
/** Map of derived KEY-name → value as read from source file. */
|
|
27
|
+
keyValues: Map<string, {
|
|
28
|
+
value: string;
|
|
29
|
+
source: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export interface PlanMigrationOptions {
|
|
33
|
+
/** Only include keys whose VALUE matches a credential pattern. Off by default. */
|
|
34
|
+
secretsOnly?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Builds a migration plan by re-scanning for plaintext, then extracting
|
|
38
|
+
* the actual VAR=VALUE pairs from .env-style files. Only KEY=VALUE lines
|
|
39
|
+
* are migratable; embedded credentials inside scripts or JSON need manual
|
|
40
|
+
* cleanup and are listed in the returned plan as `hits` only (no entry in
|
|
41
|
+
* keyValues).
|
|
42
|
+
*/
|
|
43
|
+
export declare function planMigration(cwd?: string, opts?: PlanMigrationOptions): Promise<MigrationPlan>;
|
|
44
|
+
/**
|
|
45
|
+
* Writes a single key/value to the configured backend. Returns whether the
|
|
46
|
+
* write succeeded. Per-backend create-or-update semantics live in the
|
|
47
|
+
* {@link writeViaBackend} registry — this wrapper owns the cross-cutting
|
|
48
|
+
* guards: read-only refusal, key-name validation, and error redaction.
|
|
49
|
+
*/
|
|
50
|
+
export declare function writeSecretToBackend(store: SecretsConfig["store"], key: string, value: string, opts?: {
|
|
51
|
+
vault?: string;
|
|
52
|
+
project?: string;
|
|
53
|
+
region?: string;
|
|
54
|
+
vaultPath?: string;
|
|
55
|
+
}): Promise<WriteResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Post-migration treatment for a key's line in an .env-style file.
|
|
58
|
+
*
|
|
59
|
+
* "blank" — replace `KEY=value` with `KEY=` so the var name is still
|
|
60
|
+
* visible (devs see what's required) but the plaintext is
|
|
61
|
+
* gone. Default. Closes the silent-leak hole where a
|
|
62
|
+
* commented `# KEY=value` line still ships the secret to
|
|
63
|
+
* backups / agent transcripts / code review tools.
|
|
64
|
+
*
|
|
65
|
+
* "comment" — `# migrated by kit → vault: KEY=value`. Preserves the
|
|
66
|
+
* original value for easy rollback. Use ONLY when you
|
|
67
|
+
* actively need to revert; pass `mode: "comment"` explicitly.
|
|
68
|
+
*
|
|
69
|
+
* "delete" — drop the line entirely. Cleanest, but devs lose the
|
|
70
|
+
* required-var hint.
|
|
71
|
+
*/
|
|
72
|
+
export type PostMigrateMode = "blank" | "comment" | "delete";
|
|
73
|
+
export declare function commentOutInFile(filePath: string, keys: string[], mode?: PostMigrateMode): Promise<{
|
|
74
|
+
changed: number;
|
|
75
|
+
}>;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { scanPlaintextSecrets } from "./scan-plaintext.js";
|
|
4
|
+
import { redactSecrets } from "./utils/redactSecrets.js";
|
|
5
|
+
import { writeViaBackend } from "./secret-backends.js";
|
|
6
|
+
/**
|
|
7
|
+
* Conservative env-var-style identifier check.
|
|
8
|
+
*
|
|
9
|
+
* Keys from `.env*` flow straight into CLI argv (e.g. `aws secretsmanager
|
|
10
|
+
* create-secret --name <KEY>`). Without this guard a malicious or just
|
|
11
|
+
* malformed file could smuggle in `--ignore-checks` or `-i` and have the
|
|
12
|
+
* sink CLI reinterpret it as a flag. The shape we accept is exactly what
|
|
13
|
+
* env-var parsers require: leading [A-Za-z_], rest [A-Za-z0-9_].
|
|
14
|
+
*/
|
|
15
|
+
export function isValidKeyName(key) {
|
|
16
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key) && key.length <= 128;
|
|
17
|
+
}
|
|
18
|
+
/** Escapes a string for safe embedding in a `new RegExp(...)` pattern. */
|
|
19
|
+
export function escapeRegex(literal) {
|
|
20
|
+
return literal.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Sanitizes the `err.message` we get from a child_process failure before
|
|
24
|
+
* surfacing it to the user. execFile errors include the full argv on the
|
|
25
|
+
* `cmd` property AND interpolate it into `err.message`, so a failed write
|
|
26
|
+
* leaks the secret unless we redact. We keep the first line for diagnostic
|
|
27
|
+
* value but strip anything matching a known secret pattern.
|
|
28
|
+
*/
|
|
29
|
+
function safeErrorMessage(err, knownSecrets = []) {
|
|
30
|
+
let raw = err instanceof Error ? err.message.split("\n")[0] : String(err);
|
|
31
|
+
// Exact-substring redaction for values we hold — deterministic and
|
|
32
|
+
// shape-independent. Pattern redaction alone fails open for lowercase-keyed
|
|
33
|
+
// values, bare `--value <secret>` argv tokens, and URL-shaped secrets.
|
|
34
|
+
for (const s of knownSecrets) {
|
|
35
|
+
if (s)
|
|
36
|
+
raw = raw.split(s).join("[REDACTED]");
|
|
37
|
+
}
|
|
38
|
+
// Pattern redaction as defense-in-depth for secret shapes we don't hold.
|
|
39
|
+
return redactSecrets(raw);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Default .env files to scan. Mirrors the file list scan-plaintext.ts
|
|
43
|
+
* targets but we walk them directly here so the plan includes EVERY
|
|
44
|
+
* env-var-shaped KEY=VALUE pair, not only the ones whose value happens
|
|
45
|
+
* to match a SECRET_PATTERN. Project-level configs like
|
|
46
|
+
* `NEXT_PUBLIC_SUPABASE_URL`, `RESEND_FROM_EMAIL`, region/IDs etc. are
|
|
47
|
+
* needed by the app even though they aren't credentials; the previous
|
|
48
|
+
* secret-only filter dropped them and left the app non-functional after
|
|
49
|
+
* migration.
|
|
50
|
+
*/
|
|
51
|
+
const ENV_FILES_TO_SCAN = [
|
|
52
|
+
".env",
|
|
53
|
+
".env.local",
|
|
54
|
+
".env.development",
|
|
55
|
+
".env.production",
|
|
56
|
+
".env.staging",
|
|
57
|
+
".env.test",
|
|
58
|
+
".env.preview",
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Builds a migration plan by re-scanning for plaintext, then extracting
|
|
62
|
+
* the actual VAR=VALUE pairs from .env-style files. Only KEY=VALUE lines
|
|
63
|
+
* are migratable; embedded credentials inside scripts or JSON need manual
|
|
64
|
+
* cleanup and are listed in the returned plan as `hits` only (no entry in
|
|
65
|
+
* keyValues).
|
|
66
|
+
*/
|
|
67
|
+
export async function planMigration(cwd = process.cwd(), opts = {}) {
|
|
68
|
+
const hits = await scanPlaintextSecrets(cwd);
|
|
69
|
+
const keyValues = new Map();
|
|
70
|
+
for (const file of ENV_FILES_TO_SCAN) {
|
|
71
|
+
let text;
|
|
72
|
+
try {
|
|
73
|
+
text = await readFile(resolve(cwd, file), "utf-8");
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
for (const rawLine of text.split("\n")) {
|
|
79
|
+
const line = rawLine.trim();
|
|
80
|
+
if (!line || line.startsWith("#"))
|
|
81
|
+
continue;
|
|
82
|
+
const eq = line.indexOf("=");
|
|
83
|
+
if (eq <= 0)
|
|
84
|
+
continue;
|
|
85
|
+
const key = line.slice(0, eq).trim();
|
|
86
|
+
let value = line.slice(eq + 1).trim();
|
|
87
|
+
// Strip simple quotes
|
|
88
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
89
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
90
|
+
value = value.slice(1, -1);
|
|
91
|
+
}
|
|
92
|
+
if (!value)
|
|
93
|
+
continue;
|
|
94
|
+
// Reject anything that isn't an env-var-shaped name — keeps `-x` /
|
|
95
|
+
// `--something` style identifiers out of the migration plan before
|
|
96
|
+
// they reach the sink CLI.
|
|
97
|
+
if (!isValidKeyName(key))
|
|
98
|
+
continue;
|
|
99
|
+
// Optional secrets-only filter — restores the historical behavior
|
|
100
|
+
// for callers that explicitly want it. Default migrates everything
|
|
101
|
+
// so vault becomes the single source of truth.
|
|
102
|
+
if (opts.secretsOnly && redactSecrets(value) === value)
|
|
103
|
+
continue;
|
|
104
|
+
keyValues.set(key, { value, source: file });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { hits, keyValues };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Writes a single key/value to the configured backend. Returns whether the
|
|
111
|
+
* write succeeded. Per-backend create-or-update semantics live in the
|
|
112
|
+
* {@link writeViaBackend} registry — this wrapper owns the cross-cutting
|
|
113
|
+
* guards: read-only refusal, key-name validation, and error redaction.
|
|
114
|
+
*/
|
|
115
|
+
export async function writeSecretToBackend(store, key, value, opts = {}) {
|
|
116
|
+
// Read-only mode: refuse + audit-log before any backend touches the secret.
|
|
117
|
+
const { isReadOnlyMode, refuseWrite } = await import("./read-only-mode.js");
|
|
118
|
+
if (isReadOnlyMode()) {
|
|
119
|
+
const refusal = await refuseWrite("write-secret-to-backend", {
|
|
120
|
+
store,
|
|
121
|
+
key,
|
|
122
|
+
});
|
|
123
|
+
return { ok: false, detail: refusal.reason };
|
|
124
|
+
}
|
|
125
|
+
// Reject anything that doesn't look like a normal env-var name BEFORE it
|
|
126
|
+
// becomes argv. See isValidKeyName comment for rationale.
|
|
127
|
+
if (!isValidKeyName(key)) {
|
|
128
|
+
return {
|
|
129
|
+
ok: false,
|
|
130
|
+
detail: `invalid key name "${key}" — must match ^[A-Za-z_][A-Za-z0-9_]*$`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
return await writeViaBackend(String(store), key, value, opts);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
// Pass the plaintext value so a failed backend write can't leak it verbatim,
|
|
138
|
+
// regardless of key casing or the flag shape the CLI used.
|
|
139
|
+
return { ok: false, detail: `write failed: ${safeErrorMessage(err, [value])}` };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function commentOutInFile(filePath, keys, mode = "blank") {
|
|
143
|
+
let text;
|
|
144
|
+
try {
|
|
145
|
+
text = await readFile(filePath, "utf-8");
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return { changed: 0 };
|
|
149
|
+
}
|
|
150
|
+
let changed = 0;
|
|
151
|
+
// Only act on env-var-shaped keys; same validation we use for writeSecretToBackend.
|
|
152
|
+
const validKeys = keys.filter(isValidKeyName);
|
|
153
|
+
const out = [];
|
|
154
|
+
for (const line of text.split("\n")) {
|
|
155
|
+
let matched = false;
|
|
156
|
+
for (const key of validKeys) {
|
|
157
|
+
// Key is regex-safe after isValidKeyName, but escape defensively in
|
|
158
|
+
// case the validator is ever relaxed.
|
|
159
|
+
const re = new RegExp(`^(\\s*)${escapeRegex(key)}\\s*=`);
|
|
160
|
+
if (re.test(line)) {
|
|
161
|
+
matched = true;
|
|
162
|
+
changed++;
|
|
163
|
+
if (mode === "delete") {
|
|
164
|
+
// Skip the line entirely.
|
|
165
|
+
}
|
|
166
|
+
else if (mode === "comment") {
|
|
167
|
+
out.push(`# migrated by kit → vault: ${line.replace(/^\s+/, "")}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// "blank" — keep KEY=, drop value. Preserve leading whitespace.
|
|
171
|
+
const prefix = line.match(/^\s*/)?.[0] ?? "";
|
|
172
|
+
out.push(`${prefix}${key}= # value migrated to vault`);
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (!matched)
|
|
178
|
+
out.push(line);
|
|
179
|
+
}
|
|
180
|
+
if (changed > 0) {
|
|
181
|
+
await writeFile(filePath, out.join("\n"), "utf-8");
|
|
182
|
+
}
|
|
183
|
+
return { changed };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=secrets-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-migrate.js","sourceRoot":"","sources":["../src/secrets-migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets Management System — data models
|
|
3
|
+
* Encrypted storage, key rotation, secret sharing, audit trails
|
|
4
|
+
*/
|
|
5
|
+
export type SecretType = "api_key" | "password" | "oauth_token" | "database_url" | "ssh_key" | "certificate" | "custom";
|
|
6
|
+
export type RotationPolicy = "never" | "30d" | "60d" | "90d" | "manual";
|
|
7
|
+
export type AccessLevel = "owner" | "admin" | "team" | "shared";
|
|
8
|
+
export interface Secret {
|
|
9
|
+
id: string;
|
|
10
|
+
team_id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
type: SecretType;
|
|
14
|
+
encrypted_value: string;
|
|
15
|
+
encryption_key_id: string;
|
|
16
|
+
access_level: AccessLevel;
|
|
17
|
+
created_by: string;
|
|
18
|
+
created_at: string;
|
|
19
|
+
updated_at: string;
|
|
20
|
+
expires_at?: string;
|
|
21
|
+
rotation_policy: RotationPolicy;
|
|
22
|
+
last_rotated_at?: string;
|
|
23
|
+
next_rotation_at?: string;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface EncryptionKey {
|
|
27
|
+
id: string;
|
|
28
|
+
team_id: string;
|
|
29
|
+
key_version: number;
|
|
30
|
+
algorithm: "aes-256-gcm" | "aes-256-cbc";
|
|
31
|
+
created_at: string;
|
|
32
|
+
rotated_at?: string;
|
|
33
|
+
retired_at?: string;
|
|
34
|
+
status: "active" | "retired";
|
|
35
|
+
}
|
|
36
|
+
export interface SecretShare {
|
|
37
|
+
id: string;
|
|
38
|
+
secret_id: string;
|
|
39
|
+
team_id: string;
|
|
40
|
+
shared_by: string;
|
|
41
|
+
shared_with_user_id?: string;
|
|
42
|
+
shared_with_team_id?: string;
|
|
43
|
+
access_expires_at?: string;
|
|
44
|
+
one_time: boolean;
|
|
45
|
+
accessed_at?: string;
|
|
46
|
+
created_at: string;
|
|
47
|
+
}
|
|
48
|
+
export interface SecretAccessLog {
|
|
49
|
+
id: string;
|
|
50
|
+
secret_id: string;
|
|
51
|
+
team_id: string;
|
|
52
|
+
user_id: string;
|
|
53
|
+
action: "read" | "created" | "rotated" | "shared" | "revoked" | "deleted";
|
|
54
|
+
ip_address?: string;
|
|
55
|
+
user_agent?: string;
|
|
56
|
+
status: "success" | "denied";
|
|
57
|
+
reason?: string;
|
|
58
|
+
timestamp: string;
|
|
59
|
+
}
|
|
60
|
+
export interface RotationHistory {
|
|
61
|
+
id: string;
|
|
62
|
+
secret_id: string;
|
|
63
|
+
team_id: string;
|
|
64
|
+
rotated_by: string;
|
|
65
|
+
old_key_id: string;
|
|
66
|
+
new_key_id: string;
|
|
67
|
+
rotated_at: string;
|
|
68
|
+
reason: "scheduled" | "manual" | "compromised";
|
|
69
|
+
}
|
|
70
|
+
export interface VaultMetrics {
|
|
71
|
+
total_secrets: number;
|
|
72
|
+
secrets_by_type: Record<SecretType, number>;
|
|
73
|
+
expiring_soon: number;
|
|
74
|
+
pending_rotation: number;
|
|
75
|
+
total_shares: number;
|
|
76
|
+
active_keys: number;
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-model.js","sourceRoot":"","sources":["../src/secrets-model.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OneCLI integration (https://github.com/onecli/onecli).
|
|
3
|
+
*
|
|
4
|
+
* OneCLI is a local HTTP gateway that intercepts outbound agent requests and
|
|
5
|
+
* injects credentials. Agents see a placeholder; the gateway swaps it for the
|
|
6
|
+
* real value at egress. This module lets `kit secrets` register entries
|
|
7
|
+
* with OneCLI directly, so the real credential lives in OneCLI's encrypted
|
|
8
|
+
* store and never reaches the agent process.
|
|
9
|
+
*
|
|
10
|
+
* Auth: API key in `ONECLI_API_KEY` (Bearer oc_*) — generate from the web UI
|
|
11
|
+
* at http://localhost:10254/settings/api-keys before first use.
|
|
12
|
+
*/
|
|
13
|
+
export interface OneCliConfig {
|
|
14
|
+
apiUrl: string;
|
|
15
|
+
gatewayUrl: string;
|
|
16
|
+
apiKey?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function resolveOneCliConfig(): OneCliConfig;
|
|
19
|
+
export interface OneCliStatus {
|
|
20
|
+
reachable: boolean;
|
|
21
|
+
authenticated: boolean;
|
|
22
|
+
apiUrl: string;
|
|
23
|
+
gatewayUrl: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function checkOneCliStatus(cfg?: OneCliConfig): Promise<OneCliStatus>;
|
|
28
|
+
export interface RegisterSecretInput {
|
|
29
|
+
/** Display name in OneCLI (typically the env-var name, e.g. STRIPE_SECRET_KEY) */
|
|
30
|
+
name: string;
|
|
31
|
+
/** The real credential value to store encrypted */
|
|
32
|
+
value: string;
|
|
33
|
+
/** Hostname pattern (no scheme, no path) — e.g. "api.stripe.com" */
|
|
34
|
+
hostPattern: string;
|
|
35
|
+
/** Optional path pattern (e.g. "/v1/*") */
|
|
36
|
+
pathPattern?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Where to inject the value. Default mirrors most APIs:
|
|
39
|
+
* `{ headerName: "Authorization", valueFormat: "Bearer {value}" }`.
|
|
40
|
+
* Pass null to use OneCLI's automatic detection.
|
|
41
|
+
*/
|
|
42
|
+
injectionConfig?: {
|
|
43
|
+
headerName: string;
|
|
44
|
+
valueFormat?: string;
|
|
45
|
+
} | null;
|
|
46
|
+
}
|
|
47
|
+
export interface RegisterSecretResult {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Registers a secret with OneCLI. Returns the created secret's id.
|
|
53
|
+
*
|
|
54
|
+
* Caller is responsible for writing a placeholder to `.env.local` separately —
|
|
55
|
+
* OneCLI doesn't generate or return one, since the gateway matches by host
|
|
56
|
+
* pattern, not by placeholder value.
|
|
57
|
+
*/
|
|
58
|
+
export declare function registerSecretInOneCli(input: RegisterSecretInput, cfg?: OneCliConfig): Promise<RegisterSecretResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Generates a placeholder value to write into `.env.local`. The actual value
|
|
61
|
+
* is irrelevant to OneCLI — the gateway matches by host pattern — but a
|
|
62
|
+
* recognizable prefix (`PCLI_`) helps grep/audit tooling identify which
|
|
63
|
+
* env vars are gateway-routed.
|
|
64
|
+
*/
|
|
65
|
+
export declare function generatePlaceholder(): string;
|