@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.
- package/bin/registry.js +389 -269
- package/bin/runners/cli-utils.js +2 -33
- package/bin/runners/context/generators/cursor.js +49 -2
- package/bin/runners/lib/agent-firewall/learning/learning-engine.js +849 -0
- package/bin/runners/lib/analyzers.js +599 -142
- package/bin/runners/lib/audit-logger.js +532 -0
- package/bin/runners/lib/authority/authorities/architecture.js +364 -0
- package/bin/runners/lib/authority/authorities/compliance.js +341 -0
- package/bin/runners/lib/authority/authorities/human.js +343 -0
- package/bin/runners/lib/authority/authorities/quality.js +420 -0
- package/bin/runners/lib/authority/authorities/security.js +228 -0
- package/bin/runners/lib/authority/index.js +293 -0
- package/bin/runners/lib/authority-badge.js +425 -425
- package/bin/runners/lib/bundle/bundle-intelligence.js +846 -0
- package/bin/runners/lib/cli-charts.js +368 -0
- package/bin/runners/lib/cli-config-display.js +405 -0
- package/bin/runners/lib/cli-demo.js +275 -0
- package/bin/runners/lib/cli-errors.js +438 -0
- package/bin/runners/lib/cli-help-formatter.js +439 -0
- package/bin/runners/lib/cli-interactive-menu.js +509 -0
- package/bin/runners/lib/cli-prompts.js +441 -0
- package/bin/runners/lib/cli-scan-cards.js +362 -0
- package/bin/runners/lib/compliance-reporter.js +710 -0
- package/bin/runners/lib/conductor/index.js +671 -0
- package/bin/runners/lib/easy/README.md +123 -0
- package/bin/runners/lib/easy/index.js +140 -0
- package/bin/runners/lib/easy/interactive-wizard.js +788 -0
- package/bin/runners/lib/easy/one-click-firewall.js +564 -0
- package/bin/runners/lib/easy/zero-config-reality.js +714 -0
- package/bin/runners/lib/engines/accessibility-engine.js +218 -18
- package/bin/runners/lib/engines/api-consistency-engine.js +335 -30
- package/bin/runners/lib/engines/async-patterns-engine.js +444 -0
- package/bin/runners/lib/engines/bundle-size-engine.js +433 -0
- package/bin/runners/lib/engines/confidence-scoring.js +276 -0
- package/bin/runners/lib/engines/context-detection.js +264 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +292 -27
- package/bin/runners/lib/engines/database-patterns-engine.js +429 -0
- package/bin/runners/lib/engines/duplicate-code-engine.js +354 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +127 -17
- package/bin/runners/lib/engines/env-variables-engine.js +458 -0
- package/bin/runners/lib/engines/error-handling-engine.js +437 -0
- package/bin/runners/lib/engines/false-positive-prevention.js +630 -0
- package/bin/runners/lib/engines/framework-adapters/index.js +607 -0
- package/bin/runners/lib/engines/framework-detection.js +508 -0
- package/bin/runners/lib/engines/import-order-engine.js +429 -0
- package/bin/runners/lib/engines/mock-data-engine.js +53 -10
- package/bin/runners/lib/engines/naming-conventions-engine.js +544 -0
- package/bin/runners/lib/engines/noise-reduction-engine.js +452 -0
- package/bin/runners/lib/engines/orchestrator.js +334 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +176 -36
- package/bin/runners/lib/engines/react-patterns-engine.js +457 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +382 -54
- package/bin/runners/lib/engines/type-aware-engine.js +263 -39
- package/bin/runners/lib/engines/vibecheck-engines/index.js +122 -13
- package/bin/runners/lib/engines/vibecheck-engines/lib/ai-hallucination-engine.js +806 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +373 -73
- package/bin/runners/lib/engines/vibecheck-engines/lib/smart-fix-engine.js +577 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/vibe-score-engine.js +543 -0
- package/bin/runners/lib/engines/vibecheck-engines.js +514 -0
- package/bin/runners/lib/enhanced-features/index.js +305 -0
- package/bin/runners/lib/enhanced-output.js +631 -0
- package/bin/runners/lib/enterprise.js +300 -0
- package/bin/runners/lib/entitlements-v2.js +161 -478
- package/bin/runners/lib/firewall/command-validator.js +351 -0
- package/bin/runners/lib/firewall/config.js +341 -0
- package/bin/runners/lib/firewall/content-validator.js +519 -0
- package/bin/runners/lib/firewall/index.js +101 -0
- package/bin/runners/lib/firewall/path-validator.js +256 -0
- package/bin/runners/lib/html-proof-report.js +350 -700
- package/bin/runners/lib/intelligence/cross-repo-intelligence.js +817 -0
- package/bin/runners/lib/mcp-utils.js +425 -0
- package/bin/runners/lib/missions/plan.js +46 -6
- package/bin/runners/lib/missions/templates.js +232 -0
- package/bin/runners/lib/output/index.js +1022 -0
- package/bin/runners/lib/policy-engine.js +652 -0
- package/bin/runners/lib/polish/autofix/accessibility-fixes.js +333 -0
- package/bin/runners/lib/polish/autofix/async-handlers.js +273 -0
- package/bin/runners/lib/polish/autofix/dead-code.js +280 -0
- package/bin/runners/lib/polish/autofix/imports-optimizer.js +344 -0
- package/bin/runners/lib/polish/autofix/index.js +200 -0
- package/bin/runners/lib/polish/autofix/remove-consoles.js +209 -0
- package/bin/runners/lib/polish/autofix/strengthen-types.js +245 -0
- package/bin/runners/lib/polish/backend-checks.js +148 -0
- package/bin/runners/lib/polish/documentation-checks.js +111 -0
- package/bin/runners/lib/polish/frontend-checks.js +168 -0
- package/bin/runners/lib/polish/index.js +71 -0
- package/bin/runners/lib/polish/infrastructure-checks.js +131 -0
- package/bin/runners/lib/polish/library-detection.js +175 -0
- package/bin/runners/lib/polish/performance-checks.js +100 -0
- package/bin/runners/lib/polish/security-checks.js +148 -0
- package/bin/runners/lib/polish/utils.js +203 -0
- package/bin/runners/lib/prompt-builder.js +540 -0
- package/bin/runners/lib/proof-certificate.js +634 -0
- package/bin/runners/lib/reality/accessibility-audit.js +946 -0
- package/bin/runners/lib/reality/api-contract-validator.js +1012 -0
- package/bin/runners/lib/reality/chaos-engineering.js +1084 -0
- package/bin/runners/lib/reality/performance-tracker.js +1077 -0
- package/bin/runners/lib/reality/scenario-generator.js +1404 -0
- package/bin/runners/lib/reality/visual-regression.js +852 -0
- package/bin/runners/lib/reality-profiler.js +717 -0
- package/bin/runners/lib/replay/flight-recorder-viewer.js +1160 -0
- package/bin/runners/lib/review/ai-code-review.js +832 -0
- package/bin/runners/lib/rules/custom-rule-engine.js +985 -0
- package/bin/runners/lib/sbom-generator.js +641 -0
- package/bin/runners/lib/scan-output-enhanced.js +512 -0
- package/bin/runners/lib/scan-output.js +65 -19
- package/bin/runners/lib/security/owasp-scanner.js +939 -0
- package/bin/runners/lib/ship-output.js +18 -25
- package/bin/runners/lib/terminal-ui.js +113 -1
- package/bin/runners/lib/unified-cli-output.js +603 -430
- package/bin/runners/lib/upsell.js +90 -338
- package/bin/runners/lib/validators/contract-validator.js +283 -0
- package/bin/runners/lib/validators/dead-export-detector.js +279 -0
- package/bin/runners/lib/validators/dep-audit.js +245 -0
- package/bin/runners/lib/validators/env-validator.js +319 -0
- package/bin/runners/lib/validators/index.js +120 -0
- package/bin/runners/lib/validators/license-checker.js +252 -0
- package/bin/runners/lib/validators/route-validator.js +290 -0
- package/bin/runners/runAIAgent.js +5 -10
- package/bin/runners/runAgent.js +3 -0
- package/bin/runners/runApprove.js +1233 -1200
- package/bin/runners/runAuth.js +22 -1
- package/bin/runners/runAuthority.js +528 -0
- package/bin/runners/runCheckpoint.js +4 -24
- package/bin/runners/runClassify.js +862 -859
- package/bin/runners/runConductor.js +772 -0
- package/bin/runners/runContainer.js +366 -0
- package/bin/runners/runContext.js +3 -0
- package/bin/runners/runDoctor.js +28 -41
- package/bin/runners/runEasy.js +410 -0
- package/bin/runners/runFirewall.js +3 -0
- package/bin/runners/runFirewallHook.js +3 -0
- package/bin/runners/runFix.js +76 -66
- package/bin/runners/runGuard.js +411 -18
- package/bin/runners/runIaC.js +372 -0
- package/bin/runners/runInit.js +10 -60
- package/bin/runners/runMcp.js +11 -12
- package/bin/runners/runPolish.js +240 -64
- package/bin/runners/runPromptFirewall.js +5 -12
- package/bin/runners/runProve.js +20 -55
- package/bin/runners/runReality.js +68 -59
- package/bin/runners/runReport.js +31 -5
- package/bin/runners/runRuntime.js +5 -8
- package/bin/runners/runScan.js +194 -1273
- package/bin/runners/runShip.js +695 -47
- package/bin/runners/runTruth.js +3 -0
- package/bin/runners/runValidate.js +7 -11
- package/bin/runners/runVibe.js +791 -0
- package/bin/runners/runWatch.js +14 -23
- package/bin/vibecheck.js +179 -65
- package/mcp-server/index.js +202 -636
- package/mcp-server/lib/api-client.cjs +7 -299
- package/mcp-server/package.json +1 -1
- package/mcp-server/tier-auth.js +175 -574
- package/mcp-server/tools-v3.js +800 -505
- package/mcp-server/tools.js +495 -0
- package/package.json +1 -1
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +0 -164
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +0 -291
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +0 -83
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +0 -198
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +0 -275
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +0 -167
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +0 -217
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +0 -140
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +0 -164
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +0 -234
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +0 -217
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +0 -78
- 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
|
-
* -
|
|
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
|
-
//
|
|
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
|
-
//
|
|
101
|
-
const
|
|
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
|
|
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}
|
|
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: "
|
|
2096
|
+
upgradeTier: "pro",
|
|
2088
2097
|
}));
|
|
2089
2098
|
console.log(upsell.formatNextSteps("reality", blocks > 0 ? "BLOCK" : warns > 0 ? "WARN" : "SHIP", currentTier));
|
|
2090
2099
|
console.log();
|
package/bin/runners/runReport.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vibecheck report - World-Class
|
|
2
|
+
* vibecheck report - World-Class Reports
|
|
3
3
|
*
|
|
4
4
|
* TIER ENFORCEMENT:
|
|
5
5
|
* - FREE: HTML, MD formats only
|
|
6
|
-
* -
|
|
7
|
-
* - PRO: + compliance packs, PDF export, redaction templates
|
|
6
|
+
* - PRO: + SARIF, CSV, compliance packs, PDF export
|
|
8
7
|
*
|
|
9
|
-
*
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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(`
|