vibecheck-ai 2.0.2 → 5.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 (456) hide show
  1. package/bin/.generated +25 -0
  2. package/bin/_deprecations.js +463 -0
  3. package/bin/_router.js +46 -0
  4. package/bin/cli-hygiene.js +241 -0
  5. package/bin/dev/run-v2-torture.js +30 -0
  6. package/bin/registry.js +656 -0
  7. package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
  8. package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
  9. package/bin/runners/REPORT_AUDIT.md +64 -0
  10. package/bin/runners/cli-utils.js +1070 -0
  11. package/bin/runners/context/ai-task-decomposer.js +337 -0
  12. package/bin/runners/context/analyzer.js +513 -0
  13. package/bin/runners/context/api-contracts.js +427 -0
  14. package/bin/runners/context/context-diff.js +342 -0
  15. package/bin/runners/context/context-pruner.js +291 -0
  16. package/bin/runners/context/dependency-graph.js +414 -0
  17. package/bin/runners/context/generators/claude.js +107 -0
  18. package/bin/runners/context/generators/codex.js +108 -0
  19. package/bin/runners/context/generators/copilot.js +119 -0
  20. package/bin/runners/context/generators/cursor-enhanced.js +2525 -0
  21. package/bin/runners/context/generators/cursor.js +514 -0
  22. package/bin/runners/context/generators/mcp.js +169 -0
  23. package/bin/runners/context/generators/windsurf.js +180 -0
  24. package/bin/runners/context/git-context.js +304 -0
  25. package/bin/runners/context/index.js +1110 -0
  26. package/bin/runners/context/insights.js +173 -0
  27. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  28. package/bin/runners/context/mcp-server/index.js +1176 -0
  29. package/bin/runners/context/mcp-server/package.json +24 -0
  30. package/bin/runners/context/memory.js +200 -0
  31. package/bin/runners/context/monorepo.js +215 -0
  32. package/bin/runners/context/multi-repo-federation.js +404 -0
  33. package/bin/runners/context/patterns.js +253 -0
  34. package/bin/runners/context/proof-context.js +1264 -0
  35. package/bin/runners/context/security-scanner.js +541 -0
  36. package/bin/runners/context/semantic-search.js +350 -0
  37. package/bin/runners/context/shared.js +264 -0
  38. package/bin/runners/context/team-conventions.js +336 -0
  39. package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
  40. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
  41. package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
  42. package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
  43. package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
  44. package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
  45. package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
  46. package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
  47. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  48. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  49. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  50. package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
  51. package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
  52. package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
  53. package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
  54. package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
  55. package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
  56. package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
  57. package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
  58. package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
  59. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
  60. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
  61. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
  62. package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
  63. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
  64. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
  65. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
  66. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
  67. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
  68. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
  69. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
  70. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
  71. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
  72. package/bin/runners/lib/agent-firewall/index.js +200 -0
  73. package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
  74. package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
  75. package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
  76. package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
  77. package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
  78. package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
  79. package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
  80. package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
  81. package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
  82. package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
  83. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
  84. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
  85. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
  86. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  87. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  88. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  89. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  90. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  91. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  92. package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
  93. package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
  94. package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
  95. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
  96. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
  97. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
  98. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
  99. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
  100. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
  101. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
  102. package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
  103. package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
  104. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  105. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  106. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  107. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  108. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  109. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  110. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  111. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  112. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  113. package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
  114. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  115. package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
  116. package/bin/runners/lib/agent-firewall/session/index.js +26 -0
  117. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  118. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  119. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  120. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  121. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  122. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  123. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  124. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  125. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  126. package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
  127. package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
  128. package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
  129. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
  130. package/bin/runners/lib/ai-bridge.js +416 -0
  131. package/bin/runners/lib/analysis-core.js +309 -0
  132. package/bin/runners/lib/analyzers.js +2500 -0
  133. package/bin/runners/lib/api-client.js +269 -0
  134. package/bin/runners/lib/approve-output.js +235 -0
  135. package/bin/runners/lib/artifact-envelope.js +540 -0
  136. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  137. package/bin/runners/lib/audit-bridge.js +391 -0
  138. package/bin/runners/lib/auth-shared.js +977 -0
  139. package/bin/runners/lib/auth-truth.js +193 -0
  140. package/bin/runners/lib/auth.js +215 -0
  141. package/bin/runners/lib/authority-badge.js +425 -0
  142. package/bin/runners/lib/backup.js +62 -0
  143. package/bin/runners/lib/billing.js +107 -0
  144. package/bin/runners/lib/checkpoint.js +941 -0
  145. package/bin/runners/lib/claims.js +118 -0
  146. package/bin/runners/lib/classify-output.js +204 -0
  147. package/bin/runners/lib/cleanup/engine.js +571 -0
  148. package/bin/runners/lib/cleanup/index.js +53 -0
  149. package/bin/runners/lib/cleanup/output.js +375 -0
  150. package/bin/runners/lib/cleanup/rules.js +1060 -0
  151. package/bin/runners/lib/cli-output.js +400 -0
  152. package/bin/runners/lib/cli-ui.js +540 -0
  153. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  154. package/bin/runners/lib/compliance-bridge.js +165 -0
  155. package/bin/runners/lib/contracts/auth-contract.js +202 -0
  156. package/bin/runners/lib/contracts/env-contract.js +181 -0
  157. package/bin/runners/lib/contracts/external-contract.js +206 -0
  158. package/bin/runners/lib/contracts/guard.js +168 -0
  159. package/bin/runners/lib/contracts/index.js +89 -0
  160. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  161. package/bin/runners/lib/contracts/route-contract.js +199 -0
  162. package/bin/runners/lib/contracts.js +804 -0
  163. package/bin/runners/lib/default-config.js +127 -0
  164. package/bin/runners/lib/detect.js +89 -0
  165. package/bin/runners/lib/detectors-v2.js +622 -0
  166. package/bin/runners/lib/doctor/autofix.js +254 -0
  167. package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
  168. package/bin/runners/lib/doctor/failure-signatures.js +526 -0
  169. package/bin/runners/lib/doctor/fix-script.js +336 -0
  170. package/bin/runners/lib/doctor/index.js +37 -0
  171. package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
  172. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  173. package/bin/runners/lib/doctor/modules/index.js +105 -0
  174. package/bin/runners/lib/doctor/modules/network.js +250 -0
  175. package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
  176. package/bin/runners/lib/doctor/modules/project.js +312 -0
  177. package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
  178. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  179. package/bin/runners/lib/doctor/modules/security.js +350 -0
  180. package/bin/runners/lib/doctor/modules/system.js +213 -0
  181. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  182. package/bin/runners/lib/doctor/reporter.js +262 -0
  183. package/bin/runners/lib/doctor/safe-repair.js +384 -0
  184. package/bin/runners/lib/doctor/service.js +262 -0
  185. package/bin/runners/lib/doctor/types.js +113 -0
  186. package/bin/runners/lib/doctor/ui.js +263 -0
  187. package/bin/runners/lib/doctor-enhanced.js +233 -0
  188. package/bin/runners/lib/doctor-output.js +226 -0
  189. package/bin/runners/lib/doctor-v2.js +608 -0
  190. package/bin/runners/lib/drift.js +425 -0
  191. package/bin/runners/lib/enforcement.js +72 -0
  192. package/bin/runners/lib/engine/ast-cache.js +210 -0
  193. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  194. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  195. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  196. package/bin/runners/lib/engine/env-extractor.js +207 -0
  197. package/bin/runners/lib/engine/express-extractor.js +208 -0
  198. package/bin/runners/lib/engine/extractors.js +849 -0
  199. package/bin/runners/lib/engine/index.js +207 -0
  200. package/bin/runners/lib/engine/repo-index.js +514 -0
  201. package/bin/runners/lib/engine/types.js +124 -0
  202. package/bin/runners/lib/engines/accessibility-engine.js +190 -0
  203. package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
  204. package/bin/runners/lib/engines/ast-cache.js +99 -0
  205. package/bin/runners/lib/engines/attack-detector.js +1192 -0
  206. package/bin/runners/lib/engines/code-quality-engine.js +255 -0
  207. package/bin/runners/lib/engines/console-logs-engine.js +115 -0
  208. package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
  209. package/bin/runners/lib/engines/dead-code-engine.js +198 -0
  210. package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
  211. package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
  212. package/bin/runners/lib/engines/file-filter.js +131 -0
  213. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
  214. package/bin/runners/lib/engines/mock-data-engine.js +272 -0
  215. package/bin/runners/lib/engines/parallel-processor.js +71 -0
  216. package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
  217. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
  218. package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
  219. package/bin/runners/lib/engines/type-aware-engine.js +152 -0
  220. package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
  221. package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
  222. package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
  223. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  224. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  225. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  226. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  227. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  228. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  229. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  230. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
  231. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  232. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  233. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  234. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  235. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  236. package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
  237. package/bin/runners/lib/enterprise-detect.js +603 -0
  238. package/bin/runners/lib/enterprise-init.js +942 -0
  239. package/bin/runners/lib/entitlements-v2.js +265 -0
  240. package/bin/runners/lib/entitlements.generated.js +0 -0
  241. package/bin/runners/lib/entitlements.js +340 -0
  242. package/bin/runners/lib/env-resolver.js +417 -0
  243. package/bin/runners/lib/env-template.js +66 -0
  244. package/bin/runners/lib/env.js +189 -0
  245. package/bin/runners/lib/error-handler.js +368 -0
  246. package/bin/runners/lib/error-messages.js +289 -0
  247. package/bin/runners/lib/evidence-pack.js +684 -0
  248. package/bin/runners/lib/exit-codes.js +275 -0
  249. package/bin/runners/lib/extractors/client-calls.js +990 -0
  250. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  251. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  252. package/bin/runners/lib/extractors/index.js +363 -0
  253. package/bin/runners/lib/extractors/next-routes.js +524 -0
  254. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  255. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  256. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  257. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  258. package/bin/runners/lib/finding-id.js +69 -0
  259. package/bin/runners/lib/finding-sorter.js +89 -0
  260. package/bin/runners/lib/findings-schema.js +281 -0
  261. package/bin/runners/lib/fingerprint.js +377 -0
  262. package/bin/runners/lib/firewall-prompt.js +50 -0
  263. package/bin/runners/lib/fix-output.js +228 -0
  264. package/bin/runners/lib/global-flags.js +250 -0
  265. package/bin/runners/lib/graph/graph-builder.js +265 -0
  266. package/bin/runners/lib/graph/html-renderer.js +413 -0
  267. package/bin/runners/lib/graph/index.js +32 -0
  268. package/bin/runners/lib/graph/runtime-collector.js +215 -0
  269. package/bin/runners/lib/graph/static-extractor.js +518 -0
  270. package/bin/runners/lib/help-formatter.js +413 -0
  271. package/bin/runners/lib/html-proof-report.js +913 -0
  272. package/bin/runners/lib/html-report.js +650 -0
  273. package/bin/runners/lib/init-wizard.js +601 -0
  274. package/bin/runners/lib/interactive-menu.js +1496 -0
  275. package/bin/runners/lib/json-output.js +76 -0
  276. package/bin/runners/lib/llm.js +75 -0
  277. package/bin/runners/lib/logger.js +38 -0
  278. package/bin/runners/lib/meter.js +61 -0
  279. package/bin/runners/lib/missions/briefing.js +427 -0
  280. package/bin/runners/lib/missions/checkpoint.js +753 -0
  281. package/bin/runners/lib/missions/evidence.js +126 -0
  282. package/bin/runners/lib/missions/hardening.js +851 -0
  283. package/bin/runners/lib/missions/plan.js +648 -0
  284. package/bin/runners/lib/missions/safety-gates.js +645 -0
  285. package/bin/runners/lib/missions/schema.js +478 -0
  286. package/bin/runners/lib/missions/templates.js +317 -0
  287. package/bin/runners/lib/next-action.js +560 -0
  288. package/bin/runners/lib/packs/bundle.js +675 -0
  289. package/bin/runners/lib/packs/evidence-pack.js +671 -0
  290. package/bin/runners/lib/packs/pack-factory.js +837 -0
  291. package/bin/runners/lib/packs/permissions-pack.js +686 -0
  292. package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
  293. package/bin/runners/lib/patch.js +40 -0
  294. package/bin/runners/lib/permissions/auth-model.js +213 -0
  295. package/bin/runners/lib/permissions/idor-prover.js +205 -0
  296. package/bin/runners/lib/permissions/index.js +45 -0
  297. package/bin/runners/lib/permissions/matrix-builder.js +198 -0
  298. package/bin/runners/lib/pkgjson.js +28 -0
  299. package/bin/runners/lib/policy.js +295 -0
  300. package/bin/runners/lib/polish/accessibility.js +62 -0
  301. package/bin/runners/lib/polish/analyzer.js +93 -0
  302. package/bin/runners/lib/polish/backend.js +87 -0
  303. package/bin/runners/lib/polish/configuration.js +83 -0
  304. package/bin/runners/lib/polish/documentation.js +83 -0
  305. package/bin/runners/lib/polish/frontend.js +817 -0
  306. package/bin/runners/lib/polish/index.js +27 -0
  307. package/bin/runners/lib/polish/infrastructure.js +80 -0
  308. package/bin/runners/lib/polish/internationalization.js +85 -0
  309. package/bin/runners/lib/polish/libraries.js +180 -0
  310. package/bin/runners/lib/polish/observability.js +75 -0
  311. package/bin/runners/lib/polish/performance.js +64 -0
  312. package/bin/runners/lib/polish/privacy.js +110 -0
  313. package/bin/runners/lib/polish/resilience.js +92 -0
  314. package/bin/runners/lib/polish/security.js +78 -0
  315. package/bin/runners/lib/polish/seo.js +71 -0
  316. package/bin/runners/lib/polish/styles.js +62 -0
  317. package/bin/runners/lib/polish/utils.js +104 -0
  318. package/bin/runners/lib/preflight.js +142 -0
  319. package/bin/runners/lib/prerequisites.js +149 -0
  320. package/bin/runners/lib/prove-output.js +220 -0
  321. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  322. package/bin/runners/lib/reality/index.js +318 -0
  323. package/bin/runners/lib/reality/request-hashing.js +416 -0
  324. package/bin/runners/lib/reality/request-mapper.js +453 -0
  325. package/bin/runners/lib/reality/safety-rails.js +463 -0
  326. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  327. package/bin/runners/lib/reality/toast-detector.js +393 -0
  328. package/bin/runners/lib/reality-findings.js +84 -0
  329. package/bin/runners/lib/reality-output.js +231 -0
  330. package/bin/runners/lib/receipts.js +179 -0
  331. package/bin/runners/lib/redact.js +29 -0
  332. package/bin/runners/lib/replay/capsule-manager.js +154 -0
  333. package/bin/runners/lib/replay/index.js +263 -0
  334. package/bin/runners/lib/replay/player.js +348 -0
  335. package/bin/runners/lib/replay/recorder.js +331 -0
  336. package/bin/runners/lib/report-engine.js +626 -0
  337. package/bin/runners/lib/report-html.js +1233 -0
  338. package/bin/runners/lib/report-output.js +366 -0
  339. package/bin/runners/lib/report-templates.js +967 -0
  340. package/bin/runners/lib/report.js +135 -0
  341. package/bin/runners/lib/route-detection.js +1209 -0
  342. package/bin/runners/lib/route-truth.js +1322 -0
  343. package/bin/runners/lib/safelist/index.js +96 -0
  344. package/bin/runners/lib/safelist/integration.js +334 -0
  345. package/bin/runners/lib/safelist/matcher.js +696 -0
  346. package/bin/runners/lib/safelist/schema.js +948 -0
  347. package/bin/runners/lib/safelist/store.js +438 -0
  348. package/bin/runners/lib/sandbox/index.js +59 -0
  349. package/bin/runners/lib/sandbox/proof-chain.js +399 -0
  350. package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
  351. package/bin/runners/lib/sandbox/worktree.js +174 -0
  352. package/bin/runners/lib/scan-cache.js +330 -0
  353. package/bin/runners/lib/scan-output-schema.js +344 -0
  354. package/bin/runners/lib/scan-output.js +631 -0
  355. package/bin/runners/lib/scan-runner.js +135 -0
  356. package/bin/runners/lib/schema-validator.js +350 -0
  357. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  358. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  359. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  360. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  361. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  362. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  363. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  364. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  365. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  366. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  367. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  368. package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
  369. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  370. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  371. package/bin/runners/lib/schemas/validator.js +465 -0
  372. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  373. package/bin/runners/lib/score-history.js +282 -0
  374. package/bin/runners/lib/security-bridge.js +249 -0
  375. package/bin/runners/lib/server-usage.js +513 -0
  376. package/bin/runners/lib/share-pack.js +239 -0
  377. package/bin/runners/lib/ship-gate.js +832 -0
  378. package/bin/runners/lib/ship-manifest.js +1153 -0
  379. package/bin/runners/lib/ship-output-enterprise.js +239 -0
  380. package/bin/runners/lib/ship-output.js +1128 -0
  381. package/bin/runners/lib/snippets.js +67 -0
  382. package/bin/runners/lib/status-output.js +340 -0
  383. package/bin/runners/lib/terminal-ui.js +356 -0
  384. package/bin/runners/lib/truth.js +1691 -0
  385. package/bin/runners/lib/ui.js +562 -0
  386. package/bin/runners/lib/unified-cli-output.js +947 -0
  387. package/bin/runners/lib/unified-output.js +197 -0
  388. package/bin/runners/lib/upsell.js +410 -0
  389. package/bin/runners/lib/usage.js +153 -0
  390. package/bin/runners/lib/validate-patch.js +156 -0
  391. package/bin/runners/lib/verdict-engine.js +628 -0
  392. package/bin/runners/lib/verification.js +345 -0
  393. package/bin/runners/lib/why-tree.js +650 -0
  394. package/bin/runners/reality/engine.js +917 -0
  395. package/bin/runners/reality/flows.js +122 -0
  396. package/bin/runners/reality/report.js +378 -0
  397. package/bin/runners/reality/session.js +193 -0
  398. package/bin/runners/runAIAgent.js +229 -0
  399. package/bin/runners/runAgent.d.ts +5 -0
  400. package/bin/runners/runAgent.js +161 -0
  401. package/bin/runners/runAllowlist.js +418 -0
  402. package/bin/runners/runApprove.js +320 -0
  403. package/bin/runners/runAudit.js +692 -0
  404. package/bin/runners/runAuth.js +731 -0
  405. package/bin/runners/runCI.js +353 -0
  406. package/bin/runners/runCheckpoint.js +530 -0
  407. package/bin/runners/runClassify.js +928 -0
  408. package/bin/runners/runCleanup.js +343 -0
  409. package/bin/runners/runContext.d.ts +4 -0
  410. package/bin/runners/runContext.js +175 -0
  411. package/bin/runners/runDoctor.js +877 -0
  412. package/bin/runners/runEvidencePack.js +362 -0
  413. package/bin/runners/runFirewall.d.ts +5 -0
  414. package/bin/runners/runFirewall.js +134 -0
  415. package/bin/runners/runFirewallHook.d.ts +5 -0
  416. package/bin/runners/runFirewallHook.js +56 -0
  417. package/bin/runners/runFix.js +1355 -0
  418. package/bin/runners/runForge.js +451 -0
  419. package/bin/runners/runGuard.js +262 -0
  420. package/bin/runners/runInit.js +1927 -0
  421. package/bin/runners/runIntent.js +906 -0
  422. package/bin/runners/runKickoff.js +878 -0
  423. package/bin/runners/runLabs.js +424 -0
  424. package/bin/runners/runLaunch.js +2000 -0
  425. package/bin/runners/runLink.js +785 -0
  426. package/bin/runners/runMcp.js +1875 -0
  427. package/bin/runners/runPacks.js +2089 -0
  428. package/bin/runners/runPolish.d.ts +4 -0
  429. package/bin/runners/runPolish.js +390 -0
  430. package/bin/runners/runPromptFirewall.js +211 -0
  431. package/bin/runners/runProve.js +1411 -0
  432. package/bin/runners/runQuickstart.js +531 -0
  433. package/bin/runners/runReality.js +2260 -0
  434. package/bin/runners/runReport.js +726 -0
  435. package/bin/runners/runRuntime.js +110 -0
  436. package/bin/runners/runSafelist.js +1190 -0
  437. package/bin/runners/runScan.js +688 -0
  438. package/bin/runners/runShield.js +1282 -0
  439. package/bin/runners/runShip.js +1660 -0
  440. package/bin/runners/runTruth.d.ts +5 -0
  441. package/bin/runners/runTruth.js +101 -0
  442. package/bin/runners/runValidate.js +179 -0
  443. package/bin/runners/runWatch.js +478 -0
  444. package/bin/runners/utils.js +360 -0
  445. package/bin/scan.js +617 -0
  446. package/bin/vibecheck.js +1617 -0
  447. package/dist/guardrail/index.d.ts +2405 -0
  448. package/dist/guardrail/index.js +9747 -0
  449. package/dist/guardrail/index.js.map +1 -0
  450. package/dist/scanner/index.d.ts +282 -0
  451. package/dist/scanner/index.js +3395 -0
  452. package/dist/scanner/index.js.map +1 -0
  453. package/package.json +123 -104
  454. package/README.md +0 -491
  455. package/dist/index.js +0 -99711
  456. package/dist/index.js.map +0 -1
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Hardcoded Secrets Detection Engine
3
+ * Uses AST analysis + entropy to detect hardcoded secrets
4
+ */
5
+
6
+ const { getAST, parseCode } = require("./ast-cache");
7
+ const traverse = require("@babel/traverse").default;
8
+ const t = require("@babel/types");
9
+ const crypto = require("crypto");
10
+ const { shouldExcludeFile } = require("./file-filter");
11
+
12
+ /**
13
+ * Calculate Shannon entropy for a string
14
+ */
15
+ function getShannonEntropy(str) {
16
+ if (!str || str.length === 0) return 0;
17
+ const len = str.length;
18
+ const frequencies = {};
19
+ for (let i = 0; i < len; i++) {
20
+ const char = str[i];
21
+ frequencies[char] = (frequencies[char] || 0) + 1;
22
+ }
23
+
24
+ let entropy = 0;
25
+ for (const char in frequencies) {
26
+ const p = frequencies[char] / len;
27
+ entropy -= p * Math.log2(p);
28
+ }
29
+ return entropy;
30
+ }
31
+
32
+ /**
33
+ * Specific secret patterns (high confidence, no entropy needed)
34
+ */
35
+ const SPECIFIC_PATTERNS = [
36
+ {
37
+ pattern: /^sk_live_[a-zA-Z0-9]{20,}$/,
38
+ label: "Stripe live secret key",
39
+ severity: "BLOCK",
40
+ },
41
+ {
42
+ pattern: /^sk_test_[a-zA-Z0-9]{20,}$/,
43
+ label: "Stripe test secret key",
44
+ severity: "WARN",
45
+ },
46
+ {
47
+ pattern: /^pk_live_[a-zA-Z0-9]{20,}$/,
48
+ label: "Stripe live publishable key",
49
+ severity: "BLOCK",
50
+ },
51
+ {
52
+ pattern: /^AKIA[0-9A-Z]{16}$/,
53
+ label: "AWS Access Key ID",
54
+ severity: "BLOCK",
55
+ },
56
+ {
57
+ pattern: /^ghp_[a-zA-Z0-9]{36}$/,
58
+ label: "GitHub Personal Access Token",
59
+ severity: "BLOCK",
60
+ },
61
+ {
62
+ pattern: /^gho_[a-zA-Z0-9]{36}$/,
63
+ label: "GitHub OAuth Token",
64
+ severity: "BLOCK",
65
+ },
66
+ {
67
+ pattern: /^xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}$/,
68
+ label: "Slack Token",
69
+ severity: "BLOCK",
70
+ },
71
+ {
72
+ pattern: /^eyJ[a-zA-Z0-9_-]{100,}\.[a-zA-Z0-9_-]{100,}\.[a-zA-Z0-9_-]{43,}$/,
73
+ label: "JWT Token (hardcoded)",
74
+ severity: "WARN",
75
+ },
76
+ ];
77
+
78
+ /**
79
+ * Check if string matches a specific secret pattern
80
+ */
81
+ function matchesSpecificPattern(value) {
82
+ for (const { pattern, label, severity } of SPECIFIC_PATTERNS) {
83
+ if (pattern.test(value)) {
84
+ return { label, severity, confidence: "high" };
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+
90
+ /**
91
+ * Check if string looks like a secret based on context and entropy
92
+ */
93
+ function looksLikeSecret(value, context = {}) {
94
+ // Skip common false positives
95
+ if (/^(undefined|null|true|false|localhost|example|placeholder|test|demo|development|production)$/i.test(value)) {
96
+ return null;
97
+ }
98
+
99
+ // Skip hex-only strings (likely Git SHAs, image IDs, hashes)
100
+ if (/^[a-f0-9]{32,}$/i.test(value)) {
101
+ return null;
102
+ }
103
+
104
+ // Skip UUIDs (they have high entropy but are not secrets)
105
+ if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
106
+ return null;
107
+ }
108
+
109
+ // Skip common test/example values
110
+ if (/^(test|example|sample|demo|placeholder|foo|bar|baz|qux)/i.test(value)) {
111
+ return null;
112
+ }
113
+
114
+ // Check entropy
115
+ const entropy = getShannonEntropy(value);
116
+
117
+ // Context-based checks - require explicit secret context
118
+ const hasSecretContext =
119
+ context.variableName && /(password|secret|key|token|credential|api[_-]?key|private[_-]?key|access[_-]?token)/i.test(context.variableName);
120
+
121
+ // Only flag if we have explicit secret context AND high entropy
122
+ if (hasSecretContext && value.length >= 12 && entropy >= 4.0) {
123
+ return {
124
+ label: `Hardcoded ${context.variableName.match(/(password|secret|key|token|credential|api[_-]?key|private[_-]?key|access[_-]?token)/i)?.[0] || "secret"}`,
125
+ severity: "WARN",
126
+ confidence: "med",
127
+ entropy,
128
+ };
129
+ }
130
+
131
+ // Generic high entropy check - be more conservative (require longer strings and higher entropy)
132
+ if (entropy >= 5.0 && value.length >= 32) {
133
+ return {
134
+ label: "Possible hardcoded secret (high entropy)",
135
+ severity: "WARN",
136
+ confidence: "low",
137
+ entropy,
138
+ };
139
+ }
140
+
141
+ return null;
142
+ }
143
+
144
+ /**
145
+ * Analyze a file for hardcoded secrets
146
+ */
147
+ function analyzeHardcodedSecrets(code, filePath) {
148
+ const findings = [];
149
+
150
+ // Skip excluded files (includes .env files)
151
+ if (shouldExcludeFile(filePath)) return findings;
152
+
153
+ const ast = getAST(code, filePath);
154
+ if (!ast) return findings;
155
+
156
+ const lines = code.split("\n");
157
+
158
+ traverse(ast, {
159
+ // Check string literals
160
+ StringLiteral(path) {
161
+ const value = path.node.value;
162
+ if (!value || value.length < 8) return;
163
+
164
+ // Check specific patterns first
165
+ const specificMatch = matchesSpecificPattern(value);
166
+ if (specificMatch) {
167
+ const line = path.node.loc.start.line;
168
+ findings.push({
169
+ type: "specific_secret",
170
+ severity: specificMatch.severity,
171
+ category: "HardcodedSecret",
172
+ file: filePath,
173
+ line,
174
+ column: path.node.loc.start.column,
175
+ title: `${specificMatch.label} detected`,
176
+ message: `${specificMatch.label} found in code`,
177
+ codeSnippet: lines[line - 1]?.trim(),
178
+ confidence: specificMatch.confidence,
179
+ });
180
+ return;
181
+ }
182
+
183
+ // Check generic patterns with context
184
+ const parent = path.parent;
185
+ let variableName = null;
186
+
187
+ if (t.isVariableDeclarator(parent)) {
188
+ variableName = parent.id.name;
189
+ } else if (t.isObjectProperty(parent)) {
190
+ variableName = t.isIdentifier(parent.key) ? parent.key.name : null;
191
+ } else if (t.isAssignmentExpression(parent)) {
192
+ if (t.isIdentifier(parent.left)) {
193
+ variableName = parent.left.name;
194
+ }
195
+ }
196
+
197
+ const secretMatch = looksLikeSecret(value, { variableName });
198
+ if (secretMatch) {
199
+ const line = path.node.loc.start.line;
200
+ findings.push({
201
+ type: "generic_secret",
202
+ severity: secretMatch.severity,
203
+ category: "HardcodedSecret",
204
+ file: filePath,
205
+ line,
206
+ column: path.node.loc.start.column,
207
+ title: secretMatch.label,
208
+ message: `High entropy string (${secretMatch.entropy.toFixed(2)}) detected${variableName ? ` in variable "${variableName}"` : ""}`,
209
+ codeSnippet: lines[line - 1]?.trim(),
210
+ confidence: secretMatch.confidence,
211
+ });
212
+ }
213
+ },
214
+
215
+ // Check template literals
216
+ TemplateLiteral(path) {
217
+ const quasis = path.node.quasis;
218
+ for (const quasi of quasis) {
219
+ if (quasi.value && quasi.value.raw) {
220
+ const value = quasi.value.raw;
221
+ if (value.length >= 8) {
222
+ const specificMatch = matchesSpecificPattern(value);
223
+ if (specificMatch) {
224
+ const line = path.node.loc.start.line;
225
+ findings.push({
226
+ type: "specific_secret",
227
+ severity: specificMatch.severity,
228
+ category: "HardcodedSecret",
229
+ file: filePath,
230
+ line,
231
+ column: path.node.loc.start.column,
232
+ title: `${specificMatch.label} detected`,
233
+ message: `${specificMatch.label} found in template literal`,
234
+ codeSnippet: lines[line - 1]?.trim(),
235
+ confidence: specificMatch.confidence,
236
+ });
237
+ }
238
+ }
239
+ }
240
+ }
241
+ },
242
+ });
243
+
244
+ return findings;
245
+ }
246
+
247
+ module.exports = {
248
+ analyzeHardcodedSecrets,
249
+ parseCode,
250
+ getShannonEntropy,
251
+ };
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Mock Data Detection Engine
3
+ * Uses AST analysis to detect mock/test data patterns in production code
4
+ */
5
+
6
+ const { getAST, parseCode } = require("./ast-cache");
7
+ const traverse = require("@babel/traverse").default;
8
+ const t = require("@babel/types");
9
+ const { shouldExcludeFile } = require("./file-filter");
10
+
11
+ /**
12
+ * Check if a string literal looks like mock/test data
13
+ */
14
+ function isMockString(value) {
15
+ if (typeof value !== "string") return false;
16
+
17
+ const lower = value.toLowerCase();
18
+
19
+ // Mock data patterns
20
+ const mockPatterns = [
21
+ /^(fake|mock|dummy|test|sample|placeholder)[_-]?/i,
22
+ /@(test|example|fake|demo)\.com$/i,
23
+ /^(password|admin|test|secret)123$/i,
24
+ /^test@/i,
25
+ /^(MOCK|FAKE|DUMMY)_API/i,
26
+ ];
27
+
28
+ return mockPatterns.some(pattern => pattern.test(value));
29
+ }
30
+
31
+ /**
32
+ * Check if a variable name suggests mock data
33
+ * Be more conservative - only flag explicit mock/test data variables
34
+ */
35
+ function isMockVariableName(name) {
36
+ if (!name || typeof name !== "string") return false;
37
+
38
+ const lower = name.toLowerCase();
39
+
40
+ // Only flag explicit mock/test data variable names (exact matches or explicit prefixes)
41
+ const mockNamePatterns = [
42
+ /^(fake|mock|dummy)[_-]?(data|user|api|response|value|input)$/i, // Explicit mock prefixes
43
+ /^mockData$/i,
44
+ /^fakeData$/i,
45
+ ];
46
+
47
+ // Exclude common legitimate patterns
48
+ const legitimatePatterns = [
49
+ /sample/i, // "sample" is often legitimate
50
+ /example/i, // "example" is often legitimate
51
+ /demo/i, // "demo" is often legitimate
52
+ /test/i, // "test" alone is often legitimate
53
+ ];
54
+
55
+ // Don't flag if it matches legitimate patterns
56
+ if (legitimatePatterns.some(pattern => pattern.test(name))) {
57
+ return false;
58
+ }
59
+
60
+ return mockNamePatterns.some(pattern => pattern.test(name));
61
+ }
62
+
63
+ /**
64
+ * Check if a call expression is generating random/mock data
65
+ */
66
+ function isRandomDataGeneration(node) {
67
+ if (!t.isCallExpression(node)) return false;
68
+
69
+ const callee = node.callee;
70
+
71
+ // Math.random() with multiplication
72
+ if (t.isMemberExpression(callee) &&
73
+ t.isIdentifier(callee.object) && callee.object.name === "Math" &&
74
+ t.isIdentifier(callee.property) && callee.property.name === "random") {
75
+
76
+ // Check parent for multiplication or comparison
77
+ const parent = node.parent;
78
+ if (t.isBinaryExpression(parent) &&
79
+ (parent.operator === "*" || parent.operator === "<" || parent.operator === ">")) {
80
+ return true;
81
+ }
82
+ }
83
+
84
+ return false;
85
+ }
86
+
87
+ /**
88
+ * Check if setTimeout has suspiciously long delays (simulated delays)
89
+ */
90
+ function isSuspiciousSetTimeout(node) {
91
+ if (!t.isCallExpression(node)) return false;
92
+
93
+ const callee = node.callee;
94
+ if (!t.isIdentifier(callee) || callee.name !== "setTimeout") return false;
95
+
96
+ const args = node.arguments;
97
+ if (args.length < 2) return false;
98
+
99
+ // Check delay argument
100
+ const delay = args[1];
101
+ if (t.isNumericLiteral(delay)) {
102
+ // Suspicious if > 5000ms (5 seconds)
103
+ return delay.value > 5000;
104
+ }
105
+
106
+ return false;
107
+ }
108
+
109
+ /**
110
+ * Analyze a file for mock data patterns
111
+ */
112
+ function analyzeMockData(code, filePath) {
113
+ const findings = [];
114
+
115
+ // Skip excluded files (test files, examples, etc.)
116
+ if (shouldExcludeFile(filePath)) return findings;
117
+
118
+ const ast = getAST(code, filePath);
119
+ if (!ast) return findings;
120
+
121
+ const lines = code.split("\n");
122
+
123
+ traverse(ast, {
124
+ // Check variable declarations
125
+ VariableDeclarator(path) {
126
+ const id = path.node.id;
127
+ const init = path.node.init;
128
+
129
+ // Check variable name
130
+ if (t.isIdentifier(id) && isMockVariableName(id.name)) {
131
+ const line = getLineNumber(path.node, code);
132
+ findings.push({
133
+ type: "mock_variable",
134
+ severity: "WARN",
135
+ category: "MockData",
136
+ file: filePath,
137
+ line,
138
+ column: path.node.loc.start.column,
139
+ title: `Mock data variable: ${id.name}`,
140
+ message: `Variable name suggests mock/test data: ${id.name}`,
141
+ codeSnippet: lines[line - 1]?.trim(),
142
+ confidence: "high",
143
+ });
144
+ }
145
+
146
+ // Check initializer value
147
+ if (init && t.isStringLiteral(init) && isMockString(init.value)) {
148
+ const line = getLineNumber(path.node, code);
149
+ findings.push({
150
+ type: "mock_string_literal",
151
+ severity: "WARN",
152
+ category: "MockData",
153
+ file: filePath,
154
+ line,
155
+ column: path.node.loc.start.column,
156
+ title: "Mock/test string literal detected",
157
+ message: `String value appears to be mock data: "${init.value.substring(0, 50)}"`,
158
+ codeSnippet: lines[line - 1]?.trim(),
159
+ confidence: "med",
160
+ });
161
+ }
162
+ },
163
+
164
+ // Check object properties
165
+ ObjectProperty(path) {
166
+ const key = path.node.key;
167
+ const value = path.node.value;
168
+
169
+ if (t.isIdentifier(key) && isMockVariableName(key.name)) {
170
+ const line = getLineNumber(path.node, code);
171
+ findings.push({
172
+ type: "mock_object_property",
173
+ severity: "WARN",
174
+ category: "MockData",
175
+ file: filePath,
176
+ line,
177
+ column: path.node.loc.start.column,
178
+ title: `Mock data property: ${key.name}`,
179
+ message: `Object property name suggests mock data: ${key.name}`,
180
+ codeSnippet: lines[line - 1]?.trim(),
181
+ confidence: "med",
182
+ });
183
+ }
184
+
185
+ if (t.isStringLiteral(value) && isMockString(value.value)) {
186
+ const line = getLineNumber(path.node, code);
187
+ findings.push({
188
+ type: "mock_property_value",
189
+ severity: "WARN",
190
+ category: "MockData",
191
+ file: filePath,
192
+ line,
193
+ column: path.node.loc.start.column,
194
+ title: "Mock string in object property",
195
+ message: `Property value appears to be mock data: "${value.value.substring(0, 50)}"`,
196
+ codeSnippet: lines[line - 1]?.trim(),
197
+ confidence: "med",
198
+ });
199
+ }
200
+ },
201
+
202
+ // Check call expressions for random data generation
203
+ CallExpression(path) {
204
+ if (isRandomDataGeneration(path.node)) {
205
+ const line = getLineNumber(path.node, code);
206
+ findings.push({
207
+ type: "random_data_generation",
208
+ severity: "WARN",
209
+ category: "MockData",
210
+ file: filePath,
211
+ line,
212
+ column: path.node.loc.start.column,
213
+ title: "Random data generation detected",
214
+ message: "Math.random() used for data generation (may be mock data)",
215
+ codeSnippet: lines[line - 1]?.trim(),
216
+ confidence: "low",
217
+ });
218
+ }
219
+
220
+ if (isSuspiciousSetTimeout(path.node)) {
221
+ const line = getLineNumber(path.node, code);
222
+ findings.push({
223
+ type: "suspicious_settimeout",
224
+ severity: "WARN",
225
+ category: "MockData",
226
+ file: filePath,
227
+ line,
228
+ column: path.node.loc.start.column,
229
+ title: "Long setTimeout delay (possible simulated delay)",
230
+ message: "setTimeout with delay > 5000ms may indicate simulated/mock behavior",
231
+ codeSnippet: lines[line - 1]?.trim(),
232
+ confidence: "low",
233
+ });
234
+ }
235
+ },
236
+
237
+ // Check template literals
238
+ TemplateLiteral(path) {
239
+ const quasis = path.node.quasis;
240
+ for (const quasi of quasis) {
241
+ if (quasi.value && isMockString(quasi.value.raw)) {
242
+ const line = getLineNumber(path.node, code);
243
+ findings.push({
244
+ type: "mock_template_literal",
245
+ severity: "WARN",
246
+ category: "MockData",
247
+ file: filePath,
248
+ line,
249
+ column: path.node.loc.start.column,
250
+ title: "Mock data in template literal",
251
+ message: `Template literal contains mock/test data pattern`,
252
+ codeSnippet: lines[line - 1]?.trim(),
253
+ confidence: "med",
254
+ });
255
+ break;
256
+ }
257
+ }
258
+ },
259
+ });
260
+
261
+ return findings;
262
+ }
263
+
264
+ function getLineNumber(node, code) {
265
+ if (!node || !node.loc) return 1;
266
+ return node.loc.start.line;
267
+ }
268
+
269
+ module.exports = {
270
+ analyzeMockData,
271
+ parseCode,
272
+ };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Parallel File Processor
3
+ * Processes files in parallel with configurable concurrency
4
+ */
5
+
6
+ const os = require("os");
7
+
8
+ /**
9
+ * Process files in parallel batches
10
+ */
11
+ async function processFilesInParallel(files, processor, options = {}) {
12
+ const {
13
+ concurrency = Math.min(os.cpus().length, 8), // Default to CPU count, max 8
14
+ onProgress = null,
15
+ } = options;
16
+
17
+ const results = [];
18
+ const errors = [];
19
+
20
+ // Process in batches
21
+ for (let i = 0; i < files.length; i += concurrency) {
22
+ const batch = files.slice(i, i + concurrency);
23
+
24
+ const batchPromises = batch.map(async (file, index) => {
25
+ try {
26
+ const result = await processor(file);
27
+ if (onProgress) {
28
+ onProgress(i + index + 1, files.length);
29
+ }
30
+ return { file, result, error: null };
31
+ } catch (error) {
32
+ errors.push({ file, error });
33
+ return { file, result: null, error };
34
+ }
35
+ });
36
+
37
+ const batchResults = await Promise.all(batchPromises);
38
+ results.push(...batchResults);
39
+ }
40
+
41
+ return { results, errors };
42
+ }
43
+
44
+ /**
45
+ * Process files sequentially (fallback)
46
+ */
47
+ async function processFilesSequentially(files, processor, onProgress = null) {
48
+ const results = [];
49
+ const errors = [];
50
+
51
+ for (let i = 0; i < files.length; i++) {
52
+ const file = files[i];
53
+ try {
54
+ const result = await processor(file);
55
+ if (onProgress) {
56
+ onProgress(i + 1, files.length);
57
+ }
58
+ results.push({ file, result, error: null });
59
+ } catch (error) {
60
+ errors.push({ file, error });
61
+ results.push({ file, result: null, error });
62
+ }
63
+ }
64
+
65
+ return { results, errors };
66
+ }
67
+
68
+ module.exports = {
69
+ processFilesInParallel,
70
+ processFilesSequentially,
71
+ };