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,18 @@
1
+ import { type SecretFinding } from "./utils/redactSecrets.js";
2
+ /**
3
+ * Walks built-artifact directories looking for leaked credentials. The
4
+ * typical failure mode this catches is a Next.js `NEXT_PUBLIC_` typo that
5
+ * silently inlines a server-only secret into the client bundle.
6
+ *
7
+ * Intentionally narrow in scope:
8
+ * - only known build-output dirs (no full-repo walk — that's what
9
+ * scanStagedFiles + checkSecretsInCode do)
10
+ * - skips obvious binary extensions
11
+ * - bounded per-file read at 5 MiB so a giant minified blob doesn't
12
+ * stall the scan
13
+ */
14
+ export interface BuildHit {
15
+ file: string;
16
+ findings: SecretFinding[];
17
+ }
18
+ export declare function scanBuildArtifacts(cwd?: string, customDirs?: string[]): Promise<BuildHit[]>;
@@ -0,0 +1,100 @@
1
+ import { readFile, readdir, stat } from "node:fs/promises";
2
+ import { resolve, join } from "node:path";
3
+ import { findSecrets } from "./utils/redactSecrets.js";
4
+ const DEFAULT_BUILD_DIRS = [
5
+ ".next",
6
+ "dist",
7
+ "build",
8
+ "out",
9
+ ".vercel/output",
10
+ ".svelte-kit",
11
+ ".nuxt",
12
+ ".output",
13
+ ];
14
+ const SCANNABLE_EXTS = new Set([
15
+ ".js",
16
+ ".mjs",
17
+ ".cjs",
18
+ ".ts",
19
+ ".tsx",
20
+ ".jsx",
21
+ ".html",
22
+ ".css",
23
+ ".json",
24
+ ".map",
25
+ ".txt",
26
+ ".env",
27
+ ".env.local",
28
+ ".env.production",
29
+ ]);
30
+ const SKIP_DIRS = new Set([
31
+ "node_modules",
32
+ ".git",
33
+ ".pnpm-store",
34
+ "cache",
35
+ ]);
36
+ const MAX_BYTES = 5 * 1024 * 1024; // 5 MiB
37
+ async function walk(dir, out, depth = 0, maxDepth = 8) {
38
+ if (depth > maxDepth)
39
+ return;
40
+ let entries;
41
+ try {
42
+ entries = await readdir(dir, { withFileTypes: true });
43
+ }
44
+ catch {
45
+ return;
46
+ }
47
+ for (const ent of entries) {
48
+ if (SKIP_DIRS.has(ent.name))
49
+ continue;
50
+ const full = join(dir, ent.name);
51
+ if (ent.isDirectory()) {
52
+ await walk(full, out, depth + 1, maxDepth);
53
+ }
54
+ else if (ent.isFile()) {
55
+ const ext = ent.name.includes(".")
56
+ ? ent.name.slice(ent.name.lastIndexOf("."))
57
+ : "";
58
+ if (!SCANNABLE_EXTS.has(ext) && !ent.name.startsWith(".env"))
59
+ continue;
60
+ out.push(full);
61
+ }
62
+ }
63
+ }
64
+ export async function scanBuildArtifacts(cwd = process.cwd(), customDirs) {
65
+ const dirsToScan = customDirs ?? DEFAULT_BUILD_DIRS;
66
+ const files = [];
67
+ for (const d of dirsToScan) {
68
+ const full = resolve(cwd, d);
69
+ try {
70
+ const st = await stat(full);
71
+ if (!st.isDirectory())
72
+ continue;
73
+ }
74
+ catch {
75
+ continue;
76
+ }
77
+ await walk(full, files);
78
+ }
79
+ const hits = [];
80
+ for (const path of files) {
81
+ let content;
82
+ try {
83
+ const st = await stat(path);
84
+ if (st.size > MAX_BYTES)
85
+ continue;
86
+ content = await readFile(path, "utf-8");
87
+ }
88
+ catch {
89
+ continue;
90
+ }
91
+ const findings = findSecrets(content);
92
+ if (findings.length > 0) {
93
+ // Strip leading cwd from path for readable reporting.
94
+ const rel = path.startsWith(cwd) ? path.slice(cwd.length + 1) : path;
95
+ hits.push({ file: rel, findings });
96
+ }
97
+ }
98
+ return hits;
99
+ }
100
+ //# sourceMappingURL=scan-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-build.js","sourceRoot":"","sources":["../src/scan-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAsB,MAAM,0BAA0B,CAAC;AAmB3E,MAAM,kBAAkB,GAAG;IACzB,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,gBAAgB;IAChB,aAAa;IACb,OAAO;IACP,SAAS;CACV,CAAC;AAEF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,YAAY;IACZ,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc;IACd,MAAM;IACN,aAAa;IACb,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE3C,KAAK,UAAU,IAAI,CACjB,GAAW,EACX,GAAa,EACb,KAAK,GAAG,CAAC,EACT,QAAQ,GAAG,CAAC;IAEZ,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO;IAC7B,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC,CAAC,EAAE,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,UAAqB;IAErB,MAAM,UAAU,GAAG,UAAU,IAAI,kBAAkB,CAAC;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE;gBAAE,SAAS;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,IAAI,GAAG,SAAS;gBAAE,SAAS;YAClC,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,sDAAsD;YACtD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type SecretFinding } from "./utils/redactSecrets.js";
2
+ export interface PlaintextHit {
3
+ file: string;
4
+ findings: SecretFinding[];
5
+ }
6
+ export interface PlaintextScanOptions {
7
+ /** Additional file paths (relative to cwd) to scan beyond the defaults. */
8
+ extraFiles?: string[];
9
+ /** Additional dirs to walk recursively (depth-limited). Defaults to common config homes. */
10
+ extraDirs?: string[];
11
+ /** Max directory recursion depth. Default 3. Walk skips node_modules/.git/dist/build/out. */
12
+ maxDepth?: number;
13
+ /** Override the entire default list — useful for `.kit.toml` config. */
14
+ overrideFiles?: string[];
15
+ overrideDirs?: string[];
16
+ }
17
+ /**
18
+ * Scan high-signal locations for plaintext secrets before the user moves
19
+ * to a vault. Widened in P2: recurses into named config dirs (depth-limited),
20
+ * skips obvious build artifacts/node_modules, follows symlinks safely
21
+ * (resolves real path + dedupes), and accepts caller-supplied include lists
22
+ * so `.kit.toml` can extend the defaults per-project.
23
+ */
24
+ export declare function scanPlaintextSecrets(cwd?: string, opts?: PlaintextScanOptions): Promise<PlaintextHit[]>;
@@ -0,0 +1,147 @@
1
+ import { readFile, readdir, access, stat, realpath } from "node:fs/promises";
2
+ import { resolve, join, relative } from "node:path";
3
+ import { findSecrets } from "./utils/redactSecrets.js";
4
+ const DEFAULT_FILE_NAMES = [
5
+ ".env",
6
+ ".env.local",
7
+ ".env.development",
8
+ ".env.production",
9
+ ".env.staging",
10
+ ".env.test",
11
+ ".env.preview",
12
+ ".envrc",
13
+ "package.json",
14
+ "vercel.json",
15
+ "fly.toml",
16
+ "railway.toml",
17
+ "wrangler.toml",
18
+ "netlify.toml",
19
+ "render.yaml",
20
+ "docker-compose.yml",
21
+ "docker-compose.yaml",
22
+ "terraform.tfvars",
23
+ "terraform.tfvars.json",
24
+ ];
25
+ const DEFAULT_RECURSIVE_DIRS = ["scripts", "config", "infra", "terraform", ".github"];
26
+ const RECURSIVE_FILE_EXTS = /\.(sh|js|ts|mjs|cjs|json|yml|yaml|toml|tf|tfvars|tfstate|env)$/;
27
+ const SKIP_DIR_NAMES = new Set([
28
+ "node_modules",
29
+ ".git",
30
+ "dist",
31
+ "build",
32
+ "out",
33
+ ".next",
34
+ ".turbo",
35
+ ".cache",
36
+ "coverage",
37
+ ".venv",
38
+ "venv",
39
+ "__pycache__",
40
+ ".kit", // own state
41
+ ]);
42
+ /**
43
+ * Scan high-signal locations for plaintext secrets before the user moves
44
+ * to a vault. Widened in P2: recurses into named config dirs (depth-limited),
45
+ * skips obvious build artifacts/node_modules, follows symlinks safely
46
+ * (resolves real path + dedupes), and accepts caller-supplied include lists
47
+ * so `.kit.toml` can extend the defaults per-project.
48
+ */
49
+ export async function scanPlaintextSecrets(cwd = process.cwd(), opts = {}) {
50
+ const hits = [];
51
+ const seenRealPaths = new Set();
52
+ const fileTargets = opts.overrideFiles ?? [
53
+ ...DEFAULT_FILE_NAMES,
54
+ ...(opts.extraFiles ?? []),
55
+ ];
56
+ const dirTargets = opts.overrideDirs ?? [
57
+ ...DEFAULT_RECURSIVE_DIRS,
58
+ ...(opts.extraDirs ?? []),
59
+ ];
60
+ const maxDepth = opts.maxDepth ?? 3;
61
+ const scanFile = async (relativePath, absolutePath) => {
62
+ let realPath;
63
+ try {
64
+ realPath = await realpath(absolutePath);
65
+ }
66
+ catch {
67
+ return;
68
+ }
69
+ if (seenRealPaths.has(realPath))
70
+ return;
71
+ seenRealPaths.add(realPath);
72
+ try {
73
+ const info = await stat(realPath);
74
+ if (!info.isFile())
75
+ return;
76
+ // Refuse to slurp anything huge — kit isn't a full secret scanner.
77
+ if (info.size > 5 * 1024 * 1024)
78
+ return;
79
+ }
80
+ catch {
81
+ return;
82
+ }
83
+ try {
84
+ const text = await readFile(realPath, "utf-8");
85
+ const findings = findSecrets(text);
86
+ if (findings.length > 0) {
87
+ hits.push({ file: relativePath, findings });
88
+ }
89
+ }
90
+ catch {
91
+ /* unreadable / binary — skip */
92
+ }
93
+ };
94
+ // Pass 1: named files at repo root.
95
+ for (const name of fileTargets) {
96
+ const absolute = resolve(cwd, name);
97
+ try {
98
+ await access(absolute);
99
+ }
100
+ catch {
101
+ continue;
102
+ }
103
+ await scanFile(name, absolute);
104
+ }
105
+ // Pass 2: depth-limited walk of the configured dirs.
106
+ for (const dirName of dirTargets) {
107
+ const root = resolve(cwd, dirName);
108
+ try {
109
+ await access(root);
110
+ }
111
+ catch {
112
+ continue;
113
+ }
114
+ await walk(root, 0);
115
+ }
116
+ async function walk(dir, depth) {
117
+ if (depth > maxDepth)
118
+ return;
119
+ let entries;
120
+ try {
121
+ entries = (await readdir(dir, { withFileTypes: true }));
122
+ }
123
+ catch {
124
+ return;
125
+ }
126
+ for (const ent of entries) {
127
+ if (SKIP_DIR_NAMES.has(ent.name))
128
+ continue;
129
+ const childAbs = join(dir, ent.name);
130
+ const childRel = relative(cwd, childAbs);
131
+ if (ent.isDirectory()) {
132
+ await walk(childAbs, depth + 1);
133
+ continue;
134
+ }
135
+ if (!ent.isFile() && !ent.isSymbolicLink())
136
+ continue;
137
+ // Only match the known-noisy extensions to keep the scan fast.
138
+ // .tfstate is intentionally included even though it's huge in some
139
+ // repos — the size guard above caps the slurp.
140
+ if (!RECURSIVE_FILE_EXTS.test(ent.name))
141
+ continue;
142
+ await scanFile(childRel, childAbs);
143
+ }
144
+ }
145
+ return hits;
146
+ }
147
+ //# sourceMappingURL=scan-plaintext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-plaintext.js","sourceRoot":"","sources":["../src/scan-plaintext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAsB,MAAM,0BAA0B,CAAC;AAmB3E,MAAM,kBAAkB,GAAG;IACzB,MAAM;IACN,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;IACd,WAAW;IACX,cAAc;IACd,QAAQ;IACR,cAAc;IACd,aAAa;IACb,UAAU;IACV,cAAc;IACd,eAAe;IACf,cAAc;IACd,aAAa;IACb,oBAAoB;IACpB,qBAAqB;IACrB,kBAAkB;IAClB,uBAAuB;CACxB,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAEtF,MAAM,mBAAmB,GAAG,gEAAgE,CAAC;AAE7F,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,aAAa;IACb,MAAM,EAAE,YAAY;CACrB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,OAA6B,EAAE;IAE/B,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,IAAI;QACxC,GAAG,kBAAkB;QACrB,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;KAC3B,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,IAAI;QACtC,GAAG,sBAAsB;QACzB,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;KAC1B,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,KAAK,EAAE,YAAoB,EAAE,YAAoB,EAAE,EAAE;QACpE,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QACxC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,OAAO;YAC3B,mEAAmE;YACnE,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;gBAAE,OAAO;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,oCAAoC;IACpC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,KAAa;QAC5C,IAAI,KAAK,GAAG,QAAQ;YAAE,OAAO;QAC7B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAwB,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAChC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE;gBAAE,SAAS;YACrD,+DAA+D;YAC/D,mEAAmE;YACnE,+CAA+C;YAC/C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClD,MAAM,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type SecretFinding } from "./utils/redactSecrets.js";
2
+ export interface StagedHit {
3
+ file: string;
4
+ findings: SecretFinding[];
5
+ }
6
+ /**
7
+ * Reads the list of staged file paths from git, then scans each blob for
8
+ * SECRET_PATTERNS. Returns one entry per file that has at least one match.
9
+ *
10
+ * Operates on the staged blob (`git show :file`) rather than the working
11
+ * copy, so a developer can't bypass the check by un-staging the file after
12
+ * the hook fires. NUL-delimited path parsing keeps newlines + spaces in
13
+ * filenames safe.
14
+ */
15
+ export declare function scanStagedFiles(cwd?: string): Promise<StagedHit[]>;
@@ -0,0 +1,70 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { findSecrets } from "./utils/redactSecrets.js";
3
+ import { exec } from "./utils/exec.js";
4
+ /**
5
+ * Reads the list of staged file paths from git, then scans each blob for
6
+ * SECRET_PATTERNS. Returns one entry per file that has at least one match.
7
+ *
8
+ * Operates on the staged blob (`git show :file`) rather than the working
9
+ * copy, so a developer can't bypass the check by un-staging the file after
10
+ * the hook fires. NUL-delimited path parsing keeps newlines + spaces in
11
+ * filenames safe.
12
+ */
13
+ export async function scanStagedFiles(cwd = process.cwd()) {
14
+ let paths;
15
+ try {
16
+ // `git diff --cached` compares the index to HEAD; on a fresh repo there
17
+ // is no HEAD yet, which makes the call exit non-zero. Use the empty-tree
18
+ // SHA as the comparison base in that case so first-ever-commit hooks
19
+ // still get scanned.
20
+ let hasHead = true;
21
+ try {
22
+ await exec("git", ["rev-parse", "--verify", "HEAD"], {
23
+ cwd,
24
+ timeout: 3_000,
25
+ });
26
+ }
27
+ catch {
28
+ hasHead = false;
29
+ }
30
+ const args = hasHead
31
+ ? ["diff", "--cached", "--name-only", "--diff-filter=AM", "-z"]
32
+ : ["diff", "--cached", "--name-only", "--diff-filter=AM", "-z",
33
+ "4b825dc642cb6eb9a060e54bf8d69288fbee4904"]; // Git's well-known empty tree
34
+ const { stdout } = await exec("git", args, { cwd, timeout: 5_000 });
35
+ paths = stdout.split("\0").filter(Boolean);
36
+ }
37
+ catch {
38
+ // not a git repo, or git missing — let hook fall through silently
39
+ return [];
40
+ }
41
+ const { resolve } = await import("node:path");
42
+ const hits = [];
43
+ for (const path of paths) {
44
+ // Read the staged blob (`git show :file`) so a developer can't bypass
45
+ // by un-staging the change after the hook fires. Cap at 1 MiB.
46
+ let content;
47
+ try {
48
+ const { stdout } = await exec("git", ["show", `:${path}`], {
49
+ cwd,
50
+ timeout: 5_000,
51
+ maxBuffer: 1 * 1024 * 1024,
52
+ });
53
+ content = stdout;
54
+ }
55
+ catch {
56
+ try {
57
+ content = await readFile(resolve(cwd, path), "utf-8");
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ }
63
+ const findings = findSecrets(content);
64
+ if (findings.length > 0) {
65
+ hits.push({ file: path, findings });
66
+ }
67
+ }
68
+ return hits;
69
+ }
70
+ //# sourceMappingURL=scan-staged.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-staged.js","sourceRoot":"","sources":["../src/scan-staged.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAsB,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAQvC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC/D,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,wEAAwE;QACxE,yEAAyE;QACzE,qEAAqE;QACrE,qBAAqB;QACrB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;gBACnD,GAAG;gBACH,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,OAAO;YAClB,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC;YAC/D,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,IAAI;gBAC3D,0CAA0C,CAAC,CAAC,CAAC,8BAA8B;QAChF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,sEAAsE;QACtE,+DAA+D;QAC/D,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE;gBACzD,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;aAC3B,CAAC,CAAC;YACH,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type SecretFinding } from "./utils/redactSecrets.js";
2
+ /**
3
+ * Scans agent transcript and prompt-cache directories for leaked credentials.
4
+ *
5
+ * Why this matters: an AI agent receives a real key in conversation history,
6
+ * the message gets persisted to a transcript file, and that file gets read
7
+ * back into every future prompt. The key keeps re-leaking until the transcript
8
+ * is purged.
9
+ *
10
+ * Scans:
11
+ * - `<repo>/.claude/` — project-local Claude Code state
12
+ * - `<repo>/.opencode/` — OpenCode local state
13
+ * - `~/.claude/projects/<repo>/` — global Claude Code project cache
14
+ * - `~/.claude/projects/-<repo-path>/` — same, with normalized slashes
15
+ *
16
+ * Files we read: `*.jsonl`, `*.md`, `*.json`, `*.txt` (transcript-shaped).
17
+ * Skipped: binary, large blobs over 10 MiB, node_modules.
18
+ */
19
+ export interface TranscriptHit {
20
+ file: string;
21
+ findings: SecretFinding[];
22
+ }
23
+ export declare function scanTranscripts(cwd?: string): Promise<TranscriptHit[]>;
@@ -0,0 +1,93 @@
1
+ import { readFile, readdir, stat } from "node:fs/promises";
2
+ import { resolve, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { findSecrets } from "./utils/redactSecrets.js";
5
+ const SCANNABLE_EXTS = new Set([".jsonl", ".md", ".json", ".txt", ".log"]);
6
+ const SKIP_DIRS = new Set(["node_modules", ".git", "tool-results"]);
7
+ const MAX_BYTES = 10 * 1024 * 1024; // 10 MiB
8
+ async function dirExists(path) {
9
+ try {
10
+ const st = await stat(path);
11
+ return st.isDirectory();
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ async function walk(dir, out, depth = 0, maxDepth = 6) {
18
+ if (depth > maxDepth)
19
+ return;
20
+ let entries;
21
+ try {
22
+ entries = await readdir(dir, { withFileTypes: true });
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ for (const ent of entries) {
28
+ if (SKIP_DIRS.has(ent.name))
29
+ continue;
30
+ const full = join(dir, ent.name);
31
+ if (ent.isDirectory()) {
32
+ await walk(full, out, depth + 1, maxDepth);
33
+ }
34
+ else if (ent.isFile()) {
35
+ const ext = ent.name.includes(".")
36
+ ? ent.name.slice(ent.name.lastIndexOf("."))
37
+ : "";
38
+ if (!SCANNABLE_EXTS.has(ext))
39
+ continue;
40
+ out.push(full);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Convert an absolute repo path into the slug Claude Code uses for its
46
+ * `~/.claude/projects/<slug>/` directory: leading dash, then path with `/`
47
+ * replaced by `-`. Best-effort — both forms are checked.
48
+ */
49
+ function repoSlug(cwd) {
50
+ return cwd.replace(/^\//, "-").replace(/\//g, "-");
51
+ }
52
+ export async function scanTranscripts(cwd = process.cwd()) {
53
+ const candidates = [];
54
+ // Project-local agent dirs
55
+ for (const local of [".claude", ".opencode", ".cursor", ".aider"]) {
56
+ const full = resolve(cwd, local);
57
+ if (await dirExists(full))
58
+ candidates.push(full);
59
+ }
60
+ // Global Claude Code project cache (best-effort slug match)
61
+ const home = homedir();
62
+ const slug = repoSlug(cwd);
63
+ for (const global of [
64
+ join(home, ".claude", "projects", slug),
65
+ join(home, ".opencode", "projects", slug),
66
+ ]) {
67
+ if (await dirExists(global))
68
+ candidates.push(global);
69
+ }
70
+ const files = [];
71
+ for (const root of candidates) {
72
+ await walk(root, files);
73
+ }
74
+ const hits = [];
75
+ for (const path of files) {
76
+ let content;
77
+ try {
78
+ const st = await stat(path);
79
+ if (st.size > MAX_BYTES)
80
+ continue;
81
+ content = await readFile(path, "utf-8");
82
+ }
83
+ catch {
84
+ continue;
85
+ }
86
+ const findings = findSecrets(content);
87
+ if (findings.length > 0) {
88
+ hits.push({ file: path, findings });
89
+ }
90
+ }
91
+ return hits;
92
+ }
93
+ //# sourceMappingURL=scan-transcripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-transcripts.js","sourceRoot":"","sources":["../src/scan-transcripts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { SecretKeyConfig, InfisicalConfig } from "./config.js";
2
+ import type { SecretResolveResult } from "./secrets.js";
3
+ /**
4
+ * Single source of truth for every secret backend kit speaks to.
5
+ *
6
+ * Each backend declares how to `resolve` (read) a value and, optionally, how
7
+ * to `write` one. A backend with no `write` is read-only — migration to it is
8
+ * unsupported, surfaced uniformly by {@link writeViaBackend}. Keeping read and
9
+ * write side-by-side in one object is the whole point: the previous design had
10
+ * two independent `switch (source)` statements (one in secrets.ts, one in
11
+ * secrets-migrate.ts), so adding a backend to one and forgetting the other
12
+ * failed silently. Here the omission is visible in a single place — and the
13
+ * read/write capability matrix is asserted in secret-backends.test.ts.
14
+ */
15
+ export interface WriteOpts {
16
+ vault?: string;
17
+ project?: string;
18
+ region?: string;
19
+ vaultPath?: string;
20
+ }
21
+ export interface WriteResult {
22
+ ok: boolean;
23
+ ref?: string;
24
+ detail: string;
25
+ }
26
+ export interface SecretBackend {
27
+ /** Read a secret value for `name` using its `config`. Never throws — failures
28
+ * come back as `{ resolved: false, detail }`. */
29
+ resolve(name: string, config: SecretKeyConfig, infisicalConfig?: InfisicalConfig): Promise<SecretResolveResult>;
30
+ /** Write a secret. Absent ⇒ the backend is read-only (migration unsupported).
31
+ * May throw; callers wrap it so the error is redacted before surfacing.
32
+ *
33
+ * Value handling: where the CLI supports it, the value is fed via stdin so it
34
+ * never lands in argv / the process table (vault `kv put -`, aws/gcp
35
+ * `file:///dev/stdin` / `--data-file=-`). The 1Password, Infisical, Doppler and
36
+ * Azure CLIs only accept the value as a `key=value` / `--value` argv token for
37
+ * these operations, so it is briefly visible in `ps` there — an inherent CLI
38
+ * limitation. The error path is covered regardless: writeSecretToBackend redacts
39
+ * the held plaintext by exact substring before any failure message is surfaced. */
40
+ write?(key: string, value: string, opts: WriteOpts): Promise<WriteResult>;
41
+ }
42
+ /** Reset the Infisical cache. Called once per `generateSecrets` run. */
43
+ export declare function resetInfisicalCache(): void;
44
+ export declare const BACKENDS: Record<string, SecretBackend>;
45
+ /** Resolve (read) a secret via the registry. Mirrors the old `resolveSecret`
46
+ * switch — unknown sources return a uniform `Unknown source` result. */
47
+ export declare function resolveViaBackend(name: string, config: SecretKeyConfig, infisicalConfig?: InfisicalConfig): Promise<SecretResolveResult>;
48
+ /** Write a secret via the registry. Backends without a `write` are read-only;
49
+ * the "not yet supported" message matches the old switch default verbatim. */
50
+ export declare function writeViaBackend(store: string, key: string, value: string, opts: WriteOpts): Promise<WriteResult>;