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,622 @@
1
+ /**
2
+ * Truth Context – MCP Tools for Evidence‑Backed AI
3
+ *
4
+ * Core context-engine tools that surface **truth-backed** context for AI agents.
5
+ * Every response is grounded in concrete evidence with file/line citations
6
+ * and explicit confidence scores.
7
+ *
8
+ * This is the "Truth Firewall", exposed to agents as an "Evidence Pack" / "Truth Pack". [web:3]
9
+ *
10
+ * Tools:
11
+ * - vibecheck.ctx – Build a repo-level Truth Pack (routes, auth, billing, env, schema)
12
+ * - vibecheck.verify_claim – Check whether a claim is backed by real evidence
13
+ * - vibecheck.evidence – Pull code-level evidence for a specific file/function
14
+ */
15
+
16
+ import fs from "fs/promises";
17
+ import path from "path";
18
+ import { execSync } from "child_process";
19
+
20
+ // ============================================================================
21
+ // TRUTH CONTEXT TOOLS
22
+ // ============================================================================
23
+
24
+ export const TRUTH_CONTEXT_TOOLS = [
25
+ {
26
+ name: "vibecheck.ctx",
27
+ description: `📋 Build a repo Truth Pack: routes, auth, billing, env vars, schema.
28
+
29
+ Generates an evidence-backed context bundle with file/line citations.
30
+ Use this before the agent makes any architectural or behavioral claims
31
+ about the codebase.
32
+
33
+ Returns:
34
+ - routes: All detected routes with handlers and middleware
35
+ - auth: Auth guards, protected routes, auth flow indicators
36
+ - billing: Payment gates, subscription checks, paid feature indicators
37
+ - env: Environment variables (declared vs used, mismatches)
38
+ - schema: Database schema and TypeScript contracts
39
+ - confidence: Aggregate confidence score (0–1) for the extracted view`,
40
+ inputSchema: {
41
+ type: "object",
42
+ properties: {
43
+ scope: {
44
+ type: "string",
45
+ enum: ["all", "routes", "auth", "billing", "env", "schema"],
46
+ description: "Which slice of context to extract (default: all)",
47
+ default: "all",
48
+ },
49
+ path: {
50
+ type: "string",
51
+ description: "Project root path (default: current working directory)",
52
+ },
53
+ },
54
+ },
55
+ },
56
+ {
57
+ name: "vibecheck.verify_claim",
58
+ description: `🔍 Truth Firewall check – verify that a claim is backed by code.
59
+
60
+ Run this before asserting that something exists, is configured, or is enforced.
61
+ Returns concrete evidence (file/line) when the claim is supported,
62
+ or a structured rejection with an explanation when it is not.
63
+
64
+ Examples:
65
+ - "Route /api/users exists" → VERIFIED with handler at src/routes/users.ts:45
66
+ - "Auth is required for /admin" → VERIFIED via middleware at src/middleware/auth.ts:12
67
+ - "Stripe is configured" → REJECTED: No evidence of Stripe integration found`,
68
+ inputSchema: {
69
+ type: "object",
70
+ properties: {
71
+ claim_type: {
72
+ type: "string",
73
+ enum: [
74
+ "route",
75
+ "endpoint",
76
+ "env_var",
77
+ "middleware",
78
+ "auth_guard",
79
+ "billing_gate",
80
+ "file",
81
+ "function",
82
+ ],
83
+ description: "Category of claim to verify",
84
+ },
85
+ claim: {
86
+ type: "string",
87
+ description:
88
+ "The claim subject (e.g. '/api/users', 'AUTH_SECRET', 'authMiddleware')",
89
+ },
90
+ path: {
91
+ type: "string",
92
+ description: "Project root path (default: current working directory)",
93
+ },
94
+ },
95
+ required: ["claim_type", "claim"],
96
+ },
97
+ },
98
+ {
99
+ name: "vibecheck.evidence",
100
+ description: `📎 Retrieve code evidence for a file or symbol.
101
+
102
+ Returns an annotated code snippet with line numbers for precise citation.
103
+ Use this when the agent needs to quote or reason about specific code blocks
104
+ in its response.`,
105
+ inputSchema: {
106
+ type: "object",
107
+ properties: {
108
+ file: {
109
+ type: "string",
110
+ description: "File path relative to the project root",
111
+ },
112
+ function_name: {
113
+ type: "string",
114
+ description: "Optional function/class name to locate within the file",
115
+ },
116
+ line: {
117
+ type: "number",
118
+ description: "Optional 1-based line number to center the snippet on",
119
+ },
120
+ context_lines: {
121
+ type: "number",
122
+ description:
123
+ "Number of lines of context before/after the target (default: 10)",
124
+ default: 10,
125
+ },
126
+ path: {
127
+ type: "string",
128
+ description: "Project root path (default: current working directory)",
129
+ },
130
+ },
131
+ required: ["file"],
132
+ },
133
+ },
134
+ ];
135
+
136
+ // ============================================================================
137
+ // TOOL DISPATCH
138
+ // ============================================================================
139
+
140
+ export async function handleTruthContextTool(toolName, args) {
141
+ const projectPath = args.path || process.cwd();
142
+
143
+ switch (toolName) {
144
+ case "vibecheck.ctx":
145
+ return await getTruthPack(projectPath, args.scope || "all");
146
+ case "vibecheck.verify_claim":
147
+ return await verifyClaim(projectPath, args.claim_type, args.claim);
148
+ case "vibecheck.evidence":
149
+ return await getEvidence(projectPath, args.file, args);
150
+ default:
151
+ return { error: `Unknown tool: ${toolName}` };
152
+ }
153
+ }
154
+
155
+ // ============================================================================
156
+ // CONTEXT EXTRACTION
157
+ // ============================================================================
158
+
159
+ async function getTruthPack(projectPath, scope) {
160
+ const truthPack = {
161
+ version: "1.0.0",
162
+ generatedAt: new Date().toISOString(),
163
+ projectPath,
164
+ scope,
165
+ confidence: 0,
166
+ sections: {},
167
+ };
168
+
169
+ try {
170
+ if (scope === "all" || scope === "routes") {
171
+ truthPack.sections.routes = await extractRoutes(projectPath);
172
+ }
173
+ if (scope === "all" || scope === "auth") {
174
+ truthPack.sections.auth = await extractAuth(projectPath);
175
+ }
176
+ if (scope === "all" || scope === "billing") {
177
+ truthPack.sections.billing = await extractBilling(projectPath);
178
+ }
179
+ if (scope === "all" || scope === "env") {
180
+ truthPack.sections.env = await extractEnvVars(projectPath);
181
+ }
182
+ if (scope === "all" || scope === "schema") {
183
+ truthPack.sections.schema = await extractSchema(projectPath);
184
+ }
185
+
186
+ const sections = Object.values(truthPack.sections);
187
+ if (sections.length > 0) {
188
+ truthPack.confidence =
189
+ sections.reduce((sum, section) => sum + (section.confidence || 0), 0) /
190
+ sections.length;
191
+ }
192
+
193
+ return truthPack;
194
+ } catch (error) {
195
+ return {
196
+ error: error.message,
197
+ projectPath,
198
+ suggestion: "Run `vibecheck init` to set up the project",
199
+ };
200
+ }
201
+ }
202
+
203
+ async function extractRoutes(projectPath) {
204
+ const routes = [];
205
+ const routePatterns = [
206
+ /app\.(get|post|put|patch|delete|use)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
207
+ /router\.(get|post|put|patch|delete|use)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
208
+ /@(Get|Post|Put|Patch|Delete)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
209
+ ];
210
+
211
+ const files = await findSourceFiles(projectPath, [".ts", ".js", ".tsx", ".jsx"]);
212
+
213
+ for (const file of files.slice(0, 50)) {
214
+ try {
215
+ const content = await fs.readFile(file, "utf8");
216
+ const relPath = path.relative(projectPath, file);
217
+
218
+ for (const pattern of routePatterns) {
219
+ let match;
220
+ pattern.lastIndex = 0;
221
+ while ((match = pattern.exec(content)) !== null) {
222
+ const line = content.substring(0, match.index).split("\n").length;
223
+ routes.push({
224
+ method: match[1].toUpperCase(),
225
+ path: match[2],
226
+ file: relPath,
227
+ line,
228
+ evidence: {
229
+ snippet: content.split("\n")[line - 1]?.trim(),
230
+ verifiedAt: new Date().toISOString(),
231
+ },
232
+ });
233
+ }
234
+ }
235
+ } catch {
236
+ // Skip unreadable files
237
+ }
238
+ }
239
+
240
+ return {
241
+ count: routes.length,
242
+ routes: routes.slice(0, 100),
243
+ confidence: routes.length > 0 ? 0.8 : 0.2,
244
+ };
245
+ }
246
+
247
+ async function extractAuth(projectPath) {
248
+ const authIndicators = [];
249
+ const authPatterns = [
250
+ /auth(enticate|orize|Middleware|Guard|Check)/gi,
251
+ /isAuthenticated|requireAuth|verifyToken|jwt\.verify/gi,
252
+ /passport\.(authenticate|use)/gi,
253
+ /session\.|cookie\./gi,
254
+ ];
255
+
256
+ const files = await findSourceFiles(projectPath, [".ts", ".js"]);
257
+
258
+ for (const file of files.slice(0, 50)) {
259
+ try {
260
+ const content = await fs.readFile(file, "utf8");
261
+ const relPath = path.relative(projectPath, file);
262
+
263
+ for (const pattern of authPatterns) {
264
+ let match;
265
+ pattern.lastIndex = 0;
266
+ while ((match = pattern.exec(content)) !== null) {
267
+ const line = content.substring(0, match.index).split("\n").length;
268
+ authIndicators.push({
269
+ type: "auth_indicator",
270
+ match: match[0],
271
+ file: relPath,
272
+ line,
273
+ });
274
+ }
275
+ }
276
+ } catch {
277
+ // Skip
278
+ }
279
+ }
280
+
281
+ return {
282
+ count: authIndicators.length,
283
+ indicators: authIndicators.slice(0, 50),
284
+ confidence:
285
+ authIndicators.length > 5
286
+ ? 0.8
287
+ : authIndicators.length > 0
288
+ ? 0.5
289
+ : 0.1,
290
+ };
291
+ }
292
+
293
+ async function extractBilling(projectPath) {
294
+ const billingIndicators = [];
295
+ const billingPatterns = [
296
+ /stripe|paddle|lemonsqueezy|gumroad/gi,
297
+ /subscription|payment|checkout|invoice/gi,
298
+ /isPro|isPremium|isEnterprise|hasPaid/gi,
299
+ /price|tier|plan/gi,
300
+ ];
301
+
302
+ const files = await findSourceFiles(projectPath, [".ts", ".js"]);
303
+
304
+ for (const file of files.slice(0, 30)) {
305
+ try {
306
+ const content = await fs.readFile(file, "utf8");
307
+ const relPath = path.relative(projectPath, file);
308
+
309
+ for (const pattern of billingPatterns) {
310
+ let match;
311
+ pattern.lastIndex = 0;
312
+ while ((match = pattern.exec(content)) !== null) {
313
+ const line = content.substring(0, match.index).split("\n").length;
314
+ billingIndicators.push({
315
+ type: "billing_indicator",
316
+ match: match[0],
317
+ file: relPath,
318
+ line,
319
+ });
320
+ }
321
+ }
322
+ } catch {
323
+ // Skip
324
+ }
325
+ }
326
+
327
+ return {
328
+ count: billingIndicators.length,
329
+ indicators: billingIndicators.slice(0, 30),
330
+ confidence:
331
+ billingIndicators.length > 3
332
+ ? 0.7
333
+ : billingIndicators.length > 0
334
+ ? 0.4
335
+ : 0.1,
336
+ };
337
+ }
338
+
339
+ async function extractEnvVars(projectPath) {
340
+ const declared = [];
341
+ const used = [];
342
+
343
+ const envFiles = [".env.example", ".env.local.example", ".env.sample"];
344
+ for (const envFile of envFiles) {
345
+ try {
346
+ const content = await fs.readFile(path.join(projectPath, envFile), "utf8");
347
+ const lines = content.split("\n");
348
+ for (let i = 0; i < lines.length; i++) {
349
+ const match = lines[i].match(/^([A-Z][A-Z0-9_]*)=/);
350
+ if (match) {
351
+ declared.push({
352
+ name: match[1],
353
+ file: envFile,
354
+ line: i + 1,
355
+ });
356
+ }
357
+ }
358
+ } catch {
359
+ // File does not exist
360
+ }
361
+ }
362
+
363
+ const files = await findSourceFiles(projectPath, [".ts", ".js"]);
364
+ for (const file of files.slice(0, 30)) {
365
+ try {
366
+ const content = await fs.readFile(file, "utf8");
367
+ const relPath = path.relative(projectPath, file);
368
+ const pattern = /process\.env\.([A-Z][A-Z0-9_]*)/g;
369
+ let match;
370
+ while ((match = pattern.exec(content)) !== null) {
371
+ const line = content.substring(0, match.index).split("\n").length;
372
+ used.push({
373
+ name: match[1],
374
+ file: relPath,
375
+ line,
376
+ });
377
+ }
378
+ } catch {
379
+ // Skip
380
+ }
381
+ }
382
+
383
+ const declaredNames = new Set(declared.map((d) => d.name));
384
+ const usedNames = new Set(used.map((u) => u.name));
385
+ const undeclared = [...usedNames].filter((name) => !declaredNames.has(name));
386
+ const unused = [...declaredNames].filter((name) => !usedNames.has(name));
387
+
388
+ return {
389
+ declared: declared.slice(0, 50),
390
+ used: used.slice(0, 50),
391
+ mismatches: {
392
+ undeclared,
393
+ unused,
394
+ },
395
+ confidence: undeclared.length === 0 ? 0.9 : 0.5,
396
+ };
397
+ }
398
+
399
+ async function extractSchema(projectPath) {
400
+ const schemas = [];
401
+
402
+ try {
403
+ const prismaPath = path.join(projectPath, "prisma", "schema.prisma");
404
+ const content = await fs.readFile(prismaPath, "utf8");
405
+ const modelMatches = content.matchAll(/model\s+(\w+)\s*\{/g);
406
+ for (const match of modelMatches) {
407
+ schemas.push({
408
+ type: "prisma_model",
409
+ name: match[1],
410
+ file: "prisma/schema.prisma",
411
+ });
412
+ }
413
+ } catch {
414
+ // No Prisma schema
415
+ }
416
+
417
+ const files = await findSourceFiles(projectPath, [".ts", ".tsx"]);
418
+ for (const file of files.slice(0, 20)) {
419
+ try {
420
+ const content = await fs.readFile(file, "utf8");
421
+ const relPath = path.relative(projectPath, file);
422
+
423
+ const typeMatches = content.matchAll(/(?:interface|type)\s+(\w+)/g);
424
+ for (const match of typeMatches) {
425
+ const line = content.substring(0, match.index).split("\n").length;
426
+ schemas.push({
427
+ type: "typescript_type",
428
+ name: match[1],
429
+ file: relPath,
430
+ line,
431
+ });
432
+ }
433
+ } catch {
434
+ // Skip
435
+ }
436
+ }
437
+
438
+ return {
439
+ count: schemas.length,
440
+ schemas: schemas.slice(0, 50),
441
+ confidence:
442
+ schemas.length > 5 ? 0.7 : schemas.length > 0 ? 0.4 : 0.2,
443
+ };
444
+ }
445
+
446
+ // ============================================================================
447
+ // CLAIM VERIFICATION
448
+ // ============================================================================
449
+
450
+ async function verifyClaim(projectPath, claimType, claim) {
451
+ const result = {
452
+ claim: { type: claimType, value: claim },
453
+ verified: false,
454
+ evidence: null,
455
+ confidence: 0,
456
+ rejection: null,
457
+ };
458
+
459
+ try {
460
+ switch (claimType) {
461
+ case "file": {
462
+ const filePath = path.join(projectPath, claim);
463
+ try {
464
+ await fs.access(filePath);
465
+ const stats = await fs.stat(filePath);
466
+ result.verified = true;
467
+ result.confidence = 1.0;
468
+ result.evidence = {
469
+ file: claim,
470
+ exists: true,
471
+ size: stats.size,
472
+ verifiedAt: new Date().toISOString(),
473
+ };
474
+ } catch {
475
+ result.rejection = `File does not exist: ${claim}`;
476
+ }
477
+ break;
478
+ }
479
+
480
+ case "route":
481
+ case "endpoint": {
482
+ const routes = await extractRoutes(projectPath);
483
+ const matchingRoute = routes.routes.find(
484
+ (route) => route.path === claim || route.path.includes(claim),
485
+ );
486
+ if (matchingRoute) {
487
+ result.verified = true;
488
+ result.confidence = 0.9;
489
+ result.evidence = matchingRoute;
490
+ } else {
491
+ result.rejection = `No route matching "${claim}" found in codebase`;
492
+ }
493
+ break;
494
+ }
495
+
496
+ case "env_var": {
497
+ const envData = await extractEnvVars(projectPath);
498
+ const isDeclared = envData.declared.some((env) => env.name === claim);
499
+ const isUsed = envData.used.some((env) => env.name === claim);
500
+ if (isDeclared || isUsed) {
501
+ result.verified = true;
502
+ result.confidence = isDeclared && isUsed ? 1.0 : 0.7;
503
+ result.evidence = {
504
+ declared: isDeclared,
505
+ used: isUsed,
506
+ locations: [
507
+ ...envData.declared.filter((env) => env.name === claim),
508
+ ...envData.used.filter((env) => env.name === claim),
509
+ ],
510
+ };
511
+ } else {
512
+ result.rejection = `Environment variable "${claim}" not found`;
513
+ }
514
+ break;
515
+ }
516
+
517
+ default:
518
+ result.rejection = `Claim type "${claimType}" verification is not implemented yet`;
519
+ }
520
+ } catch (error) {
521
+ result.rejection = `Verification error: ${error.message}`;
522
+ }
523
+
524
+ return result;
525
+ }
526
+
527
+ // ============================================================================
528
+ // EVIDENCE EXTRACTION
529
+ // ============================================================================
530
+
531
+ async function getEvidence(projectPath, file, options) {
532
+ const filePath = path.join(projectPath, file);
533
+
534
+ try {
535
+ const content = await fs.readFile(filePath, "utf8");
536
+ const lines = content.split("\n");
537
+
538
+ let targetLine = options.line || 1;
539
+ const contextLines = options.context_lines || 10;
540
+
541
+ if (options.function_name) {
542
+ const pattern = new RegExp(
543
+ `(function|const|let|var|class)\\s+${options.function_name}`,
544
+ "i",
545
+ );
546
+ for (let i = 0; i < lines.length; i++) {
547
+ if (pattern.test(lines[i])) {
548
+ targetLine = i + 1;
549
+ break;
550
+ }
551
+ }
552
+ }
553
+
554
+ const startLine = Math.max(1, targetLine - contextLines);
555
+ const endLine = Math.min(lines.length, targetLine + contextLines);
556
+
557
+ const snippet = lines
558
+ .slice(startLine - 1, endLine)
559
+ .map(
560
+ (line, index) =>
561
+ `${String(startLine + index).padStart(4, " ")} | ${line}`,
562
+ )
563
+ .join("\n");
564
+
565
+ return {
566
+ file,
567
+ targetLine,
568
+ startLine,
569
+ endLine,
570
+ totalLines: lines.length,
571
+ snippet,
572
+ verifiedAt: new Date().toISOString(),
573
+ };
574
+ } catch (error) {
575
+ return {
576
+ error: `Cannot read file: ${error.message}`,
577
+ file,
578
+ };
579
+ }
580
+ }
581
+
582
+ // ============================================================================
583
+ // UTILITIES
584
+ // ============================================================================
585
+
586
+ async function findSourceFiles(projectPath, extensions) {
587
+ const files = [];
588
+
589
+ async function walk(dir) {
590
+ try {
591
+ const entries = await fs.readdir(dir, { withFileTypes: true });
592
+ for (const entry of entries) {
593
+ const fullPath = path.join(dir, entry.name);
594
+ if (entry.isDirectory()) {
595
+ if (
596
+ !entry.name.startsWith(".") &&
597
+ entry.name !== "node_modules" &&
598
+ entry.name !== "dist" &&
599
+ entry.name !== "build"
600
+ ) {
601
+ await walk(fullPath);
602
+ }
603
+ } else if (entry.isFile()) {
604
+ const ext = path.extname(entry.name).toLowerCase();
605
+ if (extensions.includes(ext)) {
606
+ files.push(fullPath);
607
+ }
608
+ }
609
+ }
610
+ } catch {
611
+ // Skip inaccessible directories
612
+ }
613
+ }
614
+
615
+ await walk(projectPath);
616
+ return files;
617
+ }
618
+
619
+ export default {
620
+ TRUTH_CONTEXT_TOOLS,
621
+ handleTruthContextTool,
622
+ };