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,137 @@
1
+ /**
2
+ * Truthpack Loader
3
+ *
4
+ * Loads truthpack files from .vibecheck/truthpack/
5
+ * Caches for performance and validates freshness.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const fs = require("fs");
11
+ const path = require("path");
12
+
13
+ const TRUTHPACK_DIR = ".vibecheck/truthpack";
14
+ const STALE_AFTER_HOURS = 24;
15
+
16
+ let cache = {
17
+ routes: null,
18
+ env: null,
19
+ auth: null,
20
+ contracts: null,
21
+ loadedAt: null
22
+ };
23
+
24
+ /**
25
+ * Load truthpack from project root
26
+ * @param {string} projectRoot - Project root directory
27
+ * @param {boolean} forceRefresh - Force reload even if cached
28
+ * @returns {object} Truthpack data
29
+ */
30
+ function loadTruthpack(projectRoot, forceRefresh = false) {
31
+ const truthpackPath = path.join(projectRoot, TRUTHPACK_DIR);
32
+
33
+ // Check cache freshness
34
+ if (!forceRefresh && cache.loadedAt) {
35
+ const ageHours = (Date.now() - cache.loadedAt) / (1000 * 60 * 60);
36
+ if (ageHours < STALE_AFTER_HOURS && cache.routes !== null) {
37
+ return cache;
38
+ }
39
+ }
40
+
41
+ const truthpack = {
42
+ routes: loadTruthpackFile(projectRoot, "routes.json"),
43
+ env: loadTruthpackFile(projectRoot, "env.json"),
44
+ auth: loadTruthpackFile(projectRoot, "auth.json"),
45
+ contracts: loadTruthpackFile(projectRoot, "contracts.json"),
46
+ uiGraph: loadTruthpackFile(projectRoot, "ui.graph.json")
47
+ };
48
+
49
+ // Update cache
50
+ cache = {
51
+ ...truthpack,
52
+ loadedAt: Date.now()
53
+ };
54
+
55
+ return truthpack;
56
+ }
57
+
58
+ /**
59
+ * Load a specific truthpack file
60
+ * @param {string} projectRoot - Project root directory
61
+ * @param {string} filename - Truthpack filename
62
+ * @returns {object|null} Parsed JSON or null if not found
63
+ */
64
+ function loadTruthpackFile(projectRoot, filename) {
65
+ const filePath = path.join(projectRoot, TRUTHPACK_DIR, filename);
66
+
67
+ if (!fs.existsSync(filePath)) {
68
+ // Fallback: try loading from truthpack.json if routes.json doesn't exist
69
+ if (filename === "routes.json") {
70
+ const truthpackPath = path.join(projectRoot, ".vibecheck", "truthpack.json");
71
+ if (fs.existsSync(truthpackPath)) {
72
+ try {
73
+ const truthpack = JSON.parse(fs.readFileSync(truthpackPath, "utf8"));
74
+ // Extract server routes from truthpack.json format
75
+ if (truthpack.routes && truthpack.routes.server) {
76
+ return {
77
+ routes: truthpack.routes.server.map(r => ({
78
+ path: r.path,
79
+ method: r.method,
80
+ handler: r.handler || r.source
81
+ }))
82
+ };
83
+ }
84
+ } catch (error) {
85
+ // Fall through to return null
86
+ }
87
+ }
88
+ }
89
+ return null;
90
+ }
91
+
92
+ try {
93
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
94
+ } catch (error) {
95
+ console.warn(`Failed to load truthpack file ${filename}: ${error.message}`);
96
+ return null;
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Check if truthpack is fresh
102
+ * @param {string} projectRoot - Project root directory
103
+ * @returns {boolean} True if truthpack exists and is fresh
104
+ */
105
+ function isTruthpackFresh(projectRoot) {
106
+ const truthpackPath = path.join(projectRoot, TRUTHPACK_DIR);
107
+ const routesPath = path.join(truthpackPath, "routes.json");
108
+
109
+ if (!fs.existsSync(routesPath)) {
110
+ return false;
111
+ }
112
+
113
+ const stats = fs.statSync(routesPath);
114
+ const ageHours = (Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60);
115
+
116
+ return ageHours < STALE_AFTER_HOURS;
117
+ }
118
+
119
+ /**
120
+ * Clear truthpack cache
121
+ */
122
+ function clearCache() {
123
+ cache = {
124
+ routes: null,
125
+ env: null,
126
+ auth: null,
127
+ contracts: null,
128
+ loadedAt: null
129
+ };
130
+ }
131
+
132
+ module.exports = {
133
+ loadTruthpack,
134
+ loadTruthpackFile,
135
+ isTruthpackFresh,
136
+ clearCache
137
+ };
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Auto-Unblock Planner
3
+ *
4
+ * Generates exact missing proofs and minimal patch plans when blocked.
5
+ * No open-ended advice - specific file/line instructions.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const path = require("path");
11
+ const fs = require("fs");
12
+ const { CLAIM_TYPES } = require("../claims/claim-types");
13
+
14
+ /**
15
+ * Generate unblock plan from violations
16
+ * @param {object} params
17
+ * @param {array} params.violations - Rule violations
18
+ * @param {array} params.claims - Extracted claims
19
+ * @param {string} params.projectRoot - Project root directory
20
+ * @returns {object} Unblock plan with specific steps
21
+ */
22
+ function generateUnblockPlan({ violations, claims, projectRoot }) {
23
+ const steps = [];
24
+
25
+ for (const violation of violations) {
26
+ if (violation.severity !== "block") {
27
+ continue; // Only generate plans for blocking violations
28
+ }
29
+
30
+ const claim = violation.claim || claims.find(c =>
31
+ violation.claimId && c.type === violation.claim?.type
32
+ );
33
+
34
+ switch (violation.rule) {
35
+ case "ghost_route":
36
+ steps.push(...planGhostRoute(claim, projectRoot));
37
+ break;
38
+
39
+ case "ghost_env":
40
+ steps.push(...planGhostEnv(claim, projectRoot));
41
+ break;
42
+
43
+ case "auth_drift":
44
+ steps.push(...planAuthDrift(claim, projectRoot));
45
+ break;
46
+
47
+ case "contract_drift":
48
+ steps.push(...planContractDrift(claim, projectRoot));
49
+ break;
50
+
51
+ case "scope_explosion":
52
+ steps.push(...planScopeExplosion(violation));
53
+ break;
54
+
55
+ case "unsafe_side_effect":
56
+ steps.push(...planUnsafeSideEffect(claim, projectRoot));
57
+ break;
58
+
59
+ case "fake_success_ui":
60
+ steps.push(...planFakeSuccess(claim, projectRoot));
61
+ break;
62
+ }
63
+ }
64
+
65
+ return {
66
+ steps: deduplicateSteps(steps)
67
+ };
68
+ }
69
+
70
+ /**
71
+ * Plan for ghost route violation
72
+ */
73
+ function planGhostRoute(claim, projectRoot) {
74
+ if (!claim || claim.type !== CLAIM_TYPES.ROUTE) {
75
+ return [];
76
+ }
77
+
78
+ const routePath = claim.value;
79
+ const steps = [];
80
+
81
+ // Determine framework and suggest route file location
82
+ const isApiRoute = routePath.startsWith("/api/");
83
+
84
+ if (isApiRoute) {
85
+ // Next.js App Router
86
+ const routePathSegments = routePath.replace("/api/", "").split("/");
87
+ const routeFile = path.join("app", "api", ...routePathSegments, "route.ts");
88
+ const routeFileAbs = path.join(projectRoot, routeFile);
89
+
90
+ steps.push({
91
+ action: "create",
92
+ file: routeFile,
93
+ line: 1,
94
+ description: `Create route handler at ${routeFile} for ${routePath}`
95
+ });
96
+
97
+ // Also suggest adding to truthpack
98
+ steps.push({
99
+ action: "modify",
100
+ file: ".vibecheck/truthpack/routes.json",
101
+ line: null,
102
+ description: `Run 'vibecheck truth' to regenerate truthpack with new route`
103
+ });
104
+ }
105
+
106
+ return steps;
107
+ }
108
+
109
+ /**
110
+ * Plan for ghost env violation
111
+ */
112
+ function planGhostEnv(claim, projectRoot) {
113
+ if (!claim || claim.type !== CLAIM_TYPES.ENV) {
114
+ return [];
115
+ }
116
+
117
+ const envVarName = claim.value;
118
+ const steps = [];
119
+
120
+ // Find env schema file
121
+ const envSchemaFiles = [
122
+ "apps/api/src/config/env.schema.ts",
123
+ "apps/api/src/env.schema.ts",
124
+ "src/config/env.schema.ts",
125
+ "src/env.schema.ts"
126
+ ];
127
+
128
+ let envSchemaFile = null;
129
+ for (const candidate of envSchemaFiles) {
130
+ const fullPath = path.join(projectRoot, candidate);
131
+ if (fs.existsSync(fullPath)) {
132
+ envSchemaFile = candidate;
133
+ break;
134
+ }
135
+ }
136
+
137
+ if (!envSchemaFile) {
138
+ // Create new schema file
139
+ envSchemaFile = "apps/api/src/config/env.schema.ts";
140
+ steps.push({
141
+ action: "create",
142
+ file: envSchemaFile,
143
+ line: 1,
144
+ description: `Create env schema file and add ${envVarName}`
145
+ });
146
+ } else {
147
+ // Add to existing schema
148
+ steps.push({
149
+ action: "modify",
150
+ file: envSchemaFile,
151
+ line: null, // Will need to find insertion point
152
+ description: `Add ${envVarName} to env schema`
153
+ });
154
+ }
155
+
156
+ // Also add to .env.example
157
+ steps.push({
158
+ action: "modify",
159
+ file: ".env.example",
160
+ line: null,
161
+ description: `Add ${envVarName}=<value> to .env.example`
162
+ });
163
+
164
+ return steps;
165
+ }
166
+
167
+ /**
168
+ * Plan for auth drift violation
169
+ */
170
+ function planAuthDrift(claim, projectRoot) {
171
+ if (!claim || claim.type !== CLAIM_TYPES.AUTH) {
172
+ return [];
173
+ }
174
+
175
+ const steps = [];
176
+
177
+ // Find middleware file
178
+ const middlewareFiles = [
179
+ "middleware.ts",
180
+ "src/middleware.ts",
181
+ "apps/api/src/middleware.ts"
182
+ ];
183
+
184
+ let middlewareFile = null;
185
+ for (const candidate of middlewareFiles) {
186
+ const fullPath = path.join(projectRoot, candidate);
187
+ if (fs.existsSync(fullPath)) {
188
+ middlewareFile = candidate;
189
+ break;
190
+ }
191
+ }
192
+
193
+ if (middlewareFile) {
194
+ steps.push({
195
+ action: "modify",
196
+ file: middlewareFile,
197
+ line: null,
198
+ description: `Add protected route pattern to middleware matcher for ${claim.file || "affected route"}`
199
+ });
200
+ } else {
201
+ steps.push({
202
+ action: "create",
203
+ file: "middleware.ts",
204
+ line: 1,
205
+ description: `Create middleware.ts and add auth protection for ${claim.file || "affected route"}`
206
+ });
207
+ }
208
+
209
+ return steps;
210
+ }
211
+
212
+ /**
213
+ * Plan for contract drift violation
214
+ */
215
+ function planContractDrift(claim, projectRoot) {
216
+ if (!claim || claim.type !== CLAIM_TYPES.CONTRACT) {
217
+ return [];
218
+ }
219
+
220
+ const steps = [];
221
+
222
+ steps.push({
223
+ action: "modify",
224
+ file: ".vibecheck/truthpack/contracts.json",
225
+ line: null,
226
+ description: `Update contract definition for ${claim.value} or run 'vibecheck truth' to regenerate`
227
+ });
228
+
229
+ return steps;
230
+ }
231
+
232
+ /**
233
+ * Plan for scope explosion violation
234
+ */
235
+ function planScopeExplosion(violation) {
236
+ const steps = [];
237
+
238
+ const metadata = violation.metadata || {};
239
+
240
+ if (metadata.totalFiles) {
241
+ steps.push({
242
+ action: "modify",
243
+ file: null,
244
+ line: null,
245
+ description: `Reduce scope: ${metadata.totalFiles} files touched (max: ${metadata.maxFiles}). Split into smaller changes or provide explicit intent message.`
246
+ });
247
+ }
248
+
249
+ if (metadata.totalLines) {
250
+ steps.push({
251
+ action: "modify",
252
+ file: null,
253
+ line: null,
254
+ description: `Reduce scope: ${metadata.totalLines} lines changed (max: ${metadata.maxLines}). Split into smaller changes or provide explicit intent message.`
255
+ });
256
+ }
257
+
258
+ return steps;
259
+ }
260
+
261
+ /**
262
+ * Plan for unsafe side effect violation
263
+ */
264
+ function planUnsafeSideEffect(claim, projectRoot) {
265
+ if (!claim || claim.type !== CLAIM_TYPES.SIDE_EFFECT) {
266
+ return [];
267
+ }
268
+
269
+ const steps = [];
270
+
271
+ // Suggest creating test file
272
+ const claimFile = claim.file || "";
273
+ if (claimFile) {
274
+ const baseName = path.basename(claimFile, path.extname(claimFile));
275
+ const dir = path.dirname(claimFile);
276
+ const testFile = path.join(dir, `${baseName}.test.ts`);
277
+
278
+ steps.push({
279
+ action: "create",
280
+ file: testFile,
281
+ line: 1,
282
+ description: `Create test file to verify side effect: ${claim.value}`
283
+ });
284
+ }
285
+
286
+ // Also suggest reality proof
287
+ steps.push({
288
+ action: "modify",
289
+ file: null,
290
+ line: null,
291
+ description: `Run 'vibecheck reality' to generate proof for side effect: ${claim.value}`
292
+ });
293
+
294
+ return steps;
295
+ }
296
+
297
+ /**
298
+ * Plan for fake success UI violation
299
+ */
300
+ function planFakeSuccess(claim, projectRoot) {
301
+ if (!claim || claim.type !== CLAIM_TYPES.UI_SUCCESS) {
302
+ return [];
303
+ }
304
+
305
+ const steps = [];
306
+
307
+ steps.push({
308
+ action: "modify",
309
+ file: claim.file || "unknown",
310
+ line: null,
311
+ description: `Add HTTP call or side effect before showing success message: ${claim.value}`
312
+ });
313
+
314
+ return steps;
315
+ }
316
+
317
+ /**
318
+ * Deduplicate steps by file+action
319
+ */
320
+ function deduplicateSteps(steps) {
321
+ const seen = new Set();
322
+ const unique = [];
323
+
324
+ for (const step of steps) {
325
+ const key = `${step.action}|${step.file || "null"}`;
326
+ if (!seen.has(key)) {
327
+ seen.add(key);
328
+ unique.push(step);
329
+ }
330
+ }
331
+
332
+ return unique;
333
+ }
334
+
335
+ module.exports = {
336
+ generateUnblockPlan
337
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Ignore File Checker
3
+ *
4
+ * Checks if a file matches patterns in .vibecheckignore
5
+ */
6
+
7
+ "use strict";
8
+
9
+ const fs = require("fs");
10
+ const path = require("path");
11
+
12
+ // Try to use minimatch if available, otherwise use simple pattern matching
13
+ let minimatch;
14
+ try {
15
+ minimatch = require("minimatch").minimatch;
16
+ } catch {
17
+ minimatch = null;
18
+ }
19
+
20
+ let ignorePatterns = null;
21
+ let ignoreFile = null;
22
+
23
+ /**
24
+ * Load ignore patterns from .vibecheckignore
25
+ * @param {string} projectRoot - Project root directory
26
+ * @returns {array} Array of ignore patterns
27
+ */
28
+ function loadIgnorePatterns(projectRoot) {
29
+ if (ignorePatterns !== null && ignoreFile === projectRoot) {
30
+ return ignorePatterns;
31
+ }
32
+
33
+ const ignorePath = path.join(projectRoot, ".vibecheckignore");
34
+ ignorePatterns = [];
35
+
36
+ if (fs.existsSync(ignorePath)) {
37
+ const content = fs.readFileSync(ignorePath, "utf8");
38
+ ignorePatterns = content
39
+ .split("\n")
40
+ .map(line => line.trim())
41
+ .filter(line => line && !line.startsWith("#"));
42
+ }
43
+
44
+ ignoreFile = projectRoot;
45
+ return ignorePatterns;
46
+ }
47
+
48
+ /**
49
+ * Check if a file should be ignored
50
+ * @param {string} projectRoot - Project root directory
51
+ * @param {string} filePath - File path (relative to project root)
52
+ * @returns {boolean} True if file should be ignored
53
+ */
54
+ function shouldIgnore(projectRoot, filePath) {
55
+ const patterns = loadIgnorePatterns(projectRoot);
56
+ const normalizedPath = filePath.replace(/\\/g, "/");
57
+
58
+ // Check against all patterns
59
+ for (const pattern of patterns) {
60
+ // Handle both glob patterns and simple path matches
61
+ if (minimatch) {
62
+ if (minimatch(normalizedPath, pattern, { matchBase: true }) ||
63
+ minimatch(normalizedPath, `**/${pattern}`, { matchBase: true })) {
64
+ return true;
65
+ }
66
+ } else {
67
+ // Fallback: simple pattern matching
68
+ const regexPattern = pattern
69
+ .replace(/\*\*/g, ".*")
70
+ .replace(/\*/g, "[^/]*")
71
+ .replace(/\//g, "\\/");
72
+ const regex = new RegExp(`^${regexPattern}$`);
73
+ if (regex.test(normalizedPath)) {
74
+ return true;
75
+ }
76
+ }
77
+
78
+ // Also check if path contains the pattern as a substring (for directory patterns)
79
+ const cleanPattern = pattern.replace(/\*\*/g, "").replace(/\*/g, "");
80
+ if (normalizedPath.includes(cleanPattern)) {
81
+ return true;
82
+ }
83
+ }
84
+
85
+ // Also check common test file patterns
86
+ const testPatterns = [
87
+ /\/__tests__\//,
88
+ /\.test\.(ts|tsx|js|jsx)$/,
89
+ /\.spec\.(ts|tsx|js|jsx)$/,
90
+ /\/tests\//,
91
+ /\/test\//,
92
+ /\/fixtures\//,
93
+ /\/examples\//,
94
+ /\/templates\//
95
+ ];
96
+
97
+ for (const pattern of testPatterns) {
98
+ if (pattern.test(normalizedPath)) {
99
+ return true;
100
+ }
101
+ }
102
+
103
+ return false;
104
+ }
105
+
106
+ /**
107
+ * Clear cached ignore patterns (for testing)
108
+ */
109
+ function clearCache() {
110
+ ignorePatterns = null;
111
+ ignoreFile = null;
112
+ }
113
+
114
+ module.exports = {
115
+ shouldIgnore,
116
+ loadIgnorePatterns,
117
+ clearCache
118
+ };