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,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design / a11y / structural enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Built-in checks (zero extra deps):
|
|
5
|
+
* - Static a11y: scans .tsx/.jsx for common omissions
|
|
6
|
+
* <img> without alt
|
|
7
|
+
* <button> with no text/aria-label
|
|
8
|
+
* <a> without text/aria-label or href
|
|
9
|
+
* form inputs without an associated <label>/aria-labelledby
|
|
10
|
+
* - Design-token consistency: flags hex colors / px values that
|
|
11
|
+
* bypass the design-tokens module (configurable token glob).
|
|
12
|
+
* - File-naming convention: optional regex per directory.
|
|
13
|
+
*
|
|
14
|
+
* Heavy checks (axe-core, Percy) are delegated to external tools via
|
|
15
|
+
* the plugin contract — see docs/PLUGIN_CHECKS.md.
|
|
16
|
+
*/
|
|
17
|
+
import { readdir, readFile, access } from "node:fs/promises";
|
|
18
|
+
import { join, resolve, relative, extname } from "node:path";
|
|
19
|
+
async function pathExists(p) {
|
|
20
|
+
try {
|
|
21
|
+
await access(p);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function walkSources(root, exts) {
|
|
29
|
+
const out = [];
|
|
30
|
+
async function visit(dir) {
|
|
31
|
+
let entries;
|
|
32
|
+
try {
|
|
33
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const e of entries) {
|
|
39
|
+
const full = join(dir, e.name);
|
|
40
|
+
if (e.isDirectory()) {
|
|
41
|
+
if (e.name === "node_modules" || e.name === "dist" || e.name === ".next")
|
|
42
|
+
continue;
|
|
43
|
+
if (e.name.startsWith("."))
|
|
44
|
+
continue;
|
|
45
|
+
await visit(full);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (e.isFile() && exts.includes(extname(e.name)))
|
|
49
|
+
out.push(full);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
await visit(root);
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
const A11Y_RULES = [
|
|
56
|
+
{
|
|
57
|
+
id: "img-alt",
|
|
58
|
+
pattern: /<img\s+(?![^>]*\balt\s*=)[^>]*\/?>/,
|
|
59
|
+
description: "<img> without alt attribute",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "button-empty",
|
|
63
|
+
// <button>...</button> with NO text content and no aria-label / aria-labelledby
|
|
64
|
+
pattern: /<button\s+(?![^>]*\baria-label(?:ledby)?\s*=)[^>]*>\s*<\/button>/,
|
|
65
|
+
description: "<button> with no text or aria-label",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "anchor-no-href",
|
|
69
|
+
pattern: /<a\s+(?![^>]*\bhref\s*=)[^>]*>/,
|
|
70
|
+
description: "<a> without href",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "input-no-label",
|
|
74
|
+
// <input> with no aria-label/aria-labelledby (label-association is harder
|
|
75
|
+
// to verify statically, so we only flag the obvious missing-aria case)
|
|
76
|
+
pattern: /<input\s+(?![^>]*\baria-label(?:ledby)?\s*=)(?![^>]*\btype\s*=\s*['"](?:hidden|submit|button)['"])[^>]*\/?>/,
|
|
77
|
+
description: "<input> without aria-label (and not type=hidden/submit/button)",
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
async function scanA11y(srcRoots) {
|
|
81
|
+
const findings = [];
|
|
82
|
+
for (const root of srcRoots) {
|
|
83
|
+
if (!(await pathExists(root)))
|
|
84
|
+
continue;
|
|
85
|
+
const files = await walkSources(root, [".tsx", ".jsx", ".astro", ".vue"]);
|
|
86
|
+
for (const file of files) {
|
|
87
|
+
let content;
|
|
88
|
+
try {
|
|
89
|
+
content = await readFile(file, "utf-8");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const lines = content.split("\n");
|
|
95
|
+
for (let i = 0; i < lines.length; i++) {
|
|
96
|
+
const line = lines[i];
|
|
97
|
+
for (const rule of A11Y_RULES) {
|
|
98
|
+
if (rule.pattern.test(line)) {
|
|
99
|
+
findings.push({
|
|
100
|
+
file: relative(process.cwd(), file),
|
|
101
|
+
line: i + 1,
|
|
102
|
+
rule: rule.id,
|
|
103
|
+
snippet: line.trim().slice(0, 120),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return findings;
|
|
111
|
+
}
|
|
112
|
+
async function scanTokenBypass(srcRoots, tokenFiles) {
|
|
113
|
+
const findings = [];
|
|
114
|
+
for (const root of srcRoots) {
|
|
115
|
+
if (!(await pathExists(root)))
|
|
116
|
+
continue;
|
|
117
|
+
const files = await walkSources(root, [".ts", ".tsx", ".css", ".scss", ".module.css"]);
|
|
118
|
+
for (const file of files) {
|
|
119
|
+
// Allow token-definition files themselves to use raw values.
|
|
120
|
+
if (tokenFiles.some((t) => file.includes(t)))
|
|
121
|
+
continue;
|
|
122
|
+
let content;
|
|
123
|
+
try {
|
|
124
|
+
content = await readFile(file, "utf-8");
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const lines = content.split("\n");
|
|
130
|
+
for (let i = 0; i < lines.length; i++) {
|
|
131
|
+
const line = lines[i];
|
|
132
|
+
const hex = line.match(/#[0-9a-f]{3,8}\b/i);
|
|
133
|
+
if (hex) {
|
|
134
|
+
findings.push({
|
|
135
|
+
file: relative(process.cwd(), file),
|
|
136
|
+
line: i + 1,
|
|
137
|
+
kind: "raw-hex",
|
|
138
|
+
match: hex[0],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const px = line.match(/\b\d{2,}px\b/);
|
|
142
|
+
if (px && !line.includes("border")) {
|
|
143
|
+
findings.push({
|
|
144
|
+
file: relative(process.cwd(), file),
|
|
145
|
+
line: i + 1,
|
|
146
|
+
kind: "raw-px",
|
|
147
|
+
match: px[0],
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return findings;
|
|
154
|
+
}
|
|
155
|
+
export async function checkDesign(opts = {}) {
|
|
156
|
+
const srcRoots = (opts.srcRoots ?? ["src", "app", "components"]).map((d) => resolve(process.cwd(), d));
|
|
157
|
+
const tokenFiles = opts.tokenFiles ?? ["design-tokens", "tokens.ts", "theme.ts"];
|
|
158
|
+
const enforce = opts.enforce ?? false;
|
|
159
|
+
const results = [];
|
|
160
|
+
// Only run if at least one source root exists AND has tsx/jsx/component
|
|
161
|
+
// files. kit's own src/ is pure TypeScript with no React, so this
|
|
162
|
+
// returns "skip" here.
|
|
163
|
+
let anyComponentRoot = false;
|
|
164
|
+
for (const root of srcRoots) {
|
|
165
|
+
if (await pathExists(root)) {
|
|
166
|
+
const files = await walkSources(root, [".tsx", ".jsx", ".astro", ".vue"]);
|
|
167
|
+
if (files.length > 0) {
|
|
168
|
+
anyComponentRoot = true;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!anyComponentRoot) {
|
|
174
|
+
results.push({
|
|
175
|
+
category: "design",
|
|
176
|
+
name: "a11y (static scan)",
|
|
177
|
+
status: "skip",
|
|
178
|
+
detail: "no tsx/jsx/astro/vue files found",
|
|
179
|
+
});
|
|
180
|
+
return results;
|
|
181
|
+
}
|
|
182
|
+
// A11y
|
|
183
|
+
const a11y = await scanA11y(srcRoots);
|
|
184
|
+
const a11yBaseline = new Set(opts.baseline?.a11y ?? []);
|
|
185
|
+
const newA11y = a11y.filter((f) => !a11yBaseline.has(`${f.file}:${f.rule}`));
|
|
186
|
+
if (a11y.length === 0) {
|
|
187
|
+
results.push({
|
|
188
|
+
category: "design",
|
|
189
|
+
name: "a11y (static scan)",
|
|
190
|
+
status: "pass",
|
|
191
|
+
detail: "no obvious a11y omissions",
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
else if (newA11y.length === 0) {
|
|
195
|
+
results.push({
|
|
196
|
+
category: "design",
|
|
197
|
+
name: "a11y (static scan)",
|
|
198
|
+
status: "warn",
|
|
199
|
+
detail: `${a11y.length} pre-existing a11y finding(s) (baseline-frozen)`,
|
|
200
|
+
severity: "low",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
results.push({
|
|
205
|
+
category: "design",
|
|
206
|
+
name: "a11y (static scan)",
|
|
207
|
+
status: enforce ? "fail" : "warn",
|
|
208
|
+
detail: `${newA11y.length} new a11y finding(s) (${a11y.length} total)`,
|
|
209
|
+
severity: enforce ? "high" : "medium",
|
|
210
|
+
files: newA11y.slice(0, 10).map((f) => `${f.file}:${f.line} [${f.rule}] ${f.snippet}`),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Design tokens
|
|
214
|
+
const tokenFindings = await scanTokenBypass(srcRoots, tokenFiles);
|
|
215
|
+
const tokenBaseline = new Set(opts.baseline?.tokens ?? []);
|
|
216
|
+
const newTokens = tokenFindings.filter((f) => !tokenBaseline.has(`${f.file}:${f.kind}:${f.match}`));
|
|
217
|
+
if (tokenFindings.length === 0) {
|
|
218
|
+
results.push({
|
|
219
|
+
category: "design",
|
|
220
|
+
name: "design-token consistency",
|
|
221
|
+
status: "pass",
|
|
222
|
+
detail: "no raw hex/px values found in components",
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else if (newTokens.length === 0) {
|
|
226
|
+
results.push({
|
|
227
|
+
category: "design",
|
|
228
|
+
name: "design-token consistency",
|
|
229
|
+
status: "warn",
|
|
230
|
+
detail: `${tokenFindings.length} pre-existing raw value(s) (baseline-frozen)`,
|
|
231
|
+
severity: "low",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
results.push({
|
|
236
|
+
category: "design",
|
|
237
|
+
name: "design-token consistency",
|
|
238
|
+
status: enforce ? "fail" : "warn",
|
|
239
|
+
detail: `${newTokens.length} new raw value(s) — should use design tokens`,
|
|
240
|
+
severity: enforce ? "high" : "medium",
|
|
241
|
+
files: newTokens.slice(0, 10).map((f) => `${f.file}:${f.line} ${f.kind}=${f.match}`),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
return results;
|
|
245
|
+
}
|
|
246
|
+
/** Exposed so `kit baseline freeze` can snapshot these into .kit-baseline.json. */
|
|
247
|
+
export async function collectDesignKeys() {
|
|
248
|
+
const srcRoots = ["src", "app", "components"].map((d) => resolve(process.cwd(), d));
|
|
249
|
+
const a11y = await scanA11y(srcRoots);
|
|
250
|
+
const tokens = await scanTokenBypass(srcRoots, ["design-tokens", "tokens.ts", "theme.ts"]);
|
|
251
|
+
return {
|
|
252
|
+
a11y: a11y.map((f) => `${f.file}:${f.rule}`),
|
|
253
|
+
tokens: tokens.map((f) => `${f.file}:${f.kind}:${f.match}`),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=check-design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-design.js","sourceRoot":"","sources":["../src/check-design.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .gitignore validator. Checks that the project's `.gitignore` covers the
|
|
3
|
+
* paths that historically leak credentials when accidentally committed.
|
|
4
|
+
*
|
|
5
|
+
* Two operations:
|
|
6
|
+
* - `verify(cwd)` — returns the list of patterns that should be present
|
|
7
|
+
* but aren't
|
|
8
|
+
* - `patch(cwd)` — appends missing entries to `.gitignore` (or creates
|
|
9
|
+
* the file). Idempotent — re-running is a no-op.
|
|
10
|
+
*
|
|
11
|
+
* `.gitignore` semantics are minimal here: we string-match by line, ignore
|
|
12
|
+
* comments, and require an exact pattern match (no globbing equivalence —
|
|
13
|
+
* if the user has `**.env*` instead of `.env*`, kit still nudges them).
|
|
14
|
+
*/
|
|
15
|
+
export interface IgnoreCheckResult {
|
|
16
|
+
exists: boolean;
|
|
17
|
+
presentPatterns: string[];
|
|
18
|
+
missingPatterns: {
|
|
19
|
+
pattern: string;
|
|
20
|
+
reason: string;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export declare function checkGitignore(cwd?: string): Promise<IgnoreCheckResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Appends the missing patterns to `.gitignore`, creating the file if needed.
|
|
26
|
+
* Adds a single kit-managed block at the bottom so we can recognize it on
|
|
27
|
+
* re-runs and not duplicate.
|
|
28
|
+
*/
|
|
29
|
+
export declare function patchGitignore(cwd?: string): Promise<{
|
|
30
|
+
added: number;
|
|
31
|
+
written: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Lightweight tracked-file scanner — walks the git index for paths that
|
|
35
|
+
* SHOULD have been ignored but aren't. Returns the offending tracked
|
|
36
|
+
* filenames. Useful for the "already committed before .gitignore was set
|
|
37
|
+
* up" case where adding the pattern doesn't help.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findCommittedSensitive(cwd?: string): Promise<string[]>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .gitignore validator. Checks that the project's `.gitignore` covers the
|
|
3
|
+
* paths that historically leak credentials when accidentally committed.
|
|
4
|
+
*
|
|
5
|
+
* Two operations:
|
|
6
|
+
* - `verify(cwd)` — returns the list of patterns that should be present
|
|
7
|
+
* but aren't
|
|
8
|
+
* - `patch(cwd)` — appends missing entries to `.gitignore` (or creates
|
|
9
|
+
* the file). Idempotent — re-running is a no-op.
|
|
10
|
+
*
|
|
11
|
+
* `.gitignore` semantics are minimal here: we string-match by line, ignore
|
|
12
|
+
* comments, and require an exact pattern match (no globbing equivalence —
|
|
13
|
+
* if the user has `**.env*` instead of `.env*`, kit still nudges them).
|
|
14
|
+
*/
|
|
15
|
+
import { readFile, writeFile, access, stat } from "node:fs/promises";
|
|
16
|
+
import { resolve } from "node:path";
|
|
17
|
+
const REQUIRED_PATTERNS = [
|
|
18
|
+
{ pattern: ".env", reason: "default dotenv file", aliases: [".env*", "**/.env"] },
|
|
19
|
+
{ pattern: ".env.local", reason: "local secrets materialized by kit secrets", aliases: [".env*"] },
|
|
20
|
+
{ pattern: ".env.*.local", reason: "per-env local secrets", aliases: [".env*"] },
|
|
21
|
+
{ pattern: "node_modules", reason: "dependency tree", aliases: ["node_modules/"] },
|
|
22
|
+
{ pattern: ".kit/", reason: "kit local state (elevation, env, runtime)", aliases: [".kit", ".kit/*"] },
|
|
23
|
+
{ pattern: ".kit-audit.jsonl", reason: "audit log can contain secret labels + paths" },
|
|
24
|
+
{ pattern: "*.pem", reason: "PEM keys / certs" },
|
|
25
|
+
{ pattern: "*.key", reason: "private keys" },
|
|
26
|
+
{ pattern: "id_rsa", reason: "SSH private key", aliases: ["id_rsa*"] },
|
|
27
|
+
{ pattern: "id_ed25519", reason: "SSH ed25519 private key", aliases: ["id_ed25519*"] },
|
|
28
|
+
{ pattern: "*.p12", reason: "PKCS#12 bundle (TLS certs + keys)" },
|
|
29
|
+
{ pattern: "*-service-account*.json", reason: "GCP service-account JSON keys" },
|
|
30
|
+
];
|
|
31
|
+
function parseGitignore(text) {
|
|
32
|
+
return text
|
|
33
|
+
.split("\n")
|
|
34
|
+
.map((l) => {
|
|
35
|
+
// Strip inline comments (everything after first unescaped `#`),
|
|
36
|
+
// matching how our patch helper writes `pattern # reason`.
|
|
37
|
+
const hashIdx = l.indexOf("#");
|
|
38
|
+
const noComment = hashIdx >= 0 ? l.slice(0, hashIdx) : l;
|
|
39
|
+
return noComment.trim();
|
|
40
|
+
})
|
|
41
|
+
.filter((l) => l.length > 0);
|
|
42
|
+
}
|
|
43
|
+
export async function checkGitignore(cwd = process.cwd()) {
|
|
44
|
+
const path = resolve(cwd, ".gitignore");
|
|
45
|
+
let exists = false;
|
|
46
|
+
let lines = [];
|
|
47
|
+
try {
|
|
48
|
+
await access(path);
|
|
49
|
+
exists = true;
|
|
50
|
+
const text = await readFile(path, "utf-8");
|
|
51
|
+
lines = parseGitignore(text);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// file missing — every required pattern is "missing"
|
|
55
|
+
}
|
|
56
|
+
const present = new Set(lines);
|
|
57
|
+
const missing = [];
|
|
58
|
+
const matched = [];
|
|
59
|
+
for (const entry of REQUIRED_PATTERNS) {
|
|
60
|
+
const candidates = [entry.pattern, ...(entry.aliases ?? [])];
|
|
61
|
+
const found = candidates.find((p) => present.has(p));
|
|
62
|
+
if (found) {
|
|
63
|
+
matched.push(entry.pattern);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
missing.push({ pattern: entry.pattern, reason: entry.reason });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
exists,
|
|
71
|
+
presentPatterns: matched,
|
|
72
|
+
missingPatterns: missing,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Appends the missing patterns to `.gitignore`, creating the file if needed.
|
|
77
|
+
* Adds a single kit-managed block at the bottom so we can recognize it on
|
|
78
|
+
* re-runs and not duplicate.
|
|
79
|
+
*/
|
|
80
|
+
export async function patchGitignore(cwd = process.cwd()) {
|
|
81
|
+
const result = await checkGitignore(cwd);
|
|
82
|
+
if (result.missingPatterns.length === 0) {
|
|
83
|
+
return { added: 0, written: false };
|
|
84
|
+
}
|
|
85
|
+
const path = resolve(cwd, ".gitignore");
|
|
86
|
+
let existing = "";
|
|
87
|
+
try {
|
|
88
|
+
await access(path);
|
|
89
|
+
existing = await readFile(path, "utf-8");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
existing = "";
|
|
93
|
+
}
|
|
94
|
+
// Find the kit-managed block; replace it if present so the same patch
|
|
95
|
+
// command stays idempotent.
|
|
96
|
+
const MARKER_START = "# ── kit security check-gitignore ── do not edit ──";
|
|
97
|
+
const MARKER_END = "# ── /kit ──";
|
|
98
|
+
const block = [
|
|
99
|
+
MARKER_START,
|
|
100
|
+
...result.missingPatterns.map((m) => `${m.pattern} # ${m.reason}`),
|
|
101
|
+
MARKER_END,
|
|
102
|
+
"",
|
|
103
|
+
].join("\n");
|
|
104
|
+
let next;
|
|
105
|
+
if (existing.includes(MARKER_START) && existing.includes(MARKER_END)) {
|
|
106
|
+
const before = existing.split(MARKER_START)[0].trimEnd();
|
|
107
|
+
const after = existing.split(MARKER_END)[1] ?? "";
|
|
108
|
+
next = `${before}\n\n${block}${after}`;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const trimmed = existing.trimEnd();
|
|
112
|
+
next = trimmed.length > 0 ? `${trimmed}\n\n${block}` : block;
|
|
113
|
+
}
|
|
114
|
+
await writeFile(path, next, "utf-8");
|
|
115
|
+
return { added: result.missingPatterns.length, written: true };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Lightweight tracked-file scanner — walks the git index for paths that
|
|
119
|
+
* SHOULD have been ignored but aren't. Returns the offending tracked
|
|
120
|
+
* filenames. Useful for the "already committed before .gitignore was set
|
|
121
|
+
* up" case where adding the pattern doesn't help.
|
|
122
|
+
*/
|
|
123
|
+
export async function findCommittedSensitive(cwd = process.cwd()) {
|
|
124
|
+
const { execFile } = await import("node:child_process");
|
|
125
|
+
const { promisify } = await import("node:util");
|
|
126
|
+
const exec = promisify(execFile);
|
|
127
|
+
try {
|
|
128
|
+
const { stdout } = await exec("git", ["ls-files"], { cwd, timeout: 5_000 });
|
|
129
|
+
const tracked = stdout.split("\n").filter(Boolean);
|
|
130
|
+
const offenders = [];
|
|
131
|
+
for (const path of tracked) {
|
|
132
|
+
const base = path.split("/").pop() ?? path;
|
|
133
|
+
// `.env`, `.env.local`, `.env.local.prod-backup`, etc.
|
|
134
|
+
// Excluded as harmless: any path that ends in `.template`,
|
|
135
|
+
// `.example`, `.sample` (covers `.env.staging.example` too).
|
|
136
|
+
if (/^\.env(\..+)?$/.test(base) &&
|
|
137
|
+
!/\.(template|example|sample)$/.test(base))
|
|
138
|
+
offenders.push(path);
|
|
139
|
+
if (base.endsWith(".pem") || base.endsWith(".key") || base.endsWith(".p12"))
|
|
140
|
+
offenders.push(path);
|
|
141
|
+
if (base === "id_rsa" || base.startsWith("id_rsa."))
|
|
142
|
+
offenders.push(path);
|
|
143
|
+
if (base === "id_ed25519" || base.startsWith("id_ed25519."))
|
|
144
|
+
offenders.push(path);
|
|
145
|
+
if (/-service-account.*\.json$/.test(base))
|
|
146
|
+
offenders.push(path);
|
|
147
|
+
}
|
|
148
|
+
return [...new Set(offenders)];
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Suppress unused-import warning for stat — kept for future size-cap checks.
|
|
155
|
+
void stat;
|
|
156
|
+
//# sourceMappingURL=check-gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-gitignore.js","sourceRoot":"","sources":["../src/check-gitignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HooksConfig } from "./config.js";
|
|
2
|
+
export interface HookCheckResult {
|
|
3
|
+
hookName: string;
|
|
4
|
+
installed: boolean;
|
|
5
|
+
upToDate: boolean;
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Check if git hooks are installed and up-to-date
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkHooks(config: HooksConfig, gitDir?: string): Promise<HookCheckResult[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Check if git directory exists
|
|
14
|
+
*/
|
|
15
|
+
export declare function isGitRepository(gitDir?: string): boolean;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
/**
|
|
5
|
+
* Check if git hooks are installed and up-to-date
|
|
6
|
+
*/
|
|
7
|
+
export async function checkHooks(config, gitDir = ".git") {
|
|
8
|
+
const results = [];
|
|
9
|
+
const hooksDir = resolve(process.cwd(), gitDir, "hooks");
|
|
10
|
+
for (const [hookName, commands] of Object.entries(config)) {
|
|
11
|
+
if (!commands || commands.length === 0) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const result = await checkHook(hooksDir, hookName, commands);
|
|
15
|
+
results.push(result);
|
|
16
|
+
}
|
|
17
|
+
return results;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check a single git hook
|
|
21
|
+
*/
|
|
22
|
+
async function checkHook(hooksDir, hookName, commands) {
|
|
23
|
+
const hookPath = resolve(hooksDir, hookName);
|
|
24
|
+
// Check if hook file exists
|
|
25
|
+
if (!existsSync(hookPath)) {
|
|
26
|
+
return {
|
|
27
|
+
hookName,
|
|
28
|
+
installed: false,
|
|
29
|
+
upToDate: false,
|
|
30
|
+
detail: "not installed",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
// Read hook content
|
|
35
|
+
const content = await readFile(hookPath, "utf-8");
|
|
36
|
+
// Check if it's a kit-generated hook
|
|
37
|
+
if (!content.includes("# Generated by kit")) {
|
|
38
|
+
return {
|
|
39
|
+
hookName,
|
|
40
|
+
installed: true,
|
|
41
|
+
upToDate: false,
|
|
42
|
+
detail: "not managed by kit",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Check if commands match
|
|
46
|
+
const upToDate = commands.every((cmd) => content.includes(cmd));
|
|
47
|
+
return {
|
|
48
|
+
hookName,
|
|
49
|
+
installed: true,
|
|
50
|
+
upToDate,
|
|
51
|
+
detail: upToDate
|
|
52
|
+
? `${commands.length} command(s)`
|
|
53
|
+
: "outdated (run kit hooks install)",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return {
|
|
58
|
+
hookName,
|
|
59
|
+
installed: true,
|
|
60
|
+
upToDate: false,
|
|
61
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if git directory exists
|
|
67
|
+
*/
|
|
68
|
+
export function isGitRepository(gitDir = ".git") {
|
|
69
|
+
const gitPath = resolve(process.cwd(), gitDir);
|
|
70
|
+
return existsSync(gitPath);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=check-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-hooks.js","sourceRoot":"","sources":["../src/check-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAUrC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,MAAM,GAAG,MAAM;IAEf,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CACtB,QAAgB,EAChB,QAAgB,EAChB,QAAkB;IAElB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,eAAe;SACxB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,oBAAoB;QACpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAElD,qCAAqC;QACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC5C,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,oBAAoB;aAC7B,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAEhE,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ;YACR,MAAM,EAAE,QAAQ;gBACd,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,aAAa;gBACjC,CAAC,CAAC,kCAAkC;SACvC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAM,GAAG,MAAM;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check lock file status
|
|
3
|
+
*/
|
|
4
|
+
import type { kitConfig } from "./config.js";
|
|
5
|
+
export interface LockCheckResult {
|
|
6
|
+
category: "skills-lock" | "cli-lock";
|
|
7
|
+
exists: boolean;
|
|
8
|
+
inSync: boolean;
|
|
9
|
+
missing: string[];
|
|
10
|
+
detail: string;
|
|
11
|
+
authRequired?: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check lock files against config
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkLockFiles(config: kitConfig): Promise<LockCheckResult[]>;
|