@vibecheckai/cli 3.5.0 → 3.5.1

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 (326) hide show
  1. package/bin/registry.js +174 -449
  2. package/bin/runners/cli-utils.js +33 -2
  3. package/bin/runners/context/generators/cursor.js +2 -49
  4. package/bin/runners/context/generators/mcp.js +13 -15
  5. package/bin/runners/context/proof-context.js +1 -248
  6. package/bin/runners/lib/analysis-core.js +180 -198
  7. package/bin/runners/lib/analyzers.js +241 -2212
  8. package/bin/runners/lib/cli-output.js +210 -242
  9. package/bin/runners/lib/detectors-v2.js +785 -547
  10. package/bin/runners/lib/entitlements-v2.js +431 -161
  11. package/bin/runners/lib/error-handler.js +9 -16
  12. package/bin/runners/lib/global-flags.js +0 -37
  13. package/bin/runners/lib/html-proof-report.js +700 -350
  14. package/bin/runners/lib/missions/plan.js +6 -46
  15. package/bin/runners/lib/missions/templates.js +0 -232
  16. package/bin/runners/lib/route-truth.js +322 -1167
  17. package/bin/runners/lib/scan-output.js +467 -493
  18. package/bin/runners/lib/ship-output.js +27 -280
  19. package/bin/runners/lib/terminal-ui.js +700 -310
  20. package/bin/runners/lib/truth.js +321 -1004
  21. package/bin/runners/lib/unified-output.js +158 -162
  22. package/bin/runners/lib/upsell.js +204 -104
  23. package/bin/runners/runAIAgent.js +10 -5
  24. package/bin/runners/runAllowlist.js +324 -0
  25. package/bin/runners/runAuth.js +94 -344
  26. package/bin/runners/runCheckpoint.js +45 -43
  27. package/bin/runners/runContext.js +24 -139
  28. package/bin/runners/runDoctor.js +101 -136
  29. package/bin/runners/runEvidencePack.js +219 -0
  30. package/bin/runners/runFix.js +71 -82
  31. package/bin/runners/runGuard.js +119 -606
  32. package/bin/runners/runInit.js +60 -22
  33. package/bin/runners/runInstall.js +281 -0
  34. package/bin/runners/runLabs.js +341 -0
  35. package/bin/runners/runMcp.js +62 -139
  36. package/bin/runners/runPolish.js +83 -282
  37. package/bin/runners/runPromptFirewall.js +12 -5
  38. package/bin/runners/runProve.js +58 -33
  39. package/bin/runners/runReality.js +58 -81
  40. package/bin/runners/runReport.js +7 -34
  41. package/bin/runners/runRuntime.js +8 -5
  42. package/bin/runners/runScan.js +844 -219
  43. package/bin/runners/runShip.js +59 -721
  44. package/bin/runners/runValidate.js +11 -24
  45. package/bin/runners/runWatch.js +76 -131
  46. package/bin/vibecheck.js +69 -295
  47. package/mcp-server/ARCHITECTURE.md +339 -0
  48. package/mcp-server/__tests__/cache.test.ts +313 -0
  49. package/mcp-server/__tests__/executor.test.ts +239 -0
  50. package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +1 -0
  51. package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +3 -0
  52. package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +3 -0
  53. package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +3 -0
  54. package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +3 -0
  55. package/mcp-server/__tests__/fixtures/exclusion-test/package.json +5 -0
  56. package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +5 -0
  57. package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +4 -0
  58. package/mcp-server/__tests__/ids.test.ts +345 -0
  59. package/mcp-server/__tests__/integration/tools.test.ts +410 -0
  60. package/mcp-server/__tests__/registry.test.ts +365 -0
  61. package/mcp-server/__tests__/sandbox.test.ts +323 -0
  62. package/mcp-server/__tests__/schemas.test.ts +372 -0
  63. package/mcp-server/benchmarks/run-benchmarks.ts +304 -0
  64. package/mcp-server/examples/doctor.request.json +14 -0
  65. package/mcp-server/examples/doctor.response.json +53 -0
  66. package/mcp-server/examples/error.response.json +15 -0
  67. package/mcp-server/examples/scan.request.json +14 -0
  68. package/mcp-server/examples/scan.response.json +108 -0
  69. package/mcp-server/handlers/tool-handler.ts +671 -0
  70. package/mcp-server/index-v1.js +698 -0
  71. package/mcp-server/index-v3.ts +293 -0
  72. package/mcp-server/index.js +1080 -1757
  73. package/mcp-server/index.old.js +4137 -0
  74. package/mcp-server/lib/cache.ts +341 -0
  75. package/mcp-server/lib/errors.ts +346 -0
  76. package/mcp-server/lib/executor.ts +792 -0
  77. package/mcp-server/lib/ids.ts +238 -0
  78. package/mcp-server/lib/logger.ts +368 -0
  79. package/mcp-server/lib/metrics.ts +365 -0
  80. package/mcp-server/lib/sandbox.ts +337 -0
  81. package/mcp-server/lib/validator.ts +229 -0
  82. package/mcp-server/package-lock.json +165 -0
  83. package/mcp-server/package.json +32 -7
  84. package/mcp-server/premium-tools.js +2 -2
  85. package/mcp-server/registry/tools.json +476 -0
  86. package/mcp-server/schemas/error-envelope.schema.json +125 -0
  87. package/mcp-server/schemas/finding.schema.json +167 -0
  88. package/mcp-server/schemas/report-artifact.schema.json +88 -0
  89. package/mcp-server/schemas/run-request.schema.json +75 -0
  90. package/mcp-server/schemas/verdict.schema.json +168 -0
  91. package/mcp-server/tier-auth.d.ts +71 -0
  92. package/mcp-server/tier-auth.js +371 -183
  93. package/mcp-server/truth-context.js +90 -131
  94. package/mcp-server/truth-firewall-tools.js +1000 -1611
  95. package/mcp-server/tsconfig.json +34 -0
  96. package/mcp-server/vibecheck-tools.js +2 -2
  97. package/mcp-server/vitest.config.ts +16 -0
  98. package/package.json +3 -4
  99. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +0 -474
  100. package/bin/runners/lib/agent-firewall/change-packet/builder.js +0 -488
  101. package/bin/runners/lib/agent-firewall/change-packet/schema.json +0 -228
  102. package/bin/runners/lib/agent-firewall/change-packet/store.js +0 -200
  103. package/bin/runners/lib/agent-firewall/claims/claim-types.js +0 -21
  104. package/bin/runners/lib/agent-firewall/claims/extractor.js +0 -303
  105. package/bin/runners/lib/agent-firewall/claims/patterns.js +0 -24
  106. package/bin/runners/lib/agent-firewall/critic/index.js +0 -151
  107. package/bin/runners/lib/agent-firewall/critic/judge.js +0 -432
  108. package/bin/runners/lib/agent-firewall/critic/prompts.js +0 -305
  109. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +0 -88
  110. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +0 -75
  111. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +0 -127
  112. package/bin/runners/lib/agent-firewall/evidence/resolver.js +0 -102
  113. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +0 -213
  114. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +0 -145
  115. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +0 -19
  116. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +0 -87
  117. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +0 -184
  118. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +0 -163
  119. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +0 -107
  120. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +0 -68
  121. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +0 -66
  122. package/bin/runners/lib/agent-firewall/interceptor/base.js +0 -304
  123. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +0 -35
  124. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +0 -35
  125. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +0 -34
  126. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +0 -465
  127. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +0 -604
  128. package/bin/runners/lib/agent-firewall/lawbook/index.js +0 -304
  129. package/bin/runners/lib/agent-firewall/lawbook/registry.js +0 -514
  130. package/bin/runners/lib/agent-firewall/lawbook/schema.js +0 -420
  131. package/bin/runners/lib/agent-firewall/learning/learning-engine.js +0 -849
  132. package/bin/runners/lib/agent-firewall/logger.js +0 -141
  133. package/bin/runners/lib/agent-firewall/policy/default-policy.json +0 -90
  134. package/bin/runners/lib/agent-firewall/policy/engine.js +0 -103
  135. package/bin/runners/lib/agent-firewall/policy/loader.js +0 -451
  136. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +0 -50
  137. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +0 -50
  138. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +0 -86
  139. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +0 -162
  140. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +0 -189
  141. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +0 -93
  142. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +0 -57
  143. package/bin/runners/lib/agent-firewall/policy/schema.json +0 -183
  144. package/bin/runners/lib/agent-firewall/policy/verdict.js +0 -54
  145. package/bin/runners/lib/agent-firewall/proposal/extractor.js +0 -394
  146. package/bin/runners/lib/agent-firewall/proposal/index.js +0 -212
  147. package/bin/runners/lib/agent-firewall/proposal/schema.js +0 -251
  148. package/bin/runners/lib/agent-firewall/proposal/validator.js +0 -386
  149. package/bin/runners/lib/agent-firewall/reality/index.js +0 -332
  150. package/bin/runners/lib/agent-firewall/reality/state.js +0 -625
  151. package/bin/runners/lib/agent-firewall/reality/watcher.js +0 -322
  152. package/bin/runners/lib/agent-firewall/risk/index.js +0 -173
  153. package/bin/runners/lib/agent-firewall/risk/scorer.js +0 -328
  154. package/bin/runners/lib/agent-firewall/risk/thresholds.js +0 -321
  155. package/bin/runners/lib/agent-firewall/risk/vectors.js +0 -421
  156. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +0 -472
  157. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +0 -346
  158. package/bin/runners/lib/agent-firewall/simulator/index.js +0 -181
  159. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +0 -380
  160. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +0 -661
  161. package/bin/runners/lib/agent-firewall/time-machine/index.js +0 -267
  162. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +0 -436
  163. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +0 -490
  164. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +0 -530
  165. package/bin/runners/lib/agent-firewall/truthpack/index.js +0 -67
  166. package/bin/runners/lib/agent-firewall/truthpack/loader.js +0 -137
  167. package/bin/runners/lib/agent-firewall/unblock/planner.js +0 -337
  168. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +0 -118
  169. package/bin/runners/lib/api-client.js +0 -269
  170. package/bin/runners/lib/audit-logger.js +0 -532
  171. package/bin/runners/lib/authority/authorities/architecture.js +0 -364
  172. package/bin/runners/lib/authority/authorities/compliance.js +0 -341
  173. package/bin/runners/lib/authority/authorities/human.js +0 -343
  174. package/bin/runners/lib/authority/authorities/quality.js +0 -420
  175. package/bin/runners/lib/authority/authorities/security.js +0 -228
  176. package/bin/runners/lib/authority/index.js +0 -293
  177. package/bin/runners/lib/authority-badge.js +0 -425
  178. package/bin/runners/lib/bundle/bundle-intelligence.js +0 -846
  179. package/bin/runners/lib/cli-charts.js +0 -368
  180. package/bin/runners/lib/cli-config-display.js +0 -405
  181. package/bin/runners/lib/cli-demo.js +0 -275
  182. package/bin/runners/lib/cli-errors.js +0 -438
  183. package/bin/runners/lib/cli-help-formatter.js +0 -439
  184. package/bin/runners/lib/cli-interactive-menu.js +0 -509
  185. package/bin/runners/lib/cli-prompts.js +0 -441
  186. package/bin/runners/lib/cli-scan-cards.js +0 -362
  187. package/bin/runners/lib/compliance-reporter.js +0 -710
  188. package/bin/runners/lib/conductor/index.js +0 -671
  189. package/bin/runners/lib/easy/README.md +0 -123
  190. package/bin/runners/lib/easy/index.js +0 -140
  191. package/bin/runners/lib/easy/interactive-wizard.js +0 -788
  192. package/bin/runners/lib/easy/one-click-firewall.js +0 -564
  193. package/bin/runners/lib/easy/zero-config-reality.js +0 -714
  194. package/bin/runners/lib/engines/accessibility-engine.js +0 -390
  195. package/bin/runners/lib/engines/api-consistency-engine.js +0 -467
  196. package/bin/runners/lib/engines/ast-cache.js +0 -99
  197. package/bin/runners/lib/engines/async-patterns-engine.js +0 -444
  198. package/bin/runners/lib/engines/bundle-size-engine.js +0 -433
  199. package/bin/runners/lib/engines/code-quality-engine.js +0 -255
  200. package/bin/runners/lib/engines/confidence-scoring.js +0 -276
  201. package/bin/runners/lib/engines/console-logs-engine.js +0 -115
  202. package/bin/runners/lib/engines/context-detection.js +0 -264
  203. package/bin/runners/lib/engines/cross-file-analysis-engine.js +0 -533
  204. package/bin/runners/lib/engines/database-patterns-engine.js +0 -429
  205. package/bin/runners/lib/engines/dead-code-engine.js +0 -198
  206. package/bin/runners/lib/engines/deprecated-api-engine.js +0 -226
  207. package/bin/runners/lib/engines/duplicate-code-engine.js +0 -354
  208. package/bin/runners/lib/engines/empty-catch-engine.js +0 -260
  209. package/bin/runners/lib/engines/env-variables-engine.js +0 -458
  210. package/bin/runners/lib/engines/error-handling-engine.js +0 -437
  211. package/bin/runners/lib/engines/false-positive-prevention.js +0 -630
  212. package/bin/runners/lib/engines/file-filter.js +0 -131
  213. package/bin/runners/lib/engines/framework-adapters/index.js +0 -607
  214. package/bin/runners/lib/engines/framework-detection.js +0 -508
  215. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +0 -251
  216. package/bin/runners/lib/engines/import-order-engine.js +0 -429
  217. package/bin/runners/lib/engines/mock-data-engine.js +0 -315
  218. package/bin/runners/lib/engines/naming-conventions-engine.js +0 -544
  219. package/bin/runners/lib/engines/noise-reduction-engine.js +0 -452
  220. package/bin/runners/lib/engines/orchestrator.js +0 -334
  221. package/bin/runners/lib/engines/parallel-processor.js +0 -71
  222. package/bin/runners/lib/engines/performance-issues-engine.js +0 -405
  223. package/bin/runners/lib/engines/react-patterns-engine.js +0 -457
  224. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +0 -571
  225. package/bin/runners/lib/engines/todo-fixme-engine.js +0 -115
  226. package/bin/runners/lib/engines/type-aware-engine.js +0 -376
  227. package/bin/runners/lib/engines/unsafe-regex-engine.js +0 -225
  228. package/bin/runners/lib/engines/vibecheck-engines/README.md +0 -53
  229. package/bin/runners/lib/engines/vibecheck-engines/index.js +0 -124
  230. package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +0 -806
  231. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +0 -439
  232. package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +0 -577
  233. package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +0 -543
  234. package/bin/runners/lib/engines/vibecheck-engines/package.json +0 -13
  235. package/bin/runners/lib/engines/vibecheck-engines.js +0 -514
  236. package/bin/runners/lib/enhanced-features/index.js +0 -305
  237. package/bin/runners/lib/enhanced-output.js +0 -631
  238. package/bin/runners/lib/enterprise.js +0 -300
  239. package/bin/runners/lib/exit-codes.js +0 -275
  240. package/bin/runners/lib/fingerprint.js +0 -377
  241. package/bin/runners/lib/firewall/command-validator.js +0 -351
  242. package/bin/runners/lib/firewall/config.js +0 -341
  243. package/bin/runners/lib/firewall/content-validator.js +0 -519
  244. package/bin/runners/lib/firewall/index.js +0 -101
  245. package/bin/runners/lib/firewall/path-validator.js +0 -256
  246. package/bin/runners/lib/help-formatter.js +0 -413
  247. package/bin/runners/lib/intelligence/cross-repo-intelligence.js +0 -817
  248. package/bin/runners/lib/logger.js +0 -38
  249. package/bin/runners/lib/mcp-utils.js +0 -425
  250. package/bin/runners/lib/output/index.js +0 -1022
  251. package/bin/runners/lib/policy-engine.js +0 -652
  252. package/bin/runners/lib/polish/autofix/accessibility-fixes.js +0 -333
  253. package/bin/runners/lib/polish/autofix/async-handlers.js +0 -273
  254. package/bin/runners/lib/polish/autofix/dead-code.js +0 -280
  255. package/bin/runners/lib/polish/autofix/imports-optimizer.js +0 -344
  256. package/bin/runners/lib/polish/autofix/index.js +0 -200
  257. package/bin/runners/lib/polish/autofix/remove-consoles.js +0 -209
  258. package/bin/runners/lib/polish/autofix/strengthen-types.js +0 -245
  259. package/bin/runners/lib/polish/backend-checks.js +0 -148
  260. package/bin/runners/lib/polish/documentation-checks.js +0 -111
  261. package/bin/runners/lib/polish/frontend-checks.js +0 -168
  262. package/bin/runners/lib/polish/index.js +0 -71
  263. package/bin/runners/lib/polish/infrastructure-checks.js +0 -131
  264. package/bin/runners/lib/polish/library-detection.js +0 -175
  265. package/bin/runners/lib/polish/performance-checks.js +0 -100
  266. package/bin/runners/lib/polish/security-checks.js +0 -148
  267. package/bin/runners/lib/polish/utils.js +0 -203
  268. package/bin/runners/lib/prompt-builder.js +0 -540
  269. package/bin/runners/lib/proof-certificate.js +0 -634
  270. package/bin/runners/lib/reality/accessibility-audit.js +0 -946
  271. package/bin/runners/lib/reality/api-contract-validator.js +0 -1012
  272. package/bin/runners/lib/reality/chaos-engineering.js +0 -1084
  273. package/bin/runners/lib/reality/performance-tracker.js +0 -1077
  274. package/bin/runners/lib/reality/scenario-generator.js +0 -1404
  275. package/bin/runners/lib/reality/visual-regression.js +0 -852
  276. package/bin/runners/lib/reality-profiler.js +0 -717
  277. package/bin/runners/lib/replay/flight-recorder-viewer.js +0 -1160
  278. package/bin/runners/lib/review/ai-code-review.js +0 -832
  279. package/bin/runners/lib/rules/custom-rule-engine.js +0 -985
  280. package/bin/runners/lib/sbom-generator.js +0 -641
  281. package/bin/runners/lib/scan-output-enhanced.js +0 -512
  282. package/bin/runners/lib/security/owasp-scanner.js +0 -939
  283. package/bin/runners/lib/ship-output-enterprise.js +0 -239
  284. package/bin/runners/lib/unified-cli-output.js +0 -777
  285. package/bin/runners/lib/validators/contract-validator.js +0 -283
  286. package/bin/runners/lib/validators/dead-export-detector.js +0 -279
  287. package/bin/runners/lib/validators/dep-audit.js +0 -245
  288. package/bin/runners/lib/validators/env-validator.js +0 -319
  289. package/bin/runners/lib/validators/index.js +0 -120
  290. package/bin/runners/lib/validators/license-checker.js +0 -252
  291. package/bin/runners/lib/validators/route-validator.js +0 -290
  292. package/bin/runners/runAgent.d.ts +0 -5
  293. package/bin/runners/runAgent.js +0 -164
  294. package/bin/runners/runApprove.js +0 -1233
  295. package/bin/runners/runAuthority.js +0 -528
  296. package/bin/runners/runClassify.js +0 -862
  297. package/bin/runners/runConductor.js +0 -772
  298. package/bin/runners/runContainer.js +0 -366
  299. package/bin/runners/runContext.d.ts +0 -4
  300. package/bin/runners/runEasy.js +0 -410
  301. package/bin/runners/runFirewall.d.ts +0 -5
  302. package/bin/runners/runFirewall.js +0 -137
  303. package/bin/runners/runFirewallHook.d.ts +0 -5
  304. package/bin/runners/runFirewallHook.js +0 -59
  305. package/bin/runners/runIaC.js +0 -372
  306. package/bin/runners/runPolish.d.ts +0 -4
  307. package/bin/runners/runProof.zip +0 -0
  308. package/bin/runners/runTruth.d.ts +0 -5
  309. package/bin/runners/runTruth.js +0 -104
  310. package/bin/runners/runVibe.js +0 -791
  311. package/mcp-server/HARDENING_SUMMARY.md +0 -299
  312. package/mcp-server/agent-firewall-interceptor.js +0 -500
  313. package/mcp-server/authority-tools.js +0 -569
  314. package/mcp-server/conductor/conflict-resolver.js +0 -588
  315. package/mcp-server/conductor/execution-planner.js +0 -544
  316. package/mcp-server/conductor/index.js +0 -377
  317. package/mcp-server/conductor/lock-manager.js +0 -615
  318. package/mcp-server/conductor/request-queue.js +0 -550
  319. package/mcp-server/conductor/session-manager.js +0 -500
  320. package/mcp-server/conductor/tools.js +0 -510
  321. package/mcp-server/lib/api-client.cjs +0 -13
  322. package/mcp-server/lib/logger.cjs +0 -30
  323. package/mcp-server/logger.js +0 -173
  324. package/mcp-server/tools-v3.js +0 -1039
  325. package/mcp-server/tools.js +0 -495
  326. package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
@@ -1,421 +0,0 @@
1
- /**
2
- * Risk Vectors
3
- *
4
- * Defines the risk vectors and their default weights for scoring changes.
5
- * Each vector contributes to the overall risk score.
6
- */
7
-
8
- "use strict";
9
-
10
- /**
11
- * Risk vector definitions
12
- */
13
- const RISK_VECTORS = {
14
- /**
15
- * Surface Area
16
- * How many files are touched by the change
17
- */
18
- SURFACE_AREA: {
19
- id: "surface_area",
20
- name: "Surface Area",
21
- description: "Number of files touched by the change",
22
- baseWeight: 1,
23
- calculate: (context) => {
24
- const files = context.files || [];
25
- const fileCount = files.length;
26
-
27
- // Single file changes are very common and safe - no penalty
28
- if (fileCount <= 1) return 0;
29
-
30
- // Count "safe" files that shouldn't add to risk
31
- const safeFiles = files.filter(f => {
32
- const path = (f.path || f).toLowerCase();
33
- return (
34
- path.includes('.test.') || path.includes('.spec.') ||
35
- path.includes('__tests__') || path.includes('__mocks__') ||
36
- path.endsWith('.md') || path.endsWith('.mdx') ||
37
- path.endsWith('.d.ts') || path.includes('.stories.') ||
38
- path.endsWith('-lock.json') || path.endsWith('.lock') ||
39
- path.includes('/docs/')
40
- );
41
- });
42
-
43
- // Effective file count excludes safe files
44
- const effectiveCount = fileCount - safeFiles.length;
45
-
46
- // More generous thresholds
47
- if (effectiveCount <= 1) return 0;
48
- if (effectiveCount <= 3) return effectiveCount; // 1 point each
49
- if (effectiveCount <= 5) return 3 + (effectiveCount - 3) * 2; // 2 points each
50
- if (effectiveCount <= 10) return 7 + (effectiveCount - 5) * 3; // 3 points each
51
- return 22 + (effectiveCount - 10) * 4; // 4 points each for large changes
52
- },
53
- },
54
-
55
- /**
56
- * Blast Radius
57
- * Impact on core vs peripheral code
58
- */
59
- BLAST_RADIUS: {
60
- id: "blast_radius",
61
- name: "Blast Radius",
62
- description: "Impact on core vs peripheral code paths",
63
- baseWeight: 1,
64
- calculate: (context) => {
65
- let score = 0;
66
- const files = context.files || [];
67
-
68
- // For single-file changes, apply a discount since they're typically safer
69
- const singleFileDiscount = files.length === 1 ? 0.6 : 1;
70
-
71
- for (const file of files) {
72
- const path = (file.path || file).toLowerCase();
73
- let fileScore = 0;
74
-
75
- // Tests have ZERO impact - they can't break production
76
- if (path.includes("/test") || path.includes(".test.") || path.includes(".spec.") ||
77
- path.includes("__tests__") || path.includes("__mocks__")) {
78
- fileScore = 0;
79
- }
80
- // Documentation and config have minimal impact
81
- else if (path.endsWith(".md") || path.endsWith(".mdx") ||
82
- path.includes("/docs/") || path.includes("readme")) {
83
- fileScore = 0;
84
- }
85
- // Type definitions are low risk
86
- else if (path.endsWith(".d.ts") || path.includes("/types/")) {
87
- fileScore = 2;
88
- }
89
- // Storybook/examples - no production impact
90
- else if (path.includes(".stories.") || path.includes("/examples/") || path.includes("/storybook/")) {
91
- fileScore = 0;
92
- }
93
- // Core paths - high impact but reduced from 25
94
- else if (path.includes("/core/") || path.includes("/lib/") || path.includes("/shared/")) {
95
- fileScore = 15;
96
- }
97
- // Database/schema - high impact
98
- else if (path.includes("/prisma/") || path.includes("/db/") || path.includes("/schema/")) {
99
- fileScore = 18;
100
- }
101
- // Service paths - medium-high impact (reduced from 20)
102
- else if (path.includes("/services/") || path.includes("/providers/")) {
103
- fileScore = 12;
104
- }
105
- // Middleware - medium-high impact (reduced from 18)
106
- else if (path.includes("/middleware/")) {
107
- fileScore = 10;
108
- }
109
- // API routes - medium impact (reduced from 15)
110
- else if (path.includes("/routes/") || path.includes("/api/")) {
111
- fileScore = 8;
112
- }
113
- // Config files - low impact (reduced from 12)
114
- else if (path.includes("/config/")) {
115
- fileScore = 5;
116
- }
117
- // Package.json is special - lock files are fine, package.json needs care
118
- else if (path.endsWith("package.json")) {
119
- fileScore = 8;
120
- }
121
- else if (path.endsWith("package-lock.json") || path.endsWith("pnpm-lock.yaml") || path.endsWith("yarn.lock")) {
122
- fileScore = 0; // Lock files are auto-generated
123
- }
124
- // JSON/YAML config files - minimal impact
125
- else if (path.endsWith(".json") || path.endsWith(".yaml") || path.endsWith(".yml")) {
126
- fileScore = 3;
127
- }
128
- // Components/Pages - low impact (UI changes)
129
- else if (path.includes("/components/") || path.includes("/pages/") || path.includes("/app/")) {
130
- fileScore = 3;
131
- }
132
- // Styles - minimal impact
133
- else if (path.endsWith(".css") || path.endsWith(".scss") || path.endsWith(".less")) {
134
- fileScore = 1;
135
- }
136
- // Everything else - low impact
137
- else {
138
- fileScore = 2;
139
- }
140
-
141
- score += fileScore;
142
- }
143
-
144
- // Apply single-file discount
145
- return Math.round(score * singleFileDiscount);
146
- },
147
- },
148
-
149
- /**
150
- * Irreversibility
151
- * How hard it is to undo the change
152
- */
153
- IRREVERSIBILITY: {
154
- id: "irreversibility",
155
- name: "Irreversibility",
156
- description: "Difficulty of undoing the change",
157
- baseWeight: 1,
158
- calculate: (context) => {
159
- let score = 0;
160
- const operations = context.operations || [];
161
- const files = context.files || [];
162
-
163
- for (const op of operations) {
164
- const type = op.type?.toLowerCase();
165
- const path = (op.path || "").toLowerCase();
166
-
167
- // Deletions are highly irreversible
168
- if (type === "delete") {
169
- score += 20;
170
- // Even more for core files
171
- if (path.includes("/core/") || path.includes("/lib/")) {
172
- score += 15;
173
- }
174
- }
175
- // Migrations are very irreversible
176
- else if (path.includes("migration") || path.includes("/prisma/")) {
177
- score += 30;
178
- }
179
- // Schema changes are irreversible
180
- else if (path.includes("schema") || path.includes(".prisma")) {
181
- score += 25;
182
- }
183
- }
184
-
185
- // Check for delete operations in files
186
- for (const file of files) {
187
- const path = (file.path || file).toLowerCase();
188
- if (path.includes("migration")) {
189
- score += 25;
190
- }
191
- }
192
-
193
- return score;
194
- },
195
- },
196
-
197
- /**
198
- * Confidence
199
- * How confident we are in the change's safety
200
- */
201
- CONFIDENCE: {
202
- id: "confidence",
203
- name: "Confidence Gap",
204
- description: "Points added for unverified assumptions",
205
- baseWeight: 1,
206
- calculate: (context) => {
207
- let score = 0;
208
-
209
- // Unresolved assumptions add risk (reduced from 40 to 15 per assumption)
210
- // Most assumptions are benign and resolve at runtime
211
- const unresolvedAssumptions = context.unresolvedAssumptions || [];
212
- const assumptionCount = unresolvedAssumptions.length;
213
-
214
- // Use diminishing returns for multiple assumptions
215
- if (assumptionCount > 0) {
216
- // First assumption: 15 points, then 10, then 5 each for more
217
- score += Math.min(15 + Math.max(0, assumptionCount - 1) * 5, 40);
218
- }
219
-
220
- // Low confidence in proposal (reduced from 30/20/10 to 15/10/5)
221
- const confidence = context.proposalConfidence ?? 1;
222
- if (confidence < 0.3) {
223
- score += 15;
224
- } else if (confidence < 0.5) {
225
- score += 10;
226
- } else if (confidence < 0.7) {
227
- score += 5;
228
- }
229
- // Note: 0.7+ confidence adds no penalty (default is fine)
230
-
231
- // Missing intent - only penalize if completely missing
232
- // Many agents provide minimal but valid intents
233
- if (!context.intent || context.intent.trim().length === 0) {
234
- score += 8;
235
- }
236
-
237
- return score;
238
- },
239
- },
240
-
241
- /**
242
- * Novelty
243
- * Whether this introduces new patterns
244
- */
245
- NOVELTY: {
246
- id: "novelty",
247
- name: "Novelty",
248
- description: "Introduction of new patterns or dependencies",
249
- baseWeight: 1,
250
- calculate: (context) => {
251
- let score = 0;
252
-
253
- // New dependencies - only risky if adding many
254
- // Single new dependency is very common during development
255
- const newDependencies = context.newDependencies || [];
256
- if (newDependencies.length > 3) {
257
- score += 5 + (newDependencies.length - 3) * 3; // Only penalize bulk additions
258
- }
259
-
260
- // New files being created - very normal during development
261
- // Only flag if creating many files at once (could be a scaffold)
262
- const operations = context.operations || [];
263
- const creations = operations.filter(op => op.type === "create");
264
- if (creations.length > 5) {
265
- score += (creations.length - 5) * 2;
266
- }
267
-
268
- // New env vars - reduced from 15 to 5 per var
269
- // New env vars are common when adding features
270
- const newEnvVars = context.newEnvVars || [];
271
- score += Math.min(newEnvVars.length * 5, 15); // Cap at 15 points
272
-
273
- // New routes - reduced from 8 to 3 per route
274
- // Adding routes is normal API development
275
- const newRoutes = context.newRoutes || [];
276
- score += Math.min(newRoutes.length * 3, 12); // Cap at 12 points
277
-
278
- return score;
279
- },
280
- },
281
-
282
- /**
283
- * Domain Risk
284
- * Risk based on the domain being modified
285
- */
286
- DOMAIN: {
287
- id: "domain",
288
- name: "Domain Risk",
289
- description: "Risk associated with specific domains",
290
- baseWeight: 1,
291
- calculate: (context) => {
292
- const domains = context.domains || [];
293
-
294
- // If no domains identified, it's likely a safe general change
295
- if (domains.length === 0) return 0;
296
-
297
- // Reduced domain weights to avoid over-penalizing
298
- // Single-file auth changes shouldn't trigger blocks by themselves
299
- const domainWeights = {
300
- payments: 20, // Reduced from 35 - payments is sensitive but not always blocking
301
- auth: 15, // Reduced from 30 - many auth changes are benign
302
- security: 15, // Reduced from 30 - security patterns are common
303
- database: 12, // Reduced from 25 - schema changes are normal
304
- middleware: 8, // Reduced from 20 - middleware is often safe
305
- core: 10, // Reduced from 20 - core changes happen regularly
306
- routes: 5, // Reduced from 15 - route changes are common
307
- contracts: 8, // Reduced from 15 - API contracts evolve
308
- config: 3, // Reduced from 12 - config is usually safe
309
- ui: 0, // Reduced from 5 - UI changes are generally safe
310
- test: 0, // Reduced from 2 - tests have no production impact
311
- general: 0, // Reduced from 3 - general is the default, shouldn't add risk
312
- };
313
-
314
- // Only count the highest-risk domain (don't stack)
315
- // This prevents a file in "auth + routes" from getting double-penalized
316
- let maxScore = 0;
317
- for (const domain of domains) {
318
- const weight = domainWeights[domain] ?? 2;
319
- maxScore = Math.max(maxScore, weight);
320
- }
321
-
322
- return maxScore;
323
- },
324
- },
325
-
326
- /**
327
- * Side Effects
328
- * Potential for unintended side effects
329
- */
330
- SIDE_EFFECTS: {
331
- id: "side_effects",
332
- name: "Side Effects",
333
- description: "Potential for unintended side effects",
334
- baseWeight: 1,
335
- calculate: (context) => {
336
- let score = 0;
337
- const claims = context.claims || [];
338
-
339
- // Network calls - very common, reduced impact
340
- // Only penalize if there are many or if they're to external services
341
- const networkClaims = claims.filter(c =>
342
- c.type === "fetch" || c.type === "api_call" || c.type === "network"
343
- );
344
- // First 3 network calls are free (normal API usage)
345
- if (networkClaims.length > 3) {
346
- score += (networkClaims.length - 3) * 5;
347
- }
348
-
349
- // File system operations - only server-side concerns
350
- const fsClaims = claims.filter(c =>
351
- c.type === "fs_write" || c.type === "fs_delete"
352
- );
353
- // Writes are more concerning than reads
354
- const writeOps = fsClaims.filter(c => c.type === "fs_write");
355
- const deleteOps = fsClaims.filter(c => c.type === "fs_delete");
356
- score += writeOps.length * 5;
357
- score += deleteOps.length * 10; // Deletes are more dangerous
358
-
359
- // Database mutations - important but common
360
- const dbClaims = claims.filter(c =>
361
- c.type === "db_write" || c.type === "db_delete" || c.type === "db_mutation"
362
- );
363
- // Only penalize destructive DB operations heavily
364
- const dbDeletes = dbClaims.filter(c => c.type === "db_delete");
365
- const dbWrites = dbClaims.filter(c => c.type !== "db_delete");
366
- score += dbWrites.length * 3;
367
- score += dbDeletes.length * 12;
368
-
369
- // External service calls - reduced from 18 to 8
370
- // Calling external APIs is normal
371
- const externalClaims = claims.filter(c =>
372
- c.type === "external_service" || c.type === "webhook"
373
- );
374
- score += Math.min(externalClaims.length * 8, 20); // Cap at 20
375
-
376
- return score;
377
- },
378
- },
379
- };
380
-
381
- /**
382
- * Risk level thresholds
383
- */
384
- const RISK_LEVELS = {
385
- LOW: { min: 0, max: 25, label: "LOW", color: "green" },
386
- MEDIUM: { min: 26, max: 50, label: "MEDIUM", color: "yellow" },
387
- HIGH: { min: 51, max: 80, label: "HIGH", color: "orange" },
388
- CRITICAL: { min: 81, max: Infinity, label: "CRITICAL", color: "red" },
389
- };
390
-
391
- /**
392
- * Get risk level from score
393
- */
394
- function getRiskLevel(score) {
395
- if (score <= RISK_LEVELS.LOW.max) return RISK_LEVELS.LOW;
396
- if (score <= RISK_LEVELS.MEDIUM.max) return RISK_LEVELS.MEDIUM;
397
- if (score <= RISK_LEVELS.HIGH.max) return RISK_LEVELS.HIGH;
398
- return RISK_LEVELS.CRITICAL;
399
- }
400
-
401
- /**
402
- * Get all vector IDs
403
- */
404
- function getVectorIds() {
405
- return Object.values(RISK_VECTORS).map(v => v.id);
406
- }
407
-
408
- /**
409
- * Get vector by ID
410
- */
411
- function getVector(id) {
412
- return Object.values(RISK_VECTORS).find(v => v.id === id);
413
- }
414
-
415
- module.exports = {
416
- RISK_VECTORS,
417
- RISK_LEVELS,
418
- getRiskLevel,
419
- getVectorIds,
420
- getVector,
421
- };