@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,151 @@
1
+ /**
2
+ * MCP Context JSON Generator
3
+ * Generates .vibecheck/context.json for MCP servers
4
+ */
5
+
6
+ /**
7
+ * Generate universal context JSON for MCP
8
+ */
9
+ function generateContextJson(analysis, projectPath) {
10
+ const p = analysis.patterns || {};
11
+ const m = analysis.monorepo || {};
12
+
13
+ return JSON.stringify({
14
+ version: "3.0.0",
15
+ generatedAt: new Date().toISOString(),
16
+ generator: "vibecheck-context",
17
+
18
+ project: {
19
+ name: analysis.name,
20
+ path: projectPath,
21
+ framework: analysis.framework,
22
+ language: analysis.language,
23
+ architecture: analysis.architecture,
24
+ },
25
+
26
+ techStack: {
27
+ nextjs: analysis.hasNextjs,
28
+ react: analysis.hasReact,
29
+ typescript: analysis.hasTypescript,
30
+ prisma: analysis.hasPrisma,
31
+ tailwind: analysis.hasTailwind,
32
+ stateManagement: p.stateManagement,
33
+ validation: p.validation,
34
+ authentication: p.authentication,
35
+ dataFetching: p.dataFetching || [],
36
+ testing: p.testing || [],
37
+ styling: p.styling || [],
38
+ },
39
+
40
+ structure: {
41
+ directories: analysis.directories,
42
+ components: analysis.components,
43
+ apiRoutes: analysis.apiRoutes,
44
+ models: analysis.models,
45
+ },
46
+
47
+ patterns: {
48
+ hooks: p.hooks || [],
49
+ stateManagement: p.stateManagement,
50
+ validation: p.validation,
51
+ authentication: p.authentication,
52
+ dataFetching: p.dataFetching || [],
53
+ styling: p.styling || [],
54
+ testing: p.testing || [],
55
+ codeExamples: p.codeExamples || {},
56
+ },
57
+
58
+ antiPatterns: p.antiPatterns || [],
59
+
60
+ types: {
61
+ interfaces: analysis.types?.interfaces || [],
62
+ types: analysis.types?.types || [],
63
+ enums: analysis.types?.enums || [],
64
+ },
65
+
66
+ environment: {
67
+ files: analysis.envVars?.files || [],
68
+ variables: analysis.envVars?.variables || [],
69
+ },
70
+
71
+ scripts: analysis.scripts || [],
72
+
73
+ conventions: {
74
+ naming: analysis.conventions?.naming || {},
75
+ imports: analysis.imports?.importPatterns || [],
76
+ },
77
+
78
+ monorepo: m.isMonorepo ? {
79
+ type: m.type,
80
+ tools: m.tools || [],
81
+ workspaces: m.workspaces?.map(w => ({
82
+ name: w.name,
83
+ path: w.path,
84
+ description: w.description,
85
+ })) || [],
86
+ sharedPackages: m.sharedPackages || [],
87
+ } : null,
88
+
89
+ stats: {
90
+ totalFiles: analysis.stats?.totalFiles || 0,
91
+ totalLines: analysis.stats?.totalLines || 0,
92
+ byExtension: analysis.stats?.byExtension || {},
93
+ largestFiles: analysis.stats?.largestFiles || [],
94
+ },
95
+
96
+ rules: {
97
+ critical: [
98
+ "Never hardcode secrets - use environment variables",
99
+ "No mock data in production code",
100
+ `No 'any' types - use proper TypeScript types`,
101
+ "Follow existing patterns in the codebase",
102
+ "Use existing components before creating new ones",
103
+ "API routes must validate all input",
104
+ ],
105
+ style: [
106
+ `File naming: ${analysis.conventions?.naming?.components || "PascalCase"} for components`,
107
+ "Use path aliases (@/) for imports",
108
+ analysis.hasTailwind ? "Use Tailwind CSS for styling" : null,
109
+ p.stateManagement ? `Use ${p.stateManagement} for state management` : null,
110
+ p.validation ? `Use ${p.validation} for validation` : null,
111
+ ].filter(Boolean),
112
+ },
113
+
114
+ mcp: {
115
+ resources: [
116
+ {
117
+ uri: `file://${projectPath}/.vibecheck/context.json`,
118
+ name: "Project Context",
119
+ description: "Full project analysis and context",
120
+ mimeType: "application/json",
121
+ },
122
+ {
123
+ uri: `file://${projectPath}/.vibecheck/project-map.json`,
124
+ name: "Project Map",
125
+ description: "Complete project structure map",
126
+ mimeType: "application/json",
127
+ },
128
+ {
129
+ uri: `file://${projectPath}/.vibecheck/memory.json`,
130
+ name: "AI Memory",
131
+ description: "AI learning memory for this project",
132
+ mimeType: "application/json",
133
+ },
134
+ ],
135
+ tools: [
136
+ {
137
+ name: "vibecheck.context",
138
+ description: "Regenerate project context",
139
+ },
140
+ {
141
+ name: "vibecheck.analyze",
142
+ description: "Analyze specific file or directory",
143
+ },
144
+ ],
145
+ },
146
+ }, null, 2);
147
+ }
148
+
149
+ module.exports = {
150
+ generateContextJson,
151
+ };
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Windsurf Rules Generator
3
+ * Generates .windsurf/rules/*.md files for Windsurf Cascade
4
+ */
5
+
6
+ /**
7
+ * Generate Windsurf rules files
8
+ */
9
+ function generateWindsurfRules(analysis) {
10
+ const rules = {};
11
+ const p = analysis.patterns || {};
12
+ const m = analysis.monorepo || {};
13
+
14
+ // Project context
15
+ rules["project-context"] = `# Project Context - ${analysis.name}
16
+
17
+ ## Overview
18
+ - **Framework:** ${analysis.framework || "Unknown"}
19
+ - **Language:** ${analysis.language || "JavaScript"}
20
+ - **Architecture:** ${analysis.architecture}
21
+ ${m.isMonorepo ? `- **Monorepo:** ${m.type} with ${m.workspaces?.length || 0} workspaces` : ""}
22
+
23
+ ## Tech Stack
24
+ ${analysis.hasNextjs ? "- Next.js" : ""}
25
+ ${analysis.hasReact ? "- React" : ""}
26
+ ${analysis.hasTypescript ? "- TypeScript" : ""}
27
+ ${analysis.hasPrisma ? "- Prisma ORM" : ""}
28
+ ${analysis.hasTailwind ? "- Tailwind CSS" : ""}
29
+ ${p.stateManagement ? `- ${p.stateManagement}` : ""}
30
+ ${p.validation ? `- ${p.validation}` : ""}
31
+ ${p.authentication ? `- ${p.authentication}` : ""}
32
+
33
+ ## Directory Structure
34
+ ${analysis.directories.map(d => `- \`${d}/\``).join("\n")}
35
+
36
+ ${m.isMonorepo && m.workspaces?.length > 0 ? `## Workspaces
37
+ ${m.workspaces.slice(0, 10).map(w => `- \`${w.path}\` - ${w.name}`).join("\n")}
38
+ ` : ""}
39
+
40
+ ## Components (${analysis.components.length})
41
+ ${analysis.components.slice(0, 25).map(c => `- ${c}`).join("\n") || "None detected"}
42
+
43
+ ${p.hooks?.length > 0 ? `## Custom Hooks (${p.hooks.length})
44
+ ${p.hooks.slice(0, 15).map(h => `- \`${h}\``).join("\n")}
45
+ ` : ""}
46
+
47
+ ## API Routes (${analysis.apiRoutes.length})
48
+ ${analysis.apiRoutes.slice(0, 15).map(r => `- ${r}`).join("\n") || "None detected"}
49
+
50
+ ${analysis.models.length > 0 ? `## Data Models
51
+ ${analysis.models.map(m => `- ${m}`).join("\n")}
52
+ ` : ""}
53
+
54
+ ${analysis.envVars?.variables?.length > 0 ? `## Environment Variables
55
+ ${analysis.envVars.variables.slice(0, 15).map(v => `- \`${v}\``).join("\n")}
56
+ ` : ""}
57
+
58
+ ---
59
+ *Context Enhanced by vibecheck AI*
60
+ `;
61
+
62
+ // Coding standards
63
+ rules["coding-standards"] = `# Coding Standards
64
+
65
+ ## File Naming
66
+ - Components: ${analysis.conventions.naming.components || "PascalCase"} (e.g., \`Button.tsx\`)
67
+ - Utilities: camelCase (e.g., \`formatDate.ts\`)
68
+ - Types: \`.types.ts\` or \`.d.ts\` suffix
69
+
70
+ ## Import Order
71
+ 1. React/Next.js imports
72
+ 2. Third-party libraries
73
+ 3. Internal components (\`@/components/\`)
74
+ 4. Internal utilities (\`@/lib/\`, \`@/utils/\`)
75
+ 5. Types
76
+ 6. Styles
77
+
78
+ ## Code Style
79
+ ${analysis.hasTypescript ? "- TypeScript with strict mode enabled" : "- JavaScript with JSDoc comments"}
80
+ - Functional components with hooks
81
+ - Path aliases (\`@/\`) for imports
82
+ ${analysis.hasTailwind ? "- Tailwind CSS for styling" : ""}
83
+ ${p.stateManagement ? `- ${p.stateManagement} for state management` : ""}
84
+ ${p.validation ? `- ${p.validation} for validation` : ""}
85
+
86
+ ## Critical Rules
87
+
88
+ 1. **No hardcoded secrets** - Use environment variables
89
+ 2. **No \`any\` types** - Use proper TypeScript types
90
+ 3. **No mock data in production** - Real API endpoints only
91
+ 4. **Validate all inputs** - Never trust client data
92
+ 5. **Use existing components** - Check before creating new ones
93
+ ${p.hooks?.length ? `6. **Use existing hooks** - ${p.hooks.slice(0, 3).join(", ")}...` : ""}
94
+
95
+ ${p.antiPatterns?.length > 0 ? `## ⚠️ Avoid These
96
+ ${p.antiPatterns.map(ap => `- ${ap.message}: ${ap.suggestion}`).join("\n")}
97
+ ` : ""}
98
+
99
+ ## When Creating New Files
100
+ 1. Check if similar file exists
101
+ 2. Place in correct directory
102
+ 3. Follow naming conventions
103
+ 4. Add proper types
104
+ 5. Use existing patterns
105
+ `;
106
+
107
+ // API patterns
108
+ if (analysis.apiRoutes.length > 0 || analysis.hasPrisma) {
109
+ rules["api-patterns"] = `# API & Data Patterns
110
+
111
+ ${analysis.hasPrisma ? `## Database (Prisma)
112
+
113
+ ### Available Models
114
+ ${analysis.models.map(m => `- ${m}`).join("\n")}
115
+
116
+ ### Usage
117
+ \`\`\`typescript
118
+ import { prisma } from '@/lib/prisma'
119
+
120
+ // Query
121
+ const users = await prisma.user.findMany()
122
+
123
+ // Create with validation
124
+ const user = await prisma.user.create({
125
+ data: validatedInput
126
+ })
127
+ \`\`\`
128
+
129
+ ### Rules
130
+ - Always import from \`@/lib/prisma\`
131
+ - Use transactions for multi-step operations
132
+ - Handle errors gracefully
133
+ - Never expose raw errors to client
134
+ ` : ""}
135
+
136
+ ${analysis.apiRoutes.length > 0 ? `## API Routes
137
+
138
+ ### Existing Endpoints
139
+ ${analysis.apiRoutes.slice(0, 20).map(r => `- \`${r}\``).join("\n")}
140
+
141
+ ### API Response Pattern
142
+ \`\`\`typescript
143
+ // Success
144
+ return Response.json({ data, success: true })
145
+
146
+ // Error
147
+ return Response.json({ error: message }, { status: 400 })
148
+ \`\`\`
149
+
150
+ ### Validation
151
+ ${p.validation ? `Use ${p.validation} for input validation:
152
+ \`\`\`typescript
153
+ const schema = z.object({ name: z.string() })
154
+ const data = schema.parse(await req.json())
155
+ \`\`\`` : "Always validate input before processing"}
156
+ ` : ""}
157
+
158
+ ${p.dataFetching?.length ? `## Data Fetching: ${p.dataFetching.join(", ")}
159
+
160
+ ${p.dataFetching.includes("TanStack Query") ? `### TanStack Query
161
+ \`\`\`typescript
162
+ const { data, isLoading } = useQuery({
163
+ queryKey: ['resource'],
164
+ queryFn: fetchResource,
165
+ })
166
+ \`\`\`` : ""}
167
+ ${p.dataFetching.includes("SWR") ? `### SWR
168
+ \`\`\`typescript
169
+ const { data, error } = useSWR('/api/resource', fetcher)
170
+ \`\`\`` : ""}
171
+ ` : ""}
172
+ `;
173
+ }
174
+
175
+ return rules;
176
+ }
177
+
178
+ module.exports = {
179
+ generateWindsurfRules,
180
+ };
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Git-Aware Context Module
3
+ * Extracts commit patterns, branch conventions, and PR templates
4
+ */
5
+
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const { execSync } = require("child_process");
9
+
10
+ /**
11
+ * Check if directory is a git repository
12
+ */
13
+ function isGitRepo(projectPath) {
14
+ return fs.existsSync(path.join(projectPath, ".git"));
15
+ }
16
+
17
+ /**
18
+ * Execute git command safely
19
+ */
20
+ function execGit(command, cwd = process.cwd()) {
21
+ try {
22
+ return execSync(command, { cwd, encoding: "utf-8" }).trim();
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Get recent commits with patterns
30
+ */
31
+ function getRecentCommits(projectPath, limit = 20) {
32
+ if (!isGitRepo(projectPath)) return null;
33
+
34
+ const output = execGit(`log --oneline -${limit}`, projectPath);
35
+ if (!output) return null;
36
+
37
+ const commits = output.split("\n").map(line => {
38
+ const [hash, ...messageParts] = line.split(" ");
39
+ const message = messageParts.join(" ");
40
+
41
+ // Detect patterns
42
+ const patterns = {
43
+ hasTicket: /(FEAT|FIX|CHORE|DOCS|REFACTOR|TEST|PERF)-\d+/i.test(message),
44
+ ticketType: message.match(/(FEAT|FIX|CHORE|DOCS|REFACTOR|TEST|PERF)-\d+/i)?.[1],
45
+ isBreaking: /BREAKING CHANGE/i.test(message),
46
+ hasScope: /\([^)]+\):/.test(message),
47
+ scope: message.match(/\(([^)]+)\):/)?.[1],
48
+ isWIP: /wip|work in progress/i.test(message),
49
+ isMerge: /^Merge /i.test(message),
50
+ };
51
+
52
+ return {
53
+ hash,
54
+ message,
55
+ patterns,
56
+ };
57
+ });
58
+
59
+ // Analyze patterns
60
+ const analysis = {
61
+ totalCommits: commits.length,
62
+ withTickets: commits.filter(c => c.patterns.hasTicket).length,
63
+ breakingChanges: commits.filter(c => c.patterns.isBreaking).length,
64
+ withScopes: commits.filter(c => c.patterns.hasScope).length,
65
+ commonScopes: {},
66
+ ticketTypes: {},
67
+ };
68
+
69
+ // Count common patterns
70
+ for (const commit of commits) {
71
+ if (commit.patterns.scope) {
72
+ analysis.commonScopes[commit.patterns.scope] = (analysis.commonScopes[commit.patterns.scope] || 0) + 1;
73
+ }
74
+ if (commit.patterns.ticketType) {
75
+ analysis.ticketTypes[commit.patterns.ticketType] = (analysis.ticketTypes[commit.patterns.ticketType] || 0) + 1;
76
+ }
77
+ }
78
+
79
+ return {
80
+ commits,
81
+ analysis,
82
+ };
83
+ }
84
+
85
+ /**
86
+ * Get branch information and conventions
87
+ */
88
+ function getBranchInfo(projectPath) {
89
+ if (!isGitRepo(projectPath)) return null;
90
+
91
+ const currentBranch = execGit("branch --show-current", projectPath);
92
+ const allBranches = execGit("branch -a", projectPath);
93
+ const defaultBranch = execGit("symbolic-ref refs/remotes/origin/HEAD | sed 's@^.*/@@'", projectPath);
94
+
95
+ if (!currentBranch || !allBranches) return null;
96
+
97
+ const branches = allBranches.split("\n").map(b => b.replace("*", "").trim());
98
+ const localBranches = branches.filter(b => !b.startsWith("remotes/"));
99
+ const remoteBranches = branches.filter(b => b.startsWith("remotes/")).map(b => b.replace("remotes/origin/", ""));
100
+
101
+ // Analyze naming patterns
102
+ const patterns = {
103
+ hasFeaturePrefix: localBranches.some(b => /^feature\//.test(b)),
104
+ hasBugfixPrefix: localBranches.some(b => /^bugfix\//.test(b) || /^fix\//.test(b)),
105
+ hasHotfixPrefix: localBranches.some(b => /^hotfix\//.test(b)),
106
+ hasIssueNumber: localBranches.some(b => /\d+$/.test(b)),
107
+ usesSlashes: localBranches.some(b => b.includes("/")),
108
+ usesKebabCase: localBranches.some(b => /-/.test(b)),
109
+ };
110
+
111
+ // Common prefixes
112
+ const prefixes = {};
113
+ for (const branch of localBranches) {
114
+ if (branch.includes("/")) {
115
+ const prefix = branch.split("/")[0];
116
+ prefixes[prefix] = (prefixes[prefix] || 0) + 1;
117
+ }
118
+ }
119
+
120
+ return {
121
+ current: currentBranch,
122
+ default: defaultBranch,
123
+ total: localBranches.length,
124
+ local: localBranches,
125
+ remote: remoteBranches,
126
+ patterns,
127
+ commonPrefixes: Object.entries(prefixes)
128
+ .sort((a, b) => b[1] - a[1])
129
+ .slice(0, 5)
130
+ .map(([name, count]) => ({ name, count })),
131
+ };
132
+ }
133
+
134
+ /**
135
+ * Get PR template information
136
+ */
137
+ function getPRTemplate(projectPath) {
138
+ const templates = [
139
+ ".github/pull_request_template.md",
140
+ ".github/PULL_REQUEST_TEMPLATE.md",
141
+ "PULL_REQUEST_TEMPLATE.md",
142
+ ];
143
+
144
+ for (const template of templates) {
145
+ const templatePath = path.join(projectPath, template);
146
+ if (fs.existsSync(templatePath)) {
147
+ try {
148
+ const content = fs.readFileSync(templatePath, "utf-8");
149
+
150
+ // Analyze template sections
151
+ const sections = [];
152
+ const lines = content.split("\n");
153
+ let currentSection = null;
154
+
155
+ for (const line of lines) {
156
+ if (line.startsWith("##") || line.startsWith("###")) {
157
+ if (currentSection) {
158
+ sections.push(currentSection);
159
+ }
160
+ currentSection = {
161
+ title: line.replace(/^#+\s*/, ""),
162
+ required: line.includes("Required") || line.includes("MUST"),
163
+ content: [],
164
+ };
165
+ } else if (currentSection && line.trim()) {
166
+ currentSection.content.push(line);
167
+ }
168
+ }
169
+
170
+ if (currentSection) {
171
+ sections.push(currentSection);
172
+ }
173
+
174
+ return {
175
+ file: template,
176
+ sections,
177
+ hasRequiredSections: sections.some(s => s.required),
178
+ sectionCount: sections.length,
179
+ };
180
+ } catch {}
181
+ }
182
+ }
183
+
184
+ return null;
185
+ }
186
+
187
+ /**
188
+ * Get git blame information for team patterns
189
+ */
190
+ function getTeamPatterns(projectPath, fileLimit = 10) {
191
+ if (!isGitRepo(projectPath)) return null;
192
+
193
+ // Get recent files
194
+ const output = execGit("ls-files -z", projectPath);
195
+ if (!output) return null;
196
+
197
+ const files = output.split("\0")
198
+ .filter(f => f && (f.endsWith(".ts") || f.endsWith(".tsx") || f.endsWith(".js")))
199
+ .slice(0, fileLimit);
200
+
201
+ const authorStats = {};
202
+ const patterns = {
203
+ commonImports: {},
204
+ commentStyles: {},
205
+ functionPatterns: {},
206
+ };
207
+
208
+ for (const file of files) {
209
+ const blameOutput = execGit(`blame --line-porcelain "${file}"`, projectPath);
210
+ if (!blameOutput) continue;
211
+
212
+ const lines = blameOutput.split("\n");
213
+ let currentAuthor = null;
214
+
215
+ for (const line of lines) {
216
+ if (line.startsWith("author ")) {
217
+ currentAuthor = line.slice(7);
218
+ authorStats[currentAuthor] = (authorStats[currentAuthor] || 0) + 1;
219
+ } else if (line.startsWith("\t") && currentAuthor) {
220
+ const codeLine = line.slice(1);
221
+
222
+ // Track patterns by author
223
+ if (!patterns.authorPatterns) patterns.authorPatterns = {};
224
+ if (!patterns.authorPatterns[currentAuthor]) {
225
+ patterns.authorPatterns[currentAuthor] = {
226
+ imports: [],
227
+ comments: [],
228
+ functions: [],
229
+ };
230
+ }
231
+
232
+ // Import patterns
233
+ if (codeLine.includes("import ")) {
234
+ const importType = codeLine.includes(" from ") ? "named" : "default";
235
+ patterns.authorPatterns[currentAuthor].imports.push(importType);
236
+ }
237
+
238
+ // Comment patterns
239
+ if (codeLine.includes("//")) {
240
+ patterns.authorPatterns[currentAuthor].comments.push(codeLine);
241
+ }
242
+
243
+ // Function patterns
244
+ if (codeLine.includes("function ") || codeLine.includes("=>")) {
245
+ patterns.authorPatterns[currentAuthor].functions.push(codeLine);
246
+ }
247
+ }
248
+ }
249
+ }
250
+
251
+ // Analyze top contributors
252
+ const topAuthors = Object.entries(authorStats)
253
+ .sort((a, b) => b[1] - a[1])
254
+ .slice(0, 5)
255
+ .map(([name, lines]) => ({ name, lines }));
256
+
257
+ return {
258
+ topAuthors,
259
+ totalAuthors: Object.keys(authorStats).length,
260
+ patterns,
261
+ };
262
+ }
263
+
264
+ /**
265
+ * Get complete git context
266
+ */
267
+ function getGitContext(projectPath) {
268
+ if (!isGitRepo(projectPath)) {
269
+ return {
270
+ isRepo: false,
271
+ message: "Not a git repository",
272
+ };
273
+ }
274
+
275
+ const commits = getRecentCommits(projectPath);
276
+ const branches = getBranchInfo(projectPath);
277
+ const prTemplate = getPRTemplate(projectPath);
278
+ const teamPatterns = getTeamPatterns(projectPath);
279
+
280
+ return {
281
+ isRepo: true,
282
+ commits,
283
+ branches,
284
+ prTemplate,
285
+ teamPatterns,
286
+ conventions: {
287
+ commitMessages: commits?.analysis || null,
288
+ branchNaming: branches?.patterns || null,
289
+ hasPRTemplate: !!prTemplate,
290
+ teamSize: teamPatterns?.totalAuthors || 0,
291
+ },
292
+ };
293
+ }
294
+
295
+ module.exports = {
296
+ isGitRepo,
297
+ getGitContext,
298
+ getRecentCommits,
299
+ getBranchInfo,
300
+ getPRTemplate,
301
+ getTeamPatterns,
302
+ };