@vibecheckai/cli 2.8.2 → 3.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 (454) hide show
  1. package/README.md +8 -8
  2. package/bin/_deprecations.js +35 -0
  3. package/bin/_router.js +46 -0
  4. package/bin/cli-hygiene.js +241 -0
  5. package/bin/guardrail.js +834 -0
  6. package/bin/runners/cli-utils.js +1070 -0
  7. package/bin/runners/context/ai-task-decomposer.js +337 -0
  8. package/bin/runners/context/analyzer.js +462 -0
  9. package/bin/runners/context/api-contracts.js +427 -0
  10. package/bin/runners/context/context-diff.js +342 -0
  11. package/bin/runners/context/context-pruner.js +291 -0
  12. package/bin/runners/context/dependency-graph.js +414 -0
  13. package/bin/runners/context/generators/claude.js +107 -0
  14. package/bin/runners/context/generators/codex.js +108 -0
  15. package/bin/runners/context/generators/copilot.js +119 -0
  16. package/bin/runners/context/generators/cursor.js +514 -0
  17. package/bin/runners/context/generators/mcp.js +151 -0
  18. package/bin/runners/context/generators/windsurf.js +180 -0
  19. package/bin/runners/context/git-context.js +302 -0
  20. package/bin/runners/context/index.js +1042 -0
  21. package/bin/runners/context/insights.js +173 -0
  22. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  23. package/bin/runners/context/mcp-server/index.js +1176 -0
  24. package/bin/runners/context/mcp-server/package.json +24 -0
  25. package/bin/runners/context/memory.js +200 -0
  26. package/bin/runners/context/monorepo.js +215 -0
  27. package/bin/runners/context/multi-repo-federation.js +404 -0
  28. package/bin/runners/context/patterns.js +253 -0
  29. package/bin/runners/context/proof-context.js +972 -0
  30. package/bin/runners/context/security-scanner.js +303 -0
  31. package/bin/runners/context/semantic-search.js +350 -0
  32. package/bin/runners/context/shared.js +264 -0
  33. package/bin/runners/context/team-conventions.js +310 -0
  34. package/bin/runners/lib/ai-bridge.js +416 -0
  35. package/bin/runners/lib/analysis-core.js +271 -0
  36. package/bin/runners/lib/analyzers.js +541 -0
  37. package/bin/runners/lib/audit-bridge.js +391 -0
  38. package/bin/runners/lib/auth-truth.js +193 -0
  39. package/bin/runners/lib/auth.js +215 -0
  40. package/bin/runners/lib/backup.js +62 -0
  41. package/bin/runners/lib/billing.js +107 -0
  42. package/bin/runners/lib/claims.js +118 -0
  43. package/bin/runners/lib/cli-ui.js +540 -0
  44. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  45. package/bin/runners/lib/compliance-bridge.js +165 -0
  46. package/bin/runners/lib/contracts/auth-contract.js +194 -0
  47. package/bin/runners/lib/contracts/env-contract.js +178 -0
  48. package/bin/runners/lib/contracts/external-contract.js +198 -0
  49. package/bin/runners/lib/contracts/guard.js +168 -0
  50. package/bin/runners/lib/contracts/index.js +89 -0
  51. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  52. package/bin/runners/lib/contracts/route-contract.js +192 -0
  53. package/bin/runners/lib/detect.js +89 -0
  54. package/bin/runners/lib/doctor/autofix.js +254 -0
  55. package/bin/runners/lib/doctor/index.js +37 -0
  56. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  57. package/bin/runners/lib/doctor/modules/index.js +46 -0
  58. package/bin/runners/lib/doctor/modules/network.js +250 -0
  59. package/bin/runners/lib/doctor/modules/project.js +312 -0
  60. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  61. package/bin/runners/lib/doctor/modules/security.js +348 -0
  62. package/bin/runners/lib/doctor/modules/system.js +213 -0
  63. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  64. package/bin/runners/lib/doctor/reporter.js +262 -0
  65. package/bin/runners/lib/doctor/service.js +262 -0
  66. package/bin/runners/lib/doctor/types.js +113 -0
  67. package/bin/runners/lib/doctor/ui.js +263 -0
  68. package/bin/runners/lib/doctor-enhanced.js +233 -0
  69. package/bin/runners/lib/doctor-v2.js +608 -0
  70. package/bin/runners/lib/enforcement.js +72 -0
  71. package/bin/runners/lib/enterprise-detect.js +603 -0
  72. package/bin/runners/lib/enterprise-init.js +942 -0
  73. package/bin/runners/lib/entitlements-v2.js +381 -0
  74. package/bin/runners/lib/entitlements.generated.js +0 -0
  75. package/bin/runners/lib/entitlements.js +332 -0
  76. package/bin/runners/lib/env-template.js +66 -0
  77. package/bin/runners/lib/env.js +189 -0
  78. package/bin/runners/lib/error-handler.js +320 -0
  79. package/bin/runners/lib/firewall-prompt.js +50 -0
  80. package/bin/runners/lib/graph/graph-builder.js +265 -0
  81. package/bin/runners/lib/graph/html-renderer.js +413 -0
  82. package/bin/runners/lib/graph/index.js +32 -0
  83. package/bin/runners/lib/graph/runtime-collector.js +215 -0
  84. package/bin/runners/lib/graph/static-extractor.js +518 -0
  85. package/bin/runners/lib/init-wizard.js +308 -0
  86. package/bin/runners/lib/json-output.js +76 -0
  87. package/bin/runners/lib/llm.js +75 -0
  88. package/bin/runners/lib/meter.js +61 -0
  89. package/bin/runners/lib/missions/evidence.js +126 -0
  90. package/bin/runners/lib/missions/plan.js +69 -0
  91. package/bin/runners/lib/missions/templates.js +147 -0
  92. package/bin/runners/lib/patch.js +40 -0
  93. package/bin/runners/lib/permissions/auth-model.js +213 -0
  94. package/bin/runners/lib/permissions/idor-prover.js +205 -0
  95. package/bin/runners/lib/permissions/index.js +45 -0
  96. package/bin/runners/lib/permissions/matrix-builder.js +198 -0
  97. package/bin/runners/lib/pkgjson.js +28 -0
  98. package/bin/runners/lib/preflight.js +142 -0
  99. package/bin/runners/lib/reality-findings.js +84 -0
  100. package/bin/runners/lib/redact.js +29 -0
  101. package/bin/runners/lib/replay/capsule-manager.js +154 -0
  102. package/bin/runners/lib/replay/index.js +263 -0
  103. package/bin/runners/lib/replay/player.js +348 -0
  104. package/bin/runners/lib/replay/recorder.js +331 -0
  105. package/bin/runners/lib/report-engine.js +447 -0
  106. package/bin/runners/lib/report-html.js +1117 -0
  107. package/bin/runners/lib/report-templates.js +964 -0
  108. package/bin/runners/lib/route-detection.js +1140 -0
  109. package/bin/runners/lib/route-truth.js +477 -0
  110. package/bin/runners/lib/sandbox/index.js +59 -0
  111. package/bin/runners/lib/sandbox/proof-chain.js +399 -0
  112. package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
  113. package/bin/runners/lib/sandbox/worktree.js +174 -0
  114. package/bin/runners/lib/scan-cache.js +330 -0
  115. package/bin/runners/lib/scan-output-schema.js +344 -0
  116. package/bin/runners/lib/score-history.js +282 -0
  117. package/bin/runners/lib/security-bridge.js +249 -0
  118. package/bin/runners/lib/server-usage.js +513 -0
  119. package/bin/runners/lib/share-pack.js +239 -0
  120. package/bin/runners/lib/snippets.js +67 -0
  121. package/bin/runners/lib/truth.js +667 -0
  122. package/bin/runners/lib/unified-output.js +189 -0
  123. package/bin/runners/lib/validate-patch.js +156 -0
  124. package/bin/runners/lib/verification.js +345 -0
  125. package/bin/runners/reality/engine.js +917 -0
  126. package/bin/runners/reality/flows.js +122 -0
  127. package/bin/runners/reality/report.js +378 -0
  128. package/bin/runners/reality/session.js +193 -0
  129. package/bin/runners/runAIAgent.js +2 -0
  130. package/bin/runners/runAudit.js +2 -0
  131. package/bin/runners/runAuth.js +106 -0
  132. package/bin/runners/runAutopilot.js +2 -0
  133. package/bin/runners/runBadge.js +2 -0
  134. package/bin/runners/runCertify.js +2 -0
  135. package/bin/runners/runClaimVerifier.js +483 -0
  136. package/bin/runners/runContext.js +56 -0
  137. package/bin/runners/runContextCompiler.js +385 -0
  138. package/bin/runners/runCtx.js +187 -0
  139. package/bin/runners/runCtxGuard.js +176 -0
  140. package/bin/runners/runCtxSync.js +116 -0
  141. package/bin/runners/runDashboard.js +10 -0
  142. package/bin/runners/runDoctor.js +245 -0
  143. package/bin/runners/runEnhancedShip.js +2 -0
  144. package/bin/runners/runFix.js +735 -0
  145. package/bin/runners/runFixPacks.js +2 -0
  146. package/bin/runners/runGate.js +17 -0
  147. package/bin/runners/runGraph.js +283 -0
  148. package/bin/runners/runInit.js +260 -0
  149. package/bin/runners/runInitGha.js +101 -0
  150. package/bin/runners/runInstall.js +76 -0
  151. package/bin/runners/runInteractive.js +388 -0
  152. package/bin/runners/runLaunch.js +2 -0
  153. package/bin/runners/runMcp.js +19 -0
  154. package/bin/runners/runMdc.js +2 -0
  155. package/bin/runners/runMissionGenerator.js +282 -0
  156. package/bin/runners/runNaturalLanguage.js +3 -0
  157. package/bin/runners/runPR.js +96 -0
  158. package/bin/runners/runPermissions.js +290 -0
  159. package/bin/runners/runPromptFirewall.js +211 -0
  160. package/bin/runners/runProof.js +2 -0
  161. package/bin/runners/runProve.js +392 -0
  162. package/bin/runners/runReality.js +489 -0
  163. package/bin/runners/runRealitySniff.js +2 -0
  164. package/bin/runners/runReplay.js +469 -0
  165. package/bin/runners/runReport.js +478 -0
  166. package/bin/runners/runScan.js +835 -0
  167. package/bin/runners/runShare.js +34 -0
  168. package/bin/runners/runShip.js +1062 -0
  169. package/bin/runners/runStatus.js +136 -0
  170. package/bin/runners/runTruthpack.js +634 -0
  171. package/bin/runners/runUpgrade.js +2 -0
  172. package/bin/runners/runValidate.js +2 -0
  173. package/bin/runners/runVerifyAgentOutput.js +2 -0
  174. package/bin/runners/runWatch.js +230 -0
  175. package/bin/runners/utils.js +360 -0
  176. package/bin/scan.js +612 -0
  177. package/bin/vibecheck.js +834 -0
  178. package/package.json +11 -11
  179. package/dist/autopatch/verified-autopatch.d.ts +0 -111
  180. package/dist/autopatch/verified-autopatch.d.ts.map +0 -1
  181. package/dist/autopatch/verified-autopatch.js +0 -503
  182. package/dist/autopatch/verified-autopatch.js.map +0 -1
  183. package/dist/bundles/index.js +0 -8
  184. package/dist/bundles/vibecheck-core.js +0 -25799
  185. package/dist/bundles/vibecheck-security.js +0 -208693
  186. package/dist/bundles/vibecheck-ship.js +0 -2318
  187. package/dist/commands/baseline.d.ts +0 -7
  188. package/dist/commands/baseline.d.ts.map +0 -1
  189. package/dist/commands/baseline.js +0 -79
  190. package/dist/commands/baseline.js.map +0 -1
  191. package/dist/commands/cache.d.ts +0 -13
  192. package/dist/commands/cache.d.ts.map +0 -1
  193. package/dist/commands/cache.js +0 -165
  194. package/dist/commands/cache.js.map +0 -1
  195. package/dist/commands/checkpoint.d.ts +0 -8
  196. package/dist/commands/checkpoint.d.ts.map +0 -1
  197. package/dist/commands/checkpoint.js +0 -35
  198. package/dist/commands/checkpoint.js.map +0 -1
  199. package/dist/commands/doctor.d.ts +0 -17
  200. package/dist/commands/doctor.d.ts.map +0 -1
  201. package/dist/commands/doctor.js +0 -226
  202. package/dist/commands/doctor.js.map +0 -1
  203. package/dist/commands/evidence.d.ts +0 -45
  204. package/dist/commands/evidence.d.ts.map +0 -1
  205. package/dist/commands/evidence.js +0 -197
  206. package/dist/commands/evidence.js.map +0 -1
  207. package/dist/commands/explain.d.ts +0 -8
  208. package/dist/commands/explain.d.ts.map +0 -1
  209. package/dist/commands/explain.js +0 -52
  210. package/dist/commands/explain.js.map +0 -1
  211. package/dist/commands/fix-consolidated.d.ts +0 -19
  212. package/dist/commands/fix-consolidated.d.ts.map +0 -1
  213. package/dist/commands/fix-consolidated.js +0 -165
  214. package/dist/commands/fix-consolidated.js.map +0 -1
  215. package/dist/commands/index.d.ts +0 -8
  216. package/dist/commands/index.d.ts.map +0 -1
  217. package/dist/commands/index.js +0 -15
  218. package/dist/commands/index.js.map +0 -1
  219. package/dist/commands/init.d.ts +0 -8
  220. package/dist/commands/init.d.ts.map +0 -1
  221. package/dist/commands/init.js +0 -125
  222. package/dist/commands/init.js.map +0 -1
  223. package/dist/commands/launcher.d.ts +0 -10
  224. package/dist/commands/launcher.d.ts.map +0 -1
  225. package/dist/commands/launcher.js +0 -174
  226. package/dist/commands/launcher.js.map +0 -1
  227. package/dist/commands/on.d.ts +0 -8
  228. package/dist/commands/on.d.ts.map +0 -1
  229. package/dist/commands/on.js +0 -123
  230. package/dist/commands/on.js.map +0 -1
  231. package/dist/commands/replay.d.ts +0 -8
  232. package/dist/commands/replay.d.ts.map +0 -1
  233. package/dist/commands/replay.js +0 -52
  234. package/dist/commands/replay.js.map +0 -1
  235. package/dist/commands/scan-consolidated.d.ts +0 -61
  236. package/dist/commands/scan-consolidated.d.ts.map +0 -1
  237. package/dist/commands/scan-consolidated.js +0 -243
  238. package/dist/commands/scan-consolidated.js.map +0 -1
  239. package/dist/commands/scan-secrets.d.ts +0 -47
  240. package/dist/commands/scan-secrets.d.ts.map +0 -1
  241. package/dist/commands/scan-secrets.js +0 -225
  242. package/dist/commands/scan-secrets.js.map +0 -1
  243. package/dist/commands/scan-vulnerabilities-enhanced.d.ts +0 -41
  244. package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +0 -1
  245. package/dist/commands/scan-vulnerabilities-enhanced.js +0 -368
  246. package/dist/commands/scan-vulnerabilities-enhanced.js.map +0 -1
  247. package/dist/commands/scan-vulnerabilities-osv.d.ts +0 -58
  248. package/dist/commands/scan-vulnerabilities-osv.d.ts.map +0 -1
  249. package/dist/commands/scan-vulnerabilities-osv.js +0 -722
  250. package/dist/commands/scan-vulnerabilities-osv.js.map +0 -1
  251. package/dist/commands/scan-vulnerabilities.d.ts +0 -32
  252. package/dist/commands/scan-vulnerabilities.d.ts.map +0 -1
  253. package/dist/commands/scan-vulnerabilities.js +0 -283
  254. package/dist/commands/scan-vulnerabilities.js.map +0 -1
  255. package/dist/commands/secrets-allowlist.d.ts +0 -7
  256. package/dist/commands/secrets-allowlist.d.ts.map +0 -1
  257. package/dist/commands/secrets-allowlist.js +0 -85
  258. package/dist/commands/secrets-allowlist.js.map +0 -1
  259. package/dist/commands/ship-consolidated.d.ts +0 -58
  260. package/dist/commands/ship-consolidated.d.ts.map +0 -1
  261. package/dist/commands/ship-consolidated.js +0 -515
  262. package/dist/commands/ship-consolidated.js.map +0 -1
  263. package/dist/commands/stats.d.ts +0 -8
  264. package/dist/commands/stats.d.ts.map +0 -1
  265. package/dist/commands/stats.js +0 -134
  266. package/dist/commands/stats.js.map +0 -1
  267. package/dist/commands/upgrade.d.ts +0 -8
  268. package/dist/commands/upgrade.d.ts.map +0 -1
  269. package/dist/commands/upgrade.js +0 -30
  270. package/dist/commands/upgrade.js.map +0 -1
  271. package/dist/fix/applicator.d.ts +0 -44
  272. package/dist/fix/applicator.d.ts.map +0 -1
  273. package/dist/fix/applicator.js +0 -144
  274. package/dist/fix/applicator.js.map +0 -1
  275. package/dist/fix/backup.d.ts +0 -38
  276. package/dist/fix/backup.d.ts.map +0 -1
  277. package/dist/fix/backup.js +0 -154
  278. package/dist/fix/backup.js.map +0 -1
  279. package/dist/fix/engine.d.ts +0 -55
  280. package/dist/fix/engine.d.ts.map +0 -1
  281. package/dist/fix/engine.js +0 -285
  282. package/dist/fix/engine.js.map +0 -1
  283. package/dist/fix/index.d.ts +0 -5
  284. package/dist/fix/index.d.ts.map +0 -1
  285. package/dist/fix/index.js +0 -12
  286. package/dist/fix/index.js.map +0 -1
  287. package/dist/fix/interactive.d.ts +0 -22
  288. package/dist/fix/interactive.d.ts.map +0 -1
  289. package/dist/fix/interactive.js +0 -172
  290. package/dist/fix/interactive.js.map +0 -1
  291. package/dist/formatters/index.d.ts +0 -6
  292. package/dist/formatters/index.d.ts.map +0 -1
  293. package/dist/formatters/index.js +0 -11
  294. package/dist/formatters/index.js.map +0 -1
  295. package/dist/formatters/sarif-enhanced.d.ts +0 -78
  296. package/dist/formatters/sarif-enhanced.d.ts.map +0 -1
  297. package/dist/formatters/sarif-enhanced.js +0 -144
  298. package/dist/formatters/sarif-enhanced.js.map +0 -1
  299. package/dist/formatters/sarif-v2.d.ts +0 -121
  300. package/dist/formatters/sarif-v2.d.ts.map +0 -1
  301. package/dist/formatters/sarif-v2.js +0 -356
  302. package/dist/formatters/sarif-v2.js.map +0 -1
  303. package/dist/formatters/sarif.d.ts +0 -72
  304. package/dist/formatters/sarif.d.ts.map +0 -1
  305. package/dist/formatters/sarif.js +0 -146
  306. package/dist/formatters/sarif.js.map +0 -1
  307. package/dist/index.d.ts +0 -61
  308. package/dist/index.d.ts.map +0 -1
  309. package/dist/index.js +0 -4388
  310. package/dist/index.js.map +0 -1
  311. package/dist/init/ci-generator.d.ts +0 -18
  312. package/dist/init/ci-generator.d.ts.map +0 -1
  313. package/dist/init/ci-generator.js +0 -317
  314. package/dist/init/ci-generator.js.map +0 -1
  315. package/dist/init/detect-framework.d.ts +0 -15
  316. package/dist/init/detect-framework.d.ts.map +0 -1
  317. package/dist/init/detect-framework.js +0 -301
  318. package/dist/init/detect-framework.js.map +0 -1
  319. package/dist/init/hooks-installer.d.ts +0 -22
  320. package/dist/init/hooks-installer.d.ts.map +0 -1
  321. package/dist/init/hooks-installer.js +0 -310
  322. package/dist/init/hooks-installer.js.map +0 -1
  323. package/dist/init/index.d.ts +0 -8
  324. package/dist/init/index.d.ts.map +0 -1
  325. package/dist/init/index.js +0 -22
  326. package/dist/init/index.js.map +0 -1
  327. package/dist/init/templates.d.ts +0 -402
  328. package/dist/init/templates.d.ts.map +0 -1
  329. package/dist/init/templates.js +0 -240
  330. package/dist/init/templates.js.map +0 -1
  331. package/dist/mcp/server.d.ts +0 -12
  332. package/dist/mcp/server.d.ts.map +0 -1
  333. package/dist/mcp/server.js +0 -42
  334. package/dist/mcp/server.js.map +0 -1
  335. package/dist/mcp/telemetry.d.ts +0 -40
  336. package/dist/mcp/telemetry.d.ts.map +0 -1
  337. package/dist/mcp/telemetry.js +0 -98
  338. package/dist/mcp/telemetry.js.map +0 -1
  339. package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts +0 -32
  340. package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts.map +0 -1
  341. package/dist/reality/no-dead-buttons/button-sweep-generator.js +0 -236
  342. package/dist/reality/no-dead-buttons/button-sweep-generator.js.map +0 -1
  343. package/dist/reality/no-dead-buttons/index.d.ts +0 -11
  344. package/dist/reality/no-dead-buttons/index.d.ts.map +0 -1
  345. package/dist/reality/no-dead-buttons/index.js +0 -18
  346. package/dist/reality/no-dead-buttons/index.js.map +0 -1
  347. package/dist/reality/no-dead-buttons/static-scanner.d.ts +0 -34
  348. package/dist/reality/no-dead-buttons/static-scanner.d.ts.map +0 -1
  349. package/dist/reality/no-dead-buttons/static-scanner.js +0 -230
  350. package/dist/reality/no-dead-buttons/static-scanner.js.map +0 -1
  351. package/dist/reality/reality-graph.d.ts +0 -192
  352. package/dist/reality/reality-graph.d.ts.map +0 -1
  353. package/dist/reality/reality-graph.js +0 -600
  354. package/dist/reality/reality-graph.js.map +0 -1
  355. package/dist/reality/reality-runner.d.ts +0 -89
  356. package/dist/reality/reality-runner.d.ts.map +0 -1
  357. package/dist/reality/reality-runner.js +0 -540
  358. package/dist/reality/reality-runner.js.map +0 -1
  359. package/dist/reality/receipt-generator.d.ts +0 -152
  360. package/dist/reality/receipt-generator.d.ts.map +0 -1
  361. package/dist/reality/receipt-generator.js +0 -495
  362. package/dist/reality/receipt-generator.js.map +0 -1
  363. package/dist/reality/runtime-tracer.d.ts +0 -75
  364. package/dist/reality/runtime-tracer.d.ts.map +0 -1
  365. package/dist/reality/runtime-tracer.js +0 -109
  366. package/dist/reality/runtime-tracer.js.map +0 -1
  367. package/dist/runtime/auth-utils.d.ts +0 -43
  368. package/dist/runtime/auth-utils.d.ts.map +0 -1
  369. package/dist/runtime/auth-utils.js +0 -130
  370. package/dist/runtime/auth-utils.js.map +0 -1
  371. package/dist/runtime/client.d.ts +0 -74
  372. package/dist/runtime/client.d.ts.map +0 -1
  373. package/dist/runtime/client.js +0 -222
  374. package/dist/runtime/client.js.map +0 -1
  375. package/dist/runtime/creds.d.ts +0 -48
  376. package/dist/runtime/creds.d.ts.map +0 -1
  377. package/dist/runtime/creds.js +0 -245
  378. package/dist/runtime/creds.js.map +0 -1
  379. package/dist/runtime/exit-codes.d.ts +0 -49
  380. package/dist/runtime/exit-codes.d.ts.map +0 -1
  381. package/dist/runtime/exit-codes.js +0 -93
  382. package/dist/runtime/exit-codes.js.map +0 -1
  383. package/dist/runtime/index.d.ts +0 -9
  384. package/dist/runtime/index.d.ts.map +0 -1
  385. package/dist/runtime/index.js +0 -25
  386. package/dist/runtime/index.js.map +0 -1
  387. package/dist/runtime/json-output.d.ts +0 -42
  388. package/dist/runtime/json-output.d.ts.map +0 -1
  389. package/dist/runtime/json-output.js +0 -59
  390. package/dist/runtime/json-output.js.map +0 -1
  391. package/dist/runtime/semver.d.ts +0 -37
  392. package/dist/runtime/semver.d.ts.map +0 -1
  393. package/dist/runtime/semver.js +0 -110
  394. package/dist/runtime/semver.js.map +0 -1
  395. package/dist/scan/dead-ui-detector.d.ts +0 -48
  396. package/dist/scan/dead-ui-detector.d.ts.map +0 -1
  397. package/dist/scan/dead-ui-detector.js +0 -170
  398. package/dist/scan/dead-ui-detector.js.map +0 -1
  399. package/dist/scan/playwright-sweep.d.ts +0 -40
  400. package/dist/scan/playwright-sweep.d.ts.map +0 -1
  401. package/dist/scan/playwright-sweep.js +0 -216
  402. package/dist/scan/playwright-sweep.js.map +0 -1
  403. package/dist/scan/proof-bundle.d.ts +0 -25
  404. package/dist/scan/proof-bundle.d.ts.map +0 -1
  405. package/dist/scan/proof-bundle.js +0 -203
  406. package/dist/scan/proof-bundle.js.map +0 -1
  407. package/dist/scan/proof-graph.d.ts +0 -59
  408. package/dist/scan/proof-graph.d.ts.map +0 -1
  409. package/dist/scan/proof-graph.js +0 -64
  410. package/dist/scan/proof-graph.js.map +0 -1
  411. package/dist/scan/reality-sniff.d.ts +0 -56
  412. package/dist/scan/reality-sniff.d.ts.map +0 -1
  413. package/dist/scan/reality-sniff.js +0 -200
  414. package/dist/scan/reality-sniff.js.map +0 -1
  415. package/dist/scan/structural-verifier.d.ts +0 -20
  416. package/dist/scan/structural-verifier.d.ts.map +0 -1
  417. package/dist/scan/structural-verifier.js +0 -112
  418. package/dist/scan/structural-verifier.js.map +0 -1
  419. package/dist/scan/verification-engine.d.ts +0 -47
  420. package/dist/scan/verification-engine.d.ts.map +0 -1
  421. package/dist/scan/verification-engine.js +0 -141
  422. package/dist/scan/verification-engine.js.map +0 -1
  423. package/dist/scanner/baseline.d.ts +0 -52
  424. package/dist/scanner/baseline.d.ts.map +0 -1
  425. package/dist/scanner/baseline.js +0 -85
  426. package/dist/scanner/baseline.js.map +0 -1
  427. package/dist/scanner/incremental.d.ts +0 -30
  428. package/dist/scanner/incremental.d.ts.map +0 -1
  429. package/dist/scanner/incremental.js +0 -82
  430. package/dist/scanner/incremental.js.map +0 -1
  431. package/dist/scanner/parallel.d.ts +0 -43
  432. package/dist/scanner/parallel.d.ts.map +0 -1
  433. package/dist/scanner/parallel.js +0 -99
  434. package/dist/scanner/parallel.js.map +0 -1
  435. package/dist/standalone.d.ts +0 -1
  436. package/dist/standalone.d.ts.map +0 -1
  437. package/dist/standalone.js +0 -1
  438. package/dist/standalone.js.map +0 -1
  439. package/dist/truth-pack/index.d.ts +0 -102
  440. package/dist/truth-pack/index.d.ts.map +0 -1
  441. package/dist/truth-pack/index.js +0 -694
  442. package/dist/truth-pack/index.js.map +0 -1
  443. package/dist/ui/frame.d.ts +0 -68
  444. package/dist/ui/frame.d.ts.map +0 -1
  445. package/dist/ui/frame.js +0 -165
  446. package/dist/ui/frame.js.map +0 -1
  447. package/dist/ui/index.d.ts +0 -5
  448. package/dist/ui/index.d.ts.map +0 -1
  449. package/dist/ui/index.js +0 -16
  450. package/dist/ui/index.js.map +0 -1
  451. package/dist/ui.d.ts +0 -36
  452. package/dist/ui.d.ts.map +0 -1
  453. package/dist/ui.js +0 -45
  454. package/dist/ui.js.map +0 -1
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Security Scanner Module
3
+ * Scans context for secrets, vulnerabilities, and sensitive data
4
+ */
5
+
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const crypto = require("crypto");
9
+
10
+ /**
11
+ * Secret patterns to detect
12
+ */
13
+ const SECRET_PATTERNS = [
14
+ // API Keys
15
+ { pattern: /AIza[0-9A-Za-z_-]{35}/, type: "Google API Key" },
16
+ { pattern: /AKIA[0-9A-Z]{16}/, type: "AWS Access Key" },
17
+ { pattern: /xoxb-[0-9]{10}-[0-9]{10}/, type: "Slack Bot Token" },
18
+ { pattern: /ghp_[a-zA-Z0-9]{36}/, type: "GitHub Personal Token" },
19
+ { pattern: /sk_live_[0-9a-zA-Z]{24}/, type: "Stripe Live Key" },
20
+ { pattern: /pk_live_[0-9a-zA-Z]{24}/, type: "Stripe Publishable Key" },
21
+
22
+ // Generic patterns
23
+ { pattern: /['"]?API[_-]?KEY['"]?\s*[:=]\s*['"][^'"]{8,}['"]/, type: "API Key" },
24
+ { pattern: /['"]?SECRET[_-]?KEY['"]?\s*[:=]\s*['"][^'"]{8,}['"]/, type: "Secret Key" },
25
+ { pattern: /['"]?PASSWORD['"]?\s*[:=]\s*['"][^'"]{6,}['"]/, type: "Password" },
26
+ { pattern: /['"]?TOKEN['"]?\s*[:=]\s*['"][^'"]{8,}['"]/, type: "Token" },
27
+ { pattern: /['"]?PRIVATE[_-]?KEY['"]?\s*[:=]\s*['"][^'"]{16,}['"]/, type: "Private Key" },
28
+
29
+ // Database URLs
30
+ { pattern: /mongodb:\/\/[^:]+:[^@]+@/, type: "MongoDB URL" },
31
+ { pattern: /postgres:\/\/[^:]+:[^@]+@/, type: "PostgreSQL URL" },
32
+ { pattern: /mysql:\/\/[^:]+:[^@]+@/, type: "MySQL URL" },
33
+
34
+ // JWT tokens
35
+ { pattern: /eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*/, type: "JWT Token" },
36
+ ];
37
+
38
+ /**
39
+ * Vulnerability patterns
40
+ */
41
+ const VULNERABILITY_PATTERNS = [
42
+ // SQL Injection
43
+ { pattern: /query\s*\(\s*['"]\s*\+.*\+\s*['"]/, type: "SQL Injection", severity: "high" },
44
+ { pattern: /execute\s*\(\s*['"]\s*\+/, type: "SQL Injection", severity: "high" },
45
+
46
+ // XSS
47
+ { pattern: /dangerouslySetInnerHTML/, type: "XSS Risk", severity: "high" },
48
+ { pattern: /innerHTML\s*=/, type: "XSS Risk", severity: "medium" },
49
+ { pattern: /document\.write\s*\(/, type: "XSS Risk", severity: "high" },
50
+
51
+ // Path Traversal
52
+ { pattern: /\.\.\/\.\./, type: "Path Traversal", severity: "medium" },
53
+ { pattern: /readFile\s*\(\s*.*\+/, type: "Path Traversal", severity: "high" },
54
+
55
+ // Insecure Crypto
56
+ { pattern: /md5\s*\(/, type: "Weak Hash", severity: "medium" },
57
+ { pattern: /sha1\s*\(/, type: "Weak Hash", severity: "medium" },
58
+
59
+ // Hardcoded credentials
60
+ { pattern: /admin\s*:\s*['"]admin['"]/, type: "Hardcoded Credentials", severity: "high" },
61
+ { pattern: /root\s*:\s*['"][^'"]{4,}['"]/, type: "Hardcoded Credentials", severity: "high" },
62
+
63
+ // Debug code
64
+ { pattern: /console\.log\s*\(\s*password/, type: "Password in Log", severity: "high" },
65
+ { pattern: /console\.log\s*\(\s*token/, type: "Token in Log", severity: "high" },
66
+ ];
67
+
68
+ /**
69
+ * Find files recursively
70
+ */
71
+ function findFiles(dir, extensions, maxDepth = 5, currentDepth = 0) {
72
+ if (currentDepth >= maxDepth || !fs.existsSync(dir)) return [];
73
+
74
+ const files = [];
75
+ try {
76
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
77
+ for (const entry of entries) {
78
+ const fullPath = path.join(dir, entry.name);
79
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
80
+ files.push(...findFiles(fullPath, extensions, maxDepth, currentDepth + 1));
81
+ } else if (entry.isFile() && extensions.some(ext => entry.name.endsWith(ext))) {
82
+ files.push(fullPath);
83
+ }
84
+ }
85
+ } catch {}
86
+ return files;
87
+ }
88
+
89
+ /**
90
+ * Scan file for secrets
91
+ */
92
+ function scanForSecrets(content, filePath) {
93
+ const secrets = [];
94
+ const lines = content.split("\n");
95
+
96
+ for (const pattern of SECRET_PATTERNS) {
97
+ const matches = content.matchAll(new RegExp(pattern.pattern.source, 'g'));
98
+ for (const match of matches) {
99
+ const lineNum = content.substring(0, match.index).split("\n").length;
100
+ const line = lines[lineNum - 1];
101
+
102
+ secrets.push({
103
+ type: pattern.type,
104
+ file: path.relative(process.cwd(), filePath).replace(/\\/g, "/"),
105
+ line: lineNum,
106
+ content: line.trim(),
107
+ severity: "critical",
108
+ });
109
+ }
110
+ }
111
+
112
+ return secrets;
113
+ }
114
+
115
+ /**
116
+ * Scan file for vulnerabilities
117
+ */
118
+ function scanForVulnerabilities(content, filePath) {
119
+ const vulnerabilities = [];
120
+ const lines = content.split("\n");
121
+
122
+ for (const pattern of VULNERABILITY_PATTERNS) {
123
+ const matches = content.matchAll(new RegExp(pattern.pattern.source, 'g'));
124
+ for (const match of matches) {
125
+ const lineNum = content.substring(0, match.index).split("\n").length;
126
+ const line = lines[lineNum - 1];
127
+
128
+ vulnerabilities.push({
129
+ type: pattern.type,
130
+ file: path.relative(process.cwd(), filePath).replace(/\\/g, "/"),
131
+ line: lineNum,
132
+ content: line.trim(),
133
+ severity: pattern.severity || "medium",
134
+ recommendation: getRecommendation(pattern.type),
135
+ });
136
+ }
137
+ }
138
+
139
+ return vulnerabilities;
140
+ }
141
+
142
+ /**
143
+ * Get recommendation for vulnerability type
144
+ */
145
+ function getRecommendation(type) {
146
+ const recommendations = {
147
+ "SQL Injection": "Use parameterized queries or prepared statements",
148
+ "XSS Risk": "Sanitize user input and use textContent instead of innerHTML",
149
+ "Path Traversal": "Validate and sanitize file paths, use path.join()",
150
+ "Weak Hash": "Use stronger hashing algorithms like bcrypt or Argon2",
151
+ "Hardcoded Credentials": "Use environment variables for credentials",
152
+ "Password in Log": "Remove sensitive data from logs",
153
+ "Token in Log": "Remove sensitive data from logs",
154
+ };
155
+
156
+ return recommendations[type] || "Review and fix the security issue";
157
+ }
158
+
159
+ /**
160
+ * Scan project for security issues
161
+ */
162
+ function scanProject(projectPath) {
163
+ const files = findFiles(projectPath, [".ts", ".tsx", ".js", ".jsx", ".json", ".env*", ".yml", ".yaml"], 5);
164
+
165
+ const results = {
166
+ secrets: [],
167
+ vulnerabilities: [],
168
+ stats: {
169
+ totalFiles: files.length,
170
+ filesWithSecrets: 0,
171
+ filesWithVulnerabilities: 0,
172
+ criticalIssues: 0,
173
+ highIssues: 0,
174
+ mediumIssues: 0,
175
+ },
176
+ scanned: new Date().toISOString(),
177
+ };
178
+
179
+ for (const file of files) {
180
+ try {
181
+ const content = fs.readFileSync(file, "utf-8");
182
+ const relativePath = path.relative(projectPath, file).replace(/\\/g, "/");
183
+
184
+ // Skip certain files
185
+ if (relativePath.includes("node_modules") ||
186
+ relativePath.includes(".git") ||
187
+ relativePath.includes("dist/") ||
188
+ relativePath.includes("build/")) {
189
+ continue;
190
+ }
191
+
192
+ const secrets = scanForSecrets(content, file);
193
+ const vulnerabilities = scanForVulnerabilities(content, file);
194
+
195
+ if (secrets.length > 0) {
196
+ results.secrets.push(...secrets);
197
+ results.stats.filesWithSecrets++;
198
+ }
199
+
200
+ if (vulnerabilities.length > 0) {
201
+ results.vulnerabilities.push(...vulnerabilities);
202
+ results.stats.filesWithVulnerabilities++;
203
+ }
204
+
205
+ // Count severity
206
+ for (const issue of [...secrets, ...vulnerabilities]) {
207
+ switch (issue.severity) {
208
+ case "critical":
209
+ results.stats.criticalIssues++;
210
+ break;
211
+ case "high":
212
+ results.stats.highIssues++;
213
+ break;
214
+ case "medium":
215
+ results.stats.mediumIssues++;
216
+ break;
217
+ }
218
+ }
219
+ } catch {}
220
+ }
221
+
222
+ return results;
223
+ }
224
+
225
+ /**
226
+ * Generate security report
227
+ */
228
+ function generateSecurityReport(results) {
229
+ let report = `# Security Scan Report\n\n`;
230
+ report += `Scanned: ${new Date(results.scanned).toLocaleString()}\n`;
231
+ report += `Total Files: ${results.stats.totalFiles}\n\n`;
232
+
233
+ // Summary
234
+ report += `## Summary\n\n`;
235
+ report += `- Files with Secrets: ${results.stats.filesWithSecrets}\n`;
236
+ report += `- Files with Vulnerabilities: ${results.stats.filesWithVulnerabilities}\n`;
237
+ report += `- Critical Issues: ${results.stats.criticalIssues}\n`;
238
+ report += `- High Issues: ${results.stats.highIssues}\n`;
239
+ report += `- Medium Issues: ${results.stats.mediumIssues}\n\n`;
240
+
241
+ // Secrets
242
+ if (results.secrets.length > 0) {
243
+ report += `## 🔑 Secrets Found (${results.secrets.length})\n\n`;
244
+ for (const secret of results.secrets) {
245
+ report += `### ${secret.type} - ${secret.file}:${secret.line}\n`;
246
+ report += `\`\`\`\n${secret.content}\n\`\`\`\n\n`;
247
+ }
248
+ }
249
+
250
+ // Vulnerabilities
251
+ if (results.vulnerabilities.length > 0) {
252
+ report += `## 🚨 Vulnerabilities Found (${results.vulnerabilities.length})\n\n`;
253
+ for (const vuln of results.vulnerabilities) {
254
+ const icon = vuln.severity === "critical" ? "🔴" :
255
+ vuln.severity === "high" ? "🟠" : "🟡";
256
+ report += `### ${icon} ${vuln.type} - ${vuln.file}:${vuln.line}\n`;
257
+ report += `**Severity:** ${vuln.severity}\n`;
258
+ report += `**Recommendation:** ${vuln.recommendation}\n\n`;
259
+ report += `\`\`\`\n${vuln.content}\n\`\`\`\n\n`;
260
+ }
261
+ }
262
+
263
+ if (results.secrets.length === 0 && results.vulnerabilities.length === 0) {
264
+ report += `## ✅ No Security Issues Found\n\n`;
265
+ report += `Great job! No secrets or obvious vulnerabilities were detected.\n`;
266
+ }
267
+
268
+ return report;
269
+ }
270
+
271
+ /**
272
+ * Filter content for safe AI consumption
273
+ */
274
+ function filterForAI(content) {
275
+ let filtered = content;
276
+
277
+ // Remove detected secrets
278
+ for (const pattern of SECRET_PATTERNS) {
279
+ filtered = filtered.replace(pattern.pattern, "[REDACTED_SECRET]");
280
+ }
281
+
282
+ // Remove sensitive lines
283
+ const lines = filtered.split("\n");
284
+ const safeLines = lines.filter(line => {
285
+ const lower = line.toLowerCase();
286
+ return !lower.includes("password") &&
287
+ !lower.includes("secret") &&
288
+ !lower.includes("private_key") &&
289
+ !lower.includes("api_key") &&
290
+ !line.includes("console.log") &&
291
+ !line.includes("debugger");
292
+ });
293
+
294
+ return safeLines.join("\n");
295
+ }
296
+
297
+ module.exports = {
298
+ scanProject,
299
+ generateSecurityReport,
300
+ filterForAI,
301
+ SECRET_PATTERNS,
302
+ VULNERABILITY_PATTERNS,
303
+ };
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Semantic Code Search Module
3
+ * Embeds code chunks for natural language queries
4
+ */
5
+
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const crypto = require("crypto");
9
+
10
+ /**
11
+ * Simple TF-IDF vectorizer for semantic search
12
+ * In production, would use OpenAI embeddings or similar
13
+ */
14
+ class SimpleVectorizer {
15
+ constructor() {
16
+ this.vocabulary = new Map();
17
+ this.idf = new Map();
18
+ this.documents = [];
19
+ }
20
+
21
+ /**
22
+ * Tokenize text into words
23
+ */
24
+ tokenize(text) {
25
+ return text
26
+ .toLowerCase()
27
+ .replace(/[^\w\s]/g, " ")
28
+ .split(/\s+/)
29
+ .filter(word => word.length > 2);
30
+ }
31
+
32
+ /**
33
+ * Build vocabulary from documents
34
+ */
35
+ fit(documents) {
36
+ this.documents = documents;
37
+ const docCount = documents.length;
38
+ const docFreq = new Map();
39
+
40
+ // Count document frequency for each term
41
+ for (const doc of documents) {
42
+ const tokens = new Set(this.tokenize(doc));
43
+ for (const token of tokens) {
44
+ docFreq.set(token, (docFreq.get(token) || 0) + 1);
45
+ }
46
+ }
47
+
48
+ // Calculate IDF
49
+ for (const [term, freq] of docFreq) {
50
+ this.idf.set(term, Math.log(docCount / freq));
51
+ this.vocabulary.set(term, this.vocabulary.size);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Transform document to TF-IDF vector
57
+ */
58
+ transform(text) {
59
+ const tokens = this.tokenize(text);
60
+ const tf = new Map();
61
+
62
+ // Count term frequency
63
+ for (const token of tokens) {
64
+ tf.set(token, (tf.get(token) || 0) + 1);
65
+ }
66
+
67
+ // Create vector
68
+ const vector = new Array(this.vocabulary.size).fill(0);
69
+ for (const [term, count] of tf) {
70
+ if (this.vocabulary.has(term)) {
71
+ const idx = this.vocabulary.get(term);
72
+ vector[idx] = (count / tokens.length) * this.idf.get(term);
73
+ }
74
+ }
75
+
76
+ return vector;
77
+ }
78
+
79
+ /**
80
+ * Calculate cosine similarity between vectors
81
+ */
82
+ cosineSimilarity(vec1, vec2) {
83
+ let dotProduct = 0;
84
+ let norm1 = 0;
85
+ let norm2 = 0;
86
+
87
+ for (let i = 0; i < vec1.length; i++) {
88
+ dotProduct += vec1[i] * vec2[i];
89
+ norm1 += vec1[i] * vec1[i];
90
+ norm2 += vec2[i] * vec2[i];
91
+ }
92
+
93
+ return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Find files recursively
99
+ */
100
+ function findFiles(dir, extensions, maxDepth = 5, currentDepth = 0) {
101
+ if (currentDepth >= maxDepth || !fs.existsSync(dir)) return [];
102
+
103
+ const files = [];
104
+ try {
105
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
106
+ for (const entry of entries) {
107
+ const fullPath = path.join(dir, entry.name);
108
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
109
+ files.push(...findFiles(fullPath, extensions, maxDepth, currentDepth + 1));
110
+ } else if (entry.isFile() && extensions.some(ext => entry.name.endsWith(ext))) {
111
+ files.push(fullPath);
112
+ }
113
+ }
114
+ } catch {}
115
+ return files;
116
+ }
117
+
118
+ /**
119
+ * Extract code chunks with context
120
+ */
121
+ function extractCodeChunks(filePath, maxSize = 1000) {
122
+ const chunks = [];
123
+ try {
124
+ const content = fs.readFileSync(filePath, "utf-8");
125
+ const lines = content.split("\n");
126
+
127
+ // Extract functions, classes, and important blocks
128
+ let currentChunk = [];
129
+ let startLine = 0;
130
+ let inFunction = false;
131
+ let inClass = false;
132
+ let braceCount = 0;
133
+
134
+ for (let i = 0; i < lines.length; i++) {
135
+ const line = lines[i];
136
+ currentChunk.push(line);
137
+
138
+ // Detect function/class start
139
+ if (line.match(/^(function|class|export\s+(function|class)|const\s+\w+\s*=|async\s+function)/)) {
140
+ startLine = i;
141
+ inFunction = true;
142
+ braceCount = (line.match(/{/g) || []).length - (line.match(/}/g) || []).length;
143
+ }
144
+
145
+ // Track braces for function boundaries
146
+ if (inFunction) {
147
+ braceCount += (line.match(/{/g) || []).length - (line.match(/}/g) || []).length;
148
+
149
+ if (braceCount <= 0 || line.trim().endsWith("}") || line.trim().endsWith("});")) {
150
+ // End of function
151
+ const chunkText = currentChunk.join("\n");
152
+ if (chunkText.length < maxSize) {
153
+ chunks.push({
154
+ text: chunkText,
155
+ file: path.relative(process.cwd(), filePath).replace(/\\/g, "/"),
156
+ startLine: startLine + 1,
157
+ endLine: i + 1,
158
+ type: "function",
159
+ });
160
+ }
161
+ currentChunk = [];
162
+ inFunction = false;
163
+ braceCount = 0;
164
+ }
165
+ }
166
+
167
+ // Split large chunks
168
+ if (currentChunk.length > 50) {
169
+ const chunkText = currentChunk.join("\n");
170
+ if (chunkText.length < maxSize) {
171
+ chunks.push({
172
+ text: chunkText,
173
+ file: path.relative(process.cwd(), filePath).replace(/\\/g, "/"),
174
+ startLine: startLine + 1,
175
+ endLine: i + 1,
176
+ type: "block",
177
+ });
178
+ }
179
+ currentChunk = [];
180
+ startLine = i + 1;
181
+ }
182
+ }
183
+
184
+ // Add remaining chunk if significant
185
+ if (currentChunk.length > 5) {
186
+ const chunkText = currentChunk.join("\n");
187
+ if (chunkText.length < maxSize) {
188
+ chunks.push({
189
+ text: chunkText,
190
+ file: path.relative(process.cwd(), filePath).replace(/\\/g, "/"),
191
+ startLine: startLine + 1,
192
+ endLine: lines.length,
193
+ type: "block",
194
+ });
195
+ }
196
+ }
197
+ } catch {}
198
+
199
+ return chunks;
200
+ }
201
+
202
+ /**
203
+ * Build semantic search index
204
+ */
205
+ function buildSearchIndex(projectPath) {
206
+ const files = findFiles(projectPath, [".ts", ".tsx", ".js", ".jsx"], 5);
207
+ const chunks = [];
208
+
209
+ // Extract code chunks
210
+ for (const file of files) {
211
+ const fileChunks = extractCodeChunks(file);
212
+ chunks.push(...fileChunks);
213
+ }
214
+
215
+ // Create vectorizer and fit
216
+ const vectorizer = new SimpleVectorizer();
217
+ const documents = chunks.map(c => c.text);
218
+ vectorizer.fit(documents);
219
+
220
+ // Create embeddings
221
+ const embeddings = chunks.map((chunk, idx) => ({
222
+ ...chunk,
223
+ vector: vectorizer.transform(chunk.text),
224
+ id: crypto.createHash("md5").update(chunk.text).digest("hex").slice(0, 8),
225
+ }));
226
+
227
+ return {
228
+ vectorizer,
229
+ embeddings,
230
+ totalChunks: chunks.length,
231
+ totalFiles: files.length,
232
+ };
233
+ }
234
+
235
+ /**
236
+ * Search code semantically
237
+ */
238
+ function semanticSearch(index, query, limit = 10) {
239
+ const queryVector = index.vectorizer.transform(query);
240
+ const results = [];
241
+
242
+ for (const embedding of index.embeddings) {
243
+ const similarity = index.vectorizer.cosineSimilarity(queryVector, embedding.vector);
244
+ if (similarity > 0.1) { // Threshold
245
+ results.push({
246
+ ...embedding,
247
+ similarity,
248
+ });
249
+ }
250
+ }
251
+
252
+ return results
253
+ .sort((a, b) => b.similarity - a.similarity)
254
+ .slice(0, limit);
255
+ }
256
+
257
+ /**
258
+ * Save search index
259
+ */
260
+ function saveSearchIndex(projectPath, index) {
261
+ const vibecheckDir = path.join(projectPath, ".vibecheck");
262
+ if (!fs.existsSync(vibecheckDir)) {
263
+ fs.mkdirSync(vibecheckDir, { recursive: true });
264
+ }
265
+
266
+ const indexData = {
267
+ version: "1.0.0",
268
+ created: new Date().toISOString(),
269
+ totalChunks: index.totalChunks,
270
+ totalFiles: index.totalFiles,
271
+ vocabulary: Array.from(index.vectorizer.vocabulary.keys()),
272
+ idf: Object.fromEntries(index.vectorizer.idf),
273
+ embeddings: index.embeddings.map(e => ({
274
+ id: e.id,
275
+ file: e.file,
276
+ startLine: e.startLine,
277
+ endLine: e.endLine,
278
+ type: e.type,
279
+ vector: e.vector,
280
+ })),
281
+ };
282
+
283
+ fs.writeFileSync(
284
+ path.join(vibecheckDir, "semantic-index.json"),
285
+ JSON.stringify(indexData, null, 2)
286
+ );
287
+ }
288
+
289
+ /**
290
+ * Load search index
291
+ */
292
+ function loadSearchIndex(projectPath) {
293
+ const indexPath = path.join(projectPath, ".vibecheck", "semantic-index.json");
294
+
295
+ if (!fs.existsSync(indexPath)) {
296
+ return null;
297
+ }
298
+
299
+ try {
300
+ const data = JSON.parse(fs.readFileSync(indexPath, "utf-8"));
301
+
302
+ // Reconstruct vectorizer
303
+ const vectorizer = new SimpleVectorizer();
304
+ data.vocabulary.forEach((term, idx) => {
305
+ vectorizer.vocabulary.set(term, idx);
306
+ });
307
+ vectorizer.idf = new Map(Object.entries(data.idf));
308
+
309
+ return {
310
+ vectorizer,
311
+ embeddings: data.embeddings,
312
+ totalChunks: data.totalChunks,
313
+ totalFiles: data.totalFiles,
314
+ };
315
+ } catch {
316
+ return null;
317
+ }
318
+ }
319
+
320
+ /**
321
+ * Generate semantic search report
322
+ */
323
+ function generateSearchReport(results, query) {
324
+ let report = `# Semantic Search Results\n\n`;
325
+ report += `Query: "${query}"\n`;
326
+ report += `Found: ${results.length} results\n\n`;
327
+
328
+ for (const result of results) {
329
+ report += `## ${result.file}:${result.startLine}-${result.endLine}\n`;
330
+ report += `**Similarity:** ${(result.similarity * 100).toFixed(1)}%\n`;
331
+ report += `**Type:** ${result.type}\n\n`;
332
+ report += `\`\`\`${path.extname(result.file).slice(1)}\n`;
333
+ report += result.text.split("\n").slice(0, 10).join("\n");
334
+ if (result.text.split("\n").length > 10) {
335
+ report += "\n...";
336
+ }
337
+ report += "\n\`\`\`\n\n";
338
+ }
339
+
340
+ return report;
341
+ }
342
+
343
+ module.exports = {
344
+ buildSearchIndex,
345
+ semanticSearch,
346
+ saveSearchIndex,
347
+ loadSearchIndex,
348
+ generateSearchReport,
349
+ SimpleVectorizer,
350
+ };