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,625 @@
1
+ /**
2
+ * Reality State Engine
3
+ *
4
+ * Maintains a unified, authoritative model of the repository.
5
+ * Consolidates data from project-map, route-integrity, and context systems.
6
+ *
7
+ * This is the single source of truth for the Firewall Agent.
8
+ */
9
+
10
+ "use strict";
11
+
12
+ const fs = require("fs");
13
+ const path = require("path");
14
+ const crypto = require("crypto");
15
+
16
+ /**
17
+ * @typedef {Object} FileMeta
18
+ * @property {string} hash - Content hash (SHA-256)
19
+ * @property {Date} modified - Last modified timestamp
20
+ * @property {number} size - File size in bytes
21
+ * @property {string} domain - Classified domain (auth, payments, routes, etc.)
22
+ */
23
+
24
+ /**
25
+ * @typedef {Object} Route
26
+ * @property {string} method - HTTP method
27
+ * @property {string} path - Route path
28
+ * @property {string} file - Source file
29
+ * @property {number} line - Line number
30
+ * @property {string[]} middleware - Applied middleware
31
+ * @property {boolean} authenticated - Requires authentication
32
+ */
33
+
34
+ /**
35
+ * @typedef {Object} Service
36
+ * @property {string} name - Service name
37
+ * @property {string} file - Source file
38
+ * @property {string[]} dependencies - Service dependencies
39
+ * @property {string} type - Service type (database, cache, api, etc.)
40
+ */
41
+
42
+ /**
43
+ * @typedef {Object} EnvVar
44
+ * @property {string} name - Variable name
45
+ * @property {string} source - Where defined (.env file or usage)
46
+ * @property {boolean} declared - Is declared in .env files
47
+ * @property {boolean} used - Is used in code
48
+ * @property {string[]} usedIn - Files where used
49
+ */
50
+
51
+ /**
52
+ * @typedef {Object} Import
53
+ * @property {string} from - Source file
54
+ * @property {string} to - Import target
55
+ * @property {string} type - Import type (internal, external)
56
+ */
57
+
58
+ /**
59
+ * @typedef {Object} RealityState
60
+ * @property {Map<string, FileMeta>} files - File metadata map
61
+ * @property {Route[]} routes - All registered routes
62
+ * @property {Service[]} services - All detected services
63
+ * @property {Map<string, EnvVar>} envVars - Environment variables
64
+ * @property {Import[]} imports - Import graph edges
65
+ * @property {Object} buildDAG - Build dependency graph
66
+ * @property {Date} lastUpdated - Last snapshot timestamp
67
+ * @property {string} snapshotHash - Hash of entire state
68
+ */
69
+
70
+ // Cache for reality state
71
+ let cachedState = null;
72
+ let cacheHash = null;
73
+
74
+ /**
75
+ * Calculate file hash
76
+ */
77
+ function hashFile(filePath) {
78
+ try {
79
+ const content = fs.readFileSync(filePath);
80
+ return crypto.createHash("sha256").update(content).digest("hex").slice(0, 16);
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Calculate state hash for cache invalidation
88
+ */
89
+ function calculateStateHash(projectRoot) {
90
+ const guardrailPath = path.join(projectRoot, ".guardrail");
91
+ const vibecheckPath = path.join(projectRoot, ".vibecheck");
92
+
93
+ let combined = "";
94
+
95
+ // Include key data file hashes
96
+ const dataFiles = [
97
+ path.join(guardrailPath, "project-map.json"),
98
+ path.join(guardrailPath, "route-integrity.json"),
99
+ path.join(guardrailPath, "api-contracts.json"),
100
+ path.join(guardrailPath, "context-snapshot.json"),
101
+ path.join(vibecheckPath, "truth", "truthpack.json"),
102
+ ];
103
+
104
+ for (const file of dataFiles) {
105
+ if (fs.existsSync(file)) {
106
+ const stat = fs.statSync(file);
107
+ combined += `${file}:${stat.mtimeMs};`;
108
+ }
109
+ }
110
+
111
+ return crypto.createHash("md5").update(combined).digest("hex");
112
+ }
113
+
114
+ /**
115
+ * Classify file domain based on path and content
116
+ */
117
+ function classifyFileDomain(filePath) {
118
+ const s = filePath.toLowerCase();
119
+
120
+ if (s.includes("auth") || s.includes("login") || s.includes("session")) return "auth";
121
+ if (s.includes("stripe") || s.includes("payment") || s.includes("billing")) return "payments";
122
+ if (s.includes("routes") || s.includes("router") || s.includes("/api/")) return "routes";
123
+ if (s.includes("schema") || s.includes("contract") || s.includes("openapi")) return "contracts";
124
+ if (s.includes("middleware")) return "middleware";
125
+ if (s.includes("prisma") || s.includes("database") || s.includes("/db/")) return "database";
126
+ if (s.includes("test") || s.includes("spec")) return "test";
127
+ if (s.includes("config") || s.includes(".env")) return "config";
128
+ if (s.includes("/core/") || s.includes("/lib/")) return "core";
129
+ if (s.includes("components") || s.includes("pages") || s.includes("views")) return "ui";
130
+
131
+ return "general";
132
+ }
133
+
134
+ /**
135
+ * Load project map data
136
+ */
137
+ function loadProjectMap(projectRoot) {
138
+ const mapPath = path.join(projectRoot, ".guardrail", "project-map.json");
139
+ if (fs.existsSync(mapPath)) {
140
+ try {
141
+ return JSON.parse(fs.readFileSync(mapPath, "utf-8"));
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+
149
+ /**
150
+ * Load route integrity data
151
+ */
152
+ function loadRouteIntegrity(projectRoot) {
153
+ const routePath = path.join(projectRoot, ".guardrail", "route-integrity.json");
154
+ if (fs.existsSync(routePath)) {
155
+ try {
156
+ return JSON.parse(fs.readFileSync(routePath, "utf-8"));
157
+ } catch {
158
+ return null;
159
+ }
160
+ }
161
+ return null;
162
+ }
163
+
164
+ /**
165
+ * Load API contracts data
166
+ */
167
+ function loadApiContracts(projectRoot) {
168
+ const contractsPath = path.join(projectRoot, ".guardrail", "api-contracts.json");
169
+ if (fs.existsSync(contractsPath)) {
170
+ try {
171
+ return JSON.parse(fs.readFileSync(contractsPath, "utf-8"));
172
+ } catch {
173
+ return null;
174
+ }
175
+ }
176
+ return null;
177
+ }
178
+
179
+ /**
180
+ * Load truthpack data
181
+ */
182
+ function loadTruthpack(projectRoot) {
183
+ const truthPath = path.join(projectRoot, ".vibecheck", "truth", "truthpack.json");
184
+ if (fs.existsSync(truthPath)) {
185
+ try {
186
+ return JSON.parse(fs.readFileSync(truthPath, "utf-8"));
187
+ } catch {
188
+ return null;
189
+ }
190
+ }
191
+ return null;
192
+ }
193
+
194
+ /**
195
+ * Extract routes from various data sources
196
+ */
197
+ function extractRoutes(projectMap, routeIntegrity, apiContracts, truthpack) {
198
+ const routes = [];
199
+ const seen = new Set();
200
+
201
+ // From API contracts
202
+ if (apiContracts?.routes) {
203
+ for (const route of apiContracts.routes) {
204
+ const key = `${route.method || "GET"}:${route.path}`;
205
+ if (!seen.has(key)) {
206
+ seen.add(key);
207
+ routes.push({
208
+ method: route.method || "GET",
209
+ path: route.path,
210
+ file: route.file || "unknown",
211
+ line: route.line || 0,
212
+ middleware: route.middleware || [],
213
+ authenticated: route.authenticated || false,
214
+ });
215
+ }
216
+ }
217
+ }
218
+
219
+ // From route integrity
220
+ if (routeIntegrity?.routes) {
221
+ for (const route of routeIntegrity.routes) {
222
+ const key = `${route.method || "GET"}:${route.path}`;
223
+ if (!seen.has(key)) {
224
+ seen.add(key);
225
+ routes.push({
226
+ method: route.method || "GET",
227
+ path: route.path,
228
+ file: route.file || "unknown",
229
+ line: route.line || 0,
230
+ middleware: route.middleware || [],
231
+ authenticated: route.requiresAuth || false,
232
+ });
233
+ }
234
+ }
235
+ }
236
+
237
+ // From truthpack
238
+ if (truthpack?.routes) {
239
+ for (const route of truthpack.routes) {
240
+ const key = `${route.method || "GET"}:${route.path}`;
241
+ if (!seen.has(key)) {
242
+ seen.add(key);
243
+ routes.push({
244
+ method: route.method || "GET",
245
+ path: route.path,
246
+ file: route.file || route.pointer?.file || "unknown",
247
+ line: route.line || route.pointer?.line || 0,
248
+ middleware: route.middleware || [],
249
+ authenticated: route.authenticated || false,
250
+ });
251
+ }
252
+ }
253
+ }
254
+
255
+ // From project map API routes
256
+ if (projectMap?.apiRoutes) {
257
+ for (const routePath of projectMap.apiRoutes) {
258
+ const key = `GET:${routePath}`;
259
+ if (!seen.has(key)) {
260
+ seen.add(key);
261
+ routes.push({
262
+ method: "GET",
263
+ path: routePath,
264
+ file: "unknown",
265
+ line: 0,
266
+ middleware: [],
267
+ authenticated: false,
268
+ });
269
+ }
270
+ }
271
+ }
272
+
273
+ return routes;
274
+ }
275
+
276
+ /**
277
+ * Extract environment variables from various data sources
278
+ */
279
+ function extractEnvVars(projectRoot, projectMap, truthpack) {
280
+ const envVars = new Map();
281
+
282
+ // From project map
283
+ if (projectMap?.envVars?.variables) {
284
+ for (const varName of projectMap.envVars.variables) {
285
+ envVars.set(varName, {
286
+ name: varName,
287
+ source: "project-map",
288
+ declared: true,
289
+ used: true,
290
+ usedIn: [],
291
+ });
292
+ }
293
+ }
294
+
295
+ // From truthpack
296
+ if (truthpack?.env) {
297
+ for (const env of truthpack.env) {
298
+ const name = env.name || env.key;
299
+ if (name) {
300
+ const existing = envVars.get(name) || {
301
+ name,
302
+ source: "truthpack",
303
+ declared: false,
304
+ used: false,
305
+ usedIn: [],
306
+ };
307
+ existing.declared = env.declared !== false;
308
+ existing.used = env.used !== false;
309
+ if (env.file) {
310
+ existing.usedIn.push(env.file);
311
+ }
312
+ envVars.set(name, existing);
313
+ }
314
+ }
315
+ }
316
+
317
+ // Scan .env files directly
318
+ const envFileNames = [".env", ".env.local", ".env.example", ".env.development", ".env.production"];
319
+ for (const envFile of envFileNames) {
320
+ const envPath = path.join(projectRoot, envFile);
321
+ if (fs.existsSync(envPath)) {
322
+ try {
323
+ const content = fs.readFileSync(envPath, "utf-8");
324
+ const matches = content.match(/^([A-Z][A-Z0-9_]+)=/gm) || [];
325
+ for (const m of matches) {
326
+ const name = m.replace("=", "");
327
+ const existing = envVars.get(name) || {
328
+ name,
329
+ source: envFile,
330
+ declared: true,
331
+ used: false,
332
+ usedIn: [],
333
+ };
334
+ existing.declared = true;
335
+ existing.source = envFile;
336
+ envVars.set(name, existing);
337
+ }
338
+ } catch {
339
+ // Ignore read errors
340
+ }
341
+ }
342
+ }
343
+
344
+ return envVars;
345
+ }
346
+
347
+ /**
348
+ * Extract services from project data
349
+ */
350
+ function extractServices(projectMap, truthpack) {
351
+ const services = [];
352
+ const seen = new Set();
353
+
354
+ // From truthpack services
355
+ if (truthpack?.services) {
356
+ for (const service of truthpack.services) {
357
+ if (!seen.has(service.name)) {
358
+ seen.add(service.name);
359
+ services.push({
360
+ name: service.name,
361
+ file: service.file || "unknown",
362
+ dependencies: service.dependencies || [],
363
+ type: service.type || "unknown",
364
+ });
365
+ }
366
+ }
367
+ }
368
+
369
+ // Infer services from project structure
370
+ if (projectMap?.directories) {
371
+ const serviceDirs = projectMap.directories.filter(d =>
372
+ d.includes("service") || d.includes("providers")
373
+ );
374
+ for (const dir of serviceDirs) {
375
+ const name = path.basename(dir);
376
+ if (!seen.has(name)) {
377
+ seen.add(name);
378
+ services.push({
379
+ name,
380
+ file: dir,
381
+ dependencies: [],
382
+ type: "inferred",
383
+ });
384
+ }
385
+ }
386
+ }
387
+
388
+ return services;
389
+ }
390
+
391
+ /**
392
+ * Build import graph from dependency data
393
+ */
394
+ function buildImportGraph(projectRoot) {
395
+ const imports = [];
396
+
397
+ // Try to load dependency graph if it exists
398
+ const graphPath = path.join(projectRoot, ".guardrail", "dependency-graph.json");
399
+ if (fs.existsSync(graphPath)) {
400
+ try {
401
+ const graph = JSON.parse(fs.readFileSync(graphPath, "utf-8"));
402
+ if (graph.edges) {
403
+ imports.push(...graph.edges);
404
+ }
405
+ } catch {
406
+ // Ignore parse errors
407
+ }
408
+ }
409
+
410
+ return imports;
411
+ }
412
+
413
+ /**
414
+ * Scan source files for file metadata
415
+ */
416
+ function scanSourceFiles(projectRoot, maxFiles = 500) {
417
+ const files = new Map();
418
+ const extensions = [".ts", ".tsx", ".js", ".jsx", ".json"];
419
+ const ignoreDirs = ["node_modules", ".git", "dist", "build", ".next", "coverage"];
420
+
421
+ function scan(dir, depth = 0) {
422
+ if (depth > 6 || files.size >= maxFiles) return;
423
+
424
+ try {
425
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
426
+ for (const entry of entries) {
427
+ if (files.size >= maxFiles) break;
428
+
429
+ const fullPath = path.join(dir, entry.name);
430
+ const relativePath = path.relative(projectRoot, fullPath).replace(/\\/g, "/");
431
+
432
+ if (entry.isDirectory()) {
433
+ if (!entry.name.startsWith(".") && !ignoreDirs.includes(entry.name)) {
434
+ scan(fullPath, depth + 1);
435
+ }
436
+ } else if (entry.isFile()) {
437
+ const ext = path.extname(entry.name);
438
+ if (extensions.includes(ext)) {
439
+ try {
440
+ const stat = fs.statSync(fullPath);
441
+ files.set(relativePath, {
442
+ hash: hashFile(fullPath),
443
+ modified: stat.mtime,
444
+ size: stat.size,
445
+ domain: classifyFileDomain(relativePath),
446
+ });
447
+ } catch {
448
+ // Skip files we can't stat
449
+ }
450
+ }
451
+ }
452
+ }
453
+ } catch {
454
+ // Skip directories we can't read
455
+ }
456
+ }
457
+
458
+ scan(projectRoot);
459
+ return files;
460
+ }
461
+
462
+ /**
463
+ * Build the complete reality state
464
+ * @param {string} projectRoot - Project root directory
465
+ * @param {Object} options - Options
466
+ * @param {boolean} options.forceRefresh - Force cache refresh
467
+ * @param {boolean} options.scanFiles - Scan source files for metadata
468
+ * @returns {RealityState} The reality state
469
+ */
470
+ function buildRealityState(projectRoot, options = {}) {
471
+ const { forceRefresh = false, scanFiles = true } = options;
472
+
473
+ // Check cache
474
+ const currentHash = calculateStateHash(projectRoot);
475
+ if (!forceRefresh && cachedState && cacheHash === currentHash) {
476
+ return cachedState;
477
+ }
478
+
479
+ // Load all data sources
480
+ const projectMap = loadProjectMap(projectRoot);
481
+ const routeIntegrity = loadRouteIntegrity(projectRoot);
482
+ const apiContracts = loadApiContracts(projectRoot);
483
+ const truthpack = loadTruthpack(projectRoot);
484
+
485
+ // Build unified state
486
+ const state = {
487
+ files: scanFiles ? scanSourceFiles(projectRoot) : new Map(),
488
+ routes: extractRoutes(projectMap, routeIntegrity, apiContracts, truthpack),
489
+ services: extractServices(projectMap, truthpack),
490
+ envVars: extractEnvVars(projectRoot, projectMap, truthpack),
491
+ imports: buildImportGraph(projectRoot),
492
+ buildDAG: {
493
+ nodes: projectMap?.directories || [],
494
+ dependencies: projectMap?.dependencies || {},
495
+ },
496
+ lastUpdated: new Date(),
497
+ snapshotHash: currentHash,
498
+
499
+ // Metadata
500
+ meta: {
501
+ framework: projectMap?.framework || "unknown",
502
+ language: projectMap?.language || "unknown",
503
+ hasTypescript: projectMap?.hasTypescript || false,
504
+ hasPrisma: projectMap?.hasPrisma || false,
505
+ monorepo: projectMap?.monorepo || null,
506
+ },
507
+ };
508
+
509
+ // Update cache
510
+ cachedState = state;
511
+ cacheHash = currentHash;
512
+
513
+ return state;
514
+ }
515
+
516
+ /**
517
+ * Get reality state (cached if possible)
518
+ */
519
+ function getRealityState(projectRoot, options = {}) {
520
+ return buildRealityState(projectRoot, options);
521
+ }
522
+
523
+ /**
524
+ * Invalidate the cache
525
+ */
526
+ function invalidateCache() {
527
+ cachedState = null;
528
+ cacheHash = null;
529
+ }
530
+
531
+ /**
532
+ * Check if a route exists in reality
533
+ */
534
+ function routeExists(state, method, routePath) {
535
+ return state.routes.some(r =>
536
+ r.method.toUpperCase() === method.toUpperCase() &&
537
+ (r.path === routePath || matchRoutePattern(r.path, routePath))
538
+ );
539
+ }
540
+
541
+ /**
542
+ * Check if an env var exists in reality
543
+ */
544
+ function envVarExists(state, varName) {
545
+ const envVar = state.envVars.get(varName);
546
+ return envVar && envVar.declared;
547
+ }
548
+
549
+ /**
550
+ * Check if a file exists in reality
551
+ */
552
+ function fileExists(state, filePath) {
553
+ const normalized = filePath.replace(/\\/g, "/");
554
+ return state.files.has(normalized);
555
+ }
556
+
557
+ /**
558
+ * Match route patterns (handles dynamic segments)
559
+ */
560
+ function matchRoutePattern(pattern, path) {
561
+ // Convert pattern to regex
562
+ const regexPattern = pattern
563
+ .replace(/:[^/]+/g, "[^/]+") // :param -> [^/]+
564
+ .replace(/\*/g, ".*"); // * -> .*
565
+
566
+ try {
567
+ const regex = new RegExp(`^${regexPattern}$`);
568
+ return regex.test(path);
569
+ } catch {
570
+ return false;
571
+ }
572
+ }
573
+
574
+ /**
575
+ * Get files by domain
576
+ */
577
+ function getFilesByDomain(state, domain) {
578
+ const files = [];
579
+ for (const [path, meta] of state.files) {
580
+ if (meta.domain === domain) {
581
+ files.push({ path, ...meta });
582
+ }
583
+ }
584
+ return files;
585
+ }
586
+
587
+ /**
588
+ * Get summary of reality state
589
+ */
590
+ function getStateSummary(state) {
591
+ return {
592
+ fileCount: state.files.size,
593
+ routeCount: state.routes.length,
594
+ serviceCount: state.services.length,
595
+ envVarCount: state.envVars.size,
596
+ importCount: state.imports.length,
597
+ lastUpdated: state.lastUpdated,
598
+ snapshotHash: state.snapshotHash,
599
+ domains: getDomainCounts(state),
600
+ };
601
+ }
602
+
603
+ /**
604
+ * Get domain counts
605
+ */
606
+ function getDomainCounts(state) {
607
+ const counts = {};
608
+ for (const [, meta] of state.files) {
609
+ counts[meta.domain] = (counts[meta.domain] || 0) + 1;
610
+ }
611
+ return counts;
612
+ }
613
+
614
+ module.exports = {
615
+ buildRealityState,
616
+ getRealityState,
617
+ invalidateCache,
618
+ routeExists,
619
+ envVarExists,
620
+ fileExists,
621
+ getFilesByDomain,
622
+ getStateSummary,
623
+ classifyFileDomain,
624
+ hashFile,
625
+ };