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,265 @@
1
+ /**
2
+ * Performance Issues Detection Engine
3
+ * Detects memory leaks, inefficient loops, large bundle sizes, and performance anti-patterns
4
+ */
5
+
6
+ const { getAST } = 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
+ * Analyze a file for performance issues
13
+ */
14
+ function analyzePerformanceIssues(code, filePath) {
15
+ const findings = [];
16
+
17
+ // Skip excluded files
18
+ if (shouldExcludeFile(filePath)) return findings;
19
+
20
+ const ast = getAST(code, filePath);
21
+ if (!ast) return findings;
22
+
23
+ const lines = code.split("\n");
24
+
25
+ // Memory leaks: Event listeners not removed
26
+ traverse(ast, {
27
+ CallExpression(path) {
28
+ const node = path.node;
29
+
30
+ // Check for addEventListener without corresponding removeEventListener
31
+ if (t.isMemberExpression(node.callee)) {
32
+ const prop = node.callee.property;
33
+
34
+ if (t.isIdentifier(prop) && prop.name === "addEventListener") {
35
+ // Check if there's a corresponding removeEventListener in the same scope
36
+ const scope = path.scope;
37
+ const hasRemoveListener = scope.getAllBindings().some((binding, name) => {
38
+ return name.includes("removeEventListener") || name.includes("removeListener");
39
+ });
40
+
41
+ // Also check if it's in a useEffect cleanup (React)
42
+ const parent = path.findParent(p =>
43
+ t.isCallExpression(p.node) &&
44
+ t.isIdentifier(p.node.callee, { name: "useEffect" })
45
+ );
46
+
47
+ if (!hasRemoveListener && !parent) {
48
+ const line = node.loc.start.line;
49
+ findings.push({
50
+ type: "memory_leak",
51
+ severity: "WARN",
52
+ category: "Performance",
53
+ file: filePath,
54
+ line,
55
+ column: node.loc.start.column,
56
+ title: "Potential memory leak: Event listener not removed",
57
+ message: "addEventListener called without corresponding removeEventListener",
58
+ codeSnippet: lines[line - 1]?.trim(),
59
+ confidence: "med",
60
+ });
61
+ }
62
+ }
63
+ }
64
+ },
65
+ });
66
+
67
+ // Inefficient loops: nested loops with O(n²) complexity
68
+ // Only flag if depth >= 4 (3 levels is often acceptable)
69
+ let loopDepth = 0;
70
+ traverse(ast, {
71
+ enter(path) {
72
+ if (t.isForStatement(path.node) ||
73
+ t.isForInStatement(path.node) ||
74
+ t.isForOfStatement(path.node) ||
75
+ t.isWhileStatement(path.node)) {
76
+ loopDepth++;
77
+
78
+ // Only flag deeply nested loops (4+ levels)
79
+ if (loopDepth >= 4) {
80
+ const line = path.node.loc.start.line;
81
+ findings.push({
82
+ type: "nested_loops",
83
+ severity: "WARN",
84
+ category: "Performance",
85
+ file: filePath,
86
+ line,
87
+ column: path.node.loc.start.column,
88
+ title: "Deeply nested loops detected",
89
+ message: `Nested loop depth: ${loopDepth} - consider optimizing with early returns or data structures`,
90
+ codeSnippet: lines[line - 1]?.trim(),
91
+ confidence: "med",
92
+ });
93
+ }
94
+ }
95
+ },
96
+ exit(path) {
97
+ if (t.isForStatement(path.node) ||
98
+ t.isForInStatement(path.node) ||
99
+ t.isForOfStatement(path.node) ||
100
+ t.isWhileStatement(path.node)) {
101
+ loopDepth--;
102
+ }
103
+ },
104
+ });
105
+
106
+ // Large array operations without pagination
107
+ // Only flag if it's clearly a large dataset from API
108
+ traverse(ast, {
109
+ CallExpression(path) {
110
+ const node = path.node;
111
+
112
+ // Array methods that process all elements
113
+ if (t.isMemberExpression(node.callee)) {
114
+ const prop = node.callee.property;
115
+
116
+ if (t.isIdentifier(prop) &&
117
+ ["map", "filter", "forEach", "reduce"].includes(prop.name)) {
118
+
119
+ // Only flag if array comes directly from fetch AND there's no pagination logic nearby
120
+ const obj = node.callee.object;
121
+ if (t.isCallExpression(obj) &&
122
+ t.isIdentifier(obj.callee, { name: "fetch" })) {
123
+
124
+ // Check if there's pagination logic in the same function
125
+ const functionParent = path.findParent(p =>
126
+ t.isFunctionDeclaration(p.node) ||
127
+ t.isArrowFunctionExpression(p.node) ||
128
+ t.isFunctionExpression(p.node)
129
+ );
130
+
131
+ if (functionParent) {
132
+ const funcCode = code.substring(functionParent.node.start, functionParent.node.end);
133
+ const hasPagination = /page|limit|offset|pagination/i.test(funcCode);
134
+
135
+ if (!hasPagination) {
136
+ const line = node.loc.start.line;
137
+ findings.push({
138
+ type: "large_array_operation",
139
+ severity: "WARN",
140
+ category: "Performance",
141
+ file: filePath,
142
+ line,
143
+ column: node.loc.start.column,
144
+ title: "Large array operation without pagination",
145
+ message: "Processing entire dataset from API - consider pagination or server-side filtering",
146
+ codeSnippet: lines[line - 1]?.trim(),
147
+ confidence: "low",
148
+ });
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ },
155
+ });
156
+
157
+ // Synchronous file operations in async contexts
158
+ traverse(ast, {
159
+ CallExpression(path) {
160
+ const node = path.node;
161
+
162
+ if (t.isMemberExpression(node.callee) &&
163
+ t.isIdentifier(node.callee.object, { name: "fs" })) {
164
+ const prop = node.callee.property;
165
+
166
+ if (t.isIdentifier(prop) && prop.name.endsWith("Sync")) {
167
+ // Check if we're in an async function
168
+ const asyncParent = path.findParent(p =>
169
+ t.isFunctionDeclaration(p.node) || t.isArrowFunctionExpression(p.node)
170
+ );
171
+
172
+ if (asyncParent && asyncParent.node.async) {
173
+ const line = node.loc.start.line;
174
+ findings.push({
175
+ type: "sync_in_async",
176
+ severity: "WARN",
177
+ category: "Performance",
178
+ file: filePath,
179
+ line,
180
+ column: node.loc.start.column,
181
+ title: "Synchronous operation in async context",
182
+ message: `Using ${prop.name} in async function - use async version instead`,
183
+ codeSnippet: lines[line - 1]?.trim(),
184
+ confidence: "med",
185
+ });
186
+ }
187
+ }
188
+ }
189
+ },
190
+ });
191
+
192
+ // Unnecessary re-renders: setState in render
193
+ traverse(ast, {
194
+ CallExpression(path) {
195
+ const node = path.node;
196
+
197
+ if (t.isMemberExpression(node.callee)) {
198
+ const prop = node.callee.property;
199
+
200
+ if (t.isIdentifier(prop) &&
201
+ (prop.name.startsWith("set") || prop.name === "forceUpdate")) {
202
+
203
+ // Check if we're in a render function or component body
204
+ const functionParent = path.findParent(p =>
205
+ t.isFunctionDeclaration(p.node) || t.isArrowFunctionExpression(p.node)
206
+ );
207
+
208
+ if (functionParent) {
209
+ const funcName = functionParent.node.id?.name || "";
210
+ if (funcName.includes("render") || funcName.includes("Render")) {
211
+ const line = node.loc.start.line;
212
+ findings.push({
213
+ type: "setstate_in_render",
214
+ severity: "WARN",
215
+ category: "Performance",
216
+ file: filePath,
217
+ line,
218
+ column: node.loc.start.column,
219
+ title: "State update in render function",
220
+ message: "Calling setState in render causes infinite re-render loop",
221
+ codeSnippet: lines[line - 1]?.trim(),
222
+ confidence: "high",
223
+ });
224
+ }
225
+ }
226
+ }
227
+ }
228
+ },
229
+ });
230
+
231
+ // Large bundle imports: importing entire libraries
232
+ traverse(ast, {
233
+ ImportDeclaration(path) {
234
+ const node = path.node;
235
+
236
+ // Check for wildcard imports from large libraries
237
+ if (node.specifiers.some(s => t.isImportNamespaceSpecifier(s))) {
238
+ const source = node.source.value;
239
+ const largeLibraries = ["lodash", "moment", "rxjs", "ramda"];
240
+
241
+ if (largeLibraries.some(lib => source.includes(lib))) {
242
+ const line = node.loc.start.line;
243
+ findings.push({
244
+ type: "large_import",
245
+ severity: "WARN",
246
+ category: "Performance",
247
+ file: filePath,
248
+ line,
249
+ column: node.loc.start.column,
250
+ title: "Large library import",
251
+ message: `Importing entire ${source} library - use tree-shaking or import specific functions`,
252
+ codeSnippet: lines[line - 1]?.trim(),
253
+ confidence: "med",
254
+ });
255
+ }
256
+ }
257
+ },
258
+ });
259
+
260
+ return findings;
261
+ }
262
+
263
+ module.exports = {
264
+ analyzePerformanceIssues,
265
+ };
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Security Vulnerabilities Detection Engine
3
+ * Detects SQL injection, XSS, command injection, path traversal, and other security issues
4
+ */
5
+
6
+ const { getAST } = 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
+ * Analyze a file for security vulnerabilities
13
+ */
14
+ function analyzeSecurityVulnerabilities(code, filePath) {
15
+ const findings = [];
16
+
17
+ // Skip excluded files
18
+ if (shouldExcludeFile(filePath)) return findings;
19
+
20
+ const ast = getAST(code, filePath);
21
+ if (!ast) return findings;
22
+
23
+ const lines = code.split("\n");
24
+
25
+ // SQL Injection patterns
26
+ traverse(ast, {
27
+ CallExpression(path) {
28
+ const node = path.node;
29
+
30
+ // Check for SQL query construction with user input
31
+ if (t.isMemberExpression(node.callee)) {
32
+ const obj = node.callee.object;
33
+ const prop = node.callee.property;
34
+
35
+ // Database query methods
36
+ if (t.isIdentifier(prop) &&
37
+ ["query", "execute", "exec", "run"].includes(prop.name)) {
38
+
39
+ // Check if arguments contain template literals or string concatenation
40
+ for (const arg of node.arguments) {
41
+ if (t.isTemplateLiteral(arg) ||
42
+ (t.isBinaryExpression(arg) && arg.operator === "+")) {
43
+ const line = node.loc.start.line;
44
+ findings.push({
45
+ type: "sql_injection",
46
+ severity: "BLOCK",
47
+ category: "Security",
48
+ file: filePath,
49
+ line,
50
+ column: node.loc.start.column,
51
+ title: "Potential SQL injection vulnerability",
52
+ message: "SQL query constructed with user input without parameterization",
53
+ codeSnippet: lines[line - 1]?.trim(),
54
+ confidence: "high",
55
+ });
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ },
62
+ });
63
+
64
+ // XSS vulnerabilities
65
+ traverse(ast, {
66
+ CallExpression(path) {
67
+ const node = path.node;
68
+
69
+ // Dangerous DOM manipulation methods
70
+ if (t.isMemberExpression(node.callee)) {
71
+ const obj = node.callee.object;
72
+ const prop = node.callee.property;
73
+
74
+ if (t.isIdentifier(prop) &&
75
+ ["innerHTML", "outerHTML", "insertAdjacentHTML"].includes(prop.name)) {
76
+
77
+ // Check if argument comes from user input or URL params
78
+ for (const arg of node.arguments) {
79
+ if (t.isIdentifier(arg) || t.isMemberExpression(arg)) {
80
+ const line = node.loc.start.line;
81
+ findings.push({
82
+ type: "xss",
83
+ severity: "BLOCK",
84
+ category: "Security",
85
+ file: filePath,
86
+ line,
87
+ column: node.loc.start.column,
88
+ title: "Potential XSS vulnerability",
89
+ message: `Using ${prop.name} with potentially unsafe content`,
90
+ codeSnippet: lines[line - 1]?.trim(),
91
+ confidence: "med",
92
+ });
93
+ break;
94
+ }
95
+ }
96
+ }
97
+ }
98
+ },
99
+ });
100
+
101
+ // Command injection
102
+ traverse(ast, {
103
+ CallExpression(path) {
104
+ const node = path.node;
105
+
106
+ // Dangerous command execution methods
107
+ if (t.isIdentifier(node.callee)) {
108
+ const dangerousMethods = ["exec", "spawn", "execSync", "spawnSync"];
109
+
110
+ if (dangerousMethods.includes(node.callee.name)) {
111
+ // Check if arguments contain user input
112
+ for (const arg of node.arguments) {
113
+ if (t.isTemplateLiteral(arg) ||
114
+ (t.isBinaryExpression(arg) && arg.operator === "+")) {
115
+ const line = node.loc.start.line;
116
+ findings.push({
117
+ type: "command_injection",
118
+ severity: "BLOCK",
119
+ category: "Security",
120
+ file: filePath,
121
+ line,
122
+ column: node.loc.start.column,
123
+ title: "Potential command injection vulnerability",
124
+ message: "Command execution with potentially unsafe user input",
125
+ codeSnippet: lines[line - 1]?.trim(),
126
+ confidence: "high",
127
+ });
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ },
134
+ });
135
+
136
+ // Path traversal
137
+ traverse(ast, {
138
+ CallExpression(path) {
139
+ const node = path.node;
140
+
141
+ // File system operations
142
+ if (t.isMemberExpression(node.callee) &&
143
+ t.isIdentifier(node.callee.object, { name: "fs" })) {
144
+ const prop = node.callee.property;
145
+
146
+ if (t.isIdentifier(prop) &&
147
+ ["readFile", "writeFile", "readFileSync", "writeFileSync", "unlink"].includes(prop.name)) {
148
+
149
+ // Check if path contains user input or "../"
150
+ for (const arg of node.arguments) {
151
+ if (t.isTemplateLiteral(arg)) {
152
+ const template = code.substring(arg.start, arg.end);
153
+ if (template.includes("../") || template.includes("..\\")) {
154
+ const line = node.loc.start.line;
155
+ findings.push({
156
+ type: "path_traversal",
157
+ severity: "BLOCK",
158
+ category: "Security",
159
+ file: filePath,
160
+ line,
161
+ column: node.loc.start.column,
162
+ title: "Potential path traversal vulnerability",
163
+ message: "File operation with path containing '..' - validate and sanitize paths",
164
+ codeSnippet: lines[line - 1]?.trim(),
165
+ confidence: "high",
166
+ });
167
+ break;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ },
174
+ });
175
+
176
+ // Insecure random number generation
177
+ traverse(ast, {
178
+ CallExpression(path) {
179
+ const node = path.node;
180
+
181
+ if (t.isMemberExpression(node.callee) &&
182
+ t.isIdentifier(node.callee.object, { name: "Math" }) &&
183
+ t.isIdentifier(node.callee.property, { name: "random" })) {
184
+
185
+ // Check if used for security-sensitive purposes (crypto, tokens, etc.)
186
+ const parent = path.parentPath;
187
+ if (parent && parent.isCallExpression()) {
188
+ const parentCallee = parent.node.callee;
189
+ if (t.isMemberExpression(parentCallee) &&
190
+ t.isIdentifier(parentCallee.object, { name: "crypto" })) {
191
+ const line = node.loc.start.line;
192
+ findings.push({
193
+ type: "insecure_random",
194
+ severity: "WARN",
195
+ category: "Security",
196
+ file: filePath,
197
+ line,
198
+ column: node.loc.start.column,
199
+ title: "Insecure random number generation",
200
+ message: "Math.random() is not cryptographically secure - use crypto.randomBytes()",
201
+ codeSnippet: lines[line - 1]?.trim(),
202
+ confidence: "high",
203
+ });
204
+ }
205
+ }
206
+ }
207
+ },
208
+ });
209
+
210
+ // Weak encryption algorithms
211
+ const weakCryptoPatterns = [
212
+ /crypto\.createHash\s*\(\s*['"]md5['"]/i,
213
+ /crypto\.createHash\s*\(\s*['"]sha1['"]/i,
214
+ /crypto\.createCipher\s*\(/i, // Deprecated, insecure
215
+ ];
216
+
217
+ for (let i = 0; i < lines.length; i++) {
218
+ const line = lines[i];
219
+ for (const pattern of weakCryptoPatterns) {
220
+ if (pattern.test(line)) {
221
+ findings.push({
222
+ type: "weak_crypto",
223
+ severity: "WARN",
224
+ category: "Security",
225
+ file: filePath,
226
+ line: i + 1,
227
+ column: 0,
228
+ title: "Weak or deprecated encryption algorithm",
229
+ message: "MD5, SHA1, or createCipher are insecure - use modern algorithms",
230
+ codeSnippet: line.trim(),
231
+ confidence: "high",
232
+ });
233
+ break;
234
+ }
235
+ }
236
+ }
237
+
238
+ return findings;
239
+ }
240
+
241
+ module.exports = {
242
+ analyzeSecurityVulnerabilities,
243
+ };
@@ -0,0 +1,115 @@
1
+ /**
2
+ * TODO/FIXME Detection Engine
3
+ * Uses AST analysis to detect TODO/FIXME comments with better context
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 comment contains TODO/FIXME markers
13
+ */
14
+ function extractTodoMarkers(comment) {
15
+ const text = comment.value || "";
16
+ const markers = [];
17
+
18
+ // Block comments can have multiple markers
19
+ const patterns = [
20
+ { rx: /\bTODO\b[\s:]/i, type: "TODO", severity: "WARN" },
21
+ { rx: /\bFIXME\b[\s:]/i, type: "FIXME", severity: "WARN" },
22
+ { rx: /\bHACK\b[\s:]/i, type: "HACK", severity: "WARN" },
23
+ { rx: /\bXXX\b[\s:]/i, type: "XXX", severity: "WARN" },
24
+ { rx: /\bBUG\b[\s:]/i, type: "BUG", severity: "BLOCK" },
25
+ { rx: /\bBROKEN\b[\s:]/i, type: "BROKEN", severity: "BLOCK" },
26
+ { rx: /\bURGENT\b[\s:]/i, type: "URGENT", severity: "BLOCK" },
27
+ { rx: /\bSECURITY\b[\s:]/i, type: "SECURITY", severity: "BLOCK" },
28
+ { rx: /\bDANGER\b[\s:]/i, type: "DANGER", severity: "BLOCK" },
29
+ ];
30
+
31
+ for (const { rx, type, severity } of patterns) {
32
+ if (rx.test(text)) {
33
+ const match = text.match(rx);
34
+ const afterMarker = text.substring(text.indexOf(match[0]) + match[0].length).trim();
35
+ markers.push({
36
+ type,
37
+ severity,
38
+ text: afterMarker.substring(0, 100), // First 100 chars
39
+ fullText: text,
40
+ });
41
+ }
42
+ }
43
+
44
+ return markers;
45
+ }
46
+
47
+ /**
48
+ * Analyze a file for TODO/FIXME comments
49
+ */
50
+ function analyzeTodoFixme(code, filePath) {
51
+ const findings = [];
52
+
53
+ // Skip excluded files
54
+ if (shouldExcludeFile(filePath)) return findings;
55
+
56
+ const ast = getAST(code, filePath);
57
+ if (!ast) return findings;
58
+
59
+ const lines = code.split("\n");
60
+ const MAX_FINDINGS = 20;
61
+
62
+ // Process all comments
63
+ const comments = ast.comments || [];
64
+ let todoCount = 0;
65
+ let fixmeCount = 0;
66
+
67
+ for (const comment of comments) {
68
+ const markers = extractTodoMarkers(comment);
69
+
70
+ for (const marker of markers) {
71
+ if (marker.type === "TODO") todoCount++;
72
+ if (marker.type === "FIXME") fixmeCount++;
73
+
74
+ if (findings.length < MAX_FINDINGS) {
75
+ const line = comment.loc.start.line;
76
+ const snippet = lines[line - 1]?.trim() || "";
77
+
78
+ findings.push({
79
+ type: marker.type.toLowerCase(),
80
+ severity: marker.severity,
81
+ category: "TodoFixme",
82
+ file: filePath,
83
+ line,
84
+ column: comment.loc.start.column,
85
+ title: `${marker.type} comment`,
86
+ message: marker.text || marker.type,
87
+ codeSnippet: snippet.substring(0, 80),
88
+ confidence: "high",
89
+ });
90
+ }
91
+ }
92
+ }
93
+
94
+ // Add summary if there are many
95
+ const totalTodos = todoCount + fixmeCount;
96
+ if (totalTodos > MAX_FINDINGS) {
97
+ findings.push({
98
+ type: "summary",
99
+ severity: "WARN",
100
+ category: "TodoFixme",
101
+ file: filePath,
102
+ line: 0,
103
+ title: `${totalTodos} TODO/FIXME comments found (${totalTodos - MAX_FINDINGS} more not shown)`,
104
+ message: `Found ${totalTodos} TODO/FIXME comments in this file`,
105
+ confidence: "high",
106
+ });
107
+ }
108
+
109
+ return findings;
110
+ }
111
+
112
+ module.exports = {
113
+ analyzeTodoFixme,
114
+ parseCode,
115
+ };