@vibecheckai/cli 3.5.1 → 3.5.2

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 (272) hide show
  1. package/bin/registry.js +406 -154
  2. package/bin/runners/context/analyzer.js +52 -1
  3. package/bin/runners/context/generators/mcp.js +15 -13
  4. package/bin/runners/context/git-context.js +3 -1
  5. package/bin/runners/context/proof-context.js +248 -1
  6. package/bin/runners/context/team-conventions.js +33 -7
  7. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
  8. package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
  9. package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
  10. package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
  11. package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
  12. package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
  13. package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
  14. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  15. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  16. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  17. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
  18. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
  19. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
  20. package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
  21. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
  22. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
  23. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
  24. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
  25. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
  26. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
  27. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
  28. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
  29. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
  30. package/bin/runners/lib/agent-firewall/interceptor/base.js +304 -0
  31. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
  32. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
  33. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
  34. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  35. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  36. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  37. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  38. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  39. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  40. package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
  41. package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
  42. package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
  43. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
  44. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
  45. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +86 -0
  46. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +162 -0
  47. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +189 -0
  48. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
  49. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
  50. package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
  51. package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
  52. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  53. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  54. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  55. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  56. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  57. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  58. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  59. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  60. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  61. package/bin/runners/lib/agent-firewall/risk/thresholds.js +321 -0
  62. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  63. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  64. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  65. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  66. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  67. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  68. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  69. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  70. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  71. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  72. package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
  73. package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
  74. package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
  75. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
  76. package/bin/runners/lib/analysis-core.js +220 -182
  77. package/bin/runners/lib/analyzers.js +2145 -224
  78. package/bin/runners/lib/api-client.js +269 -0
  79. package/bin/runners/lib/authority-badge.js +425 -0
  80. package/bin/runners/lib/cli-output.js +242 -210
  81. package/bin/runners/lib/default-config.js +127 -0
  82. package/bin/runners/lib/detectors-v2.js +547 -785
  83. package/bin/runners/lib/doctor/modules/security.js +3 -1
  84. package/bin/runners/lib/engine/ast-cache.js +210 -0
  85. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  86. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  87. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  88. package/bin/runners/lib/engine/env-extractor.js +207 -0
  89. package/bin/runners/lib/engine/express-extractor.js +208 -0
  90. package/bin/runners/lib/engine/extractors.js +849 -0
  91. package/bin/runners/lib/engine/index.js +207 -0
  92. package/bin/runners/lib/engine/repo-index.js +514 -0
  93. package/bin/runners/lib/engine/types.js +124 -0
  94. package/bin/runners/lib/engines/accessibility-engine.js +190 -0
  95. package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
  96. package/bin/runners/lib/engines/ast-cache.js +99 -0
  97. package/bin/runners/lib/engines/code-quality-engine.js +255 -0
  98. package/bin/runners/lib/engines/console-logs-engine.js +115 -0
  99. package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
  100. package/bin/runners/lib/engines/dead-code-engine.js +198 -0
  101. package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
  102. package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
  103. package/bin/runners/lib/engines/file-filter.js +131 -0
  104. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
  105. package/bin/runners/lib/engines/mock-data-engine.js +272 -0
  106. package/bin/runners/lib/engines/parallel-processor.js +71 -0
  107. package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
  108. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
  109. package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
  110. package/bin/runners/lib/engines/type-aware-engine.js +152 -0
  111. package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
  112. package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
  113. package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
  114. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  115. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  116. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  117. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  118. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  119. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  120. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  121. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
  122. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  123. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  124. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  125. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  126. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  127. package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
  128. package/bin/runners/lib/entitlements-v2.js +152 -446
  129. package/bin/runners/lib/error-handler.js +60 -12
  130. package/bin/runners/lib/error-messages.js +289 -0
  131. package/bin/runners/lib/evidence-pack.js +7 -1
  132. package/bin/runners/lib/exit-codes.js +275 -0
  133. package/bin/runners/lib/finding-id.js +69 -0
  134. package/bin/runners/lib/finding-sorter.js +89 -0
  135. package/bin/runners/lib/fingerprint.js +377 -0
  136. package/bin/runners/lib/global-flags.js +37 -0
  137. package/bin/runners/lib/help-formatter.js +413 -0
  138. package/bin/runners/lib/logger.js +38 -0
  139. package/bin/runners/lib/next-action.js +560 -0
  140. package/bin/runners/lib/prerequisites.js +149 -0
  141. package/bin/runners/lib/route-detection.js +137 -68
  142. package/bin/runners/lib/route-truth.js +1167 -322
  143. package/bin/runners/lib/scan-output.js +504 -463
  144. package/bin/runners/lib/scan-runner.js +135 -0
  145. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  146. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  147. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  148. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  149. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  150. package/bin/runners/lib/schemas/validator.js +27 -0
  151. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  152. package/bin/runners/lib/ship-output-enterprise.js +239 -0
  153. package/bin/runners/lib/ship-output.js +328 -31
  154. package/bin/runners/lib/terminal-ui.js +234 -731
  155. package/bin/runners/lib/truth.js +1332 -308
  156. package/bin/runners/lib/unified-cli-output.js +604 -0
  157. package/bin/runners/lib/unified-output.js +163 -155
  158. package/bin/runners/lib/upsell.js +104 -204
  159. package/bin/runners/runAgent.d.ts +5 -0
  160. package/bin/runners/runAgent.js +161 -0
  161. package/bin/runners/runAllowlist.js +166 -101
  162. package/bin/runners/runApprove.js +1200 -0
  163. package/bin/runners/runAuth.js +373 -95
  164. package/bin/runners/runCheckpoint.js +59 -21
  165. package/bin/runners/runClassify.js +926 -0
  166. package/bin/runners/runContext.d.ts +4 -0
  167. package/bin/runners/runContext.js +136 -24
  168. package/bin/runners/runDoctor.js +115 -67
  169. package/bin/runners/runEvidencePack.js +239 -96
  170. package/bin/runners/runFirewall.d.ts +5 -0
  171. package/bin/runners/runFirewall.js +134 -0
  172. package/bin/runners/runFirewallHook.d.ts +5 -0
  173. package/bin/runners/runFirewallHook.js +56 -0
  174. package/bin/runners/runFix.js +6 -5
  175. package/bin/runners/runGuard.js +212 -118
  176. package/bin/runners/runInit.js +66 -21
  177. package/bin/runners/runLabs.js +204 -121
  178. package/bin/runners/runMcp.js +131 -60
  179. package/bin/runners/runPolish.d.ts +4 -0
  180. package/bin/runners/runPolish.js +43 -20
  181. package/bin/runners/runProof.zip +0 -0
  182. package/bin/runners/runProve.js +15 -5
  183. package/bin/runners/runQuickstart.js +531 -0
  184. package/bin/runners/runReality.js +14 -0
  185. package/bin/runners/runReport.js +36 -4
  186. package/bin/runners/runScan.js +689 -91
  187. package/bin/runners/runShip.js +96 -40
  188. package/bin/runners/runTruth.d.ts +5 -0
  189. package/bin/runners/runTruth.js +101 -0
  190. package/bin/runners/runValidate.js +21 -4
  191. package/bin/runners/runWatch.js +118 -54
  192. package/bin/scan.js +6 -1
  193. package/bin/vibecheck.js +297 -52
  194. package/mcp-server/HARDENING_SUMMARY.md +299 -0
  195. package/mcp-server/agent-firewall-interceptor.js +500 -0
  196. package/mcp-server/authority-tools.js +569 -0
  197. package/mcp-server/conductor/conflict-resolver.js +588 -0
  198. package/mcp-server/conductor/execution-planner.js +544 -0
  199. package/mcp-server/conductor/index.js +377 -0
  200. package/mcp-server/conductor/lock-manager.js +615 -0
  201. package/mcp-server/conductor/request-queue.js +550 -0
  202. package/mcp-server/conductor/session-manager.js +500 -0
  203. package/mcp-server/conductor/tools.js +510 -0
  204. package/mcp-server/deprecation-middleware.js +282 -0
  205. package/mcp-server/handlers/index.ts +15 -0
  206. package/mcp-server/handlers/tool-handler.ts +474 -591
  207. package/mcp-server/index.js +1748 -1099
  208. package/mcp-server/lib/api-client.cjs +13 -0
  209. package/mcp-server/lib/cache-wrapper.cjs +383 -0
  210. package/mcp-server/lib/error-envelope.js +138 -0
  211. package/mcp-server/lib/executor.ts +428 -721
  212. package/mcp-server/lib/index.ts +19 -0
  213. package/mcp-server/lib/logger.cjs +30 -0
  214. package/mcp-server/lib/rate-limiter.js +166 -0
  215. package/mcp-server/lib/sandbox.test.ts +519 -0
  216. package/mcp-server/lib/sandbox.ts +342 -284
  217. package/mcp-server/lib/types.ts +267 -0
  218. package/mcp-server/logger.js +173 -0
  219. package/mcp-server/package.json +11 -27
  220. package/mcp-server/premium-tools.js +2 -2
  221. package/mcp-server/registry/tool-registry.js +794 -0
  222. package/mcp-server/registry/tools.json +507 -378
  223. package/mcp-server/registry.test.ts +334 -0
  224. package/mcp-server/tests/tier-gating.test.js +297 -0
  225. package/mcp-server/tier-auth.js +492 -347
  226. package/mcp-server/tools-v3.js +950 -0
  227. package/mcp-server/truth-context.js +131 -90
  228. package/mcp-server/truth-firewall-tools.js +1612 -1001
  229. package/mcp-server/tsconfig.json +8 -5
  230. package/mcp-server/vibecheck-2.0-tools.js +14 -1
  231. package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
  232. package/mcp-server/vibecheck-tools.js +2 -2
  233. package/package.json +4 -3
  234. package/bin/runners/runInstall.js +0 -281
  235. package/mcp-server/ARCHITECTURE.md +0 -339
  236. package/mcp-server/__tests__/cache.test.ts +0 -313
  237. package/mcp-server/__tests__/executor.test.ts +0 -239
  238. package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +0 -1
  239. package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +0 -3
  240. package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +0 -3
  241. package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +0 -3
  242. package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +0 -3
  243. package/mcp-server/__tests__/fixtures/exclusion-test/package.json +0 -5
  244. package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +0 -5
  245. package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +0 -4
  246. package/mcp-server/__tests__/ids.test.ts +0 -345
  247. package/mcp-server/__tests__/integration/tools.test.ts +0 -410
  248. package/mcp-server/__tests__/registry.test.ts +0 -365
  249. package/mcp-server/__tests__/sandbox.test.ts +0 -323
  250. package/mcp-server/__tests__/schemas.test.ts +0 -372
  251. package/mcp-server/benchmarks/run-benchmarks.ts +0 -304
  252. package/mcp-server/examples/doctor.request.json +0 -14
  253. package/mcp-server/examples/doctor.response.json +0 -53
  254. package/mcp-server/examples/error.response.json +0 -15
  255. package/mcp-server/examples/scan.request.json +0 -14
  256. package/mcp-server/examples/scan.response.json +0 -108
  257. package/mcp-server/index-v3.ts +0 -293
  258. package/mcp-server/index.old.js +0 -4137
  259. package/mcp-server/lib/cache.ts +0 -341
  260. package/mcp-server/lib/errors.ts +0 -346
  261. package/mcp-server/lib/ids.ts +0 -238
  262. package/mcp-server/lib/logger.ts +0 -368
  263. package/mcp-server/lib/metrics.ts +0 -365
  264. package/mcp-server/lib/validator.ts +0 -229
  265. package/mcp-server/package-lock.json +0 -165
  266. package/mcp-server/schemas/error-envelope.schema.json +0 -125
  267. package/mcp-server/schemas/finding.schema.json +0 -167
  268. package/mcp-server/schemas/report-artifact.schema.json +0 -88
  269. package/mcp-server/schemas/run-request.schema.json +0 -75
  270. package/mcp-server/schemas/verdict.schema.json +0 -168
  271. package/mcp-server/tier-auth.d.ts +0 -71
  272. package/mcp-server/vitest.config.ts +0 -16
@@ -1,73 +1,127 @@
1
1
  /**
2
2
  * vibecheck guard - Unified trust boundary enforcement
3
3
  *
4
- * Combines: validate + claim-verifier + prompt-firewall
5
- *
6
- * Usage:
7
- * vibecheck guard # Run all checks
8
- * vibecheck guard --claims # Verify AI claims against truthpack
9
- * vibecheck guard --prompts # Check for prompt injection
10
- * vibecheck guard --hallucinations # Detect AI hallucination patterns
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * World-Class AI Guardrails
6
+ * ═══════════════════════════════════════════════════════════════════════════════
11
7
  */
12
8
 
13
9
  const path = require("path");
14
10
  const fs = require("fs");
11
+ const { parseGlobalFlags, shouldSuppressOutput, isJsonMode } = require("./lib/global-flags");
12
+ const { EXIT } = require("./lib/exit-codes");
13
+ const {
14
+ ansi,
15
+ sym,
16
+ renderMinimalHeader,
17
+ renderSectionHeader,
18
+ renderVerdict,
19
+ renderSuccess,
20
+ renderError,
21
+ renderWarning,
22
+ renderFooter,
23
+ Spinner,
24
+ getTierFromKey,
25
+ } = require("./lib/unified-cli-output");
15
26
 
16
27
  // Import underlying implementations
17
- const { runValidate } = require("./runValidate");
18
- const { runPromptFirewall } = require("./runPromptFirewall");
19
-
20
- // ANSI colors
21
- const c = {
22
- reset: "\x1b[0m",
23
- dim: "\x1b[2m",
24
- bold: "\x1b[1m",
25
- cyan: "\x1b[36m",
26
- green: "\x1b[32m",
27
- yellow: "\x1b[33m",
28
- red: "\x1b[31m",
29
- magenta: "\x1b[35m",
30
- };
28
+ let runValidate, runPromptFirewall;
29
+ try {
30
+ runValidate = require("./runValidate").runValidate;
31
+ } catch {
32
+ runValidate = null;
33
+ }
34
+ try {
35
+ runPromptFirewall = require("./runPromptFirewall").runPromptFirewall;
36
+ } catch {
37
+ runPromptFirewall = null;
38
+ }
31
39
 
32
40
  function printHelp() {
33
41
  console.log(`
34
- ${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
35
- ${c.bold}vibecheck guard${c.reset} - Trust boundary enforcement for AI outputs
36
- ${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
37
-
38
- ${c.green}USAGE${c.reset}
39
- vibecheck guard [options]
40
-
41
- ${c.yellow}OPTIONS${c.reset}
42
- --claims Verify AI claims against truthpack (route_exists, auth_enforced, etc.)
43
- --prompts Check code for prompt injection vulnerabilities
44
- --hallucinations Detect AI hallucination patterns in generated code
45
- --file <path> Check specific file(s)
46
- --json Output JSON for CI integration
47
- --strict Fail on warnings (default: fail on errors only)
48
-
49
- ${c.magenta}EXAMPLES${c.reset}
50
- vibecheck guard # Run all checks
51
- vibecheck guard --claims --file api.ts # Verify claims in specific file
52
- vibecheck guard --prompts # Prompt injection scan
53
- vibecheck guard --json # CI-friendly output
54
-
55
- ${c.dim}This command unifies trust boundary checks for AI-generated code.${c.reset}
42
+ ${ansi.bold}USAGE${ansi.reset}
43
+ ${ansi.cyan}vibecheck guard${ansi.reset} [options]
44
+
45
+ ${ansi.dim}Aliases: ai-guard, firewall, validate${ansi.reset}
46
+
47
+ Validate AI-generated code and prompts. Detects prompt injection attempts,
48
+ verifies claims against your codebase (hallucination checking), and ensures
49
+ AI outputs meet your standards.
50
+
51
+ ${ansi.bold}CHECK MODES${ansi.reset}
52
+ ${ansi.cyan}--claims${ansi.reset} Verify AI claims against truthpack
53
+ ${ansi.cyan}--prompts${ansi.reset} Check code for prompt injection
54
+ ${ansi.cyan}--hallucinations${ansi.reset} Detect AI hallucination patterns
55
+ ${ansi.dim}(default: run all checks)${ansi.reset}
56
+
57
+ ${ansi.bold}OPTIONS${ansi.reset}
58
+ ${ansi.cyan}--file <path>${ansi.reset} Check specific file(s)
59
+ ${ansi.cyan}--strict${ansi.reset} Fail on warnings (default: fail on errors only)
60
+ ${ansi.cyan}--json${ansi.reset} Output as JSON (CI integration)
61
+ ${ansi.cyan}--quiet, -q${ansi.reset} Suppress non-essential output
62
+ ${ansi.cyan}--help, -h${ansi.reset} Show this help
63
+
64
+ ${ansi.bold}EXAMPLES${ansi.reset}
65
+ ${ansi.dim}# Run all guardrail checks${ansi.reset}
66
+ vibecheck guard
67
+
68
+ ${ansi.dim}# Verify AI claims in specific file${ansi.reset}
69
+ vibecheck guard --claims --file api.ts
70
+
71
+ ${ansi.dim}# Prompt injection scan only${ansi.reset}
72
+ vibecheck guard --prompts
73
+
74
+ ${ansi.dim}# CI pipeline (strict, JSON output)${ansi.reset}
75
+ vibecheck guard --strict --json
76
+
77
+ ${ansi.bold}EXIT CODES${ansi.reset}
78
+ 0 All checks passed
79
+ 1 Warnings found (non-blocking)
80
+ 2 Errors found (blocking issues)
81
+
82
+ ${ansi.dim}────────────────────────────────────────────────────────────────────${ansi.reset}
83
+ ${ansi.dim}Documentation: https://docs.vibecheckai.dev/cli/guard${ansi.reset}
56
84
  `);
57
85
  }
58
86
 
59
87
  async function runGuard(args = []) {
88
+ const { flags: globalFlags } = parseGlobalFlags(args);
89
+ const quiet = shouldSuppressOutput(globalFlags);
90
+ const json = isJsonMode(globalFlags) || args.includes("--json");
91
+ const startTime = Date.now();
92
+
60
93
  // Parse arguments
61
- if (args.includes("--help") || args.includes("-h")) {
94
+ if (globalFlags.help || args.includes("--help") || args.includes("-h")) {
62
95
  printHelp();
63
- return 0;
96
+ return EXIT.SUCCESS;
64
97
  }
65
98
 
66
99
  const runClaims = args.includes("--claims") || (!args.includes("--prompts") && !args.includes("--hallucinations"));
67
100
  const runPrompts = args.includes("--prompts") || (!args.includes("--claims") && !args.includes("--hallucinations"));
68
101
  const runHallucinations = args.includes("--hallucinations") || (!args.includes("--claims") && !args.includes("--prompts"));
69
- const jsonOutput = args.includes("--json");
70
102
  const strict = args.includes("--strict");
103
+
104
+ // Validate --file if provided
105
+ const fileIndex = args.indexOf("--file");
106
+ if (fileIndex !== -1) {
107
+ const filePath = args[fileIndex + 1];
108
+ if (!filePath || filePath.startsWith("--")) {
109
+ if (json) {
110
+ console.log(JSON.stringify({ success: false, error: "--file requires a path argument" }));
111
+ } else {
112
+ renderError("--file requires a path argument");
113
+ }
114
+ return EXIT.USER_ERROR;
115
+ }
116
+ if (!fs.existsSync(filePath)) {
117
+ if (json) {
118
+ console.log(JSON.stringify({ success: false, error: `File not found: ${filePath}` }));
119
+ } else {
120
+ renderError(`File not found: ${filePath}`);
121
+ }
122
+ return EXIT.NOT_FOUND;
123
+ }
124
+ }
71
125
 
72
126
  const results = {
73
127
  claims: null,
@@ -78,91 +132,131 @@ async function runGuard(args = []) {
78
132
  warnings: 0,
79
133
  };
80
134
 
81
- console.log(`
82
- ${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
83
- ${c.bold}🛡️ VIBECHECK GUARD${c.reset} - Trust Boundary Enforcement
84
- ${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
85
- `);
135
+ try {
136
+ if (!quiet && !json) {
137
+ renderMinimalHeader("guard", "starter");
138
+ renderSectionHeader("Trust Boundary Checks", sym.shield);
139
+ }
86
140
 
87
- // Run claims verification (validates AI claims against truthpack)
88
- if (runClaims) {
89
- console.log(`${c.dim}▸ Verifying AI claims against truthpack...${c.reset}`);
90
- try {
91
- const validateArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
92
- const exitCode = await runValidate(validateArgs);
93
- results.claims = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
94
- if (exitCode !== 0) {
95
- results.errors++;
96
- results.verdict = "FAIL";
141
+ // Run claims verification
142
+ if (runClaims) {
143
+ const spinner = !quiet && !json ? new Spinner("Verifying AI claims against truthpack").start() : null;
144
+
145
+ if (!runValidate) {
146
+ results.claims = { skipped: true, reason: "Validator module not available" };
147
+ spinner?.warn("Claims check skipped: module not available");
148
+ } else {
149
+ try {
150
+ const validateArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
151
+ const exitCode = await runValidate(validateArgs);
152
+ results.claims = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
153
+ if (exitCode !== 0) {
154
+ results.errors++;
155
+ results.verdict = "FAIL";
156
+ spinner?.fail("Claim verification failed");
157
+ } else {
158
+ spinner?.succeed("Claims verified");
159
+ }
160
+ } catch (e) {
161
+ results.claims = { error: e.message };
162
+ spinner?.warn(`Claims check failed: ${e.message}`);
163
+ }
97
164
  }
98
- console.log(exitCode === 0
99
- ? ` ${c.green}✓${c.reset} Claims verified`
100
- : ` ${c.red}✗${c.reset} Claim verification failed`);
101
- } catch (e) {
102
- results.claims = { error: e.message };
103
- console.log(` ${c.yellow}⚠${c.reset} Claims check skipped: ${e.message}`);
104
165
  }
105
- }
106
166
 
107
- // Run prompt injection detection
108
- if (runPrompts) {
109
- console.log(`${c.dim}▸ Scanning for prompt injection vulnerabilities...${c.reset}`);
110
- try {
111
- const firewallArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
112
- const exitCode = await runPromptFirewall(firewallArgs);
113
- results.prompts = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
114
- if (exitCode !== 0) {
115
- results.warnings++;
116
- if (strict) results.verdict = "FAIL";
167
+ // Run prompt injection detection
168
+ if (runPrompts) {
169
+ const spinner = !quiet && !json ? new Spinner("Scanning for prompt injection vulnerabilities").start() : null;
170
+
171
+ if (!runPromptFirewall) {
172
+ results.prompts = { skipped: true, reason: "Firewall module not available" };
173
+ spinner?.warn("Prompt check skipped: module not available");
174
+ } else {
175
+ try {
176
+ const firewallArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
177
+ const exitCode = await runPromptFirewall(firewallArgs);
178
+ results.prompts = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
179
+ if (exitCode !== 0) {
180
+ results.warnings++;
181
+ if (strict) results.verdict = "FAIL";
182
+ spinner?.warn("Prompt injection risks detected");
183
+ } else {
184
+ spinner?.succeed("No prompt injection risks");
185
+ }
186
+ } catch (e) {
187
+ results.prompts = { error: e.message };
188
+ spinner?.warn(`Prompt check failed: ${e.message}`);
189
+ }
117
190
  }
118
- console.log(exitCode === 0
119
- ? ` ${c.green}✓${c.reset} No prompt injection risks`
120
- : ` ${c.yellow}⚠${c.reset} Prompt injection risks detected`);
121
- } catch (e) {
122
- results.prompts = { error: e.message };
123
- console.log(` ${c.yellow}⚠${c.reset} Prompt check skipped: ${e.message}`);
124
191
  }
125
- }
126
192
 
127
- // Run hallucination detection
128
- if (runHallucinations) {
129
- console.log(`${c.dim}▸ Detecting hallucination patterns...${c.reset}`);
130
- // Use validate with hallucination focus
131
- try {
132
- const validateArgs = ["--hallucinations", ...args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a))];
133
- const exitCode = await runValidate(validateArgs);
134
- results.hallucinations = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
135
- if (exitCode !== 0) {
136
- results.warnings++;
137
- if (strict) results.verdict = "FAIL";
193
+ // Run hallucination detection
194
+ if (runHallucinations) {
195
+ const spinner = !quiet && !json ? new Spinner("Detecting hallucination patterns").start() : null;
196
+
197
+ if (!runValidate) {
198
+ results.hallucinations = { skipped: true, reason: "Validator module not available" };
199
+ spinner?.warn("Hallucination check skipped: module not available");
200
+ } else {
201
+ try {
202
+ const validateArgs = ["--hallucinations", ...args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a))];
203
+ const exitCode = await runValidate(validateArgs);
204
+ results.hallucinations = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
205
+ if (exitCode !== 0) {
206
+ results.warnings++;
207
+ if (strict) results.verdict = "FAIL";
208
+ spinner?.warn("Potential hallucinations detected");
209
+ } else {
210
+ spinner?.succeed("No hallucination patterns");
211
+ }
212
+ } catch (e) {
213
+ results.hallucinations = { error: e.message };
214
+ spinner?.warn(`Hallucination check failed: ${e.message}`);
215
+ }
138
216
  }
139
- console.log(exitCode === 0
140
- ? ` ${c.green}✓${c.reset} No hallucination patterns`
141
- : ` ${c.yellow}⚠${c.reset} Potential hallucinations detected`);
142
- } catch (e) {
143
- results.hallucinations = { error: e.message };
144
- console.log(` ${c.yellow}⚠${c.reset} Hallucination check skipped: ${e.message}`);
145
217
  }
146
- }
147
218
 
148
- // Summary
149
- console.log(`
150
- ${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}`);
151
-
152
- if (results.verdict === "PASS") {
153
- console.log(` ${c.green}${c.bold}✓ GUARD PASS${c.reset} - All trust boundaries intact`);
154
- } else {
155
- console.log(` ${c.red}${c.bold}✗ GUARD FAIL${c.reset} - Trust boundary violations detected`);
156
- }
219
+ // Summary
220
+ const duration = Date.now() - startTime;
221
+
222
+ if (!quiet && !json) {
223
+ renderVerdict(results.verdict === "PASS" ? "PASS" : "FAIL", {
224
+ warnings: results.warnings,
225
+ critical: results.errors,
226
+ duration,
227
+ });
228
+
229
+ renderFooter({
230
+ nextSteps: results.verdict === "PASS" ? [
231
+ { cmd: "vibecheck scan", desc: "run full code analysis" },
232
+ { cmd: "vibecheck ship", desc: "get ship verdict" },
233
+ ] : [
234
+ { cmd: "vibecheck fix --plan-only", desc: "view fix recommendations" },
235
+ ],
236
+ docsUrl: "https://docs.vibecheckai.dev/cli/guard",
237
+ });
238
+ }
157
239
 
158
- console.log(`${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
159
- `);
240
+ if (json) {
241
+ console.log(JSON.stringify({ ...results, duration }, null, 2));
242
+ }
160
243
 
161
- if (jsonOutput) {
162
- console.log(JSON.stringify(results, null, 2));
244
+ // Return appropriate exit code
245
+ if (results.verdict === "PASS") {
246
+ return EXIT.SUCCESS;
247
+ } else if (results.errors > 0) {
248
+ return EXIT.BLOCKING;
249
+ } else {
250
+ return EXIT.WARNINGS;
251
+ }
252
+ } catch (error) {
253
+ if (json) {
254
+ console.log(JSON.stringify({ success: false, error: error.message }));
255
+ } else {
256
+ renderError(`Guard check failed: ${error.message}`);
257
+ }
258
+ return EXIT.INTERNAL_ERROR;
163
259
  }
164
-
165
- return results.verdict === "PASS" ? 0 : (results.errors > 0 ? 2 : 1);
166
260
  }
167
261
 
168
262
  module.exports = { runGuard };
@@ -12,6 +12,7 @@
12
12
  const fs = require("fs");
13
13
  const path = require("path");
14
14
  const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
15
+ const { EXIT } = require("./lib/exit-codes");
15
16
 
16
17
  // Use enhanced wizard if available
17
18
  let InitWizard;
@@ -693,8 +694,8 @@ async function runRepairMode(targetDir, projectName, opts) {
693
694
  if (!opts.dryRun) {
694
695
  startSpinner('Generating truthpack...', colors.accent);
695
696
  try {
696
- const { runCtx } = require("./runCtx");
697
- await runCtx(["build", "--path", targetDir, "--quiet"]);
697
+ const { runContext } = require("./runContext");
698
+ await runContext(["--path", targetDir, "--quiet"]);
698
699
  stopSpinner('Truthpack generated', true);
699
700
  fixes.push("Generated: .vibecheck/truthpack.json");
700
701
  } catch (e) {
@@ -1054,6 +1055,17 @@ function printNextSteps(options = {}) {
1054
1055
  console.log();
1055
1056
  console.log(` ${c.dim}Full docs:${c.reset} ${colors.info}https://docs.vibecheckai.dev${c.reset}`);
1056
1057
  console.log();
1058
+
1059
+ // Upsell box
1060
+ console.log(` ${c.dim}╭────────────────────────────────────────────────────────────╮${c.reset}`);
1061
+ console.log(` ${c.dim}│${c.reset} ${c.dim}│${c.reset}`);
1062
+ console.log(` ${c.dim}│${c.reset} ${colors.accent}⚡ STARTER${c.reset} ${c.dim}•${c.reset} AI-powered fixes, GitHub CI, MCP tools ${c.dim}│${c.reset}`);
1063
+ console.log(` ${c.dim}│${c.reset} ${colors.accent}🏆 PRO${c.reset} ${c.dim}•${c.reset} Runtime proof, verified badges, AI testing ${c.dim}│${c.reset}`);
1064
+ console.log(` ${c.dim}│${c.reset} ${c.dim}│${c.reset}`);
1065
+ console.log(` ${c.dim}│${c.reset} ${colors.info}vibecheck login${c.reset} ${c.dim}to upgrade • vibecheck.dev/pricing${c.reset} ${c.dim}│${c.reset}`);
1066
+ console.log(` ${c.dim}│${c.reset} ${c.dim}│${c.reset}`);
1067
+ console.log(` ${c.dim}╰────────────────────────────────────────────────────────────╯${c.reset}`);
1068
+ console.log();
1057
1069
  }
1058
1070
 
1059
1071
  // ═══════════════════════════════════════════════════════════════════════════════
@@ -1398,13 +1410,17 @@ async function runLocalSetup(targetDir, projectName, opts, filesCreated) {
1398
1410
  if (!opts.dryRun) {
1399
1411
  startSpinner('Building truthpack...', colors.accent);
1400
1412
  try {
1401
- const { runCtx } = require("./runCtx");
1402
- await runCtx(["build", "--path", targetDir, "--quiet"]);
1413
+ const { runContext } = require("./runContext");
1414
+ await runContext(["--path", targetDir, "--quiet"]);
1403
1415
  stopSpinner('Truthpack generated', true);
1404
1416
  filesCreated.push('.vibecheck/truthpack.json');
1405
1417
  } catch (e) {
1406
1418
  stopSpinner('Truthpack generation failed', false);
1407
- throw new Error(`Truthpack generation failed: ${e.message}. Run 'vibecheck ctx build' manually or 'vibecheck init --repair' to retry.`);
1419
+ // Don't throw - truthpack generation is optional for init
1420
+ if (!opts.json) {
1421
+ console.log(` ${colors.warning}${ICONS.warning}${c.reset} ${e.message}`);
1422
+ console.log(` ${c.dim}Run 'vibecheck context' manually to generate truthpack${c.reset}`);
1423
+ }
1408
1424
  }
1409
1425
  } else {
1410
1426
  printSetupStep('truthpack.json', 'dry-run', 'would generate via vibecheck ctx build');
@@ -1472,21 +1488,36 @@ async function runLocalSetup(targetDir, projectName, opts, filesCreated) {
1472
1488
  printSetupStep('IDE rules', 'dry-run', 'would generate via vibecheck context');
1473
1489
  }
1474
1490
 
1475
- // 6. Create .vibecheckrc at project root
1491
+ // 6. Create .vibecheckrc at project root (create both for compatibility)
1476
1492
  logStep('Creating root config');
1477
- const rcPath = path.join(targetDir, ".vibecheckrc.json");
1478
- if (!fs.existsSync(rcPath)) {
1479
- const rc = {
1480
- extends: ".vibecheck/config.json",
1481
- tier: "free",
1482
- };
1493
+ const rcPathJson = path.join(targetDir, ".vibecheckrc.json");
1494
+ const rcPath = path.join(targetDir, ".vibecheckrc");
1495
+ const rc = {
1496
+ extends: ".vibecheck/config.json",
1497
+ tier: "free",
1498
+ };
1499
+
1500
+ if (!fs.existsSync(rcPathJson) && !fs.existsSync(rcPath)) {
1483
1501
  if (opts.dryRun) {
1502
+ printSetupStep('.vibecheckrc', 'dry-run', 'would create');
1484
1503
  printSetupStep('.vibecheckrc.json', 'dry-run', 'would create');
1485
1504
  } else {
1505
+ // Create .vibecheckrc (without .json) for compatibility with tests/expectations
1486
1506
  fs.writeFileSync(rcPath, JSON.stringify(rc, null, 2));
1487
- printSetupStep('.vibecheckrc.json', 'success', 'root config created');
1507
+ printSetupStep('.vibecheckrc', 'success', 'root config created');
1508
+ filesCreated.push('.vibecheckrc');
1509
+
1510
+ // Also create .vibecheckrc.json for backward compatibility
1511
+ fs.writeFileSync(rcPathJson, JSON.stringify(rc, null, 2));
1488
1512
  filesCreated.push('.vibecheckrc.json');
1489
1513
  }
1514
+ } else if (fs.existsSync(rcPathJson) && !fs.existsSync(rcPath)) {
1515
+ // If only .vibecheckrc.json exists, create .vibecheckrc for compatibility
1516
+ if (!opts.dryRun) {
1517
+ fs.writeFileSync(rcPath, JSON.stringify(rc, null, 2));
1518
+ printSetupStep('.vibecheckrc', 'success', 'root config created (compatibility)');
1519
+ filesCreated.push('.vibecheckrc');
1520
+ }
1490
1521
  }
1491
1522
 
1492
1523
  // 7. Update .gitignore
@@ -1510,7 +1541,8 @@ async function runLocalSetup(targetDir, projectName, opts, filesCreated) {
1510
1541
  }
1511
1542
  }
1512
1543
 
1513
- return filesCreated;
1544
+ // Return both filesCreated and detection for use in main function
1545
+ return { filesCreated, detection };
1514
1546
  }
1515
1547
 
1516
1548
  // ═══════════════════════════════════════════════════════════════════════════════
@@ -1611,10 +1643,11 @@ async function runInit(args) {
1611
1643
  return 0;
1612
1644
  }
1613
1645
 
1614
- // --quick mode delegates to runInstall (zero-friction onboarding)
1646
+ // --quick mode runs local setup with non-interactive defaults
1615
1647
  if (opts.quick) {
1616
- const { runInstall } = require("./runInstall");
1617
- return await runInstall(args);
1648
+ opts.local = true;
1649
+ opts.nonInteractive = true;
1650
+ // Continue with normal init flow below
1618
1651
  }
1619
1652
 
1620
1653
  const targetDir = path.resolve(opts.path);
@@ -1712,6 +1745,7 @@ async function runInit(args) {
1712
1745
  }
1713
1746
 
1714
1747
  let filesCreated = [];
1748
+ let detection = null; // Declare detection in main function scope
1715
1749
  const result = {
1716
1750
  success: true,
1717
1751
  project: projectName,
@@ -1725,7 +1759,15 @@ async function runInit(args) {
1725
1759
  // Always run local setup first
1726
1760
  if (opts.local || opts.connect) {
1727
1761
  try {
1728
- filesCreated = await runLocalSetup(targetDir, projectName, opts, filesCreated);
1762
+ // runLocalSetup returns both filesCreated and detection
1763
+ const setupResult = await runLocalSetup(targetDir, projectName, opts, filesCreated);
1764
+ if (setupResult && typeof setupResult === 'object' && 'filesCreated' in setupResult) {
1765
+ filesCreated = setupResult.filesCreated;
1766
+ detection = setupResult.detection || null;
1767
+ } else {
1768
+ // Backward compatibility: if it returns just an array, use it
1769
+ filesCreated = Array.isArray(setupResult) ? setupResult : filesCreated;
1770
+ }
1729
1771
  } catch (e) {
1730
1772
  result.errors.push({ step: 'local', error: e.message, stack: e.stack });
1731
1773
  if (!opts.json) {
@@ -1735,8 +1777,11 @@ async function runInit(args) {
1735
1777
  }
1736
1778
  console.log(` ${colors.info}${ICONS.info}${c.reset} Run ${c.cyan}vibecheck init --repair${c.reset} to fix partial state`);
1737
1779
  }
1738
- if (!opts.dryRun) {
1739
- return 1; // Exit on error unless dry-run
1780
+ // Don't exit on error - continue and report errors in result
1781
+ // Only exit if critical setup failed AND we're not in dry-run mode
1782
+ if (!opts.dryRun && result.errors.length > 0 && filesCreated.length === 0) {
1783
+ // Only exit if NO files were created at all (complete failure)
1784
+ return EXIT.INTERNAL_ERROR;
1740
1785
  }
1741
1786
  }
1742
1787
  }
@@ -1754,7 +1799,7 @@ async function runInit(args) {
1754
1799
  }
1755
1800
  }
1756
1801
  if (!opts.dryRun) {
1757
- return 1;
1802
+ return EXIT.INTERNAL_ERROR;
1758
1803
  }
1759
1804
  }
1760
1805
  }