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,140 @@
|
|
|
1
|
+
import { exec } from "./utils/exec.js";
|
|
2
|
+
/**
|
|
3
|
+
* Check if 1Password CLI (op) is installed and authenticated
|
|
4
|
+
*/
|
|
5
|
+
export async function check1PasswordStatus() {
|
|
6
|
+
try {
|
|
7
|
+
// Test if op CLI is available
|
|
8
|
+
const { stdout: versionOutput } = await exec("op", ["--version"], {
|
|
9
|
+
timeout: 5000,
|
|
10
|
+
});
|
|
11
|
+
if (!versionOutput) {
|
|
12
|
+
return {
|
|
13
|
+
installed: false,
|
|
14
|
+
authenticated: false,
|
|
15
|
+
error: "op CLI returned no version information",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Test if user is authenticated
|
|
19
|
+
try {
|
|
20
|
+
await exec("op", ["whoami"], { timeout: 5000 });
|
|
21
|
+
return {
|
|
22
|
+
installed: true,
|
|
23
|
+
authenticated: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return {
|
|
28
|
+
installed: true,
|
|
29
|
+
authenticated: false,
|
|
30
|
+
error: "op CLI is installed but you are not signed in. Run 'op signin' to authenticate.",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return {
|
|
36
|
+
installed: false,
|
|
37
|
+
authenticated: false,
|
|
38
|
+
error: "op CLI not found. Install 1Password CLI: https://developer.1password.com/docs/cli/get-started/",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Lists configured 1Password accounts (`op account list`). Returns [] if op
|
|
44
|
+
* is missing, no account has been added yet, or the call fails. Used to
|
|
45
|
+
* distinguish "user has no account configured" from "user signed out" —
|
|
46
|
+
* the two need different remediation paths.
|
|
47
|
+
*/
|
|
48
|
+
export async function list1PasswordAccounts() {
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await exec("op", ["account", "list", "--format=json"], {
|
|
51
|
+
timeout: 5000,
|
|
52
|
+
});
|
|
53
|
+
if (!stdout.trim())
|
|
54
|
+
return [];
|
|
55
|
+
return JSON.parse(stdout);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function detect1PasswordMode() {
|
|
62
|
+
if (process.env.OP_SERVICE_ACCOUNT_TOKEN) {
|
|
63
|
+
return {
|
|
64
|
+
mode: "service-account",
|
|
65
|
+
hint: "OP_SERVICE_ACCOUNT_TOKEN is set — using headless mode.",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const status = await check1PasswordStatus();
|
|
69
|
+
if (!status.installed) {
|
|
70
|
+
return {
|
|
71
|
+
mode: "not-installed",
|
|
72
|
+
hint: "Install: https://developer.1password.com/docs/cli/get-started/",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const accounts = await list1PasswordAccounts();
|
|
76
|
+
if (accounts.length === 0) {
|
|
77
|
+
return {
|
|
78
|
+
mode: "no-account",
|
|
79
|
+
hint: "Run 'op account add' first (one-time), then re-run kit.",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (status.authenticated) {
|
|
83
|
+
return {
|
|
84
|
+
mode: "desktop-integration",
|
|
85
|
+
hint: "Authenticated via desktop app or active OP_SESSION.",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
mode: "eval-signin",
|
|
90
|
+
hint: "Either enable 1Password 8 → Developer → 'Connect with CLI' for biometric, " +
|
|
91
|
+
"or run `eval $(op signin)` in your shell before re-running kit.",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* List available 1Password vaults
|
|
96
|
+
*/
|
|
97
|
+
export async function list1PasswordVaults() {
|
|
98
|
+
try {
|
|
99
|
+
const { stdout } = await exec("op", ["vault", "list", "--format=json"], {
|
|
100
|
+
timeout: 10000,
|
|
101
|
+
});
|
|
102
|
+
const vaults = JSON.parse(stdout);
|
|
103
|
+
return vaults;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List items in a specific vault
|
|
111
|
+
*/
|
|
112
|
+
export async function list1PasswordItems(vaultId) {
|
|
113
|
+
try {
|
|
114
|
+
const { stdout } = await exec("op", ["item", "list", "--vault", vaultId, "--format=json"], { timeout: 10000 });
|
|
115
|
+
const items = JSON.parse(stdout);
|
|
116
|
+
return items;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Generate a reference string for a 1Password item
|
|
124
|
+
* Helps users construct proper ref strings for config
|
|
125
|
+
*/
|
|
126
|
+
export function generate1PasswordRef(vault, item, field) {
|
|
127
|
+
if (field) {
|
|
128
|
+
return `op://${vault}/${item}/${field}`;
|
|
129
|
+
}
|
|
130
|
+
return `op://${vault}/${item}`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Validate a 1Password reference string format
|
|
134
|
+
*/
|
|
135
|
+
export function validate1PasswordRef(ref) {
|
|
136
|
+
// ref should be op://vault/item or op://vault/item/field
|
|
137
|
+
const pattern = /^op:\/\/[^\/]+\/[^\/]+(\/.+)?$/;
|
|
138
|
+
return pattern.test(ref);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=onepassword.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword.js","sourceRoot":"","sources":["../src/onepassword.ts"],"names":[],"mappings":"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"}
|
package/dist/open.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ServiceDashboard {
|
|
2
|
+
name: string;
|
|
3
|
+
label: string;
|
|
4
|
+
docUrl: string;
|
|
5
|
+
dashboardUrl: (env: Record<string, string>) => string | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function listServices(): ServiceDashboard[];
|
|
8
|
+
export declare function findService(name: string): ServiceDashboard | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Get the dashboard URL for a service.
|
|
11
|
+
* Returns null if no URL is available.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getServiceUrl(name: string, env: Record<string, string>): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Open a URL in the default browser.
|
|
16
|
+
* Falls back to printing the URL if opening fails.
|
|
17
|
+
*/
|
|
18
|
+
export declare function openInBrowser(url: string): Promise<{
|
|
19
|
+
success: boolean;
|
|
20
|
+
message: string;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Open a service dashboard or documentation.
|
|
24
|
+
* If url is "docs", opens documentation instead of dashboard.
|
|
25
|
+
*/
|
|
26
|
+
export declare function openService(serviceName: string, env: Record<string, string>, preferDocs?: boolean): Promise<{
|
|
27
|
+
success: boolean;
|
|
28
|
+
message: string;
|
|
29
|
+
url: string;
|
|
30
|
+
}>;
|
package/dist/open.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
/** Known service dashboard mappings */
|
|
4
|
+
const SERVICES = [
|
|
5
|
+
{
|
|
6
|
+
name: "stripe",
|
|
7
|
+
label: "Stripe Dashboard",
|
|
8
|
+
docUrl: "https://stripe.com/docs",
|
|
9
|
+
dashboardUrl: () => "https://dashboard.stripe.com",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: "supabase",
|
|
13
|
+
label: "Supabase Studio",
|
|
14
|
+
docUrl: "https://supabase.com/docs",
|
|
15
|
+
dashboardUrl: (env) => {
|
|
16
|
+
const ref = env.SUPABASE_PROJECT_REF;
|
|
17
|
+
return ref ? `https://supabase.com/dashboard/project/${ref}` : "https://supabase.com/dashboard";
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "vercel",
|
|
22
|
+
label: "Vercel Dashboard",
|
|
23
|
+
docUrl: "https://vercel.com/docs",
|
|
24
|
+
dashboardUrl: () => "https://vercel.com/dashboard",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "railway",
|
|
28
|
+
label: "Railway Dashboard",
|
|
29
|
+
docUrl: "https://docs.railway.app",
|
|
30
|
+
dashboardUrl: () => "https://railway.app/dashboard",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "sentry",
|
|
34
|
+
label: "Sentry Dashboard",
|
|
35
|
+
docUrl: "https://docs.sentry.io",
|
|
36
|
+
dashboardUrl: () => "https://sentry.io",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "posthog",
|
|
40
|
+
label: "PostHog Dashboard",
|
|
41
|
+
docUrl: "https://posthog.com/docs",
|
|
42
|
+
dashboardUrl: () => "https://app.posthog.com",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "neon",
|
|
46
|
+
label: "Neon Postgres Console",
|
|
47
|
+
docUrl: "https://neon.tech/docs",
|
|
48
|
+
dashboardUrl: () => "https://console.neon.tech",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "github",
|
|
52
|
+
label: "GitHub",
|
|
53
|
+
docUrl: "https://docs.github.com",
|
|
54
|
+
dashboardUrl: () => "https://github.com",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "aws",
|
|
58
|
+
label: "AWS Console",
|
|
59
|
+
docUrl: "https://docs.aws.amazon.com",
|
|
60
|
+
dashboardUrl: () => "https://console.aws.amazon.com",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "gcp",
|
|
64
|
+
label: "Google Cloud Console",
|
|
65
|
+
docUrl: "https://cloud.google.com/docs",
|
|
66
|
+
dashboardUrl: () => "https://console.cloud.google.com",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "azure",
|
|
70
|
+
label: "Azure Portal",
|
|
71
|
+
docUrl: "https://docs.microsoft.com/azure",
|
|
72
|
+
dashboardUrl: () => "https://portal.azure.com",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "docs",
|
|
76
|
+
label: "kit Documentation",
|
|
77
|
+
docUrl: "https://github.com/sandstream/kit",
|
|
78
|
+
dashboardUrl: () => "https://github.com/sandstream/kit",
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
export function listServices() {
|
|
82
|
+
return SERVICES;
|
|
83
|
+
}
|
|
84
|
+
export function findService(name) {
|
|
85
|
+
return SERVICES.find((s) => s.name.toLowerCase() === name.toLowerCase());
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the dashboard URL for a service.
|
|
89
|
+
* Returns null if no URL is available.
|
|
90
|
+
*/
|
|
91
|
+
export function getServiceUrl(name, env) {
|
|
92
|
+
const service = findService(name);
|
|
93
|
+
if (!service)
|
|
94
|
+
return null;
|
|
95
|
+
return service.dashboardUrl(env);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Open a URL in the default browser.
|
|
99
|
+
* Falls back to printing the URL if opening fails.
|
|
100
|
+
*/
|
|
101
|
+
export async function openInBrowser(url) {
|
|
102
|
+
// Determine the open command based on platform
|
|
103
|
+
const cmd = platform() === "darwin" ? "open" : platform() === "win32" ? "start" : "xdg-open";
|
|
104
|
+
return new Promise((resolve) => {
|
|
105
|
+
const child = spawn(cmd, [url], { stdio: "pipe" });
|
|
106
|
+
let timeout;
|
|
107
|
+
// Set a timeout to consider it successful if no error within 100ms
|
|
108
|
+
timeout = setTimeout(() => {
|
|
109
|
+
resolve({
|
|
110
|
+
success: true,
|
|
111
|
+
message: `Opened in browser: ${url}`,
|
|
112
|
+
});
|
|
113
|
+
}, 100);
|
|
114
|
+
child.on("error", () => {
|
|
115
|
+
clearTimeout(timeout);
|
|
116
|
+
resolve({
|
|
117
|
+
success: false,
|
|
118
|
+
message: `Could not open in browser. Visit: ${url}`,
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
child.on("close", (code) => {
|
|
122
|
+
clearTimeout(timeout);
|
|
123
|
+
if (code === 0) {
|
|
124
|
+
resolve({
|
|
125
|
+
success: true,
|
|
126
|
+
message: `Opened in browser: ${url}`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
resolve({
|
|
131
|
+
success: false,
|
|
132
|
+
message: `Could not open in browser. Visit: ${url}`,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Open a service dashboard or documentation.
|
|
140
|
+
* If url is "docs", opens documentation instead of dashboard.
|
|
141
|
+
*/
|
|
142
|
+
export async function openService(serviceName, env, preferDocs = false) {
|
|
143
|
+
const service = findService(serviceName);
|
|
144
|
+
if (!service) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
message: `Unknown service: ${serviceName}`,
|
|
148
|
+
url: "",
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const urlToOpen = preferDocs ? service.docUrl : getServiceUrl(serviceName, env);
|
|
152
|
+
if (!urlToOpen) {
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
message: `No URL available for ${service.label}`,
|
|
156
|
+
url: "",
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const result = await openInBrowser(urlToOpen);
|
|
160
|
+
return {
|
|
161
|
+
success: result.success,
|
|
162
|
+
message: result.message,
|
|
163
|
+
url: urlToOpen,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=open.js.map
|
package/dist/open.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../src/open.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ToolStatus } from "./check-tools.js";
|
|
2
|
+
import type { ServiceStatus } from "./check-services.js";
|
|
3
|
+
import type { SecretStatus } from "./check-secrets.js";
|
|
4
|
+
import type { SkillCheckResult } from "./check-skills.js";
|
|
5
|
+
import type { SecurityCheckResult } from "./check-security.js";
|
|
6
|
+
import type { LockCheckResult } from "./check-lock.js";
|
|
7
|
+
import type { WebSearchStatus } from "./check-web-search.js";
|
|
8
|
+
/** Section header for a group of live steps (e.g. "Checks"). */
|
|
9
|
+
export declare function stepHeader(title: string): void;
|
|
10
|
+
/** Human-readable duration: sub-second in ms, otherwise one-decimal seconds. */
|
|
11
|
+
export declare function fmtDuration(ms: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Run a labeled async step with live terminal feedback + timing.
|
|
14
|
+
*
|
|
15
|
+
* On a TTY: prints a "running" line, then rewrites it in place to ✓/✗ with the
|
|
16
|
+
* elapsed time. On a pipe/CI (non-TTY): prints a start line and a separate end
|
|
17
|
+
* line (no cursor rewrite, so logs stay readable). Returns the fn's result; on
|
|
18
|
+
* throw, marks the step ✗ and re-throws so callers keep their control flow.
|
|
19
|
+
*
|
|
20
|
+
* Shares its visual language (▶ / ✓ / ✗ + step duration) with the shell
|
|
21
|
+
* pre-commit hook generated in hooks.ts.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runStep<T>(label: string, fn: () => Promise<T> | T): Promise<T>;
|
|
24
|
+
export declare function printToolsTable(tools: ToolStatus[]): void;
|
|
25
|
+
export declare function printServicesTable(services: ServiceStatus[]): void;
|
|
26
|
+
export declare function printSecretsTable(templateExists: boolean | null, secrets: SecretStatus[]): void;
|
|
27
|
+
export declare function printSkillsTable(skills: SkillCheckResult[]): void;
|
|
28
|
+
export declare function printWebSearchStatus(status: WebSearchStatus | null): void;
|
|
29
|
+
export declare function printSecurityTable(results: SecurityCheckResult[]): void;
|
|
30
|
+
export declare function printLockTable(results: LockCheckResult[]): void;
|
|
31
|
+
export declare function printAuditTable(events: import("./audit.js").AuditEvent[]): void;
|
|
32
|
+
export declare function printSummary(tools: ToolStatus[], services: ServiceStatus[], secrets: SecretStatus[], security?: SecurityCheckResult[]): void;
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
// ANSI color codes
|
|
2
|
+
const c = {
|
|
3
|
+
reset: "\x1b[0m",
|
|
4
|
+
bold: "\x1b[1m",
|
|
5
|
+
dim: "\x1b[2m",
|
|
6
|
+
green: "\x1b[32m",
|
|
7
|
+
red: "\x1b[31m",
|
|
8
|
+
yellow: "\x1b[33m",
|
|
9
|
+
cyan: "\x1b[36m",
|
|
10
|
+
gray: "\x1b[90m",
|
|
11
|
+
};
|
|
12
|
+
const CHECK = `${c.green}✓${c.reset}`;
|
|
13
|
+
const CROSS = `${c.red}✗${c.reset}`;
|
|
14
|
+
const WARN = `${c.yellow}!${c.reset}`;
|
|
15
|
+
function pad(s, len) {
|
|
16
|
+
// Strip ANSI for length calculation
|
|
17
|
+
const stripped = s.replace(/\x1b\[[0-9;]*m/g, "");
|
|
18
|
+
return s + " ".repeat(Math.max(0, len - stripped.length));
|
|
19
|
+
}
|
|
20
|
+
function header(title) {
|
|
21
|
+
console.log();
|
|
22
|
+
console.log(`${c.bold}${c.cyan}${title}${c.reset}`);
|
|
23
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}`);
|
|
24
|
+
}
|
|
25
|
+
/** Section header for a group of live steps (e.g. "Checks"). */
|
|
26
|
+
export function stepHeader(title) {
|
|
27
|
+
header(title);
|
|
28
|
+
}
|
|
29
|
+
/** Human-readable duration: sub-second in ms, otherwise one-decimal seconds. */
|
|
30
|
+
export function fmtDuration(ms) {
|
|
31
|
+
return ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run a labeled async step with live terminal feedback + timing.
|
|
35
|
+
*
|
|
36
|
+
* On a TTY: prints a "running" line, then rewrites it in place to ✓/✗ with the
|
|
37
|
+
* elapsed time. On a pipe/CI (non-TTY): prints a start line and a separate end
|
|
38
|
+
* line (no cursor rewrite, so logs stay readable). Returns the fn's result; on
|
|
39
|
+
* throw, marks the step ✗ and re-throws so callers keep their control flow.
|
|
40
|
+
*
|
|
41
|
+
* Shares its visual language (▶ / ✓ / ✗ + step duration) with the shell
|
|
42
|
+
* pre-commit hook generated in hooks.ts.
|
|
43
|
+
*/
|
|
44
|
+
export async function runStep(label, fn) {
|
|
45
|
+
const start = Date.now();
|
|
46
|
+
const tty = process.stdout.isTTY === true;
|
|
47
|
+
if (tty) {
|
|
48
|
+
process.stdout.write(` ${c.cyan}▶${c.reset} ${label}${c.dim}…${c.reset}`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(` ${c.cyan}▶${c.reset} ${label}`);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const result = await fn();
|
|
55
|
+
const dur = `${c.dim}${fmtDuration(Date.now() - start)}${c.reset}`;
|
|
56
|
+
if (tty) {
|
|
57
|
+
process.stdout.write(`\r\x1b[K ${CHECK} ${label} ${dur}\n`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(` ${CHECK} ${label} ${dur}`);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const dur = `${c.dim}${fmtDuration(Date.now() - start)}${c.reset}`;
|
|
66
|
+
if (tty) {
|
|
67
|
+
process.stdout.write(`\r\x1b[K ${CROSS} ${label} ${dur}\n`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(` ${CROSS} ${label} ${dur}`);
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function printToolsTable(tools) {
|
|
76
|
+
if (tools.length === 0)
|
|
77
|
+
return;
|
|
78
|
+
header("Tools");
|
|
79
|
+
const nameWidth = Math.max(12, ...tools.map((t) => t.name.length)) + 2;
|
|
80
|
+
for (const tool of tools) {
|
|
81
|
+
const icon = tool.ok ? CHECK : CROSS;
|
|
82
|
+
const name = pad(tool.name, nameWidth);
|
|
83
|
+
const version = tool.installed
|
|
84
|
+
? `${c.dim}${tool.installed}${c.reset}`
|
|
85
|
+
: `${c.red}not installed${c.reset}`;
|
|
86
|
+
const required = `${c.gray}(need ${tool.required})${c.reset}`;
|
|
87
|
+
console.log(` ${icon} ${name} ${version} ${required}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function printServicesTable(services) {
|
|
91
|
+
if (services.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
header("Services");
|
|
94
|
+
const nameWidth = Math.max(12, ...services.map((s) => s.name.length)) + 2;
|
|
95
|
+
for (const svc of services) {
|
|
96
|
+
const icon = svc.authenticated ? CHECK : CROSS;
|
|
97
|
+
const name = pad(svc.name, nameWidth);
|
|
98
|
+
const status = svc.authenticated
|
|
99
|
+
? `${c.green}authenticated${c.reset}`
|
|
100
|
+
: `${c.red}not authenticated${c.reset}`;
|
|
101
|
+
const detail = svc.output ? ` ${c.gray}${svc.output.substring(0, 60)}${c.reset}` : "";
|
|
102
|
+
console.log(` ${icon} ${name} ${status}${detail}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function printSecretsTable(templateExists, secrets) {
|
|
106
|
+
if (secrets.length === 0 && templateExists === null)
|
|
107
|
+
return;
|
|
108
|
+
header("Secrets");
|
|
109
|
+
if (templateExists !== null) {
|
|
110
|
+
const icon = templateExists ? CHECK : CROSS;
|
|
111
|
+
const status = templateExists
|
|
112
|
+
? `${c.green}found${c.reset}`
|
|
113
|
+
: `${c.red}missing${c.reset}`;
|
|
114
|
+
console.log(` ${icon} ${pad("template", 14)} ${status}`);
|
|
115
|
+
}
|
|
116
|
+
// When every 1Password-backed secret fails with the same auth error,
|
|
117
|
+
// collapse them into one banner line instead of spamming N identical rows.
|
|
118
|
+
const opSecrets = secrets.filter((s) => s.source === "1password");
|
|
119
|
+
const opUnauth = opSecrets.filter((s) => s.detail.startsWith("1Password not authenticated"));
|
|
120
|
+
const aggregate1pUnauth = opSecrets.length > 0 && opUnauth.length === opSecrets.length;
|
|
121
|
+
if (aggregate1pUnauth) {
|
|
122
|
+
console.log(` ${CROSS} ${c.red}1Password not authenticated${c.reset} ${c.gray}(${opUnauth.length} secret(s) blocked)${c.reset}`);
|
|
123
|
+
console.log(` ${c.yellow}→ run 'op signin' to authenticate${c.reset}`);
|
|
124
|
+
}
|
|
125
|
+
const renderable = aggregate1pUnauth
|
|
126
|
+
? secrets.filter((s) => s.source !== "1password")
|
|
127
|
+
: secrets;
|
|
128
|
+
if (renderable.length === 0)
|
|
129
|
+
return;
|
|
130
|
+
const nameWidth = Math.max(14, ...renderable.map((s) => s.name.length)) + 2;
|
|
131
|
+
for (const secret of renderable) {
|
|
132
|
+
const icon = secret.available ? CHECK : CROSS;
|
|
133
|
+
const name = pad(secret.name, nameWidth);
|
|
134
|
+
const source = `${c.gray}[${secret.source}]${c.reset}`;
|
|
135
|
+
const detail = secret.available
|
|
136
|
+
? `${c.green}available${c.reset}`
|
|
137
|
+
: `${c.red}${secret.detail}${c.reset}`;
|
|
138
|
+
console.log(` ${icon} ${name} ${source} ${detail}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export function printSkillsTable(skills) {
|
|
142
|
+
if (skills.length === 0)
|
|
143
|
+
return;
|
|
144
|
+
header("Skills");
|
|
145
|
+
const nameWidth = Math.max(12, ...skills.map((s) => s.name.length)) + 2;
|
|
146
|
+
for (const skill of skills) {
|
|
147
|
+
const icon = skill.installed ? CHECK : skill.required ? CROSS : WARN;
|
|
148
|
+
const name = pad(skill.name, nameWidth);
|
|
149
|
+
const tag = skill.required
|
|
150
|
+
? `${c.gray}[required]${c.reset}`
|
|
151
|
+
: `${c.gray}[optional]${c.reset}`;
|
|
152
|
+
const status = skill.installed
|
|
153
|
+
? `${c.green}installed${c.reset}`
|
|
154
|
+
: skill.required
|
|
155
|
+
? `${c.red}missing${c.reset}`
|
|
156
|
+
: `${c.yellow}not installed${c.reset}`;
|
|
157
|
+
const version = `${c.dim}${skill.versionSpec}${c.reset}`;
|
|
158
|
+
console.log(` ${icon} ${name} ${tag} ${status} ${version}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export function printWebSearchStatus(status) {
|
|
162
|
+
if (!status)
|
|
163
|
+
return;
|
|
164
|
+
header("Web Search");
|
|
165
|
+
const icon = status.healthy ? CHECK : CROSS;
|
|
166
|
+
const name = pad(status.provider, 14);
|
|
167
|
+
const configured = status.configured ? `${c.green}configured${c.reset}` : `${c.yellow}not configured${c.reset}`;
|
|
168
|
+
const health = status.healthy ? `${c.green}healthy${c.reset}` : `${c.red}unhealthy${c.reset}`;
|
|
169
|
+
const detail = status.error ? `${c.gray}${status.error}${c.reset}` : status.url ? `${c.gray}${status.url}${c.reset}` : "";
|
|
170
|
+
console.log(` ${icon} ${name} ${configured} ${health}`);
|
|
171
|
+
if (detail) {
|
|
172
|
+
console.log(` ${detail}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export function printSecurityTable(results) {
|
|
176
|
+
if (results.length === 0)
|
|
177
|
+
return;
|
|
178
|
+
header("Security");
|
|
179
|
+
// Group by category
|
|
180
|
+
const byCategory = {};
|
|
181
|
+
for (const result of results) {
|
|
182
|
+
if (!byCategory[result.category]) {
|
|
183
|
+
byCategory[result.category] = [];
|
|
184
|
+
}
|
|
185
|
+
byCategory[result.category].push(result);
|
|
186
|
+
}
|
|
187
|
+
const categories = ["dependency", "exposure", "supply-chain", "secrets"];
|
|
188
|
+
for (const category of categories) {
|
|
189
|
+
const items = byCategory[category];
|
|
190
|
+
if (!items || items.length === 0)
|
|
191
|
+
continue;
|
|
192
|
+
const nameWidth = Math.max(20, ...items.map((r) => r.name.length)) + 2;
|
|
193
|
+
for (const result of items) {
|
|
194
|
+
const icon = result.status === "pass"
|
|
195
|
+
? CHECK
|
|
196
|
+
: result.status === "fail"
|
|
197
|
+
? CROSS
|
|
198
|
+
: result.status === "warn"
|
|
199
|
+
? WARN
|
|
200
|
+
: `${c.dim}−${c.reset}`;
|
|
201
|
+
const name = pad(result.name, nameWidth);
|
|
202
|
+
const statusColor = result.status === "pass"
|
|
203
|
+
? c.green
|
|
204
|
+
: result.status === "fail"
|
|
205
|
+
? c.red
|
|
206
|
+
: result.status === "warn"
|
|
207
|
+
? c.yellow
|
|
208
|
+
: c.dim;
|
|
209
|
+
const detail = `${c.gray}${result.detail}${c.reset}`;
|
|
210
|
+
const severity = result.severity
|
|
211
|
+
? `${c.dim}[${result.severity}]${c.reset}`
|
|
212
|
+
: "";
|
|
213
|
+
console.log(` ${icon} ${name} ${statusColor}${result.status}${c.reset} ${detail} ${severity}`);
|
|
214
|
+
// Show affected files if available (limit to first 5)
|
|
215
|
+
if (result.files && result.files.length > 0) {
|
|
216
|
+
const filesToShow = result.files.slice(0, 5);
|
|
217
|
+
for (const file of filesToShow) {
|
|
218
|
+
console.log(` ${c.dim}• ${file}${c.reset}`);
|
|
219
|
+
}
|
|
220
|
+
if (result.files.length > 5) {
|
|
221
|
+
console.log(` ${c.dim}... and ${result.files.length - 5} more file(s)${c.reset}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Show suggestion/remediation if available
|
|
225
|
+
if (result.suggestion) {
|
|
226
|
+
console.log(` ${c.yellow}${result.suggestion}${c.reset}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export function printLockTable(results) {
|
|
232
|
+
if (results.length === 0)
|
|
233
|
+
return;
|
|
234
|
+
header("Lock Files");
|
|
235
|
+
for (const result of results) {
|
|
236
|
+
const icon = result.inSync ? CHECK : result.exists ? WARN : CROSS;
|
|
237
|
+
const name = result.category === "skills-lock" ? "skills-lock.json" : "cli-lock.json";
|
|
238
|
+
const status = result.inSync
|
|
239
|
+
? `${c.green}in sync${c.reset}`
|
|
240
|
+
: result.exists
|
|
241
|
+
? `${c.yellow}out of sync${c.reset}`
|
|
242
|
+
: `${c.red}missing${c.reset}`;
|
|
243
|
+
const detail = `${c.gray}${result.detail}${c.reset}`;
|
|
244
|
+
console.log(` ${icon} ${pad(name, 20)} ${status} ${detail}`);
|
|
245
|
+
if (result.missing.length > 0 && result.missing.length <= 5) {
|
|
246
|
+
const missingList = result.missing.join(", ");
|
|
247
|
+
console.log(` ${c.dim}Missing: ${missingList}${c.reset}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export function printAuditTable(events) {
|
|
252
|
+
if (events.length === 0) {
|
|
253
|
+
console.log(`${c.dim}No audit log entries found.${c.reset}`);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
header("Audit Log");
|
|
257
|
+
const opWidth = Math.max(14, ...events.map((e) => e.operation.length)) + 2;
|
|
258
|
+
const envWidth = Math.max(6, ...events.map((e) => e.environment.length)) + 2;
|
|
259
|
+
const actorWidth = Math.max(8, ...events.map((e) => (e.agent_name ?? e.agent_id ?? "unknown").length)) + 2;
|
|
260
|
+
for (const event of events) {
|
|
261
|
+
const icon = event.success ? CHECK : CROSS;
|
|
262
|
+
const ts = new Date(event.timestamp).toLocaleString();
|
|
263
|
+
const op = pad(event.operation, opWidth);
|
|
264
|
+
const env = pad(`[${event.environment}]`, envWidth + 2);
|
|
265
|
+
const actor = pad(event.agent_name ?? event.agent_id ?? "unknown", actorWidth);
|
|
266
|
+
const duration = event.duration_ms != null ? `${c.dim}${event.duration_ms}ms${c.reset}` : "";
|
|
267
|
+
console.log(` ${icon} ${c.dim}${ts}${c.reset} ${op} ${c.gray}${env}${c.reset} ${actor} ${duration}`);
|
|
268
|
+
if (event.error) {
|
|
269
|
+
console.log(` ${c.red}Error: ${event.error}${c.reset}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
export function printSummary(tools, services, secrets, security) {
|
|
274
|
+
console.log();
|
|
275
|
+
const toolsOk = tools.filter((t) => t.ok).length;
|
|
276
|
+
const servicesOk = services.filter((s) => s.authenticated).length;
|
|
277
|
+
const secretsOk = secrets.filter((s) => s.available).length;
|
|
278
|
+
const securityOk = security
|
|
279
|
+
? security.filter((s) => s.status === "pass" || s.status === "skip").length
|
|
280
|
+
: 0;
|
|
281
|
+
const total = tools.length + services.length + secrets.length + (security?.length || 0);
|
|
282
|
+
const ok = toolsOk + servicesOk + secretsOk + securityOk;
|
|
283
|
+
const allGood = ok === total;
|
|
284
|
+
if (allGood) {
|
|
285
|
+
console.log(`${c.bold}${c.green}All ${total} checks passed ✓${c.reset}`);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
console.log(`${c.bold}${ok}/${total} checks passed${c.reset}` +
|
|
289
|
+
` ${c.red}(${total - ok} issues)${c.reset}`);
|
|
290
|
+
console.log();
|
|
291
|
+
console.log(`${c.dim}Run ${c.reset}${c.bold}kit install${c.reset}${c.dim} to fix tools, ${c.reset}${c.bold}kit login${c.reset}${c.dim} to fix auth${c.reset}`);
|
|
292
|
+
}
|
|
293
|
+
console.log();
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=output.js.map
|