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,333 @@
1
+ /**
2
+ * Verdict System v2 - Deterministic Enforcement Verdicts
3
+ *
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * AGENT FIREWALL™ - VERDICT SYSTEM
6
+ * ═══════════════════════════════════════════════════════════════════════════════
7
+ *
8
+ * Every Agent Firewall run MUST end in exactly one verdict:
9
+ * - PASS (intent + proof satisfied)
10
+ * - BLOCK (default on any violation)
11
+ *
12
+ * NO "partial success".
13
+ * NO "best effort".
14
+ * NO "WARN" as a final state in ENFORCE mode.
15
+ *
16
+ * Verdicts are:
17
+ * - Deterministic
18
+ * - Signed/hashed
19
+ * - Stored for reuse
20
+ *
21
+ * @module enforcement/verdict-v2
22
+ * @version 2.0.0
23
+ */
24
+
25
+ "use strict";
26
+
27
+ const crypto = require("crypto");
28
+
29
+ /**
30
+ * Verdict decisions - only two options
31
+ */
32
+ const VERDICT = {
33
+ PASS: "PASS",
34
+ BLOCK: "BLOCK",
35
+ };
36
+
37
+ /**
38
+ * Observation decision (for OBSERVE mode only)
39
+ */
40
+ const OBSERVATION = {
41
+ WOULD_PASS: "WOULD_PASS",
42
+ WOULD_BLOCK: "WOULD_BLOCK",
43
+ };
44
+
45
+ /**
46
+ * Firewall modes
47
+ */
48
+ const MODE = {
49
+ ENFORCE: "ENFORCE", // Default: block on violation
50
+ OBSERVE: "OBSERVE", // Log + warn only (returns WOULD_* verdicts)
51
+ CI: "CI", // Fail pipeline on BLOCK
52
+ IDE: "IDE", // Real-time interception, block writes
53
+ };
54
+
55
+ /**
56
+ * Verdict object structure
57
+ * @typedef {Object} Verdict
58
+ * @property {string} decision - PASS or BLOCK
59
+ * @property {string} mode - Mode used for evaluation
60
+ * @property {Object[]} violations - All violations found
61
+ * @property {Object[]} proofs - All proofs collected
62
+ * @property {string} intent_hash - Hash of intent used
63
+ * @property {string} verdict_hash - Hash of entire verdict for signing
64
+ * @property {string} timestamp - ISO timestamp
65
+ * @property {string} id - Unique verdict ID
66
+ */
67
+
68
+ /**
69
+ * Generate verdict ID
70
+ * @returns {string} Unique verdict ID
71
+ */
72
+ function generateVerdictId() {
73
+ return `vrd-${Date.now().toString(36)}-${crypto.randomBytes(4).toString("hex")}`;
74
+ }
75
+
76
+ /**
77
+ * Compute verdict hash for integrity/signing
78
+ * @param {Object} verdict - Verdict object (without hash)
79
+ * @returns {string} SHA-256 hash
80
+ */
81
+ function computeVerdictHash(verdict) {
82
+ const content = JSON.stringify({
83
+ decision: verdict.decision,
84
+ mode: verdict.mode,
85
+ violations: verdict.violations.map(v => ({
86
+ code: v.code,
87
+ resource: v.resource,
88
+ })),
89
+ proofs: verdict.proofs.map(p => ({
90
+ id: p.id,
91
+ status: p.status,
92
+ })),
93
+ intent_hash: verdict.intent_hash,
94
+ timestamp: verdict.timestamp,
95
+ });
96
+
97
+ return crypto.createHash("sha256").update(content).digest("hex");
98
+ }
99
+
100
+ /**
101
+ * Generate deterministic verdict from alignment and proof results
102
+ *
103
+ * RULES:
104
+ * - If ANY violation exists → BLOCK
105
+ * - If ANY required proof failed → BLOCK
106
+ * - If intent is missing → BLOCK
107
+ * - Only if ALL checks pass → PASS
108
+ *
109
+ * @param {Object} params - Verdict parameters
110
+ * @param {Object} params.alignmentResult - Result from alignment engine
111
+ * @param {Object[]} params.proofs - Array of proof artifacts
112
+ * @param {string} params.mode - Firewall mode
113
+ * @param {string} params.intent_hash - Hash of intent used
114
+ * @returns {Verdict} Final verdict
115
+ */
116
+ function generateVerdict({ alignmentResult, proofs = [], mode = MODE.ENFORCE, intent_hash = null }) {
117
+ const timestamp = new Date().toISOString();
118
+ const id = generateVerdictId();
119
+
120
+ // Collect all violations
121
+ const violations = alignmentResult?.violations || [];
122
+
123
+ // Check for failed proofs
124
+ const failedProofs = proofs.filter(p => p.status === "failed" || p.status === "unverified");
125
+ for (const proof of failedProofs) {
126
+ violations.push({
127
+ code: "PROOF_FAILED",
128
+ rule: `proof_${proof.type}`,
129
+ message: `Required proof failed: ${proof.type} - ${proof.id}`,
130
+ resource: proof.target || "unknown",
131
+ intent_ref: "reality_proof",
132
+ severity: "block",
133
+ });
134
+ }
135
+
136
+ // Determine decision
137
+ // In ENFORCE/CI mode: any violation = BLOCK
138
+ // In OBSERVE mode: violations generate WOULD_BLOCK but don't actually block
139
+ let decision;
140
+
141
+ if (mode === MODE.OBSERVE) {
142
+ decision = violations.length > 0 ? OBSERVATION.WOULD_BLOCK : OBSERVATION.WOULD_PASS;
143
+ } else {
144
+ // ENFORCE, CI, IDE - strict enforcement
145
+ decision = violations.length > 0 ? VERDICT.BLOCK : VERDICT.PASS;
146
+ }
147
+
148
+ const verdict = {
149
+ id,
150
+ decision,
151
+ mode,
152
+ violations,
153
+ proofs: proofs.map(p => ({
154
+ id: p.id,
155
+ type: p.type,
156
+ status: p.status,
157
+ trace: p.trace,
158
+ })),
159
+ intent_hash,
160
+ timestamp,
161
+ verdict_hash: "", // Will be computed
162
+
163
+ // Summary for humans
164
+ summary: generateSummary(decision, violations, proofs),
165
+
166
+ // Machine-readable status
167
+ passed: decision === VERDICT.PASS || decision === OBSERVATION.WOULD_PASS,
168
+ blocked: decision === VERDICT.BLOCK || decision === OBSERVATION.WOULD_BLOCK,
169
+ violation_count: violations.length,
170
+ proof_count: proofs.length,
171
+ failed_proof_count: failedProofs.length,
172
+ };
173
+
174
+ // Compute and set hash
175
+ verdict.verdict_hash = computeVerdictHash(verdict);
176
+
177
+ return verdict;
178
+ }
179
+
180
+ /**
181
+ * Generate human-readable summary
182
+ * @param {string} decision - Verdict decision
183
+ * @param {Object[]} violations - Violations array
184
+ * @param {Object[]} proofs - Proofs array
185
+ * @returns {string} Summary text
186
+ */
187
+ function generateSummary(decision, violations, proofs) {
188
+ if (decision === VERDICT.PASS || decision === OBSERVATION.WOULD_PASS) {
189
+ return `All checks passed. Intent aligned, ${proofs.length} proofs verified.`;
190
+ }
191
+
192
+ const violationSummary = violations.slice(0, 3)
193
+ .map(v => v.message)
194
+ .join("; ");
195
+
196
+ const extra = violations.length > 3 ? ` (+${violations.length - 3} more)` : "";
197
+
198
+ return `BLOCKED: ${violations.length} violation(s). ${violationSummary}${extra}`;
199
+ }
200
+
201
+ /**
202
+ * Generate block message with exact reason and reference
203
+ * @param {Object[]} violations - Violations array
204
+ * @returns {string} Formatted block message
205
+ */
206
+ function formatBlockMessage(violations) {
207
+ if (violations.length === 0) {
208
+ return "BLOCKED_BY_AGENT_FIREWALL: Unknown reason";
209
+ }
210
+
211
+ const lines = ["BLOCKED_BY_AGENT_FIREWALL:"];
212
+
213
+ for (const violation of violations) {
214
+ lines.push(`- reason: ${violation.code}`);
215
+ lines.push(` resource: ${violation.resource}`);
216
+ lines.push(` intent_ref: ${violation.intent_ref}`);
217
+ if (violation.message) {
218
+ lines.push(` message: ${violation.message}`);
219
+ }
220
+ lines.push("");
221
+ }
222
+
223
+ return lines.join("\n");
224
+ }
225
+
226
+ /**
227
+ * Verify verdict integrity
228
+ * @param {Object} verdict - Verdict to verify
229
+ * @returns {Object} Verification result
230
+ */
231
+ function verifyVerdictIntegrity(verdict) {
232
+ if (!verdict || !verdict.verdict_hash) {
233
+ return {
234
+ valid: false,
235
+ reason: "MISSING_HASH",
236
+ };
237
+ }
238
+
239
+ const computed = computeVerdictHash(verdict);
240
+
241
+ return {
242
+ valid: computed === verdict.verdict_hash,
243
+ reason: computed === verdict.verdict_hash ? "VERIFIED" : "HASH_MISMATCH",
244
+ computed_hash: computed,
245
+ stored_hash: verdict.verdict_hash,
246
+ };
247
+ }
248
+
249
+ /**
250
+ * Convert legacy verdict (ALLOW/WARN/BLOCK) to v2 format
251
+ * @param {Object} legacyVerdict - Legacy verdict object
252
+ * @param {string} mode - Firewall mode
253
+ * @returns {Verdict} V2 verdict
254
+ */
255
+ function convertLegacyVerdict(legacyVerdict, mode = MODE.ENFORCE) {
256
+ const violations = (legacyVerdict.violations || []).map(v => ({
257
+ code: v.rule?.toUpperCase().replace(/-/g, "_") || "UNKNOWN",
258
+ rule: v.rule || "unknown",
259
+ message: v.message || "No message",
260
+ resource: v.claimId || v.file || "unknown",
261
+ intent_ref: "legacy",
262
+ severity: v.severity || "block",
263
+ }));
264
+
265
+ // In v2, WARN becomes BLOCK in ENFORCE mode
266
+ let decision;
267
+ if (mode === MODE.OBSERVE) {
268
+ decision = legacyVerdict.decision === "ALLOW"
269
+ ? OBSERVATION.WOULD_PASS
270
+ : OBSERVATION.WOULD_BLOCK;
271
+ } else {
272
+ // ALLOW stays PASS, WARN and BLOCK become BLOCK
273
+ decision = legacyVerdict.decision === "ALLOW" ? VERDICT.PASS : VERDICT.BLOCK;
274
+ }
275
+
276
+ return generateVerdict({
277
+ alignmentResult: { violations },
278
+ proofs: [],
279
+ mode,
280
+ intent_hash: null,
281
+ });
282
+ }
283
+
284
+ /**
285
+ * Create verdict manifest for artifact storage
286
+ * @param {Object} verdict - Verdict object
287
+ * @param {Object} metadata - Additional metadata
288
+ * @returns {Object} Manifest object
289
+ */
290
+ function createVerdictManifest(verdict, metadata = {}) {
291
+ return {
292
+ schema_version: "2.0.0",
293
+ verdict: {
294
+ id: verdict.id,
295
+ decision: verdict.decision,
296
+ hash: verdict.verdict_hash,
297
+ timestamp: verdict.timestamp,
298
+ },
299
+ intent: {
300
+ hash: verdict.intent_hash,
301
+ },
302
+ violations: verdict.violations.map(v => ({
303
+ code: v.code,
304
+ resource: v.resource,
305
+ intent_ref: v.intent_ref,
306
+ })),
307
+ proofs: verdict.proofs.map(p => ({
308
+ id: p.id,
309
+ type: p.type,
310
+ status: p.status,
311
+ })),
312
+ summary: verdict.summary,
313
+ metadata: {
314
+ mode: verdict.mode,
315
+ ...metadata,
316
+ },
317
+ created_at: new Date().toISOString(),
318
+ };
319
+ }
320
+
321
+ module.exports = {
322
+ VERDICT,
323
+ OBSERVATION,
324
+ MODE,
325
+ generateVerdict,
326
+ generateVerdictId,
327
+ computeVerdictHash,
328
+ verifyVerdictIntegrity,
329
+ formatBlockMessage,
330
+ generateSummary,
331
+ convertLegacyVerdict,
332
+ createVerdictManifest,
333
+ };
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Auth Evidence Resolver
3
+ *
4
+ * Resolves auth claims against truthpack.auth.json
5
+ * Checks for auth drift (claimed restriction not enforced).
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const { getAuthRules } = require("../truthpack");
11
+
12
+ /**
13
+ * Resolve auth claim evidence
14
+ * @param {string} projectRoot - Project root directory
15
+ * @param {object} claim - Auth claim
16
+ * @returns {object} Evidence result
17
+ */
18
+ function resolve(projectRoot, claim) {
19
+ const authData = getAuthRules(projectRoot);
20
+
21
+ // Extract auth keywords from claim value
22
+ const claimText = claim.value.toLowerCase();
23
+ const hasAuthKeywords = /\b(admin|owner|staff|role|scope|permission|auth|authorize|rbac)\b/i.test(claimText);
24
+
25
+ if (!hasAuthKeywords) {
26
+ // Not an auth-related claim
27
+ return {
28
+ result: "PROVEN",
29
+ sources: [],
30
+ reason: "No auth keywords detected in claim"
31
+ };
32
+ }
33
+
34
+ // Check if auth middleware exists
35
+ const nextMiddleware = authData.nextMiddleware || [];
36
+ const fastifyHooks = authData.fastify?.hooks || [];
37
+
38
+ if (nextMiddleware.length > 0 || fastifyHooks.length > 0) {
39
+ // Auth infrastructure exists
40
+ // Check if claim matches protected patterns
41
+ const matcherPatterns = authData.nextMatcherPatterns || [];
42
+ const claimFile = claim.file || "";
43
+
44
+ // Check if file is in protected path
45
+ const isProtected = matcherPatterns.some(pattern => {
46
+ // Simple pattern matching
47
+ if (pattern.includes("*")) {
48
+ const regex = new RegExp(pattern.replace(/\*/g, ".*"));
49
+ return regex.test(claimFile);
50
+ }
51
+ return claimFile.includes(pattern);
52
+ });
53
+
54
+ if (isProtected) {
55
+ return {
56
+ result: "PROVEN",
57
+ sources: [{
58
+ type: "truthpack.auth",
59
+ pointer: claim.pointer,
60
+ confidence: 0.8
61
+ }],
62
+ reason: "Auth claim matches protected route pattern"
63
+ };
64
+ } else {
65
+ // Auth keywords present but route not protected - potential drift
66
+ return {
67
+ result: "CONTRADICTS",
68
+ sources: [{
69
+ type: "truthpack.auth",
70
+ pointer: claim.pointer,
71
+ confidence: 0.7
72
+ }],
73
+ reason: "Auth keywords present but route not in protected patterns (auth drift)"
74
+ };
75
+ }
76
+ } else {
77
+ // No auth infrastructure - cannot verify
78
+ return {
79
+ result: "UNPROVEN",
80
+ sources: [],
81
+ reason: "No auth middleware found in truthpack"
82
+ };
83
+ }
84
+ }
85
+
86
+ module.exports = {
87
+ resolve
88
+ };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Contract Evidence Resolver
3
+ *
4
+ * Resolves contract claims against truthpack.contracts.json
5
+ * Checks for contract drift (API shape mismatch).
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const { getContracts } = require("../truthpack");
11
+
12
+ /**
13
+ * Resolve contract claim evidence
14
+ * @param {string} projectRoot - Project root directory
15
+ * @param {object} claim - Contract claim
16
+ * @returns {object} Evidence result
17
+ */
18
+ function resolve(projectRoot, claim) {
19
+ const contracts = getContracts(projectRoot);
20
+
21
+ // Extract contract identifier from claim
22
+ // Contract claims might reference API endpoints, types, or schemas
23
+ const claimValue = claim.value.toLowerCase();
24
+
25
+ // Check if contracts exist
26
+ if (!contracts || Object.keys(contracts).length === 0) {
27
+ return {
28
+ result: "UNPROVEN",
29
+ sources: [],
30
+ reason: "No contracts found in truthpack"
31
+ };
32
+ }
33
+
34
+ // Try to match claim against contract definitions
35
+ // This is a simplified check - full implementation would parse contract schemas
36
+ const contractKeys = Object.keys(contracts);
37
+ const matchingContract = contractKeys.find(key =>
38
+ key.toLowerCase().includes(claimValue) ||
39
+ claimValue.includes(key.toLowerCase())
40
+ );
41
+
42
+ if (matchingContract) {
43
+ return {
44
+ result: "PROVEN",
45
+ sources: [{
46
+ type: "truthpack.contracts",
47
+ pointer: claim.pointer,
48
+ confidence: 0.8
49
+ }],
50
+ reason: `Contract ${matchingContract} found in truthpack`
51
+ };
52
+ }
53
+
54
+ // Check for contract drift by examining the claim context
55
+ // If claim references an API endpoint, check if contract exists for that endpoint
56
+ if (claimValue.includes("api") || claimValue.includes("endpoint")) {
57
+ // Potential contract drift - endpoint referenced but contract not found
58
+ return {
59
+ result: "CONTRADICTS",
60
+ sources: [],
61
+ reason: "API endpoint referenced but contract not found in truthpack (contract drift)"
62
+ };
63
+ }
64
+
65
+ // Cannot verify contract
66
+ return {
67
+ result: "UNPROVEN",
68
+ sources: [],
69
+ reason: "Contract not found in truthpack"
70
+ };
71
+ }
72
+
73
+ module.exports = {
74
+ resolve
75
+ };
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Environment Variable Evidence Resolver
3
+ *
4
+ * Resolves env var claims against truthpack.env.json
5
+ * Checks for ghost env vars (used but not declared).
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const fs = require("fs");
11
+ const path = require("path");
12
+ const { getEnvVars } = require("../truthpack");
13
+
14
+ /**
15
+ * Resolve env var claim evidence
16
+ * @param {string} projectRoot - Project root directory
17
+ * @param {object} claim - Env var claim
18
+ * @returns {object} Evidence result
19
+ */
20
+ function resolve(projectRoot, claim) {
21
+ const envData = getEnvVars(projectRoot);
22
+
23
+ // Check declared env vars
24
+ const declared = envData.declared || [];
25
+ const declaredSet = new Set(declared.map(v => v.name || v));
26
+
27
+ // Check declared sources (env.schema.ts, .env.example, etc.)
28
+ const declaredSources = envData.declaredSources || [];
29
+
30
+ const envVarName = claim.value;
31
+
32
+ // Check if env var is declared
33
+ if (declaredSet.has(envVarName)) {
34
+ // Find source file
35
+ const source = declaredSources.find(s =>
36
+ s.vars && s.vars.includes(envVarName)
37
+ );
38
+
39
+ return {
40
+ result: "PROVEN",
41
+ sources: [{
42
+ type: "truthpack.env",
43
+ pointer: source ? source.file : claim.pointer,
44
+ confidence: 0.9
45
+ }],
46
+ reason: `Environment variable ${envVarName} found in truthpack`
47
+ };
48
+ }
49
+
50
+ // Check if env var exists in .env.example or schema files
51
+ // Check multiple possible locations for .env.example
52
+ const envExamplePaths = [
53
+ path.join(projectRoot, ".env.example"),
54
+ path.join(projectRoot, "apps", "web-ui", ".env.example"),
55
+ path.join(projectRoot, "apps", "api", ".env.example")
56
+ ];
57
+
58
+ for (const envExamplePath of envExamplePaths) {
59
+ if (fs.existsSync(envExamplePath)) {
60
+ const envExample = fs.readFileSync(envExamplePath, "utf8");
61
+ if (envExample.includes(envVarName)) {
62
+ const relativePath = path.relative(projectRoot, envExamplePath).replace(/\\/g, "/");
63
+ return {
64
+ result: "PROVEN",
65
+ sources: [{
66
+ type: "repo.search",
67
+ pointer: relativePath,
68
+ confidence: 0.7
69
+ }],
70
+ reason: `Environment variable ${envVarName} found in ${relativePath}`
71
+ };
72
+ }
73
+ }
74
+ }
75
+
76
+ const envSchemaPath = findEnvSchemaFile(projectRoot);
77
+
78
+ if (envSchemaPath && fs.existsSync(envSchemaPath)) {
79
+ const envSchema = fs.readFileSync(envSchemaPath, "utf8");
80
+ if (envSchema.includes(envVarName)) {
81
+ return {
82
+ result: "PROVEN",
83
+ sources: [{
84
+ type: "repo.search",
85
+ pointer: envSchemaPath,
86
+ confidence: 0.8
87
+ }],
88
+ reason: `Environment variable ${envVarName} found in env schema`
89
+ };
90
+ }
91
+ }
92
+
93
+ // Not found - ghost env var
94
+ return {
95
+ result: "UNPROVEN",
96
+ sources: [],
97
+ reason: `Environment variable ${envVarName} not declared (ghost env var)`
98
+ };
99
+ }
100
+
101
+ /**
102
+ * Find env schema file (env.schema.ts, env.ts, etc.)
103
+ * @param {string} projectRoot - Project root directory
104
+ * @returns {string|null} Path to schema file or null
105
+ */
106
+ function findEnvSchemaFile(projectRoot) {
107
+ const candidates = [
108
+ "apps/api/src/config/env.schema.ts",
109
+ "apps/api/src/env.schema.ts",
110
+ "src/config/env.schema.ts",
111
+ "src/env.schema.ts",
112
+ "env.schema.ts"
113
+ ];
114
+
115
+ for (const candidate of candidates) {
116
+ const fullPath = path.join(projectRoot, candidate);
117
+ if (fs.existsSync(fullPath)) {
118
+ return candidate;
119
+ }
120
+ }
121
+
122
+ return null;
123
+ }
124
+
125
+ module.exports = {
126
+ resolve
127
+ };