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,328 @@
1
+ /**
2
+ * Risk Scoring Engine
3
+ *
4
+ * Calculates numerical risk scores for proposed changes.
5
+ * Uses configurable vectors and thresholds to determine risk levels.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const { RISK_VECTORS, RISK_LEVELS, getRiskLevel } = require("./vectors");
11
+ const { loadThresholds, getDecision } = require("./thresholds");
12
+ const { classifyFileDomain } = require("../reality/state");
13
+
14
+ /**
15
+ * @typedef {Object} RiskScore
16
+ * @property {number} total - Total risk score
17
+ * @property {string} level - Risk level (LOW, MEDIUM, HIGH, CRITICAL)
18
+ * @property {Object} vectors - Individual vector scores
19
+ * @property {string[]} reasons - Human-readable risk reasons
20
+ * @property {Object} decision - Decision based on thresholds
21
+ */
22
+
23
+ /**
24
+ * Build context object for risk calculation
25
+ * @param {Object} params - Score parameters
26
+ * @returns {Object} Risk calculation context
27
+ */
28
+ function buildContext(params) {
29
+ const {
30
+ files = [],
31
+ operations = [],
32
+ claims = [],
33
+ evidence = [],
34
+ intent = "",
35
+ assumptions = [],
36
+ proposalConfidence = 1,
37
+ policy = {},
38
+ } = params;
39
+
40
+ // Extract domains from files
41
+ const domains = new Set();
42
+ for (const file of files) {
43
+ const path = file.path || file;
44
+ const domain = classifyFileDomain(path);
45
+ domains.add(domain);
46
+ }
47
+
48
+ // Identify unresolved assumptions
49
+ const unresolvedAssumptions = [];
50
+ for (const assumption of assumptions) {
51
+ const evidenceForAssumption = evidence.find(e =>
52
+ e.claim?.key === assumption.key ||
53
+ e.claim?.type === assumption.type
54
+ );
55
+
56
+ if (!evidenceForAssumption || evidenceForAssumption.status === "UNPROVEN") {
57
+ unresolvedAssumptions.push(assumption);
58
+ }
59
+ }
60
+
61
+ // Detect new items
62
+ const newEnvVars = claims
63
+ .filter(c => c.type === "env" && !c.exists)
64
+ .map(c => c.key || c.value);
65
+
66
+ const newRoutes = claims
67
+ .filter(c => c.type === "route" && !c.exists)
68
+ .map(c => c.path || c.value);
69
+
70
+ const newDependencies = claims
71
+ .filter(c => c.type === "dependency" && !c.exists)
72
+ .map(c => c.name || c.value);
73
+
74
+ return {
75
+ files,
76
+ operations,
77
+ claims,
78
+ evidence,
79
+ intent,
80
+ assumptions,
81
+ proposalConfidence,
82
+ domains: Array.from(domains),
83
+ unresolvedAssumptions,
84
+ newEnvVars,
85
+ newRoutes,
86
+ newDependencies,
87
+ policy,
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Calculate risk score for a change
93
+ * @param {Object} params - Score parameters
94
+ * @returns {RiskScore} Risk score result
95
+ */
96
+ function calculateRiskScore(params) {
97
+ const context = buildContext(params);
98
+ const policy = params.policy || {};
99
+ const thresholds = loadThresholds(policy);
100
+
101
+ // Calculate individual vector scores
102
+ const vectorScores = {};
103
+ const reasons = [];
104
+ let totalScore = 0;
105
+
106
+ for (const [key, vector] of Object.entries(RISK_VECTORS)) {
107
+ try {
108
+ // Get weight from policy or use default
109
+ const weight = policy.risk?.vectorWeights?.[vector.id] ?? vector.baseWeight;
110
+
111
+ // Skip disabled vectors
112
+ if (weight === 0) continue;
113
+
114
+ // Calculate raw score
115
+ const rawScore = vector.calculate(context);
116
+ const weightedScore = Math.round(rawScore * weight);
117
+
118
+ vectorScores[vector.id] = {
119
+ raw: rawScore,
120
+ weighted: weightedScore,
121
+ weight,
122
+ name: vector.name,
123
+ description: vector.description,
124
+ };
125
+
126
+ totalScore += weightedScore;
127
+
128
+ // Add reason if score is significant
129
+ if (weightedScore > 0) {
130
+ const threshold = thresholds.vectors?.[vector.id];
131
+ if (threshold) {
132
+ if (weightedScore >= threshold.block) {
133
+ reasons.push(`${vector.name}: ${weightedScore} (CRITICAL - exceeds block threshold)`);
134
+ } else if (weightedScore >= threshold.warn) {
135
+ reasons.push(`${vector.name}: ${weightedScore} (WARNING - exceeds warn threshold)`);
136
+ } else if (weightedScore >= 10) {
137
+ reasons.push(`${vector.name}: ${weightedScore}`);
138
+ }
139
+ } else if (weightedScore >= 15) {
140
+ reasons.push(`${vector.name}: ${weightedScore}`);
141
+ }
142
+ }
143
+ } catch (error) {
144
+ // Log but continue with other vectors
145
+ console.warn(`Error calculating ${vector.id} risk: ${error.message}`);
146
+ }
147
+ }
148
+
149
+ // Get risk level
150
+ const riskLevel = getRiskLevel(totalScore);
151
+
152
+ // Get decision based on thresholds
153
+ const decision = getDecision(totalScore, thresholds, context.domains);
154
+
155
+ // Build result
156
+ const result = {
157
+ total: totalScore,
158
+ level: riskLevel.label,
159
+ levelColor: riskLevel.color,
160
+ vectors: vectorScores,
161
+ reasons: reasons.length > 0 ? reasons : [`Total risk score: ${totalScore}`],
162
+ decision,
163
+ context: {
164
+ fileCount: context.files.length,
165
+ domains: context.domains,
166
+ unresolvedAssumptions: context.unresolvedAssumptions.length,
167
+ newEnvVars: context.newEnvVars.length,
168
+ newRoutes: context.newRoutes.length,
169
+ },
170
+ thresholds: {
171
+ autoAllow: thresholds.autoAllow,
172
+ requireConfirm: thresholds.requireConfirm,
173
+ autoBlock: thresholds.autoBlock,
174
+ },
175
+ };
176
+
177
+ return result;
178
+ }
179
+
180
+ /**
181
+ * Quick risk assessment without full calculation
182
+ * @param {Object} params - Basic parameters
183
+ * @returns {Object} Quick assessment
184
+ */
185
+ function quickAssess(params) {
186
+ const { files = [], operations = [], domains = [] } = params;
187
+
188
+ // Quick checks
189
+ const hasDeletes = operations.some(op => op.type === "delete");
190
+ const hasMigrations = files.some(f => (f.path || f).includes("migration"));
191
+ const touchesAuth = domains.includes("auth") || files.some(f => (f.path || f).includes("auth"));
192
+ const touchesPayments = domains.includes("payments") || files.some(f =>
193
+ (f.path || f).includes("payment") || (f.path || f).includes("stripe")
194
+ );
195
+
196
+ // Estimate risk level
197
+ let estimatedLevel = "LOW";
198
+ const flags = [];
199
+
200
+ if (hasDeletes) {
201
+ flags.push("Contains deletions");
202
+ estimatedLevel = "MEDIUM";
203
+ }
204
+
205
+ if (hasMigrations) {
206
+ flags.push("Contains migrations");
207
+ estimatedLevel = "HIGH";
208
+ }
209
+
210
+ if (touchesAuth) {
211
+ flags.push("Touches auth");
212
+ estimatedLevel = estimatedLevel === "LOW" ? "MEDIUM" : estimatedLevel;
213
+ }
214
+
215
+ if (touchesPayments) {
216
+ flags.push("Touches payments");
217
+ estimatedLevel = "HIGH";
218
+ }
219
+
220
+ if (files.length > 10) {
221
+ flags.push("Large change (>10 files)");
222
+ estimatedLevel = estimatedLevel === "LOW" ? "MEDIUM" : estimatedLevel;
223
+ }
224
+
225
+ if (files.length > 20) {
226
+ estimatedLevel = "HIGH";
227
+ }
228
+
229
+ return {
230
+ estimatedLevel,
231
+ flags,
232
+ requiresFullAssessment: flags.length > 0 || files.length > 5,
233
+ };
234
+ }
235
+
236
+ /**
237
+ * Get risk breakdown by domain
238
+ * @param {RiskScore} riskScore - Calculated risk score
239
+ * @returns {Object} Domain breakdown
240
+ */
241
+ function getDomainBreakdown(riskScore) {
242
+ const breakdown = {};
243
+
244
+ for (const domain of riskScore.context?.domains || []) {
245
+ breakdown[domain] = {
246
+ files: 0,
247
+ contribution: 0,
248
+ };
249
+ }
250
+
251
+ // Estimate contribution based on domain vector
252
+ const domainVector = riskScore.vectors?.domain;
253
+ if (domainVector && riskScore.context?.domains) {
254
+ const totalDomains = riskScore.context.domains.length;
255
+ if (totalDomains > 0) {
256
+ const avgContribution = domainVector.weighted / totalDomains;
257
+ for (const domain of riskScore.context.domains) {
258
+ breakdown[domain].contribution = Math.round(avgContribution);
259
+ }
260
+ }
261
+ }
262
+
263
+ return breakdown;
264
+ }
265
+
266
+ /**
267
+ * Format risk score for display
268
+ * @param {RiskScore} riskScore - Risk score
269
+ * @returns {string} Formatted string
270
+ */
271
+ function formatRiskScore(riskScore) {
272
+ const lines = [
273
+ `Risk Score: ${riskScore.total} (${riskScore.level})`,
274
+ `Decision: ${riskScore.decision.decision}`,
275
+ "",
276
+ "Breakdown:",
277
+ ];
278
+
279
+ for (const [id, vector] of Object.entries(riskScore.vectors)) {
280
+ if (vector.weighted > 0) {
281
+ lines.push(` ${vector.name}: ${vector.weighted}`);
282
+ }
283
+ }
284
+
285
+ if (riskScore.reasons.length > 0) {
286
+ lines.push("", "Risk Factors:");
287
+ for (const reason of riskScore.reasons) {
288
+ lines.push(` - ${reason}`);
289
+ }
290
+ }
291
+
292
+ return lines.join("\n");
293
+ }
294
+
295
+ /**
296
+ * Compare two risk scores
297
+ * @param {RiskScore} a - First score
298
+ * @param {RiskScore} b - Second score
299
+ * @returns {Object} Comparison result
300
+ */
301
+ function compareScores(a, b) {
302
+ return {
303
+ difference: a.total - b.total,
304
+ percentChange: b.total > 0 ? ((a.total - b.total) / b.total) * 100 : 0,
305
+ levelChanged: a.level !== b.level,
306
+ oldLevel: b.level,
307
+ newLevel: a.level,
308
+ vectorChanges: Object.keys(a.vectors).reduce((acc, key) => {
309
+ const oldVal = b.vectors[key]?.weighted || 0;
310
+ const newVal = a.vectors[key]?.weighted || 0;
311
+ if (oldVal !== newVal) {
312
+ acc[key] = { old: oldVal, new: newVal, change: newVal - oldVal };
313
+ }
314
+ return acc;
315
+ }, {}),
316
+ };
317
+ }
318
+
319
+ module.exports = {
320
+ calculateRiskScore,
321
+ quickAssess,
322
+ buildContext,
323
+ getDomainBreakdown,
324
+ formatRiskScore,
325
+ compareScores,
326
+ RISK_VECTORS,
327
+ RISK_LEVELS,
328
+ };
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Risk Thresholds
3
+ *
4
+ * Configurable thresholds for risk-based decisions.
5
+ * These can be overridden in policy configuration.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ /**
11
+ * Default threshold configuration
12
+ *
13
+ * Tuned to reduce false positives while maintaining security.
14
+ * Single-file UI/component changes should typically auto-allow.
15
+ * Multi-file changes to core/auth/payments require confirmation.
16
+ * Only block truly dangerous patterns (migrations, mass deletes, etc.)
17
+ */
18
+ const DEFAULT_THRESHOLDS = {
19
+ /**
20
+ * Score thresholds for automatic decisions
21
+ * Raised significantly to focus only on real issues (hallucinations, drift)
22
+ * Normal development changes should almost never trigger
23
+ */
24
+ autoAllow: 50, // Auto-allow if score <= this (raised from 30)
25
+ requireConfirm: 85, // Require confirmation if score > this (raised from 70)
26
+ autoBlock: 120, // Auto-block if score >= this (raised from 100)
27
+
28
+ /**
29
+ * Vector-specific thresholds
30
+ */
31
+ vectors: {
32
+ surface_area: {
33
+ warn: 10,
34
+ block: 25,
35
+ },
36
+ blast_radius: {
37
+ warn: 30,
38
+ block: 60,
39
+ },
40
+ irreversibility: {
41
+ warn: 25,
42
+ block: 50,
43
+ },
44
+ confidence: {
45
+ warn: 20,
46
+ block: 60,
47
+ },
48
+ novelty: {
49
+ warn: 20,
50
+ block: 40,
51
+ },
52
+ domain: {
53
+ warn: 30,
54
+ block: 60,
55
+ },
56
+ side_effects: {
57
+ warn: 20,
58
+ block: 50,
59
+ },
60
+ },
61
+
62
+ /**
63
+ * Domain-specific thresholds
64
+ * Multipliers reduced to prevent over-penalization of normal changes
65
+ */
66
+ domains: {
67
+ auth: {
68
+ multiplier: 1.2, // Reduced from 1.5 - auth changes are common
69
+ requireConfirm: 50, // Raised from 30
70
+ autoBlock: 90, // Raised from 60
71
+ },
72
+ payments: {
73
+ multiplier: 1.3, // Reduced from 1.8 - payments needs care but not blocking
74
+ requireConfirm: 45, // Raised from 25
75
+ autoBlock: 85, // Raised from 50
76
+ },
77
+ database: {
78
+ multiplier: 1.1, // Reduced from 1.3 - DB changes are normal
79
+ requireConfirm: 55, // Raised from 40
80
+ autoBlock: 95, // Raised from 70
81
+ },
82
+ security: {
83
+ multiplier: 1.2, // Reduced from 1.6
84
+ requireConfirm: 50, // Raised from 25
85
+ autoBlock: 90, // Raised from 55
86
+ },
87
+ core: {
88
+ multiplier: 1.1, // Reduced from 1.2
89
+ requireConfirm: 60, // Raised from 45
90
+ autoBlock: 95, // Raised from 75
91
+ },
92
+ middleware: {
93
+ multiplier: 1.0, // Reduced from 1.1 - middleware is usually safe
94
+ requireConfirm: 65, // Raised from 50
95
+ autoBlock: 100, // Raised from 80
96
+ },
97
+ ui: {
98
+ multiplier: 0.7, // Reduced from 0.8 - UI is very safe
99
+ requireConfirm: 80, // Raised from 60
100
+ autoBlock: 120, // Raised from 90 - UI should almost never block
101
+ },
102
+ test: {
103
+ multiplier: 0.3, // Reduced from 0.5 - tests are safest
104
+ requireConfirm: 100, // Raised from 70
105
+ autoBlock: 150, // Raised from 95 - tests should never block
106
+ },
107
+ },
108
+
109
+ /**
110
+ * File count limits
111
+ */
112
+ fileLimits: {
113
+ warn: 5,
114
+ block: 15,
115
+ hardLimit: 50,
116
+ },
117
+
118
+ /**
119
+ * Line count limits
120
+ */
121
+ lineLimits: {
122
+ warn: 200,
123
+ block: 500,
124
+ hardLimit: 2000,
125
+ },
126
+ };
127
+
128
+ /**
129
+ * Profile presets
130
+ */
131
+ const THRESHOLD_PROFILES = {
132
+ /**
133
+ * Strict profile - very conservative
134
+ */
135
+ strict: {
136
+ autoAllow: 10,
137
+ requireConfirm: 30,
138
+ autoBlock: 60,
139
+ fileLimits: {
140
+ warn: 3,
141
+ block: 8,
142
+ hardLimit: 20,
143
+ },
144
+ lineLimits: {
145
+ warn: 100,
146
+ block: 300,
147
+ hardLimit: 1000,
148
+ },
149
+ },
150
+
151
+ /**
152
+ * Balanced profile - default
153
+ */
154
+ balanced: {
155
+ ...DEFAULT_THRESHOLDS,
156
+ },
157
+
158
+ /**
159
+ * Permissive profile - more lenient
160
+ */
161
+ permissive: {
162
+ autoAllow: 25,
163
+ requireConfirm: 70,
164
+ autoBlock: 95,
165
+ fileLimits: {
166
+ warn: 10,
167
+ block: 25,
168
+ hardLimit: 100,
169
+ },
170
+ lineLimits: {
171
+ warn: 500,
172
+ block: 1000,
173
+ hardLimit: 5000,
174
+ },
175
+ },
176
+
177
+ /**
178
+ * Repo-lock profile - most conservative
179
+ */
180
+ "repo-lock": {
181
+ autoAllow: 5,
182
+ requireConfirm: 15,
183
+ autoBlock: 40,
184
+ fileLimits: {
185
+ warn: 2,
186
+ block: 5,
187
+ hardLimit: 10,
188
+ },
189
+ lineLimits: {
190
+ warn: 50,
191
+ block: 150,
192
+ hardLimit: 500,
193
+ },
194
+ },
195
+ };
196
+
197
+ /**
198
+ * Load thresholds from policy
199
+ * @param {Object} policy - Policy configuration
200
+ * @returns {Object} Merged threshold configuration
201
+ */
202
+ function loadThresholds(policy = {}) {
203
+ // Start with default
204
+ let thresholds = { ...DEFAULT_THRESHOLDS };
205
+
206
+ // Apply profile if specified
207
+ const profile = policy.profile || "balanced";
208
+ if (THRESHOLD_PROFILES[profile]) {
209
+ thresholds = mergeDeep(thresholds, THRESHOLD_PROFILES[profile]);
210
+ }
211
+
212
+ // Apply custom thresholds from policy
213
+ if (policy.thresholds) {
214
+ thresholds = mergeDeep(thresholds, policy.thresholds);
215
+ }
216
+
217
+ // Apply risk configuration
218
+ if (policy.risk) {
219
+ if (policy.risk.autoAllow !== undefined) thresholds.autoAllow = policy.risk.autoAllow;
220
+ if (policy.risk.requireConfirm !== undefined) thresholds.requireConfirm = policy.risk.requireConfirm;
221
+ if (policy.risk.autoBlock !== undefined) thresholds.autoBlock = policy.risk.autoBlock;
222
+ }
223
+
224
+ return thresholds;
225
+ }
226
+
227
+ /**
228
+ * Deep merge objects
229
+ */
230
+ function mergeDeep(target, source) {
231
+ const output = { ...target };
232
+
233
+ for (const key of Object.keys(source)) {
234
+ if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
235
+ output[key] = mergeDeep(output[key] || {}, source[key]);
236
+ } else {
237
+ output[key] = source[key];
238
+ }
239
+ }
240
+
241
+ return output;
242
+ }
243
+
244
+ /**
245
+ * Get decision based on score and thresholds
246
+ * @param {number} score - Risk score
247
+ * @param {Object} thresholds - Threshold configuration
248
+ * @param {string[]} domains - Affected domains
249
+ * @returns {Object} Decision object
250
+ */
251
+ function getDecision(score, thresholds, domains = []) {
252
+ // Check for domain-specific overrides
253
+ let effectiveThresholds = { ...thresholds };
254
+ let maxMultiplier = 1;
255
+
256
+ for (const domain of domains) {
257
+ const domainConfig = thresholds.domains?.[domain];
258
+ if (domainConfig) {
259
+ if (domainConfig.multiplier > maxMultiplier) {
260
+ maxMultiplier = domainConfig.multiplier;
261
+ }
262
+ // Use the most restrictive domain threshold
263
+ if (domainConfig.autoBlock < effectiveThresholds.autoBlock) {
264
+ effectiveThresholds.autoBlock = domainConfig.autoBlock;
265
+ }
266
+ if (domainConfig.requireConfirm < effectiveThresholds.requireConfirm) {
267
+ effectiveThresholds.requireConfirm = domainConfig.requireConfirm;
268
+ }
269
+ }
270
+ }
271
+
272
+ // Apply domain multiplier to score
273
+ const effectiveScore = Math.round(score * maxMultiplier);
274
+
275
+ // Determine decision
276
+ if (effectiveScore >= effectiveThresholds.autoBlock) {
277
+ return {
278
+ decision: "BLOCK",
279
+ reason: `Risk score ${effectiveScore} exceeds auto-block threshold ${effectiveThresholds.autoBlock}`,
280
+ score: effectiveScore,
281
+ multiplier: maxMultiplier,
282
+ thresholdUsed: effectiveThresholds.autoBlock,
283
+ };
284
+ }
285
+
286
+ if (effectiveScore > effectiveThresholds.requireConfirm) {
287
+ return {
288
+ decision: "REQUIRE_CONFIRMATION",
289
+ reason: `Risk score ${effectiveScore} exceeds confirmation threshold ${effectiveThresholds.requireConfirm}`,
290
+ score: effectiveScore,
291
+ multiplier: maxMultiplier,
292
+ thresholdUsed: effectiveThresholds.requireConfirm,
293
+ };
294
+ }
295
+
296
+ if (effectiveScore <= effectiveThresholds.autoAllow) {
297
+ return {
298
+ decision: "ALLOW",
299
+ reason: `Risk score ${effectiveScore} within auto-allow threshold ${effectiveThresholds.autoAllow}`,
300
+ score: effectiveScore,
301
+ multiplier: maxMultiplier,
302
+ thresholdUsed: effectiveThresholds.autoAllow,
303
+ };
304
+ }
305
+
306
+ // Default to allow with warning for scores in between
307
+ return {
308
+ decision: "ALLOW_WITH_WARNING",
309
+ reason: `Risk score ${effectiveScore} is elevated but within limits`,
310
+ score: effectiveScore,
311
+ multiplier: maxMultiplier,
312
+ thresholdUsed: effectiveThresholds.requireConfirm,
313
+ };
314
+ }
315
+
316
+ module.exports = {
317
+ DEFAULT_THRESHOLDS,
318
+ THRESHOLD_PROFILES,
319
+ loadThresholds,
320
+ getDecision,
321
+ mergeDeep,
322
+ };