@vibecheckai/cli 3.3.0 → 3.5.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 (170) hide show
  1. package/bin/registry.js +389 -269
  2. package/bin/runners/cli-utils.js +2 -33
  3. package/bin/runners/context/generators/cursor.js +49 -2
  4. package/bin/runners/lib/agent-firewall/learning/learning-engine.js +849 -0
  5. package/bin/runners/lib/analyzers.js +599 -142
  6. package/bin/runners/lib/audit-logger.js +532 -0
  7. package/bin/runners/lib/authority/authorities/architecture.js +364 -0
  8. package/bin/runners/lib/authority/authorities/compliance.js +341 -0
  9. package/bin/runners/lib/authority/authorities/human.js +343 -0
  10. package/bin/runners/lib/authority/authorities/quality.js +420 -0
  11. package/bin/runners/lib/authority/authorities/security.js +228 -0
  12. package/bin/runners/lib/authority/index.js +293 -0
  13. package/bin/runners/lib/authority-badge.js +425 -425
  14. package/bin/runners/lib/bundle/bundle-intelligence.js +846 -0
  15. package/bin/runners/lib/cli-charts.js +368 -0
  16. package/bin/runners/lib/cli-config-display.js +405 -0
  17. package/bin/runners/lib/cli-demo.js +275 -0
  18. package/bin/runners/lib/cli-errors.js +438 -0
  19. package/bin/runners/lib/cli-help-formatter.js +439 -0
  20. package/bin/runners/lib/cli-interactive-menu.js +509 -0
  21. package/bin/runners/lib/cli-prompts.js +441 -0
  22. package/bin/runners/lib/cli-scan-cards.js +362 -0
  23. package/bin/runners/lib/compliance-reporter.js +710 -0
  24. package/bin/runners/lib/conductor/index.js +671 -0
  25. package/bin/runners/lib/easy/README.md +123 -0
  26. package/bin/runners/lib/easy/index.js +140 -0
  27. package/bin/runners/lib/easy/interactive-wizard.js +788 -0
  28. package/bin/runners/lib/easy/one-click-firewall.js +564 -0
  29. package/bin/runners/lib/easy/zero-config-reality.js +714 -0
  30. package/bin/runners/lib/engines/accessibility-engine.js +218 -18
  31. package/bin/runners/lib/engines/api-consistency-engine.js +335 -30
  32. package/bin/runners/lib/engines/async-patterns-engine.js +444 -0
  33. package/bin/runners/lib/engines/bundle-size-engine.js +433 -0
  34. package/bin/runners/lib/engines/confidence-scoring.js +276 -0
  35. package/bin/runners/lib/engines/context-detection.js +264 -0
  36. package/bin/runners/lib/engines/cross-file-analysis-engine.js +292 -27
  37. package/bin/runners/lib/engines/database-patterns-engine.js +429 -0
  38. package/bin/runners/lib/engines/duplicate-code-engine.js +354 -0
  39. package/bin/runners/lib/engines/empty-catch-engine.js +127 -17
  40. package/bin/runners/lib/engines/env-variables-engine.js +458 -0
  41. package/bin/runners/lib/engines/error-handling-engine.js +437 -0
  42. package/bin/runners/lib/engines/false-positive-prevention.js +630 -0
  43. package/bin/runners/lib/engines/framework-adapters/index.js +607 -0
  44. package/bin/runners/lib/engines/framework-detection.js +508 -0
  45. package/bin/runners/lib/engines/import-order-engine.js +429 -0
  46. package/bin/runners/lib/engines/mock-data-engine.js +53 -10
  47. package/bin/runners/lib/engines/naming-conventions-engine.js +544 -0
  48. package/bin/runners/lib/engines/noise-reduction-engine.js +452 -0
  49. package/bin/runners/lib/engines/orchestrator.js +334 -0
  50. package/bin/runners/lib/engines/performance-issues-engine.js +176 -36
  51. package/bin/runners/lib/engines/react-patterns-engine.js +457 -0
  52. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +382 -54
  53. package/bin/runners/lib/engines/type-aware-engine.js +263 -39
  54. package/bin/runners/lib/engines/vibecheck-engines/index.js +122 -13
  55. package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +806 -0
  56. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +373 -73
  57. package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +577 -0
  58. package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +543 -0
  59. package/bin/runners/lib/engines/vibecheck-engines.js +514 -0
  60. package/bin/runners/lib/enhanced-features/index.js +305 -0
  61. package/bin/runners/lib/enhanced-output.js +631 -0
  62. package/bin/runners/lib/enterprise.js +300 -0
  63. package/bin/runners/lib/entitlements-v2.js +161 -478
  64. package/bin/runners/lib/firewall/command-validator.js +351 -0
  65. package/bin/runners/lib/firewall/config.js +341 -0
  66. package/bin/runners/lib/firewall/content-validator.js +519 -0
  67. package/bin/runners/lib/firewall/index.js +101 -0
  68. package/bin/runners/lib/firewall/path-validator.js +256 -0
  69. package/bin/runners/lib/html-proof-report.js +350 -700
  70. package/bin/runners/lib/intelligence/cross-repo-intelligence.js +817 -0
  71. package/bin/runners/lib/mcp-utils.js +425 -0
  72. package/bin/runners/lib/missions/plan.js +46 -6
  73. package/bin/runners/lib/missions/templates.js +232 -0
  74. package/bin/runners/lib/output/index.js +1022 -0
  75. package/bin/runners/lib/policy-engine.js +652 -0
  76. package/bin/runners/lib/polish/autofix/accessibility-fixes.js +333 -0
  77. package/bin/runners/lib/polish/autofix/async-handlers.js +273 -0
  78. package/bin/runners/lib/polish/autofix/dead-code.js +280 -0
  79. package/bin/runners/lib/polish/autofix/imports-optimizer.js +344 -0
  80. package/bin/runners/lib/polish/autofix/index.js +200 -0
  81. package/bin/runners/lib/polish/autofix/remove-consoles.js +209 -0
  82. package/bin/runners/lib/polish/autofix/strengthen-types.js +245 -0
  83. package/bin/runners/lib/polish/backend-checks.js +148 -0
  84. package/bin/runners/lib/polish/documentation-checks.js +111 -0
  85. package/bin/runners/lib/polish/frontend-checks.js +168 -0
  86. package/bin/runners/lib/polish/index.js +71 -0
  87. package/bin/runners/lib/polish/infrastructure-checks.js +131 -0
  88. package/bin/runners/lib/polish/library-detection.js +175 -0
  89. package/bin/runners/lib/polish/performance-checks.js +100 -0
  90. package/bin/runners/lib/polish/security-checks.js +148 -0
  91. package/bin/runners/lib/polish/utils.js +203 -0
  92. package/bin/runners/lib/prompt-builder.js +540 -0
  93. package/bin/runners/lib/proof-certificate.js +634 -0
  94. package/bin/runners/lib/reality/accessibility-audit.js +946 -0
  95. package/bin/runners/lib/reality/api-contract-validator.js +1012 -0
  96. package/bin/runners/lib/reality/chaos-engineering.js +1084 -0
  97. package/bin/runners/lib/reality/performance-tracker.js +1077 -0
  98. package/bin/runners/lib/reality/scenario-generator.js +1404 -0
  99. package/bin/runners/lib/reality/visual-regression.js +852 -0
  100. package/bin/runners/lib/reality-profiler.js +717 -0
  101. package/bin/runners/lib/replay/flight-recorder-viewer.js +1160 -0
  102. package/bin/runners/lib/review/ai-code-review.js +832 -0
  103. package/bin/runners/lib/rules/custom-rule-engine.js +985 -0
  104. package/bin/runners/lib/sbom-generator.js +641 -0
  105. package/bin/runners/lib/scan-output-enhanced.js +512 -0
  106. package/bin/runners/lib/scan-output.js +65 -19
  107. package/bin/runners/lib/security/owasp-scanner.js +939 -0
  108. package/bin/runners/lib/ship-output.js +18 -25
  109. package/bin/runners/lib/terminal-ui.js +113 -1
  110. package/bin/runners/lib/unified-cli-output.js +603 -430
  111. package/bin/runners/lib/upsell.js +90 -338
  112. package/bin/runners/lib/validators/contract-validator.js +283 -0
  113. package/bin/runners/lib/validators/dead-export-detector.js +279 -0
  114. package/bin/runners/lib/validators/dep-audit.js +245 -0
  115. package/bin/runners/lib/validators/env-validator.js +319 -0
  116. package/bin/runners/lib/validators/index.js +120 -0
  117. package/bin/runners/lib/validators/license-checker.js +252 -0
  118. package/bin/runners/lib/validators/route-validator.js +290 -0
  119. package/bin/runners/runAIAgent.js +5 -10
  120. package/bin/runners/runAgent.js +3 -0
  121. package/bin/runners/runApprove.js +1233 -1200
  122. package/bin/runners/runAuth.js +22 -1
  123. package/bin/runners/runAuthority.js +528 -0
  124. package/bin/runners/runCheckpoint.js +4 -24
  125. package/bin/runners/runClassify.js +862 -859
  126. package/bin/runners/runConductor.js +772 -0
  127. package/bin/runners/runContainer.js +366 -0
  128. package/bin/runners/runContext.js +3 -0
  129. package/bin/runners/runDoctor.js +28 -41
  130. package/bin/runners/runEasy.js +410 -0
  131. package/bin/runners/runFirewall.js +3 -0
  132. package/bin/runners/runFirewallHook.js +3 -0
  133. package/bin/runners/runFix.js +76 -66
  134. package/bin/runners/runGuard.js +411 -18
  135. package/bin/runners/runIaC.js +372 -0
  136. package/bin/runners/runInit.js +10 -60
  137. package/bin/runners/runMcp.js +11 -12
  138. package/bin/runners/runPolish.js +240 -64
  139. package/bin/runners/runPromptFirewall.js +5 -12
  140. package/bin/runners/runProve.js +20 -55
  141. package/bin/runners/runReality.js +68 -59
  142. package/bin/runners/runReport.js +31 -5
  143. package/bin/runners/runRuntime.js +5 -8
  144. package/bin/runners/runScan.js +194 -1273
  145. package/bin/runners/runShip.js +695 -47
  146. package/bin/runners/runTruth.js +3 -0
  147. package/bin/runners/runValidate.js +7 -11
  148. package/bin/runners/runVibe.js +791 -0
  149. package/bin/runners/runWatch.js +14 -23
  150. package/bin/vibecheck.js +179 -65
  151. package/mcp-server/index.js +202 -636
  152. package/mcp-server/lib/api-client.cjs +7 -299
  153. package/mcp-server/package.json +1 -1
  154. package/mcp-server/tier-auth.js +175 -574
  155. package/mcp-server/tools-v3.js +800 -505
  156. package/mcp-server/tools.js +495 -0
  157. package/package.json +1 -1
  158. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +0 -164
  159. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +0 -291
  160. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +0 -83
  161. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +0 -198
  162. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +0 -275
  163. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +0 -167
  164. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +0 -217
  165. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +0 -140
  166. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +0 -164
  167. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +0 -234
  168. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +0 -217
  169. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +0 -78
  170. package/mcp-server/index-v1.js +0 -698
@@ -7,8 +7,7 @@
7
7
  *
8
8
  * TIER ENFORCEMENT:
9
9
  * - FREE: Preview mode (5 pages, 20 clicks, no auth boundary)
10
- * - STARTER: Full budgets + basic auth verification
11
- * - PRO: Advanced auth boundary (multi-role, 2-pass) + fake data detection
10
+ * - PRO: Full budgets + auth verification + fake data detection
12
11
  *
13
12
  * Pass A (anon): crawl + click, record which routes look protected
14
13
  * Pass B (auth): crawl same routes using storageState, verify protected routes accessible
@@ -34,6 +33,14 @@ const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
34
33
  const entitlements = require("./lib/entitlements-v2");
35
34
  const upsell = require("./lib/upsell");
36
35
 
36
+ // V7: World-class performance profiler and coverage map
37
+ let realityProfiler;
38
+ try {
39
+ realityProfiler = require("./lib/reality-profiler");
40
+ } catch (e) {
41
+ realityProfiler = null;
42
+ }
43
+
37
44
  let chromium;
38
45
  let playwrightError = null;
39
46
  try {
@@ -44,62 +51,13 @@ try {
44
51
  }
45
52
 
46
53
  // ═══════════════════════════════════════════════════════════════════════════════
47
- // ADVANCED TERMINAL - ANSI CODES & UTILITIES
54
+ // TERMINAL UI - Import from shared module
48
55
  // ═══════════════════════════════════════════════════════════════════════════════
49
56
 
50
- const c = {
51
- reset: '\x1b[0m',
52
- bold: '\x1b[1m',
53
- dim: '\x1b[2m',
54
- italic: '\x1b[3m',
55
- underline: '\x1b[4m',
56
- blink: '\x1b[5m',
57
- inverse: '\x1b[7m',
58
- hidden: '\x1b[8m',
59
- strike: '\x1b[9m',
60
- // Colors
61
- black: '\x1b[30m',
62
- red: '\x1b[31m',
63
- green: '\x1b[32m',
64
- yellow: '\x1b[33m',
65
- blue: '\x1b[34m',
66
- magenta: '\x1b[35m',
67
- cyan: '\x1b[36m',
68
- white: '\x1b[37m',
69
- // Bright colors
70
- gray: '\x1b[90m',
71
- brightRed: '\x1b[91m',
72
- brightGreen: '\x1b[92m',
73
- brightYellow: '\x1b[93m',
74
- brightBlue: '\x1b[94m',
75
- brightMagenta: '\x1b[95m',
76
- brightCyan: '\x1b[96m',
77
- brightWhite: '\x1b[97m',
78
- // Background
79
- bgBlack: '\x1b[40m',
80
- bgRed: '\x1b[41m',
81
- bgGreen: '\x1b[42m',
82
- bgYellow: '\x1b[43m',
83
- bgBlue: '\x1b[44m',
84
- bgMagenta: '\x1b[45m',
85
- bgCyan: '\x1b[46m',
86
- bgWhite: '\x1b[47m',
87
- // Cursor control
88
- cursorUp: (n = 1) => `\x1b[${n}A`,
89
- cursorDown: (n = 1) => `\x1b[${n}B`,
90
- cursorRight: (n = 1) => `\x1b[${n}C`,
91
- cursorLeft: (n = 1) => `\x1b[${n}D`,
92
- clearLine: '\x1b[2K',
93
- clearScreen: '\x1b[2J',
94
- saveCursor: '\x1b[s',
95
- restoreCursor: '\x1b[u',
96
- hideCursor: '\x1b[?25l',
97
- showCursor: '\x1b[?25h',
98
- };
57
+ const { c, rgb, bgRgb, icons, Spinner } = require("./lib/terminal-ui");
99
58
 
100
- // True color support
101
- const rgb = (r, g, b) => `\x1b[38;2;${r};${g};${b}m`;
102
- const bgRgb = (r, g, b) => `\x1b[48;2;${r};${g};${b}m`;
59
+ // Unified Output System
60
+ const { output } = require("./lib/output/index.js");
103
61
 
104
62
  // Premium color palette (orange/coral theme for "reality" - testing/verification)
105
63
  const colors = {
@@ -781,7 +739,7 @@ function printTierWarning(tier, limits, originalMaxPages, appliedMaxPages, verif
781
739
  }
782
740
 
783
741
  if (verifyAuthRequested && !verifyAuthApplied) {
784
- console.log(` ${c.dim}Auth boundary:${c.reset} ${colors.error}disabled${c.reset} ${c.dim}(requires STARTER+)${c.reset}`);
742
+ console.log(` ${c.dim}Auth boundary:${c.reset} ${colors.error}disabled${c.reset} ${c.dim}(requires PRO)${c.reset}`);
785
743
  }
786
744
 
787
745
  console.log(` ${colors.accent}Upgrade:${c.reset} ${c.dim}https://vibecheckai.dev/pricing${c.reset}`);
@@ -837,8 +795,7 @@ function printHelp(opts = {}) {
837
795
 
838
796
  ${c.bold}Tier Limits:${c.reset}
839
797
  ${c.dim}FREE${c.reset} 5 pages, no auth boundary
840
- ${c.dim}STARTER${c.reset} Full budgets + basic auth
841
- ${c.dim}PRO${c.reset} Advanced auth (multi-role)
798
+ ${c.dim}PRO${c.reset} Unlimited pages + full auth verification
842
799
 
843
800
  ${c.bold}Exit Codes:${c.reset}
844
801
  ${colors.success}0${c.reset} CLEAN — No issues found
@@ -1577,6 +1534,14 @@ async function runReality(argsOrOpts = {}) {
1577
1534
  if (Array.isArray(argsOrOpts)) {
1578
1535
  const { flags } = parseGlobalFlags(argsOrOpts);
1579
1536
  globalOpts = { ...globalOpts, ...flags };
1537
+
1538
+ // Configure unified output mode
1539
+ output.setMode({
1540
+ json: globalOpts.json,
1541
+ quiet: globalOpts.quiet,
1542
+ ci: globalOpts.ci
1543
+ });
1544
+
1580
1545
  if (globalOpts.help) {
1581
1546
  printHelp(globalOpts);
1582
1547
  return 0;
@@ -2042,6 +2007,50 @@ async function runReality(argsOrOpts = {}) {
2042
2007
 
2043
2008
  const duration = Date.now() - startTime;
2044
2009
 
2010
+ // ═══════════════════════════════════════════════════════════════════════════
2011
+ // V7: WORLD-CLASS PERFORMANCE PROFILE & COVERAGE MAP
2012
+ // ═══════════════════════════════════════════════════════════════════════════
2013
+
2014
+ if (realityProfiler && !globalOpts.json && !globalOpts.quiet) {
2015
+ // Generate enhanced coverage map
2016
+ const visitedRoutes = allVisited.map(u => {
2017
+ try { return new URL(u).pathname; } catch { return u; }
2018
+ });
2019
+ const expectedRoutes = tp?.routes?.map(r => r.path) || [];
2020
+ const coverageMap = realityProfiler.generateCoverageMap(visitedRoutes, expectedRoutes, tp);
2021
+
2022
+ console.log();
2023
+ console.log(realityProfiler.renderCoverageMap(coverageMap));
2024
+
2025
+ // Generate evidence pack
2026
+ try {
2027
+ const evidencePack = await realityProfiler.generateEvidencePack({
2028
+ projectPath: root,
2029
+ outputDir: outBase,
2030
+ findings,
2031
+ coverage: coverageMap,
2032
+ performance: {}, // Would need to track this during crawling
2033
+ screenshots: fs.existsSync(shotsDir) ? fs.readdirSync(shotsDir).map(f => path.join(shotsDir, f)) : [],
2034
+ videos: recordVideo ? [anonVideoPath, authVideoPath].filter(Boolean) : [],
2035
+ traces: recordTrace ? [anonTracePath, authTracePath].filter(Boolean) : [],
2036
+ });
2037
+
2038
+ console.log();
2039
+ console.log(` ${c.dim}╭${'─'.repeat(58)}╮${c.reset}`);
2040
+ console.log(` ${c.dim}│${c.reset} ${colors.accent}📦 EVIDENCE PACK GENERATED${c.reset} ${c.dim}│${c.reset}`);
2041
+ console.log(` ${c.dim}├${'─'.repeat(58)}┤${c.reset}`);
2042
+ console.log(` ${c.dim}│${c.reset} ID: ${c.cyan}${evidencePack.packId}${c.reset}`.padEnd(68) + `${c.dim}│${c.reset}`);
2043
+ console.log(` ${c.dim}│${c.reset} Contents: ${evidencePack.manifest.contents.findings} findings, ${evidencePack.manifest.contents.screenshots} screenshots ${c.dim}│${c.reset}`);
2044
+ console.log(` ${c.dim}│${c.reset} Report: ${c.cyan}${path.relative(root, evidencePack.reportPath)}${c.reset}`.padEnd(68) + `${c.dim}│${c.reset}`);
2045
+ console.log(` ${c.dim}╰${'─'.repeat(58)}╯${c.reset}`);
2046
+ } catch (packError) {
2047
+ // Evidence pack generation failed - continue without it
2048
+ if (globalOpts.verbose) {
2049
+ console.log(` ${c.dim}Evidence pack generation skipped: ${packError.message}${c.reset}`);
2050
+ }
2051
+ }
2052
+ }
2053
+
2045
2054
  // ═══════════════════════════════════════════════════════════════════════════
2046
2055
  // OUTPUT
2047
2056
  // ═══════════════════════════════════════════════════════════════════════════
@@ -2084,7 +2093,7 @@ async function runReality(argsOrOpts = {}) {
2084
2093
  cmd: "reality",
2085
2094
  why: "cap_hit",
2086
2095
  topIssues: findings.slice(0, 5),
2087
- upgradeTier: "starter",
2096
+ upgradeTier: "pro",
2088
2097
  }));
2089
2098
  console.log(upsell.formatNextSteps("reality", blocks > 0 ? "BLOCK" : warns > 0 ? "WARN" : "SHIP", currentTier));
2090
2099
  console.log();
@@ -1,12 +1,11 @@
1
1
  /**
2
- * vibecheck report - World-Class Enterprise Reports
2
+ * vibecheck report - World-Class Reports
3
3
  *
4
4
  * TIER ENFORCEMENT:
5
5
  * - FREE: HTML, MD formats only
6
- * - STARTER: + SARIF, CSV formats
7
- * - PRO: + compliance packs, PDF export, redaction templates
6
+ * - PRO: + SARIF, CSV, compliance packs, PDF export
8
7
  *
9
- * Enterprise-grade report generation with:
8
+ * Professional report generation with:
10
9
  * - Beautiful interactive HTML with modern design
11
10
  * - Multiple export formats (HTML, MD, JSON, SARIF, CSV, PDF)
12
11
  * - Executive, Technical, Compliance report types
@@ -19,6 +18,7 @@ const path = require("path");
19
18
  const fs = require("fs");
20
19
  const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
21
20
  const { EXIT } = require("./lib/exit-codes");
21
+ const { getApiKey } = require("./lib/auth");
22
22
 
23
23
  // Entitlements enforcement
24
24
  let entitlements;
@@ -73,6 +73,9 @@ const {
73
73
  renderError,
74
74
  } = require("./lib/report-output");
75
75
 
76
+ // Unified Output System
77
+ const { output } = require("./lib/output/index.js");
78
+
76
79
  function parseArgs(args) {
77
80
  // Parse global flags first
78
81
  const { flags: globalFlags, cleanArgs } = parseGlobalFlags(args);
@@ -135,6 +138,13 @@ function printHelp(showBanner = true) {
135
138
  async function runReport(args) {
136
139
  const opts = parseArgs(args);
137
140
 
141
+ // Configure unified output mode
142
+ output.setMode({
143
+ json: opts.json,
144
+ quiet: opts.quiet,
145
+ ci: opts.ci
146
+ });
147
+
138
148
  if (opts.help) {
139
149
  printHelp(shouldShowBanner(opts));
140
150
  return 0;
@@ -159,7 +169,7 @@ async function runReport(args) {
159
169
  });
160
170
  if (!access.allowed) {
161
171
  console.log(`\n ${colors.warning}${icons.warning}${ansi.reset} ${ansi.dim}HTML and MD formats are available on FREE tier${ansi.reset}`);
162
- console.log(` ${ansi.dim}Upgrade to STARTER for SARIF/CSV export${ansi.reset}\n`);
172
+ console.log(` ${ansi.dim}Upgrade to PRO for SARIF/CSV export${ansi.reset}\n`);
163
173
  return entitlements.EXIT_FEATURE_NOT_ALLOWED;
164
174
  }
165
175
  }
@@ -305,6 +315,22 @@ async function runReport(args) {
305
315
  // Print success message using design system
306
316
  console.log(renderSuccess(outputFileName, opts.format));
307
317
 
318
+ // Pro upsell for free users
319
+ const { key } = getApiKey();
320
+ const currentTier = key ? "pro" : "free";
321
+
322
+ if (currentTier === 'free' && !opts.quiet && !opts.ci) {
323
+ console.log();
324
+ console.log(` ${ansi.gray}╭${'─'.repeat(60)}╮${ansi.reset}`);
325
+ console.log(` ${ansi.gray}│${ansi.reset} ${ansi.magenta}★ PRO${ansi.reset} Unlock advanced report formats: ${ansi.gray}│${ansi.reset}`);
326
+ console.log(` ${ansi.gray}│${ansi.reset} • SARIF for GitHub code scanning ${ansi.gray}│${ansi.reset}`);
327
+ console.log(` ${ansi.gray}│${ansi.reset} • CSV exports for spreadsheets ${ansi.gray}│${ansi.reset}`);
328
+ console.log(` ${ansi.gray}│${ansi.reset} • Compliance packs (SOC2, HIPAA, GDPR) ${ansi.gray}│${ansi.reset}`);
329
+ console.log(` ${ansi.gray}│${ansi.reset} ${ansi.dim}https://vibecheckai.dev/pricing${ansi.reset} ${ansi.gray}│${ansi.reset}`);
330
+ console.log(` ${ansi.gray}╰${'─'.repeat(60)}╯${ansi.reset}`);
331
+ console.log();
332
+ }
333
+
308
334
  // Open in browser if requested
309
335
  if (opts.open && format === "html") {
310
336
  openInBrowser(outputFileName);
@@ -12,14 +12,11 @@
12
12
 
13
13
  "use strict";
14
14
 
15
- const c = {
16
- reset: '\x1b[0m',
17
- bold: '\x1b[1m',
18
- dim: '\x1b[2m',
19
- cyan: '\x1b[36m',
20
- yellow: '\x1b[33m',
21
- red: '\x1b[31m',
22
- };
15
+ // Terminal UI - Import from shared module
16
+ const { c } = require("./lib/terminal-ui");
17
+
18
+ // Unified Output System
19
+ const { output } = require("./lib/output/index.js");
23
20
 
24
21
  function printHelp() {
25
22
  console.log(`