vibecheck-ai 2.0.1 → 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,124 @@
1
+ // bin/runners/lib/engine/types.js
2
+ // JSDoc type definitions for the engine
3
+
4
+ /**
5
+ * @typedef {Object} FileRecord
6
+ * @property {string} abs - Absolute path
7
+ * @property {string} rel - Relative path from repo root (forward slashes)
8
+ * @property {number} size - File size in bytes
9
+ * @property {number} mtime - Last modified time (ms since epoch)
10
+ * @property {string} hash - Content hash (sha256)
11
+ * @property {string} [ext] - File extension (e.g., ".ts", ".js")
12
+ */
13
+
14
+ /**
15
+ * @typedef {Object} RepoSignals
16
+ * @property {boolean} hasPackageJson
17
+ * @property {boolean} hasRequirementsTxt
18
+ * @property {boolean} hasPyprojectToml
19
+ * @property {boolean} hasGoMod
20
+ * @property {boolean} hasGemfile
21
+ * @property {boolean} hasNextApp - has app/ directory
22
+ * @property {boolean} hasNextPages - has pages/ directory
23
+ * @property {boolean} hasOpenAPI
24
+ * @property {boolean} hasGraphQL
25
+ * @property {Set<string>} detectedFrameworks
26
+ */
27
+
28
+ /**
29
+ * @typedef {Object} RepoIndexResult
30
+ * @property {FileRecord[]} files - All indexed files
31
+ * @property {RepoSignals} signals - Detected signals
32
+ * @property {Map<string, string>} contentCache - abs -> content
33
+ * @property {Map<string, Set<string>>} tokenIndex - token -> Set<abs>
34
+ * @property {Object} stats
35
+ * @property {number} stats.totalFiles
36
+ * @property {number} stats.totalSize
37
+ * @property {number} stats.indexTimeMs
38
+ */
39
+
40
+ /**
41
+ * @typedef {Object} Evidence
42
+ * @property {string} id - Unique evidence ID (ev_xxxx)
43
+ * @property {string} file - Relative file path
44
+ * @property {string} lines - Line range (e.g., "10-15")
45
+ * @property {string} snippetHash - SHA256 of snippet
46
+ * @property {string} reason - Why this is evidence
47
+ */
48
+
49
+ /**
50
+ * @typedef {Object} RouteFact
51
+ * @property {string} method - HTTP method (GET, POST, *, etc.)
52
+ * @property {string} path - Canonicalized route path
53
+ * @property {string} handler - Relative file path
54
+ * @property {string} framework - Source framework
55
+ * @property {"high"|"med"|"low"} confidence
56
+ * @property {Evidence[]} evidence
57
+ * @property {string[]} [hooks] - Fastify hooks if present
58
+ */
59
+
60
+ /**
61
+ * @typedef {Object} ClientRefFact
62
+ * @property {string} method - HTTP method or "*"
63
+ * @property {string} path - Canonicalized path
64
+ * @property {string} source - Relative file path
65
+ * @property {"high"|"med"|"low"} confidence
66
+ * @property {string} kind - fetch, axios_member, axios_config, useSWR, useQuery
67
+ * @property {Evidence[]} evidence
68
+ */
69
+
70
+ /**
71
+ * @typedef {Object} EnvFact
72
+ * @property {string} name - Environment variable name
73
+ * @property {string[]} files - Files where it's referenced
74
+ * @property {boolean} hasDefault - Whether a default value exists
75
+ * @property {string} [defaultValue] - Default value if any
76
+ */
77
+
78
+ /**
79
+ * @typedef {Object} Gap
80
+ * @property {string} kind - Gap type (e.g., "fastify_plugin_unresolved")
81
+ * @property {string} [file] - Related file
82
+ * @property {string} [spec] - Module specifier
83
+ * @property {string} [name] - Identifier name
84
+ * @property {string} [note] - Additional notes
85
+ * @property {string} [error] - Error message if from catch
86
+ */
87
+
88
+ /**
89
+ * @typedef {Object} AdapterResult
90
+ * @property {RouteFact[]} routes
91
+ * @property {ClientRefFact[]} clientRefs
92
+ * @property {Gap[]} gaps
93
+ * @property {Object} stats
94
+ * @property {number} stats.filesScanned
95
+ * @property {number} stats.parseErrors
96
+ * @property {number} [quality] - 0-1 extraction quality score
97
+ */
98
+
99
+ /**
100
+ * @typedef {Object} Finding
101
+ * @property {string} id - Stable finding ID
102
+ * @property {string} title
103
+ * @property {string} description
104
+ * @property {"info"|"warn"|"block"} severity
105
+ * @property {"high"|"med"|"low"} confidence
106
+ * @property {Evidence[]} evidence
107
+ * @property {Gap[]} [gaps]
108
+ * @property {string} [suggestedFix]
109
+ * @property {string} [category]
110
+ */
111
+
112
+ /**
113
+ * @typedef {Object} ScanResult
114
+ * @property {Finding[]} findings
115
+ * @property {Object} truthpack
116
+ * @property {Object} stats
117
+ * @property {number} stats.scanTimeMs
118
+ * @property {number} stats.filesIndexed
119
+ * @property {number} stats.routesFound
120
+ * @property {number} stats.clientRefsFound
121
+ * @property {number} stats.gapsFound
122
+ */
123
+
124
+ module.exports = {};
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Accessibility Analysis Engine
3
+ * Detects accessibility issues in React/JSX code
4
+ */
5
+
6
+ const { getAST } = require("./ast-cache");
7
+ const traverse = require("@babel/traverse").default;
8
+ const t = require("@babel/types");
9
+
10
+ /**
11
+ * Analyze accessibility issues
12
+ */
13
+ function analyzeAccessibility(code, filePath) {
14
+ const findings = [];
15
+ const ast = getAST(code, filePath);
16
+ if (!ast) return findings;
17
+
18
+ const lines = code.split("\n");
19
+ const isJSX = filePath.endsWith(".jsx") || filePath.endsWith(".tsx");
20
+
21
+ if (!isJSX) return findings; // Only analyze JSX files
22
+
23
+ traverse(ast, {
24
+ JSXElement(path) {
25
+ const node = path.node;
26
+ const openingElement = node.openingElement;
27
+ const tagName = openingElement.name.name;
28
+
29
+ // Missing alt text on images
30
+ if (tagName === "img") {
31
+ const hasAlt = openingElement.attributes.some(attr =>
32
+ t.isJSXAttribute(attr) && attr.name.name === "alt"
33
+ );
34
+
35
+ if (!hasAlt) {
36
+ const line = openingElement.loc.start.line;
37
+ findings.push({
38
+ type: "missing_alt_text",
39
+ severity: "BLOCK",
40
+ category: "Accessibility",
41
+ file: filePath,
42
+ line,
43
+ column: openingElement.loc.start.column,
44
+ title: "Image missing alt text",
45
+ message: "Images must have alt text for screen readers",
46
+ codeSnippet: lines[line - 1]?.trim(),
47
+ confidence: "high",
48
+ });
49
+ }
50
+ }
51
+
52
+ // Interactive elements without accessible labels
53
+ const interactiveElements = ["button", "a", "input", "select", "textarea"];
54
+ if (interactiveElements.includes(tagName)) {
55
+ const hasLabel = openingElement.attributes.some(attr =>
56
+ t.isJSXAttribute(attr) &&
57
+ (attr.name.name === "aria-label" ||
58
+ attr.name.name === "aria-labelledby" ||
59
+ attr.name.name === "title")
60
+ );
61
+
62
+ // Check for associated label element
63
+ const hasAssociatedLabel = path.findParent(p => {
64
+ if (t.isJSXElement(p.node)) {
65
+ return p.node.openingElement.name.name === "label";
66
+ }
67
+ return false;
68
+ });
69
+
70
+ if (!hasLabel && !hasAssociatedLabel && tagName !== "a") {
71
+ const line = openingElement.loc.start.line;
72
+ findings.push({
73
+ type: "missing_accessible_label",
74
+ severity: "WARN",
75
+ category: "Accessibility",
76
+ file: filePath,
77
+ line,
78
+ column: openingElement.loc.start.column,
79
+ title: `${tagName} element missing accessible label`,
80
+ message: `Add aria-label, aria-labelledby, or wrap in <label>`,
81
+ codeSnippet: lines[line - 1]?.trim(),
82
+ confidence: "med",
83
+ });
84
+ }
85
+ }
86
+
87
+ // Missing form labels
88
+ if (tagName === "input" || tagName === "select" || tagName === "textarea") {
89
+ const inputType = openingElement.attributes.find(attr =>
90
+ t.isJSXAttribute(attr) && attr.name.name === "type"
91
+ );
92
+ const typeValue = inputType && t.isStringLiteral(inputType.value)
93
+ ? inputType.value.value
94
+ : "text";
95
+
96
+ // Skip hidden inputs
97
+ if (typeValue === "hidden") return;
98
+
99
+ const hasLabel = openingElement.attributes.some(attr =>
100
+ t.isJSXAttribute(attr) &&
101
+ (attr.name.name === "aria-label" ||
102
+ attr.name.name === "aria-labelledby" ||
103
+ attr.name.name === "id")
104
+ );
105
+
106
+ if (!hasLabel) {
107
+ const line = openingElement.loc.start.line;
108
+ findings.push({
109
+ type: "missing_form_label",
110
+ severity: "WARN",
111
+ category: "Accessibility",
112
+ file: filePath,
113
+ line,
114
+ column: openingElement.loc.start.column,
115
+ title: "Form input missing label",
116
+ message: "Form inputs should have associated labels",
117
+ codeSnippet: lines[line - 1]?.trim(),
118
+ confidence: "med",
119
+ });
120
+ }
121
+ }
122
+
123
+ // Missing keyboard handlers on interactive elements
124
+ if (tagName === "div" || tagName === "span") {
125
+ const hasOnClick = openingElement.attributes.some(attr =>
126
+ t.isJSXAttribute(attr) &&
127
+ (attr.name.name === "onClick" || attr.name.name === "onKeyDown")
128
+ );
129
+
130
+ const hasRole = openingElement.attributes.some(attr =>
131
+ t.isJSXAttribute(attr) && attr.name.name === "role"
132
+ );
133
+
134
+ if (hasOnClick && !hasRole) {
135
+ const line = openingElement.loc.start.line;
136
+ findings.push({
137
+ type: "missing_keyboard_handler",
138
+ severity: "WARN",
139
+ category: "Accessibility",
140
+ file: filePath,
141
+ line,
142
+ column: openingElement.loc.start.column,
143
+ title: "Interactive element missing keyboard support",
144
+ message: "Elements with onClick should have onKeyDown and proper role",
145
+ codeSnippet: lines[line - 1]?.trim(),
146
+ confidence: "med",
147
+ });
148
+ }
149
+ }
150
+
151
+ // Color contrast issues (heuristic: inline styles with low contrast colors)
152
+ const styleAttr = openingElement.attributes.find(attr =>
153
+ t.isJSXAttribute(attr) && attr.name.name === "style"
154
+ );
155
+
156
+ if (styleAttr && t.isJSXExpressionContainer(styleAttr.value)) {
157
+ const styleExpr = styleAttr.value.expression;
158
+ if (t.isObjectExpression(styleExpr)) {
159
+ const colorProp = styleExpr.properties.find(prop =>
160
+ t.isObjectProperty(prop) &&
161
+ t.isIdentifier(prop.key) &&
162
+ prop.key.name === "color"
163
+ );
164
+
165
+ if (colorProp) {
166
+ const line = openingElement.loc.start.line;
167
+ findings.push({
168
+ type: "potential_contrast_issue",
169
+ severity: "WARN",
170
+ category: "Accessibility",
171
+ file: filePath,
172
+ line,
173
+ column: openingElement.loc.start.column,
174
+ title: "Potential color contrast issue",
175
+ message: "Inline color styles may not meet WCAG contrast requirements - verify with contrast checker",
176
+ codeSnippet: lines[line - 1]?.trim(),
177
+ confidence: "low",
178
+ });
179
+ }
180
+ }
181
+ }
182
+ },
183
+ });
184
+
185
+ return findings;
186
+ }
187
+
188
+ module.exports = {
189
+ analyzeAccessibility,
190
+ };
@@ -0,0 +1,162 @@
1
+ /**
2
+ * API Consistency Engine
3
+ * Checks API route consistency, response formats, error handling patterns
4
+ */
5
+
6
+ const { getAST } = require("./ast-cache");
7
+ const traverse = require("@babel/traverse").default;
8
+ const t = require("@babel/types");
9
+
10
+ /**
11
+ * Analyze API consistency issues
12
+ */
13
+ function analyzeAPIConsistency(code, filePath) {
14
+ const findings = [];
15
+ const ast = getAST(code, filePath);
16
+ if (!ast) return findings;
17
+
18
+ const lines = code.split("\n");
19
+ const isAPIRoute = filePath.includes("/api/") || filePath.includes("/routes/");
20
+
21
+ if (!isAPIRoute) return findings;
22
+
23
+ const responseFormats = new Set();
24
+ const errorHandlingPatterns = new Set();
25
+ let hasErrorHandler = false;
26
+
27
+ traverse(ast, {
28
+ // Check response formats
29
+ CallExpression(path) {
30
+ const node = path.node;
31
+
32
+ // Next.js API routes
33
+ if (t.isMemberExpression(node.callee) &&
34
+ t.isIdentifier(node.callee.object, { name: "NextResponse" })) {
35
+ const method = node.callee.property.name;
36
+ if (["json", "redirect", "next"].includes(method)) {
37
+ responseFormats.add(`NextResponse.${method}`);
38
+ }
39
+ }
40
+
41
+ // Express-style responses
42
+ if (t.isMemberExpression(node.callee)) {
43
+ const prop = node.callee.property;
44
+ if (t.isIdentifier(prop) &&
45
+ ["json", "send", "status", "redirect"].includes(prop.name)) {
46
+ responseFormats.add(`res.${prop.name}`);
47
+ }
48
+ }
49
+
50
+ // Error handling
51
+ if (t.isMemberExpression(node.callee) &&
52
+ t.isIdentifier(node.callee.property, { name: "catch" })) {
53
+ hasErrorHandler = true;
54
+ errorHandlingPatterns.add("promise.catch");
55
+ }
56
+ },
57
+
58
+ // Try-catch blocks
59
+ TryStatement(path) {
60
+ hasErrorHandler = true;
61
+ errorHandlingPatterns.add("try-catch");
62
+ },
63
+
64
+ // Check for inconsistent error responses
65
+ IfStatement(path) {
66
+ const test = path.node.test;
67
+ if (t.isBinaryExpression(test) &&
68
+ (test.operator === "===" || test.operator === "==")) {
69
+ const left = test.left;
70
+ const right = test.right;
71
+
72
+ // Check for error status checks
73
+ if ((t.isMemberExpression(left) &&
74
+ t.isIdentifier(left.property, { name: "status" })) ||
75
+ (t.isMemberExpression(left) &&
76
+ t.isIdentifier(left.property, { name: "ok" }))) {
77
+ const thenBlock = path.node.consequent;
78
+ const elseBlock = path.node.alternate;
79
+
80
+ // Check if error response is consistent
81
+ if (thenBlock && !elseBlock) {
82
+ const line = path.node.loc.start.line;
83
+ findings.push({
84
+ type: "missing_error_response",
85
+ severity: "WARN",
86
+ category: "APIConsistency",
87
+ file: filePath,
88
+ line,
89
+ column: path.node.loc.start.column,
90
+ title: "Missing error response handling",
91
+ message: "Error condition checked but no error response returned",
92
+ codeSnippet: lines[line - 1]?.trim(),
93
+ confidence: "med",
94
+ });
95
+ }
96
+ }
97
+ }
98
+ },
99
+ });
100
+
101
+ // Check for inconsistent response formats
102
+ if (responseFormats.size > 1) {
103
+ findings.push({
104
+ type: "inconsistent_response_format",
105
+ severity: "WARN",
106
+ category: "APIConsistency",
107
+ file: filePath,
108
+ line: 1,
109
+ column: 0,
110
+ title: "Inconsistent API response formats",
111
+ message: `Multiple response formats used: ${Array.from(responseFormats).join(", ")}`,
112
+ confidence: "low",
113
+ });
114
+ }
115
+
116
+ // Check for missing error handling
117
+ if (!hasErrorHandler && isAPIRoute) {
118
+ findings.push({
119
+ type: "missing_error_handling",
120
+ severity: "WARN",
121
+ category: "APIConsistency",
122
+ file: filePath,
123
+ line: 1,
124
+ column: 0,
125
+ title: "API route missing error handling",
126
+ message: "API route should have try-catch or promise error handling",
127
+ confidence: "med",
128
+ });
129
+ }
130
+
131
+ // Check for missing status codes
132
+ let hasStatusCode = false;
133
+ traverse(ast, {
134
+ CallExpression(path) {
135
+ const node = path.node;
136
+ if (t.isMemberExpression(node.callee) &&
137
+ t.isIdentifier(node.callee.property, { name: "status" })) {
138
+ hasStatusCode = true;
139
+ }
140
+ },
141
+ });
142
+
143
+ if (!hasStatusCode && responseFormats.size > 0) {
144
+ findings.push({
145
+ type: "missing_status_code",
146
+ severity: "WARN",
147
+ category: "APIConsistency",
148
+ file: filePath,
149
+ line: 1,
150
+ column: 0,
151
+ title: "API response missing explicit status code",
152
+ message: "API responses should explicitly set HTTP status codes",
153
+ confidence: "med",
154
+ });
155
+ }
156
+
157
+ return findings;
158
+ }
159
+
160
+ module.exports = {
161
+ analyzeAPIConsistency,
162
+ };
@@ -0,0 +1,99 @@
1
+ /**
2
+ * AST Cache - Shared AST parsing cache for all engines
3
+ * Dramatically improves performance by parsing each file only once
4
+ */
5
+
6
+ const parser = require("@babel/parser");
7
+ const traverse = require("@babel/traverse").default;
8
+ const t = require("@babel/types");
9
+
10
+ // Global AST cache: filePath -> { ast, code, timestamp }
11
+ const _AST_CACHE = new Map();
12
+ const _CACHE_MAX_SIZE = 10000; // Prevent memory issues in huge monorepos
13
+
14
+ /**
15
+ * Parse code with comprehensive plugin support
16
+ */
17
+ function parseCode(code, filePath = "") {
18
+ try {
19
+ return parser.parse(code, {
20
+ sourceType: "unambiguous",
21
+ errorRecovery: true,
22
+ allowReturnOutsideFunction: true,
23
+ plugins: [
24
+ "typescript",
25
+ "jsx",
26
+ "dynamicImport",
27
+ "topLevelAwait",
28
+ "classProperties",
29
+ "classPrivateProperties",
30
+ "decorators-legacy",
31
+ "exportDefaultFrom",
32
+ "exportNamespaceFrom",
33
+ "functionBind",
34
+ "nullishCoalescingOperator",
35
+ "optionalChaining",
36
+ "objectRestSpread",
37
+ ],
38
+ });
39
+ } catch (err) {
40
+ return null;
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Get AST from cache or parse and cache it
46
+ */
47
+ function getAST(code, filePath) {
48
+ // Check cache first
49
+ if (_AST_CACHE.has(filePath)) {
50
+ const cached = _AST_CACHE.get(filePath);
51
+ // Verify code hasn't changed (simple hash check)
52
+ if (cached.code === code) {
53
+ return cached.ast;
54
+ }
55
+ }
56
+
57
+ // Parse and cache
58
+ const ast = parseCode(code, filePath);
59
+ if (ast) {
60
+ // Evict oldest entries if cache is too large
61
+ if (_AST_CACHE.size >= _CACHE_MAX_SIZE) {
62
+ const firstKey = _AST_CACHE.keys().next().value;
63
+ _AST_CACHE.delete(firstKey);
64
+ }
65
+
66
+ _AST_CACHE.set(filePath, {
67
+ ast,
68
+ code,
69
+ timestamp: Date.now(),
70
+ });
71
+ }
72
+
73
+ return ast;
74
+ }
75
+
76
+ /**
77
+ * Clear AST cache (call after scan completes)
78
+ */
79
+ function clearASTCache() {
80
+ _AST_CACHE.clear();
81
+ }
82
+
83
+ /**
84
+ * Get cache stats
85
+ */
86
+ function getCacheStats() {
87
+ return {
88
+ size: _AST_CACHE.size,
89
+ maxSize: _CACHE_MAX_SIZE,
90
+ hitRate: 0, // Could track this if needed
91
+ };
92
+ }
93
+
94
+ module.exports = {
95
+ getAST,
96
+ parseCode,
97
+ clearASTCache,
98
+ getCacheStats,
99
+ };