@vibecheckai/cli 3.5.0 → 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 (224) hide show
  1. package/bin/registry.js +214 -237
  2. package/bin/runners/cli-utils.js +33 -2
  3. package/bin/runners/context/analyzer.js +52 -1
  4. package/bin/runners/context/generators/cursor.js +2 -49
  5. package/bin/runners/context/git-context.js +3 -1
  6. package/bin/runners/context/team-conventions.js +33 -7
  7. package/bin/runners/lib/analysis-core.js +25 -5
  8. package/bin/runners/lib/analyzers.js +431 -481
  9. package/bin/runners/lib/default-config.js +127 -0
  10. package/bin/runners/lib/doctor/modules/security.js +3 -1
  11. package/bin/runners/lib/engine/ast-cache.js +210 -0
  12. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  13. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  14. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  15. package/bin/runners/lib/engine/env-extractor.js +207 -0
  16. package/bin/runners/lib/engine/express-extractor.js +208 -0
  17. package/bin/runners/lib/engine/extractors.js +849 -0
  18. package/bin/runners/lib/engine/index.js +207 -0
  19. package/bin/runners/lib/engine/repo-index.js +514 -0
  20. package/bin/runners/lib/engine/types.js +124 -0
  21. package/bin/runners/lib/engines/accessibility-engine.js +18 -218
  22. package/bin/runners/lib/engines/api-consistency-engine.js +30 -335
  23. package/bin/runners/lib/engines/cross-file-analysis-engine.js +27 -292
  24. package/bin/runners/lib/engines/empty-catch-engine.js +17 -127
  25. package/bin/runners/lib/engines/mock-data-engine.js +10 -53
  26. package/bin/runners/lib/engines/performance-issues-engine.js +36 -176
  27. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +54 -382
  28. package/bin/runners/lib/engines/type-aware-engine.js +39 -263
  29. package/bin/runners/lib/engines/vibecheck-engines/index.js +13 -122
  30. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  31. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  32. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  33. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  34. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  35. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  36. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  37. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +73 -373
  38. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  39. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  40. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  41. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  42. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  43. package/bin/runners/lib/entitlements-v2.js +73 -97
  44. package/bin/runners/lib/error-handler.js +44 -3
  45. package/bin/runners/lib/error-messages.js +289 -0
  46. package/bin/runners/lib/evidence-pack.js +7 -1
  47. package/bin/runners/lib/finding-id.js +69 -0
  48. package/bin/runners/lib/finding-sorter.js +89 -0
  49. package/bin/runners/lib/html-proof-report.js +700 -350
  50. package/bin/runners/lib/missions/plan.js +6 -46
  51. package/bin/runners/lib/missions/templates.js +0 -232
  52. package/bin/runners/lib/next-action.js +560 -0
  53. package/bin/runners/lib/prerequisites.js +149 -0
  54. package/bin/runners/lib/route-detection.js +137 -68
  55. package/bin/runners/lib/scan-output.js +91 -76
  56. package/bin/runners/lib/scan-runner.js +135 -0
  57. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  58. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  59. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  60. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  61. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  62. package/bin/runners/lib/schemas/validator.js +27 -0
  63. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  64. package/bin/runners/lib/ship-output-enterprise.js +23 -23
  65. package/bin/runners/lib/ship-output.js +75 -31
  66. package/bin/runners/lib/terminal-ui.js +6 -113
  67. package/bin/runners/lib/truth.js +351 -10
  68. package/bin/runners/lib/unified-cli-output.js +430 -603
  69. package/bin/runners/lib/unified-output.js +13 -9
  70. package/bin/runners/runAIAgent.js +10 -5
  71. package/bin/runners/runAgent.js +0 -3
  72. package/bin/runners/runAllowlist.js +389 -0
  73. package/bin/runners/runApprove.js +0 -33
  74. package/bin/runners/runAuth.js +73 -45
  75. package/bin/runners/runCheckpoint.js +51 -11
  76. package/bin/runners/runClassify.js +85 -21
  77. package/bin/runners/runContext.js +0 -3
  78. package/bin/runners/runDoctor.js +41 -28
  79. package/bin/runners/runEvidencePack.js +362 -0
  80. package/bin/runners/runFirewall.js +0 -3
  81. package/bin/runners/runFirewallHook.js +0 -3
  82. package/bin/runners/runFix.js +66 -76
  83. package/bin/runners/runGuard.js +18 -411
  84. package/bin/runners/runInit.js +113 -30
  85. package/bin/runners/runLabs.js +424 -0
  86. package/bin/runners/runMcp.js +19 -25
  87. package/bin/runners/runPolish.js +64 -240
  88. package/bin/runners/runPromptFirewall.js +12 -5
  89. package/bin/runners/runProve.js +57 -22
  90. package/bin/runners/runQuickstart.js +531 -0
  91. package/bin/runners/runReality.js +59 -68
  92. package/bin/runners/runReport.js +38 -33
  93. package/bin/runners/runRuntime.js +8 -5
  94. package/bin/runners/runScan.js +1413 -190
  95. package/bin/runners/runShip.js +113 -719
  96. package/bin/runners/runTruth.js +0 -3
  97. package/bin/runners/runValidate.js +13 -9
  98. package/bin/runners/runWatch.js +23 -14
  99. package/bin/scan.js +6 -1
  100. package/bin/vibecheck.js +204 -185
  101. package/mcp-server/deprecation-middleware.js +282 -0
  102. package/mcp-server/handlers/index.ts +15 -0
  103. package/mcp-server/handlers/tool-handler.ts +554 -0
  104. package/mcp-server/index-v1.js +698 -0
  105. package/mcp-server/index.js +210 -238
  106. package/mcp-server/lib/cache-wrapper.cjs +383 -0
  107. package/mcp-server/lib/error-envelope.js +138 -0
  108. package/mcp-server/lib/executor.ts +499 -0
  109. package/mcp-server/lib/index.ts +19 -0
  110. package/mcp-server/lib/rate-limiter.js +166 -0
  111. package/mcp-server/lib/sandbox.test.ts +519 -0
  112. package/mcp-server/lib/sandbox.ts +395 -0
  113. package/mcp-server/lib/types.ts +267 -0
  114. package/mcp-server/package.json +12 -3
  115. package/mcp-server/registry/tool-registry.js +794 -0
  116. package/mcp-server/registry/tools.json +605 -0
  117. package/mcp-server/registry.test.ts +334 -0
  118. package/mcp-server/tests/tier-gating.test.js +297 -0
  119. package/mcp-server/tier-auth.js +378 -45
  120. package/mcp-server/tools-v3.js +353 -442
  121. package/mcp-server/tsconfig.json +37 -0
  122. package/mcp-server/vibecheck-2.0-tools.js +14 -1
  123. package/package.json +1 -1
  124. package/bin/runners/lib/agent-firewall/learning/learning-engine.js +0 -849
  125. package/bin/runners/lib/audit-logger.js +0 -532
  126. package/bin/runners/lib/authority/authorities/architecture.js +0 -364
  127. package/bin/runners/lib/authority/authorities/compliance.js +0 -341
  128. package/bin/runners/lib/authority/authorities/human.js +0 -343
  129. package/bin/runners/lib/authority/authorities/quality.js +0 -420
  130. package/bin/runners/lib/authority/authorities/security.js +0 -228
  131. package/bin/runners/lib/authority/index.js +0 -293
  132. package/bin/runners/lib/bundle/bundle-intelligence.js +0 -846
  133. package/bin/runners/lib/cli-charts.js +0 -368
  134. package/bin/runners/lib/cli-config-display.js +0 -405
  135. package/bin/runners/lib/cli-demo.js +0 -275
  136. package/bin/runners/lib/cli-errors.js +0 -438
  137. package/bin/runners/lib/cli-help-formatter.js +0 -439
  138. package/bin/runners/lib/cli-interactive-menu.js +0 -509
  139. package/bin/runners/lib/cli-prompts.js +0 -441
  140. package/bin/runners/lib/cli-scan-cards.js +0 -362
  141. package/bin/runners/lib/compliance-reporter.js +0 -710
  142. package/bin/runners/lib/conductor/index.js +0 -671
  143. package/bin/runners/lib/easy/README.md +0 -123
  144. package/bin/runners/lib/easy/index.js +0 -140
  145. package/bin/runners/lib/easy/interactive-wizard.js +0 -788
  146. package/bin/runners/lib/easy/one-click-firewall.js +0 -564
  147. package/bin/runners/lib/easy/zero-config-reality.js +0 -714
  148. package/bin/runners/lib/engines/async-patterns-engine.js +0 -444
  149. package/bin/runners/lib/engines/bundle-size-engine.js +0 -433
  150. package/bin/runners/lib/engines/confidence-scoring.js +0 -276
  151. package/bin/runners/lib/engines/context-detection.js +0 -264
  152. package/bin/runners/lib/engines/database-patterns-engine.js +0 -429
  153. package/bin/runners/lib/engines/duplicate-code-engine.js +0 -354
  154. package/bin/runners/lib/engines/env-variables-engine.js +0 -458
  155. package/bin/runners/lib/engines/error-handling-engine.js +0 -437
  156. package/bin/runners/lib/engines/false-positive-prevention.js +0 -630
  157. package/bin/runners/lib/engines/framework-adapters/index.js +0 -607
  158. package/bin/runners/lib/engines/framework-detection.js +0 -508
  159. package/bin/runners/lib/engines/import-order-engine.js +0 -429
  160. package/bin/runners/lib/engines/naming-conventions-engine.js +0 -544
  161. package/bin/runners/lib/engines/noise-reduction-engine.js +0 -452
  162. package/bin/runners/lib/engines/orchestrator.js +0 -334
  163. package/bin/runners/lib/engines/react-patterns-engine.js +0 -457
  164. package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +0 -806
  165. package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +0 -577
  166. package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +0 -543
  167. package/bin/runners/lib/engines/vibecheck-engines.js +0 -514
  168. package/bin/runners/lib/enhanced-features/index.js +0 -305
  169. package/bin/runners/lib/enhanced-output.js +0 -631
  170. package/bin/runners/lib/enterprise.js +0 -300
  171. package/bin/runners/lib/firewall/command-validator.js +0 -351
  172. package/bin/runners/lib/firewall/config.js +0 -341
  173. package/bin/runners/lib/firewall/content-validator.js +0 -519
  174. package/bin/runners/lib/firewall/index.js +0 -101
  175. package/bin/runners/lib/firewall/path-validator.js +0 -256
  176. package/bin/runners/lib/intelligence/cross-repo-intelligence.js +0 -817
  177. package/bin/runners/lib/mcp-utils.js +0 -425
  178. package/bin/runners/lib/output/index.js +0 -1022
  179. package/bin/runners/lib/policy-engine.js +0 -652
  180. package/bin/runners/lib/polish/autofix/accessibility-fixes.js +0 -333
  181. package/bin/runners/lib/polish/autofix/async-handlers.js +0 -273
  182. package/bin/runners/lib/polish/autofix/dead-code.js +0 -280
  183. package/bin/runners/lib/polish/autofix/imports-optimizer.js +0 -344
  184. package/bin/runners/lib/polish/autofix/index.js +0 -200
  185. package/bin/runners/lib/polish/autofix/remove-consoles.js +0 -209
  186. package/bin/runners/lib/polish/autofix/strengthen-types.js +0 -245
  187. package/bin/runners/lib/polish/backend-checks.js +0 -148
  188. package/bin/runners/lib/polish/documentation-checks.js +0 -111
  189. package/bin/runners/lib/polish/frontend-checks.js +0 -168
  190. package/bin/runners/lib/polish/index.js +0 -71
  191. package/bin/runners/lib/polish/infrastructure-checks.js +0 -131
  192. package/bin/runners/lib/polish/library-detection.js +0 -175
  193. package/bin/runners/lib/polish/performance-checks.js +0 -100
  194. package/bin/runners/lib/polish/security-checks.js +0 -148
  195. package/bin/runners/lib/polish/utils.js +0 -203
  196. package/bin/runners/lib/prompt-builder.js +0 -540
  197. package/bin/runners/lib/proof-certificate.js +0 -634
  198. package/bin/runners/lib/reality/accessibility-audit.js +0 -946
  199. package/bin/runners/lib/reality/api-contract-validator.js +0 -1012
  200. package/bin/runners/lib/reality/chaos-engineering.js +0 -1084
  201. package/bin/runners/lib/reality/performance-tracker.js +0 -1077
  202. package/bin/runners/lib/reality/scenario-generator.js +0 -1404
  203. package/bin/runners/lib/reality/visual-regression.js +0 -852
  204. package/bin/runners/lib/reality-profiler.js +0 -717
  205. package/bin/runners/lib/replay/flight-recorder-viewer.js +0 -1160
  206. package/bin/runners/lib/review/ai-code-review.js +0 -832
  207. package/bin/runners/lib/rules/custom-rule-engine.js +0 -985
  208. package/bin/runners/lib/sbom-generator.js +0 -641
  209. package/bin/runners/lib/scan-output-enhanced.js +0 -512
  210. package/bin/runners/lib/security/owasp-scanner.js +0 -939
  211. package/bin/runners/lib/validators/contract-validator.js +0 -283
  212. package/bin/runners/lib/validators/dead-export-detector.js +0 -279
  213. package/bin/runners/lib/validators/dep-audit.js +0 -245
  214. package/bin/runners/lib/validators/env-validator.js +0 -319
  215. package/bin/runners/lib/validators/index.js +0 -120
  216. package/bin/runners/lib/validators/license-checker.js +0 -252
  217. package/bin/runners/lib/validators/route-validator.js +0 -290
  218. package/bin/runners/runAuthority.js +0 -528
  219. package/bin/runners/runConductor.js +0 -772
  220. package/bin/runners/runContainer.js +0 -366
  221. package/bin/runners/runEasy.js +0 -410
  222. package/bin/runners/runIaC.js +0 -372
  223. package/bin/runners/runVibe.js +0 -791
  224. package/mcp-server/tools.js +0 -495
@@ -7,7 +7,8 @@
7
7
  *
8
8
  * TIER ENFORCEMENT:
9
9
  * - FREE: Preview mode (5 pages, 20 clicks, no auth boundary)
10
- * - PRO: Full budgets + auth verification + fake data detection
10
+ * - STARTER: Full budgets + basic auth verification
11
+ * - PRO: Advanced auth boundary (multi-role, 2-pass) + fake data detection
11
12
  *
12
13
  * Pass A (anon): crawl + click, record which routes look protected
13
14
  * Pass B (auth): crawl same routes using storageState, verify protected routes accessible
@@ -33,14 +34,6 @@ const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
33
34
  const entitlements = require("./lib/entitlements-v2");
34
35
  const upsell = require("./lib/upsell");
35
36
 
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
-
44
37
  let chromium;
45
38
  let playwrightError = null;
46
39
  try {
@@ -51,13 +44,62 @@ try {
51
44
  }
52
45
 
53
46
  // ═══════════════════════════════════════════════════════════════════════════════
54
- // TERMINAL UI - Import from shared module
47
+ // ADVANCED TERMINAL - ANSI CODES & UTILITIES
55
48
  // ═══════════════════════════════════════════════════════════════════════════════
56
49
 
57
- const { c, rgb, bgRgb, icons, Spinner } = require("./lib/terminal-ui");
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
+ };
58
99
 
59
- // Unified Output System
60
- const { output } = require("./lib/output/index.js");
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`;
61
103
 
62
104
  // Premium color palette (orange/coral theme for "reality" - testing/verification)
63
105
  const colors = {
@@ -739,7 +781,7 @@ function printTierWarning(tier, limits, originalMaxPages, appliedMaxPages, verif
739
781
  }
740
782
 
741
783
  if (verifyAuthRequested && !verifyAuthApplied) {
742
- console.log(` ${c.dim}Auth boundary:${c.reset} ${colors.error}disabled${c.reset} ${c.dim}(requires PRO)${c.reset}`);
784
+ console.log(` ${c.dim}Auth boundary:${c.reset} ${colors.error}disabled${c.reset} ${c.dim}(requires STARTER+)${c.reset}`);
743
785
  }
744
786
 
745
787
  console.log(` ${colors.accent}Upgrade:${c.reset} ${c.dim}https://vibecheckai.dev/pricing${c.reset}`);
@@ -795,7 +837,8 @@ function printHelp(opts = {}) {
795
837
 
796
838
  ${c.bold}Tier Limits:${c.reset}
797
839
  ${c.dim}FREE${c.reset} 5 pages, no auth boundary
798
- ${c.dim}PRO${c.reset} Unlimited pages + full auth verification
840
+ ${c.dim}STARTER${c.reset} Full budgets + basic auth
841
+ ${c.dim}PRO${c.reset} Advanced auth (multi-role)
799
842
 
800
843
  ${c.bold}Exit Codes:${c.reset}
801
844
  ${colors.success}0${c.reset} CLEAN — No issues found
@@ -1534,14 +1577,6 @@ async function runReality(argsOrOpts = {}) {
1534
1577
  if (Array.isArray(argsOrOpts)) {
1535
1578
  const { flags } = parseGlobalFlags(argsOrOpts);
1536
1579
  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
-
1545
1580
  if (globalOpts.help) {
1546
1581
  printHelp(globalOpts);
1547
1582
  return 0;
@@ -2007,50 +2042,6 @@ async function runReality(argsOrOpts = {}) {
2007
2042
 
2008
2043
  const duration = Date.now() - startTime;
2009
2044
 
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
-
2054
2045
  // ═══════════════════════════════════════════════════════════════════════════
2055
2046
  // OUTPUT
2056
2047
  // ═══════════════════════════════════════════════════════════════════════════
@@ -2093,7 +2084,7 @@ async function runReality(argsOrOpts = {}) {
2093
2084
  cmd: "reality",
2094
2085
  why: "cap_hit",
2095
2086
  topIssues: findings.slice(0, 5),
2096
- upgradeTier: "pro",
2087
+ upgradeTier: "starter",
2097
2088
  }));
2098
2089
  console.log(upsell.formatNextSteps("reality", blocks > 0 ? "BLOCK" : warns > 0 ? "WARN" : "SHIP", currentTier));
2099
2090
  console.log();
@@ -1,11 +1,12 @@
1
1
  /**
2
- * vibecheck report - World-Class Reports
2
+ * vibecheck report - World-Class Enterprise Reports
3
3
  *
4
4
  * TIER ENFORCEMENT:
5
5
  * - FREE: HTML, MD formats only
6
- * - PRO: + SARIF, CSV, compliance packs, PDF export
6
+ * - STARTER: + SARIF, CSV formats
7
+ * - PRO: + compliance packs, PDF export, redaction templates
7
8
  *
8
- * Professional report generation with:
9
+ * Enterprise-grade report generation with:
9
10
  * - Beautiful interactive HTML with modern design
10
11
  * - Multiple export formats (HTML, MD, JSON, SARIF, CSV, PDF)
11
12
  * - Executive, Technical, Compliance report types
@@ -18,7 +19,7 @@ const path = require("path");
18
19
  const fs = require("fs");
19
20
  const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
20
21
  const { EXIT } = require("./lib/exit-codes");
21
- const { getApiKey } = require("./lib/auth");
22
+ const { ensureScanResults } = require("./lib/prerequisites");
22
23
 
23
24
  // Entitlements enforcement
24
25
  let entitlements;
@@ -73,9 +74,6 @@ const {
73
74
  renderError,
74
75
  } = require("./lib/report-output");
75
76
 
76
- // Unified Output System
77
- const { output } = require("./lib/output/index.js");
78
-
79
77
  function parseArgs(args) {
80
78
  // Parse global flags first
81
79
  const { flags: globalFlags, cleanArgs } = parseGlobalFlags(args);
@@ -138,13 +136,6 @@ function printHelp(showBanner = true) {
138
136
  async function runReport(args) {
139
137
  const opts = parseArgs(args);
140
138
 
141
- // Configure unified output mode
142
- output.setMode({
143
- json: opts.json,
144
- quiet: opts.quiet,
145
- ci: opts.ci
146
- });
147
-
148
139
  if (opts.help) {
149
140
  printHelp(shouldShowBanner(opts));
150
141
  return 0;
@@ -169,7 +160,7 @@ async function runReport(args) {
169
160
  });
170
161
  if (!access.allowed) {
171
162
  console.log(`\n ${colors.warning}${icons.warning}${ansi.reset} ${ansi.dim}HTML and MD formats are available on FREE tier${ansi.reset}`);
172
- console.log(` ${ansi.dim}Upgrade to PRO for SARIF/CSV export${ansi.reset}\n`);
163
+ console.log(` ${ansi.dim}Upgrade to STARTER for SARIF/CSV export${ansi.reset}\n`);
173
164
  return entitlements.EXIT_FEATURE_NOT_ALLOWED;
174
165
  }
175
166
  }
@@ -212,13 +203,43 @@ async function runReport(args) {
212
203
  const spinner = new Spinner({ color: colors.accent });
213
204
  spinner.start(`Generating ${opts.type} report`);
214
205
 
215
- // Load ship results
206
+ // Auto-run scan if results are missing (unless in CI or explicitly disabled)
207
+ const scanPrereq = await ensureScanResults(projectPath, {
208
+ quiet: opts.quiet,
209
+ json: opts.json,
210
+ ci: opts.ci,
211
+ colors,
212
+ icons,
213
+ ansi,
214
+ });
215
+
216
+ if (scanPrereq.ran && !scanPrereq.success && !opts.quiet) {
217
+ spinner.warn("Auto-run scan failed - continuing with available data");
218
+ }
219
+
220
+ // Load ship results (prefer ship results, fall back to scan results)
216
221
  let shipResults = loadShipResults(projectPath, outputDir);
222
+
223
+ // If no ship results, try to load scan results
224
+ if (!shipResults) {
225
+ const scanResultsPath = path.join(projectPath, ".vibecheck", "results", "latest.json");
226
+ if (fs.existsSync(scanResultsPath)) {
227
+ try {
228
+ const scanData = JSON.parse(fs.readFileSync(scanResultsPath, "utf8"));
229
+ shipResults = {
230
+ score: scanData.result?.score || scanData.score || 0,
231
+ verdict: scanData.result?.verdict || scanData.verdict || "UNKNOWN",
232
+ findings: scanData.result?.findings || scanData.findings || [],
233
+ truthpack: scanData.truthpack || null,
234
+ };
235
+ } catch {}
236
+ }
237
+ }
217
238
 
218
239
  if (!shipResults) {
219
240
  spinner.warn("No scan results found - using demo data");
220
241
  if (!opts.quiet) {
221
- console.log(` ${ansi.dim}Tip: Run 'vibecheck ship' first for real results.${ansi.reset}\n`);
242
+ console.log(` ${ansi.dim}Tip: Run 'vibecheck scan' first for real results.${ansi.reset}\n`);
222
243
  }
223
244
  shipResults = getDemoData();
224
245
  }
@@ -315,22 +336,6 @@ async function runReport(args) {
315
336
  // Print success message using design system
316
337
  console.log(renderSuccess(outputFileName, opts.format));
317
338
 
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
-
334
339
  // Open in browser if requested
335
340
  if (opts.open && format === "html") {
336
341
  openInBrowser(outputFileName);
@@ -12,11 +12,14 @@
12
12
 
13
13
  "use strict";
14
14
 
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");
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
+ };
20
23
 
21
24
  function printHelp() {
22
25
  console.log(`