@vibecheckai/cli 3.5.1 → 3.5.3

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
@@ -9,95 +9,136 @@
9
9
 
10
10
  "use strict";
11
11
 
12
- const { c, sym, box, printHeader, table } = require("./lib/ui");
12
+ // Colors
13
+ const c = {
14
+ reset: '\x1b[0m',
15
+ bold: '\x1b[1m',
16
+ dim: '\x1b[2m',
17
+ green: '\x1b[32m',
18
+ yellow: '\x1b[33m',
19
+ cyan: '\x1b[36m',
20
+ red: '\x1b[31m',
21
+ magenta: '\x1b[35m',
22
+ };
23
+
24
+ const rgb = (r, g, b) => `\x1b[38;2;${r};${g};${b}m`;
25
+
26
+ const colors = {
27
+ accent: rgb(0, 212, 255),
28
+ success: rgb(16, 185, 129),
29
+ warning: rgb(245, 158, 11),
30
+ error: rgb(239, 68, 68),
31
+ purple: rgb(168, 85, 247),
32
+ };
33
+
34
+ const sym = {
35
+ check: '✓',
36
+ cross: '✗',
37
+ warning: '⚠',
38
+ info: 'ℹ',
39
+ pending: '○',
40
+ lightning: '⚡',
41
+ star: '★',
42
+ arrow: '→',
43
+ };
13
44
 
14
45
  // ═══════════════════════════════════════════════════════════════════════════════
15
46
  // LABS FEATURE REGISTRY
16
47
  // ═══════════════════════════════════════════════════════════════════════════════
17
48
  const LABS_FEATURES = {
18
49
  // Experimental - Working but API may change
19
- "ai-test": {
50
+ "ai-agent": {
20
51
  status: "experimental",
21
- description: "AI agent for autonomous app testing",
22
- docs: "https://docs.vibecheckai.dev/labs/ai-test",
52
+ description: "AI autonomous testing agent",
53
+ docs: "https://docs.vibecheckai.dev/labs/ai-agent",
23
54
  runner: () => require("./runAIAgent").runAIAgent,
24
55
  },
25
- "launch": {
56
+ "deep-scan": {
26
57
  status: "experimental",
27
- description: "Pre-launch checklist wizard",
28
- docs: "https://docs.vibecheckai.dev/labs/launch",
29
- runner: () => require("./runLaunch").runLaunch,
58
+ description: "Extended static analysis with ML patterns",
59
+ runner: async (args, ctx) => {
60
+ const { runScan } = require("./runScan");
61
+ return runScan(["--profile", "deep", ...args], ctx);
62
+ },
30
63
  },
31
- "dashboard": {
32
- status: "stub",
33
- description: "Real-time monitoring dashboard (coming soon)",
34
- eta: "Q2 2025",
35
- },
36
- "permissions": {
37
- status: "experimental",
38
- description: "AuthZ matrix & IDOR vulnerability prover",
39
- runner: () => require("./runPermissions").runPermissions,
40
- },
41
- "replay": {
64
+ "hallucination-check": {
42
65
  status: "experimental",
43
- description: "Record and replay user sessions for testing",
44
- runner: () => require("./runReplay").runReplay,
66
+ description: "Detect AI-generated code hallucinations",
67
+ runner: async (args, ctx) => {
68
+ const { runCheckpoint } = require("./runCheckpoint");
69
+ return runCheckpoint(["--hallucination", ...args], ctx);
70
+ },
45
71
  },
46
- "graph": {
72
+ "truth-diff": {
47
73
  status: "experimental",
48
- description: "Reality proof graph visualization",
49
- runner: () => require("./runGraph").runGraph,
74
+ description: "Diff truthpack changes across commits",
75
+ runner: async (args) => {
76
+ console.log(`\n ${c.yellow}${sym.warning} truth-diff${c.reset} is coming soon.\n`);
77
+ console.log(` ${c.dim}This feature will compare truthpack snapshots across git commits.${c.reset}\n`);
78
+ return 0;
79
+ },
50
80
  },
51
-
81
+
52
82
  // Beta - Feature complete, gathering feedback
53
- "ctx-diff": {
83
+ "smart-fix": {
54
84
  status: "beta",
55
- description: "Diff truthpack changes across commits",
56
- runner: () => require("./runCtxDiff").main,
85
+ description: "AI-powered intelligent fix suggestions",
86
+ runner: async (args, ctx) => {
87
+ const { runFix } = require("./runFix");
88
+ return runFix(["--smart", ...args], ctx);
89
+ },
57
90
  },
58
-
91
+ "security-audit": {
92
+ status: "beta",
93
+ description: "Comprehensive security audit mode",
94
+ runner: async (args, ctx) => {
95
+ const { runScan } = require("./runScan");
96
+ return runScan(["--profile", "security", ...args], ctx);
97
+ },
98
+ },
99
+
59
100
  // Stubs - Planned but not implemented
60
101
  "autopilot": {
61
102
  status: "stub",
62
103
  description: "Continuous protection mode (auto-fix on commit)",
63
- eta: "Q2 2025",
104
+ eta: "Q2 2026",
64
105
  },
65
106
  "certify": {
66
107
  status: "stub",
67
108
  description: "Generate compliance certification badges",
68
- eta: "Q2 2025",
109
+ eta: "Q2 2026",
69
110
  },
70
- "audit": {
111
+ "audit-trail": {
71
112
  status: "stub",
72
113
  description: "Full audit trail for compliance (SOC2, HIPAA)",
73
- eta: "Q3 2025",
114
+ eta: "Q3 2026",
74
115
  },
75
116
  "natural-language": {
76
117
  status: "stub",
77
- description: "Natural language command parsing",
78
- eta: "Q2 2025",
118
+ description: "Natural language command interface",
119
+ eta: "Q2 2026",
79
120
  },
80
121
  "fix-packs": {
81
122
  status: "stub",
82
123
  description: "Downloadable fix pack templates",
83
- eta: "Q2 2025",
124
+ eta: "Q2 2026",
84
125
  },
85
- "mdc": {
126
+ "dashboard-live": {
86
127
  status: "stub",
87
- description: "MDC documentation generator",
88
- eta: "Q3 2025",
128
+ description: "Real-time live monitoring dashboard",
129
+ eta: "Q3 2026",
89
130
  },
90
-
131
+
91
132
  // Aliases - Redirect to main commands
92
- "enhanced-ship": {
133
+ "ship-strict": {
93
134
  status: "alias",
94
135
  target: "ship --strict",
95
136
  description: "Enhanced ship mode (use: vibecheck ship --strict)",
96
137
  },
97
- "sniff": {
138
+ "reality-agent": {
98
139
  status: "alias",
99
- target: "reality --sniff",
100
- description: "Reality sniff mode (use: vibecheck reality --sniff)",
140
+ target: "reality --agent",
141
+ description: "Reality with AI agent (use: vibecheck reality --agent)",
101
142
  },
102
143
  };
103
144
 
@@ -141,13 +182,12 @@ function formatStatus(status) {
141
182
  // HELP DISPLAY
142
183
  // ═══════════════════════════════════════════════════════════════════════════════
143
184
  function printHelp() {
144
- printHeader("LABS", {
145
- icon: sym.lightning,
146
- subtitle: "Experimental & Internal Features"
147
- });
148
-
149
- console.log(`${c.yellow}${sym.warning} These features are experimental and may change without notice.${c.reset}\n`);
150
-
185
+ console.log(`
186
+ ${colors.accent}${c.bold}vibecheck labs${c.reset} - Experimental & Internal Features
187
+
188
+ ${c.yellow}${sym.warning} These features are experimental and may change without notice.${c.reset}
189
+ `);
190
+
151
191
  // Group by status
152
192
  const groups = {
153
193
  experimental: [],
@@ -164,13 +204,13 @@ function printHelp() {
164
204
 
165
205
  // Experimental
166
206
  if (groups.experimental.length > 0) {
167
- console.log(`${c.yellow}${sym.lightning} EXPERIMENTAL${c.reset} ${c.dim}(working, API may change)${c.reset}\n`);
207
+ console.log(` ${c.yellow}${sym.lightning} EXPERIMENTAL${c.reset} ${c.dim}(working, API may change)${c.reset}\n`);
168
208
 
169
209
  for (const feature of groups.experimental) {
170
- console.log(` ${c.cyan}vibecheck labs ${feature.name}${c.reset}`);
171
- console.log(` ${c.dim}${feature.description}${c.reset}`);
210
+ console.log(` ${c.cyan}vibecheck labs ${feature.name}${c.reset}`);
211
+ console.log(` ${c.dim}${feature.description}${c.reset}`);
172
212
  if (feature.docs) {
173
- console.log(` ${c.dim}Docs: ${feature.docs}${c.reset}`);
213
+ console.log(` ${c.dim}Docs: ${feature.docs}${c.reset}`);
174
214
  }
175
215
  console.log("");
176
216
  }
@@ -178,79 +218,122 @@ function printHelp() {
178
218
 
179
219
  // Beta
180
220
  if (groups.beta.length > 0) {
181
- console.log(`${c.cyan}${sym.star} BETA${c.reset} ${c.dim}(feature complete, gathering feedback)${c.reset}\n`);
221
+ console.log(` ${c.cyan}${sym.star} BETA${c.reset} ${c.dim}(feature complete, gathering feedback)${c.reset}\n`);
182
222
 
183
223
  for (const feature of groups.beta) {
184
- console.log(` ${c.cyan}vibecheck labs ${feature.name}${c.reset}`);
185
- console.log(` ${c.dim}${feature.description}${c.reset}`);
224
+ console.log(` ${c.cyan}vibecheck labs ${feature.name}${c.reset}`);
225
+ console.log(` ${c.dim}${feature.description}${c.reset}`);
186
226
  console.log("");
187
227
  }
188
228
  }
189
229
 
190
230
  // Stubs
191
231
  if (groups.stub.length > 0) {
192
- console.log(`${c.dim}${sym.pending} PLANNED${c.reset} ${c.dim}(not yet implemented)${c.reset}\n`);
193
-
194
- const stubData = groups.stub.map(f => [
195
- `${c.dim}${f.name}${c.reset}`,
196
- `${c.dim}${f.description}${c.reset}`,
197
- f.eta ? `${c.dim}ETA: ${f.eta}${c.reset}` : "",
198
- ]);
232
+ console.log(` ${c.dim}${sym.pending} PLANNED${c.reset} ${c.dim}(not yet implemented)${c.reset}\n`);
199
233
 
200
- console.log(table(stubData, { indent: 2 }));
234
+ for (const feature of groups.stub) {
235
+ const eta = feature.eta ? `${c.dim}(ETA: ${feature.eta})${c.reset}` : '';
236
+ console.log(` ${c.dim}${feature.name}${c.reset} ${feature.description} ${eta}`);
237
+ }
201
238
  console.log("");
202
239
  }
203
240
 
204
241
  // Aliases
205
242
  if (groups.alias.length > 0) {
206
- console.log(`${c.dim}${sym.arrow} ALIASES${c.reset} ${c.dim}(use the main command instead)${c.reset}\n`);
243
+ console.log(` ${c.dim}${sym.arrow} ALIASES${c.reset} ${c.dim}(use the main command instead)${c.reset}\n`);
207
244
 
208
245
  for (const feature of groups.alias) {
209
- console.log(` ${c.dim}labs ${feature.name}${c.reset} ${sym.arrow} ${c.cyan}vibecheck ${feature.target}${c.reset}`);
246
+ console.log(` ${c.dim}labs ${feature.name}${c.reset} ${sym.arrow} ${c.cyan}vibecheck ${feature.target}${c.reset}`);
210
247
  }
211
248
  console.log("");
212
249
  }
213
250
 
214
251
  // Usage
215
- console.log(`${c.dim}${"─".repeat(60)}${c.reset}`);
216
- console.log(`${c.bold}Usage${c.reset}\n`);
217
- console.log(` vibecheck labs <feature> [options]\n`);
218
- console.log(`${c.dim}Example:${c.reset}`);
219
- console.log(` vibecheck labs ai-test --url http://localhost:3000`);
220
- console.log("");
221
-
222
- // Feedback
223
- console.log(`${c.dim}${"─".repeat(60)}${c.reset}`);
224
- console.log(`${c.bold}Feedback${c.reset}\n`);
225
- console.log(` ${c.dim}Want a feature prioritized? Let us know:${c.reset}`);
226
- console.log(` ${c.cyan}https://github.com/vibecheckai/vibecheck/discussions${c.reset}`);
227
- console.log("");
252
+ console.log(` ${c.dim}${"─".repeat(60)}${c.reset}`);
253
+ console.log(`
254
+ ${c.bold}Usage${c.reset}
255
+
256
+ vibecheck labs <feature> [options]
257
+
258
+ ${c.bold}Examples${c.reset}
259
+
260
+ ${c.dim}# Run AI agent testing${c.reset}
261
+ vibecheck labs ai-agent --url http://localhost:3000
262
+
263
+ ${c.dim}# Deep security scan${c.reset}
264
+ vibecheck labs security-audit
265
+
266
+ ${c.dim}# Smart AI fixes${c.reset}
267
+ vibecheck labs smart-fix
268
+
269
+ ${c.dim}${"─".repeat(60)}${c.reset}
270
+
271
+ ${c.bold}Feedback${c.reset}
272
+
273
+ Want a feature prioritized? Let us know:
274
+ ${c.cyan}https://github.com/vibecheckai/vibecheck/discussions${c.reset}
275
+ `);
228
276
  }
229
277
 
230
278
  function printFeatureStub(name, feature) {
231
- console.log(box(
232
- `${c.bold}vibecheck labs ${name}${c.reset}\n\n` +
233
- `${feature.description}\n\n` +
234
- `${c.dim}This feature is not yet implemented.${c.reset}\n` +
235
- (feature.eta ? `${c.dim}Expected: ${feature.eta}${c.reset}\n` : "") +
236
- `\n${c.dim}Want this feature? Vote for it:${c.reset}\n` +
237
- `${c.cyan}https://github.com/vibecheckai/vibecheck/discussions${c.reset}`,
238
- { title: "PLANNED", borderColor: c.yellow }
239
- ));
240
- console.log("");
279
+ console.log(`
280
+ ${c.yellow}╭${"─".repeat(58)}╮${c.reset}
281
+ ${c.yellow}│${c.reset} ${c.bold}vibecheck labs ${name}${c.reset}${" ".repeat(58 - 18 - name.length)}${c.yellow}│${c.reset}
282
+ ${c.yellow}╰${"─".repeat(58)}╯${c.reset}
283
+
284
+ ${feature.description}
285
+
286
+ ${c.dim}This feature is not yet implemented.${c.reset}
287
+ ${feature.eta ? `${c.dim}Expected: ${feature.eta}${c.reset}` : ""}
288
+
289
+ ${c.dim}Want this feature? Vote for it:${c.reset}
290
+ ${c.cyan}https://github.com/vibecheckai/vibecheck/discussions${c.reset}
291
+ `);
241
292
  }
242
293
 
243
294
  function printAliasWarning(name, feature) {
244
- console.log(`${c.yellow}${sym.warning}${c.reset} '${name}' is now available as: ${c.cyan}vibecheck ${feature.target}${c.reset}\n`);
245
- console.log(`${c.dim}The labs alias will be removed in a future version.${c.reset}\n`);
295
+ console.log(`\n ${c.yellow}${sym.warning}${c.reset} '${name}' is now available as: ${c.cyan}vibecheck ${feature.target}${c.reset}\n`);
296
+ console.log(` ${c.dim}The labs alias will be removed in a future version.${c.reset}\n`);
246
297
  }
247
298
 
248
299
  // ═══════════════════════════════════════════════════════════════════════════════
249
300
  // MAIN RUNNER
250
301
  // ═══════════════════════════════════════════════════════════════════════════════
251
- async function runLabs(args = []) {
252
- const subCmd = args[0];
253
- const subArgs = args.slice(1);
302
+ async function runLabs(args = [], context = {}) {
303
+ // Filter out global flags that are passed through from main CLI
304
+ const GLOBAL_FLAGS = new Set([
305
+ '--offline', '--local', '--json', '--ci', '--quiet', '-q',
306
+ '--verbose', '--debug', '--strict', '--no-banner',
307
+ ]);
308
+
309
+ // Find first non-flag argument as subcommand
310
+ let subCmd = null;
311
+ const subArgs = [];
312
+ let skipNext = false;
313
+
314
+ for (let i = 0; i < args.length; i++) {
315
+ const arg = args[i];
316
+
317
+ if (skipNext) {
318
+ skipNext = false;
319
+ continue;
320
+ }
321
+
322
+ // Skip global flags (and their values for --path, --output)
323
+ if (GLOBAL_FLAGS.has(arg)) continue;
324
+ if (arg === '--path' || arg === '-p' || arg === '--output' || arg === '-o') {
325
+ skipNext = true;
326
+ continue;
327
+ }
328
+ if (arg.startsWith('--path=') || arg.startsWith('--output=')) continue;
329
+
330
+ // First non-flag arg is the subcommand
331
+ if (!subCmd && !arg.startsWith('-')) {
332
+ subCmd = arg;
333
+ } else {
334
+ subArgs.push(arg);
335
+ }
336
+ }
254
337
 
255
338
  // Show help if no command
256
339
  if (!subCmd || subCmd === "--help" || subCmd === "-h") {
@@ -260,16 +343,13 @@ async function runLabs(args = []) {
260
343
 
261
344
  // List all features
262
345
  if (subCmd === "--list" || subCmd === "-l") {
263
- const features = Object.entries(LABS_FEATURES).map(([name, f]) => [
264
- name,
265
- formatStatus(f.status),
266
- f.description.slice(0, 40),
267
- ]);
346
+ console.log(`\n ${c.bold}Labs Features${c.reset}\n`);
268
347
 
269
- console.log(table(features, {
270
- headers: ["Feature", "Status", "Description"],
271
- indent: 2,
272
- }));
348
+ for (const [name, f] of Object.entries(LABS_FEATURES)) {
349
+ if (f.status !== 'stub' && f.status !== 'alias') {
350
+ console.log(` ${formatStatus(f.status).padEnd(30)} ${c.cyan}${name.padEnd(20)}${c.reset} ${c.dim}${f.description}${c.reset}`);
351
+ }
352
+ }
273
353
  console.log("");
274
354
  return 0;
275
355
  }
@@ -278,10 +358,13 @@ async function runLabs(args = []) {
278
358
  const feature = LABS_FEATURES[subCmd];
279
359
 
280
360
  if (!feature) {
281
- console.log(`${c.red}${sym.error}${c.reset} Unknown labs feature: ${c.yellow}${subCmd}${c.reset}\n`);
282
- console.log(`${c.dim}Available features:${c.reset}`);
283
- console.log(` ${Object.keys(LABS_FEATURES).filter(k => LABS_FEATURES[k].status !== "stub").join(", ")}`);
284
- console.log(`\n${c.dim}Run 'vibecheck labs --help' for details.${c.reset}\n`);
361
+ console.log(`\n ${c.red}${sym.cross}${c.reset} Unknown labs feature: ${c.yellow}${subCmd}${c.reset}\n`);
362
+ console.log(` ${c.dim}Available features:${c.reset}`);
363
+ console.log(` ${Object.keys(LABS_FEATURES).filter(k =>
364
+ LABS_FEATURES[k].status !== "stub" &&
365
+ LABS_FEATURES[k].status !== "alias"
366
+ ).join(", ")}`);
367
+ console.log(`\n ${c.dim}Run 'vibecheck labs --help' for details.${c.reset}\n`);
285
368
  return 1;
286
369
  }
287
370
 
@@ -298,16 +381,16 @@ async function runLabs(args = []) {
298
381
  // Try to run the aliased command
299
382
  const [cmd, ...aliasArgs] = feature.target.split(" ");
300
383
  try {
301
- const { runShip } = require("./runShip");
302
384
  if (cmd === "ship") {
303
- return await runShip([...aliasArgs, ...subArgs]);
385
+ const { runShip } = require("./runShip");
386
+ return await runShip([...aliasArgs, ...subArgs], context);
304
387
  }
305
- const { runReality } = require("./runReality");
306
388
  if (cmd === "reality") {
307
- return await runReality([...aliasArgs, ...subArgs]);
389
+ const { runReality } = require("./runReality");
390
+ return await runReality([...aliasArgs, ...subArgs], context);
308
391
  }
309
392
  } catch (e) {
310
- console.log(`${c.dim}Please run the command directly: vibecheck ${feature.target}${c.reset}\n`);
393
+ console.log(` ${c.dim}Please run the command directly: vibecheck ${feature.target}${c.reset}\n`);
311
394
  }
312
395
  return 0;
313
396
  }
@@ -318,18 +401,18 @@ async function runLabs(args = []) {
318
401
 
319
402
  // Show experimental warning
320
403
  if (feature.status === "experimental") {
321
- console.log(`${c.yellow}${sym.warning} EXPERIMENTAL:${c.reset} ${c.dim}This feature may change without notice.${c.reset}\n`);
404
+ console.log(`\n ${c.yellow}${sym.warning} EXPERIMENTAL:${c.reset} ${c.dim}This feature may change without notice.${c.reset}\n`);
322
405
  } else if (feature.status === "beta") {
323
- console.log(`${c.cyan}${sym.star} BETA:${c.reset} ${c.dim}Feedback welcome! Report issues at github.com/vibecheckai/vibecheck${c.reset}\n`);
406
+ console.log(`\n ${c.cyan}${sym.star} BETA:${c.reset} ${c.dim}Feedback welcome! github.com/vibecheckai/vibecheck${c.reset}\n`);
324
407
  }
325
408
 
326
- return await runner(subArgs);
409
+ return await runner(subArgs, context);
327
410
  } catch (e) {
328
411
  if (e.code === "MODULE_NOT_FOUND") {
329
- console.log(`${c.red}${sym.error}${c.reset} Feature '${subCmd}' is not available in this version.\n`);
330
- console.log(`${c.dim}Try updating: npm update -g @vibecheckai/cli${c.reset}\n`);
412
+ console.log(`\n ${c.red}${sym.cross}${c.reset} Feature '${subCmd}' is not available in this version.\n`);
413
+ console.log(` ${c.dim}Try updating: npm update -g @vibecheckai/cli${c.reset}\n`);
331
414
  } else {
332
- console.error(`${c.red}${sym.error}${c.reset} Error running labs ${subCmd}: ${e.message}`);
415
+ console.error(`\n ${c.red}${sym.cross}${c.reset} Error running labs ${subCmd}: ${e.message}`);
333
416
  if (process.env.VIBECHECK_DEBUG) {
334
417
  console.error(c.dim + e.stack + c.reset);
335
418
  }
@@ -338,4 +421,4 @@ async function runLabs(args = []) {
338
421
  }
339
422
  }
340
423
 
341
- module.exports = { runLabs, LABS_FEATURES };
424
+ module.exports = { runLabs, LABS_FEATURES };