@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,119 @@
1
+ /**
2
+ * GitHub Copilot Instructions Generator
3
+ * Generates .github/copilot-instructions.md
4
+ */
5
+
6
+ /**
7
+ * Generate Copilot instructions
8
+ */
9
+ function generateCopilotInstructions(analysis) {
10
+ const p = analysis.patterns || {};
11
+ const m = analysis.monorepo || {};
12
+
13
+ return `# GitHub Copilot Instructions - ${analysis.name}
14
+
15
+ ## Project Overview
16
+
17
+ This is a **${analysis.framework || "JavaScript"}** project using **${analysis.language || "JavaScript"}**.
18
+ Architecture: ${analysis.architecture}
19
+ ${m.isMonorepo ? `Monorepo: ${m.type} with ${m.workspaces?.length || 0} workspaces` : ""}
20
+
21
+ ## Tech Stack
22
+
23
+ ${analysis.hasNextjs ? "- Next.js (App Router)" : ""}
24
+ ${analysis.hasReact ? "- React" : ""}
25
+ ${analysis.hasTypescript ? "- TypeScript (strict mode)" : ""}
26
+ ${analysis.hasPrisma ? "- Prisma ORM" : ""}
27
+ ${analysis.hasTailwind ? "- Tailwind CSS" : ""}
28
+ ${p.stateManagement ? `- State Management: ${p.stateManagement}` : ""}
29
+ ${p.validation ? `- Validation: ${p.validation}` : ""}
30
+ ${p.authentication ? `- Authentication: ${p.authentication}` : ""}
31
+ ${p.dataFetching?.length ? `- Data Fetching: ${p.dataFetching.join(", ")}` : ""}
32
+ ${p.testing?.length ? `- Testing: ${p.testing.join(", ")}` : ""}
33
+
34
+ ## Project Structure
35
+
36
+ \`\`\`
37
+ ${analysis.directories.map(d => `${d}/`).join("\n")}
38
+ \`\`\`
39
+
40
+ ${m.isMonorepo && m.workspaces?.length > 0 ? `## Workspaces
41
+
42
+ ${m.workspaces.slice(0, 8).map(w => `- \`${w.path}\` - ${w.name}`).join("\n")}
43
+ ` : ""}
44
+
45
+ ## Existing Components
46
+
47
+ When generating UI code, prefer using these existing components:
48
+ ${analysis.components.slice(0, 25).map(c => `- ${c}`).join("\n") || "None detected"}
49
+
50
+ ${p.hooks?.length > 0 ? `## Custom Hooks
51
+
52
+ Use these existing hooks instead of creating new ones:
53
+ ${p.hooks.slice(0, 15).map(h => `- \`${h}\``).join("\n")}
54
+ ` : ""}
55
+
56
+ ## API Routes
57
+
58
+ ${analysis.apiRoutes.slice(0, 15).map(r => `- ${r}`).join("\n") || "None detected"}
59
+
60
+ ${analysis.models.length > 0 ? `## Data Models (Prisma)
61
+
62
+ ${analysis.models.map(m => `- ${m}`).join("\n")}
63
+ ` : ""}
64
+
65
+ ${analysis.envVars?.variables?.length > 0 ? `## Environment Variables
66
+
67
+ Required variables:
68
+ ${analysis.envVars.variables.slice(0, 15).map(v => `- \`${v}\``).join("\n")}
69
+ ` : ""}
70
+
71
+ ## Code Conventions
72
+
73
+ ### File Naming
74
+ - Components: ${analysis.conventions.naming.components || "PascalCase"} (e.g., \`Button.tsx\`)
75
+ - Utilities: camelCase (e.g., \`formatDate.ts\`)
76
+ - Types: PascalCase with \`.types.ts\` suffix
77
+
78
+ ### Import Aliases
79
+ - Use \`@/\` for src imports (e.g., \`@/components/Button\`)
80
+ - Never use deep relative imports like \`../../../\`
81
+
82
+ ### TypeScript
83
+ ${analysis.hasTypescript ? `- Enable strict mode
84
+ - No \`any\` types - use \`unknown\` or proper types
85
+ - Define interfaces for all props and API responses` : "- Use JSDoc comments for type hints"}
86
+
87
+ ## Critical Rules
88
+
89
+ 1. **Security**: Never hardcode API keys, secrets, or credentials
90
+ 2. **Types**: ${analysis.hasTypescript ? "No `any` types allowed" : "Use JSDoc for type hints"}
91
+ 3. **Components**: Check existing components before creating new ones
92
+ 4. **Hooks**: Use existing custom hooks when available
93
+ 5. **Validation**: ${p.validation ? `Always validate input with ${p.validation}` : "Always validate user input"}
94
+ 6. **Styling**: ${analysis.hasTailwind ? "Use Tailwind CSS classes" : "Follow existing styling patterns"}
95
+ 7. **State**: ${p.stateManagement ? `Use ${p.stateManagement} for global state` : "Keep state minimal and local"}
96
+
97
+ ${p.antiPatterns?.length > 0 ? `## Anti-Patterns to Avoid
98
+
99
+ ${p.antiPatterns.map(ap => `- ❌ ${ap.message} → ${ap.suggestion}`).join("\n")}
100
+ ` : ""}
101
+
102
+ ## When Writing Code
103
+
104
+ 1. Follow existing patterns in the codebase
105
+ 2. Use TypeScript strict types
106
+ 3. Add proper error handling
107
+ 4. Use existing utilities and helpers
108
+ 5. Keep functions small and focused
109
+ 6. Write self-documenting code
110
+
111
+ ---
112
+
113
+ *Context Enhanced by vibecheck AI*
114
+ `;
115
+ }
116
+
117
+ module.exports = {
118
+ generateCopilotInstructions,
119
+ };
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Cursor Rules Generator
3
+ * Generates .cursorrules and .cursor/rules/*.mdc files
4
+ */
5
+
6
+ /**
7
+ * Get directory purpose description
8
+ */
9
+ function getDirectoryPurpose(dir) {
10
+ const purposes = {
11
+ "src": "Source code root",
12
+ "app": "Next.js App Router pages",
13
+ "pages": "Next.js Pages Router",
14
+ "components": "Reusable UI components",
15
+ "lib": "Utility functions and shared logic",
16
+ "utils": "Helper functions",
17
+ "hooks": "Custom React hooks",
18
+ "services": "API and external service integrations",
19
+ "api": "API route handlers",
20
+ "server": "Server-side code",
21
+ "prisma": "Database schema and migrations",
22
+ "public": "Static assets",
23
+ "styles": "CSS and styling",
24
+ "types": "TypeScript type definitions",
25
+ "config": "Configuration files",
26
+ "test": "Test files",
27
+ "__tests__": "Test files",
28
+ };
29
+ return purposes[dir] || "Project files";
30
+ }
31
+
32
+ /**
33
+ * Generate main .cursorrules file
34
+ */
35
+ function generateCursorRules(analysis) {
36
+ const p = analysis.patterns || {};
37
+ const t = analysis.types || {};
38
+ const s = analysis.stats || {};
39
+ const env = analysis.envVars || {};
40
+ const m = analysis.monorepo || {};
41
+
42
+ return `# vibecheck AI - Project Context for Cursor
43
+
44
+ > Auto-generated by \`vibecheck context\`. Regenerate when your codebase changes.
45
+
46
+ ## Project Overview
47
+
48
+ - **Name**: ${analysis.name}
49
+ - **Framework**: ${analysis.framework || "Unknown"}
50
+ - **Language**: ${analysis.language || "JavaScript"}
51
+ - **Architecture**: ${analysis.architecture}
52
+ ${s.totalFiles ? `- **Size**: ${s.totalFiles} files, ~${Math.round(s.totalLines / 1000)}k lines` : ""}
53
+ ${m.isMonorepo ? `- **Monorepo**: ${m.type} with ${m.workspaces?.length || 0} workspaces` : ""}
54
+
55
+ ## Tech Stack
56
+
57
+ ${analysis.hasNextjs ? "- Next.js (App Router)" : ""}
58
+ ${analysis.hasReact ? "- React" : ""}
59
+ ${analysis.hasTypescript ? "- TypeScript" : ""}
60
+ ${analysis.hasPrisma ? "- Prisma ORM" : ""}
61
+ ${analysis.hasTailwind ? "- Tailwind CSS" : ""}
62
+ ${p.stateManagement ? `- State: ${p.stateManagement}` : ""}
63
+ ${p.validation ? `- Validation: ${p.validation}` : ""}
64
+ ${p.authentication ? `- Auth: ${p.authentication}` : ""}
65
+ ${p.dataFetching?.length ? `- Data Fetching: ${p.dataFetching.join(", ")}` : ""}
66
+
67
+ ## Project Structure
68
+
69
+ \`\`\`
70
+ ${analysis.directories.map(d => `${d}/`).join("\n")}
71
+ \`\`\`
72
+
73
+ ${m.isMonorepo && m.workspaces?.length > 0 ? `## Workspaces
74
+
75
+ ${m.workspaces.slice(0, 10).map(w => `- \`${w.path}\` - ${w.name}`).join("\n")}
76
+ ` : ""}
77
+
78
+ ${p.hooks?.length > 0 ? `## Custom Hooks (Use These!)
79
+
80
+ ${p.hooks.slice(0, 15).map(h => `- \`${h}\``).join("\n")}
81
+
82
+ ${p.codeExamples?.hooks ? `### Example: ${p.codeExamples.hooks.name}
83
+ \`\`\`typescript
84
+ // From: ${p.codeExamples.hooks.file}
85
+ ${p.codeExamples.hooks.code}
86
+ \`\`\`
87
+ ` : ""}
88
+ ` : ""}
89
+
90
+ ${analysis.apiRoutes.length > 0 ? `## API Routes
91
+
92
+ ${analysis.apiRoutes.slice(0, 20).map(r => `- \`${r}\``).join("\n")}
93
+ ${analysis.apiRoutes.length > 20 ? `\n... and ${analysis.apiRoutes.length - 20} more` : ""}
94
+ ` : ""}
95
+
96
+ ${analysis.components.length > 0 ? `## Components (Check Before Creating New)
97
+
98
+ ${analysis.components.slice(0, 30).map(c => `- \`${c}\``).join("\n")}
99
+ ${analysis.components.length > 30 ? `\n... and ${analysis.components.length - 30} more` : ""}
100
+ ` : ""}
101
+
102
+ ${analysis.models.length > 0 ? `## Data Models (Prisma)
103
+
104
+ ${analysis.models.map(m => `- \`${m}\``).join("\n")}
105
+ ` : ""}
106
+
107
+ ${t.interfaces?.length > 0 || t.types?.length > 0 ? `## Key Types & Interfaces
108
+
109
+ ${t.interfaces?.slice(0, 15).map(i => `- \`interface ${i}\``).join("\n") || ""}
110
+ ${t.types?.slice(0, 10).map(ty => `- \`type ${ty}\``).join("\n") || ""}
111
+ ${t.enums?.length > 0 ? `\nEnums: ${t.enums.slice(0, 5).map(e => `\`${e}\``).join(", ")}` : ""}
112
+ ` : ""}
113
+
114
+ ${env.variables?.length > 0 ? `## Environment Variables
115
+
116
+ Required env vars:
117
+ ${env.variables.slice(0, 20).map(v => `- \`${v}\``).join("\n")}
118
+ ${env.files?.length ? `\nEnv files: ${env.files.join(", ")}` : ""}
119
+ ` : ""}
120
+
121
+ ${analysis.scripts?.length > 0 ? `## NPM Scripts
122
+
123
+ ${analysis.scripts.slice(0, 10).map(s => `- \`npm run ${s.name}\` - ${s.command}`).join("\n")}
124
+ ` : ""}
125
+
126
+ ## Coding Conventions
127
+
128
+ ### File Naming
129
+ - Components: ${analysis.conventions.naming.components || "PascalCase"} (e.g., \`Button.tsx\`, \`UserCard.tsx\`)
130
+ - Utilities: camelCase (e.g., \`formatDate.ts\`, \`apiClient.ts\`)
131
+ - Types: PascalCase with \`.d.ts\` or \`.types.ts\` suffix
132
+
133
+ ### Import Order
134
+ 1. React/Next.js imports
135
+ 2. Third-party libraries
136
+ 3. Internal components (\`@/components/\`)
137
+ 4. Internal utilities (\`@/lib/\`, \`@/utils/\`)
138
+ 5. Types
139
+ 6. Styles
140
+
141
+ ### Code Style
142
+ - Use ${analysis.hasTypescript ? "TypeScript with strict mode" : "JavaScript with JSDoc comments"}
143
+ - Prefer functional components with hooks
144
+ - Use path aliases (\`@/\`) for imports
145
+ ${analysis.hasTailwind ? "- Use Tailwind CSS for styling (no inline styles)" : ""}
146
+ ${analysis.hasPrisma ? "- Use Prisma client for database operations" : ""}
147
+ ${p.stateManagement ? `- Use ${p.stateManagement} for state management` : ""}
148
+ ${p.validation ? `- Use ${p.validation} for input validation` : ""}
149
+
150
+ ## Critical Rules
151
+
152
+ 1. **Never hardcode secrets** - Use environment variables
153
+ 2. **No mock data in production** - Check for \`demo\`, \`fake\`, \`mock\` patterns
154
+ 3. **Type everything** - No \`any\` types${analysis.hasTypescript ? "" : " (use JSDoc)"}
155
+ 4. **Follow existing patterns** - Match the codebase style
156
+ 5. **Use existing components** - Don't recreate what exists
157
+ 6. **API routes must validate input** - Never trust client data
158
+ ${p.hooks?.length ? `7. **Use existing hooks** - Check custom hooks list above` : ""}
159
+
160
+ ${p.antiPatterns?.length > 0 ? `## ⚠️ Avoid These Patterns
161
+
162
+ ${p.antiPatterns.map(ap => `- **${ap.message}** - ${ap.suggestion}`).join("\n")}
163
+ ` : ""}
164
+
165
+ ## When Creating New Files
166
+
167
+ 1. Check if similar file exists first
168
+ 2. Place in correct directory based on type
169
+ 3. Follow naming conventions
170
+ 4. Import from correct paths
171
+ 5. Add proper types/interfaces
172
+ ${p.hooks?.length ? `6. Check if there's an existing hook you can use` : ""}
173
+
174
+ ---
175
+
176
+ *Context Enhanced by vibecheck AI*
177
+ `;
178
+ }
179
+
180
+ /**
181
+ * Generate modular Cursor rules (.cursor/rules/*.mdc)
182
+ */
183
+ function generateCursorModularRules(analysis) {
184
+ const rules = {};
185
+ const p = analysis.patterns || {};
186
+ const t = analysis.types || {};
187
+ const env = analysis.envVars || {};
188
+ const m = analysis.monorepo || {};
189
+
190
+ // Architecture rules
191
+ rules["architecture"] = `---
192
+ description: Project architecture and structure guidelines
193
+ globs: ["**/*.{ts,tsx,js,jsx}"]
194
+ alwaysApply: true
195
+ ---
196
+
197
+ # Architecture Guidelines
198
+
199
+ ## Project Type: ${analysis.architecture}
200
+
201
+ ${analysis.hasNextjs ? `### Next.js App Router Structure
202
+ - Pages go in \`app/\` directory
203
+ - API routes in \`app/api/\`
204
+ - Layouts use \`layout.tsx\`
205
+ - Loading states use \`loading.tsx\`
206
+ - Error boundaries use \`error.tsx\`
207
+ ` : ""}
208
+
209
+ ${m.isMonorepo ? `### Monorepo Structure (${m.type})
210
+
211
+ Workspaces:
212
+ ${m.workspaces?.slice(0, 8).map(w => `- \`${w.path}\` - ${w.name}`).join("\n") || "None detected"}
213
+
214
+ ${m.sharedPackages?.length > 0 ? `Shared Packages:
215
+ ${m.sharedPackages.slice(0, 5).map(p => `- ${p.name} (used in ${p.usedIn} workspaces)`).join("\n")}` : ""}
216
+ ` : ""}
217
+
218
+ ### Directory Purpose
219
+ ${analysis.directories.map(d => `- \`${d}/\` - ${getDirectoryPurpose(d)}`).join("\n")}
220
+
221
+ ### Import Aliases
222
+ - Use \`@/\` for src directory imports
223
+ - Never use relative imports deeper than \`../\`
224
+ `;
225
+
226
+ // Data flow rules
227
+ if (analysis.hasPrisma || analysis.apiRoutes.length > 0 || p.dataFetching?.length) {
228
+ rules["data-flow"] = `---
229
+ description: Data fetching and API interaction patterns
230
+ globs: ["**/api/**", "**/lib/**", "**/services/**", "**/hooks/**"]
231
+ alwaysApply: false
232
+ ---
233
+
234
+ # Data Flow Guidelines
235
+
236
+ ${p.dataFetching?.length ? `## Data Fetching: ${p.dataFetching.join(", ")}
237
+
238
+ ${p.dataFetching.includes("TanStack Query") ? `### TanStack Query Pattern
239
+ - Use \`useQuery\` for GET requests
240
+ - Use \`useMutation\` for POST/PUT/DELETE
241
+ - Define query keys consistently
242
+ - Invalidate queries after mutations
243
+ ` : ""}
244
+ ${p.dataFetching.includes("SWR") ? `### SWR Pattern
245
+ - Use \`useSWR\` for data fetching
246
+ - Define fetcher functions
247
+ - Handle loading and error states
248
+ ` : ""}
249
+ ${p.dataFetching.includes("tRPC") ? `### tRPC Pattern
250
+ - Use tRPC procedures for type-safe API calls
251
+ - Define routers in \`server/api/routers\`
252
+ - Use \`api.*.useQuery()\` pattern
253
+ ` : ""}
254
+ ` : ""}
255
+
256
+ ${analysis.hasPrisma ? `## Database (Prisma)
257
+
258
+ Models: ${analysis.models.join(", ")}
259
+
260
+ Rules:
261
+ - Use Prisma client from \`@/lib/prisma\` or \`@/server/db\`
262
+ - Use transactions for multi-step operations
263
+ - Handle errors with try/catch
264
+ - Never expose raw database errors
265
+ ` : ""}
266
+
267
+ ${analysis.apiRoutes.length > 0 ? `## API Routes
268
+
269
+ ${analysis.apiRoutes.slice(0, 15).map(r => `- ${r}`).join("\n")}
270
+
271
+ Rules:
272
+ ${p.validation ? `- Validate all input with ${p.validation}` : "- Validate all input"}
273
+ - Return consistent response shapes
274
+ - Use proper HTTP status codes
275
+ ` : ""}
276
+ `;
277
+ }
278
+
279
+ // Component rules
280
+ if (analysis.components.length > 0) {
281
+ rules["components"] = `---
282
+ description: Component creation and styling guidelines
283
+ globs: ["**/components/**/*.{tsx,jsx}"]
284
+ alwaysApply: false
285
+ ---
286
+
287
+ # Component Guidelines
288
+
289
+ ## Existing Components (${analysis.components.length})
290
+ ${analysis.components.slice(0, 20).map(c => `- \`${c}\``).join("\n")}
291
+
292
+ ## Before Creating New Components
293
+
294
+ 1. **Check if it exists above**
295
+ 2. Place in \`components/\` or feature folder
296
+ 3. Use ${analysis.conventions.naming.components || "PascalCase"} naming
297
+ 4. Export as named export
298
+ ${analysis.hasTailwind ? "5. Use Tailwind CSS for styling" : ""}
299
+ ${p.styling?.length ? `6. Styling: ${p.styling.join(", ")}` : ""}
300
+
301
+ ## Component Template
302
+
303
+ \`\`\`tsx
304
+ interface Props {
305
+ // Define props with types
306
+ }
307
+
308
+ export function ComponentName({ ...props }: Props) {
309
+ return (
310
+ // JSX
311
+ );
312
+ }
313
+ \`\`\`
314
+ `;
315
+ }
316
+
317
+ // Hooks rules
318
+ if (p.hooks?.length > 0) {
319
+ rules["hooks"] = `---
320
+ description: Custom hooks patterns and usage
321
+ globs: ["**/hooks/**/*.{ts,tsx}", "**/use*.{ts,tsx}"]
322
+ alwaysApply: false
323
+ ---
324
+
325
+ # Custom Hooks
326
+
327
+ ## Available Hooks (${p.hooks.length})
328
+
329
+ ${p.hooks.map(h => `- \`${h}\``).join("\n")}
330
+
331
+ ## Before Creating a New Hook
332
+
333
+ 1. **Check the list above first**
334
+ 2. Name it \`use[Feature]\`
335
+ 3. Place in \`hooks/\` or \`lib/hooks/\`
336
+ 4. Return a consistent shape
337
+
338
+ ${p.codeExamples?.hooks ? `## Example
339
+
340
+ \`\`\`typescript
341
+ // ${p.codeExamples.hooks.file}
342
+ ${p.codeExamples.hooks.code}
343
+ \`\`\`
344
+ ` : ""}
345
+ `;
346
+ }
347
+
348
+ // State management rules
349
+ if (p.stateManagement) {
350
+ rules["state"] = `---
351
+ description: State management patterns
352
+ globs: ["**/store/**", "**/state/**", "**/context/**"]
353
+ alwaysApply: false
354
+ ---
355
+
356
+ # State Management: ${p.stateManagement}
357
+
358
+ ${p.stateManagement === "Zustand" ? `## Zustand Pattern
359
+
360
+ \`\`\`typescript
361
+ import { create } from 'zustand'
362
+
363
+ interface Store {
364
+ count: number
365
+ increment: () => void
366
+ }
367
+
368
+ export const useStore = create<Store>((set) => ({
369
+ count: 0,
370
+ increment: () => set((state) => ({ count: state.count + 1 })),
371
+ }))
372
+ \`\`\`
373
+
374
+ - Create stores in \`store/\` directory
375
+ - Use typed store interfaces
376
+ - Keep stores focused and small
377
+ ` : ""}
378
+ ${p.stateManagement === "Redux Toolkit" ? `## Redux Toolkit Pattern
379
+
380
+ \`\`\`typescript
381
+ import { createSlice } from '@reduxjs/toolkit'
382
+
383
+ const slice = createSlice({
384
+ name: 'feature',
385
+ initialState: {},
386
+ reducers: {}
387
+ })
388
+ \`\`\`
389
+
390
+ - Use createSlice for reducers
391
+ - Use createAsyncThunk for async
392
+ ` : ""}
393
+ ${p.stateManagement === "React Context" ? `## Context Pattern
394
+
395
+ \`\`\`typescript
396
+ const Context = createContext<Type | null>(null)
397
+
398
+ export function useFeature() {
399
+ const context = useContext(Context)
400
+ if (!context) throw new Error('Must be used within Provider')
401
+ return context
402
+ }
403
+ \`\`\`
404
+ ` : ""}
405
+ `;
406
+ }
407
+
408
+ // Types rules
409
+ if (t.interfaces?.length > 0 || t.types?.length > 0) {
410
+ rules["types"] = `---
411
+ description: Type definitions and interfaces
412
+ globs: ["**/*.d.ts", "**/types/**", "**/*.types.ts"]
413
+ alwaysApply: false
414
+ ---
415
+
416
+ # Type Definitions
417
+
418
+ ## Interfaces (${t.interfaces?.length || 0})
419
+ ${t.interfaces?.slice(0, 20).map(i => `- \`${i}\``).join("\n") || "None"}
420
+
421
+ ## Types (${t.types?.length || 0})
422
+ ${t.types?.slice(0, 15).map(ty => `- \`${ty}\``).join("\n") || "None"}
423
+
424
+ ${t.enums?.length > 0 ? `## Enums
425
+ ${t.enums.map(e => `- \`${e}\``).join("\n")}` : ""}
426
+
427
+ ## Conventions
428
+ - Interfaces for object shapes
429
+ - Type aliases for unions
430
+ - No \`any\` - use \`unknown\`
431
+ `;
432
+ }
433
+
434
+ // Environment rules
435
+ if (env.variables?.length > 0) {
436
+ rules["environment"] = `---
437
+ description: Environment variables
438
+ globs: ["**/*.env*", "**/config/**"]
439
+ alwaysApply: false
440
+ ---
441
+
442
+ # Environment Variables (${env.variables?.length || 0})
443
+
444
+ ${env.variables?.slice(0, 25).map(v => `- \`${v}\``).join("\n")}
445
+
446
+ ## Rules
447
+ - Never commit \`.env\` files
448
+ - Access via \`process.env.VAR_NAME\`
449
+ - Prefix client-side vars with \`NEXT_PUBLIC_\`
450
+ `;
451
+ }
452
+
453
+ // Anti-patterns rules
454
+ if (p.antiPatterns?.length > 0) {
455
+ rules["avoid"] = `---
456
+ description: Patterns to avoid
457
+ globs: ["**/*.{ts,tsx,js,jsx}"]
458
+ alwaysApply: true
459
+ ---
460
+
461
+ # ⚠️ Patterns to Avoid
462
+
463
+ ${p.antiPatterns.map(ap => `## ${ap.severity === 'error' ? '🔴' : '🟡'} ${ap.message}
464
+ **Fix:** ${ap.suggestion}
465
+ `).join("\n")}
466
+
467
+ ## General
468
+ - ❌ No \`any\` type
469
+ - ❌ No hardcoded secrets
470
+ - ❌ No console.log in production
471
+ - ❌ No mock data in production
472
+ `;
473
+ }
474
+
475
+ // Testing rules
476
+ if (p.testing?.length > 0) {
477
+ rules["testing"] = `---
478
+ description: Testing patterns
479
+ globs: ["**/*.test.{ts,tsx}", "**/*.spec.{ts,tsx}"]
480
+ alwaysApply: false
481
+ ---
482
+
483
+ # Testing: ${p.testing.join(", ")}
484
+
485
+ ${p.testing.includes("Jest") || p.testing.includes("Vitest") ? `## Unit Tests
486
+
487
+ \`\`\`typescript
488
+ describe('Feature', () => {
489
+ it('should work', () => {
490
+ expect(result).toBe('expected')
491
+ })
492
+ })
493
+ \`\`\`
494
+ ` : ""}
495
+ ${p.testing.includes("Playwright") ? `## E2E Tests
496
+
497
+ \`\`\`typescript
498
+ test('user flow', async ({ page }) => {
499
+ await page.goto('/')
500
+ await page.click('button')
501
+ })
502
+ \`\`\`
503
+ ` : ""}
504
+ `;
505
+ }
506
+
507
+ return rules;
508
+ }
509
+
510
+ module.exports = {
511
+ generateCursorRules,
512
+ generateCursorModularRules,
513
+ getDirectoryPurpose,
514
+ };