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.
Files changed (519) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +617 -0
  3. package/dist/adapters/api-key-adapter.d.ts +35 -0
  4. package/dist/adapters/api-key-adapter.js +46 -0
  5. package/dist/adapters/api-key-adapter.js.map +1 -0
  6. package/dist/adapters/clerk-auth.d.ts +6 -0
  7. package/dist/adapters/clerk-auth.js +20 -0
  8. package/dist/adapters/clerk-auth.js.map +1 -0
  9. package/dist/adapters/cloudflare-r2.d.ts +6 -0
  10. package/dist/adapters/cloudflare-r2.js +136 -0
  11. package/dist/adapters/cloudflare-r2.js.map +1 -0
  12. package/dist/adapters/expo-eas.d.ts +6 -0
  13. package/dist/adapters/expo-eas.js +129 -0
  14. package/dist/adapters/expo-eas.js.map +1 -0
  15. package/dist/adapters/flagsmith-flags.d.ts +5 -0
  16. package/dist/adapters/flagsmith-flags.js +20 -0
  17. package/dist/adapters/flagsmith-flags.js.map +1 -0
  18. package/dist/adapters/flyio-hosting.d.ts +2 -0
  19. package/dist/adapters/flyio-hosting.js +143 -0
  20. package/dist/adapters/flyio-hosting.js.map +1 -0
  21. package/dist/adapters/index.d.ts +6 -0
  22. package/dist/adapters/index.js +48 -0
  23. package/dist/adapters/index.js.map +1 -0
  24. package/dist/adapters/inngest-background.d.ts +5 -0
  25. package/dist/adapters/inngest-background.js +19 -0
  26. package/dist/adapters/inngest-background.js.map +1 -0
  27. package/dist/adapters/liveblocks-realtime.d.ts +11 -0
  28. package/dist/adapters/liveblocks-realtime.js +62 -0
  29. package/dist/adapters/liveblocks-realtime.js.map +1 -0
  30. package/dist/adapters/loops-email.d.ts +6 -0
  31. package/dist/adapters/loops-email.js +18 -0
  32. package/dist/adapters/loops-email.js.map +1 -0
  33. package/dist/adapters/neon-db.d.ts +10 -0
  34. package/dist/adapters/neon-db.js +94 -0
  35. package/dist/adapters/neon-db.js.map +1 -0
  36. package/dist/adapters/planetscale-db.d.ts +11 -0
  37. package/dist/adapters/planetscale-db.js +134 -0
  38. package/dist/adapters/planetscale-db.js.map +1 -0
  39. package/dist/adapters/posthog-analytics.d.ts +6 -0
  40. package/dist/adapters/posthog-analytics.js +22 -0
  41. package/dist/adapters/posthog-analytics.js.map +1 -0
  42. package/dist/adapters/railway-hosting.d.ts +2 -0
  43. package/dist/adapters/railway-hosting.js +136 -0
  44. package/dist/adapters/railway-hosting.js.map +1 -0
  45. package/dist/adapters/resend-email.d.ts +35 -0
  46. package/dist/adapters/resend-email.js +109 -0
  47. package/dist/adapters/resend-email.js.map +1 -0
  48. package/dist/adapters/searxng-instance.d.ts +6 -0
  49. package/dist/adapters/searxng-instance.js +240 -0
  50. package/dist/adapters/searxng-instance.js.map +1 -0
  51. package/dist/adapters/sentry-monitoring.d.ts +7 -0
  52. package/dist/adapters/sentry-monitoring.js +27 -0
  53. package/dist/adapters/sentry-monitoring.js.map +1 -0
  54. package/dist/adapters/stripe-payments.d.ts +6 -0
  55. package/dist/adapters/stripe-payments.js +134 -0
  56. package/dist/adapters/stripe-payments.js.map +1 -0
  57. package/dist/adapters/supabase-db.d.ts +6 -0
  58. package/dist/adapters/supabase-db.js +130 -0
  59. package/dist/adapters/supabase-db.js.map +1 -0
  60. package/dist/adapters/tinybird-analytics.d.ts +5 -0
  61. package/dist/adapters/tinybird-analytics.js +20 -0
  62. package/dist/adapters/tinybird-analytics.js.map +1 -0
  63. package/dist/adapters/trigger-background.d.ts +6 -0
  64. package/dist/adapters/trigger-background.js +20 -0
  65. package/dist/adapters/trigger-background.js.map +1 -0
  66. package/dist/adapters/types.d.ts +7 -0
  67. package/dist/adapters/types.js +2 -0
  68. package/dist/adapters/types.js.map +1 -0
  69. package/dist/adapters/upstash-redis.d.ts +6 -0
  70. package/dist/adapters/upstash-redis.js +88 -0
  71. package/dist/adapters/upstash-redis.js.map +1 -0
  72. package/dist/adapters/vercel-hosting.d.ts +6 -0
  73. package/dist/adapters/vercel-hosting.js +112 -0
  74. package/dist/adapters/vercel-hosting.js.map +1 -0
  75. package/dist/agent-adapter-model.d.ts +108 -0
  76. package/dist/agent-adapter-model.js +6 -0
  77. package/dist/agent-adapter-model.js.map +1 -0
  78. package/dist/agent-adapter-service.d.ts +67 -0
  79. package/dist/agent-adapter-service.js +299 -0
  80. package/dist/agent-adapter-service.js.map +1 -0
  81. package/dist/agent-config.d.ts +56 -0
  82. package/dist/agent-config.js +129 -0
  83. package/dist/agent-config.js.map +1 -0
  84. package/dist/agent-governance-model.d.ts +128 -0
  85. package/dist/agent-governance-model.js +6 -0
  86. package/dist/agent-governance-model.js.map +1 -0
  87. package/dist/agent-governance-service.d.ts +101 -0
  88. package/dist/agent-governance-service.js +319 -0
  89. package/dist/agent-governance-service.js.map +1 -0
  90. package/dist/alert-rules-engine.d.ts +102 -0
  91. package/dist/alert-rules-engine.js +210 -0
  92. package/dist/alert-rules-engine.js.map +1 -0
  93. package/dist/analytics-service.d.ts +126 -0
  94. package/dist/analytics-service.js +318 -0
  95. package/dist/analytics-service.js.map +1 -0
  96. package/dist/analyze.d.ts +19 -0
  97. package/dist/analyze.js +311 -0
  98. package/dist/analyze.js.map +1 -0
  99. package/dist/apm-instrumentor.d.ts +119 -0
  100. package/dist/apm-instrumentor.js +225 -0
  101. package/dist/apm-instrumentor.js.map +1 -0
  102. package/dist/approval-model.d.ts +82 -0
  103. package/dist/approval-model.js +6 -0
  104. package/dist/approval-model.js.map +1 -0
  105. package/dist/approval-service.d.ts +39 -0
  106. package/dist/approval-service.js +236 -0
  107. package/dist/approval-service.js.map +1 -0
  108. package/dist/approval.d.ts +22 -0
  109. package/dist/approval.js +148 -0
  110. package/dist/approval.js.map +1 -0
  111. package/dist/audit-logging-model.d.ts +157 -0
  112. package/dist/audit-logging-model.js +6 -0
  113. package/dist/audit-logging-model.js.map +1 -0
  114. package/dist/audit-logging-service.d.ts +89 -0
  115. package/dist/audit-logging-service.js +367 -0
  116. package/dist/audit-logging-service.js.map +1 -0
  117. package/dist/audit-secrets.d.ts +42 -0
  118. package/dist/audit-secrets.js +126 -0
  119. package/dist/audit-secrets.js.map +1 -0
  120. package/dist/audit.d.ts +43 -0
  121. package/dist/audit.js +286 -0
  122. package/dist/audit.js.map +1 -0
  123. package/dist/author-dashboard.d.ts +84 -0
  124. package/dist/author-dashboard.js +204 -0
  125. package/dist/author-dashboard.js.map +1 -0
  126. package/dist/author-notifications.d.ts +130 -0
  127. package/dist/author-notifications.js +261 -0
  128. package/dist/author-notifications.js.map +1 -0
  129. package/dist/author-verification.d.ts +79 -0
  130. package/dist/author-verification.js +257 -0
  131. package/dist/author-verification.js.map +1 -0
  132. package/dist/autonomous-setup-model.d.ts +117 -0
  133. package/dist/autonomous-setup-model.js +6 -0
  134. package/dist/autonomous-setup-model.js.map +1 -0
  135. package/dist/autonomous-setup-service.d.ts +74 -0
  136. package/dist/autonomous-setup-service.js +325 -0
  137. package/dist/autonomous-setup-service.js.map +1 -0
  138. package/dist/badge-system.d.ts +70 -0
  139. package/dist/badge-system.js +210 -0
  140. package/dist/badge-system.js.map +1 -0
  141. package/dist/baseline.d.ts +34 -0
  142. package/dist/baseline.js +78 -0
  143. package/dist/baseline.js.map +1 -0
  144. package/dist/beta-program-service.d.ts +112 -0
  145. package/dist/beta-program-service.js +240 -0
  146. package/dist/beta-program-service.js.map +1 -0
  147. package/dist/budget.d.ts +34 -0
  148. package/dist/budget.js +159 -0
  149. package/dist/budget.js.map +1 -0
  150. package/dist/bumblebee.d.ts +143 -0
  151. package/dist/bumblebee.js +384 -0
  152. package/dist/bumblebee.js.map +1 -0
  153. package/dist/cache-manager.d.ts +97 -0
  154. package/dist/cache-manager.js +244 -0
  155. package/dist/cache-manager.js.map +1 -0
  156. package/dist/cdn-adapter.d.ts +64 -0
  157. package/dist/cdn-adapter.js +263 -0
  158. package/dist/cdn-adapter.js.map +1 -0
  159. package/dist/certification-workflow-model.d.ts +95 -0
  160. package/dist/certification-workflow-model.js +6 -0
  161. package/dist/certification-workflow-model.js.map +1 -0
  162. package/dist/certification-workflow-service.d.ts +72 -0
  163. package/dist/certification-workflow-service.js +305 -0
  164. package/dist/certification-workflow-service.js.map +1 -0
  165. package/dist/check-design.d.ts +38 -0
  166. package/dist/check-design.js +256 -0
  167. package/dist/check-design.js.map +1 -0
  168. package/dist/check-gitignore.d.ts +39 -0
  169. package/dist/check-gitignore.js +156 -0
  170. package/dist/check-gitignore.js.map +1 -0
  171. package/dist/check-hooks.d.ts +15 -0
  172. package/dist/check-hooks.js +72 -0
  173. package/dist/check-hooks.js.map +1 -0
  174. package/dist/check-lock.d.ts +16 -0
  175. package/dist/check-lock.js +94 -0
  176. package/dist/check-lock.js.map +1 -0
  177. package/dist/check-secrets.d.ts +11 -0
  178. package/dist/check-secrets.js +320 -0
  179. package/dist/check-secrets.js.map +1 -0
  180. package/dist/check-security.d.ts +13 -0
  181. package/dist/check-security.js +887 -0
  182. package/dist/check-security.js.map +1 -0
  183. package/dist/check-services.d.ts +10 -0
  184. package/dist/check-services.js +44 -0
  185. package/dist/check-services.js.map +1 -0
  186. package/dist/check-skills.d.ts +8 -0
  187. package/dist/check-skills.js +26 -0
  188. package/dist/check-skills.js.map +1 -0
  189. package/dist/check-tests.d.ts +43 -0
  190. package/dist/check-tests.js +175 -0
  191. package/dist/check-tests.js.map +1 -0
  192. package/dist/check-tools.d.ts +8 -0
  193. package/dist/check-tools.js +42 -0
  194. package/dist/check-tools.js.map +1 -0
  195. package/dist/check-web-search.d.ts +12 -0
  196. package/dist/check-web-search.js +168 -0
  197. package/dist/check-web-search.js.map +1 -0
  198. package/dist/ci-cd-publisher.d.ts +162 -0
  199. package/dist/ci-cd-publisher.js +319 -0
  200. package/dist/ci-cd-publisher.js.map +1 -0
  201. package/dist/cli.d.ts +2 -0
  202. package/dist/cli.js +4074 -0
  203. package/dist/cli.js.map +1 -0
  204. package/dist/clone.d.ts +25 -0
  205. package/dist/clone.js +73 -0
  206. package/dist/clone.js.map +1 -0
  207. package/dist/completions.d.ts +8 -0
  208. package/dist/completions.js +250 -0
  209. package/dist/completions.js.map +1 -0
  210. package/dist/compression-manager.d.ts +107 -0
  211. package/dist/compression-manager.js +250 -0
  212. package/dist/compression-manager.js.map +1 -0
  213. package/dist/config.d.ts +233 -0
  214. package/dist/config.js +255 -0
  215. package/dist/config.js.map +1 -0
  216. package/dist/context.d.ts +38 -0
  217. package/dist/context.js +86 -0
  218. package/dist/context.js.map +1 -0
  219. package/dist/cost-monitor.d.ts +72 -0
  220. package/dist/cost-monitor.js +218 -0
  221. package/dist/cost-monitor.js.map +1 -0
  222. package/dist/create-plugin.d.ts +22 -0
  223. package/dist/create-plugin.js +266 -0
  224. package/dist/create-plugin.js.map +1 -0
  225. package/dist/database.d.ts +123 -0
  226. package/dist/database.js +354 -0
  227. package/dist/database.js.map +1 -0
  228. package/dist/datadog-adapter.d.ts +60 -0
  229. package/dist/datadog-adapter.js +245 -0
  230. package/dist/datadog-adapter.js.map +1 -0
  231. package/dist/doctor.d.ts +15 -0
  232. package/dist/doctor.js +131 -0
  233. package/dist/doctor.js.map +1 -0
  234. package/dist/documentation-generator.d.ts +226 -0
  235. package/dist/documentation-generator.js +348 -0
  236. package/dist/documentation-generator.js.map +1 -0
  237. package/dist/elevation-scopes.d.ts +40 -0
  238. package/dist/elevation-scopes.js +110 -0
  239. package/dist/elevation-scopes.js.map +1 -0
  240. package/dist/elevation.d.ts +102 -0
  241. package/dist/elevation.js +449 -0
  242. package/dist/elevation.js.map +1 -0
  243. package/dist/env-diff.d.ts +27 -0
  244. package/dist/env-diff.js +104 -0
  245. package/dist/env-diff.js.map +1 -0
  246. package/dist/env-inspect.d.ts +28 -0
  247. package/dist/env-inspect.js +81 -0
  248. package/dist/env-inspect.js.map +1 -0
  249. package/dist/env-switch.d.ts +37 -0
  250. package/dist/env-switch.js +102 -0
  251. package/dist/env-switch.js.map +1 -0
  252. package/dist/environment.d.ts +27 -0
  253. package/dist/environment.js +148 -0
  254. package/dist/environment.js.map +1 -0
  255. package/dist/error-tracker.d.ts +92 -0
  256. package/dist/error-tracker.js +206 -0
  257. package/dist/error-tracker.js.map +1 -0
  258. package/dist/escalate.d.ts +11 -0
  259. package/dist/escalate.js +73 -0
  260. package/dist/escalate.js.map +1 -0
  261. package/dist/event-stream.d.ts +81 -0
  262. package/dist/event-stream.js +161 -0
  263. package/dist/event-stream.js.map +1 -0
  264. package/dist/fix.d.ts +42 -0
  265. package/dist/fix.js +419 -0
  266. package/dist/fix.js.map +1 -0
  267. package/dist/governance-middleware.d.ts +22 -0
  268. package/dist/governance-middleware.js +173 -0
  269. package/dist/governance-middleware.js.map +1 -0
  270. package/dist/governance.d.ts +44 -0
  271. package/dist/governance.js +236 -0
  272. package/dist/governance.js.map +1 -0
  273. package/dist/hooks.d.ts +25 -0
  274. package/dist/hooks.js +281 -0
  275. package/dist/hooks.js.map +1 -0
  276. package/dist/id-generator.d.ts +43 -0
  277. package/dist/id-generator.js +47 -0
  278. package/dist/id-generator.js.map +1 -0
  279. package/dist/image-optimizer.d.ts +92 -0
  280. package/dist/image-optimizer.js +202 -0
  281. package/dist/image-optimizer.js.map +1 -0
  282. package/dist/install.d.ts +15 -0
  283. package/dist/install.js +59 -0
  284. package/dist/install.js.map +1 -0
  285. package/dist/lock.d.ts +82 -0
  286. package/dist/lock.js +264 -0
  287. package/dist/lock.js.map +1 -0
  288. package/dist/login.d.ts +23 -0
  289. package/dist/login.js +132 -0
  290. package/dist/login.js.map +1 -0
  291. package/dist/mcp-kit-tools-model.d.ts +195 -0
  292. package/dist/mcp-kit-tools-model.js +6 -0
  293. package/dist/mcp-kit-tools-model.js.map +1 -0
  294. package/dist/mcp-kit-tools-service.d.ts +127 -0
  295. package/dist/mcp-kit-tools-service.js +943 -0
  296. package/dist/mcp-kit-tools-service.js.map +1 -0
  297. package/dist/mcp-orchestrator.d.ts +70 -0
  298. package/dist/mcp-orchestrator.js +175 -0
  299. package/dist/mcp-orchestrator.js.map +1 -0
  300. package/dist/mcp-server.d.ts +3 -0
  301. package/dist/mcp-server.js +722 -0
  302. package/dist/mcp-server.js.map +1 -0
  303. package/dist/middleware/rate-limiter.d.ts +74 -0
  304. package/dist/middleware/rate-limiter.js +342 -0
  305. package/dist/middleware/rate-limiter.js.map +1 -0
  306. package/dist/migration-runner.d.ts +66 -0
  307. package/dist/migration-runner.js +192 -0
  308. package/dist/migration-runner.js.map +1 -0
  309. package/dist/migrations.d.ts +25 -0
  310. package/dist/migrations.js +530 -0
  311. package/dist/migrations.js.map +1 -0
  312. package/dist/moderation-system.d.ts +153 -0
  313. package/dist/moderation-system.js +338 -0
  314. package/dist/moderation-system.js.map +1 -0
  315. package/dist/multi-agent-workflow-model.d.ts +125 -0
  316. package/dist/multi-agent-workflow-model.js +6 -0
  317. package/dist/multi-agent-workflow-model.js.map +1 -0
  318. package/dist/multi-agent-workflow-service.d.ts +102 -0
  319. package/dist/multi-agent-workflow-service.js +452 -0
  320. package/dist/multi-agent-workflow-service.js.map +1 -0
  321. package/dist/onepassword.d.ts +75 -0
  322. package/dist/onepassword.js +140 -0
  323. package/dist/onepassword.js.map +1 -0
  324. package/dist/open.d.ts +30 -0
  325. package/dist/open.js +166 -0
  326. package/dist/open.js.map +1 -0
  327. package/dist/output.d.ts +32 -0
  328. package/dist/output.js +295 -0
  329. package/dist/output.js.map +1 -0
  330. package/dist/partner-service.d.ts +101 -0
  331. package/dist/partner-service.js +191 -0
  332. package/dist/partner-service.js.map +1 -0
  333. package/dist/payout-service.d.ts +136 -0
  334. package/dist/payout-service.js +293 -0
  335. package/dist/payout-service.js.map +1 -0
  336. package/dist/pkg.d.ts +30 -0
  337. package/dist/pkg.js +162 -0
  338. package/dist/pkg.js.map +1 -0
  339. package/dist/plugin-loader.d.ts +16 -0
  340. package/dist/plugin-loader.js +124 -0
  341. package/dist/plugin-loader.js.map +1 -0
  342. package/dist/plugin-registry-model.d.ts +133 -0
  343. package/dist/plugin-registry-model.js +6 -0
  344. package/dist/plugin-registry-model.js.map +1 -0
  345. package/dist/plugin-registry-service.d.ts +109 -0
  346. package/dist/plugin-registry-service.js +361 -0
  347. package/dist/plugin-registry-service.js.map +1 -0
  348. package/dist/plugin-registry.d.ts +58 -0
  349. package/dist/plugin-registry.js +108 -0
  350. package/dist/plugin-registry.js.map +1 -0
  351. package/dist/plugin-updates.d.ts +135 -0
  352. package/dist/plugin-updates.js +326 -0
  353. package/dist/plugin-updates.js.map +1 -0
  354. package/dist/plugins-cli.d.ts +7 -0
  355. package/dist/plugins-cli.js +157 -0
  356. package/dist/plugins-cli.js.map +1 -0
  357. package/dist/plugins.d.ts +88 -0
  358. package/dist/plugins.js +251 -0
  359. package/dist/plugins.js.map +1 -0
  360. package/dist/policy.d.ts +66 -0
  361. package/dist/policy.js +160 -0
  362. package/dist/policy.js.map +1 -0
  363. package/dist/post-pull-audit.d.ts +39 -0
  364. package/dist/post-pull-audit.js +151 -0
  365. package/dist/post-pull-audit.js.map +1 -0
  366. package/dist/provision.d.ts +17 -0
  367. package/dist/provision.js +147 -0
  368. package/dist/provision.js.map +1 -0
  369. package/dist/query-optimizer.d.ts +102 -0
  370. package/dist/query-optimizer.js +199 -0
  371. package/dist/query-optimizer.js.map +1 -0
  372. package/dist/read-only-mode.d.ts +46 -0
  373. package/dist/read-only-mode.js +71 -0
  374. package/dist/read-only-mode.js.map +1 -0
  375. package/dist/redis-adapter.d.ts +71 -0
  376. package/dist/redis-adapter.js +278 -0
  377. package/dist/redis-adapter.js.map +1 -0
  378. package/dist/resilience-tests.d.ts +120 -0
  379. package/dist/resilience-tests.js +293 -0
  380. package/dist/resilience-tests.js.map +1 -0
  381. package/dist/revocation.d.ts +22 -0
  382. package/dist/revocation.js +100 -0
  383. package/dist/revocation.js.map +1 -0
  384. package/dist/run.d.ts +21 -0
  385. package/dist/run.js +80 -0
  386. package/dist/run.js.map +1 -0
  387. package/dist/scan-build.d.ts +18 -0
  388. package/dist/scan-build.js +100 -0
  389. package/dist/scan-build.js.map +1 -0
  390. package/dist/scan-plaintext.d.ts +24 -0
  391. package/dist/scan-plaintext.js +147 -0
  392. package/dist/scan-plaintext.js.map +1 -0
  393. package/dist/scan-staged.d.ts +15 -0
  394. package/dist/scan-staged.js +70 -0
  395. package/dist/scan-staged.js.map +1 -0
  396. package/dist/scan-transcripts.d.ts +23 -0
  397. package/dist/scan-transcripts.js +93 -0
  398. package/dist/scan-transcripts.js.map +1 -0
  399. package/dist/secret-backends.d.ts +50 -0
  400. package/dist/secret-backends.js +510 -0
  401. package/dist/secret-backends.js.map +1 -0
  402. package/dist/secret-expiration.d.ts +46 -0
  403. package/dist/secret-expiration.js +172 -0
  404. package/dist/secret-expiration.js.map +1 -0
  405. package/dist/secrets-migrate.d.ts +75 -0
  406. package/dist/secrets-migrate.js +185 -0
  407. package/dist/secrets-migrate.js.map +1 -0
  408. package/dist/secrets-model.d.ts +77 -0
  409. package/dist/secrets-model.js +6 -0
  410. package/dist/secrets-model.js.map +1 -0
  411. package/dist/secrets-onecli.d.ts +65 -0
  412. package/dist/secrets-onecli.js +113 -0
  413. package/dist/secrets-onecli.js.map +1 -0
  414. package/dist/secrets-propagate.d.ts +48 -0
  415. package/dist/secrets-propagate.js +201 -0
  416. package/dist/secrets-propagate.js.map +1 -0
  417. package/dist/secrets-pull.d.ts +34 -0
  418. package/dist/secrets-pull.js +118 -0
  419. package/dist/secrets-pull.js.map +1 -0
  420. package/dist/secrets-purge-history.d.ts +53 -0
  421. package/dist/secrets-purge-history.js +144 -0
  422. package/dist/secrets-purge-history.js.map +1 -0
  423. package/dist/secrets-rotate-cli.d.ts +54 -0
  424. package/dist/secrets-rotate-cli.js +438 -0
  425. package/dist/secrets-rotate-cli.js.map +1 -0
  426. package/dist/secrets-rotate.d.ts +38 -0
  427. package/dist/secrets-rotate.js +65 -0
  428. package/dist/secrets-rotate.js.map +1 -0
  429. package/dist/secrets-service.d.ts +73 -0
  430. package/dist/secrets-service.js +283 -0
  431. package/dist/secrets-service.js.map +1 -0
  432. package/dist/secrets-set.d.ts +25 -0
  433. package/dist/secrets-set.js +33 -0
  434. package/dist/secrets-set.js.map +1 -0
  435. package/dist/secrets-sync.d.ts +21 -0
  436. package/dist/secrets-sync.js +215 -0
  437. package/dist/secrets-sync.js.map +1 -0
  438. package/dist/secrets-validate.d.ts +41 -0
  439. package/dist/secrets-validate.js +126 -0
  440. package/dist/secrets-validate.js.map +1 -0
  441. package/dist/secrets-vault-migrate.d.ts +71 -0
  442. package/dist/secrets-vault-migrate.js +258 -0
  443. package/dist/secrets-vault-migrate.js.map +1 -0
  444. package/dist/secrets.d.ts +16 -0
  445. package/dist/secrets.js +72 -0
  446. package/dist/secrets.js.map +1 -0
  447. package/dist/security-hardening.d.ts +150 -0
  448. package/dist/security-hardening.js +275 -0
  449. package/dist/security-hardening.js.map +1 -0
  450. package/dist/security-policy.d.ts +89 -0
  451. package/dist/security-policy.js +174 -0
  452. package/dist/security-policy.js.map +1 -0
  453. package/dist/security-prescan.d.ts +117 -0
  454. package/dist/security-prescan.js +566 -0
  455. package/dist/security-prescan.js.map +1 -0
  456. package/dist/sentry-adapter.d.ts +49 -0
  457. package/dist/sentry-adapter.js +227 -0
  458. package/dist/sentry-adapter.js.map +1 -0
  459. package/dist/service-adapter.d.ts +94 -0
  460. package/dist/service-adapter.js +162 -0
  461. package/dist/service-adapter.js.map +1 -0
  462. package/dist/skills.d.ts +13 -0
  463. package/dist/skills.js +17 -0
  464. package/dist/skills.js.map +1 -0
  465. package/dist/sla-monitor.d.ts +107 -0
  466. package/dist/sla-monitor.js +233 -0
  467. package/dist/sla-monitor.js.map +1 -0
  468. package/dist/stack-detector.d.ts +12 -0
  469. package/dist/stack-detector.js +251 -0
  470. package/dist/stack-detector.js.map +1 -0
  471. package/dist/team-model.d.ts +58 -0
  472. package/dist/team-model.js +83 -0
  473. package/dist/team-model.js.map +1 -0
  474. package/dist/team-service.d.ts +54 -0
  475. package/dist/team-service.js +206 -0
  476. package/dist/team-service.js.map +1 -0
  477. package/dist/toml-generator.d.ts +8 -0
  478. package/dist/toml-generator.js +223 -0
  479. package/dist/toml-generator.js.map +1 -0
  480. package/dist/triage-sandbox.d.ts +34 -0
  481. package/dist/triage-sandbox.js +167 -0
  482. package/dist/triage-sandbox.js.map +1 -0
  483. package/dist/triage.d.ts +30 -0
  484. package/dist/triage.js +79 -0
  485. package/dist/triage.js.map +1 -0
  486. package/dist/update-check.d.ts +13 -0
  487. package/dist/update-check.js +91 -0
  488. package/dist/update-check.js.map +1 -0
  489. package/dist/utils/colors.d.ts +14 -0
  490. package/dist/utils/colors.js +15 -0
  491. package/dist/utils/colors.js.map +1 -0
  492. package/dist/utils/didYouMean.d.ts +15 -0
  493. package/dist/utils/didYouMean.js +47 -0
  494. package/dist/utils/didYouMean.js.map +1 -0
  495. package/dist/utils/exec.d.ts +21 -0
  496. package/dist/utils/exec.js +23 -0
  497. package/dist/utils/exec.js.map +1 -0
  498. package/dist/utils/execFileNoThrow.d.ts +14 -0
  499. package/dist/utils/execFileNoThrow.js +29 -0
  500. package/dist/utils/execFileNoThrow.js.map +1 -0
  501. package/dist/utils/flags.d.ts +19 -0
  502. package/dist/utils/flags.js +36 -0
  503. package/dist/utils/flags.js.map +1 -0
  504. package/dist/utils/parseCommand.d.ts +16 -0
  505. package/dist/utils/parseCommand.js +13 -0
  506. package/dist/utils/parseCommand.js.map +1 -0
  507. package/dist/utils/prompt.d.ts +13 -0
  508. package/dist/utils/prompt.js +35 -0
  509. package/dist/utils/prompt.js.map +1 -0
  510. package/dist/utils/promptSelect.d.ts +19 -0
  511. package/dist/utils/promptSelect.js +89 -0
  512. package/dist/utils/promptSelect.js.map +1 -0
  513. package/dist/utils/redactSecrets.d.ts +24 -0
  514. package/dist/utils/redactSecrets.js +134 -0
  515. package/dist/utils/redactSecrets.js.map +1 -0
  516. package/dist/validation/dynamic-schema.d.ts +29 -0
  517. package/dist/validation/dynamic-schema.js +76 -0
  518. package/dist/validation/dynamic-schema.js.map +1 -0
  519. package/package.json +52 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Destructive git-history secret scrubbing — opt-in only.
3
+ *
4
+ * When a credential lands in a committed file the next thing to do is
5
+ * rotate it; the value in `git log` keeps leaking until the history is
6
+ * rewritten. This module wraps `git filter-repo` (preferred) or `bfg-repo-
7
+ * cleaner` (fallback) to remove the value from every commit in the repo.
8
+ *
9
+ * **Destructive**: rewrites every commit hash from the first affected commit
10
+ * forward, force-pushing is required afterwards, and every existing clone
11
+ * (including CI runners, teammates' laptops, deploy pipelines that fork
12
+ * from the same remote) must re-clone — pulling won't catch up cleanly.
13
+ *
14
+ * For this reason the CLI surface always requires:
15
+ * 1. A live elevation marker (from `kit auth elevate`)
16
+ * 2. An explicit `--force-history` flag — no auto-run, no default
17
+ * 3. Confirmation prompt with the full impact spelled out, unless
18
+ * `--yes` is set (CI escape hatch; still requires elevation)
19
+ */
20
+ import { writeFile, mkdtemp, rm } from "node:fs/promises";
21
+ import { tmpdir } from "node:os";
22
+ import { join } from "node:path";
23
+ import { exec } from "./utils/exec.js";
24
+ export async function detectTools() {
25
+ let filterRepoAvailable = false;
26
+ let bfgAvailable = false;
27
+ try {
28
+ await exec("git", ["filter-repo", "--version"], { timeout: 3_000 });
29
+ filterRepoAvailable = true;
30
+ }
31
+ catch {
32
+ /* not installed */
33
+ }
34
+ try {
35
+ await exec("bfg", ["--version"], { timeout: 3_000 });
36
+ bfgAvailable = true;
37
+ }
38
+ catch {
39
+ /* not installed */
40
+ }
41
+ return { filterRepoAvailable, bfgAvailable };
42
+ }
43
+ /**
44
+ * Reports how many commits in the current branch's history reference the
45
+ * pattern. Useful for showing impact before the destructive step.
46
+ */
47
+ export async function previewMatches(pattern, cwd = process.cwd()) {
48
+ const { stdout: hashesOut } = await exec("git", ["log", "--pretty=%H", "-S", pattern, "--all"], { cwd, timeout: 30_000, maxBuffer: 10 * 1024 * 1024 }).catch(() => ({ stdout: "" }));
49
+ const hashes = hashesOut.split("\n").filter(Boolean);
50
+ const fileSet = new Set();
51
+ if (hashes.length > 0) {
52
+ // For the first up-to-10 matching commits, extract the changed files
53
+ // that mentioned the pattern so the user knows what got touched.
54
+ for (const h of hashes.slice(0, 10)) {
55
+ try {
56
+ const { stdout } = await exec("git", ["log", "-1", "--name-only", "--pretty=", "-S", pattern, h], { cwd, timeout: 10_000 });
57
+ for (const f of stdout.split("\n").filter(Boolean))
58
+ fileSet.add(f);
59
+ }
60
+ catch {
61
+ /* skip */
62
+ }
63
+ }
64
+ }
65
+ return {
66
+ pattern,
67
+ matchedCommits: hashes.length,
68
+ matchedFiles: [...fileSet],
69
+ sampleHashes: hashes.slice(0, 5),
70
+ };
71
+ }
72
+ /**
73
+ * Runs `git filter-repo --replace-text <file>` where the replacement file
74
+ * contains one regex per line in `pattern==>***REDACTED***` syntax. Falls
75
+ * back to `bfg --replace-text` when filter-repo is missing. The replacement
76
+ * file is created in a tempdir and removed after the run.
77
+ *
78
+ * Caller is responsible for:
79
+ * - confirming the destructive action with the user
80
+ * - holding a fresh elevation marker
81
+ * - communicating "force-push + re-clone for everyone" afterwards
82
+ */
83
+ export async function purgeHistory(patterns, cwd = process.cwd()) {
84
+ if (patterns.length === 0) {
85
+ return {
86
+ toolUsed: "git-filter-repo",
87
+ ok: false,
88
+ detail: "no patterns provided",
89
+ };
90
+ }
91
+ const tools = await detectTools();
92
+ const dir = await mkdtemp(join(tmpdir(), "kit-purge-"));
93
+ try {
94
+ const replacementFile = join(dir, "replacements.txt");
95
+ // git filter-repo replace-text format: `literal==>REPLACEMENT` or
96
+ // `regex:<pattern>==>REPLACEMENT`. We default to literal for safety.
97
+ await writeFile(replacementFile, patterns.map((p) => `${p}==>***REMOVED***`).join("\n") + "\n", "utf-8");
98
+ if (tools.filterRepoAvailable) {
99
+ try {
100
+ const { stdout } = await exec("git", ["filter-repo", "--replace-text", replacementFile, "--force"], { cwd, timeout: 600_000, maxBuffer: 50 * 1024 * 1024 });
101
+ return {
102
+ toolUsed: "git-filter-repo",
103
+ ok: true,
104
+ detail: stdout.split("\n").slice(-3).join(" ").trim() || "history rewritten",
105
+ };
106
+ }
107
+ catch (err) {
108
+ return {
109
+ toolUsed: "git-filter-repo",
110
+ ok: false,
111
+ detail: err instanceof Error ? err.message.split("\n")[0] : String(err),
112
+ };
113
+ }
114
+ }
115
+ if (tools.bfgAvailable) {
116
+ try {
117
+ const { stdout } = await exec("bfg", ["--replace-text", replacementFile, cwd], { cwd, timeout: 600_000, maxBuffer: 50 * 1024 * 1024 });
118
+ // bfg leaves dangling refs; user must run `git reflog expire --expire=now --all && git gc --prune=now --aggressive`.
119
+ return {
120
+ toolUsed: "bfg",
121
+ ok: true,
122
+ detail: `${stdout.split("\n").length} lines emitted; run \`git reflog expire --expire=now --all && git gc --prune=now --aggressive\` next`,
123
+ };
124
+ }
125
+ catch (err) {
126
+ return {
127
+ toolUsed: "bfg",
128
+ ok: false,
129
+ detail: err instanceof Error ? err.message.split("\n")[0] : String(err),
130
+ };
131
+ }
132
+ }
133
+ return {
134
+ toolUsed: "git-filter-repo",
135
+ ok: false,
136
+ detail: "Neither `git filter-repo` nor `bfg` is installed. Install one: " +
137
+ "`pip install git-filter-repo` or `brew install bfg`.",
138
+ };
139
+ }
140
+ finally {
141
+ await rm(dir, { recursive: true, force: true });
142
+ }
143
+ }
144
+ //# sourceMappingURL=secrets-purge-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-purge-history.js","sourceRoot":"","sources":["../src/secrets-purge-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Service-native rotation playbooks.
3
+ *
4
+ * Full automation (kit calls provider admin API → new key minted →
5
+ * old key revoked) varies per provider and needs admin-tier credentials
6
+ * (Stripe API platform key, AWS IAM root, GCP project owner). kit's
7
+ * MVP gives a *guided* path instead:
8
+ *
9
+ * 1. Identify the provider from the key name + heuristic
10
+ * 2. Print the exact CLI commands to mint + revoke
11
+ * 3. Accept the new value back (`--value` after the user runs them)
12
+ * 4. Let the existing `kit secrets rotate` flow do the vault-write
13
+ * + propagation
14
+ *
15
+ * The output is precise enough that an agent (with elevation) can pipe it
16
+ * to its own subprocess if it has the right credentials.
17
+ */
18
+ export interface RotationPlaybook {
19
+ provider: "stripe" | "aws-iam" | "gcp-iam" | "github-pat" | "openai" | "unknown";
20
+ /** Step-by-step commands the user (or an authorized agent) should run. */
21
+ steps: string[];
22
+ /** Where to read the resulting new value back from. */
23
+ newValueSource: string;
24
+ /** Notes on rollback / revoke-old flow. */
25
+ revokeStep?: string;
26
+ /** Documentation link for the provider's official rotation flow. */
27
+ docsUrl?: string;
28
+ }
29
+ export declare function identifyProvider(keyName: string): RotationPlaybook["provider"];
30
+ export declare function buildPlaybook(keyName: string): RotationPlaybook;
31
+ /**
32
+ * `kit secrets rotate` CLI orchestration — extracted from cli.ts
33
+ * (codebase-review follow-up). cmdSecretsRotate is the dispatch entry;
34
+ * cmdSecretsRotateSupabaseMgmt handles the fully-automated Supabase
35
+ * Mgmt-API path; pickBackendOpts maps .kit.toml key-config to
36
+ * backend-write options.
37
+ */
38
+ export declare function pickBackendOpts(secrets: {
39
+ keys?: Record<string, {
40
+ ref?: string;
41
+ azure_vault?: string;
42
+ gcp_project?: string;
43
+ aws_region?: string;
44
+ vault_path?: string;
45
+ }>;
46
+ }, keyName: string, { envFallback }?: {
47
+ envFallback?: boolean;
48
+ }): {
49
+ vault?: string;
50
+ project?: string;
51
+ region?: string;
52
+ vaultPath?: string;
53
+ };
54
+ export declare function cmdSecretsRotate(): Promise<boolean>;
@@ -0,0 +1,438 @@
1
+ /**
2
+ * Service-native rotation playbooks.
3
+ *
4
+ * Full automation (kit calls provider admin API → new key minted →
5
+ * old key revoked) varies per provider and needs admin-tier credentials
6
+ * (Stripe API platform key, AWS IAM root, GCP project owner). kit's
7
+ * MVP gives a *guided* path instead:
8
+ *
9
+ * 1. Identify the provider from the key name + heuristic
10
+ * 2. Print the exact CLI commands to mint + revoke
11
+ * 3. Accept the new value back (`--value` after the user runs them)
12
+ * 4. Let the existing `kit secrets rotate` flow do the vault-write
13
+ * + propagation
14
+ *
15
+ * The output is precise enough that an agent (with elevation) can pipe it
16
+ * to its own subprocess if it has the right credentials.
17
+ */
18
+ export function identifyProvider(keyName) {
19
+ const upper = keyName.toUpperCase();
20
+ if (upper.startsWith("STRIPE_"))
21
+ return "stripe";
22
+ if (upper.startsWith("AWS_") || upper === "AWS_ACCESS_KEY_ID" || upper === "AWS_SECRET_ACCESS_KEY")
23
+ return "aws-iam";
24
+ if (upper.startsWith("GCP_") || upper.endsWith("_GOOGLE_APPLICATION_CREDENTIALS"))
25
+ return "gcp-iam";
26
+ if (upper.startsWith("GITHUB_") || upper === "GH_TOKEN")
27
+ return "github-pat";
28
+ if (upper.startsWith("OPENAI_"))
29
+ return "openai";
30
+ return "unknown";
31
+ }
32
+ export function buildPlaybook(keyName) {
33
+ const provider = identifyProvider(keyName);
34
+ switch (provider) {
35
+ case "stripe":
36
+ return {
37
+ provider,
38
+ steps: [
39
+ "# Use Stripe Dashboard or API to roll a restricted key:",
40
+ "# https://dashboard.stripe.com/apikeys",
41
+ "# Programmatic (requires platform/account API key):",
42
+ "stripe api_keys create --restricted --description 'kit-rotated $(date +%FT%T)' --livemode false",
43
+ "# Capture the returned 'secret' field; that is the new value.",
44
+ ],
45
+ newValueSource: "Stripe API response.secret",
46
+ revokeStep: "stripe api_keys revoke <old-key-id> # after smoke-test confirms the new key works",
47
+ docsUrl: "https://docs.stripe.com/keys-best-practices",
48
+ };
49
+ case "aws-iam":
50
+ return {
51
+ provider,
52
+ steps: [
53
+ "# Mint a fresh access-key pair for the same IAM user/role.",
54
+ "# Requires IAM permission iam:CreateAccessKey on the target user.",
55
+ "aws iam create-access-key --user-name <iam-user>",
56
+ "# Read AccessKeyId + SecretAccessKey from the response and feed them",
57
+ "# back into kit as a pair.",
58
+ ],
59
+ newValueSource: "aws iam create-access-key output",
60
+ revokeStep: "aws iam update-access-key --access-key-id <old-id> --status Inactive\naws iam delete-access-key --access-key-id <old-id>",
61
+ docsUrl: "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html",
62
+ };
63
+ case "gcp-iam":
64
+ return {
65
+ provider,
66
+ steps: [
67
+ "# Create a new service-account key (RSA JSON or P12).",
68
+ "gcloud iam service-accounts keys create new-key.json --iam-account=<sa-email>",
69
+ "# Capture the contents of new-key.json (or just the private_key field).",
70
+ ],
71
+ newValueSource: "contents of new-key.json",
72
+ revokeStep: "gcloud iam service-accounts keys delete <old-key-id> --iam-account=<sa-email>",
73
+ docsUrl: "https://cloud.google.com/iam/docs/keys-create-delete",
74
+ };
75
+ case "github-pat":
76
+ return {
77
+ provider,
78
+ steps: [
79
+ "# GitHub doesn't expose PAT creation via an API today; rotate via UI:",
80
+ "# https://github.com/settings/tokens",
81
+ "# Create a new fine-grained PAT with the same scopes/expiry as the",
82
+ "# one you're replacing.",
83
+ ],
84
+ newValueSource: "GitHub settings UI",
85
+ revokeStep: "Revoke the old PAT in the same UI (Delete button beside the entry).",
86
+ docsUrl: "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens",
87
+ };
88
+ case "openai":
89
+ return {
90
+ provider,
91
+ steps: [
92
+ "# OpenAI keys are dashboard-managed; create a fresh one via:",
93
+ "# https://platform.openai.com/api-keys",
94
+ "# Optional: pin a per-key spend cap when you create it.",
95
+ ],
96
+ newValueSource: "OpenAI dashboard 'Create new secret key' modal",
97
+ revokeStep: "Revoke the old key in the same dashboard.",
98
+ docsUrl: "https://platform.openai.com/docs/guides/production-best-practices/api-keys",
99
+ };
100
+ case "unknown":
101
+ return {
102
+ provider,
103
+ steps: [
104
+ "# kit doesn't have a service-native playbook for this key.",
105
+ "# Falling back to opaque rotation: --random generates a fresh",
106
+ "# token, but the provider may reject anything but their own format.",
107
+ ],
108
+ newValueSource: "manual / provider-specific",
109
+ };
110
+ }
111
+ }
112
+ import { loadConfig } from "./config.js";
113
+ import { resolve } from "node:path";
114
+ import { isNonInteractive } from "./environment.js";
115
+ import { writeSecretToBackend } from "./secrets-migrate.js";
116
+ import { planRotation } from "./secrets-rotate.js";
117
+ import { requireElevation, consumeElevation } from "./elevation.js";
118
+ import { propagate, parseTargets, ALL_TARGETS } from "./secrets-propagate.js";
119
+ import { promptConfirm } from "./utils/prompt.js";
120
+ import { c } from "./utils/colors.js";
121
+ function resolveConfigPath() {
122
+ return resolve(process.cwd(), ".kit.toml");
123
+ }
124
+ /**
125
+ * `kit secrets rotate` CLI orchestration — extracted from cli.ts
126
+ * (codebase-review follow-up). cmdSecretsRotate is the dispatch entry;
127
+ * cmdSecretsRotateSupabaseMgmt handles the fully-automated Supabase
128
+ * Mgmt-API path; pickBackendOpts maps .kit.toml key-config to
129
+ * backend-write options.
130
+ */
131
+ export function pickBackendOpts(secrets, keyName, { envFallback = false } = {}) {
132
+ const opts = {};
133
+ const key = secrets.keys?.[keyName] ?? Object.values(secrets.keys ?? {})[0];
134
+ if (key?.ref) {
135
+ const m = key.ref.match(/^op:\/\/([^/]+)\/([^/]+)\//);
136
+ if (m) {
137
+ opts.vault = m[1];
138
+ opts.project = m[2];
139
+ }
140
+ }
141
+ // envFallback (migrate/rotate flows): fall back to the platform's standard env
142
+ // vars when the .kit.toml key doesn't pin a value. Never clobber a value
143
+ // already derived from the 1Password ref above.
144
+ if (key?.azure_vault)
145
+ opts.vault = key.azure_vault;
146
+ else if (envFallback && !opts.vault && process.env.AZURE_KEYVAULT_NAME)
147
+ opts.vault = process.env.AZURE_KEYVAULT_NAME;
148
+ if (key?.gcp_project)
149
+ opts.project = key.gcp_project;
150
+ else if (envFallback && !opts.project && (process.env.GCP_PROJECT || process.env.GOOGLE_CLOUD_PROJECT))
151
+ opts.project = process.env.GCP_PROJECT || process.env.GOOGLE_CLOUD_PROJECT;
152
+ if (key?.aws_region)
153
+ opts.region = key.aws_region;
154
+ else if (envFallback && process.env.AWS_REGION)
155
+ opts.region = process.env.AWS_REGION;
156
+ if (key?.vault_path)
157
+ opts.vaultPath = key.vault_path;
158
+ return opts;
159
+ }
160
+ async function cmdSecretsRotateSupabaseMgmt(keyName, args) {
161
+ console.log(`${c.bold}${c.cyan}kit secrets rotate --via supabase-mgmt-api${c.reset}`);
162
+ console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
163
+ // Project ref: --project <ref> flag or SUPABASE_PROJECT_REF env var.
164
+ const projectIdx = args.indexOf("--project");
165
+ const projectRef = projectIdx >= 0 ? args[projectIdx + 1] : process.env.SUPABASE_PROJECT_REF;
166
+ if (!projectRef) {
167
+ console.error(`${c.red}--project <ref> required (or set SUPABASE_PROJECT_REF).${c.reset}`);
168
+ console.error(`${c.dim}Find your project ref at https://supabase.com/dashboard/project/_/settings/general (URL contains the ref).${c.reset}`);
169
+ return false;
170
+ }
171
+ // Rotation mode: explicit --mode, otherwise auto-detect from project state.
172
+ const modeIdx = args.indexOf("--mode");
173
+ let mode = modeIdx >= 0 ? args[modeIdx + 1] : undefined;
174
+ if (mode !== undefined && mode !== "scoped-key-mint" && mode !== "jwt-secret-roll") {
175
+ console.error(`${c.red}Invalid --mode "${mode}" — use "scoped-key-mint" or "jwt-secret-roll".${c.reset}`);
176
+ return false;
177
+ }
178
+ const explicitMode = mode !== undefined;
179
+ const dryRun = args.includes("--dry-run");
180
+ const force = args.includes("--force");
181
+ // Lazy-import the workspace plugin so kit core boots fine without it.
182
+ const supabase = await import("sandstream-kit-plugin-supabase").catch(() => null);
183
+ if (!supabase) {
184
+ console.error(`${c.red}sandstream-kit-plugin-supabase not installed. Run ${c.bold}npm install sandstream-kit-plugin-supabase${c.reset}${c.red} or build the workspace.${c.reset}`);
185
+ return false;
186
+ }
187
+ // Preview pass — confirms the PAT works AND detects which mode is
188
+ // compatible. Today's incident was caused by minting a scoped key in a
189
+ // project that PostgREST still treats as JWT-only.
190
+ const preview = await supabase.previewSupabaseRotation({ projectRef });
191
+ if (!preview.ok) {
192
+ console.error(`${c.red}✗ Supabase Management API: ${preview.error}${c.reset}`);
193
+ return false;
194
+ }
195
+ console.log(`${c.dim}PAT verified. Project has ${preview.existingKeyCount} API key(s).${c.reset}`);
196
+ if (preview.keyMode) {
197
+ console.log(`${c.dim}Key mode: scoped=${preview.keyMode.supportsScopedKeys}, legacy-jwt=${preview.keyMode.supportsLegacyJwt}${c.reset}`);
198
+ }
199
+ // Default to the recommended mode when the user didn't pin one.
200
+ if (!mode) {
201
+ mode = (preview.recommendedMode ?? "scoped-key-mint");
202
+ }
203
+ console.log(`${c.dim}Mode: ${c.bold}${mode}${c.reset}${c.dim}${explicitMode ? "" : " (auto)"}${c.reset}`);
204
+ // If the explicit mode conflicts with what the project supports, warn
205
+ // loudly and require --force. This is the gate that would have prevented
206
+ // the 2026-06-03 prod break.
207
+ if (explicitMode &&
208
+ preview.keyMode &&
209
+ mode === "scoped-key-mint" &&
210
+ !preview.keyMode.supportsScopedKeys &&
211
+ preview.keyMode.supportsLegacyJwt) {
212
+ console.error(`${c.red}✗ Refusing scoped-key-mint: project still uses legacy JWT keys.${c.reset}`);
213
+ console.error(`${c.dim}A scoped key minted now would be treated as anon by PostgREST and break every service_role call.${c.reset}`);
214
+ console.error(`${c.dim}Recommended: ${c.bold}--mode jwt-secret-roll${c.reset}${c.dim} (invalidates all tokens) or migrate the project to scoped keys first.${c.reset}`);
215
+ if (!force) {
216
+ console.error(`${c.dim}Override with ${c.bold}--force${c.reset}${c.dim} if you know what you're doing.${c.reset}\n`);
217
+ return false;
218
+ }
219
+ console.error(`${c.yellow}--force set; proceeding with scoped-key-mint despite incompatibility.${c.reset}\n`);
220
+ }
221
+ if (preview.warning && !explicitMode) {
222
+ console.log(`${c.yellow}⚠ ${preview.warning}${c.reset}`);
223
+ }
224
+ if (mode === "jwt-secret-roll") {
225
+ console.warn(`${c.yellow}⚠ jwt-secret-roll invalidates EVERY existing token (anon, service_role, signed URLs, active sessions).${c.reset}`);
226
+ }
227
+ console.log();
228
+ if (dryRun) {
229
+ console.log(`${c.dim}--dry-run: not rotating. Remove flag to proceed.${c.reset}\n`);
230
+ return true;
231
+ }
232
+ // S12 elevation required for rotation. jwt-secret-roll is a hard cutover
233
+ // — one elevation = one rotation. Other modes (scoped-key-mint with
234
+ // rollback) keep the standard 15-min TTL.
235
+ const elev = mode === "jwt-secret-roll"
236
+ ? await consumeElevation("rotate")
237
+ : await requireElevation("rotate");
238
+ if (!elev.ok) {
239
+ console.error(`${c.red}✗ ${elev.reason}${c.reset}`);
240
+ return false;
241
+ }
242
+ // Interactive confirmation for jwt-secret-roll (destructive); a YES prompt
243
+ // for scoped-key-mint is enough since old tokens stay live.
244
+ if (!isNonInteractive()) {
245
+ const confirmMsg = mode === "jwt-secret-roll"
246
+ ? `Confirm jwt-secret-roll (HARD CUTOVER) [y/N, auto-no in 15s]: `
247
+ : `Mint new scoped key? [Y/n, auto-yes in 10s]: `;
248
+ // jwt-secret-roll is an irreversible HARD CUTOVER and its prompt promises
249
+ // "auto-no" — fail closed on walk-away/pipe. Scoped-key mint is additive → auto-yes.
250
+ const ok = await promptConfirm(confirmMsg, mode === "jwt-secret-roll" ? 15_000 : 10_000, mode !== "jwt-secret-roll");
251
+ if (!ok && mode === "jwt-secret-roll") {
252
+ console.log(`${c.dim}Aborted.${c.reset}`);
253
+ return false;
254
+ }
255
+ }
256
+ const outcome = await supabase.rotateSupabaseKey({ projectRef, mode });
257
+ if (!outcome.ok || !outcome.result) {
258
+ console.error(`${c.red}✗ ${outcome.error ?? "rotation failed"}${c.reset}`);
259
+ return false;
260
+ }
261
+ const newValue = outcome.result.newKey ?? outcome.result.newJwtSecret;
262
+ if (!newValue) {
263
+ console.error(`${c.red}✗ Rotation completed but no key was returned in the response. Check the Supabase Dashboard.${c.reset}`);
264
+ return false;
265
+ }
266
+ console.log(` ${c.green}✓${c.reset} ${mode} succeeded. ${c.dim}new value is ${newValue.length} chars${c.reset}`);
267
+ // Wire through the existing vault-write path so the new value lands in
268
+ // the configured upstream vault and the placeholder logic stays consistent.
269
+ const config = await loadConfig(resolveConfigPath());
270
+ if (!config.secrets?.store || config.secrets.store === "env") {
271
+ console.warn(`${c.yellow}⚠ No upstream vault configured. New value printed once below — copy it now.${c.reset}\n`);
272
+ console.log(`${newValue}\n`);
273
+ return true;
274
+ }
275
+ const writeResult = await writeSecretToBackend(config.secrets.store, keyName, newValue, pickBackendOpts(config.secrets, keyName));
276
+ if (!writeResult.ok) {
277
+ console.error(`${c.red}✗ vault write failed: ${writeResult.detail}${c.reset}`);
278
+ console.error(`${c.yellow}New value (copy now — it won't be shown again):${c.reset}\n${newValue}\n`);
279
+ return false;
280
+ }
281
+ console.log(` ${c.green}✓${c.reset} wrote to vault (${config.secrets.store})`);
282
+ console.log(`\n${c.dim}Next: re-run with ${c.bold}--propagate vercel,github${c.reset}${c.dim} to push to deploy targets.${c.reset}\n`);
283
+ return true;
284
+ }
285
+ export async function cmdSecretsRotate() {
286
+ console.log(`${c.bold}${c.cyan}kit secrets rotate${c.reset}`);
287
+ console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
288
+ const args = process.argv.slice(4);
289
+ const keyName = args[0];
290
+ if (!keyName || keyName.startsWith("--")) {
291
+ console.error(`${c.red}Usage: kit secrets rotate <KEY> [--value <new>] [--random [N]] [--dry-run]${c.reset}`);
292
+ return false;
293
+ }
294
+ const valueIdx = args.indexOf("--value");
295
+ const explicitValue = valueIdx >= 0 ? args[valueIdx + 1] : undefined;
296
+ const randomIdx = args.indexOf("--random");
297
+ let randomFlag;
298
+ if (randomIdx >= 0) {
299
+ const next = args[randomIdx + 1];
300
+ if (next && /^\d+$/.test(next)) {
301
+ randomFlag = Number.parseInt(next, 10);
302
+ }
303
+ else {
304
+ randomFlag = true;
305
+ }
306
+ }
307
+ const dryRun = args.includes("--dry-run");
308
+ const fromCli = args.includes("--from-cli");
309
+ const viaIdx = args.indexOf("--via");
310
+ const via = viaIdx >= 0 ? args[viaIdx + 1] : undefined;
311
+ // ── Supabase Management API rotation ─────────────────────────────────────
312
+ if (via === "supabase-mgmt-api") {
313
+ return await cmdSecretsRotateSupabaseMgmt(keyName, args);
314
+ }
315
+ // ── R3: service-native playbook ──────────────────────────────────────────
316
+ // When --from-cli is set, print the provider-specific rotation steps
317
+ // BEFORE asking for --value. Useful as a guided workflow: the user
318
+ // (or an authorized agent) runs the provider CLI, copies the new
319
+ // value, then re-runs `kit secrets rotate <KEY> --value <new>`.
320
+ if (fromCli) {
321
+ const playbook = buildPlaybook(keyName);
322
+ console.log(`${c.bold}${c.cyan}kit secrets rotate --from-cli${c.reset}`);
323
+ console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
324
+ console.log(`${c.bold}Provider:${c.reset} ${c.bold}${playbook.provider}${c.reset} ${c.dim}(detected from key name)${c.reset}\n`);
325
+ console.log(`${c.bold}Steps to mint the new credential:${c.reset}`);
326
+ for (const step of playbook.steps) {
327
+ const isComment = step.startsWith("#");
328
+ console.log(isComment
329
+ ? ` ${c.dim}${step}${c.reset}`
330
+ : ` ${c.green}$${c.reset} ${step}`);
331
+ }
332
+ console.log();
333
+ console.log(`${c.bold}New value source:${c.reset} ${c.dim}${playbook.newValueSource}${c.reset}`);
334
+ if (playbook.revokeStep) {
335
+ console.log(`${c.bold}Revoke the old key (after smoke-test):${c.reset}`);
336
+ for (const line of playbook.revokeStep.split("\n")) {
337
+ console.log(` ${c.yellow}$${c.reset} ${line}`);
338
+ }
339
+ }
340
+ if (playbook.docsUrl) {
341
+ console.log(`${c.dim}Docs: ${playbook.docsUrl}${c.reset}`);
342
+ }
343
+ console.log();
344
+ console.log(`${c.dim}When you have the new value, re-run: ${c.bold}kit secrets rotate ${keyName} --value <new>${c.reset}${c.dim} (or pipe it with --value file:///path).${c.reset}\n`);
345
+ return true;
346
+ }
347
+ const config = await loadConfig(resolveConfigPath());
348
+ if (!config.secrets?.store || config.secrets.store === "env") {
349
+ console.error(`${c.red}No vault configured in .kit.toml — set ${c.bold}[secrets].store${c.reset}${c.red} first.${c.reset}`);
350
+ return false;
351
+ }
352
+ const result = planRotation(keyName, config.secrets, {
353
+ value: explicitValue,
354
+ random: randomFlag,
355
+ });
356
+ if ("error" in result) {
357
+ console.error(`${c.red}${result.error}${c.reset}`);
358
+ return false;
359
+ }
360
+ const { plan, value } = result;
361
+ console.log(`${c.bold}Plan${c.reset} ${c.dim}rotate ${plan.key} → ${plan.store} (source: ${plan.source}, ${plan.newValueLength} chars)${c.reset}\n`);
362
+ if (dryRun) {
363
+ console.log(`${c.dim}--dry-run: not writing. Remove flag to perform rotation.${c.reset}\n`);
364
+ return true;
365
+ }
366
+ // S12: gate destructive op behind explicit elevation.
367
+ const elev = await requireElevation("rotate");
368
+ if (!elev.ok) {
369
+ console.error(`${c.red}✗ ${elev.reason}${c.reset}`);
370
+ return false;
371
+ }
372
+ // Build the same backend-options the migrate flow uses so we land in the
373
+ // right vault / region / project / Azure vault.
374
+ const backendOpts = pickBackendOpts(config.secrets, keyName, { envFallback: true });
375
+ const writeResult = await writeSecretToBackend(plan.store, plan.key, value, backendOpts);
376
+ if (!writeResult.ok) {
377
+ console.error(`${c.red}✗ ${writeResult.detail}${c.reset}`);
378
+ return false;
379
+ }
380
+ console.log(` ${c.green}✓${c.reset} ${writeResult.detail}\n`);
381
+ // ── R2: propagate to deploy platforms ────────────────────────────────────
382
+ const propagateIdx = args.indexOf("--propagate");
383
+ if (propagateIdx >= 0) {
384
+ const spec = args[propagateIdx + 1];
385
+ const targets = spec ? parseTargets(spec) : [];
386
+ if (targets.length === 0) {
387
+ console.error(`${c.red}--propagate requires comma list. Valid: ${ALL_TARGETS.join(", ")}${c.reset}`);
388
+ return false;
389
+ }
390
+ const propOpts = {};
391
+ const envIdx = args.indexOf("--target-env");
392
+ if (envIdx >= 0)
393
+ propOpts.env = args[envIdx + 1];
394
+ const flyAppIdx = args.indexOf("--fly-app");
395
+ if (flyAppIdx >= 0)
396
+ propOpts.flyApp = args[flyAppIdx + 1];
397
+ const cfWorkerIdx = args.indexOf("--cf-worker");
398
+ if (cfWorkerIdx >= 0)
399
+ propOpts.cfWorker = args[cfWorkerIdx + 1];
400
+ const railwayServiceIdx = args.indexOf("--railway-service");
401
+ if (railwayServiceIdx >= 0)
402
+ propOpts.railwayService = args[railwayServiceIdx + 1];
403
+ const awsRegionIdx = args.indexOf("--aws-region");
404
+ if (awsRegionIdx >= 0)
405
+ propOpts.awsRegion = args[awsRegionIdx + 1];
406
+ const ghRepoIdx = args.indexOf("--github-repo");
407
+ if (ghRepoIdx >= 0)
408
+ propOpts.githubRepo = args[ghRepoIdx + 1];
409
+ const vercelScopeIdx = args.indexOf("--vercel-scope");
410
+ if (vercelScopeIdx >= 0)
411
+ propOpts.vercelScope = args[vercelScopeIdx + 1];
412
+ console.log(`${c.bold}Propagation${c.reset} ${c.dim}→ ${targets.join(", ")}${c.reset}\n`);
413
+ const results = await propagate(plan.key, value, targets, propOpts);
414
+ let propAllOk = true;
415
+ for (const r of results) {
416
+ const icon = r.ok ? `${c.green}✓${c.reset}` : `${c.red}✗${c.reset}`;
417
+ const argvWarn = r.valueInArgv ? ` ${c.yellow}[value in argv]${c.reset}` : "";
418
+ console.log(` ${icon} ${r.target.padEnd(10)} ${c.dim}${r.detail}${c.reset}${argvWarn}`);
419
+ if (!r.ok)
420
+ propAllOk = false;
421
+ }
422
+ console.log();
423
+ if (!propAllOk) {
424
+ console.log(`${c.yellow}Some propagations failed — check CLI auth (vercel/gh/fly/wrangler/railway/aws) and retry with the same value.${c.reset}\n`);
425
+ }
426
+ }
427
+ else {
428
+ console.log(`${c.bold}Next steps${c.reset}`);
429
+ console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
430
+ for (const target of plan.externalTargets) {
431
+ console.log(` ${c.yellow}→${c.reset} update ${target}`);
432
+ }
433
+ console.log();
434
+ console.log(`${c.dim}Or re-run with ${c.bold}--propagate vercel,github,fly,cloudflare,railway,aws-ssm${c.reset}${c.dim} to push automatically.${c.reset}\n`);
435
+ }
436
+ return true;
437
+ }
438
+ //# sourceMappingURL=secrets-rotate-cli.js.map