@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,404 @@
1
+ /**
2
+ * Multi-Repo Context Federation Module
3
+ * Unified context across related repositories
4
+ */
5
+
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const os = require("os");
9
+
10
+ const VIBECHECK_HOME = path.join(os.homedir(), ".vibecheck");
11
+ const FEDERATION_FILE = path.join(VIBECHECK_HOME, "repo-federation.json");
12
+
13
+ /**
14
+ * Initialize federation config
15
+ */
16
+ function initializeFederation() {
17
+ if (!fs.existsSync(VIBECHECK_HOME)) {
18
+ fs.mkdirSync(VIBECHECK_HOME, { recursive: true });
19
+ }
20
+
21
+ if (!fs.existsSync(FEDERATION_FILE)) {
22
+ fs.writeFileSync(FEDERATION_FILE, JSON.stringify({
23
+ version: "1.0.0",
24
+ groups: {},
25
+ repositories: {},
26
+ sharedArtifacts: {},
27
+ }, null, 2));
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Load federation config
33
+ */
34
+ function loadFederation() {
35
+ initializeFederation();
36
+ try {
37
+ return JSON.parse(fs.readFileSync(FEDERATION_FILE, "utf-8"));
38
+ } catch {
39
+ return { groups: {}, repositories: {}, sharedArtifacts: {} };
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Save federation config
45
+ */
46
+ function saveFederation(config) {
47
+ initializeFederation();
48
+ fs.writeFileSync(FEDERATION_FILE, JSON.stringify(config, null, 2));
49
+ }
50
+
51
+ /**
52
+ * Register repository in federation
53
+ */
54
+ function registerRepository(repoPath, options = {}) {
55
+ const config = loadFederation();
56
+ const repoId = path.basename(repoPath);
57
+
58
+ // Detect repo type and patterns
59
+ const packageJsonPath = path.join(repoPath, "package.json");
60
+ let repoInfo = {
61
+ id: repoId,
62
+ path: repoPath,
63
+ type: "unknown",
64
+ registered: new Date().toISOString(),
65
+ ...options,
66
+ };
67
+
68
+ if (fs.existsSync(packageJsonPath)) {
69
+ try {
70
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
71
+ repoInfo.type = pkg.private ? "private" : "public";
72
+ repoInfo.name = pkg.name;
73
+ repoInfo.description = pkg.description;
74
+ repoInfo.dependencies = Object.keys(pkg.dependencies || {});
75
+ repoInfo.devDependencies = Object.keys(pkg.devDependencies || {});
76
+
77
+ // Detect framework
78
+ if (pkg.dependencies?.next) repoInfo.framework = "Next.js";
79
+ else if (pkg.dependencies?.react) repoInfo.framework = "React";
80
+ else if (pkg.dependencies?.express) repoInfo.framework = "Express";
81
+ else if (pkg.dependencies?.vue) repoInfo.framework = "Vue";
82
+ } catch {}
83
+ }
84
+
85
+ config.repositories[repoId] = repoInfo;
86
+
87
+ // Auto-add to groups based on patterns
88
+ if (repoInfo.framework) {
89
+ const groupName = `${repoInfo.framework.toLowerCase()}-projects`;
90
+ if (!config.groups[groupName]) {
91
+ config.groups[groupName] = {
92
+ name: groupName,
93
+ description: `${repoInfo.framework} projects`,
94
+ repositories: [],
95
+ };
96
+ }
97
+ if (!config.groups[groupName].repositories.includes(repoId)) {
98
+ config.groups[groupName].repositories.push(repoId);
99
+ }
100
+ }
101
+
102
+ saveFederation(config);
103
+ return repoInfo;
104
+ }
105
+
106
+ /**
107
+ * Create repository group
108
+ */
109
+ function createGroup(name, description, repoIds = []) {
110
+ const config = loadFederation();
111
+
112
+ config.groups[name] = {
113
+ name,
114
+ description,
115
+ repositories: repoIds,
116
+ created: new Date().toISOString(),
117
+ };
118
+
119
+ saveFederation(config);
120
+ }
121
+
122
+ /**
123
+ * Get shared artifacts across repositories
124
+ */
125
+ function getSharedArtifacts(groupName = null) {
126
+ const config = loadFederation();
127
+ const artifacts = {
128
+ components: new Map(),
129
+ hooks: new Map(),
130
+ utilities: new Map(),
131
+ types: new Map(),
132
+ patterns: new Map(),
133
+ };
134
+
135
+ const repos = groupName
136
+ ? config.groups[groupName]?.repositories || []
137
+ : Object.keys(config.repositories);
138
+
139
+ for (const repoId of repos) {
140
+ const repo = config.repositories[repoId];
141
+ if (!repo) continue;
142
+
143
+ // Load context from each repo
144
+ const contextFile = path.join(repo.path, ".vibecheck", "context.json");
145
+ if (fs.existsSync(contextFile)) {
146
+ try {
147
+ const context = JSON.parse(fs.readFileSync(contextFile, "utf-8"));
148
+
149
+ // Collect components
150
+ if (context.structure?.components) {
151
+ for (const comp of context.structure.components) {
152
+ if (!artifacts.components.has(comp)) {
153
+ artifacts.components.set(comp, []);
154
+ }
155
+ artifacts.components.get(comp).push({
156
+ repo: repoId,
157
+ path: comp,
158
+ framework: context.project?.framework,
159
+ });
160
+ }
161
+ }
162
+
163
+ // Collect hooks
164
+ if (context.patterns?.hooks) {
165
+ for (const hook of context.patterns.hooks) {
166
+ if (!artifacts.hooks.has(hook)) {
167
+ artifacts.hooks.set(hook, []);
168
+ }
169
+ artifacts.hooks.get(hook).push({
170
+ repo: repoId,
171
+ name: hook,
172
+ });
173
+ }
174
+ }
175
+
176
+ // Collect patterns
177
+ if (context.patterns?.stateManagement) {
178
+ const pattern = context.patterns.stateManagement;
179
+ if (!artifacts.patterns.has(pattern)) {
180
+ artifacts.patterns.set(pattern, []);
181
+ }
182
+ artifacts.patterns.get(pattern).push(repoId);
183
+ }
184
+
185
+ // Collect types
186
+ if (context.types?.interfaces) {
187
+ for (const type of context.types.interfaces) {
188
+ if (!artifacts.types.has(type)) {
189
+ artifacts.types.set(type, []);
190
+ }
191
+ artifacts.types.get(type).push({
192
+ repo: repoId,
193
+ interface: type,
194
+ });
195
+ }
196
+ }
197
+ } catch {}
198
+ }
199
+ }
200
+
201
+ // Convert Maps to arrays and filter for shared items
202
+ const shared = {};
203
+ for (const [key, map] of Object.entries(artifacts)) {
204
+ shared[key] = Array.from(map.entries())
205
+ .filter(([_, items]) => items.length > 1) // Only keep items shared across repos
206
+ .map(([name, items]) => ({
207
+ name,
208
+ repositories: items,
209
+ count: items.length,
210
+ }))
211
+ .sort((a, b) => b.count - a.count);
212
+ }
213
+
214
+ return shared;
215
+ }
216
+
217
+ /**
218
+ * Generate federated context
219
+ */
220
+ function generateFederatedContext(groupName = null, options = {}) {
221
+ const { maxTokens = 8000, includePatterns = true } = options;
222
+ const config = loadFederation();
223
+
224
+ const repos = groupName
225
+ ? config.groups[groupName]?.repositories || []
226
+ : Object.keys(config.repositories);
227
+
228
+ const federated = {
229
+ version: "1.0.0",
230
+ generated: new Date().toISOString(),
231
+ group: groupName,
232
+ repositories: repos.map(id => ({
233
+ id,
234
+ ...config.repositories[id],
235
+ })),
236
+ sharedArtifacts: getSharedArtifacts(groupName),
237
+ context: {
238
+ components: [],
239
+ hooks: [],
240
+ patterns: [],
241
+ types: [],
242
+ },
243
+ stats: {
244
+ totalRepos: repos.length,
245
+ sharedComponents: 0,
246
+ sharedHooks: 0,
247
+ sharedPatterns: 0,
248
+ },
249
+ };
250
+
251
+ // Build unified context
252
+ let totalTokens = 0;
253
+
254
+ // Add shared components
255
+ for (const comp of federated.sharedArtifacts.components.slice(0, 20)) {
256
+ if (totalTokens > maxTokens * 0.4) break;
257
+
258
+ federated.context.components.push({
259
+ name: comp.name,
260
+ usage: comp.repositories,
261
+ example: comp.repositories[0],
262
+ });
263
+ federated.stats.sharedComponents++;
264
+ }
265
+
266
+ // Add shared hooks
267
+ for (const hook of federated.sharedArtifacts.hooks.slice(0, 15)) {
268
+ if (totalTokens > maxTokens * 0.6) break;
269
+
270
+ federated.context.hooks.push({
271
+ name: hook.name,
272
+ repos: hook.repositories,
273
+ });
274
+ federated.stats.sharedHooks++;
275
+ }
276
+
277
+ // Add shared patterns
278
+ for (const pattern of federated.sharedArtifacts.patterns) {
279
+ if (totalTokens > maxTokens * 0.8) break;
280
+
281
+ federated.context.patterns.push({
282
+ name: pattern.name,
283
+ repos: pattern.repositories,
284
+ });
285
+ federated.stats.sharedPatterns++;
286
+ }
287
+
288
+ return federated;
289
+ }
290
+
291
+ /**
292
+ * Find related repositories
293
+ */
294
+ function findRelatedRepositories(repoPath, limit = 5) {
295
+ const config = loadFederation();
296
+ const repoId = path.basename(repoPath);
297
+ const repo = config.repositories[repoId];
298
+
299
+ if (!repo) return [];
300
+
301
+ const related = [];
302
+
303
+ // Find repos with similar dependencies
304
+ for (const [id, otherRepo] of Object.entries(config.repositories)) {
305
+ if (id === repoId) continue;
306
+
307
+ let similarity = 0;
308
+
309
+ // Same framework
310
+ if (repo.framework === otherRepo.framework) {
311
+ similarity += 3;
312
+ }
313
+
314
+ // Shared dependencies
315
+ const sharedDeps = (repo.dependencies || []).filter(d =>
316
+ (otherRepo.dependencies || []).includes(d)
317
+ ).length;
318
+ similarity += sharedDeps * 0.5;
319
+
320
+ // Same type (private/public)
321
+ if (repo.type === otherRepo.type) {
322
+ similarity += 1;
323
+ }
324
+
325
+ if (similarity > 0) {
326
+ related.push({
327
+ id,
328
+ ...otherRepo,
329
+ similarity,
330
+ });
331
+ }
332
+ }
333
+
334
+ return related
335
+ .sort((a, b) => b.similarity - a.similarity)
336
+ .slice(0, limit);
337
+ }
338
+
339
+ /**
340
+ * Sync federation with remote
341
+ */
342
+ function syncFederation(remoteUrl) {
343
+ // In a real implementation, this would sync with a remote service
344
+ // For now, just mark as synced
345
+ const config = loadFederation();
346
+ config.lastSync = new Date().toISOString();
347
+ config.remoteUrl = remoteUrl;
348
+ saveFederation(config);
349
+ }
350
+
351
+ /**
352
+ * Generate federation report
353
+ */
354
+ function generateFederationReport(federated) {
355
+ let report = `# Multi-Repository Federation Report\n\n`;
356
+ report += `Generated: ${new Date(federated.generated).toLocaleString()}\n`;
357
+ report += `Group: ${federated.group || "All"}\n`;
358
+ report += `Repositories: ${federated.stats.totalRepos}\n\n`;
359
+
360
+ // Repositories
361
+ report += `## Repositories\n\n`;
362
+ for (const repo of federated.repositories) {
363
+ report += `- **${repo.name || repo.id}** (${repo.framework || "Unknown"})\n`;
364
+ report += ` - Path: ${repo.path}\n`;
365
+ report += ` - Dependencies: ${repo.dependencies?.length || 0}\n`;
366
+ }
367
+
368
+ // Shared artifacts
369
+ report += `\n## Shared Artifacts\n\n`;
370
+
371
+ if (federated.sharedArtifacts.components.length > 0) {
372
+ report += `### Components (${federated.stats.sharedComponents})\n\n`;
373
+ for (const comp of federated.sharedArtifacts.components.slice(0, 10)) {
374
+ report += `- **${comp.name}** - Used in ${comp.count} repos\n`;
375
+ }
376
+ }
377
+
378
+ if (federated.sharedArtifacts.hooks.length > 0) {
379
+ report += `\n### Hooks (${federated.stats.sharedHooks})\n\n`;
380
+ for (const hook of federated.sharedArtifacts.hooks.slice(0, 10)) {
381
+ report += `- **${hook.name}** - Used in ${hook.count} repos\n`;
382
+ }
383
+ }
384
+
385
+ if (federated.sharedArtifacts.patterns.length > 0) {
386
+ report += `\n### Patterns (${federated.stats.sharedPatterns})\n\n`;
387
+ for (const pattern of federated.sharedArtifacts.patterns) {
388
+ report += `- **${pattern.name}** - Used in ${pattern.count} repos\n`;
389
+ }
390
+ }
391
+
392
+ return report;
393
+ }
394
+
395
+ module.exports = {
396
+ registerRepository,
397
+ createGroup,
398
+ getSharedArtifacts,
399
+ generateFederatedContext,
400
+ findRelatedRepositories,
401
+ syncFederation,
402
+ generateFederationReport,
403
+ loadFederation,
404
+ };
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Pattern Detection Module
3
+ * Detects code patterns, hooks, state management, styling, and anti-patterns
4
+ */
5
+
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+
9
+ /**
10
+ * Find files recursively (local helper)
11
+ */
12
+ function findFiles(dir, extensions, maxDepth = 5, currentDepth = 0) {
13
+ if (currentDepth >= maxDepth || !fs.existsSync(dir)) return [];
14
+
15
+ const files = [];
16
+ try {
17
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
18
+ for (const entry of entries) {
19
+ const fullPath = path.join(dir, entry.name);
20
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
21
+ files.push(...findFiles(fullPath, extensions, maxDepth, currentDepth + 1));
22
+ } else if (entry.isFile() && extensions.some(ext => entry.name.endsWith(ext))) {
23
+ files.push(fullPath);
24
+ }
25
+ }
26
+ } catch {}
27
+ return files;
28
+ }
29
+
30
+ /**
31
+ * Extract a function example from code
32
+ */
33
+ function extractFunctionExample(content, functionName) {
34
+ const regex = new RegExp(`(export\\s+)?(function|const)\\s+${functionName}[^{]*\\{`, 'g');
35
+ const match = regex.exec(content);
36
+ if (!match) return null;
37
+
38
+ const startIndex = match.index;
39
+ let braceCount = 0;
40
+ let endIndex = startIndex;
41
+ let started = false;
42
+
43
+ for (let i = startIndex; i < content.length && i < startIndex + 500; i++) {
44
+ if (content[i] === '{') {
45
+ braceCount++;
46
+ started = true;
47
+ } else if (content[i] === '}') {
48
+ braceCount--;
49
+ }
50
+ if (started && braceCount === 0) {
51
+ endIndex = i + 1;
52
+ break;
53
+ }
54
+ }
55
+
56
+ const example = content.slice(startIndex, endIndex);
57
+ return example.length < 400 ? example : example.slice(0, 400) + '\n // ...';
58
+ }
59
+
60
+ /**
61
+ * Detect anti-patterns in code
62
+ */
63
+ function detectAntiPatterns(content, filePath, antiPatterns) {
64
+ // Console.log in production code
65
+ if (!filePath.includes('.test.') && !filePath.includes('.spec.') && !filePath.includes('__tests__')) {
66
+ if (/console\.(log|error|warn)\(/.test(content)) {
67
+ const existing = antiPatterns.find(a => a.type === 'console-log');
68
+ if (!existing) {
69
+ antiPatterns.push({
70
+ type: 'console-log',
71
+ severity: 'warning',
72
+ message: 'Console statements found in production code',
73
+ suggestion: 'Use a proper logger or remove before production',
74
+ });
75
+ }
76
+ }
77
+ }
78
+
79
+ // Any type usage
80
+ if (/:\s*any\b/.test(content)) {
81
+ const existing = antiPatterns.find(a => a.type === 'any-type');
82
+ if (!existing) {
83
+ antiPatterns.push({
84
+ type: 'any-type',
85
+ severity: 'warning',
86
+ message: 'Usage of `any` type detected',
87
+ suggestion: 'Use proper TypeScript types or `unknown`',
88
+ });
89
+ }
90
+ }
91
+
92
+ // Hardcoded secrets
93
+ if (/(api[_-]?key|password|secret|token)\s*[:=]\s*['"][^'"]+['"]/i.test(content)) {
94
+ const existing = antiPatterns.find(a => a.type === 'hardcoded-secret');
95
+ if (!existing) {
96
+ antiPatterns.push({
97
+ type: 'hardcoded-secret',
98
+ severity: 'error',
99
+ message: 'Potential hardcoded secrets detected',
100
+ suggestion: 'Use environment variables for sensitive data',
101
+ });
102
+ }
103
+ }
104
+
105
+ // Mock data patterns
106
+ if (/(jsonplaceholder|reqres\.in|mockapi|faker|fake[A-Z])/i.test(content)) {
107
+ const existing = antiPatterns.find(a => a.type === 'mock-data');
108
+ if (!existing) {
109
+ antiPatterns.push({
110
+ type: 'mock-data',
111
+ severity: 'warning',
112
+ message: 'Mock data or fake APIs detected',
113
+ suggestion: 'Replace with real API endpoints before production',
114
+ });
115
+ }
116
+ }
117
+
118
+ // TODO/FIXME comments
119
+ if (/\/\/\s*(TODO|FIXME|HACK|XXX):/i.test(content)) {
120
+ const existing = antiPatterns.find(a => a.type === 'todo-comments');
121
+ if (!existing) {
122
+ antiPatterns.push({
123
+ type: 'todo-comments',
124
+ severity: 'info',
125
+ message: 'TODO/FIXME comments found',
126
+ suggestion: 'Address these items before shipping',
127
+ });
128
+ }
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Deep pattern detection - analyzes actual code patterns
134
+ */
135
+ function detectPatterns(projectPath) {
136
+ const patterns = {
137
+ hooks: [],
138
+ stateManagement: null,
139
+ styling: [],
140
+ testing: [],
141
+ dataFetching: [],
142
+ validation: null,
143
+ authentication: null,
144
+ codeExamples: {},
145
+ antiPatterns: [],
146
+ };
147
+
148
+ const srcFiles = findFiles(projectPath, [".ts", ".tsx", ".js", ".jsx"], 6);
149
+
150
+ for (const file of srcFiles.slice(0, 100)) {
151
+ try {
152
+ const content = fs.readFileSync(file, "utf-8");
153
+ const relativePath = path.relative(projectPath, file);
154
+
155
+ // Detect custom hooks
156
+ const hookMatches = content.match(/export\s+(function|const)\s+(use[A-Z]\w+)/g);
157
+ if (hookMatches) {
158
+ hookMatches.forEach(match => {
159
+ const hookName = match.match(/use[A-Z]\w+/)?.[0];
160
+ if (hookName && !patterns.hooks.includes(hookName)) {
161
+ patterns.hooks.push(hookName);
162
+ if (!patterns.codeExamples.hooks) {
163
+ const hookExample = extractFunctionExample(content, hookName);
164
+ if (hookExample) {
165
+ patterns.codeExamples.hooks = { name: hookName, code: hookExample, file: relativePath };
166
+ }
167
+ }
168
+ }
169
+ });
170
+ }
171
+
172
+ // Detect state management
173
+ if (content.includes("zustand") || content.includes("create(")) {
174
+ patterns.stateManagement = "Zustand";
175
+ } else if (content.includes("@reduxjs/toolkit") || content.includes("createSlice")) {
176
+ patterns.stateManagement = "Redux Toolkit";
177
+ } else if (content.includes("recoil") || content.includes("atom(")) {
178
+ patterns.stateManagement = "Recoil";
179
+ } else if (content.includes("jotai")) {
180
+ patterns.stateManagement = "Jotai";
181
+ } else if (content.includes("createContext") && !patterns.stateManagement) {
182
+ patterns.stateManagement = "React Context";
183
+ }
184
+
185
+ // Detect styling patterns
186
+ if (content.includes("styled-components") || content.includes("styled.")) {
187
+ if (!patterns.styling.includes("Styled Components")) patterns.styling.push("Styled Components");
188
+ }
189
+ if (content.includes("@emotion") || content.includes("css``")) {
190
+ if (!patterns.styling.includes("Emotion")) patterns.styling.push("Emotion");
191
+ }
192
+ if (content.includes("className=") && content.includes("tailwind")) {
193
+ if (!patterns.styling.includes("Tailwind CSS")) patterns.styling.push("Tailwind CSS");
194
+ }
195
+ if (content.includes(".module.css") || content.includes(".module.scss")) {
196
+ if (!patterns.styling.includes("CSS Modules")) patterns.styling.push("CSS Modules");
197
+ }
198
+
199
+ // Detect data fetching patterns
200
+ if (content.includes("@tanstack/react-query") || content.includes("useQuery")) {
201
+ if (!patterns.dataFetching.includes("TanStack Query")) patterns.dataFetching.push("TanStack Query");
202
+ }
203
+ if (content.includes("useSWR") || content.includes("swr")) {
204
+ if (!patterns.dataFetching.includes("SWR")) patterns.dataFetching.push("SWR");
205
+ }
206
+ if (content.includes("trpc") || content.includes("createTRPCReact")) {
207
+ if (!patterns.dataFetching.includes("tRPC")) patterns.dataFetching.push("tRPC");
208
+ }
209
+
210
+ // Detect validation
211
+ if (content.includes("zod") || content.includes("z.object")) {
212
+ patterns.validation = "Zod";
213
+ } else if (content.includes("yup") && !patterns.validation) {
214
+ patterns.validation = "Yup";
215
+ }
216
+
217
+ // Detect authentication
218
+ if (content.includes("next-auth") || content.includes("NextAuth")) {
219
+ patterns.authentication = "NextAuth.js";
220
+ } else if (content.includes("clerk") || content.includes("@clerk")) {
221
+ patterns.authentication = "Clerk";
222
+ } else if (content.includes("supabase") && content.includes("auth")) {
223
+ patterns.authentication = "Supabase Auth";
224
+ }
225
+
226
+ // Detect testing patterns
227
+ if (content.includes("@testing-library") || content.includes("render(")) {
228
+ if (!patterns.testing.includes("React Testing Library")) patterns.testing.push("React Testing Library");
229
+ }
230
+ if (content.includes("vitest") || content.includes("vi.mock")) {
231
+ if (!patterns.testing.includes("Vitest")) patterns.testing.push("Vitest");
232
+ }
233
+ if (content.includes("jest") || content.includes("describe(")) {
234
+ if (!patterns.testing.includes("Jest")) patterns.testing.push("Jest");
235
+ }
236
+ if (content.includes("playwright") || content.includes("@playwright")) {
237
+ if (!patterns.testing.includes("Playwright")) patterns.testing.push("Playwright");
238
+ }
239
+
240
+ // Detect anti-patterns
241
+ detectAntiPatterns(content, relativePath, patterns.antiPatterns);
242
+
243
+ } catch {}
244
+ }
245
+
246
+ return patterns;
247
+ }
248
+
249
+ module.exports = {
250
+ detectPatterns,
251
+ detectAntiPatterns,
252
+ extractFunctionExample,
253
+ };